| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| #include <open62541/types.h> |
| #include <open62541/types_generated.h> |
| #include <open62541/types_generated_encoding_binary.h> |
| #include <open62541/types_generated_handling.h> |
| #include <open62541/util.h> |
| |
| #include "ua_types_encoding_binary.h" |
| #include "ua_types_encoding_json.h" |
| |
| #include <check.h> |
| #include <float.h> |
| #include <math.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #if defined(_MSC_VER) |
| # pragma warning(disable: 4146) |
| #endif |
| |
| /* Test Boolean */ |
| START_TEST(UA_Boolean_true_json_encode) { |
| |
| UA_Boolean *src = UA_Boolean_new(); |
| UA_Boolean_init(src); |
| *src = UA_TRUE; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_BOOLEAN]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "true"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| |
| UA_ByteString_deleteMembers(&buf); |
| UA_Boolean_delete(src); |
| |
| } |
| END_TEST |
| |
| START_TEST(UA_Boolean_false_json_encode) { |
| |
| UA_Boolean *src = UA_Boolean_new(); |
| UA_Boolean_init(src); |
| *src = UA_FALSE; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_BOOLEAN]; |
| |
| UA_ByteString buf; |
| |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| ck_assert_int_eq(size, 5); |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "false"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Boolean_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Boolean_true_bufferTooSmall_json_encode) { |
| |
| UA_Boolean *src = UA_Boolean_new(); |
| UA_Boolean_init(src); |
| *src = UA_FALSE; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_BOOLEAN]; |
| |
| UA_ByteString buf; |
| UA_ByteString_allocBuffer(&buf, 2); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[2]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| char* result = ""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Boolean_delete(src); |
| } |
| END_TEST |
| |
| /* Test String */ |
| START_TEST(UA_String_json_encode) { |
| // given |
| UA_String src = UA_STRING("hello"); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING]; |
| |
| UA_ByteString buf; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| // when |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"hello\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_String_Empty_json_encode) { |
| // given |
| UA_String src = UA_STRING(""); |
| UA_ByteString buf; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING]; |
| |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| // when |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_String_Null_json_encode) { |
| // given |
| UA_String src = UA_STRING_NULL; |
| UA_ByteString buf; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| // when |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "null"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_String_escapesimple_json_encode) { |
| // given |
| UA_String src = UA_STRING("\b\th\"e\fl\nl\\o\r"); |
| UA_ByteString buf; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| // when |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"\\b\\th\\\"e\\fl\\nl\\\\o\\r\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_String_escapeutf_json_encode) { |
| // given |
| UA_String src = UA_STRING("he\\zsdl\alo€ \x26\x3A asdasd"); |
| UA_ByteString buf; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| // when |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"he\\\\zsdl\\u0007lo€ &: asdasd\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_String_special_json_encode) { |
| // given |
| UA_String src = UA_STRING("𝄞𠂊𝕥🔍"); |
| UA_ByteString buf; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| // when |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"𝄞𠂊𝕥🔍\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| /* Byte */ |
| START_TEST(UA_Byte_Max_Number_json_encode) { |
| |
| UA_Byte *src = UA_Byte_new(); |
| *src = 255; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTE]; |
| |
| UA_ByteString buf; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "255"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Byte_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Byte_Min_Number_json_encode) { |
| |
| UA_Byte *src = UA_Byte_new(); |
| *src = 0; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTE]; |
| |
| UA_ByteString buf; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "0"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Byte_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Byte_smallbuf_Number_json_encode) { |
| |
| UA_Byte *src = UA_Byte_new(); |
| *src = 255; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTE]; |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, 2); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[2]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Byte_delete(src); |
| } |
| END_TEST |
| |
| /* sByte */ |
| START_TEST(UA_SByte_Max_Number_json_encode) { |
| |
| UA_SByte *src = UA_SByte_new(); |
| *src = 127; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "127"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_SByte_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_SByte_Min_Number_json_encode) { |
| |
| UA_SByte *src = UA_SByte_new(); |
| *src = -128; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "-128"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_SByte_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_SByte_Zero_Number_json_encode) { |
| |
| UA_SByte *src = UA_SByte_new(); |
| *src = 0; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "0"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_SByte_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_SByte_smallbuf_Number_json_encode) { |
| |
| UA_SByte *src = UA_SByte_new(); |
| *src = 127; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE]; |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, 2); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[2]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_SByte_delete(src); |
| } |
| END_TEST |
| |
| |
| /* UInt16 */ |
| START_TEST(UA_UInt16_Max_Number_json_encode) { |
| |
| UA_UInt16 *src = UA_UInt16_new(); |
| *src = 65535; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT16]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "65535"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_UInt16_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_UInt16_Min_Number_json_encode) { |
| |
| UA_UInt16 *src = UA_UInt16_new(); |
| *src = 0; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT16]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "0"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_UInt16_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_UInt16_smallbuf_Number_json_encode) { |
| |
| UA_UInt16 *src = UA_UInt16_new(); |
| *src = 255; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT16]; |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, 2); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[2]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_UInt16_delete(src); |
| } |
| END_TEST |
| |
| /* Int16 */ |
| START_TEST(UA_Int16_Max_Number_json_encode) { |
| |
| UA_Int16 *src = UA_Int16_new(); |
| *src = 32767; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "32767"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Int16_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int16_Min_Number_json_encode) { |
| |
| UA_Int16 *src = UA_Int16_new(); |
| *src = -32768; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "-32768"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Int16_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int16_Zero_Number_json_encode) { |
| |
| UA_Int16 *src = UA_Int16_new(); |
| *src = 0; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "0"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Int16_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int16_smallbuf_Number_json_encode) { |
| |
| UA_Int16 *src = UA_Int16_new(); |
| *src = 127; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16]; |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, 2); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[2]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Int16_delete(src); |
| } |
| END_TEST |
| |
| |
| |
| /* UInt32 */ |
| START_TEST(UA_UInt32_Max_Number_json_encode) { |
| |
| UA_UInt32 *src = UA_UInt32_new(); |
| *src = 4294967295; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT32]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "4294967295"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_UInt32_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_UInt32_Min_Number_json_encode) { |
| |
| UA_UInt32 *src = UA_UInt32_new(); |
| *src = 0; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT32]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "0"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_UInt32_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_UInt32_smallbuf_Number_json_encode) { |
| |
| UA_UInt32 *src = UA_UInt32_new(); |
| *src = 255; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT32]; |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, 2); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[2]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_UInt32_delete(src); |
| } |
| END_TEST |
| |
| |
| |
| /* Int32 */ |
| START_TEST(UA_Int32_Max_Number_json_encode) { |
| |
| UA_Int32 *src = UA_Int32_new(); |
| *src = 2147483647; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "2147483647"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Int32_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int32_Min_Number_json_encode) { |
| UA_Int32 src = -2147483648; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32]; |
| size_t size = UA_calcSizeJson((void *)&src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *)&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "-2147483648"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int32_Zero_Number_json_encode) { |
| |
| UA_Int32 *src = UA_Int32_new(); |
| *src = 0; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "0"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Int32_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int32_smallbuf_Number_json_encode) { |
| |
| UA_Int32 *src = UA_Int32_new(); |
| *src = 127; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32]; |
| |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, 2); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[2]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Int32_delete(src); |
| } |
| END_TEST |
| |
| |
| |
| /* UINT64*/ |
| START_TEST(UA_UInt64_Max_Number_json_encode) { |
| |
| UA_UInt64 *src = UA_UInt64_new(); |
| //*src = 18446744073709551615; |
| ((u8*)src)[0] = 0xFF; |
| ((u8*)src)[1] = 0xFF; |
| ((u8*)src)[2] = 0xFF; |
| ((u8*)src)[3] = 0xFF; |
| ((u8*)src)[4] = 0xFF; |
| ((u8*)src)[5] = 0xFF; |
| ((u8*)src)[6] = 0xFF; |
| ((u8*)src)[7] = 0xFF; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT64]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"18446744073709551615\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_UInt64_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_UInt64_Min_Number_json_encode) { |
| |
| UA_UInt64 *src = UA_UInt64_new(); |
| *src = 0; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT64]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"0\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_UInt64_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_UInt64_smallbuf_Number_json_encode) { |
| |
| UA_UInt64 *src = UA_UInt64_new(); |
| //*src = -9223372036854775808; |
| ((u8*)src)[0] = 0x00; |
| ((u8*)src)[1] = 0x00; |
| ((u8*)src)[2] = 0x00; |
| ((u8*)src)[3] = 0x00; |
| ((u8*)src)[4] = 0x00; |
| ((u8*)src)[5] = 0x00; |
| ((u8*)src)[6] = 0x00; |
| ((u8*)src)[7] = 0x80; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT64]; |
| |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, 2); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[2]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_UInt64_delete(src); |
| } |
| END_TEST |
| |
| /* Int64 */ |
| START_TEST(UA_Int64_Max_Number_json_encode) { |
| |
| UA_Int64 *src = UA_Int64_new(); |
| //*src = 9223372036854775808; |
| ((u8*)src)[0] = 0xFF; |
| ((u8*)src)[1] = 0xFF; |
| ((u8*)src)[2] = 0xFF; |
| ((u8*)src)[3] = 0xFF; |
| ((u8*)src)[4] = 0xFF; |
| ((u8*)src)[5] = 0xFF; |
| ((u8*)src)[6] = 0xFF; |
| ((u8*)src)[7] = 0x7F; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"9223372036854775807\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Int64_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int64_Min_Number_json_encode) { |
| |
| UA_Int64 *src = UA_Int64_new(); |
| |
| // TODO: compiler error: integer constant is so large that it is unsigned [-Werror] |
| //*src = -9223372036854775808; |
| |
| ((u8*)src)[0] = 0x00; |
| ((u8*)src)[1] = 0x00; |
| ((u8*)src)[2] = 0x00; |
| ((u8*)src)[3] = 0x00; |
| ((u8*)src)[4] = 0x00; |
| ((u8*)src)[5] = 0x00; |
| ((u8*)src)[6] = 0x00; |
| ((u8*)src)[7] = 0x80; |
| |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"-9223372036854775808\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Int64_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int64_Zero_Number_json_encode) { |
| |
| UA_Int64 *src = UA_Int64_new(); |
| *src = 0; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"0\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Int64_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int64_smallbuf_Number_json_encode) { |
| |
| UA_Int64 *src = UA_Int64_new(); |
| *src = 127; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64]; |
| |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, 2); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[2]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Int64_delete(src); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Double_json_encode) { |
| UA_Double src = 1.1234; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "1.1233999999999999541699935434735380113124847412109375"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_pluszero_json_encode) { |
| UA_Double src = 0; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "0"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_minuszero_json_encode) { |
| UA_Double src = -0; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "0"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_plusInf_json_encode) { |
| UA_Double src = INFINITY; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"Infinity\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| |
| |
| START_TEST(UA_Double_minusInf_json_encode) { |
| UA_Double src = -INFINITY; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"-Infinity\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_nan_json_encode) { |
| UA_Double src = NAN; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"NaN\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_onesmallest_json_encode) { |
| UA_Double src = 1.0000000000000002220446049250313080847263336181640625; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "1.0000000000000002220446049250313080847263336181640625"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_Float_json_encode) { |
| UA_Float src = 1.0000000000F; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_FLOAT]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "1"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| |
| |
| /* -------------------------LocalizedText------------------------- */ |
| START_TEST(UA_LocText_json_encode) { |
| |
| UA_LocalizedText *src = UA_LocalizedText_new(); |
| UA_LocalizedText_init(src); |
| src->locale = UA_STRING_ALLOC("theLocale"); |
| src->text = UA_STRING_ALLOC("theText"); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Locale\":\"theLocale\",\"Text\":\"theText\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_LocalizedText_delete(src); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_LocText_NonReversible_json_encode) { |
| |
| UA_LocalizedText *src = UA_LocalizedText_new(); |
| UA_LocalizedText_init(src); |
| src->locale = UA_STRING_ALLOC("theLocale"); |
| src->text = UA_STRING_ALLOC("theText"); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"theText\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_LocalizedText_delete(src); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_LocText_smallBuffer_json_encode) { |
| UA_LocalizedText *src = UA_LocalizedText_new(); |
| UA_LocalizedText_init(src); |
| src->locale = UA_STRING_ALLOC("theLocale"); |
| src->text = UA_STRING_ALLOC("theText"); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]; |
| |
| UA_ByteString buf; |
| UA_ByteString_allocBuffer(&buf, 4); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[4]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_LocalizedText_delete(src); |
| } |
| END_TEST |
| |
| /* --------------------------------GUID----------------------------------- */ |
| START_TEST(UA_Guid_json_encode) { |
| UA_Guid src = {3, 9, 10, {8, 7, 6, 5, 4, 3, 2, 1}}; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_GUID]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"00000003-0009-000A-0807-060504030201\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| START_TEST(UA_Guid_smallbuf_json_encode) { |
| UA_Guid *src = UA_Guid_new(); |
| *src = UA_Guid_random(); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_GUID]; |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, 1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Guid_delete(src); |
| } |
| END_TEST |
| |
| |
| |
| /* -------------------------DateTime--------------------------------------*/ |
| START_TEST(UA_DateTime_json_encode) { |
| UA_DateTime *src = UA_DateTime_new(); |
| *src = UA_DateTime_fromUnixTime(1234567); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DATETIME]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"1970-01-15T06:56:07Z\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_DateTime_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_DateTime_with_nanoseconds_json_encode) { |
| UA_DateTime *src = UA_DateTime_new(); |
| *src = UA_DateTime_fromUnixTime(1234567) + 8901234; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DATETIME]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"1970-01-15T06:56:07.8901234Z\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_DateTime_delete(src); |
| } |
| END_TEST |
| |
| /* ------------------------Statuscode--------------------------------- */ |
| START_TEST(UA_StatusCode_json_encode) { |
| UA_StatusCode *src = UA_StatusCode_new(); |
| *src = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "2161770496"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_StatusCode_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_StatusCode_nonReversible_json_encode) { |
| UA_StatusCode *src = UA_StatusCode_new(); |
| *src = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Code\":2161770496,\"Symbol\":\"BadAggregateConfigurationRejected\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_StatusCode_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_StatusCode_nonReversible_good_json_encode) { |
| UA_StatusCode *src = UA_StatusCode_new(); |
| *src = UA_STATUSCODE_GOOD; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "null"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_StatusCode_delete(src); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_StatusCode_smallbuf_json_encode) { |
| UA_StatusCode *src = UA_StatusCode_new(); |
| *src = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE]; |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, 1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_StatusCode_delete(src); |
| } |
| END_TEST |
| |
| |
| /* -------------------------------NodeId--------------------------------*/ |
| |
| /* Numeric */ |
| START_TEST(UA_NodeId_Numeric_json_encode) { |
| UA_NodeId *src = UA_NodeId_new(); |
| *src = UA_NODEID_NUMERIC(0, 5555); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Id\":5555}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_NodeId_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_NodeId_Numeric_Namespace_json_encode) { |
| UA_NodeId *src = UA_NodeId_new(); |
| *src = UA_NODEID_NUMERIC(4, 5555); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Id\":5555,\"Namespace\":4}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_NodeId_delete(src); |
| } |
| END_TEST |
| |
| /* String */ |
| START_TEST(UA_NodeId_String_json_encode) { |
| UA_NodeId *src = UA_NodeId_new(); |
| *src = UA_NODEID_STRING_ALLOC(0, "foobar"); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"IdType\":1,\"Id\":\"foobar\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_NodeId_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_NodeId_String_Namespace_json_encode) { |
| UA_NodeId *src = UA_NodeId_new(); |
| *src = UA_NODEID_STRING_ALLOC(5, "foobar"); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"IdType\":1,\"Id\":\"foobar\",\"Namespace\":5}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_NodeId_delete(src); |
| } |
| END_TEST |
| |
| /* Guid */ |
| START_TEST(UA_NodeId_Guid_json_encode) { |
| UA_NodeId *src = UA_NodeId_new(); |
| UA_NodeId_init(src); |
| UA_Guid g = {3, 9, 10, {8, 7, 6, 5, 4, 3, 2, 1}}; |
| *src = UA_NODEID_GUID(0, g); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"IdType\":2,\"Id\":\"00000003-0009-000A-0807-060504030201\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_NodeId_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_NodeId_Guid_Namespace_json_encode) { |
| UA_NodeId *src = UA_NodeId_new(); |
| UA_Guid g = {3, 9, 10, {8, 7, 6, 5, 4, 3, 2, 1}}; |
| *src = UA_NODEID_GUID(5, g); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| // {"IdType":2,"Id":"00000003-0009-000A-0807-060504030201","Namespace":5} |
| ck_assert_int_eq(size, 70); |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"IdType\":2,\"Id\":\"00000003-0009-000A-0807-060504030201\",\"Namespace\":5}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_NodeId_delete(src); |
| } |
| END_TEST |
| |
| /* ByteString */ |
| START_TEST(UA_NodeId_ByteString_json_encode) { |
| UA_NodeId *src = UA_NodeId_new(); |
| *src = UA_NODEID_BYTESTRING_ALLOC(0, "asdfasdf"); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| //{"IdType":3,"Id":"YXNkZmFzZGY="} |
| ck_assert_int_eq(size, 32); |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_NodeId_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_NodeId_ByteString_Namespace_json_encode) { |
| UA_NodeId *src = UA_NodeId_new(); |
| *src = UA_NODEID_BYTESTRING_ALLOC(5, "asdfasdf"); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\",\"Namespace\":5}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_NodeId_delete(src); |
| } |
| END_TEST |
| |
| /* Non-reversible, Namespace */ |
| START_TEST(UA_NodeId_NonReversible_Numeric_Namespace_json_encode) { |
| UA_NodeId *src = UA_NodeId_new(); |
| *src = UA_NODEID_NUMERIC(2, 5555); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID]; |
| |
| UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")}; |
| size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, NULL, 0, UA_FALSE); |
| ck_assert_int_ne(size, 0); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Id\":5555,\"Namespace\":\"ns2\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_NodeId_delete(src); |
| } |
| END_TEST |
| |
| /* --------------------Diagnostic Info------------------------- */ |
| START_TEST(UA_DiagInfo_json_encode) { |
| UA_DiagnosticInfo *src = UA_DiagnosticInfo_new(); |
| UA_DiagnosticInfo_init(src); |
| src->hasAdditionalInfo = UA_TRUE; |
| src->hasInnerDiagnosticInfo = UA_FALSE; |
| src->hasInnerStatusCode = UA_TRUE; |
| src->hasLocale = UA_TRUE; |
| src->hasSymbolicId = UA_TRUE; |
| src->hasLocalizedText = UA_TRUE; |
| src->hasNamespaceUri = UA_TRUE; |
| |
| UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING; |
| src->additionalInfo = UA_STRING_ALLOC("additionalInfo"); |
| src->innerStatusCode = statusCode; |
| src->locale = 12; |
| src->symbolicId = 13; |
| src->localizedText = 14; |
| src->namespaceUri = 15; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]; |
| |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"SymbolicId\":13,\"NamespaceUri\":15,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_DiagnosticInfo_delete(src); |
| } |
| END_TEST |
| |
| |
| |
| START_TEST(UA_DiagInfo_withInner_json_encode) { |
| UA_DiagnosticInfo *innerDiag = UA_DiagnosticInfo_new(); |
| UA_DiagnosticInfo_init(innerDiag); |
| innerDiag->hasAdditionalInfo = UA_TRUE; |
| innerDiag->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO"); |
| innerDiag->hasInnerDiagnosticInfo = UA_FALSE; |
| innerDiag->hasInnerStatusCode = UA_FALSE; |
| innerDiag->hasLocale = UA_FALSE; |
| innerDiag->hasSymbolicId = UA_FALSE; |
| innerDiag->hasLocalizedText = UA_FALSE; |
| innerDiag->hasNamespaceUri = UA_FALSE; |
| |
| UA_DiagnosticInfo *src = UA_DiagnosticInfo_new(); |
| UA_DiagnosticInfo_init(src); |
| src->hasAdditionalInfo = UA_TRUE; |
| src->hasInnerDiagnosticInfo = UA_TRUE; |
| src->hasInnerStatusCode = UA_TRUE; |
| src->hasLocale = UA_TRUE; |
| src->hasSymbolicId = UA_TRUE; |
| src->hasLocalizedText = UA_TRUE; |
| src->hasNamespaceUri = UA_FALSE; |
| |
| UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING; |
| src->additionalInfo = UA_STRING_ALLOC("additionalInfo"); |
| src->innerDiagnosticInfo = innerDiag; |
| src->innerStatusCode = statusCode; |
| src->locale = 12; |
| src->symbolicId = 13; |
| src->localizedText = 14; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]; |
| |
| |
| UA_ByteString buf; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| //{"SymbolicId":13,"LocalizedText":14,"Locale":12,"AdditionalInfo":"additionalInfo","InnerStatusCode":2155216896,"InnerDiagnosticInfo":{"AdditionalInfo":"INNER ADDITION INFO"}} |
| ck_assert_int_eq(size, 174); |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896,\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\"}}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_DiagnosticInfo_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_DiagInfo_withTwoInner_json_encode) { |
| |
| UA_DiagnosticInfo *innerDiag2 = UA_DiagnosticInfo_new(); |
| UA_DiagnosticInfo_init(innerDiag2); |
| innerDiag2->hasAdditionalInfo = UA_TRUE; |
| innerDiag2->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO2"); |
| innerDiag2->hasInnerDiagnosticInfo = UA_FALSE; |
| innerDiag2->hasInnerStatusCode = UA_FALSE; |
| innerDiag2->hasLocale = UA_FALSE; |
| innerDiag2->hasSymbolicId = UA_FALSE; |
| innerDiag2->hasLocalizedText = UA_FALSE; |
| innerDiag2->hasNamespaceUri = UA_FALSE; |
| |
| UA_DiagnosticInfo *innerDiag = UA_DiagnosticInfo_new(); |
| UA_DiagnosticInfo_init(innerDiag); |
| innerDiag->hasAdditionalInfo = UA_TRUE; |
| innerDiag->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO"); |
| innerDiag->hasInnerDiagnosticInfo = UA_TRUE; |
| innerDiag->innerDiagnosticInfo = innerDiag2; |
| innerDiag->hasInnerStatusCode = UA_FALSE; |
| innerDiag->hasLocale = UA_FALSE; |
| innerDiag->hasSymbolicId = UA_FALSE; |
| innerDiag->hasLocalizedText = UA_FALSE; |
| innerDiag->hasNamespaceUri = UA_FALSE; |
| |
| UA_DiagnosticInfo *src = UA_DiagnosticInfo_new(); |
| UA_DiagnosticInfo_init(src); |
| |
| src->hasAdditionalInfo = UA_TRUE; |
| src->hasInnerDiagnosticInfo = UA_TRUE; |
| src->hasInnerStatusCode = UA_TRUE; |
| src->hasLocale = UA_TRUE; |
| src->hasSymbolicId = UA_TRUE; |
| src->hasLocalizedText = UA_TRUE; |
| src->hasNamespaceUri = UA_FALSE; |
| |
| UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING; |
| src->additionalInfo = UA_STRING_ALLOC("additionalInfo"); |
| src->innerDiagnosticInfo = innerDiag; |
| src->innerStatusCode = statusCode; |
| src->locale = 12; |
| src->symbolicId = 13; |
| src->localizedText = 14; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]; |
| |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896,\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\",\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO2\"}}}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_DiagnosticInfo_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_DiagInfo_noFields_json_encode) { |
| UA_DiagnosticInfo *src = UA_DiagnosticInfo_new(); |
| UA_DiagnosticInfo_init(src); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "null"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_DiagnosticInfo_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_DiagInfo_smallBuffer_json_encode) { |
| UA_DiagnosticInfo *src = UA_DiagnosticInfo_new(); |
| UA_DiagnosticInfo_init(src); |
| src->hasAdditionalInfo = UA_TRUE; |
| src->hasInnerDiagnosticInfo = UA_FALSE; |
| src->hasInnerStatusCode = UA_TRUE; |
| src->hasLocale = UA_TRUE; |
| src->hasSymbolicId = UA_TRUE; |
| src->hasLocalizedText = UA_TRUE; |
| src->hasNamespaceUri = UA_FALSE; |
| |
| UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING; |
| src->additionalInfo = UA_STRING_ALLOC("additionalInfo"); |
| src->innerStatusCode = statusCode; |
| src->locale = 12; |
| src->symbolicId = 13; |
| src->localizedText = 14; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]; |
| |
| |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, 2); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[2]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| UA_ByteString_deleteMembers(&buf); |
| UA_DiagnosticInfo_delete(src); |
| } |
| END_TEST |
| |
| /* ---------------ByteString----------------- */ |
| START_TEST(UA_ByteString_json_encode) { |
| UA_ByteString *src = UA_ByteString_new(); |
| UA_ByteString_init(src); |
| *src = UA_BYTESTRING_ALLOC("asdfasdf"); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTESTRING]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"YXNkZmFzZGY=\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ByteString_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_ByteString2_json_encode) { |
| UA_ByteString *src = UA_ByteString_new(); |
| UA_ByteString_init(src); |
| *src = UA_BYTESTRING_ALLOC("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTESTRING]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| |
| //s = UA_decodeJson() |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "\"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4=\""; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ByteString_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_ByteString3_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_ByteString *variantContent = UA_ByteString_new(); |
| *variantContent = UA_BYTESTRING_ALLOC("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."); |
| UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_BYTESTRING]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| //printf("%s\n\n", (char*)buf.data); |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| |
| UA_ByteString *srcData = ((UA_ByteString*)src->data); |
| UA_ByteString *outData = ((UA_ByteString*)out.data); |
| ck_assert(UA_ByteString_equal(srcData, outData)); |
| |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&out); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| /* ------------------QualifiedName---------------------------- */ |
| START_TEST(UA_QualName_json_encode) { |
| UA_QualifiedName *src = UA_QualifiedName_new(); |
| UA_QualifiedName_init(src); |
| src->name = UA_STRING_ALLOC("derName"); |
| src->namespaceIndex = 1; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Name\":\"derName\",\"Uri\":1}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_QualifiedName_delete(src); |
| } |
| END_TEST |
| |
| |
| |
| START_TEST(UA_QualName_NonReversible_json_encode) { |
| UA_QualifiedName *src = UA_QualifiedName_new(); |
| UA_QualifiedName_init(src); |
| src->name = UA_STRING_ALLOC("derName"); |
| src->namespaceIndex = 1; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Name\":\"derName\",\"Uri\":1}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_QualifiedName_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_QualName_NonReversible_Namespace_json_encode) { |
| UA_QualifiedName *src = UA_QualifiedName_new(); |
| UA_QualifiedName_init(src); |
| src->name = UA_STRING_ALLOC("derName"); |
| src->namespaceIndex = 2; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME]; |
| UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")}; |
| size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Name\":\"derName\",\"Uri\":\"ns2\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_QualifiedName_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_QualName_NonReversible_NoNamespaceAsNumber_json_encode) { |
| UA_QualifiedName *src = UA_QualifiedName_new(); |
| UA_QualifiedName_init(src); |
| src->name = UA_STRING_ALLOC("derName"); |
| src->namespaceIndex = 6789; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Name\":\"derName\",\"Uri\":6789}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_QualifiedName_delete(src); |
| } |
| END_TEST |
| |
| /* ----------------------------Variant------------------------ */ |
| |
| /* -----Builtin scalar----- */ |
| START_TEST(UA_Variant_Bool_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| |
| UA_Boolean *variantContent = UA_Boolean_new(); |
| *variantContent = true; |
| UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Type\":1,\"Body\":true}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Number_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_UInt64 *variantContent = UA_UInt64_new(); |
| *variantContent = 345634563456; |
| UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_UINT64]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Type\":9,\"Body\":\"345634563456\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Double_json_encode) { |
| /* Encode decode cyle of 100 Doubles */ |
| UA_Double d = 0.0; |
| for(size_t i = 0; i < 100; i++){ |
| d = nextafter(d,1); |
| |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_Double *variantContent = UA_Double_new(); |
| //*variantContent = 1.0000000000000002; |
| *variantContent = d; |
| UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| //printf("%s\n\n", (char*)buf.data); |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| |
| UA_Double srcData = *((UA_Double*)src->data); |
| UA_Double outData = *((UA_Double*)out.data); |
| ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0); |
| |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&out); |
| UA_Variant_delete(src); |
| } |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Double2_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_Double *variantContent = UA_Double_new(); |
| *variantContent = (pow(2,53)-1)*pow(2,-1074); |
| UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| //printf("%s\n\n", (char*)buf.data); |
| /*{"Type":11,"Body":4.4501477170144022721148195934182639518696390927032912960468522194496444440421538910330590478162701758282983178260792422137401728773891892910553144148156412434867599762821265346585071045737627442980259622449029037796981144446145705102663115100318287949527959668236039986479250965780342141637013812613333119898765515451440315261253813266652951306000184917766328660755595837392240989947807556594098101021612198814605258742579179000071675999344145086087205681577915435923018910334964869420614052182892431445797605163650903606514140377217442262561590244668525767372446430075513332450079650686719491377688478005309963967709758965844137894433796621993967316936280457084866613206797017728916080020698679408551343728867675409720757232455434770912461317493580281734466552734375e-308}*/ |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| |
| UA_Double srcData = *((UA_Double*)src->data); |
| UA_Double outData = *((UA_Double*)out.data); |
| ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0); |
| |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&out); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Variant_Double3_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_Double *variantContent = UA_Double_new(); |
| *variantContent = 1.1234; |
| UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| |
| UA_Double srcData = *((UA_Double*)src->data); |
| UA_Double outData = *((UA_Double*)out.data); |
| ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0); |
| |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&out); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_DoubleInf_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_Double *variantContent = UA_Double_new(); |
| *variantContent = (UA_Double)INFINITY; |
| UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| //printf("%s\n\n", (char*)buf.data); |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| |
| UA_Double srcData = *((UA_Double*)src->data); |
| UA_Double outData = *((UA_Double*)out.data); |
| ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0); |
| |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&out); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_DoubleNan_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_Double *variantContent = UA_Double_new(); |
| *variantContent = (UA_Double)NAN; |
| UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| //printf("%s\n\n", (char*)buf.data); |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| |
| UA_Double srcData = *((UA_Double*)src->data); |
| UA_Double outData = *((UA_Double*)out.data); |
| ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0); |
| |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&out); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Float_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_Float *variantContent = UA_Float_new(); |
| *variantContent = (UA_Float)((pow(2,23)-1)/pow(2,149)); |
| UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_FLOAT]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| |
| UA_Float srcData = *((UA_Float*)src->data); |
| UA_Float outData = *((UA_Float*)out.data); |
| ck_assert(memcmp(&srcData, &outData, sizeof(UA_Float)) == 0); |
| |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&out); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Variant_NodeId_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_NodeId variantContent = UA_NODEID_STRING(1, "theID"); |
| UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_NODEID]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Type\":17,\"Body\":{\"IdType\":1,\"Id\":\"theID\",\"Namespace\":1}}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_LocText_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_LocalizedText variantContent; |
| variantContent.locale = UA_STRING("localeString"); |
| variantContent.text = UA_STRING("textString"); |
| UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Type\":21,\"Body\":{\"Locale\":\"localeString\",\"Text\":\"textString\"}}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_QualName_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_QualifiedName variantContent; |
| UA_QualifiedName_init(&variantContent); |
| variantContent.name = UA_STRING("derName"); |
| variantContent.namespaceIndex = 1; |
| |
| UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Type\":20,\"Body\":{\"Name\":\"derName\",\"Uri\":1}}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| |
| /* ---Reversible Variant Array---- */ |
| START_TEST(UA_Variant_Array_UInt16_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_UInt16 zero[2] = {42,43}; |
| UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_UINT16]); |
| |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| ck_assert_int_eq(size, 25); |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Type\":5,\"Body\":[42,43]}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Array_Byte_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_Byte zero[2] = {42,43}; |
| UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_BYTE]); |
| |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Type\":3,\"Body\":[42,43]}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Array_String_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_String zero[2] = {UA_STRING("eins"),UA_STRING("zwei")}; |
| UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_STRING]); |
| |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Type\":12,\"Body\":[\"eins\",\"zwei\"]}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Matrix_UInt16_json_encode) { |
| |
| // Set an array value |
| UA_Variant src; |
| UA_Variant_init(&src); |
| UA_UInt16 d[9] = {1, 2, 3, |
| 4, 5, 6, |
| 7, 8, 9}; |
| UA_Variant_setArrayCopy(&src, d, 9, &UA_TYPES[UA_TYPES_UINT16]); |
| |
| //Set array dimensions |
| src.arrayDimensions = (UA_UInt32 *)UA_Array_new(2, &UA_TYPES[UA_TYPES_UINT32]); |
| src.arrayDimensionsSize = 2; |
| src.arrayDimensions[0] = 3; |
| src.arrayDimensions[1] = 3; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| //{"Type":5,"Body":[1,2,3,4,5,6,7,8,9],"Dimension":[3,3]} |
| size_t sizeOfBytes = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| ck_assert_int_eq(sizeOfBytes, 55); |
| |
| status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Type\":5,\"Body\":[1,2,3,4,5,6,7,8,9],\"Dimension\":[3,3]}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&src); |
| } |
| END_TEST |
| |
| |
| /* NON-Reversible builtin simple */ |
| START_TEST(UA_Variant_StatusCode_NonReversible_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_StatusCode variantContent = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED; |
| UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_STATUSCODE]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Body\":{\"Code\":2161770496,\"Symbol\":\"BadAggregateConfigurationRejected\"}}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| |
| /* NON-Reversible Array */ |
| START_TEST(UA_Variant_Array_String_NonReversible_json_encode) { |
| UA_Variant src; |
| UA_Variant_init(&src); |
| UA_String d[8] = {UA_STRING("1"), UA_STRING("2"), UA_STRING("3"), |
| UA_STRING("4"), UA_STRING("5"), UA_STRING("6"), |
| UA_STRING("7"), UA_STRING("8")}; |
| UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_STRING]); |
| |
| src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]); |
| src.arrayDimensionsSize = 1; |
| src.arrayDimensions[0] = 8; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"]}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&src); |
| } |
| END_TEST |
| |
| /* NON-Reversible Matrix */ |
| START_TEST(UA_Variant_Matrix_String_NonReversible_json_encode) { |
| UA_Variant src; |
| UA_Variant_init(&src); |
| UA_String d[8] = {UA_STRING("1"), UA_STRING("2"), UA_STRING("3"), |
| UA_STRING("4"), UA_STRING("5"), UA_STRING("6"), |
| UA_STRING("7"), UA_STRING("8")}; |
| UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_STRING]); |
| |
| src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]); |
| src.arrayDimensionsSize = 4; |
| src.arrayDimensions[0] = 2; |
| src.arrayDimensions[1] = 2; |
| src.arrayDimensions[2] = 2; |
| src.arrayDimensions[3] = 1; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| //{"Body":[[[["1"],["2"]],[["3"],["4"]]],[[["5"],["6"]],[["7"],["8"]]]]} |
| size_t sizeOfBytes = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE); |
| ck_assert_int_eq(sizeOfBytes, 70); |
| |
| status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Body\":[[[[\"1\"],[\"2\"]],[[\"3\"],[\"4\"]]],[[[\"5\"],[\"6\"]],[[\"7\"],[\"8\"]]]]}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Matrix_NodeId_NonReversible_json_encode) { |
| UA_Variant src; |
| UA_Variant_init(&src); |
| UA_NodeId d[8] = {UA_NODEID_NUMERIC(1,1),UA_NODEID_NUMERIC(1,2),UA_NODEID_NUMERIC(1,3),UA_NODEID_NUMERIC(1,4),UA_NODEID_NUMERIC(1,5),UA_NODEID_NUMERIC(1,6),UA_NODEID_NUMERIC(1,7),UA_NODEID_NUMERIC(1,8)}; |
| UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_NODEID]); |
| |
| src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]); |
| src.arrayDimensionsSize = 4; |
| src.arrayDimensions[0] = 2; |
| src.arrayDimensions[1] = 2; |
| src.arrayDimensions[2] = 2; |
| src.arrayDimensions[3] = 1; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Body\":[[[[{\"Id\":1,\"Namespace\":1}],[{\"Id\":2,\"Namespace\":1}]],[[{\"Id\":3,\"Namespace\":1}],[{\"Id\":4,\"Namespace\":1}]]],[[[{\"Id\":5,\"Namespace\":1}],[{\"Id\":6,\"Namespace\":1}]],[[{\"Id\":7,\"Namespace\":1}],[{\"Id\":8,\"Namespace\":1}]]]]}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&src); |
| } |
| END_TEST |
| |
| |
| |
| START_TEST(UA_Variant_Wrap_json_encode) { |
| UA_Variant *src = UA_Variant_new(); |
| UA_Variant_init(src); |
| UA_ViewDescription variantContent; |
| UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567); |
| variantContent.timestamp = srvts; |
| variantContent.viewVersion = 1236; |
| variantContent.viewId = UA_NODEID_NUMERIC(0,99999); |
| |
| UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Type\":22,\"Body\":{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1236}}}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Wrap_Array_json_encode) { |
| UA_Variant src; |
| UA_Variant_init(&src); |
| //src.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]); |
| //src.arrayDimensionsSize = 1; |
| //src.arrayDimensions[0] = 2; |
| |
| UA_ViewDescription variantContent1; |
| UA_DateTime srvts1 = UA_DateTime_fromUnixTime(1234567); |
| variantContent1.timestamp = srvts1; |
| variantContent1.viewVersion = 1; |
| variantContent1.viewId = UA_NODEID_NUMERIC(0,1); |
| |
| UA_ViewDescription variantContent2; |
| UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567); |
| variantContent2.timestamp = srvts2; |
| variantContent2.viewVersion = 2; |
| variantContent2.viewId = UA_NODEID_NUMERIC(0,2); |
| |
| |
| UA_ViewDescription d[2] = {variantContent1, variantContent2}; |
| UA_Variant_setArrayCopy(&src, d, 2, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); |
| |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Type\":22,\"Body\":[{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":1},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1}},{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":2},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":2}}]}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&src); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Wrap_Array_NonReversible_json_encode) { |
| UA_Variant src; |
| UA_Variant_init(&src); |
| //src.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]); |
| //src.arrayDimensionsSize = 1; |
| //src.arrayDimensions[0] = 2; |
| |
| UA_ViewDescription variantContent1; |
| UA_DateTime srvts1 = UA_DateTime_fromUnixTime(1234567); |
| variantContent1.timestamp = srvts1; |
| variantContent1.viewVersion = 1; |
| variantContent1.viewId = UA_NODEID_NUMERIC(1,1); |
| |
| UA_ViewDescription variantContent2; |
| UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567); |
| variantContent2.timestamp = srvts2; |
| variantContent2.viewVersion = 2; |
| variantContent2.viewId = UA_NODEID_NUMERIC(1,2); |
| |
| |
| UA_ViewDescription d[2] = {variantContent1, variantContent2}; |
| UA_Variant_setArrayCopy(&src, d, 2, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); |
| |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Body\":[{\"Body\":{\"ViewId\":{\"Id\":1,\"Namespace\":1},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1}},{\"Body\":{\"ViewId\":{\"Id\":2,\"Namespace\":1},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":2}}]}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_Variant_deleteMembers(&src); |
| } |
| END_TEST |
| |
| /* -----------ExtensionObject------------------*/ |
| START_TEST(UA_ExtensionObject_json_encode) { |
| UA_ExtensionObject *src = UA_ExtensionObject_new(); |
| UA_ExtensionObject_init(src); |
| src->encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; |
| src->content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN]; |
| |
| UA_Boolean b = UA_FALSE; |
| src->content.decoded.data = &b; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"TypeId\":{\"Id\":1},\"Body\":false}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ExtensionObject_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_ExtensionObject_xml_json_encode) { |
| UA_ExtensionObject *src = UA_ExtensionObject_new(); |
| UA_ExtensionObject_init(src); |
| src->encoding = UA_EXTENSIONOBJECT_ENCODED_XML; |
| src->content.encoded.typeId = UA_NODEID_NUMERIC(2,1234); |
| |
| UA_ByteString b = UA_BYTESTRING_ALLOC("<Elemement></Element>"); |
| src->content.encoded.body = b; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"TypeId\":{\"Id\":1234,\"Namespace\":2},\"Encoding\":2,\"Body\":\"<Elemement></Element>\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ExtensionObject_delete(src); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_ExtensionObject_byteString_json_encode) { |
| UA_ExtensionObject *src = UA_ExtensionObject_new(); |
| UA_ExtensionObject_init(src); |
| src->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING; |
| src->content.encoded.typeId = UA_NODEID_NUMERIC(2,1234); |
| |
| UA_ByteString b = UA_BYTESTRING_ALLOC("123456789012345678901234567890"); |
| src->content.encoded.body = b; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"TypeId\":{\"Id\":1234,\"Namespace\":2},\"Encoding\":1,\"Body\":\"123456789012345678901234567890\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ExtensionObject_delete(src); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_ExtensionObject_NonReversible_StatusCode_json_encode) { |
| UA_ExtensionObject *src = UA_ExtensionObject_new(); |
| UA_ExtensionObject_init(src); |
| src->encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; |
| src->content.decoded.type = &UA_TYPES[UA_TYPES_STATUSCODE]; |
| |
| UA_StatusCode b = UA_STATUSCODE_BADENCODINGERROR; |
| src->content.decoded.data = &b; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Body\":{\"Code\":2147876864,\"Symbol\":\"BadEncodingError\"}}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ExtensionObject_delete(src); |
| } |
| END_TEST |
| |
| |
| |
| /* --------------ExpandedNodeId-------------------------- */ |
| START_TEST(UA_ExpandedNodeId_json_encode) { |
| UA_ExpandedNodeId *src = UA_ExpandedNodeId_new(); |
| UA_ExpandedNodeId_init(src); |
| *src = UA_EXPANDEDNODEID_STRING_ALLOC(23, "testtestTest"); |
| src->namespaceUri = UA_STRING_ALLOC("asdf"); |
| src->serverIndex = 1345; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"asdf\",\"ServerUri\":1345}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ExpandedNodeId_delete(src); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_ExpandedNodeId_MissingNamespaceUri_json_encode) { |
| UA_ExpandedNodeId *src = UA_ExpandedNodeId_new(); |
| UA_ExpandedNodeId_init(src); |
| *src = UA_EXPANDEDNODEID_STRING_ALLOC(23, "testtestTest"); |
| src->namespaceUri = UA_STRING_NULL; |
| src->serverIndex = 1345; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":23,\"ServerUri\":1345}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ExpandedNodeId_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_ExpandedNodeId_NonReversible_Ns1_json_encode) { |
| UA_ExpandedNodeId *src = UA_ExpandedNodeId_new(); |
| UA_ExpandedNodeId_init(src); |
| *src = UA_EXPANDEDNODEID_STRING_ALLOC(1, "testtestTest"); |
| src->namespaceUri = UA_STRING_NULL; |
| src->serverIndex = 1; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID]; |
| |
| UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")}; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, serverUris, 3, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, serverUris, 3, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":1,\"ServerUri\":\"uri1\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ExpandedNodeId_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_ExpandedNodeId_NonReversible_Namespace_json_encode) { |
| UA_ExpandedNodeId *src = UA_ExpandedNodeId_new(); |
| UA_ExpandedNodeId_init(src); |
| *src = UA_EXPANDEDNODEID_STRING_ALLOC(2, "testtestTest"); |
| src->namespaceUri = UA_STRING_NULL; |
| src->serverIndex = 1; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID]; |
| |
| UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")}; |
| UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")}; |
| |
| size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, serverUris, 3, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, serverUris, 3, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"ns2\",\"ServerUri\":\"uri1\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ExpandedNodeId_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_ExpandedNodeId_NonReversible_NamespaceUriGiven_json_encode) { |
| UA_ExpandedNodeId *src = UA_ExpandedNodeId_new(); |
| UA_ExpandedNodeId_init(src); |
| *src = UA_EXPANDEDNODEID_STRING_ALLOC(2, "testtestTest"); |
| src->namespaceUri = UA_STRING_ALLOC("NamespaceUri"); |
| src->serverIndex = 1; |
| |
| UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")}; |
| UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")}; |
| |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID]; |
| size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, serverUris, 3, UA_FALSE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, serverUris, 3, UA_FALSE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"NamespaceUri\",\"ServerUri\":\"uri1\"}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ExpandedNodeId_delete(src); |
| } |
| END_TEST |
| |
| /* -------------------------DataValue------------------------ */ |
| START_TEST(UA_DataValue_json_encode) { |
| UA_DataValue *src = UA_DataValue_new(); |
| UA_DataValue_init(src); |
| src->hasServerPicoseconds = UA_TRUE; |
| src->hasServerTimestamp = UA_TRUE; |
| src->hasSourcePicoseconds = UA_TRUE; |
| src->hasSourceTimestamp = UA_TRUE; |
| src->hasStatus = UA_TRUE; |
| src->hasValue = UA_TRUE; |
| |
| UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567) + 8901234; |
| UA_DateTime srvts = UA_DateTime_fromUnixTime(2345678) + 9012345; |
| |
| src->sourceTimestamp = srcts; |
| src->serverTimestamp = srvts; |
| src->sourcePicoseconds = 5678; |
| src->serverPicoseconds = 6789; |
| |
| UA_Variant variant; |
| UA_Variant_init(&variant); |
| UA_Boolean variantContent = true; |
| UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]); |
| src->value = variant; |
| |
| src->status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID; |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DATAVALUE]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07.8901234Z\",\"SourcePicoseconds\":5678,\"ServerTimestamp\":\"1970-01-28T03:34:38.9012345Z\",\"ServerPicoseconds\":6789}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_DataValue_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_DataValue_null_json_encode) { |
| UA_DataValue *src = UA_DataValue_new(); |
| UA_DataValue_init(src); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_DATAVALUE]; |
| size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "null"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_DataValue_delete(src); |
| } |
| END_TEST |
| |
| START_TEST(UA_MessageReadResponse_json_encode) { |
| UA_ReadResponse src; |
| UA_ReadResponse_init(&src); |
| UA_DiagnosticInfo innerDiag; |
| innerDiag.hasAdditionalInfo = UA_TRUE; |
| innerDiag.additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO"); |
| innerDiag.hasInnerDiagnosticInfo = UA_FALSE; |
| innerDiag.hasInnerStatusCode = UA_FALSE; |
| innerDiag.hasLocale = UA_FALSE; |
| innerDiag.hasSymbolicId = UA_FALSE; |
| innerDiag.hasLocalizedText = UA_FALSE; |
| innerDiag.hasNamespaceUri = UA_FALSE; |
| |
| UA_DiagnosticInfo *info = (UA_DiagnosticInfo*)UA_calloc(1, sizeof(UA_DiagnosticInfo)); |
| info[0] = innerDiag; |
| src.diagnosticInfos = info; |
| src.diagnosticInfosSize = 1; |
| |
| UA_DataValue dv; |
| UA_DataValue_init(&dv); |
| dv.hasServerPicoseconds = UA_TRUE; |
| dv.hasServerTimestamp = UA_TRUE; |
| dv.hasSourcePicoseconds = UA_TRUE; |
| dv.hasSourceTimestamp = UA_TRUE; |
| dv.hasStatus = UA_TRUE; |
| dv.hasValue = UA_TRUE; |
| |
| UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567); |
| UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567); |
| |
| dv.sourceTimestamp = srcts; |
| dv.serverTimestamp = srvts; |
| dv.sourcePicoseconds = 0; |
| dv.serverPicoseconds = 0; |
| |
| |
| UA_Variant variant; |
| UA_Variant_init(&variant); |
| UA_Boolean variantContent = true; |
| UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]); |
| dv.value = variant; |
| |
| dv.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID; |
| |
| UA_DataValue *values = (UA_DataValue*)UA_calloc(1, sizeof(UA_DataValue)); |
| values[0] = dv; |
| src.results = values; |
| src.resultsSize = 1; |
| |
| |
| UA_ResponseHeader rh; |
| UA_ResponseHeader_init(&rh); |
| rh.stringTableSize = 0; |
| rh.requestHandle = 123123; |
| rh.serviceResult = UA_STATUSCODE_GOOD; |
| rh.timestamp = UA_DateTime_fromUnixTime(1234567); |
| |
| |
| UA_DiagnosticInfo serverDiag; |
| UA_DiagnosticInfo_init(&serverDiag); |
| serverDiag.hasAdditionalInfo = UA_TRUE; |
| serverDiag.additionalInfo = UA_STRING_ALLOC("serverDiag"); |
| serverDiag.hasInnerDiagnosticInfo = UA_FALSE; |
| serverDiag.hasInnerStatusCode = UA_FALSE; |
| serverDiag.hasLocale = UA_FALSE; |
| serverDiag.hasSymbolicId = UA_FALSE; |
| serverDiag.hasLocalizedText = UA_FALSE; |
| serverDiag.hasNamespaceUri = UA_FALSE; |
| rh.serviceDiagnostics = serverDiag; |
| |
| |
| UA_ExtensionObject e; |
| UA_ExtensionObject_init(&e); |
| e.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; |
| e.content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN]; |
| |
| UA_Boolean b = UA_FALSE; |
| e.content.decoded.data = &b; |
| |
| rh.additionalHeader = e; |
| |
| src.responseHeader = rh; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_READRESPONSE]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"ResponseHeader\":{\"Timestamp\":\"1970-01-15T06:56:07Z\",\"RequestHandle\":123123,\"ServiceResult\":0,\"ServiceDiagnostics\":{\"AdditionalInfo\":\"serverDiag\"},\"StringTable\":[],\"AdditionalHeader\":{\"TypeId\":{\"Id\":1},\"Body\":false}},\"Results\":[{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerTimestamp\":\"1970-01-15T06:56:07Z\"}],\"DiagnosticInfos\":[{\"AdditionalInfo\":\"INNER ADDITION INFO\"}]}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ReadResponse_deleteMembers(&src); //TODO |
| } |
| END_TEST |
| |
| START_TEST(UA_ViewDescription_json_encode) { |
| UA_ViewDescription src; |
| UA_ViewDescription_init(&src); |
| UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567); |
| src.timestamp = srvts; |
| src.viewVersion = 1236; |
| src.viewId = UA_NODEID_NUMERIC(0,99999); |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1236}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_ViewDescription_deleteMembers(&src); |
| } |
| END_TEST |
| |
| START_TEST(UA_WriteRequest_json_encode) { |
| UA_WriteRequest src; |
| UA_WriteRequest_init(&src); |
| |
| UA_RequestHeader rh; |
| rh.returnDiagnostics = 1; |
| rh.auditEntryId = UA_STRING_ALLOC("Auditentryid"); |
| rh.requestHandle = 123123; |
| rh.authenticationToken = UA_NODEID_STRING_ALLOC(0,"authToken"); |
| rh.timestamp = UA_DateTime_fromUnixTime(1234567); |
| rh.timeoutHint = 120; |
| |
| UA_ExtensionObject e; |
| UA_ExtensionObject_init(&e); |
| e.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE; |
| e.content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN]; |
| |
| UA_Boolean b = UA_FALSE; |
| e.content.decoded.data = &b; |
| |
| rh.additionalHeader = e; |
| |
| |
| |
| UA_DataValue dv; |
| UA_DataValue_init(&dv); |
| dv.hasServerPicoseconds = UA_TRUE; |
| dv.hasServerTimestamp = UA_TRUE; |
| dv.hasSourcePicoseconds = UA_TRUE; |
| dv.hasSourceTimestamp = UA_TRUE; |
| dv.hasStatus = UA_TRUE; |
| dv.hasValue = UA_TRUE; |
| |
| UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567); |
| UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567); |
| |
| dv.sourceTimestamp = srcts; |
| dv.serverTimestamp = srvts; |
| dv.sourcePicoseconds = 0; |
| dv.serverPicoseconds = 0; |
| |
| UA_Variant variant; |
| UA_Variant_init(&variant); |
| UA_Boolean variantContent = true; |
| UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]); |
| dv.value = variant; |
| |
| dv.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID; |
| |
| UA_DataValue dv2; |
| UA_DataValue_init(&dv2); |
| dv2.hasServerPicoseconds = UA_TRUE; |
| dv2.hasServerTimestamp = UA_TRUE; |
| dv2.hasSourcePicoseconds = UA_TRUE; |
| dv2.hasSourceTimestamp = UA_TRUE; |
| dv2.hasStatus = UA_TRUE; |
| dv2.hasValue = UA_TRUE; |
| |
| UA_DateTime srcts2 = UA_DateTime_fromUnixTime(1234567); |
| UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567); |
| |
| dv2.sourceTimestamp = srcts2; |
| dv2.serverTimestamp = srvts2; |
| dv2.sourcePicoseconds = 0; |
| dv2.serverPicoseconds = 0; |
| |
| UA_Variant variant2; |
| UA_Variant_init(&variant2); |
| UA_Boolean variantContent2 = true; |
| UA_Variant_setScalarCopy(&variant2, &variantContent2, &UA_TYPES[UA_TYPES_BOOLEAN]); |
| dv2.value = variant2; |
| |
| dv2.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID; |
| |
| UA_WriteValue value; |
| UA_WriteValue_init(&value); |
| value.value = dv; |
| value.attributeId = 12; |
| value.indexRange = UA_STRING_ALLOC("BLOAB"); |
| value.nodeId = UA_NODEID_STRING_ALLOC(0, "a1111"); |
| |
| UA_WriteValue value2; |
| UA_WriteValue_init(&value2); |
| value2.value = dv2; |
| value2.attributeId = 12; |
| value2.indexRange = UA_STRING_ALLOC("BLOAB"); |
| value2.nodeId = UA_NODEID_STRING_ALLOC(0, "a2222"); |
| |
| UA_WriteValue *values = (UA_WriteValue*)UA_calloc(2,sizeof(UA_WriteValue)); |
| values[0] = value; |
| values[1] = value2; |
| |
| src.nodesToWrite = values; |
| src.nodesToWriteSize = 2; |
| src.requestHeader = rh; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_WRITEREQUEST]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"RequestHeader\":{\"AuthenticationToken\":{\"IdType\":1,\"Id\":\"authToken\"},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"RequestHandle\":123123,\"ReturnDiagnostics\":1,\"AuditEntryId\":\"Auditentryid\",\"TimeoutHint\":120,\"AdditionalHeader\":{\"TypeId\":{\"Id\":1},\"Body\":false}},\"NodesToWrite\":[{\"NodeId\":{\"IdType\":1,\"Id\":\"a1111\"},\"AttributeId\":12,\"IndexRange\":\"BLOAB\",\"Value\":{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerTimestamp\":\"1970-01-15T06:56:07Z\"}},{\"NodeId\":{\"IdType\":1,\"Id\":\"a2222\"},\"AttributeId\":12,\"IndexRange\":\"BLOAB\",\"Value\":{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerTimestamp\":\"1970-01-15T06:56:07Z\"}}]}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| UA_WriteRequest_deleteMembers(&src); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_VariableAttributes_json_encode) { |
| |
| const UA_VariableTypeAttributes UA_VariableTypeAttributes_default = { |
| 0, /* specifiedAttributes */ |
| {{0, NULL}, {0, NULL}}, /* displayName */ |
| {{0, NULL}, {0, NULL}}, /* description */ |
| 0, 0, /* writeMask (userWriteMask) */ |
| {NULL, UA_VARIANT_DATA, 0, NULL, 0, NULL}, /* value */ |
| {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* dataType */ |
| UA_VALUERANK_ANY, /* valueRank */ |
| 0, NULL, /* arrayDimensions */ |
| true /* isAbstract */ |
| }; |
| |
| UA_VariableTypeAttributes src = UA_VariableTypeAttributes_default; |
| UA_Int32 myInteger = 42; |
| UA_Variant_setScalar(&src.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]); |
| src.description = UA_LOCALIZEDTEXT("en-US","the answer"); |
| src.displayName = UA_LOCALIZEDTEXT("en-US","the answer"); |
| src.dataType = UA_TYPES[UA_TYPES_INT32].typeId; |
| |
| const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]; |
| size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE); |
| UA_ByteString buf; |
| |
| UA_ByteString_allocBuffer(&buf, size+1); |
| |
| UA_Byte *bufPos = &buf.data[0]; |
| const UA_Byte *bufEnd = &buf.data[size+1]; |
| |
| status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE); |
| |
| *bufPos = 0; |
| // then |
| ck_assert_int_eq(s, UA_STATUSCODE_GOOD); |
| char* result = "{\"SpecifiedAttributes\":0," |
| "\"DisplayName\":{\"Locale\":\"en-US\",\"Text\":\"the answer\"}," |
| "\"Description\":{\"Locale\":\"en-US\",\"Text\":\"the answer\"}," |
| "\"WriteMask\":0,\"UserWriteMask\":0," |
| "\"Value\":{\"Type\":6,\"Body\":42}," |
| "\"DataType\":{\"Id\":6},\"ValueRank\":-2," |
| "\"ArrayDimensions\":[]," |
| "\"IsAbstract\":true}"; |
| ck_assert_str_eq(result, (char*)buf.data); |
| UA_ByteString_deleteMembers(&buf); |
| } |
| END_TEST |
| |
| // ---------------------------DECODE------------------------------------- |
| |
| START_TEST(UA_Byte_Min_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":3,\"Body\":0}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTE); |
| ck_assert_uint_eq(*((UA_Byte*)out.data), 0); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Byte_Max_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":3,\"Body\":255}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTE); |
| ck_assert_uint_eq(*((UA_Byte*)out.data), 255); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| /* ----UInt16---- */ |
| START_TEST(UA_UInt16_Min_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":5,\"Body\":0}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT16); |
| ck_assert_uint_eq(*((UA_UInt16*)out.data), 0); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_UInt16_Max_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":5,\"Body\":65535}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT16); |
| ck_assert_uint_eq(*((UA_UInt16*)out.data), 65535); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_UInt32_Min_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":7,\"Body\":0}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT32); |
| ck_assert_uint_eq(*((UA_UInt32*)out.data), 0); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_UInt32_Max_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":7,\"Body\":4294967295}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT32); |
| ck_assert_uint_eq(*((UA_UInt32*)out.data), 4294967295); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_UInt64_Min_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":\"0\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT64); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[4], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[5], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[6], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[7], 0x00); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_UInt64_Max_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":\"18446744073709551615\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT64); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[4], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[5], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[6], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[7], 0xFF); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_UInt64_Overflow_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":\"18446744073709551616\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_SByte_Min_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":2,\"Body\":-128}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_SBYTE); |
| ck_assert_int_eq(*((UA_SByte*)out.data), -128); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_SByte_Max_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":2,\"Body\":127}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_SBYTE); |
| ck_assert_int_eq(*((UA_SByte*)out.data), 127); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Int16_Min_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":4,\"Body\":-32768}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT16); |
| ck_assert_int_eq(*((UA_Int16*)out.data), -32768); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int16_Max_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":4,\"Body\":32767}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT16); |
| ck_assert_int_eq(*((UA_Int16*)out.data), 32767); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Int32_Min_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":6,\"Body\":-2147483648}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT32); |
| ck_assert(*(UA_Int32*)out.data == -2147483648); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int32_Max_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":6,\"Body\":2147483647}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT32); |
| ck_assert_int_eq(*((UA_Int32*)out.data), 2147483647); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Int64_Min_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"-9223372036854775808\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT64); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[4], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[5], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[6], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[7], 0x80); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Int64_Max_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"9223372036854775807\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT64); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[4], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[5], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[6], 0xFF); |
| ck_assert_int_eq(((u8*)(out.data))[7], 0x7F); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Int64_Overflow_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"9223372036854775808\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int64_TooBig_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"111111111111111111111111111111\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Int64_NoDigit_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"a\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Float_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":3.1415927410}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| //0 10000000 10010010000111111011011 = 40 49 0f db |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0xdb); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x0f); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x49); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x40); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Float_json_one_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":1}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| //0 01111111 00000000000000000000000 = 3f80 0000 |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x80); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x3f); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Float_json_inf_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"Infinity\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x80); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x7f); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Float_json_neginf_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"-Infinity\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| //0 01111111 00000000000000000000000 = 3f80 0000 |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x80); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0xff); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Float_json_nan_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"NaN\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| //0 01111111 00000000000000000000000 = 3f80 0000 |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| //ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| //ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| //ck_assert_int_eq(((u8*)(out.data))[2], 0x80); |
| //ck_assert_int_eq(((u8*)(out.data))[3], 0x3f); |
| |
| UA_Float val = *((UA_Float*)out.data); |
| ck_assert(val != val); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Float_json_negnan_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"-NaN\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| //0 01111111 00000000000000000000000 = 3f80 0000 |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| //ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| //ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| //ck_assert_int_eq(((u8*)(out.data))[2], 0x80); |
| //ck_assert_int_eq(((u8*)(out.data))[3], 0x3f); |
| |
| UA_Float val = *((UA_Float*)out.data); |
| ck_assert(val != val); /* check if not a number */ |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.1234}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0xef); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x38); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x45); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x47); |
| ck_assert_int_eq(((u8*)(out.data))[4], 0x72); |
| ck_assert_int_eq(((u8*)(out.data))[5], 0xf9); |
| ck_assert_int_eq(((u8*)(out.data))[6], 0xf1); |
| ck_assert_int_eq(((u8*)(out.data))[7], 0x3f); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_corrupt_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.12.34}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_one_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| //UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1}"); |
| UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| // 0 01111111111 0000000000000000000000000000000000000000000000000000 |
| // 3FF0000000000000 |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[4], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[5], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[6], 0xF0); |
| ck_assert_int_eq(((u8*)(out.data))[7], 0x3F); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Double_onepointsmallest_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.0000000000000002}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| // 0 01111111111 0000000000000000000000000000000000000000000000000001 |
| // 3FF0000000000001 |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0x01); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[4], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[5], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[6], 0xF0); |
| ck_assert_int_eq(((u8*)(out.data))[7], 0x3F); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_nan_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"NaN\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| UA_Double val = *((UA_Double*)out.data); |
| ck_assert(val != val); /* check if not a number */ |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_negnan_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"-NaN\"}"); |
| // when |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| UA_Double val = *((UA_Double*)out.data); |
| ck_assert(val != val); /* check if not a number */ |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_inf_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"Infinity\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| // 0 111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[4], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[5], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[6], 0xF0); |
| ck_assert_int_eq(((u8*)(out.data))[7], 0x7F); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_neginf_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"-Infinity\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| // 1 111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[4], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[5], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[6], 0xF0); |
| ck_assert_int_eq(((u8*)(out.data))[7], 0xFF); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_zero_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":0}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| // 0 000 0000 0000 0000 0000 0000 00000000 00000000 00000000 00000000 00000000 |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[4], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[5], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[6], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[7], 0x00); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Double_negzero_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":-0}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| // 1 000 0000 0000 0000 00000000 00000000 00000000 00000000 00000000 00000000 |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(((u8*)(out.data))[0], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[1], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[2], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[3], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[4], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[5], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[6], 0x00); |
| ck_assert_int_eq(((u8*)(out.data))[7], 0x80); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_String_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"abcdef\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING); |
| ck_assert_int_eq( ((UA_String*)out.data)->length, 6); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[0], 'a'); |
| ck_assert_int_eq(((UA_String*)out.data)->data[1], 'b'); |
| ck_assert_int_eq(((UA_String*)out.data)->data[2], 'c'); |
| ck_assert_int_eq(((UA_String*)out.data)->data[3], 'd'); |
| ck_assert_int_eq(((UA_String*)out.data)->data[4], 'e'); |
| ck_assert_int_eq(((UA_String*)out.data)->data[5], 'f'); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_String_empty_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING); |
| ck_assert_int_eq( ((UA_String*)out.data)->length, 0); |
| ck_assert_ptr_eq( ((UA_String*)out.data)->data, UA_EMPTY_ARRAY_SENTINEL); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_String_unescapeBS_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"ab\\tcdef\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING); |
| ck_assert_int_eq( ((UA_String*)out.data)->length, 7); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[0], 'a'); |
| ck_assert_int_eq(((UA_String*)out.data)->data[1], 'b'); |
| ck_assert_int_eq(((UA_String*)out.data)->data[2], '\t'); |
| ck_assert_int_eq(((UA_String*)out.data)->data[3], 'c'); |
| ck_assert_int_eq(((UA_String*)out.data)->data[4], 'd'); |
| ck_assert_int_eq(((UA_String*)out.data)->data[5], 'e'); |
| ck_assert_int_eq(((UA_String*)out.data)->data[6], 'f'); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_String_escape_unicode_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\u002c\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING); |
| ck_assert_int_eq( ((UA_String*)out.data)->length, 1); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[0], ','); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_String_escape2_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\b\\th\\\"e\\fl\\nl\\\\o\\r\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING); |
| ck_assert_int_eq( ((UA_String*)out.data)->length, 12);// \b\th\"e\fl\nl\\o\r |
| ck_assert_int_eq( ((UA_String*)out.data)->data[0], '\b'); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[1], '\t'); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[2], 'h'); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[3], '\"'); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[4], 'e'); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[5], '\f'); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[6], 'l'); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[7], '\n'); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[8], 'l'); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[9], '\\'); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[10], 'o'); |
| ck_assert_int_eq( ((UA_String*)out.data)->data[11], '\r'); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_String_surrogatePair_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\uD800\\uDC00\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING); |
| ck_assert_int_eq( ((UA_String*)out.data)->length, 4);//U+10000 => 0xF0 0x90 0x80 0x80 |
| ck_assert_uint_eq( ((UA_String*)out.data)->data[0], 0xF0); |
| ck_assert_uint_eq( ((UA_String*)out.data)->data[1], 0x90); |
| ck_assert_uint_eq( ((UA_String*)out.data)->data[2], 0x80); |
| ck_assert_uint_eq( ((UA_String*)out.data)->data[3], 0x80); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| /* ---------------ByteString---------------------------*/ |
| START_TEST(UA_ByteString_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":15,\"Body\":\"YXNkZmFzZGY=\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTESTRING); |
| ck_assert_int_eq(((UA_ByteString*)out.data)->length, 8); |
| ck_assert_int_eq(((UA_ByteString*)out.data)->data[0], 'a'); |
| ck_assert_int_eq(((UA_ByteString*)out.data)->data[1], 's'); |
| ck_assert_int_eq(((UA_ByteString*)out.data)->data[2], 'd'); |
| ck_assert_int_eq(((UA_ByteString*)out.data)->data[3], 'f'); |
| ck_assert_int_eq(((UA_ByteString*)out.data)->data[4], 'a'); |
| ck_assert_int_eq(((UA_ByteString*)out.data)->data[5], 's'); |
| ck_assert_int_eq(((UA_ByteString*)out.data)->data[6], 'd'); |
| ck_assert_int_eq(((UA_ByteString*)out.data)->data[7], 'f'); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| |
| START_TEST(UA_ByteString_bad_json_decode) { |
| UA_ByteString out; |
| UA_ByteString_init(&out); |
| UA_ByteString buf = UA_STRING("\"\x90!\xc5 c{\","); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_BYTESTRING]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| UA_ByteString_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_ByteString_null_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":15,\"Body\":null}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTESTRING); |
| ck_assert_ptr_eq(out.data, NULL); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| /* ---------GUID--------------------------- */ |
| START_TEST(UA_Guid_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090A0B\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_GUID); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data1, 1); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data2, 2); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data3, 3); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[0], 4); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[1], 5); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[2], 6); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[3], 7); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[4], 8); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[5], 9); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[6], 10); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[7], 11); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Guid_lower_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090a0b\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_GUID); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data1, 1); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data2, 2); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data3, 3); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[0], 4); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[1], 5); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[2], 6); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[3], 7); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[4], 8); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[5], 9); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[6], 10); |
| ck_assert_int_eq(((UA_Guid*)out.data)->data4[7], 11); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Guid_tooShort_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-00\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Guid_tooLong_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090A0B00000001\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Guid_wrong_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000=01-0002-0003-0405-060708090A0B\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| /* ------Statuscode----------- */ |
| START_TEST(UA_StatusCode_2_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":2}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STATUSCODE); |
| ck_assert_uint_eq(*((UA_StatusCode*)out.data), 2); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_StatusCode_3_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| |
| UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":222222222222222222222222222222222222}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_StatusCode_0_json_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":0}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STATUSCODE); |
| ck_assert_uint_eq(*((UA_StatusCode*)out.data), 0); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| /* ----------DateTime---------------- */ |
| START_TEST(UA_DateTime_json_decode) { |
| // given |
| UA_DateTime out; |
| UA_DateTime_init(&out); |
| UA_ByteString buf = UA_STRING("\"1970-01-02T01:02:03.005Z\""); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATETIME]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| UA_DateTimeStruct dts = UA_DateTime_toStruct(out); |
| ck_assert_int_eq(dts.year, 1970); |
| ck_assert_int_eq(dts.month, 1); |
| ck_assert_int_eq(dts.day, 2); |
| ck_assert_int_eq(dts.hour, 1); |
| ck_assert_int_eq(dts.min, 2); |
| ck_assert_int_eq(dts.sec, 3); |
| ck_assert_int_eq(dts.milliSec, 5); |
| ck_assert_int_eq(dts.microSec, 0); |
| ck_assert_int_eq(dts.nanoSec, 0); |
| |
| UA_DateTime_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_DateTime_micro_json_decode) { |
| // given |
| UA_DateTime out; |
| UA_DateTime_init(&out); |
| UA_ByteString buf = UA_STRING("\"1970-01-02T01:02:03.042Z\""); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATETIME]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| UA_DateTimeStruct dts = UA_DateTime_toStruct(out); |
| ck_assert_int_eq(dts.year, 1970); |
| ck_assert_int_eq(dts.month, 1); |
| ck_assert_int_eq(dts.day, 2); |
| ck_assert_int_eq(dts.hour, 1); |
| ck_assert_int_eq(dts.min, 2); |
| ck_assert_int_eq(dts.sec, 3); |
| ck_assert_int_eq(dts.milliSec, 42); |
| ck_assert_int_eq(dts.microSec, 0); |
| ck_assert_int_eq(dts.nanoSec, 0); |
| |
| UA_DateTime_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| /* ---------------QualifiedName----------------------- */ |
| START_TEST(UA_QualifiedName_json_decode) { |
| // given |
| UA_QualifiedName out; |
| UA_QualifiedName_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Name\":\"derName\",\"Uri\":1}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.name.length, 7); |
| ck_assert_int_eq(out.name.data[1], 'e'); |
| ck_assert_int_eq(out.name.data[6], 'e'); |
| ck_assert_int_eq(out.namespaceIndex, 1); |
| |
| UA_QualifiedName_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_QualifiedName_null_json_decode) { |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":20,\"Body\":null}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_QUALIFIEDNAME); |
| ck_assert_ptr_eq(out.data, NULL); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| /* --------LocalizedText------------ */ |
| START_TEST(UA_LocalizedText_json_decode) { |
| // given |
| UA_LocalizedText out; |
| UA_LocalizedText_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Locale\":\"t1\",\"Text\":\"t2\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.locale.data[0], 't'); |
| ck_assert_int_eq(out.text.data[0], 't'); |
| ck_assert_int_eq(out.locale.data[1], '1'); |
| ck_assert_int_eq(out.text.data[1], '2'); |
| |
| UA_LocalizedText_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_LocalizedText_missing_json_decode) { |
| // given |
| UA_LocalizedText out; |
| UA_LocalizedText_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Locale\":\"t1\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.locale.length, 2); |
| ck_assert_int_eq(out.locale.data[0], 't'); |
| ck_assert_int_eq(out.locale.data[1], '1'); |
| ck_assert_ptr_eq(out.text.data, NULL); |
| ck_assert_int_eq(out.text.length, 0); |
| |
| UA_LocalizedText_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_LocalizedText_null_json_decode) { |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":21,\"Body\":null}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_LOCALIZEDTEXT); |
| ck_assert_ptr_eq(out.data, NULL); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_ViewDescription_json_decode) { |
| // given |
| UA_ViewDescription out; |
| UA_ViewDescription_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1236,\"ViewId\":{\"Id\":\"00000009-0002-027C-F3BF-BB7BEEFEEFBE\",\"IdType\":2}}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.viewVersion, 1236); |
| ck_assert_int_eq(out.viewId.identifierType, UA_NODEIDTYPE_GUID); |
| UA_DateTimeStruct dts = UA_DateTime_toStruct(out.timestamp); |
| ck_assert_int_eq(dts.year, 1970); |
| ck_assert_int_eq(dts.month, 1); |
| ck_assert_int_eq(dts.day, 15); |
| ck_assert_int_eq(dts.hour, 6); |
| ck_assert_int_eq(dts.min, 56); |
| ck_assert_int_eq(dts.sec, 7); |
| ck_assert_int_eq(dts.milliSec, 0); |
| ck_assert_int_eq(dts.microSec, 0); |
| ck_assert_int_eq(dts.nanoSec, 0); |
| ck_assert_int_eq(out.viewId.identifier.guid.data1, 9); |
| ck_assert_int_eq(out.viewId.identifier.guid.data2, 2); |
| |
| UA_ViewDescription_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| |
| /* -----------------NodeId----------------------------- */ |
| START_TEST(UA_NodeId_Nummeric_json_decode) { |
| // given |
| UA_NodeId out; |
| UA_NodeId_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Id\":42}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.identifier.numeric, 42); |
| ck_assert_int_eq(out.namespaceIndex, 0); |
| ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_NUMERIC); |
| |
| UA_NodeId_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_NodeId_Nummeric_Namespace_json_decode) { |
| // given |
| UA_NodeId out; |
| UA_NodeId_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Id\":42,\"Namespace\":123}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.identifier.numeric, 42); |
| ck_assert_int_eq(out.namespaceIndex, 123); |
| ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_NUMERIC); |
| |
| UA_NodeId_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_NodeId_String_json_decode) { |
| // given |
| UA_NodeId out; |
| UA_NodeId_init(&out); |
| UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test123\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.identifier.string.length, 7); |
| ck_assert_int_eq(out.identifier.string.data[0], 't'); |
| ck_assert_int_eq(out.identifier.string.data[1], 'e'); |
| ck_assert_int_eq(out.identifier.string.data[2], 's'); |
| ck_assert_int_eq(out.identifier.string.data[3], 't'); |
| ck_assert_int_eq(out.identifier.string.data[4], '1'); |
| ck_assert_int_eq(out.identifier.string.data[5], '2'); |
| ck_assert_int_eq(out.identifier.string.data[6], '3'); |
| ck_assert_int_eq(out.namespaceIndex, 0); |
| ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_STRING); |
| |
| UA_NodeId_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_NodeId_Guid_json_decode) { |
| // given |
| UA_NodeId out; |
| UA_NodeId_init(&out); |
| UA_ByteString buf = UA_STRING("{\"IdType\":2,\"Id\":\"00000001-0002-0003-0405-060708090A0B\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| |
| ck_assert_int_eq(out.namespaceIndex, 0); |
| ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_GUID); |
| ck_assert_int_eq(out.identifier.guid.data1, 1); |
| ck_assert_int_eq(out.identifier.guid.data2, 2); |
| ck_assert_int_eq(out.identifier.guid.data3, 3); |
| ck_assert_int_eq(out.identifier.guid.data4[0], 4); |
| ck_assert_int_eq(out.identifier.guid.data4[1], 5); |
| ck_assert_int_eq(out.identifier.guid.data4[2], 6); |
| ck_assert_int_eq(out.identifier.guid.data4[3], 7); |
| ck_assert_int_eq(out.identifier.guid.data4[4], 8); |
| ck_assert_int_eq(out.identifier.guid.data4[5], 9); |
| ck_assert_int_eq(out.identifier.guid.data4[6], 10); |
| ck_assert_int_eq(out.identifier.guid.data4[7], 11); |
| |
| UA_NodeId_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_NodeId_ByteString_json_decode) { |
| // given |
| UA_NodeId out; |
| UA_NodeId_init(&out); |
| UA_ByteString buf = UA_STRING("{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| |
| ck_assert_int_eq(out.namespaceIndex, 0); |
| ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_BYTESTRING); |
| ck_assert_int_eq(out.identifier.byteString.length, 8); |
| ck_assert_int_eq(out.identifier.byteString.data[0], 'a'); |
| ck_assert_int_eq(out.identifier.byteString.data[1], 's'); |
| ck_assert_int_eq(out.identifier.byteString.data[2], 'd'); |
| ck_assert_int_eq(out.identifier.byteString.data[3], 'f'); |
| ck_assert_int_eq(out.identifier.byteString.data[4], 'a'); |
| ck_assert_int_eq(out.identifier.byteString.data[5], 's'); |
| ck_assert_int_eq(out.identifier.byteString.data[6], 'd'); |
| ck_assert_int_eq(out.identifier.byteString.data[7], 'f'); |
| |
| UA_NodeId_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| /* -----------------------ExpandedNodeId---------------------------*/ |
| START_TEST(UA_ExpandedNodeId_Nummeric_json_decode) { |
| // given |
| UA_ExpandedNodeId out; |
| UA_ExpandedNodeId_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Id\":42}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.nodeId.identifier.numeric, 42); |
| ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_NUMERIC); |
| ck_assert_ptr_eq(out.namespaceUri.data, NULL); |
| ck_assert_int_eq(out.namespaceUri.length, 0); |
| ck_assert_int_eq(out.serverIndex, 0); |
| |
| UA_ExpandedNodeId_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_ExpandedNodeId_String_json_decode) { |
| // given |
| UA_ExpandedNodeId out; |
| UA_ExpandedNodeId_init(&out); |
| UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.nodeId.identifier.string.length, 4); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't'); |
| ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING); |
| ck_assert_ptr_eq(out.namespaceUri.data, NULL); |
| ck_assert_int_eq(out.namespaceUri.length, 0); |
| ck_assert_int_eq(out.serverIndex, 0); |
| |
| UA_ExpandedNodeId_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_ExpandedNodeId_String_Namespace_json_decode) { |
| // given |
| UA_ExpandedNodeId out; |
| UA_ExpandedNodeId_init(&out); |
| UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":\"abcdef\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.nodeId.identifier.string.length, 4); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[1], 'e'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't'); |
| ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING); |
| ck_assert_int_eq(out.namespaceUri.length, 6); |
| ck_assert_int_eq(out.namespaceUri.data[0], 'a'); |
| ck_assert_int_eq(out.namespaceUri.data[1], 'b'); |
| ck_assert_int_eq(out.namespaceUri.data[2], 'c'); |
| ck_assert_int_eq(out.namespaceUri.data[3], 'd'); |
| ck_assert_int_eq(out.namespaceUri.data[4], 'e'); |
| ck_assert_int_eq(out.namespaceUri.data[5], 'f'); |
| ck_assert_int_eq(out.serverIndex, 0); |
| |
| UA_ExpandedNodeId_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_ExpandedNodeId_String_NamespaceAsIndex_json_decode) { |
| // given |
| UA_ExpandedNodeId out; |
| UA_ExpandedNodeId_init(&out); |
| UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":42}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.nodeId.identifier.string.length, 4); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[1], 'e'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't'); |
| ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING); |
| ck_assert_int_eq(out.namespaceUri.length, 0); |
| ck_assert_ptr_eq(out.namespaceUri.data, NULL); |
| ck_assert_int_eq(out.nodeId.namespaceIndex, 42); |
| ck_assert_int_eq(out.serverIndex, 0); |
| |
| UA_ExpandedNodeId_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_ExpandedNodeId_String_Namespace_ServerUri_json_decode) { |
| // given |
| UA_ExpandedNodeId out; |
| UA_ExpandedNodeId_init(&out); |
| UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":\"test\",\"ServerUri\":13}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.nodeId.identifier.string.length, 4); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[1], 'e'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't'); |
| ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING); |
| ck_assert_int_eq(out.serverIndex, 13); |
| ck_assert_int_eq(out.namespaceUri.data[0], 't'); |
| ck_assert_int_eq(out.namespaceUri.data[1], 'e'); |
| ck_assert_int_eq(out.namespaceUri.data[2], 's'); |
| ck_assert_int_eq(out.namespaceUri.data[3], 't'); |
| |
| UA_ExpandedNodeId_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_ExpandedNodeId_ByteString_json_decode) { |
| // given |
| UA_ExpandedNodeId out; |
| UA_ExpandedNodeId_init(&out); |
| UA_ByteString buf = UA_STRING("{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\",\"Namespace\":\"test\",\"ServerUri\":13}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.nodeId.identifier.string.length, 8); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[0], 'a'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[1], 's'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[2], 'd'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[3], 'f'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[4], 'a'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[5], 's'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[6], 'd'); |
| ck_assert_int_eq(out.nodeId.identifier.string.data[7], 'f'); |
| ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_BYTESTRING); |
| ck_assert_int_eq(out.serverIndex, 13); |
| ck_assert_int_eq(out.namespaceUri.data[0], 't'); |
| ck_assert_int_eq(out.namespaceUri.data[1], 'e'); |
| ck_assert_int_eq(out.namespaceUri.data[2], 's'); |
| ck_assert_int_eq(out.namespaceUri.data[3], 't'); |
| |
| UA_ExpandedNodeId_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_DiagnosticInfo_json_decode) { |
| // given |
| |
| UA_DiagnosticInfo out; |
| UA_DiagnosticInfo_init(&out); |
| out.innerDiagnosticInfo = NULL; |
| UA_ByteString buf = UA_STRING("{\"SymbolicId\":13," |
| "\"LocalizedText\":14," |
| "\"Locale\":12," |
| "\"AdditionalInfo\":\"additionalInfo\"," |
| "\"InnerStatusCode\":2155216896," |
| "\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\"}}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.locale, 12); |
| ck_assert_int_eq(out.symbolicId, 13); |
| ck_assert_int_eq(out.localizedText, 14); |
| ck_assert_int_eq(out.innerStatusCode, 2155216896); |
| ck_assert_int_eq(out.additionalInfo.length, 14); |
| ck_assert_int_eq(out.innerDiagnosticInfo->additionalInfo.length, 19); |
| UA_DiagnosticInfo_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_DiagnosticInfo_null_json_decode) { |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":25,\"Body\":null}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_DIAGNOSTICINFO); |
| ck_assert_ptr_eq(out.data, NULL); |
| |
| //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasAdditionalInfo, 0); |
| //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasInnerDiagnosticInfo, 0); |
| //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasInnerStatusCode, 0); |
| //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasLocale, 0); |
| //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasLocalizedText, 0); |
| //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasNamespaceUri, 0); |
| //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasSymbolicId, 0); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| /* --------------------DataValue--------------------------- */ |
| START_TEST(UA_DataValue_json_decode) { |
| // given |
| |
| UA_DataValue out; |
| UA_DataValue_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"SourcePicoseconds\":0,\"ServerTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerPicoseconds\":0}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo; |
| |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.hasStatus, 1); |
| ck_assert_int_eq(out.hasServerPicoseconds, 1); |
| ck_assert_int_eq(out.hasServerTimestamp, 1); |
| ck_assert_int_eq(out.hasSourcePicoseconds, 1); |
| ck_assert_int_eq(out.hasSourceTimestamp, 1); |
| ck_assert_int_eq(out.hasValue, 1); |
| ck_assert_int_eq(out.status, 2153250816); |
| ck_assert_int_eq(out.value.type->typeIndex, 0); |
| ck_assert_int_eq((*((UA_Boolean*)out.value.data)), 1); |
| UA_DataValue_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_DataValueMissingFields_json_decode) { |
| // given |
| |
| UA_DataValue out; |
| UA_DataValue_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Value\":{\"Type\":1,\"Body\":true}}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo; |
| |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.hasStatus, 0); |
| ck_assert_int_eq(out.hasServerPicoseconds, 0); |
| ck_assert_int_eq(out.hasServerTimestamp, 0); |
| ck_assert_int_eq(out.hasSourcePicoseconds, 0); |
| ck_assert_int_eq(out.hasSourceTimestamp, 0); |
| ck_assert_int_eq(out.hasValue, 1); |
| UA_DataValue_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_DataValue_null_json_decode) { |
| // given |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":23,\"Body\":null}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo; |
| |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_ptr_eq(out.data, NULL); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| /*----------------------ExtensionObject------------------------*/ |
| START_TEST(UA_ExtensionObject_json_decode) { |
| // given |
| |
| UA_ExtensionObject out; |
| UA_ExtensionObject_init(&out); |
| UA_ByteString buf = UA_STRING("{\"TypeId\":{\"Id\":1},\"Body\":true}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_DECODED); |
| ck_assert_int_eq(*((UA_Boolean*)out.content.decoded.data), UA_TRUE); |
| ck_assert_int_eq(out.content.decoded.type->typeIndex, UA_TYPES_BOOLEAN); |
| UA_ExtensionObject_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_ExtensionObject_EncodedByteString_json_decode) { |
| // given |
| |
| UA_ExtensionObject out; |
| UA_ExtensionObject_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Encoding\":1,\"TypeId\":{\"Id\":42},\"Body\":\"YXNkZmFzZGY=\"}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_ENCODED_BYTESTRING); |
| //TODO: Not base64 decoded, correct? |
| ck_assert_int_eq(out.content.encoded.body.data[0], 'Y'); |
| ck_assert_int_eq(out.content.encoded.body.data[0], 'Y'); |
| ck_assert_int_eq(out.content.encoded.body.data[1], 'X'); |
| ck_assert_int_eq(out.content.encoded.body.data[2], 'N'); |
| ck_assert_int_eq(out.content.encoded.body.data[3], 'k'); |
| ck_assert_int_eq(out.content.encoded.body.data[4], 'Z'); |
| ck_assert_int_eq(out.content.encoded.body.data[5], 'm'); |
| ck_assert_int_eq(out.content.encoded.body.data[6], 'F'); |
| ck_assert_int_eq(out.content.encoded.typeId.identifier.numeric, 42); |
| |
| UA_ExtensionObject_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_ExtensionObject_EncodedXml_json_decode) { |
| // given |
| |
| UA_ExtensionObject out; |
| UA_ExtensionObject_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Encoding\":2,\"TypeId\":{\"Id\":42},\"Body\":\"<Element></Element>\"}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_ENCODED_XML); |
| ck_assert_int_eq(out.content.encoded.body.data[0], '<'); |
| ck_assert_int_eq(out.content.encoded.body.data[1], 'E'); |
| ck_assert_int_eq(out.content.encoded.body.data[2], 'l'); |
| ck_assert_int_eq(out.content.encoded.body.data[3], 'e'); |
| ck_assert_int_eq(out.content.encoded.typeId.identifier.numeric, 42); |
| UA_ExtensionObject_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_ExtensionObject_Unkown_json_decode) { |
| // given |
| |
| UA_ExtensionObject out; |
| UA_ExtensionObject_init(&out); |
| UA_ByteString buf = UA_STRING("{\"TypeId\":{\"Id\":4711},\"Body\":{\"unknown\":\"body\",\"saveas\":\"Bytestring\"}}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_ENCODED_BYTESTRING); |
| ck_assert_int_eq(out.content.encoded.typeId.identifier.numeric, 4711); |
| |
| //{"unknown":"body","saveas":"Bytestring"}Q |
| ck_assert_int_eq(out.content.encoded.body.length, 40); |
| ck_assert_int_eq(out.content.encoded.body.data[2], 'u'); |
| ck_assert_int_eq(out.content.encoded.body.data[3], 'n'); |
| ck_assert_int_eq(out.content.encoded.body.data[4], 'k'); |
| ck_assert_int_eq(out.content.encoded.body.data[5], 'n'); |
| ck_assert_int_eq(out.content.encoded.body.data[6], 'o'); |
| ck_assert_int_eq(out.content.encoded.body.data[7], 'w'); |
| UA_ExtensionObject_deleteMembers(&out); |
| } |
| END_TEST |
| |
| /* ----------------- Variant ---------------------*/ |
| START_TEST(UA_VariantBool_json_decode) { |
| // given |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":false}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, 0); |
| ck_assert_uint_eq(*((UA_Boolean*)out.data), 0); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_VariantBoolNull_json_decode) { |
| // given |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":null}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_VariantStringArray_json_decode) { |
| // given |
| |
| UA_Variant *out = UA_Variant_new(); |
| UA_Variant_init(out); |
| UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"],\"Dimension\":[2,4]}"); |
| //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, out, &UA_TYPES[UA_TYPES_VARIANT]); |
| |
| UA_String *testArray; |
| testArray = (UA_String*)(out->data); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq((char)testArray[0].data[0], '1'); |
| ck_assert_int_eq((char)testArray[1].data[0], '2'); |
| ck_assert_int_eq((char)testArray[2].data[0], '3'); |
| ck_assert_int_eq((char)testArray[3].data[0], '4'); |
| ck_assert_int_eq((char)testArray[4].data[0], '5'); |
| ck_assert_int_eq((char)testArray[5].data[0], '6'); |
| ck_assert_int_eq((char)testArray[6].data[0], '7'); |
| ck_assert_int_eq((char)testArray[7].data[0], '8'); |
| ck_assert_int_eq(out->arrayDimensionsSize, 2); |
| ck_assert_int_eq(out->arrayDimensions[0], 2); |
| ck_assert_int_eq(out->arrayDimensions[1], 4); |
| ck_assert_int_eq(out->arrayLength, 8); |
| ck_assert_int_eq(out->type->typeIndex, 11); |
| UA_Variant_delete(out); |
| } |
| END_TEST |
| |
| START_TEST(UA_VariantStringArrayNull_json_decode) { |
| // given |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}"); |
| //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| |
| UA_String *testArray; |
| testArray = (UA_String*)(out.data); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_ptr_eq(testArray[0].data, NULL); |
| ck_assert_ptr_eq(testArray[1].data, NULL); |
| ck_assert_ptr_eq(testArray[2].data, NULL); |
| ck_assert_ptr_eq(testArray[3].data, NULL); |
| ck_assert_ptr_eq(testArray[4].data, NULL); |
| ck_assert_ptr_eq(testArray[5].data, NULL); |
| ck_assert_ptr_eq(testArray[6].data, NULL); |
| ck_assert_ptr_eq(testArray[7].data, NULL); |
| ck_assert_int_eq(out.arrayDimensionsSize, 2); |
| ck_assert_int_eq(out.arrayDimensions[0], 2); |
| ck_assert_int_eq(out.arrayDimensions[1], 4); |
| ck_assert_int_eq(out.arrayLength, 8); |
| ck_assert_int_eq(out.type->typeIndex, 11); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_VariantLocalizedTextArrayNull_json_decode) { |
| // given |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":21,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}"); |
| //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| |
| UA_LocalizedText *testArray; |
| testArray = (UA_LocalizedText*)(out.data); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_ptr_eq(testArray[0].locale.data, NULL); |
| ck_assert_ptr_eq(testArray[1].locale.data, NULL); |
| ck_assert_ptr_eq(testArray[2].locale.data, NULL); |
| ck_assert_ptr_eq(testArray[3].locale.data, NULL); |
| ck_assert_ptr_eq(testArray[4].locale.data, NULL); |
| ck_assert_ptr_eq(testArray[5].locale.data, NULL); |
| ck_assert_ptr_eq(testArray[6].locale.data, NULL); |
| ck_assert_ptr_eq(testArray[7].locale.data, NULL); |
| ck_assert_int_eq(out.arrayDimensionsSize, 2); |
| ck_assert_int_eq(out.arrayDimensions[0], 2); |
| ck_assert_int_eq(out.arrayDimensions[1], 4); |
| ck_assert_int_eq(out.arrayLength, 8); |
| ck_assert_int_eq(out.type->typeIndex, 20); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_VariantVariantArrayNull_json_decode) { |
| // given |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}"); |
| //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| |
| UA_Variant *testArray; |
| testArray = (UA_Variant*)(out.data); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert(!testArray[0].type); |
| ck_assert_int_eq(out.arrayDimensionsSize, 2); |
| ck_assert_int_eq(out.arrayDimensions[0], 2); |
| ck_assert_int_eq(out.arrayDimensions[1], 4); |
| ck_assert_int_eq(out.arrayLength, 8); |
| ck_assert_int_eq(out.type->typeIndex, 21); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| |
| |
| START_TEST(UA_VariantVariantArrayEmpty_json_decode) { |
| // given |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":[]}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.arrayLength, 0); |
| ck_assert_ptr_eq(out.data, UA_EMPTY_ARRAY_SENTINEL); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_VariantStringArray_WithoutDimension_json_decode) { |
| // given |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"]}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| |
| UA_String *testArray; |
| testArray = (UA_String*)(out.data); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq((char)testArray[0].data[0], '1'); |
| ck_assert_int_eq((char)testArray[1].data[0], '2'); |
| ck_assert_int_eq((char)testArray[2].data[0], '3'); |
| ck_assert_int_eq((char)testArray[3].data[0], '4'); |
| ck_assert_int_eq((char)testArray[4].data[0], '5'); |
| ck_assert_int_eq((char)testArray[5].data[0], '6'); |
| ck_assert_int_eq((char)testArray[6].data[0], '7'); |
| ck_assert_int_eq((char)testArray[7].data[0], '8'); |
| ck_assert_int_eq(out.arrayDimensionsSize, 0); |
| ck_assert_int_eq(out.arrayLength, 8); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_Variant_BooleanArray_json_decode) { |
| // given |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":[true, false, true]}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| |
| UA_Boolean *testArray; |
| testArray = (UA_Boolean*)(out.data); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| //decoded as False |
| ck_assert_int_eq(testArray[0], 1); |
| ck_assert_int_eq(testArray[1], 0); |
| ck_assert_int_eq(testArray[2], 1); |
| ck_assert_int_eq(out.arrayDimensionsSize, 0); |
| ck_assert_int_eq(out.arrayLength, 3); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BOOLEAN); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_bad1_json_decode) { |
| // given |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":\"\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| UA_Variant_deleteMembers(&out); |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_ExtensionObjectWrap_json_decode) { |
| // given |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"ViewVersion\":1236}}}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.type->typeIndex, UA_TYPES_VIEWDESCRIPTION); |
| UA_ViewDescription *vd = (UA_ViewDescription*)out.data; |
| ck_assert_int_eq(vd->viewId.identifier.numeric, 99999); |
| ck_assert_int_eq(vd->viewVersion, 1236); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| |
| |
| |
| START_TEST(UA_duplicate_json_decode) { |
| // given |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":1, \"Body\":false, \"Type\":1}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_wrongBoolean_json_decode) { |
| // given |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":1, \"Body\":\"asdfaaaaaaaaaaaaaaaaaaaa\"}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| |
| START_TEST(UA_DataTypeAttributes_json_decode) { |
| // given |
| UA_DataTypeAttributes out; |
| UA_DataTypeAttributes_init(&out); |
| UA_ByteString buf = UA_STRING("{\"SpecifiedAttributes\":1," |
| "\"DisplayName\":{\"Locale\":\"t1\",\"Text\":\"t2\"}," |
| "\"Description\":{\"Locale\":\"t3\",\"Text\":\"t4\"}," |
| "\"WriteMask\":53," |
| "\"UserWriteMask\":63," |
| "\"IsAbstract\":false}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(out.isAbstract, 0); |
| ck_assert_int_eq(out.writeMask, 53); |
| ck_assert_int_eq(out.userWriteMask, 63); |
| ck_assert_int_eq(out.specifiedAttributes, 1); |
| ck_assert_int_eq(out.displayName.locale.data[1], '1'); |
| ck_assert_int_eq(out.displayName.text.data[1], '2'); |
| ck_assert_int_eq(out.description.locale.data[1], '3'); |
| ck_assert_int_eq(out.description.text.data[1], '4'); |
| UA_DataTypeAttributes_deleteMembers(&out); |
| } |
| END_TEST |
| |
| //-------------------MISC heap free test cases-------------------------- |
| START_TEST(UA_VariantStringArrayBad_shouldFreeArray_json_decode) { |
| // given |
| |
| UA_Variant out; |
| UA_Variant_init(&out); //not a string V |
| UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",true,\"4\",\"5\",\"6\",\"7\",\"8\"],\"Dimension\":[2,4]}"); |
| //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| START_TEST(UA_VariantFuzzer1_json_decode) { |
| // given |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("\\x0a{\"Type\",\"Bode\",\"Body\":{\"se\":}}"); |
| //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| |
| |
| //This test succeeds: Double will be parsed to zero if unparsable |
| // TODO: Verify against the spec |
| START_TEST(UA_VariantFuzzer2_json_decode) { |
| // given |
| |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":2E+}"); |
| //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}"); |
| |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| |
| // then |
| ck_assert(retval == UA_STATUSCODE_GOOD || retval == UA_STATUSCODE_BADDECODINGERROR); |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Bad_Type_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| UA_ByteString buf = UA_STRING("{\"Type\":1000,\"Body\":0}"); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| |
| UA_Variant_deleteMembers(&out); |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Bad_Type2_decode) { |
| for(int i = 0; i < 100; i++){ |
| UA_Variant out; |
| UA_Variant_init(&out); |
| char str[80]; |
| sprintf(str, "{\"Type\":%d}", i); |
| UA_ByteString buf = UA_STRING(str); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, retval); |
| UA_Variant_deleteMembers(&out); |
| } |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Null_decode) { |
| for(int i = 0; i < 100; i++){ |
| UA_Variant out; |
| UA_Variant_init(&out); |
| char str[80]; |
| sprintf(str, "{\"Type\":%d, \"Body:\":null}", i); |
| UA_ByteString buf = UA_STRING(str); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, retval); |
| UA_Variant_deleteMembers(&out); |
| } |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Malformed_decode) { |
| for(int i = 0; i < 100; i++){ |
| UA_Variant out; |
| UA_Variant_init(&out); |
| char str[80]; |
| sprintf(str, "{\"Type\":%d, \"Body:\"}", i); |
| UA_ByteString buf = UA_STRING(str); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| UA_Variant_deleteMembers(&out); |
| } |
| } |
| END_TEST |
| |
| START_TEST(UA_Variant_Malformed2_decode) { |
| UA_Variant out; |
| UA_Variant_init(&out); |
| char str[80]; |
| sprintf(str, "{\"Type\":, \"Body:\"}"); |
| UA_ByteString buf = UA_STRING(str); |
| // when |
| |
| UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]); |
| // then |
| ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR); |
| UA_Variant_deleteMembers(&out); |
| |
| } |
| END_TEST |
| |
| START_TEST(UA_JsonHelper) { |
| // given |
| |
| CtxJson ctx; |
| memset(&ctx, 0, sizeof(ctx)); |
| ck_assert_int_eq(writeJsonArrStart(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| ck_assert_int_eq(writeJsonObjStart(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| ck_assert_int_eq(writeJsonObjEnd(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| ck_assert_int_eq(writeJsonArrEnd(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| ck_assert_int_eq(writeJsonNull(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED); |
| |
| ctx.calcOnly = true; |
| ctx.end = (const UA_Byte*)(uintptr_t)SIZE_MAX; |
| ck_assert_int_eq(calcJsonArrStart(&ctx), UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(calcJsonObjStart(&ctx), UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(calcJsonObjEnd(&ctx), UA_STATUSCODE_GOOD); |
| ck_assert_int_eq(calcJsonArrEnd(&ctx), UA_STATUSCODE_GOOD); |
| } |
| END_TEST |
| |
| |
| static Suite *testSuite_builtin_json(void) { |
| Suite *s = suite_create("Built-in Data Types 62541-6 Json"); |
| |
| TCase *tc_json_encode = tcase_create("json_encode"); |
| tcase_add_test(tc_json_encode, UA_Boolean_true_json_encode); |
| tcase_add_test(tc_json_encode, UA_Boolean_false_json_encode); |
| tcase_add_test(tc_json_encode, UA_Boolean_true_bufferTooSmall_json_encode); |
| |
| tcase_add_test(tc_json_encode, UA_String_json_encode); |
| tcase_add_test(tc_json_encode, UA_String_Empty_json_encode); |
| tcase_add_test(tc_json_encode, UA_String_Null_json_encode); |
| tcase_add_test(tc_json_encode, UA_String_escapesimple_json_encode); |
| tcase_add_test(tc_json_encode, UA_String_escapeutf_json_encode); |
| tcase_add_test(tc_json_encode, UA_String_special_json_encode); |
| |
| |
| tcase_add_test(tc_json_encode, UA_Byte_Max_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Byte_Min_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Byte_smallbuf_Number_json_encode); |
| |
| tcase_add_test(tc_json_encode, UA_SByte_Max_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_SByte_Min_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_SByte_Zero_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_SByte_smallbuf_Number_json_encode); |
| |
| |
| tcase_add_test(tc_json_encode, UA_UInt16_Max_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_UInt16_Min_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_UInt16_smallbuf_Number_json_encode); |
| |
| tcase_add_test(tc_json_encode, UA_Int16_Max_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Int16_Min_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Int16_Zero_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Int16_smallbuf_Number_json_encode); |
| |
| |
| tcase_add_test(tc_json_encode, UA_UInt32_Max_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_UInt32_Min_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_UInt32_smallbuf_Number_json_encode); |
| |
| tcase_add_test(tc_json_encode, UA_Int32_Max_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Int32_Min_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Int32_Zero_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Int32_smallbuf_Number_json_encode); |
| |
| |
| tcase_add_test(tc_json_encode, UA_UInt64_Max_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_UInt64_Min_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_UInt64_smallbuf_Number_json_encode); |
| |
| tcase_add_test(tc_json_encode, UA_Int64_Max_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Int64_Min_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Int64_Zero_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Int64_smallbuf_Number_json_encode); |
| |
| //Double Float |
| tcase_add_test(tc_json_encode, UA_Double_json_encode); |
| tcase_add_test(tc_json_encode, UA_Double_onesmallest_json_encode); |
| tcase_add_test(tc_json_encode, UA_Double_pluszero_json_encode); |
| tcase_add_test(tc_json_encode, UA_Double_minuszero_json_encode); |
| tcase_add_test(tc_json_encode, UA_Double_plusInf_json_encode); |
| tcase_add_test(tc_json_encode, UA_Double_minusInf_json_encode); |
| tcase_add_test(tc_json_encode, UA_Double_nan_json_encode); |
| tcase_add_test(tc_json_encode, UA_Float_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_Float_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_DoubleInf_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_DoubleNan_json_encode); |
| |
| |
| |
| //LocalizedText |
| tcase_add_test(tc_json_encode, UA_LocText_json_encode); |
| tcase_add_test(tc_json_encode, UA_LocText_NonReversible_json_encode); |
| tcase_add_test(tc_json_encode, UA_LocText_smallBuffer_json_encode); |
| |
| //Guid |
| tcase_add_test(tc_json_encode, UA_Guid_json_encode); |
| tcase_add_test(tc_json_encode, UA_Guid_smallbuf_json_encode); |
| |
| //DateTime |
| tcase_add_test(tc_json_encode, UA_DateTime_json_encode); |
| tcase_add_test(tc_json_encode, UA_DateTime_with_nanoseconds_json_encode); |
| |
| |
| //StatusCode |
| tcase_add_test(tc_json_encode, UA_StatusCode_json_encode); |
| tcase_add_test(tc_json_encode, UA_StatusCode_nonReversible_json_encode); |
| tcase_add_test(tc_json_encode, UA_StatusCode_nonReversible_good_json_encode); |
| tcase_add_test(tc_json_encode, UA_StatusCode_smallbuf_json_encode); |
| |
| |
| //NodeId |
| tcase_add_test(tc_json_encode, UA_NodeId_Numeric_json_encode); |
| tcase_add_test(tc_json_encode, UA_NodeId_Numeric_Namespace_json_encode); |
| |
| tcase_add_test(tc_json_encode, UA_NodeId_String_json_encode); |
| tcase_add_test(tc_json_encode, UA_NodeId_String_Namespace_json_encode); |
| tcase_add_test(tc_json_encode, UA_NodeId_Guid_json_encode); |
| tcase_add_test(tc_json_encode, UA_NodeId_Guid_Namespace_json_encode); |
| |
| tcase_add_test(tc_json_encode, UA_NodeId_ByteString_json_encode); |
| tcase_add_test(tc_json_encode, UA_NodeId_ByteString_Namespace_json_encode); |
| |
| tcase_add_test(tc_json_encode, UA_NodeId_NonReversible_Numeric_Namespace_json_encode); |
| |
| //ExpandedNodeId |
| tcase_add_test(tc_json_encode, UA_ExpandedNodeId_json_encode); |
| tcase_add_test(tc_json_encode, UA_ExpandedNodeId_MissingNamespaceUri_json_encode); |
| tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_Ns1_json_encode); |
| tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_Namespace_json_encode); |
| tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_NamespaceUriGiven_json_encode); |
| |
| |
| //DiagnosticInfo |
| tcase_add_test(tc_json_encode, UA_DiagInfo_json_encode); |
| tcase_add_test(tc_json_encode, UA_DiagInfo_withInner_json_encode); |
| tcase_add_test(tc_json_encode, UA_DiagInfo_withTwoInner_json_encode); |
| tcase_add_test(tc_json_encode, UA_DiagInfo_noFields_json_encode); |
| tcase_add_test(tc_json_encode, UA_DiagInfo_smallBuffer_json_encode); |
| |
| |
| //ByteString |
| tcase_add_test(tc_json_encode, UA_ByteString_json_encode); |
| tcase_add_test(tc_json_encode, UA_ByteString2_json_encode); |
| tcase_add_test(tc_json_encode, UA_ByteString3_json_encode); |
| |
| |
| //QualifiedName |
| tcase_add_test(tc_json_encode, UA_QualName_json_encode); |
| tcase_add_test(tc_json_encode, UA_QualName_NonReversible_json_encode); |
| tcase_add_test(tc_json_encode, UA_QualName_NonReversible_Namespace_json_encode); |
| tcase_add_test(tc_json_encode, UA_QualName_NonReversible_NoNamespaceAsNumber_json_encode); |
| |
| //Variant -REVERSIBLE- |
| tcase_add_test(tc_json_encode, UA_Variant_Bool_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_Number_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_Double_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_Double2_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_Double3_json_encode); |
| |
| tcase_add_test(tc_json_encode, UA_Variant_NodeId_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_LocText_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_QualName_json_encode); |
| |
| //Array |
| tcase_add_test(tc_json_encode, UA_Variant_Array_UInt16_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_Array_Byte_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_Array_String_json_encode); |
| |
| //Matrix |
| tcase_add_test(tc_json_encode, UA_Variant_Matrix_UInt16_json_encode); |
| |
| //Wrap |
| tcase_add_test(tc_json_encode, UA_Variant_Wrap_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_Wrap_Array_json_encode); |
| |
| //Variant -NON-REVERSIBLE- |
| tcase_add_test(tc_json_encode, UA_Variant_StatusCode_NonReversible_json_encode); |
| |
| //Array |
| tcase_add_test(tc_json_encode, UA_Variant_Array_String_NonReversible_json_encode); |
| |
| //Matrix |
| tcase_add_test(tc_json_encode, UA_Variant_Matrix_String_NonReversible_json_encode); |
| tcase_add_test(tc_json_encode, UA_Variant_Matrix_NodeId_NonReversible_json_encode); |
| |
| //Wrap non reversible |
| tcase_add_test(tc_json_encode, UA_Variant_Wrap_Array_NonReversible_json_encode); |
| |
| |
| //ExtensionObject |
| tcase_add_test(tc_json_encode, UA_ExtensionObject_json_encode); |
| tcase_add_test(tc_json_encode, UA_ExtensionObject_xml_json_encode); |
| tcase_add_test(tc_json_encode, UA_ExtensionObject_byteString_json_encode); |
| |
| tcase_add_test(tc_json_encode, UA_ExtensionObject_NonReversible_StatusCode_json_encode); |
| |
| //DataValue |
| tcase_add_test(tc_json_encode, UA_DataValue_json_encode); |
| tcase_add_test(tc_json_encode, UA_DataValue_null_json_encode); |
| |
| tcase_add_test(tc_json_encode, UA_MessageReadResponse_json_encode); |
| tcase_add_test(tc_json_encode, UA_ViewDescription_json_encode); |
| tcase_add_test(tc_json_encode, UA_WriteRequest_json_encode); |
| tcase_add_test(tc_json_encode, UA_VariableAttributes_json_encode); |
| |
| suite_add_tcase(s, tc_json_encode); |
| |
| TCase *tc_json_decode = tcase_create("json_decode"); |
| |
| |
| tcase_add_test(tc_json_decode, UA_SByte_Min_json_decode); |
| tcase_add_test(tc_json_decode, UA_SByte_Max_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_Byte_Min_json_decode); |
| tcase_add_test(tc_json_decode, UA_Byte_Max_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_Int16_Min_json_decode); |
| tcase_add_test(tc_json_decode, UA_Int16_Max_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_UInt16_Min_json_decode); |
| tcase_add_test(tc_json_decode, UA_UInt16_Max_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_UInt32_Min_json_decode); |
| tcase_add_test(tc_json_decode, UA_UInt32_Max_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_Int32_Min_json_decode); |
| tcase_add_test(tc_json_decode, UA_Int32_Max_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_Int64_Min_json_decode); |
| tcase_add_test(tc_json_decode, UA_Int64_Max_json_decode); |
| tcase_add_test(tc_json_decode, UA_Int64_Overflow_json_decode); |
| tcase_add_test(tc_json_decode, UA_Int64_TooBig_json_decode); |
| tcase_add_test(tc_json_decode, UA_Int64_NoDigit_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_UInt64_Min_json_decode); |
| tcase_add_test(tc_json_decode, UA_UInt64_Max_json_decode); |
| tcase_add_test(tc_json_decode, UA_UInt64_Overflow_json_decode); |
| |
| |
| |
| tcase_add_test(tc_json_decode, UA_Float_json_decode); |
| tcase_add_test(tc_json_decode, UA_Float_json_one_decode); |
| |
| tcase_add_test(tc_json_decode, UA_Float_json_inf_decode); |
| tcase_add_test(tc_json_decode, UA_Float_json_neginf_decode); |
| tcase_add_test(tc_json_decode, UA_Float_json_nan_decode); |
| tcase_add_test(tc_json_decode, UA_Float_json_negnan_decode); |
| |
| |
| tcase_add_test(tc_json_decode, UA_Double_json_decode); |
| tcase_add_test(tc_json_decode, UA_Double_one_json_decode); |
| tcase_add_test(tc_json_decode, UA_Double_corrupt_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_Double_onepointsmallest_json_decode); |
| tcase_add_test(tc_json_decode, UA_Double_nan_json_decode); |
| tcase_add_test(tc_json_decode, UA_Double_negnan_json_decode); |
| tcase_add_test(tc_json_decode, UA_Double_negzero_json_decode); |
| tcase_add_test(tc_json_decode, UA_Double_zero_json_decode); |
| tcase_add_test(tc_json_decode, UA_Double_inf_json_decode); |
| tcase_add_test(tc_json_decode, UA_Double_neginf_json_decode); |
| |
| |
| //String |
| tcase_add_test(tc_json_decode, UA_String_json_decode); |
| tcase_add_test(tc_json_decode, UA_String_empty_json_decode); |
| tcase_add_test(tc_json_decode, UA_String_unescapeBS_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_String_escape_unicode_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_String_escape2_json_decode); |
| tcase_add_test(tc_json_decode, UA_String_surrogatePair_json_decode); |
| |
| //ByteString |
| tcase_add_test(tc_json_decode, UA_ByteString_json_decode); |
| tcase_add_test(tc_json_decode, UA_ByteString_bad_json_decode); |
| tcase_add_test(tc_json_decode, UA_ByteString_null_json_decode); |
| |
| |
| //DateTime |
| tcase_add_test(tc_json_decode, UA_DateTime_json_decode); |
| tcase_add_test(tc_json_decode, UA_DateTime_micro_json_decode); |
| |
| |
| //Guid |
| tcase_add_test(tc_json_decode, UA_Guid_json_decode); |
| tcase_add_test(tc_json_decode, UA_Guid_lower_json_decode); |
| tcase_add_test(tc_json_decode, UA_Guid_tooShort_json_decode); |
| tcase_add_test(tc_json_decode, UA_Guid_tooLong_json_decode); |
| tcase_add_test(tc_json_decode, UA_Guid_wrong_json_decode); |
| |
| |
| //StatusCode |
| tcase_add_test(tc_json_decode, UA_StatusCode_2_json_decode); |
| tcase_add_test(tc_json_decode, UA_StatusCode_3_json_decode); |
| tcase_add_test(tc_json_decode, UA_StatusCode_0_json_decode); |
| |
| |
| //QualName |
| tcase_add_test(tc_json_decode, UA_QualifiedName_json_decode); |
| tcase_add_test(tc_json_decode, UA_QualifiedName_null_json_decode); |
| |
| |
| //LocalizedText |
| tcase_add_test(tc_json_decode, UA_LocalizedText_json_decode); |
| tcase_add_test(tc_json_decode, UA_LocalizedText_missing_json_decode); |
| tcase_add_test(tc_json_decode, UA_LocalizedText_null_json_decode); |
| |
| |
| //-NodeId- |
| tcase_add_test(tc_json_decode, UA_NodeId_Nummeric_json_decode); |
| tcase_add_test(tc_json_decode, UA_NodeId_Nummeric_Namespace_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_NodeId_String_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_NodeId_Guid_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_NodeId_ByteString_json_decode); |
| |
| |
| //expandednodeid |
| tcase_add_test(tc_json_decode, UA_ExpandedNodeId_Nummeric_json_decode); |
| tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_json_decode); |
| tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_Namespace_json_decode); |
| tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_NamespaceAsIndex_json_decode); |
| tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_Namespace_ServerUri_json_decode); |
| tcase_add_test(tc_json_decode, UA_ExpandedNodeId_ByteString_json_decode); |
| |
| //Diaginfo |
| tcase_add_test(tc_json_decode, UA_DiagnosticInfo_json_decode); |
| tcase_add_test(tc_json_decode, UA_DiagnosticInfo_null_json_decode); |
| |
| |
| //Variant |
| tcase_add_test(tc_json_decode, UA_VariantBool_json_decode); |
| tcase_add_test(tc_json_decode, UA_VariantBoolNull_json_decode); |
| tcase_add_test(tc_json_decode, UA_VariantStringArray_json_decode); |
| tcase_add_test(tc_json_decode, UA_VariantStringArrayNull_json_decode); |
| tcase_add_test(tc_json_decode, UA_VariantLocalizedTextArrayNull_json_decode); |
| tcase_add_test(tc_json_decode, UA_VariantVariantArrayNull_json_decode); |
| tcase_add_test(tc_json_decode, UA_VariantVariantArrayEmpty_json_decode); |
| tcase_add_test(tc_json_decode, UA_VariantStringArray_WithoutDimension_json_decode); |
| tcase_add_test(tc_json_decode, UA_Variant_BooleanArray_json_decode); |
| tcase_add_test(tc_json_decode, UA_Variant_bad1_json_decode); |
| tcase_add_test(tc_json_decode, UA_Variant_ExtensionObjectWrap_json_decode); |
| |
| //DataValue |
| tcase_add_test(tc_json_decode, UA_DataValue_json_decode); |
| tcase_add_test(tc_json_decode, UA_DataValueMissingFields_json_decode); |
| tcase_add_test(tc_json_decode, UA_DataValue_null_json_decode); |
| |
| //extensionobject |
| tcase_add_test(tc_json_decode, UA_ExtensionObject_json_decode); |
| tcase_add_test(tc_json_decode, UA_ExtensionObject_EncodedByteString_json_decode); |
| tcase_add_test(tc_json_decode, UA_ExtensionObject_EncodedXml_json_decode); |
| tcase_add_test(tc_json_decode, UA_ExtensionObject_Unkown_json_decode); |
| |
| |
| //Others |
| tcase_add_test(tc_json_decode, UA_duplicate_json_decode); |
| tcase_add_test(tc_json_decode, UA_wrongBoolean_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_ViewDescription_json_decode); |
| tcase_add_test(tc_json_decode, UA_DataTypeAttributes_json_decode); |
| |
| |
| tcase_add_test(tc_json_decode, UA_VariantStringArrayBad_shouldFreeArray_json_decode); |
| tcase_add_test(tc_json_decode, UA_VariantFuzzer1_json_decode); |
| tcase_add_test(tc_json_decode, UA_VariantFuzzer2_json_decode); |
| |
| tcase_add_test(tc_json_decode, UA_Variant_Bad_Type_decode); |
| tcase_add_test(tc_json_decode, UA_Variant_Bad_Type2_decode); |
| |
| tcase_add_test(tc_json_decode, UA_Variant_Null_decode); |
| |
| |
| tcase_add_test(tc_json_decode, UA_Variant_Malformed_decode); |
| tcase_add_test(tc_json_decode, UA_Variant_Malformed2_decode); |
| |
| |
| suite_add_tcase(s, tc_json_decode); |
| |
| TCase *tc_json_helper = tcase_create("json_helper"); |
| tcase_add_test(tc_json_decode, UA_JsonHelper); |
| suite_add_tcase(s, tc_json_helper); |
| return s; |
| } |
| |
| int main(void) { |
| int number_failed = 0; |
| Suite *s; |
| SRunner *sr; |
| |
| s = testSuite_builtin_json(); |
| sr = srunner_create(s); |
| srunner_set_fork_status(sr, CK_NOFORK); |
| srunner_run_all(sr, CK_NORMAL); |
| number_failed += srunner_ntests_failed(sr); |
| srunner_free(sr); |
| return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; |
| } |
| |