Added COV unit test to check linked list of values, and added helper function to create the linked list.

This commit is contained in:
skarg
2014-07-31 15:14:58 +00:00
parent 3264623953
commit 53ee8f309a
2 changed files with 90 additions and 21 deletions
+4
View File
@@ -106,6 +106,10 @@ extern "C" {
uint8_t invoke_id, uint8_t invoke_id,
BACNET_SUBSCRIBE_COV_DATA * data); BACNET_SUBSCRIBE_COV_DATA * data);
void cov_data_value_list_link(
BACNET_COV_DATA *data,
BACNET_PROPERTY_VALUE *value_list,
size_t count);
#ifdef TEST #ifdef TEST
#include "ctest.h" #include "ctest.h"
+86 -21
View File
@@ -194,7 +194,7 @@ int cov_notify_decode_service_request(
len += decode_unsigned(&apdu[len], len_value, &decoded_value); len += decode_unsigned(&apdu[len], len_value, &decoded_value);
data->subscriberProcessIdentifier = decoded_value; data->subscriberProcessIdentifier = decoded_value;
} else { } else {
return -1; return BACNET_STATUS_ERROR;
} }
/* tag 1 - initiatingDeviceIdentifier */ /* tag 1 - initiatingDeviceIdentifier */
if (decode_is_context_tag(&apdu[len], 1)) { if (decode_is_context_tag(&apdu[len], 1)) {
@@ -205,10 +205,10 @@ int cov_notify_decode_service_request(
decode_object_id(&apdu[len], &decoded_type, decode_object_id(&apdu[len], &decoded_type,
&data->initiatingDeviceIdentifier); &data->initiatingDeviceIdentifier);
if (decoded_type != OBJECT_DEVICE) { if (decoded_type != OBJECT_DEVICE) {
return -1; return BACNET_STATUS_ERROR;
} }
} else { } else {
return -1; return BACNET_STATUS_ERROR;
} }
/* tag 2 - monitoredObjectIdentifier */ /* tag 2 - monitoredObjectIdentifier */
if (decode_is_context_tag(&apdu[len], 2)) { if (decode_is_context_tag(&apdu[len], 2)) {
@@ -220,7 +220,7 @@ int cov_notify_decode_service_request(
&data->monitoredObjectIdentifier.instance); &data->monitoredObjectIdentifier.instance);
data->monitoredObjectIdentifier.type = decoded_type; data->monitoredObjectIdentifier.type = decoded_type;
} else { } else {
return -1; return BACNET_STATUS_ERROR;
} }
/* tag 3 - timeRemaining */ /* tag 3 - timeRemaining */
if (decode_is_context_tag(&apdu[len], 3)) { if (decode_is_context_tag(&apdu[len], 3)) {
@@ -230,16 +230,20 @@ int cov_notify_decode_service_request(
len += decode_unsigned(&apdu[len], len_value, &decoded_value); len += decode_unsigned(&apdu[len], len_value, &decoded_value);
data->timeRemaining = decoded_value; data->timeRemaining = decoded_value;
} else { } else {
return -1; return BACNET_STATUS_ERROR;
} }
/* tag 4: opening context tag - listOfValues */ /* tag 4: opening context tag - listOfValues */
if (!decode_is_opening_tag_number(&apdu[len], 4)) { if (!decode_is_opening_tag_number(&apdu[len], 4)) {
return -1; return BACNET_STATUS_ERROR;
} }
/* a tag number of 4 is not extended so only one octet */ /* a tag number of 4 is not extended so only one octet */
len++; len++;
/* the first value includes a pointer to the next value, etc */ /* the first value includes a pointer to the next value, etc */
value = data->listOfValues; value = data->listOfValues;
if (value == NULL) {
/* no space to store any values */
return BACNET_STATUS_ERROR;
}
while (value != NULL) { while (value != NULL) {
/* tag 0 - propertyIdentifier */ /* tag 0 - propertyIdentifier */
if (decode_is_context_tag(&apdu[len], 0)) { if (decode_is_context_tag(&apdu[len], 0)) {
@@ -249,7 +253,7 @@ int cov_notify_decode_service_request(
len += decode_enumerated(&apdu[len], len_value, &property); len += decode_enumerated(&apdu[len], len_value, &property);
value->propertyIdentifier = (BACNET_PROPERTY_ID) property; value->propertyIdentifier = (BACNET_PROPERTY_ID) property;
} else { } else {
return -1; return BACNET_STATUS_ERROR;
} }
/* tag 1 - propertyArrayIndex OPTIONAL */ /* tag 1 - propertyArrayIndex OPTIONAL */
if (decode_is_context_tag(&apdu[len], 1)) { if (decode_is_context_tag(&apdu[len], 1)) {
@@ -263,18 +267,22 @@ int cov_notify_decode_service_request(
} }
/* tag 2: opening context tag - value */ /* tag 2: opening context tag - value */
if (!decode_is_opening_tag_number(&apdu[len], 2)) { if (!decode_is_opening_tag_number(&apdu[len], 2)) {
return -1; return BACNET_STATUS_ERROR;
} }
/* a tag number of 2 is not extended so only one octet */ /* a tag number of 2 is not extended so only one octet */
len++; len++;
app_data = &value->value; app_data = &value->value;
while (!decode_is_closing_tag_number(&apdu[len], 2)) while (!decode_is_closing_tag_number(&apdu[len], 2))
{ {
if (app_data == NULL) {
/* out of room to store more values */
return BACNET_STATUS_ERROR;
}
app_len = app_len =
bacapp_decode_application_data(&apdu[len], apdu_len - len, app_data); bacapp_decode_application_data(&apdu[len], apdu_len - len, app_data);
if (app_len <= 0) if (app_len < 0)
{ {
return -1; return BACNET_STATUS_ERROR;
} }
len += app_len; len += app_len;
@@ -299,9 +307,9 @@ int cov_notify_decode_service_request(
} }
/* is there another one to decode? */ /* is there another one to decode? */
value = value->next; value = value->next;
/* out of room to store more values */
if (value == NULL) { if (value == NULL) {
return -1; /* out of room to store more values */
return BACNET_STATUS_ERROR;
} }
} }
} }
@@ -638,6 +646,38 @@ int cov_subscribe_property_decode_service_request(
return len; return len;
} }
/** Link an array or buffer of BACNET_PROPERTY_VALUE elements and add them
* to the BACNET_COV_DATA structure. It is used prior to encoding or
* decoding the APDU data into the structure.
*
* @param data - The BACNET_COV_DATA structure that holds the data to
* be encoded or decoded.
* @param value_list - One or more BACNET_PROPERTY_VALUE elements in
* a buffer or array.
* @param count - number of BACNET_PROPERTY_VALUE elements
*/
void cov_data_value_list_link(
BACNET_COV_DATA *data,
BACNET_PROPERTY_VALUE *value_list,
size_t count)
{
BACNET_PROPERTY_VALUE *current_value_list = NULL;
if (data && value_list) {
data->listOfValues = value_list;
while (count) {
if (count > 1) {
current_value_list = value_list;
value_list++;
current_value_list->next = value_list;
} else {
value_list->next = NULL;
}
count--;
}
}
}
#ifdef TEST #ifdef TEST
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
@@ -761,12 +801,14 @@ int cov_subscribe_property_decode_apdu(
return len; return len;
} }
/* dummy function stubs */
void testCOVNotifyData( void testCOVNotifyData(
Test * pTest, Test * pTest,
BACNET_COV_DATA * data, BACNET_COV_DATA * data,
BACNET_COV_DATA * test_data) BACNET_COV_DATA * test_data)
{ {
BACNET_PROPERTY_VALUE *value = NULL;
BACNET_PROPERTY_VALUE *test_value = NULL;
ct_test(pTest, ct_test(pTest,
test_data->subscriberProcessIdentifier == test_data->subscriberProcessIdentifier ==
data->subscriberProcessIdentifier); data->subscriberProcessIdentifier);
@@ -780,7 +822,24 @@ void testCOVNotifyData(
test_data->monitoredObjectIdentifier.instance == test_data->monitoredObjectIdentifier.instance ==
data->monitoredObjectIdentifier.instance); data->monitoredObjectIdentifier.instance);
ct_test(pTest, test_data->timeRemaining == data->timeRemaining); ct_test(pTest, test_data->timeRemaining == data->timeRemaining);
/* FIXME: test the listOfValues in some clever manner */ /* test the listOfValues in some clever manner */
value = data->listOfValues;
test_value = test_data->listOfValues;
while (value) {
ct_test(pTest, test_value);
if (test_value) {
ct_test(pTest,
test_value->propertyIdentifier == value->propertyIdentifier);
ct_test(pTest,
test_value->propertyArrayIndex == value->propertyArrayIndex);
ct_test(pTest,
test_value->priority == value->priority);
ct_test(pTest,
bacapp_same_value(&test_value->value, &value->value));
test_value = test_value->next;
}
value = value->next;
}
} }
void testUCOVNotifyData( void testUCOVNotifyData(
@@ -791,12 +850,13 @@ void testUCOVNotifyData(
int len = 0; int len = 0;
int apdu_len = 0; int apdu_len = 0;
BACNET_COV_DATA test_data; BACNET_COV_DATA test_data;
BACNET_PROPERTY_VALUE value_list[5] = {{0}};
len = ucov_notify_encode_apdu(&apdu[0], data); len = ucov_notify_encode_apdu(&apdu[0], data);
ct_test(pTest, len > 0); ct_test(pTest, len > 0);
apdu_len = len; apdu_len = len;
test_data.listOfValues = NULL; cov_data_value_list_link(&test_data, &value_list[0], 5);
len = ucov_notify_decode_apdu(&apdu[0], apdu_len, &test_data); len = ucov_notify_decode_apdu(&apdu[0], apdu_len, &test_data);
ct_test(pTest, len != -1); ct_test(pTest, len != -1);
testCOVNotifyData(pTest, data, &test_data); testCOVNotifyData(pTest, data, &test_data);
@@ -811,13 +871,14 @@ void testCCOVNotifyData(
int len = 0; int len = 0;
int apdu_len = 0; int apdu_len = 0;
BACNET_COV_DATA test_data; BACNET_COV_DATA test_data;
BACNET_PROPERTY_VALUE value_list[2] = {{0}};
uint8_t test_invoke_id = 0; uint8_t test_invoke_id = 0;
len = ccov_notify_encode_apdu(&apdu[0], invoke_id, data); len = ccov_notify_encode_apdu(&apdu[0], invoke_id, data);
ct_test(pTest, len != 0); ct_test(pTest, len != 0);
apdu_len = len; apdu_len = len;
test_data.listOfValues = NULL; cov_data_value_list_link(&test_data, &value_list[0], 2);
len = len =
ccov_notify_decode_apdu(&apdu[0], apdu_len, &test_invoke_id, ccov_notify_decode_apdu(&apdu[0], apdu_len, &test_invoke_id,
&test_data); &test_data);
@@ -831,7 +892,7 @@ void testCOVNotify(
{ {
uint8_t invoke_id = 12; uint8_t invoke_id = 12;
BACNET_COV_DATA data; BACNET_COV_DATA data;
BACNET_PROPERTY_VALUE value_list[2]; BACNET_PROPERTY_VALUE value_list[2] = {{0}};
data.subscriberProcessIdentifier = 1; data.subscriberProcessIdentifier = 1;
data.initiatingDeviceIdentifier = 123; data.initiatingDeviceIdentifier = 123;
@@ -839,18 +900,22 @@ void testCOVNotify(
data.monitoredObjectIdentifier.instance = 321; data.monitoredObjectIdentifier.instance = 321;
data.timeRemaining = 456; data.timeRemaining = 456;
data.listOfValues = &value_list[0]; cov_data_value_list_link(&data, &value_list[0], 2);
/* first value */
value_list[0].propertyIdentifier = PROP_PRESENT_VALUE; value_list[0].propertyIdentifier = PROP_PRESENT_VALUE;
value_list[0].propertyArrayIndex = BACNET_ARRAY_ALL; value_list[0].propertyArrayIndex = BACNET_ARRAY_ALL;
bacapp_parse_application_data(BACNET_APPLICATION_TAG_REAL, "21.0", bacapp_parse_application_data(BACNET_APPLICATION_TAG_REAL, "21.0",
&value_list[0].value); &value_list[0].value);
value_list[0].priority = 0; value_list[0].priority = 0;
value_list[0].next = NULL; /* second value */
value_list[1].propertyIdentifier = PROP_STATUS_FLAGS;
value_list[1].propertyArrayIndex = BACNET_ARRAY_ALL;
bacapp_parse_application_data(BACNET_APPLICATION_TAG_BIT_STRING, "0000",
&value_list[1].value);
value_list[1].priority = 0;
testUCOVNotifyData(pTest, &data); testUCOVNotifyData(pTest, &data);
testCCOVNotifyData(pTest, invoke_id, &data); testCCOVNotifyData(pTest, invoke_id, &data);
/* FIXME: add more values to the list of values */
} }
void testCOVSubscribeData( void testCOVSubscribeData(