Update module to 2016-11-18 Gateway release

This commit is contained in:
Stephen 2016-11-22 17:02:31 +08:00
Родитель 109edf94f3
Коммит b68d8a3eba
7 изменённых файлов: 325 добавлений и 395 удалений

Просмотреть файл

@ -6,10 +6,10 @@ Using this module, developers can build Azure IoT Gateway solutions with Modbus
Visit http://azure.com/iotdev to learn more about developing applications for Azure IoT.
## Azure IoT Gateway SDK compatibility
Current version of the module is targeted for the Azure IoT Gateway SDK 2016-11-02 version.
Current version of the module is targeted for the Azure IoT Gateway SDK 2016-11-18 version.
Use the following script to download the compatible version Azure IoT Gateway SDK.
```
git clone -b "2016-11-02" --recursive https://github.com/Azure/azure-iot-gateway-sdk.git
git clone -b "2016-11-18" --recursive https://github.com/Azure/azure-iot-gateway-sdk.git
```
## Operating system compatibility

Просмотреть файл

@ -86,9 +86,12 @@ of this sample.
```json
{
"module name": "logger",
"loading args": {
"module path": "../../modules/logger/liblogger.so"
"name": "logger",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "../../modules/logger/liblogger.so"
}
},
"args": {
"filename": "log.txt"
@ -100,9 +103,12 @@ of this sample.
```json
{
"module name": "modbus_read",
"loading args": {
"module path": "../../modules/modbus_read/libmodbus_read.so"
"name": "modbus_read",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "../../modules/modbus_read/libmodbus_read.so"
}
},
"args": [
{
@ -127,9 +133,12 @@ of this sample.
```json
{
"module name": "IoTHub",
"loading args": {
"module path": "../../modules/iothub/libiothub.so"
"name": "IoTHub",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "../../modules/iothub/libiothub.so"
}
},
"args": {
"IoTHubName": "YOUR IOT HUB NAME",
@ -143,9 +152,12 @@ of this sample.
```json
{
"module name": "mapping",
"loading args": {
"module path": "../../modules/identitymap/libidentity_map.so"
"name": "mapping",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "../../modules/identitymap/libidentity_map.so"
}
},
"args": [
{
@ -163,9 +175,12 @@ of this sample.
```json
{
"module name": "logger",
"loading args": {
"module path": "..\\..\\..\\modules\\logger\\Debug\\logger.dll"
"name": "logger",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "..\\..\\..\\modules\\logger\\Debug\\logger.dll"
}
},
"args": {
"filename": "log.txt"
@ -177,9 +192,12 @@ of this sample.
```json
{
"module name": "modbus_read",
"loading args": {
"module path": "..\\..\\..\\modules\\modbus_read\\Debug\\modbus_read.dll"
"name": "modbus_read",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "..\\..\\..\\modules\\modbus_read\\Debug\\modbus_read.dll"
}
},
"args": [
{
@ -204,9 +222,12 @@ of this sample.
```json
{
"module name": "IoTHub",
"loading args": {
"module path": "..\\..\\..\\modules\\iothub\\Debug\\iothub.dll"
"name": "IoTHub",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "..\\..\\..\\modules\\iothub\\Debug\\iothub.dll"
}
},
"args": {
"IoTHubName": "YOUR IOT HUB NAME",
@ -220,9 +241,12 @@ of this sample.
```json
{
"module name": "mapping",
"loading args": {
"module path": "..\\..\\..\\modules\\identitymap\\Debug\\identity_map.dll"
"name": "mapping",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "..\\..\\..\\modules\\identitymap\\Debug\\identity_map.dll"
}
},
"args": [
{

Просмотреть файл

@ -26,11 +26,11 @@ typedef struct MODBUS_READ_CONFIG_TAG
int time_check;
}MODBUS_READ_CONFIG;
```
## ModbusRead_CreateFromJson
## ModbusRead_ParseConfigurationFromJson
```c
MODULE_HANDLE ModbusRead_CreateFromJson(BROKER_HANDLE broker, const void* configuration);
void* ModbusRead_ParseConfigurationFromJson(const void* configuration);
```
Creates a new MODBUS_READ module instance. `configuration` is a pointer to a `const char*` that contains a json object as supplied by `Gateway_CreateFromJson`.
Creates a new configuration for MODBUS_READ module instance from a JSON string.`configuration` is a pointer to a `const char*` that contains a json object as supplied by `Gateway_CreateFromJson`.
By convention the json object should contain the target modbus server and related read operation settings.
### Expected Arguments
@ -59,9 +59,12 @@ The following Gateway config file describes an instance of the "modbus_read" mod
"modules" :
[
{
"module name" : "modbus_read",
"loading args": {
"module path": "modbus_read.dll"
"name" : "modbus_read",
"loader": {
"type": "native",
"entrypoint": {
"module path" : "modbus_read.dll"
}
},
"args" :
{
@ -83,6 +86,7 @@ The following Gateway config file describes an instance of the "modbus_read" mod
}
```
**SRS_MODBUS_READ_JSON_99_021: [** If `broker` is NULL then `ModbusRead_CreateFromJson` shall fail and return NULL. **]**
**SRS_MODBUS_READ_JSON_99_023: [** If `configuration` is NULL then `ModbusRead_CreateFromJson` shall fail and return NULL. **]**
@ -125,6 +129,7 @@ The following Gateway config file describes an instance of the "modbus_read" mod
**SRS_MODBUS_READ_JSON_99_045: [** `ModbusRead_CreateFromJson` shall walk through each object of the array. **]**
## ModbusRead_Create
```c
MODULE_HANDLE ModbusRead_Create(BROKER_HANDLE broker, const void* configuration);
@ -139,11 +144,13 @@ Creates a new `MODBUS_READ` instance. `configuration` is a pointer to a `MODBUS_
**SRS_MODBUS_READ_99_008: [**Otherwise `ModbusRead_Create` shall return a non-NULL pointer.**]**
## ModbusRead_Receive
```c
void ModbusRead_Receive(MODULE_HANDLE moduleHandle, MESSAGE_HANDLE messageHandle);
```
**SRS_MODBUS_READ_99_009: [**If `moduleHandle` is NULL then `ModbusRead_Receive` shall fail and return.**]**
**SRS_MODBUS_READ_99_010: [**If `messageHandle` is NULL then `ModbusRead_Receive` shall fail and return.**]**
@ -159,6 +166,13 @@ void ModbusRead_Receive(MODULE_HANDLE moduleHandle, MESSAGE_HANDLE messageHandle
**SRS_MODBUS_READ_99_018: [**If content of `messageHandle` is not a JSON value, then `ModbusRead_Receive` shall fail and return NULL.**]**
## ModbusRead_FreeConfiguration
```c
void ModbusRead_FreeConfiguration(void* configuration);
```
**SRS_MODBUS_READ_99_006: [**`ModbusRead_FreeConfiguration` shall do nothing, cleanup is done in `ModbusRead_Destroy`.**]**
## ModbusRead_Destroy
```c
void ModbusRead_Destroy(MODULE_HANDLE moduleHandle);

Просмотреть файл

@ -51,6 +51,68 @@ static void modbus_config_cleanup(MODBUS_READ_CONFIG * config)
free(temp_config);
}
}
static bool isValidMac(char* mac)
{
//format XX:XX:XX:XX:XX:XX
bool ret = true;
int len = strlen(mac);
if (len != MACSTRLEN)
{
LogError("invalid mac length: %d", len);
ret = false;
}
else
{
for (int mac_char = 0; mac_char < MACSTRLEN; mac_char++)
{
if (((mac_char + 1) % 3 == 0))
{
if (mac[mac_char] != ':')
{
ret = false;
break;
}
}
else
{
if (!((mac[mac_char] >= '0' && mac[mac_char] <= '9') || (mac[mac_char] >= 'a' && mac[mac_char] <= 'f') || (mac[mac_char] >= 'A' && mac[mac_char] <= 'F')))
{
ret = false;
break;
}
}
}
}
return ret;
}
static bool isValidServer(char* server)
{
//ipv4 format XXX.XXX.XXX.XXX
//serial port format COMX
bool ret = true;
if (memcmp(server, "COM", 3) == 0)
{
if (0 > atoi(server + 3))
{
LogError("invalid COM port: %s", server);
ret = false;
}
}
else
{
if (inet_addr(server) == INADDR_NONE)
{
LogError("invalid ipv4: %s", server);
ret = false;
}
}
return ret;
}
static bool addOneOperation(MODBUS_READ_OPERATION * operation, JSON_Object * operation_obj)
{
@ -106,13 +168,13 @@ static bool addOneServer(MODBUS_READ_CONFIG * config, JSON_Object * arg_obj)
const char* mac_address = json_object_get_string(arg_obj, "macAddress");
const char* interval = json_object_get_string(arg_obj, "interval");
const char* device_type = json_object_get_string(arg_obj, "deviceType");
if (server_str == NULL)
if (server_str == NULL || !isValidServer(server_str))
{
/*Codes_SRS_MODBUS_READ_JSON_99_034: [ If the `args` object does not contain a value named "serverConnectionString" then ModbusRead_CreateFromJson shall fail and return NULL. ]*/
LogError("Did not find expected %s configuration", "serverConnectionString");
result = false;
}
else if (mac_address == NULL)
else if (mac_address == NULL || !isValidMac(mac_address))
{
/*Codes_SRS_MODBUS_READ_JSON_99_035: [ If the `args` object does not contain a value named "macAddress" then ModbusRead_CreateFromJson shall fail and return NULL. ]*/
LogError("Did not find expected %s configuration", "macAddress");
@ -150,68 +212,6 @@ static bool addOneServer(MODBUS_READ_CONFIG * config, JSON_Object * arg_obj)
return result;
}
static bool isValidMac(char* mac)
{
//format XX:XX:XX:XX:XX:XX
bool ret = true;
int len = strlen(mac);
if (len != MACSTRLEN)
{
LogError("invalid mac length: %d", len);
ret = false;
}
else
{
for (int mac_char = 0; mac_char < MACSTRLEN; mac_char++)
{
if (((mac_char + 1) % 3 == 0) )
{
if (mac[mac_char] != ':')
{
ret = false;
break;
}
}
else
{
if (!((mac[mac_char] >= '0' && mac[mac_char] <= '9') || (mac[mac_char] >= 'a' && mac[mac_char] <= 'f') || (mac[mac_char] >= 'A' && mac[mac_char] <= 'F')))
{
ret = false;
break;
}
}
}
}
return ret;
}
static bool isValidServer(char* server)
{
//ipv4 format XXX.XXX.XXX.XXX
//serial port format COMX
bool ret = true;
if (memcmp(server, "COM", 3) == 0)
{
if (0 > atoi(server + 3))
{
LogError("invalid COM port: %s", server);
ret = false;
}
}
else
{
if (inet_addr(server) == INADDR_NONE)
{
LogError("invalid ipv4: %s", server);
ret = false;
}
}
return ret;
}
static int get_crc(unsigned char * message, int length, unsigned short * out)//refer to J.J. Lee's code
{
unsigned short crcFull = 0xFFFF;
@ -806,58 +806,38 @@ static MODULE_HANDLE ModbusRead_Create(BROKER_HANDLE broker, const void* configu
MODBUS_READ_CONFIG *cur_config = (MODBUS_READ_CONFIG *)configuration;
while (cur_config)
result = malloc(sizeof(MODBUSREAD_HANDLE_DATA));
if (result == NULL)
{
if (!isValidMac(cur_config->mac_address))
{
LogError("invalid mac: %s", cur_config->mac_address);
isValidConfig = false;
break;
}
if (!isValidServer(cur_config->server_str))
{
LogError("invalid server: %s", cur_config->server_str);
isValidConfig = false;
break;
}
cur_config = cur_config->p_next;
/*Codes_SRS_MODBUS_READ_99_007: [If ModbusRead_Create encounters any errors while creating the MODBUSREAD_HANDLE_DATA then it shall fail and return NULL.]*/
LogError("unable to malloc");
}
if (isValidConfig)
else
{
result = malloc(sizeof(MODBUSREAD_HANDLE_DATA));
if (result == NULL)
result->lockHandle = Lock_Init();
if (result->lockHandle == NULL)
{
/*Codes_SRS_MODBUS_READ_99_007: [If ModbusRead_Create encounters any errors while creating the MODBUSREAD_HANDLE_DATA then it shall fail and return NULL.]*/
LogError("unable to malloc");
LogError("unable to Lock_Init");
free(result);
result = NULL;
}
else
{
result->lockHandle = Lock_Init();
if (result->lockHandle == NULL)
result->stopThread = 0;
result->broker = broker;
result->config = (MODBUS_READ_CONFIG *)configuration;
if (ThreadAPI_Create(&result->threadHandle, modbusReadThread, result) != THREADAPI_OK)
{
LogError("unable to Lock_Init");
LogError("failed to spawn a thread");
(void)Lock_Deinit(result->lockHandle);
free(result);
result = NULL;
}
else
{
result->stopThread = 0;
result->broker = broker;
result->config = (MODBUS_READ_CONFIG *)configuration;
if (ThreadAPI_Create(&result->threadHandle, modbusReadThread, result) != THREADAPI_OK)
{
LogError("failed to spawn a thread");
(void)Lock_Deinit(result->lockHandle);
free(result);
result = NULL;
}
else
{
/*all is fine apparently*/
}
/*Codes_SRS_MODBUS_READ_99_008: [Otherwise ModbusRead_Create shall return a non - NULL pointer.]*/
/*all is fine apparently*/
}
/*Codes_SRS_MODBUS_READ_99_008: [Otherwise ModbusRead_Create shall return a non - NULL pointer.]*/
}
}
}
@ -984,18 +964,16 @@ static void ModbusRead_Receive(MODULE_HANDLE moduleHandle, MESSAGE_HANDLE messag
/*Codes_SRS_MODBUS_READ_99_017 : [ModbusRead_Receive shall return.]*/
}
static MODULE_HANDLE ModbusRead_CreateFromJson(BROKER_HANDLE broker, const void* configuration)
static void* ModbusRead_ParseConfigurationFromJson(const void* configuration)
{
MODULE_HANDLE result = NULL;
/*Codes_SRS_MODBUS_READ_JSON_99_021: [ If broker is NULL then ModbusRead_CreateFromJson shall fail and return NULL. ]*/
MODBUS_READ_CONFIG * result = NULL;
/*Codes_SRS_MODBUS_READ_JSON_99_023: [ If configuration is NULL then ModbusRead_CreateFromJson shall fail and return NULL. ]*/
if (
(broker == NULL) ||
(configuration == NULL)
)
{
LogError("NULL parameter detected broker=%p configuration=%p", broker, configuration);
LogError("NULL parameter detected configuration=%p", configuration);
}
else
{
@ -1093,20 +1071,9 @@ static MODULE_HANDLE ModbusRead_CreateFromJson(BROKER_HANDLE broker, const void*
if (!parse_fail)
{
/*Codes_SRS_MODBUS_READ_JSON_99_025: [ ModbusRead_CreateFromJson shall pass broker and the entire config to ModbusRead_Create. ]*/
result = ModbusRead_Create(broker, prev_config);
if (result == NULL)
{
/*Codes_SRS_MODBUS_READ_JSON_99_027: [ If ModbusRead_Create fails then ModbusRead_CreateFromJson shall fail and return NULL. ]*/
/*return result "as is" - that is - NULL*/
LogError("unable to Module_Create MODBUSREAD static");
}
else
{
/*Codes_SRS_MODBUS_READ_JSON_99_026: [ If ModbusRead_Create succeeds then ModbusRead_CreateFromJson shall succeed and return a non-NULL value. ]*/
/*return result "as is" - that is - not NULL*/
}
result = prev_config;/*return result "as is" - that is - not NULL*/
}
if (result == NULL)
else
modbus_config_cleanup(prev_config);
}
json_value_free(json);
@ -1115,11 +1082,16 @@ static MODULE_HANDLE ModbusRead_CreateFromJson(BROKER_HANDLE broker, const void*
return result;
}
static void ModbusRead_FreeConfiguration(void* configuration)
{
/*Codes_SRS_MODBUS_READ_99_006: [ ModbusRead_FreeConfiguration shall do nothing, cleanup is done in ModbusRead_Destroy. ]*/
}
static const MODULE_API_1 moduleInterface =
{
{MODULE_API_VERSION_1},
ModbusRead_CreateFromJson,
ModbusRead_ParseConfigurationFromJson,
ModbusRead_FreeConfiguration,
ModbusRead_Create,
ModbusRead_Destroy,
ModbusRead_Receive,

Просмотреть файл

@ -57,7 +57,8 @@ static MICROMOCK_MUTEX_HANDLE g_testByTest;
static MICROMOCK_GLOBAL_SEMAPHORE_HANDLE g_dllByDll;
/*these are simple cached variables*/
static pfModule_CreateFromJson Module_CreateFromJson = NULL; /*gets assigned in TEST_SUITE_INITIALIZE*/
static pfModule_ParseConfigurationFromJson Module_ParseConfigurationFromJson = NULL; /*gets assigned in TEST_SUITE_INITIALIZE*/
static pfModule_FreeConfiguration Module_FreeConfiguration = NULL; /*gets assigned in TEST_SUITE_INITIALIZE*/
static pfModule_Create Module_Create = NULL; /*gets assigned in TEST_SUITE_INITIALIZE*/
static pfModule_Destroy Module_Destroy = NULL; /*gets assigned in TEST_SUITE_INITIALIZE*/
static pfModule_Receive Module_Receive = NULL; /*gets assigned in TEST_SUITE_INITIALIZE*/
@ -458,7 +459,8 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
ASSERT_IS_NOT_NULL(g_testByTest);
const MODULE_API* apis = Module_GetApi(MODULE_API_VERSION_1);
Module_CreateFromJson = MODULE_CREATE_FROM_JSON(apis);
Module_ParseConfigurationFromJson = MODULE_PARSE_CONFIGURATION_FROM_JSON(apis);
Module_FreeConfiguration = MODULE_FREE_CONFIGURATION(apis);
Module_Create = MODULE_CREATE(apis);
Module_Destroy = MODULE_DESTROY(apis);
Module_Receive = MODULE_RECEIVE(apis);
@ -498,34 +500,20 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
///Act
const MODULE_API* apis = Module_GetApi(MODULE_API_VERSION_1);
///assert
ASSERT_IS_NOT_NULL(apis);
///Assert
ASSERT_IS_NOT_NULL(MODULE_CREATE_FROM_JSON(apis));
ASSERT_IS_NOT_NULL(MODULE_CREATE(apis));
ASSERT_IS_NOT_NULL(MODULE_DESTROY(apis));
ASSERT_IS_NOT_NULL(MODULE_RECEIVE(apis));
ASSERT_IS_TRUE(MODULE_PARSE_CONFIGURATION_FROM_JSON(apis) != NULL);
ASSERT_IS_TRUE(MODULE_FREE_CONFIGURATION(apis) != NULL);
ASSERT_IS_TRUE(MODULE_CREATE(apis));
ASSERT_IS_TRUE(MODULE_DESTROY(apis));
ASSERT_IS_TRUE(MODULE_RECEIVE(apis));
///Ablution
}
//Tests_SRS_MODBUS_READ_JSON_99_021: [ If broker is NULL then ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_Bus_Null)
{
///Arrange
CModbusreadMocks mocks;
BROKER_HANDLE broker = NULL;
char config;
///Act
auto n = Module_CreateFromJson(broker, &config);
///Assert
ASSERT_IS_NULL(n);
///Ablution
}
//Tests_SRS_MODBUS_READ_JSON_99_023: [ If configuration is NULL then ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_Config_Null)
//Tests_SRS_MODBUS_READ_JSON_99_023: [ If configuration is NULL then ModbusRead_ParseConfigurationFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_Config_Null)
{
///Arrange
CModbusreadMocks mocks;
@ -534,7 +522,7 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
char* config = NULL;
///Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
@ -542,11 +530,11 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
///Ablution
}
//Tests_SRS_MODBUS_READ_JSON_99_025: [** `ModbusRead_CreateFromJson` shall pass `broker` and the entire config to `ModbusRead_Create`. ]
//Tests_SRS_MODBUS_READ_JSON_99_026: [** If `ModbusRead_Create` succeeds then `ModbusRead_CreateFromJson` shall succeed and return a non - NULL value. ]
//Tests_SRS_MODBUS_READ_JSON_99_041: [** `ModbusRead_CreateFromJson` shall use "serverConnectionString", "macAddress", and "interval" values as the fields for an MODBUS_READ_CONFIG structure and add this element to the link list. ]
//Tests_SRS_MODBUS_READ_JSON_99_042: [** `ModbusRead_CreateFromJson` shall use "unitId", "functionCode", "startingAddress" and "length" values as the fields for an MODBUS_READ_OPERATION structure and add this element to the link list. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_Success)
//Tests_SRS_MODBUS_READ_JSON_99_025: [** `ModbusRead_ParseConfigurationFromJson` shall pass `broker` and the entire config to `ModbusRead_Create`. ]
//Tests_SRS_MODBUS_READ_JSON_99_026: [** If `ModbusRead_Create` succeeds then `ModbusRead_ParseConfigurationFromJson` shall succeed and return a non - NULL value. ]
//Tests_SRS_MODBUS_READ_JSON_99_041: [** `ModbusRead_ParseConfigurationFromJson` shall use "serverConnectionString", "macAddress", and "interval" values as the fields for an MODBUS_READ_CONFIG structure and add this element to the link list. ]
//Tests_SRS_MODBUS_READ_JSON_99_042: [** `ModbusRead_ParseConfigurationFromJson` shall use "unitId", "functionCode", "startingAddress" and "length" values as the fields for an MODBUS_READ_OPERATION structure and add this element to the link list. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_Success)
{
///Arrange
CModbusreadMocks mocks;
@ -597,28 +585,19 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "length"))
.IgnoreArgument(1);
// ModbusRead_Create
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(IGNORED_NUM_ARG))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, Lock_Init());
STRICT_EXPECTED_CALL(mocks, ThreadAPI_Create(IGNORED_PTR_ARG, IGNORED_PTR_ARG, IGNORED_PTR_ARG))
.IgnoreArgument(1)
.IgnoreArgument(2)
.IgnoreArgument(3);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NOT_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
auto handle = Module_Create(broker, n);
Module_Destroy(handle);
}
//Tests_SRS_MODBUS_READ_JSON_99_045: [ ModbusRead_CreateFromJson shall walk through each object of the array. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_Success_with_2x2_element_array)
//Tests_SRS_MODBUS_READ_JSON_99_045: [ ModbusRead_ParseConfigurationFromJson shall walk through each object of the array. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_Success_with_2x2_element_array)
{
///Arrange
CModbusreadMocks mocks;
@ -736,17 +715,8 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
}
}
// ModbusRead_Create
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(IGNORED_NUM_ARG))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, Lock_Init());
STRICT_EXPECTED_CALL(mocks, ThreadAPI_Create(IGNORED_PTR_ARG, IGNORED_PTR_ARG, IGNORED_PTR_ARG))
.IgnoreArgument(1)
.IgnoreArgument(2)
.IgnoreArgument(3);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NOT_NULL(n);
@ -754,79 +724,12 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
///Cleanup
Module_Destroy(n);
auto handle = Module_Create(broker, n);
Module_Destroy(handle);
}
//Tests_SRS_MODBUS_READ_JSON_99_027: [ If ModbusRead_Create fails then ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_Create_failed_returns_null)
{
///Arrange
CModbusreadMocks mocks;
unsigned char fake;
BROKER_HANDLE broker = (BROKER_HANDLE)&fake;
const char* config = "pretend this is a valid JSON string";
STRICT_EXPECTED_CALL(mocks, json_parse_string(config));
STRICT_EXPECTED_CALL(mocks, json_value_free(IGNORED_PTR_ARG))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_value_get_array(IGNORED_PTR_ARG))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_array_get_count(IGNORED_PTR_ARG))
.IgnoreArgument(1)
.SetReturn((size_t)1);
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(IGNORED_NUM_ARG))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_array_get_object(IGNORED_PTR_ARG, 0))
.IgnoreArgument(1)
.IgnoreArgument(2);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "interval"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "deviceType"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_array(IGNORED_PTR_ARG, "operations"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_array_get_count(IGNORED_PTR_ARG))
.IgnoreArgument(1)
.SetReturn((size_t)1);
STRICT_EXPECTED_CALL(mocks, gballoc_malloc(IGNORED_NUM_ARG))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_array_get_object(IGNORED_PTR_ARG, 0))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "unitId"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "functionCode"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "startingAddress"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "length"))
.IgnoreArgument(1);
// ModbusRead_Create will fail because earlier serverConnectionString is malformed
STRICT_EXPECTED_CALL(mocks, gballoc_free(IGNORED_PTR_ARG))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, gballoc_free(IGNORED_PTR_ARG))
.IgnoreArgument(1);
//Act
auto n = Module_CreateFromJson(broker, config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
}
//Tests_SRS_MODBUS_READ_JSON_99_043: [ If the 'malloc' for `config` fail, ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_malloc_config_failed_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_043: [ If the 'malloc' for `config` fail, ModbusRead_ParseConfigurationFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_malloc_config_failed_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -847,19 +750,16 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1)
.SetFailReturn((void*)NULL);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_044: [ If the 'malloc' for `operation` fail, ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_malloc_operation_failed_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_044: [ If the 'malloc' for `operation` fail, ModbusRead_ParseConfigurationFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_malloc_operation_failed_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -881,10 +781,12 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
STRICT_EXPECTED_CALL(mocks, json_array_get_object(IGNORED_PTR_ARG, 0))
.IgnoreArgument(1)
.IgnoreArgument(2);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1)
.SetReturn("COM1");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1)
.SetReturn("00:00:00:00:00:00");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "interval"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "deviceType"))
@ -900,19 +802,17 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1)
.SetFailReturn((void*)NULL);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_034: [ If the `args` object does not contain a value named "serverConnectionString" then ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_no_server_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_034: [ If the `args` object does not contain a value named "serverConnectionString" then ModbusRead_ParseConfigurationFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_no_server_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -938,7 +838,8 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1)
.SetFailReturn((const char*)NULL);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1);
.IgnoreArgument(1)
.SetReturn("00:00:00:00:00:00");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "interval"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "deviceType"))
@ -947,19 +848,17 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_035: [ If the `args` object does not contain a value named "macAddress" then ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_no_macaddress_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_035: [ If the `args` object does not contain a value named "macAddress" then ModbusRead_ParseConfigurationFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_no_macaddress_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -982,7 +881,8 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1)
.IgnoreArgument(2);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1);
.IgnoreArgument(1)
.SetReturn("COM1");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1)
.SetFailReturn((const char*)NULL);
@ -994,19 +894,17 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_036: [ If the `args` object does not contain a value named "interval" then ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_no_interval_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_036: [ If the `args` object does not contain a value named "interval" then ModbusRead_ParseConfigurationFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_no_interval_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -1028,10 +926,12 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
STRICT_EXPECTED_CALL(mocks, json_array_get_object(IGNORED_PTR_ARG, 0))
.IgnoreArgument(1)
.IgnoreArgument(2);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1)
.SetReturn("COM1");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1)
.SetReturn("00:00:00:00:00:00");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "interval"))
.IgnoreArgument(1)
.SetFailReturn((const char*)NULL);
@ -1041,19 +941,17 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_046: [ If the `args` object does not contain a value named "deviceType" then ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_no_devicetype_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_046: [ If the `args` object does not contain a value named "deviceType" then ModbusRead_ParseConfigurationFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_no_devicetype_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -1075,10 +973,12 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
STRICT_EXPECTED_CALL(mocks, json_array_get_object(IGNORED_PTR_ARG, 0))
.IgnoreArgument(1)
.IgnoreArgument(2);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1)
.SetReturn("COM1");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1)
.SetReturn("00:00:00:00:00:00");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "interval"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "deviceType"))
@ -1088,19 +988,17 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_037 : [** If the `operations` object does not contain a value named "unitId" then ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_no_unitid_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_037 : [** If the `operations` object does not contain a value named "unitId" then ModbusRead_ParseConfigurationFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_no_unitid_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -1122,10 +1020,12 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
STRICT_EXPECTED_CALL(mocks, json_array_get_object(IGNORED_PTR_ARG, 0))
.IgnoreArgument(1)
.IgnoreArgument(2);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1)
.SetReturn("COM1");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1)
.SetReturn("00:00:00:00:00:00");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "interval"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "deviceType"))
@ -1155,19 +1055,17 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_038 : [** If the `operations` object does not contain a value named "functionCode" then ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_no_functioncode_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_038 : [** If the `operations` object does not contain a value named "functionCode" then ModbusRead_ParseConfigurationFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_no_functioncode_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -1189,10 +1087,12 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
STRICT_EXPECTED_CALL(mocks, json_array_get_object(IGNORED_PTR_ARG, 0))
.IgnoreArgument(1)
.IgnoreArgument(2);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1)
.SetReturn("COM1");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1)
.SetReturn("00:00:00:00:00:00");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "interval"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "deviceType"))
@ -1222,19 +1122,17 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_039 : [** If the `operations` object does not contain a value named "startingAddress" then ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_no_startaddress_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_039 : [** If the `operations` object does not contain a value named "startingAddress" then ModbusRead_ParseConfigurationFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_no_startaddress_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -1257,9 +1155,11 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1)
.IgnoreArgument(2);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1);
.IgnoreArgument(1)
.SetReturn("COM1");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1);
.IgnoreArgument(1)
.SetReturn("00:00:00:00:00:00");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "interval"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "deviceType"))
@ -1289,19 +1189,17 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_040 : [** If the `operations` object does not contain a value named "length" then ModbusRead_CreateFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_no_length_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_040 : [** If the `operations` object does not contain a value named "length" then ModbusRead_ParseConfigurationFromJson shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_no_length_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -1324,9 +1222,11 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1)
.IgnoreArgument(2);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1);
.IgnoreArgument(1)
.SetReturn("COM1");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1);
.IgnoreArgument(1)
.SetReturn("00:00:00:00:00:00");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "interval"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "deviceType"))
@ -1356,19 +1256,17 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.IgnoreArgument(1);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_032: [ If the JSON value does not contain `args` array then `ModbusRead_CreateFromJson` shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_no_args_array_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_032: [ If the JSON value does not contain `args` array then `ModbusRead_ParseConfigurationFromJson` shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_no_args_array_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -1385,19 +1283,17 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.SetFailReturn((JSON_Array*)NULL);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_033: [ If the JSON object of `args` array does not contain `operations` array then `ModbusRead_CreateFromJson` shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_no_operations_array_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_033: [ If the JSON object of `args` array does not contain `operations` array then `ModbusRead_ParseConfigurationFromJson` shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_no_operations_array_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -1420,10 +1316,12 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
STRICT_EXPECTED_CALL(mocks, json_array_get_object(IGNORED_PTR_ARG, 0))
.IgnoreArgument(1)
.IgnoreArgument(2);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "serverConnectionString"))
.IgnoreArgument(1)
.SetReturn("COM1");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "macAddress"))
.IgnoreArgument(1)
.SetReturn("00:00:00:00:00:00");
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "interval"))
.IgnoreArgument(1);
STRICT_EXPECTED_CALL(mocks, json_object_get_string(IGNORED_PTR_ARG, "deviceType"))
@ -1435,19 +1333,17 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.SetFailReturn((JSON_Array*)NULL);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);
mocks.AssertActualAndExpectedCalls();
///Cleanup
Module_Destroy(n);
}
//Tests_SRS_MODBUS_READ_JSON_99_031: [ If configuration is not a JSON object, then `ModbusRead_CreateFromJson` shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_CreateFromJson_parse_fails_returns_null)
//Tests_SRS_MODBUS_READ_JSON_99_031: [ If configuration is not a JSON object, then `ModbusRead_ParseConfigurationFromJson` shall fail and return NULL. ]
TEST_FUNCTION(ModbusRead_ParseConfigurationFromJson_parse_fails_returns_null)
{
///Arrange
CModbusreadMocks mocks;
@ -1459,7 +1355,7 @@ BEGIN_TEST_SUITE(modbus_read_unittests)
.SetFailReturn((JSON_Value*)NULL);
//Act
auto n = Module_CreateFromJson(broker, config);
auto n = Module_ParseConfigurationFromJson(config);
///Assert
ASSERT_IS_NULL(n);

Просмотреть файл

@ -1,9 +1,12 @@
{
"modules": [
{
"module name": "IoTHub",
"loading args": {
"module path": "../../modules/iothub/libiothub.so"
"name": "IoTHub",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "../../modules/iothub/libiothub.so"
}
},
"args": {
"IoTHubName": "YOUR IOT HUB NAME",
@ -12,9 +15,12 @@
}
},
{
"module name": "mapping",
"loading args": {
"module path": "../../modules/identitymap/libidentity_map.so"
"name": "mapping",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "../../modules/identitymap/libidentity_map.so"
}
},
"args": [
{
@ -25,18 +31,24 @@
]
},
{
"module name": "logger",
"loading args": {
"module path": "../../modules/logger/liblogger.so"
"name": "logger",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "../../modules/logger/liblogger.so"
}
},
"args": {
"filename": "log.txt"
}
},
{
"module name": "modbus_read",
"loading args": {
"module path": "../../modules/modbus_read/libmodbus_read.so"
"name": "modbus_read",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "../../modules/modbus_read/libmodbus_read.so"
}
},
"args": [
{

Просмотреть файл

@ -1,9 +1,12 @@
{
"modules": [
{
"module name": "IoTHub",
"loading args": {
"module path": "..\\..\\..\\modules\\iothub\\Debug\\iothub.dll"
"name": "IoTHub",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "..\\..\\..\\modules\\iothub\\Debug\\iothub.dll"
}
},
"args": {
"IoTHubName": "YOUR IOT HUB NAME",
@ -12,9 +15,12 @@
}
},
{
"module name": "mapping",
"loading args": {
"module path": "..\\..\\..\\modules\\identitymap\\Debug\\identity_map.dll"
"name": "mapping",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "..\\..\\..\\modules\\identitymap\\Debug\\identity_map.dll"
}
},
"args": [
{
@ -25,18 +31,24 @@
]
},
{
"module name": "logger",
"loading args": {
"module path": "..\\..\\..\\modules\\logger\\Debug\\logger.dll"
"name": "logger",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "..\\..\\..\\modules\\logger\\Debug\\logger.dll"
}
},
"args": {
"filename": "log.txt"
}
},
{
"module name": "modbus_read",
"loading args": {
"module path": "..\\..\\..\\modules\\modbus_read\\Debug\\modbus_read.dll"
"name": "modbus_read",
"loader": {
"name": "native",
"entrypoint": {
"module.path": "..\\..\\..\\modules\\modbus_read\\Debug\\modbus_read.dll"
}
},
"args": [
{