| /* 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/. |
| * |
| * Copyright (c) 2017 - 2018 Fraunhofer IOSB (Author: Tino Bischoff) |
| */ |
| |
| #include <open62541/client.h> |
| #include <open62541/types.h> |
| |
| #include "ua_pubsub_networkmessage.h" |
| |
| #include "check.h" |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS1ValueVariantKeyFrame) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| UA_DataSetMessage dmkf; |
| memset(&dmkf, 0, sizeof(UA_DataSetMessage)); |
| dmkf.header.dataSetMessageValid = true; |
| dmkf.header.fieldEncoding = UA_FIELDENCODING_VARIANT; |
| dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; |
| dmkf.data.keyFrameData.fieldCount = 1; |
| dmkf.data.keyFrameData.dataSetFields = |
| (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]); |
| |
| UA_Int32 iv = 27; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_INT32]); |
| dmkf.data.keyFrameData.dataSetFields[0].hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmkf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| //if (rv == UA_STATUSCODE_GOOD) { |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, 1); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]); |
| ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data, iv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| |
| //} |
| |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS1ValueDataValueKeyFrame) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| UA_DataSetMessage dmkf; |
| memset(&dmkf, 0, sizeof(UA_DataSetMessage)); |
| dmkf.header.dataSetMessageValid = true; |
| dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; |
| dmkf.data.keyFrameData.fieldCount = 1; |
| dmkf.data.keyFrameData.dataSetFields = |
| (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]); |
| |
| UA_Int32 iv = 27; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_INT32]); |
| dmkf.data.keyFrameData.dataSetFields[0].hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmkf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| //if (rv == UA_STATUSCODE_GOOD) { |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, 1); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]); |
| ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data, iv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| |
| //} |
| |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrame) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| UA_DataSetMessage dmkf; |
| memset(&dmkf, 0, sizeof(UA_DataSetMessage)); |
| dmkf.header.dataSetMessageValid = true; |
| dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; |
| UA_UInt16 anzFields = 2; |
| dmkf.data.keyFrameData.fieldCount = anzFields; |
| dmkf.data.keyFrameData.dataSetFields = |
| (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[1]); |
| |
| UA_Double dv = 231.3; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &dv, &UA_TYPES[UA_TYPES_DOUBLE]); |
| dmkf.data.keyFrameData.dataSetFields[0].hasValue = true; |
| |
| UA_UInt64 uiv = 98412; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[1].value, &uiv, &UA_TYPES[UA_TYPES_UINT64]); |
| dmkf.data.keyFrameData.dataSetFields[1].hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmkf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, anzFields); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_DOUBLE]); |
| ck_assert(*(UA_Double*)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data == dv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT64]); |
| ck_assert_uint_eq(*(UA_UInt64 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data, uiv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[1]); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueKeyFrame) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| UA_DataSetMessage dmkf; |
| memset(&dmkf, 0, sizeof(UA_DataSetMessage)); |
| dmkf.header.dataSetMessageValid = true; |
| dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; |
| UA_UInt16 anzFields = 2; |
| dmkf.data.keyFrameData.fieldCount = anzFields; |
| dmkf.data.keyFrameData.dataSetFields = |
| (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[1]); |
| |
| UA_Double dv = 231.3; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &dv, &UA_TYPES[UA_TYPES_DOUBLE]); |
| dmkf.data.keyFrameData.dataSetFields[0].hasValue = true; |
| |
| UA_UInt64 uiv = 98412; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[1].value, &uiv, &UA_TYPES[UA_TYPES_UINT64]); |
| dmkf.data.keyFrameData.dataSetFields[1].hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmkf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, anzFields); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_DOUBLE]); |
| ck_assert(*(UA_Double*)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data == dv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT64]); |
| ck_assert_uint_eq(*(UA_UInt64 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data, uiv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[1]); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS1ValueVariantDeltaFrame) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| UA_DataSetMessage dmdf; |
| memset(&dmdf, 0, sizeof(UA_DataSetMessage)); |
| dmdf.header.dataSetMessageValid = true; |
| dmdf.header.fieldEncoding = UA_FIELDENCODING_VARIANT; |
| dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME; |
| dmdf.data.deltaFrameData.fieldCount = 1; |
| size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount; |
| dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize); |
| |
| UA_UInt16 fieldIndex = 1; |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex; |
| UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| |
| UA_Int32 iv = 58; |
| UA_Variant_setScalarCopy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]); |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmdf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 1); |
| ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]); |
| ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| |
| UA_DataValue_deleteMembers(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_free(dmdf.data.deltaFrameData.deltaFrameFields); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS1ValueDataValueDeltaFrame) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| UA_DataSetMessage dmdf; |
| memset(&dmdf, 0, sizeof(UA_DataSetMessage)); |
| dmdf.header.dataSetMessageValid = true; |
| dmdf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME; |
| dmdf.data.deltaFrameData.fieldCount = 1; |
| size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount; |
| dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize); |
| |
| UA_UInt16 fieldIndex = 1; |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex; |
| UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| |
| UA_Int32 iv = 197; |
| UA_Variant_setScalarCopy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]); |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmdf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 1); |
| ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]); |
| ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| |
| UA_DataValue_deleteMembers(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_free(dmdf.data.deltaFrameData.deltaFrameFields); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_Encode_WithBufferTooSmallShallReturnError) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| UA_DataSetMessage dmkf; |
| memset(&dmkf, 0, sizeof(UA_DataSetMessage)); |
| dmkf.header.dataSetMessageValid = true; |
| dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; |
| dmkf.data.keyFrameData.fieldCount = 1; |
| dmkf.data.keyFrameData.dataSetFields = |
| (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]); |
| |
| UA_Int32 iv = 27; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_INT32]); |
| dmkf.data.keyFrameData.dataSetFields[0].hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmkf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| |
| // to generate an error we make the buffer too small |
| msgSize -= 5; |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_ne(rv, UA_STATUSCODE_GOOD); |
| |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_Decode_WithBufferTooSmallShallReturnError) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| UA_DataSetMessage dmkf; |
| memset(&dmkf, 0, sizeof(UA_DataSetMessage)); |
| dmkf.header.dataSetMessageValid = true; |
| dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; |
| dmkf.data.keyFrameData.fieldCount = 1; |
| dmkf.data.keyFrameData.dataSetFields = |
| (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]); |
| |
| UA_Int32 iv = 27; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_INT32]); |
| dmkf.data.keyFrameData.dataSetFields[0].hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmkf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| UA_ByteString buffer2; |
| UA_ByteString_init(&buffer2); |
| size_t shortLength = buffer.length - 4; |
| UA_ByteString_allocBuffer(&buffer2, shortLength); |
| for (size_t i = 0; i < shortLength; i++) |
| { |
| buffer2.data[i] = buffer.data[i]; |
| } |
| |
| rv = UA_NetworkMessage_decodeBinary(&buffer2, &offset, &m2); |
| ck_assert_int_ne(rv, UA_STATUSCODE_GOOD); |
| |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_ByteString_deleteMembers(&buffer2); |
| UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantDeltaFrame) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| UA_DataSetMessage dmdf; |
| memset(&dmdf, 0, sizeof(UA_DataSetMessage)); |
| dmdf.header.dataSetMessageValid = true; |
| dmdf.header.fieldEncoding = UA_FIELDENCODING_VARIANT; |
| dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME; |
| dmdf.data.deltaFrameData.fieldCount = 2; |
| size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount; |
| dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize); |
| |
| UA_UInt16 fieldIndex1 = 1; |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex1; |
| UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| UA_UInt16 fieldIndex2 = 3; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldIndex = fieldIndex2; |
| UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue); |
| |
| UA_Int32 iv = 58; |
| UA_Variant_setScalar(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]); |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true; |
| |
| UA_String testString = (UA_String) { 5, (UA_Byte*)"OPCUA" }; |
| UA_Variant value; |
| UA_Variant_init(&value); |
| value.data = UA_malloc(sizeof(UA_String)); |
| *((UA_String*)value.data) = testString; |
| value.type = &UA_TYPES[UA_TYPES_STRING]; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.value = value; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmdf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 2); |
| ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex1); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]); |
| ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp); |
| |
| ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldIndex, fieldIndex2); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue); |
| // compare string value |
| UA_String decodedString = *(UA_String*)(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.data); |
| for (UA_Int32 i = 0; i < 5; i++) |
| { |
| ck_assert_int_eq(decodedString.data[i], testString.data[i]); |
| } |
| ck_assert_int_eq(decodedString.length, testString.length); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp); |
| |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| |
| ((UA_String*)value.data)->data = NULL; // the string is statically allocated. do not free it. |
| UA_Variant_deleteMembers(&value); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_free(dmdf.data.deltaFrameData.deltaFrameFields); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueDeltaFrame) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| UA_DataSetMessage dmdf; |
| memset(&dmdf, 0, sizeof(UA_DataSetMessage)); |
| dmdf.header.dataSetMessageValid = true; |
| dmdf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME; |
| dmdf.data.deltaFrameData.fieldCount = 2; |
| size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount; |
| dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize); |
| |
| UA_UInt16 fieldIndex1 = 1; |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex1; |
| UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| UA_UInt16 fieldIndex2 = 3; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldIndex = fieldIndex2; |
| UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue); |
| |
| UA_Int32 iv = 193; |
| UA_Variant_setScalarCopy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]); |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true; |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.sourceTimestamp = UA_DateTime_now(); |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp = true; |
| |
| UA_String testString = (UA_String) { 5, (UA_Byte*)"OPCUA" }; |
| UA_Variant value; |
| UA_Variant_init(&value); |
| value.data = UA_malloc(sizeof(UA_String)); |
| *((UA_String*)value.data) = testString; |
| value.type = &UA_TYPES[UA_TYPES_STRING]; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.value = value; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmdf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 2); |
| ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex1); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]); |
| ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp); |
| |
| ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldIndex, fieldIndex2); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue); |
| // compare string value |
| UA_String decodedString = *(UA_String*)(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.data); |
| for (UA_Int32 i = 0; i < 5; i++) |
| { |
| ck_assert_int_eq(decodedString.data[i], testString.data[i]); |
| } |
| ck_assert_int_eq(decodedString.length, testString.length); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp); |
| |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| |
| ((UA_String*)value.data)->data = NULL; // the string is statically allocated. do not free it. |
| UA_Variant_deleteMembers(&value); |
| UA_DataValue_deleteMembers(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_free(dmdf.data.deltaFrameData.deltaFrameFields); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrameGroupHeader) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| m.groupHeaderEnabled = true; |
| m.groupHeader.writerGroupIdEnabled = true; |
| UA_UInt16 writerGroupId = 17; |
| m.groupHeader.writerGroupId = writerGroupId; |
| m.groupHeader.groupVersionEnabled = true; |
| UA_UInt32 groupVersion = 573354747; // das sollte irgendwann 2018 sein |
| m.groupHeader.groupVersion = groupVersion; |
| |
| UA_DataSetMessage dmkf; |
| memset(&dmkf, 0, sizeof(UA_DataSetMessage)); |
| dmkf.header.dataSetMessageValid = true; |
| dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; |
| |
| UA_UInt16 anzFields = 2; |
| dmkf.data.keyFrameData.fieldCount = anzFields; |
| dmkf.data.keyFrameData.dataSetFields = |
| (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[1]); |
| |
| UA_Double dv = 231.3; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &dv, &UA_TYPES[UA_TYPES_DOUBLE]); |
| dmkf.data.keyFrameData.dataSetFields[0].hasValue = true; |
| |
| UA_UInt64 uiv = 98412; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[1].value, &uiv, &UA_TYPES[UA_TYPES_UINT64]); |
| dmkf.data.keyFrameData.dataSetFields[1].hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmkf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.groupHeader.writerGroupIdEnabled == m2.groupHeader.writerGroupIdEnabled); |
| ck_assert(m.groupHeader.groupVersionEnabled == m2.groupHeader.groupVersionEnabled); |
| ck_assert(m.groupHeader.networkMessageNumberEnabled == m2.groupHeader.networkMessageNumberEnabled); |
| ck_assert(m.groupHeader.sequenceNumberEnabled == m2.groupHeader.sequenceNumberEnabled); |
| ck_assert_uint_eq(m2.groupHeader.writerGroupId, writerGroupId); |
| ck_assert_uint_eq(m2.groupHeader.groupVersion, groupVersion); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, anzFields); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_uint_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_DOUBLE]); |
| ck_assert(*(UA_Double*)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data == dv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_uint_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT64]); |
| ck_assert_uint_eq(*(UA_UInt64 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data, uiv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[1]); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantDeltaFramePublDSCID) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| m.publisherIdEnabled = true; |
| m.publisherIdType = UA_PUBLISHERDATATYPE_UINT32; |
| UA_UInt32 publisherId = 1469; |
| m.publisherId.publisherIdUInt32 = publisherId; |
| m.dataSetClassIdEnabled = true; |
| UA_Guid dataSetClassId = UA_Guid_random(); |
| m.dataSetClassId = dataSetClassId; |
| |
| UA_DataSetMessage dmdf; |
| memset(&dmdf, 0, sizeof(UA_DataSetMessage)); |
| dmdf.header.dataSetMessageValid = true; |
| dmdf.header.fieldEncoding = UA_FIELDENCODING_VARIANT; |
| dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME; |
| dmdf.data.deltaFrameData.fieldCount = 2; |
| size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount; |
| dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize); |
| |
| UA_UInt16 fieldIndex1 = 1; |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex1; |
| UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| UA_UInt16 fieldIndex2 = 3; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldIndex = fieldIndex2; |
| UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue); |
| |
| UA_Int32 iv = 58; |
| UA_Variant_setScalarCopy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]); |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true; |
| |
| UA_String testString = (UA_String) { 5, (UA_Byte*)"OPCUA" }; |
| UA_Variant value; |
| UA_Variant_init(&value); |
| value.data = UA_malloc(sizeof(UA_String)); |
| *((UA_String*)value.data) = testString; |
| value.type = &UA_TYPES[UA_TYPES_STRING]; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.value = value; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmdf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(UA_Guid_equal(&m.dataSetClassId, &m2.dataSetClassId) == true); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert_int_eq(m2.publisherIdType, m.publisherIdType); |
| ck_assert_uint_eq(m2.publisherId.publisherIdUInt32, publisherId); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 2); |
| ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex1); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]); |
| ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp); |
| |
| ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldIndex, fieldIndex2); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue); |
| // compare string value |
| UA_String decodedString = *(UA_String*)(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.data); |
| for (UA_Int32 i = 0; i < 5; i++) |
| { |
| ck_assert_int_eq(decodedString.data[i], testString.data[i]); |
| } |
| ck_assert_int_eq(decodedString.length, testString.length); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp); |
| |
| ((UA_String*)value.data)->data = NULL; // the string is statically allocated. do not free it. |
| UA_Variant_deleteMembers(&value); |
| UA_DataValue_deleteMembers(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_free(dmdf.data.deltaFrameData.deltaFrameFields); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueKeyFramePH) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| m.payloadHeaderEnabled = true; |
| m.payloadHeader.dataSetPayloadHeader.count = 1; |
| m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = (UA_UInt16 *)UA_Array_new(m.payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]); |
| UA_UInt16 dataSetWriterId = 1698; |
| m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0] = dataSetWriterId; |
| |
| UA_DataSetMessage dmkf; |
| memset(&dmkf, 0, sizeof(UA_DataSetMessage)); |
| dmkf.header.dataSetMessageValid = true; |
| dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; |
| UA_UInt16 anzFields = 2; |
| dmkf.data.keyFrameData.fieldCount = anzFields; |
| dmkf.data.keyFrameData.dataSetFields = |
| (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[1]); |
| |
| UA_Double dv = 231.3; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &dv, &UA_TYPES[UA_TYPES_DOUBLE]); |
| dmkf.data.keyFrameData.dataSetFields[0].hasValue = true; |
| |
| UA_UInt64 uiv = 98412; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[1].value, &uiv, &UA_TYPES[UA_TYPES_UINT64]); |
| dmkf.data.keyFrameData.dataSetFields[1].hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmkf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert_uint_eq(m.payloadHeader.dataSetPayloadHeader.count, 1); |
| ck_assert_uint_eq(m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0], dataSetWriterId); |
| |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, anzFields); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_DOUBLE]); |
| ck_assert(*(UA_Double*)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data == dv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT64]); |
| ck_assert_uint_eq(*(UA_UInt64 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data, uiv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| |
| UA_Array_delete(m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds, m.payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]); |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[1]); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrameTSProm) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| m.timestampEnabled = true; |
| UA_DateTime ts = UA_DateTime_now(); |
| m.timestamp = ts; |
| m.promotedFieldsEnabled = true; |
| m.promotedFieldsSize = 1; |
| m.promotedFields = (UA_Variant*)UA_Array_new(m.promotedFieldsSize, &UA_TYPES[UA_TYPES_VARIANT]); |
| |
| UA_DataSetMessage dmkf; |
| memset(&dmkf, 0, sizeof(UA_DataSetMessage)); |
| dmkf.header.dataSetMessageValid = true; |
| dmkf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| dmkf.header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; |
| UA_UInt16 anzFields = 2; |
| dmkf.data.keyFrameData.fieldCount = anzFields; |
| dmkf.data.keyFrameData.dataSetFields = |
| (UA_DataValue*)UA_Array_new(dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_DataValue_init(&dmkf.data.keyFrameData.dataSetFields[1]); |
| |
| UA_Double dv = 231.3; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[0].value, &dv, &UA_TYPES[UA_TYPES_DOUBLE]); |
| dmkf.data.keyFrameData.dataSetFields[0].hasValue = true; |
| |
| UA_Variant_copy(&dmkf.data.keyFrameData.dataSetFields[0].value, &m.promotedFields[0]); |
| |
| UA_UInt64 uiv = 98412; |
| UA_Variant_setScalarCopy(&dmkf.data.keyFrameData.dataSetFields[1].value, &uiv, &UA_TYPES[UA_TYPES_UINT64]); |
| dmkf.data.keyFrameData.dataSetFields[1].hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmkf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert_int_eq(m.timestamp, ts); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert_uint_eq(m2.promotedFieldsSize, 1); |
| ck_assert(*((UA_Double*)m2.promotedFields[0].data) == dv); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, anzFields); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_DOUBLE]); |
| ck_assert(*(UA_Double*)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data == dv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT64]); |
| ck_assert_uint_eq(*(UA_UInt64 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].value.data, uiv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[1].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| |
| UA_Array_delete(m.promotedFields, m.promotedFieldsSize, &UA_TYPES[UA_TYPES_VARIANT]); |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[0]); |
| UA_DataValue_deleteMembers(&dmkf.data.keyFrameData.dataSetFields[1]); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueDeltaFrameGHProm2) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| m.groupHeaderEnabled = true; |
| m.groupHeader.networkMessageNumberEnabled = true; |
| UA_UInt16 networkMessageNumber = 2175; |
| m.groupHeader.networkMessageNumber = networkMessageNumber; |
| |
| m.promotedFieldsEnabled = true; |
| m.promotedFieldsSize = 2; |
| m.promotedFields = (UA_Variant*)UA_Array_new(m.promotedFieldsSize, &UA_TYPES[UA_TYPES_VARIANT]); |
| |
| UA_DataSetMessage dmdf; |
| memset(&dmdf, 0, sizeof(UA_DataSetMessage)); |
| dmdf.header.dataSetMessageValid = true; |
| dmdf.header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| dmdf.header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME; |
| dmdf.data.deltaFrameData.fieldCount = 2; |
| size_t memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * dmdf.data.deltaFrameData.fieldCount; |
| dmdf.data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize); |
| |
| UA_UInt16 fieldIndex1 = 1; |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex1; |
| UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| UA_UInt16 fieldIndex2 = 3; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldIndex = fieldIndex2; |
| UA_DataValue_init(&dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue); |
| |
| UA_Int32 iv = 1573; |
| UA_Variant_setScalarCopy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &iv, &UA_TYPES[UA_TYPES_INT32]); |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true; |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.sourceTimestamp = UA_DateTime_now(); |
| dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp = true; |
| |
| UA_Variant_copy(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &m.promotedFields[0]); |
| |
| UA_Float fv = 197.34f; |
| UA_Variant_setScalarCopy(&m.promotedFields[1], &fv, &UA_TYPES[UA_TYPES_FLOAT]); |
| |
| UA_String testString = (UA_String) { 5, (UA_Byte*)"OPC24" }; |
| UA_Variant value; |
| UA_Variant_init(&value); |
| value.data = UA_malloc(sizeof(UA_String)); |
| *((UA_String*)value.data) = testString; |
| value.type = &UA_TYPES[UA_TYPES_STRING]; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.value = value; |
| dmdf.data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages = &dmdf; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.groupHeader.writerGroupIdEnabled == m2.groupHeader.writerGroupIdEnabled); |
| ck_assert(m.groupHeader.groupVersionEnabled == m2.groupHeader.groupVersionEnabled); |
| ck_assert(m.groupHeader.networkMessageNumberEnabled == m2.groupHeader.networkMessageNumberEnabled); |
| ck_assert_uint_eq(m2.groupHeader.networkMessageNumber, networkMessageNumber); |
| ck_assert(m.groupHeader.sequenceNumberEnabled == m2.groupHeader.sequenceNumberEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert_uint_eq(m2.promotedFieldsSize, 2); |
| ck_assert_int_eq(*((UA_Int32*)m2.promotedFields[0].data), iv); |
| ck_assert(*((UA_Float*)m2.promotedFields[1].data) == fv); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.fieldCount, 2); |
| ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex1); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue); |
| ck_assert_int_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]); |
| ck_assert_int_eq(*(UA_Int32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, iv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp); |
| |
| ck_assert_int_eq(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldIndex, fieldIndex2); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue); |
| // compare string value |
| UA_String decodedString = *(UA_String*)(m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.data); |
| for (UA_Int32 i = 0; i < 5; i++) |
| { |
| ck_assert_int_eq(decodedString.data[i], testString.data[i]); |
| } |
| ck_assert_int_eq(decodedString.length, testString.length); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp); |
| |
| UA_Array_delete(m.promotedFields, m.promotedFieldsSize, &UA_TYPES[UA_TYPES_VARIANT]); |
| ((UA_String*)value.data)->data = NULL; // the string is statically allocated. do not free it. |
| UA_Variant_deleteMembers(&value); |
| UA_DataValue_deleteMembers(&dmdf.data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_free(dmdf.data.deltaFrameData.deltaFrameFields); |
| } |
| END_TEST |
| |
| START_TEST(UA_PubSub_EnDecode_ShallWorkOn2DSVariant) { |
| UA_NetworkMessage m; |
| memset(&m, 0, sizeof(UA_NetworkMessage)); |
| m.version = 1; |
| m.networkMessageType = UA_NETWORKMESSAGE_DATASET; |
| m.payloadHeaderEnabled = true; |
| m.payloadHeader.dataSetPayloadHeader.count = 2; |
| UA_UInt16 dsWriter1 = 4; |
| UA_UInt16 dsWriter2 = 7; |
| m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds = (UA_UInt16 *)UA_Array_new(m.payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]); |
| m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0] = dsWriter1; |
| m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[1] = dsWriter2; |
| |
| size_t memsize = m.payloadHeader.dataSetPayloadHeader.count * sizeof(UA_DataSetMessage); |
| m.payload.dataSetPayload.dataSetMessages = (UA_DataSetMessage*)UA_malloc(memsize); |
| memset(m.payload.dataSetPayload.dataSetMessages, 0, memsize); |
| |
| //UA_DataSetMessage dmkf; |
| //memset(&dmkf, 0, sizeof(UA_DataSetMessage)); |
| m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid = true; |
| m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding = UA_FIELDENCODING_VARIANT; |
| m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageType = UA_DATASETMESSAGE_DATAKEYFRAME; |
| UA_UInt16 fieldCountDS1 = 1; |
| m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount = fieldCountDS1; |
| m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields = |
| (UA_DataValue*)UA_Array_new(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| UA_DataValue_init(&m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0]); |
| |
| UA_UInt32 iv = 27; |
| UA_Variant_setScalarCopy(&m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value, &iv, &UA_TYPES[UA_TYPES_UINT32]); |
| m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue = true; |
| |
| m.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageValid = true; |
| m.payload.dataSetPayload.dataSetMessages[1].header.fieldEncoding = UA_FIELDENCODING_DATAVALUE; |
| m.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageType = UA_DATASETMESSAGE_DATADELTAFRAME; |
| UA_UInt16 fieldCountDS2 = 2; |
| m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.fieldCount = fieldCountDS2; |
| memsize = sizeof(UA_DataSetMessage_DeltaFrameField) * m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.fieldCount; |
| m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields = (UA_DataSetMessage_DeltaFrameField*)UA_malloc(memsize); |
| |
| UA_Guid gv = UA_Guid_random(); |
| UA_UInt16 fieldIndex1 = 2; |
| m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldIndex = fieldIndex1; |
| UA_DataValue_init(&m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue); |
| UA_Variant_setScalar(&m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.value, &gv, &UA_TYPES[UA_TYPES_GUID]); |
| m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue = true; |
| |
| UA_UInt16 fieldIndex2 = 5; |
| m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldIndex = fieldIndex2; |
| UA_DataValue_init(&m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue); |
| UA_Int64 iv64 = 152478978534; |
| UA_Variant_setScalar(&m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.value, &iv64, &UA_TYPES[UA_TYPES_INT64]); |
| m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue = true; |
| |
| UA_StatusCode rv = UA_STATUSCODE_UNCERTAININITIALVALUE; |
| UA_ByteString buffer; |
| size_t msgSize = UA_NetworkMessage_calcSizeBinary(&m); |
| rv = UA_ByteString_allocBuffer(&buffer, msgSize); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_Byte *bufPos = buffer.data; |
| memset(bufPos, 0, msgSize); |
| const UA_Byte *bufEnd = &(buffer.data[buffer.length]); |
| rv = UA_NetworkMessage_encodeBinary(&m, &bufPos, bufEnd); |
| |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| |
| UA_NetworkMessage m2; |
| memset(&m2, 0, sizeof(UA_NetworkMessage)); |
| size_t offset = 0; |
| rv = UA_NetworkMessage_decodeBinary(&buffer, &offset, &m2); |
| ck_assert_int_eq(rv, UA_STATUSCODE_GOOD); |
| ck_assert(m.version == m2.version); |
| ck_assert(m.networkMessageType == m2.networkMessageType); |
| ck_assert(m.timestampEnabled == m2.timestampEnabled); |
| ck_assert(m.dataSetClassIdEnabled == m2.dataSetClassIdEnabled); |
| ck_assert(m.groupHeaderEnabled == m2.groupHeaderEnabled); |
| ck_assert(m.picosecondsEnabled == m2.picosecondsEnabled); |
| ck_assert(m.promotedFieldsEnabled == m2.promotedFieldsEnabled); |
| ck_assert(m.publisherIdEnabled == m2.publisherIdEnabled); |
| ck_assert(m.securityEnabled == m2.securityEnabled); |
| ck_assert(m.chunkMessage == m2.chunkMessage); |
| ck_assert(m.payloadHeaderEnabled == m2.payloadHeaderEnabled); |
| ck_assert_uint_eq(m2.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[0], dsWriter1); |
| ck_assert_uint_eq(m2.payloadHeader.dataSetPayloadHeader.dataSetWriterIds[1], dsWriter2); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[0].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[0].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, fieldCountDS1); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasValue); |
| ck_assert_uint_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.type, (uintptr_t)&UA_TYPES[UA_TYPES_UINT32]); |
| ck_assert_uint_eq(*(UA_UInt32 *)m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].value.data, iv); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields[0].hasSourceTimestamp); |
| |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageValid == m2.payload.dataSetPayload.dataSetMessages[1].header.dataSetMessageValid); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[1].header.fieldEncoding == m2.payload.dataSetPayload.dataSetMessages[1].header.fieldEncoding); |
| ck_assert_int_eq(m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.fieldCount, fieldCountDS2); |
| |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasValue); |
| ck_assert_uint_eq(m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldIndex, fieldIndex1); |
| ck_assert_uint_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_GUID]); |
| ck_assert(UA_Guid_equal((UA_Guid*)m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.value.data, &gv) == true); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[0].fieldValue.hasSourceTimestamp); |
| |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue == m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasValue); |
| ck_assert_uint_eq(m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldIndex, fieldIndex2); |
| ck_assert_uint_eq((uintptr_t)m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT64]); |
| ck_assert_int_eq(*(UA_Int64 *)m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.value.data, iv64); |
| ck_assert(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp == m2.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields[1].fieldValue.hasSourceTimestamp); |
| |
| UA_Array_delete(m.payloadHeader.dataSetPayloadHeader.dataSetWriterIds, m.payloadHeader.dataSetPayloadHeader.count, &UA_TYPES[UA_TYPES_UINT16]); |
| UA_Array_delete(m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.dataSetFields, m.payload.dataSetPayload.dataSetMessages[0].data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| UA_free(m.payload.dataSetPayload.dataSetMessages[1].data.deltaFrameData.deltaFrameFields); |
| UA_NetworkMessage_deleteMembers(&m2); |
| UA_ByteString_deleteMembers(&buffer); |
| UA_free(m.payload.dataSetPayload.dataSetMessages); |
| //UA_Array_delete(dmkf.data.keyFrameData.dataSetFields, dmkf.data.keyFrameData.fieldCount, &UA_TYPES[UA_TYPES_DATAVALUE]); |
| } |
| END_TEST |
| |
| int main(void) { |
| TCase *tc_encode = tcase_create("encode"); |
| tcase_add_test(tc_encode, UA_PubSub_Encode_WithBufferTooSmallShallReturnError); |
| |
| TCase *tc_decode = tcase_create("decode"); |
| tcase_add_test(tc_decode, UA_PubSub_Decode_WithBufferTooSmallShallReturnError); |
| |
| TCase *tc_ende1 = tcase_create("encode_decode1DS"); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS1ValueVariantKeyFrame); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS1ValueDataValueKeyFrame); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrame); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueKeyFrame); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS1ValueVariantDeltaFrame); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS1ValueDataValueDeltaFrame); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantDeltaFrame); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueDeltaFrame); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrameGroupHeader); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantDeltaFramePublDSCID); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueKeyFramePH); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesVariantKeyFrameTSProm); |
| tcase_add_test(tc_ende1, UA_PubSub_EnDecode_ShallWorkOn1DS2ValuesDataValueDeltaFrameGHProm2); |
| |
| TCase *tc_ende2 = tcase_create("encode_decode2DS"); |
| tcase_add_test(tc_ende2, UA_PubSub_EnDecode_ShallWorkOn2DSVariant); |
| |
| Suite *s = suite_create("PubSub NetworkMessage"); |
| suite_add_tcase(s, tc_encode); |
| suite_add_tcase(s, tc_decode); |
| suite_add_tcase(s, tc_ende1); |
| suite_add_tcase(s, tc_ende2); |
| |
| SRunner *sr = srunner_create(s); |
| srunner_set_fork_status(sr, CK_NOFORK); |
| srunner_run_all(sr,CK_NORMAL); |
| int number_failed = srunner_ntests_failed(sr); |
| srunner_free(sr); |
| return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; |
| } |