added secure BACnet primitive datatype encode functions. (#643)

* added secure BACnet primitive datatype encode functions.
This commit is contained in:
Steve Karg
2024-05-17 08:56:24 -05:00
committed by GitHub
parent 8eab077ebf
commit cbd9b3f04f
5 changed files with 788 additions and 126 deletions
+325 -94
View File
@@ -230,6 +230,87 @@ static void testBACDCodeTags(void)
return;
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bacdcode_tests, testBACnetTagEncoder)
#else
static void testBACnetTagEncoder(void)
#endif
{
uint8_t apdu[MAX_APDU] = { 0 };
unsigned i = 0, j = 0, k = 0;
BACNET_TAG tag = { 0 }, test_tag = { 0 };
int len, test_len, null_len;
tag.application = true;
tag.opening = false;
tag.closing = false;
tag.context = false;
tag.len_value_type = 0;
tag.number = 0;
for (k = 0; k < 2; k++) {
for (j = 0; j < 8; j++) {
for (i = 0; i < 32; i++) {
null_len = bacnet_tag_encode(NULL, sizeof(apdu), &tag);
len = bacnet_tag_encode(&apdu[0], sizeof(apdu), &tag);
zassert_equal(len, null_len, NULL);
test_len = bacnet_tag_decode(apdu, len, &test_tag);
zassert_equal(len, test_len, NULL);
zassert_equal(tag.number, test_tag.number, NULL);
zassert_equal(tag.application, test_tag.application, NULL);
zassert_equal(tag.context, test_tag.context, NULL);
zassert_equal(tag.closing, test_tag.closing, NULL);
zassert_equal(tag.opening, test_tag.opening, NULL);
tag.len_value_type = BIT(i);
}
tag.number = BIT(i);
}
tag.context = true;
tag.application = false;
tag.len_value_type = 0;
tag.number = 0;
}
tag.opening = true;
tag.closing = false;
tag.application = false;
tag.context = false;
tag.len_value_type = 0;
tag.number = 0;
for (k = 0; k < 2; k++) {
for (j = 0; j < 8; j++) {
null_len = bacnet_tag_encode(NULL, sizeof(apdu), &tag);
len = bacnet_tag_encode(&apdu[0], sizeof(apdu), &tag);
zassert_equal(len, null_len, NULL);
test_len = bacnet_tag_decode(apdu, len, &test_tag);
zassert_equal(len, test_len, NULL);
zassert_equal(tag.number, test_tag.number, NULL);
zassert_equal(tag.application, test_tag.application, NULL);
zassert_equal(tag.context, test_tag.context, NULL);
zassert_equal(tag.closing, test_tag.closing, NULL);
zassert_equal(tag.opening, test_tag.opening, NULL);
tag.number = BIT(i);
}
tag.number = 0;
tag.opening = false;
tag.closing = true;
}
tag.number = BIT(7);
tag.len_value_type = BIT(31);
tag.opening = false;
tag.closing = false;
tag.application = true;
tag.context = false;
len = bacnet_tag_encode(&apdu[0], sizeof(apdu), &tag);
while (--len) {
test_len = bacnet_tag_decode(apdu, len, &test_tag);
zassert_equal(test_len, 0, NULL);
}
null_len = bacnet_tag_encode(NULL, sizeof(apdu), &tag);
while (--null_len) {
test_len = bacnet_tag_encode(&apdu[0], null_len, &tag);
zassert_equal(test_len, 0, NULL);
}
}
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST(bacdcode_tests, testBACDCodeEnumerated)
#else
@@ -281,6 +362,16 @@ static void testBACDCodeEnumerated(void)
/* test the interesting values */
value = BIT(i);
}
apdu_len = bacnet_enumerated_application_encode(apdu, sizeof(apdu), value);
null_len = bacnet_enumerated_application_encode(NULL, sizeof(apdu), value);
zassert_equal(apdu_len, null_len, NULL);
len = bacnet_enumerated_application_decode(apdu, apdu_len, &decoded_value);
zassert_equal(apdu_len, len, "len=%d apdu_len=%d", len, apdu_len);
zassert_equal(decoded_value, value, NULL);
while (--apdu_len) {
len = bacnet_enumerated_application_encode(apdu, apdu_len, value);
zassert_equal(len, 0, NULL);
}
return;
}
@@ -339,6 +430,16 @@ static void testBACDCodeReal(void)
len = bacnet_real_application_decode(apdu, apdu_len, NULL);
zassert_equal(len, BACNET_STATUS_ERROR, NULL);
}
apdu_len = bacnet_real_application_encode(apdu, sizeof(apdu), value);
null_len = bacnet_real_application_encode(NULL, sizeof(apdu), value);
zassert_equal(apdu_len, null_len, NULL);
len = bacnet_real_application_decode(apdu, apdu_len, &decoded_value);
zassert_equal(apdu_len, len, "len=%d apdu_len=%d", len, apdu_len);
zassert_false(islessgreater(decoded_value, value), NULL);
while (--apdu_len) {
len = bacnet_real_application_encode(apdu, apdu_len, value);
zassert_equal(len, 0, NULL);
}
return;
}
@@ -398,6 +499,16 @@ static void testBACDCodeDouble(void)
len = bacnet_double_application_decode(apdu, apdu_len, NULL);
zassert_equal(len, BACNET_STATUS_ERROR, NULL);
}
apdu_len = bacnet_double_application_encode(apdu, sizeof(apdu), value);
null_len = bacnet_double_application_encode(NULL, sizeof(apdu), value);
zassert_equal(apdu_len, null_len, NULL);
len = bacnet_double_application_decode(apdu, apdu_len, &decoded_value);
zassert_equal(apdu_len, len, "len=%d apdu_len=%d", len, apdu_len);
zassert_false(islessgreater(decoded_value, value), NULL);
while (--apdu_len) {
len = bacnet_double_application_encode(apdu, apdu_len, value);
zassert_equal(len, 0, NULL);
}
return;
}
@@ -410,36 +521,49 @@ static void testBACnetDateDecodes(void)
{
uint8_t apdu[MAX_APDU];
uint8_t sample[10] = { 0xa4, 0xff, 0xff, 0xff, 0xff };
int inLen;
int outLen;
int outLen2;
int len, test_len, null_len, apdu_len;
BACNET_DATE value;
BACNET_DATE test_value;
BACNET_DATE in;
BACNET_DATE out;
in.day = 3;
in.month = 10;
in.wday = 5;
in.year = 1945;
inLen = encode_application_date(apdu, &in);
outLen = decode_application_date(apdu, &out);
zassert_equal(inLen, outLen, NULL);
zassert_equal(in.day, out.day, NULL);
zassert_equal(in.month, out.month, NULL);
zassert_equal(in.wday, out.wday, NULL);
zassert_equal(in.year, out.year, NULL);
memset(&out, 0, sizeof(out));
outLen = decode_application_date(sample, &out);
value.day = 3;
value.month = 10;
value.wday = 5;
value.year = 1945;
len = encode_application_date(apdu, &value);
test_len = decode_application_date(apdu, &test_value);
zassert_equal(len, test_len, NULL);
zassert_equal(value.day, test_value.day, NULL);
zassert_equal(value.month, test_value.month, NULL);
zassert_equal(value.wday, test_value.wday, NULL);
zassert_equal(value.year, test_value.year, NULL);
memset(&test_value, 0, sizeof(test_value));
test_len = decode_application_date(sample, &test_value);
/* try decoding sample data captured from a bacnet device - all wildcards */
zassert_equal(5, outLen, NULL);
zassert_equal(0xff, out.day, NULL);
zassert_equal(0xff, out.month, NULL);
zassert_equal(0xff, out.wday, NULL);
zassert_equal(2155, out.year, NULL);
zassert_equal(5, test_len, NULL);
zassert_equal(0xff, test_value.day, NULL);
zassert_equal(0xff, test_value.month, NULL);
zassert_equal(0xff, test_value.wday, NULL);
zassert_equal(2155, test_value.year, NULL);
/* test new API for APDU size checking and NULL behavior */
apdu_len = bacnet_date_application_encode(apdu, sizeof(apdu), &value);
null_len = bacnet_date_application_encode(NULL, sizeof(apdu), &value);
zassert_equal(apdu_len, null_len, NULL);
test_len = bacnet_date_application_decode(apdu, apdu_len, &test_value);
zassert_equal(
apdu_len, test_len, "test_len=%d apdu_len=%d", test_len, apdu_len);
zassert_equal(value.day, test_value.day, NULL);
zassert_equal(value.month, test_value.month, NULL);
zassert_equal(value.wday, test_value.wday, NULL);
zassert_equal(value.year, test_value.year, NULL);
while (--test_len) {
len = bacnet_date_application_decode(apdu, test_len, &test_value);
zassert_equal(len, BACNET_STATUS_ERROR, NULL);
}
while (--apdu_len) {
len = bacnet_date_application_encode(apdu, apdu_len, &value);
zassert_equal(len, 0, NULL);
}
}
#if defined(CONFIG_ZTEST_NEW_API)
@@ -563,6 +687,18 @@ static void test_bacnet_unsigned_value_codec(BACNET_UNSIGNED_INTEGER value)
test_len = bacnet_unsigned_application_decode(apdu, apdu_len, NULL);
zassert_equal(test_len, BACNET_STATUS_ERROR, NULL);
}
apdu_len = bacnet_unsigned_application_encode(apdu, sizeof(apdu), value);
null_len = bacnet_unsigned_application_encode(NULL, sizeof(apdu), value);
zassert_equal(apdu_len, null_len, NULL);
test_len =
bacnet_unsigned_application_decode(apdu, apdu_len, &decoded_value);
zassert_equal(
apdu_len, test_len, "test_len=%d apdu_len=%d", test_len, apdu_len);
zassert_equal(decoded_value, value, NULL);
while (--apdu_len) {
test_len = bacnet_unsigned_application_encode(apdu, apdu_len, value);
zassert_equal(test_len, 0, NULL);
}
}
#if defined(CONFIG_ZTEST_NEW_API)
@@ -638,7 +774,7 @@ static void testBACnetUnsigned(void)
static void testBACDCodeSignedValue(int32_t value)
{
int32_t decoded_value = 0;
int len = 0, null_len = 0, tag_len = 0, test_len = 0;
int len = 0, null_len = 0, tag_len = 0, test_len = 0, apdu_len = 0;
uint8_t apdu[MAX_APDU] = { 0 };
BACNET_TAG tag = { 0 };
@@ -685,6 +821,17 @@ static void testBACDCodeSignedValue(int32_t value)
test_len = bacnet_signed_application_decode(apdu, len, NULL);
zassert_equal(test_len, BACNET_STATUS_ERROR, NULL);
}
apdu_len = bacnet_signed_application_encode(apdu, sizeof(apdu), value);
null_len = bacnet_signed_application_encode(NULL, sizeof(apdu), value);
zassert_equal(apdu_len, null_len, NULL);
test_len = bacnet_signed_application_decode(apdu, apdu_len, &decoded_value);
zassert_equal(
apdu_len, test_len, "test_len=%d apdu_len=%d", test_len, apdu_len);
zassert_equal(decoded_value, value, NULL);
while (--apdu_len) {
test_len = bacnet_signed_application_encode(apdu, apdu_len, value);
zassert_equal(test_len, 0, NULL);
}
return;
}
@@ -769,9 +916,9 @@ static void testBACDCodeOctetString(void)
#endif
{
uint8_t apdu[MAX_APDU] = { 0 };
BACNET_OCTET_STRING octet_string;
BACNET_OCTET_STRING test_octet_string;
uint8_t test_value[MAX_APDU] = { "" };
BACNET_OCTET_STRING value;
BACNET_OCTET_STRING test_value;
uint8_t test_apdu[MAX_APDU] = { "" };
int i; /* for loop counter */
int apdu_len = 0, len = 0, null_len = 0, test_len = 0;
uint8_t tag_number = 0;
@@ -779,45 +926,61 @@ static void testBACDCodeOctetString(void)
bool status = false;
int diff = 0; /* for memcmp */
status = octetstring_init(&octet_string, NULL, 0);
status = octetstring_init(&value, NULL, 0);
zassert_true(status, NULL);
apdu_len = encode_application_octet_string(&apdu[0], &octet_string);
null_len = encode_application_octet_string(NULL, &octet_string);
apdu_len = encode_application_octet_string(&apdu[0], &value);
null_len = encode_application_octet_string(NULL, &value);
zassert_equal(apdu_len, null_len, NULL);
#if defined(BACNET_STACK_DEPRECATED_DISABLE)
len = decode_tag_number_and_value(&apdu[0], &tag_number, &len_value);
zassert_equal(tag_number, BACNET_APPLICATION_TAG_OCTET_STRING, NULL);
len += decode_octet_string(&apdu[len], len_value, &test_octet_string);
len += decode_octet_string(&apdu[len], len_value, &test_value);
zassert_equal(apdu_len, len, NULL);
diff = memcmp(
octetstring_value(&octet_string), &test_value[0],
octetstring_length(&octet_string));
octetstring_value(&value), &test_apdu[0], octetstring_length(&value));
zassert_equal(diff, 0, NULL);
#endif
for (i = 0; i < (MAX_APDU - 6); i++) {
test_value[i] = '0' + (i % 10);
status = octetstring_init(&octet_string, test_value, i);
test_apdu[i] = '0' + (i % 10);
status = octetstring_init(&value, test_apdu, i);
zassert_true(status, NULL);
apdu_len = encode_application_octet_string(apdu, &octet_string);
null_len = encode_application_octet_string(NULL, &octet_string);
apdu_len = encode_application_octet_string(apdu, &value);
null_len = encode_application_octet_string(NULL, &value);
zassert_equal(apdu_len, null_len, NULL);
#if defined(BACNET_STACK_DEPRECATED_DISABLE)
len = decode_tag_number_and_value(&apdu[0], &tag_number, &len_value);
zassert_equal(tag_number, BACNET_APPLICATION_TAG_OCTET_STRING, NULL);
len += decode_octet_string(&apdu[len], len_value, &test_octet_string);
len += decode_octet_string(&apdu[len], len_value, &test_value);
zassert_equal(apdu_len, len, "test octet string=#%d\n", i);
diff = memcmp(
octetstring_value(&octet_string), &test_value[0],
octetstring_length(&octet_string));
octetstring_value(&value), &test_apdu[0],
octetstring_length(&value));
zassert_equal(diff, 0, "test octet string=#%d\n", i);
#endif
test_len = bacnet_octet_string_application_decode(
apdu, apdu_len, &test_octet_string);
test_len =
bacnet_octet_string_application_decode(apdu, apdu_len, &test_value);
zassert_equal(
apdu_len, test_len, "apdu_len=%d test_len=%d i=%d", apdu_len,
test_len, i);
zassert_true(
octetstring_value_same(&octet_string, &test_octet_string), NULL);
zassert_true(octetstring_value_same(&value, &test_value), NULL);
}
apdu_len =
bacnet_octet_string_application_encode(apdu, sizeof(apdu), &value);
null_len =
bacnet_octet_string_application_encode(NULL, sizeof(apdu), &value);
zassert_equal(apdu_len, null_len, NULL);
test_len =
bacnet_octet_string_application_decode(apdu, apdu_len, &test_value);
zassert_equal(
apdu_len, test_len, "test_len=%d apdu_len=%d", test_len, apdu_len);
zassert_true(octetstring_value_same(&value, &test_value), NULL);
while (--test_len) {
len = bacnet_octet_string_application_decode(apdu, test_len, NULL);
zassert_equal(len, BACNET_STATUS_ERROR, NULL);
}
while (--apdu_len) {
len = bacnet_octet_string_application_encode(apdu, apdu_len, &value);
zassert_equal(len, 0, NULL);
}
return;
@@ -831,43 +994,43 @@ static void testBACDCodeCharacterString(void)
{
uint8_t apdu[MAX_APDU] = { 0 };
uint8_t encoded_apdu[MAX_APDU] = { 0 };
BACNET_CHARACTER_STRING char_string;
BACNET_CHARACTER_STRING test_char_string;
char test_value[MAX_APDU] = { "" };
BACNET_CHARACTER_STRING value;
BACNET_CHARACTER_STRING test_value;
char test_name[MAX_APDU] = { "" };
int i; /* for loop counter */
int apdu_len = 0, len = 0, null_len = 0, tag_len;
int apdu_len = 0, len = 0, null_len = 0, tag_len, test_len;
uint8_t tag_number = 0;
uint32_t len_value = 0;
int diff = 0; /* for comparison */
bool status = false;
BACNET_TAG tag = { 0 };
status = characterstring_init(&char_string, CHARACTER_ANSI_X34, NULL, 0);
status = characterstring_init(&value, CHARACTER_ANSI_X34, NULL, 0);
zassert_true(status, NULL);
apdu_len = encode_application_character_string(&apdu[0], &char_string);
null_len = encode_application_character_string(NULL, &char_string);
apdu_len = encode_application_character_string(&apdu[0], &value);
null_len = encode_application_character_string(NULL, &value);
zassert_equal(apdu_len, null_len, NULL);
#if defined(BACNET_STACK_DEPRECATED_DISABLE)
len = decode_tag_number_and_value(&apdu[0], &tag_number, &len_value);
zassert_equal(tag_number, BACNET_APPLICATION_TAG_CHARACTER_STRING, NULL);
len += decode_character_string(&apdu[len], len_value, &test_char_string);
len += decode_character_string(&apdu[len], len_value, &test_value);
zassert_equal(apdu_len, len, NULL);
diff = memcmp(
characterstring_value(&char_string), &test_value[0],
characterstring_length(&char_string));
characterstring_value(&value), &test_name[0],
characterstring_length(&value));
zassert_equal(diff, 0, NULL);
#endif
for (i = 0; i < MAX_CHARACTER_STRING_BYTES - 1; i++) {
test_value[i] = 'S';
test_value[i + 1] = '\0';
status = characterstring_init_ansi(&char_string, test_value);
test_name[i] = 'S';
test_name[i + 1] = '\0';
status = characterstring_init_ansi(&value, test_name);
zassert_true(status, NULL);
apdu_len =
encode_application_character_string(&encoded_apdu[0], &char_string);
null_len = encode_application_character_string(NULL, &char_string);
encode_application_character_string(&encoded_apdu[0], &value);
null_len = encode_application_character_string(NULL, &value);
zassert_equal(apdu_len, null_len, NULL);
len = bacnet_character_string_application_decode(
encoded_apdu, apdu_len, &test_char_string);
encoded_apdu, apdu_len, &test_value);
zassert_equal(len, apdu_len, NULL);
tag_len = bacnet_tag_decode(encoded_apdu, apdu_len, &tag);
zassert_true(tag_len > 0, NULL);
@@ -882,13 +1045,32 @@ static void testBACDCodeCharacterString(void)
}
zassert_equal(apdu_len, len, NULL);
diff = memcmp(
characterstring_value(&char_string), &test_value[0],
characterstring_length(&char_string));
characterstring_value(&value), &test_name[0],
characterstring_length(&value));
if (diff) {
printf("test string=#%d\n", i);
}
zassert_equal(diff, 0, NULL);
}
apdu_len =
bacnet_character_string_application_encode(apdu, sizeof(apdu), &value);
null_len =
bacnet_character_string_application_encode(NULL, sizeof(apdu), &value);
zassert_equal(apdu_len, null_len, NULL);
test_len =
bacnet_character_string_application_decode(apdu, apdu_len, &test_value);
zassert_equal(
apdu_len, test_len, "test_len=%d apdu_len=%d", test_len, apdu_len);
zassert_true(characterstring_same(&value, &test_value), NULL);
while (--test_len) {
len = bacnet_character_string_application_decode(apdu, test_len, NULL);
zassert_equal(len, BACNET_STATUS_ERROR, NULL);
}
while (--apdu_len) {
len =
bacnet_character_string_application_encode(apdu, apdu_len, &value);
zassert_equal(len, 0, NULL);
}
return;
}
@@ -901,11 +1083,12 @@ static void testBACDCodeObject(void)
{
uint8_t object_apdu[32] = { 0 };
uint8_t encoded_apdu[32] = { 0 };
uint8_t apdu[MAX_APDU] = { 0 };
BACNET_OBJECT_TYPE type = OBJECT_BINARY_INPUT;
BACNET_OBJECT_TYPE decoded_type = OBJECT_ANALOG_OUTPUT;
uint32_t instance = 123;
uint32_t decoded_instance = 0;
int apdu_len = 0, len = 0, null_len = 0;
int apdu_len = 0, len = 0, null_len = 0, test_len = 0;
uint8_t tag_number = 0;
apdu_len = encode_bacnet_object_id(&encoded_apdu[0], type, instance);
@@ -950,6 +1133,30 @@ static void testBACDCodeObject(void)
zassert_equal(len, 0, NULL);
}
}
/* validate application API codec and APDU size too short */
type = 1023;
instance = BACNET_MAX_INSTANCE;
apdu_len =
bacnet_object_id_application_encode(apdu, sizeof(apdu), type, instance);
null_len =
bacnet_object_id_application_encode(NULL, sizeof(apdu), type, instance);
zassert_equal(apdu_len, null_len, NULL);
test_len = bacnet_object_id_application_decode(
apdu, apdu_len, &decoded_type, &decoded_instance);
zassert_equal(
apdu_len, test_len, "test_len=%d apdu_len=%d", test_len, apdu_len);
zassert_equal(decoded_type, type, NULL);
zassert_equal(decoded_instance, instance, NULL);
while (--test_len) {
len = bacnet_object_id_application_decode(
apdu, test_len, &decoded_type, &decoded_instance);
zassert_equal(len, BACNET_STATUS_ERROR, NULL);
}
while (--apdu_len) {
len =
bacnet_object_id_application_encode(apdu, apdu_len, type, instance);
zassert_equal(len, 0, NULL);
}
/* test context encoded */
type = OBJECT_BINARY_INPUT;
instance = 123;
@@ -1002,58 +1209,78 @@ static void testBACDCodeBitString(void)
#endif
{
uint8_t bit = 0;
BACNET_BIT_STRING bit_string;
BACNET_BIT_STRING decoded_bit_string;
BACNET_BIT_STRING value;
BACNET_BIT_STRING test_value;
uint8_t apdu[MAX_APDU] = { 0 };
uint32_t len_value = 0;
uint8_t tag_number = 0;
int len = 0, null_len = 0;
int len, null_len, apdu_len, test_len;
BACNET_TAG tag = { 0 };
bitstring_init(&bit_string);
bitstring_init(&value);
/* verify initialization */
zassert_equal(bitstring_bits_used(&bit_string), 0, NULL);
zassert_equal(bitstring_bits_used(&value), 0, NULL);
for (bit = 0; bit < (MAX_BITSTRING_BYTES * 8); bit++) {
zassert_false(bitstring_bit(&bit_string, bit), NULL);
zassert_false(bitstring_bit(&value, bit), NULL);
}
/* test encode/decode -- true */
for (bit = 0; bit < (MAX_BITSTRING_BYTES * 8); bit++) {
bitstring_set_bit(&bit_string, bit, true);
zassert_equal(bitstring_bits_used(&bit_string), (bit + 1), NULL);
zassert_true(bitstring_bit(&bit_string, bit), NULL);
bitstring_set_bit(&value, bit, true);
zassert_equal(bitstring_bits_used(&value), (bit + 1), NULL);
zassert_true(bitstring_bit(&value, bit), NULL);
/* encode */
len = encode_application_bitstring(&apdu[0], &bit_string);
null_len = encode_application_bitstring(NULL, &bit_string);
len = encode_application_bitstring(&apdu[0], &value);
null_len = encode_application_bitstring(NULL, &value);
zassert_equal(len, null_len, NULL);
/* decode */
len = bacnet_bitstring_application_decode(
apdu, null_len, &decoded_bit_string);
apdu, null_len, &test_value);
zassert_equal(
bitstring_bits_used(&decoded_bit_string), (bit + 1), NULL);
zassert_true(bitstring_bit(&decoded_bit_string, bit), NULL);
bitstring_bits_used(&test_value), (bit + 1), NULL);
zassert_true(bitstring_bit(&test_value, bit), NULL);
len = bacnet_tag_decode(apdu, len, &tag);
zassert_true(len > 0, NULL);
zassert_equal(tag.number, BACNET_APPLICATION_TAG_BIT_STRING, NULL);
}
/* test encode/decode -- false */
bitstring_init(&bit_string);
bitstring_init(&value);
for (bit = 0; bit < (MAX_BITSTRING_BYTES * 8); bit++) {
bitstring_set_bit(&bit_string, bit, false);
zassert_equal(bitstring_bits_used(&bit_string), (bit + 1), NULL);
zassert_false(bitstring_bit(&bit_string, bit), NULL);
bitstring_set_bit(&value, bit, false);
zassert_equal(bitstring_bits_used(&value), (bit + 1), NULL);
zassert_false(bitstring_bit(&value, bit), NULL);
/* encode */
len = encode_application_bitstring(&apdu[0], &bit_string);
null_len = encode_application_bitstring(NULL, &bit_string);
len = bacnet_bitstring_application_encode(apdu, sizeof(apdu), &value);
null_len = bacnet_bitstring_application_encode(NULL, sizeof(apdu), &value);
zassert_equal(len, null_len, NULL);
/* decode */
len = bacnet_bitstring_application_decode(
apdu, null_len, &decoded_bit_string);
apdu, null_len, &test_value);
len = bacnet_tag_decode(apdu, len, &tag);
zassert_true(len > 0, NULL);
zassert_equal(tag.number, BACNET_APPLICATION_TAG_BIT_STRING, NULL);
zassert_equal(
bitstring_bits_used(&decoded_bit_string), (bit + 1), NULL);
zassert_false(bitstring_bit(&decoded_bit_string, bit), NULL);
bitstring_bits_used(&test_value), (bit + 1), NULL);
zassert_false(bitstring_bit(&test_value, bit), NULL);
}
/* test APDU size limits */
apdu_len =
bacnet_bitstring_application_encode(apdu, sizeof(apdu), &value);
null_len =
bacnet_bitstring_application_encode(NULL, sizeof(apdu), &value);
zassert_equal(apdu_len, null_len, NULL);
test_len =
bacnet_bitstring_application_decode(apdu, apdu_len, &test_value);
zassert_equal(
apdu_len, test_len, "test_len=%d apdu_len=%d", test_len, apdu_len);
zassert_true(bitstring_same(&value, &test_value), NULL);
while (--test_len) {
len = bacnet_bitstring_application_decode(apdu, test_len, NULL);
zassert_equal(len, BACNET_STATUS_ERROR, NULL);
}
while (--apdu_len) {
len =
bacnet_bitstring_application_encode(apdu, apdu_len, &value);
zassert_equal(len, 0, NULL);
}
}
@@ -1786,18 +2013,21 @@ static void test_bacnet_array_encode(void)
/**
* @}
*/
/* clang-format off */
#if defined(CONFIG_ZTEST_NEW_API)
ZTEST_SUITE(bacdcode_tests, NULL, NULL, NULL, NULL, NULL);
#else
void test_main(void)
{
ztest_test_suite(
bacdcode_tests, ztest_unit_test(testBACnetTagCodec),
ztest_unit_test(testBACDCodeTags), ztest_unit_test(testBACDCodeReal),
bacdcode_tests, ztest_unit_test(testBACnetTagEncoder),
ztest_unit_test(testBACnetTagCodec),
ztest_unit_test(testBACDCodeTags),
ztest_unit_test(testBACDCodeReal),
ztest_unit_test(testBACDCodeUnsigned),
ztest_unit_test(testBACnetUnsigned),
ztest_unit_test(testBACDCodeSigned), ztest_unit_test(testBACnetSigned),
ztest_unit_test(testBACDCodeSigned),
ztest_unit_test(testBACnetSigned),
ztest_unit_test(testBACnetDateDecodes),
ztest_unit_test(testBACnetDateRangeDecodes),
ztest_unit_test(testBACDCodeEnumerated),
@@ -1824,3 +2054,4 @@ void test_main(void)
ztest_run_test_suite(bacdcode_tests);
}
#endif
/* clang-format on */