
Signed-off-by: Erik Boasson <eb@ilities.com> Fix typo in dlopen_unknown test Signed-off-by: Dennis Potman <dennis.potman@adlinktech.com> Signed-off-by: Erik Boasson <eb@ilities.com>
330 lines
11 KiB
C
330 lines
11 KiB
C
/*
|
|
* Copyright(c) 2019 ADLINK Technology Limited and others
|
|
*
|
|
* This program and the accompanying materials are made available under the
|
|
* terms of the Eclipse Public License v. 2.0 which is available at
|
|
* http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
|
|
* v. 1.0 which is available at
|
|
* http://www.eclipse.org/org/documents/edl-v10.php.
|
|
*
|
|
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
|
|
*/
|
|
|
|
#include "CUnit/Theory.h"
|
|
#include "dds/ddsrt/heap.h"
|
|
#include "dds/ddsrt/string.h"
|
|
#include "dds/ddsi/ddsi_security_msg.h"
|
|
#include "mem_ser.h"
|
|
#include <assert.h>
|
|
|
|
static nn_participant_generic_message_t test_msg_in =
|
|
{
|
|
.message_identity = { {{.u={1,2,3}},{4}}, 5 },
|
|
.related_message_identity = { {{.u={5,4,3}},{2}}, 1 },
|
|
.destination_participant_guid = { {.u={2,3,4}},{5} },
|
|
.destination_endpoint_guid = { {.u={3,4,5}},{6} },
|
|
.source_endpoint_guid = { {.u={4,5,6}},{7} },
|
|
.message_class_id = "testing message",
|
|
.message_data = {
|
|
.n = 4,
|
|
.tags = (nn_dataholder_t[]) {
|
|
{
|
|
.class_id = "holder0",
|
|
.properties = {
|
|
.n = 3,
|
|
.props = (dds_property_t[]) {
|
|
{
|
|
.propagate = false,
|
|
.name = "holder0::prop0name",
|
|
.value = "holder0::prop0value",
|
|
},
|
|
{
|
|
.propagate = true,
|
|
.name = "holder0::prop1name",
|
|
.value = "holder0::prop1value",
|
|
},
|
|
{
|
|
.propagate = false,
|
|
.name = "holder0::prop2name",
|
|
.value = "holder0::prop2value",
|
|
},
|
|
}
|
|
},
|
|
.binary_properties = {
|
|
.n = 1,
|
|
.props = (dds_binaryproperty_t[]) {
|
|
{
|
|
.propagate = false,
|
|
.name = "holder0::bprop0name",
|
|
.value = { 2, (unsigned char[]){ 1, 2 } },
|
|
},
|
|
}
|
|
},
|
|
},
|
|
{
|
|
.class_id = "holder1",
|
|
.properties = {
|
|
.n = 1,
|
|
.props = (dds_property_t[]) {
|
|
{
|
|
.propagate = true,
|
|
.name = "holder1::prop0name",
|
|
.value = "holder1::prop0value",
|
|
},
|
|
}
|
|
},
|
|
.binary_properties = {
|
|
.n = 1,
|
|
.props = (dds_binaryproperty_t[]) {
|
|
{
|
|
.propagate = true,
|
|
.name = "holder1::bprop0name",
|
|
.value = { 3, (unsigned char[]){ 1, 2, 3 } },
|
|
},
|
|
}
|
|
},
|
|
},
|
|
{
|
|
.class_id = "holder2",
|
|
.properties = {
|
|
.n = 1,
|
|
.props = (dds_property_t[]) {
|
|
{
|
|
.propagate = false,
|
|
.name = "holder2::prop0name",
|
|
.value = "holder2::prop0value",
|
|
},
|
|
}
|
|
},
|
|
.binary_properties = {
|
|
.n = 3,
|
|
.props = (dds_binaryproperty_t[]) {
|
|
{
|
|
.propagate = true,
|
|
.name = "holder2::bprop0name",
|
|
.value = { 3, (unsigned char[]){ 1, 2, 3 } },
|
|
},
|
|
{
|
|
.propagate = false,
|
|
.name = "holder2::bprop1name",
|
|
.value = { 4, (unsigned char[]){ 1, 2, 3, 4 } },
|
|
},
|
|
{
|
|
.propagate = true,
|
|
.name = "holder2::bprop2name",
|
|
.value = { 5, (unsigned char[]){ 1, 2, 3, 4, 5 } },
|
|
},
|
|
}
|
|
},
|
|
},
|
|
{
|
|
.class_id = "holder3",
|
|
.properties = {
|
|
.n = 1,
|
|
.props = (dds_property_t[]) {
|
|
{
|
|
.propagate = false,
|
|
.name = "holder3::prop0name",
|
|
.value = "holder3::prop0value",
|
|
},
|
|
}
|
|
},
|
|
.binary_properties = {
|
|
.n = 1,
|
|
.props = (dds_binaryproperty_t[]) {
|
|
{
|
|
.propagate = false,
|
|
.name = "holder3::bprop0name",
|
|
.value = { 3, (unsigned char[]){ 1, 2, 3 } },
|
|
},
|
|
}
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
/* Same as test_msg_in, excluding the non-propagated properties. */
|
|
static nn_participant_generic_message_t test_msg_out =
|
|
{
|
|
.message_identity = { {{.u={1,2,3}},{4}}, 5 },
|
|
.related_message_identity = { {{.u={5,4,3}},{2}}, 1 },
|
|
.destination_participant_guid = { {.u={2,3,4}},{5} },
|
|
.destination_endpoint_guid = { {.u={3,4,5}},{6} },
|
|
.source_endpoint_guid = { {.u={4,5,6}},{7} },
|
|
.message_class_id = "testing message",
|
|
.message_data = {
|
|
.n = 4,
|
|
.tags = (nn_dataholder_t[]) {
|
|
{
|
|
.class_id = "holder0",
|
|
.properties = {
|
|
.n = 1,
|
|
.props = (dds_property_t[]) {
|
|
{
|
|
.propagate = true,
|
|
.name = "holder0::prop1name",
|
|
.value = "holder0::prop1value",
|
|
},
|
|
}
|
|
},
|
|
.binary_properties = {
|
|
.n = 0,
|
|
.props = NULL
|
|
},
|
|
},
|
|
{
|
|
.class_id = "holder1",
|
|
.properties = {
|
|
.n = 1,
|
|
.props = (dds_property_t[]) {
|
|
{
|
|
.propagate = true,
|
|
.name = "holder1::prop0name",
|
|
.value = "holder1::prop0value",
|
|
},
|
|
}
|
|
},
|
|
.binary_properties = {
|
|
.n = 1,
|
|
.props = (dds_binaryproperty_t[]) {
|
|
{
|
|
.propagate = true,
|
|
.name = "holder1::bprop0name",
|
|
.value = { 3, (unsigned char[]){ 1, 2, 3 } },
|
|
},
|
|
}
|
|
},
|
|
},
|
|
{
|
|
.class_id = "holder2",
|
|
.properties = {
|
|
.n = 0,
|
|
.props = NULL,
|
|
},
|
|
.binary_properties = {
|
|
.n = 2,
|
|
.props = (dds_binaryproperty_t[]) {
|
|
{
|
|
.propagate = true,
|
|
.name = "holder2::bprop0name",
|
|
.value = { 3, (unsigned char[]){ 1, 2, 3 } },
|
|
},
|
|
{
|
|
.propagate = true,
|
|
.name = "holder2::bprop2name",
|
|
.value = { 5, (unsigned char[]){ 1, 2, 3, 4, 5 } },
|
|
},
|
|
}
|
|
},
|
|
},
|
|
{
|
|
.class_id = "holder3",
|
|
.properties = {
|
|
.n = 0,
|
|
.props = NULL,
|
|
},
|
|
.binary_properties = {
|
|
.n = 0,
|
|
.props = NULL,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
/* The cdr of test_msg_out. */
|
|
static unsigned char test_msg_ser[] = {
|
|
SER32BE(1), SER32BE(2), SER32BE(3), SER32BE(4), SER64(5),
|
|
SER32BE(5), SER32BE(4), SER32BE(3), SER32BE(2), SER64(1),
|
|
SER32BE(2), SER32BE(3), SER32BE(4), SER32BE(5),
|
|
SER32BE(3), SER32BE(4), SER32BE(5), SER32BE(6),
|
|
SER32BE(4), SER32BE(5), SER32BE(6), SER32BE(7),
|
|
SER32(16), 't','e','s','t','i','n','g',' ','m','e','s','s','a','g','e',0,
|
|
SER32(4),
|
|
/* dataholder 0 */
|
|
SER32(8), 'h','o','l','d','e','r','0',0,
|
|
SER32(1),
|
|
SER32(19), 'h','o','l','d','e','r','0',':',':','p','r','o','p','1','n','a','m','e',0,/* pad */0,
|
|
SER32(20), 'h','o','l','d','e','r','0',':',':','p','r','o','p','1','v','a','l','u','e',0,
|
|
SER32(0),
|
|
/* dataholder 1 */
|
|
SER32(8), 'h','o','l','d','e','r','1',0,
|
|
SER32(1),
|
|
SER32(19), 'h','o','l','d','e','r','1',':',':','p','r','o','p','0','n','a','m','e',0,/* pad */0,
|
|
SER32(20), 'h','o','l','d','e','r','1',':',':','p','r','o','p','0','v','a','l','u','e',0,
|
|
SER32(1),
|
|
SER32(20), 'h','o','l','d','e','r','1',':',':','b','p','r','o','p','0','n','a','m','e',0,
|
|
SER32(3), 1,2,3, /* pad */0,
|
|
/* dataholder 2 */
|
|
SER32(8), 'h','o','l','d','e','r','2',0,
|
|
SER32(0),
|
|
SER32(2),
|
|
SER32(20), 'h','o','l','d','e','r','2',':',':','b','p','r','o','p','0','n','a','m','e',0,
|
|
SER32(3), 1,2,3, /* pad */0,
|
|
SER32(20), 'h','o','l','d','e','r','2',':',':','b','p','r','o','p','2','n','a','m','e',0,
|
|
SER32(5), 1,2,3,4,5, /* pad */0,0,0,
|
|
/* dataholder 2 */
|
|
SER32(8), 'h','o','l','d','e','r','3',0,
|
|
SER32(0),
|
|
SER32(0)
|
|
};
|
|
|
|
CU_Test (ddsi_security_msg, serializer)
|
|
{
|
|
nn_participant_generic_message_t msg_in;
|
|
nn_participant_generic_message_t msg_ser;
|
|
unsigned char *data = NULL;
|
|
dds_return_t ret;
|
|
size_t len;
|
|
bool equal;
|
|
|
|
/* Create the message (normally with various arguments). */
|
|
nn_participant_generic_message_init(
|
|
&msg_in,
|
|
&test_msg_in.message_identity.source_guid,
|
|
test_msg_in.message_identity.sequence_number,
|
|
&test_msg_in.destination_participant_guid,
|
|
&test_msg_in.destination_endpoint_guid,
|
|
&test_msg_in.source_endpoint_guid,
|
|
test_msg_in.message_class_id,
|
|
&test_msg_in.message_data,
|
|
&test_msg_in.related_message_identity);
|
|
|
|
/* Check creation result. */
|
|
equal = plist_equal_generic(&msg_in, &test_msg_in, pserop_participant_generic_message);
|
|
CU_ASSERT_FATAL(equal == true);
|
|
|
|
/* Serialize the message. */
|
|
ret = nn_participant_generic_message_serialize(&msg_in, &data, &len);
|
|
CU_ASSERT_FATAL (ret == DDS_RETCODE_OK);
|
|
CU_ASSERT_PTR_NOT_NULL_FATAL(data);
|
|
CU_ASSERT(len > 0);
|
|
|
|
/* Check serialization result. */
|
|
size_t cmpsize = (len < sizeof(test_msg_ser)) ? len : sizeof(test_msg_ser);
|
|
assert(data != NULL); /* for Clang static analyzer */
|
|
if (memcmp (data, test_msg_ser, cmpsize) != 0)
|
|
{
|
|
printf ("memcmp(%d)\n", (int)cmpsize);
|
|
for (size_t k = 0; k < cmpsize; k++)
|
|
printf (" %3zu %02x %02x (%c) %s\n", k, data[k], test_msg_ser[k],
|
|
((test_msg_ser[k] >= '0') && (test_msg_ser[k] <= 'z')) ? test_msg_ser[k] : ' ',
|
|
(data[k] == test_msg_ser[k]) ? "" : "<--");
|
|
CU_ASSERT (!(bool)"memcmp");
|
|
}
|
|
CU_ASSERT_FATAL (len == sizeof(test_msg_ser));
|
|
|
|
/* Deserialize the message. */
|
|
ret = nn_participant_generic_message_deseralize(&msg_ser, data, len, false);
|
|
CU_ASSERT_FATAL (ret == DDS_RETCODE_OK);
|
|
|
|
/* Check deserialization result. */
|
|
equal = plist_equal_generic(&msg_ser, &test_msg_out, pserop_participant_generic_message);
|
|
CU_ASSERT_FATAL(equal == true);
|
|
|
|
/* Cleanup. */
|
|
nn_participant_generic_message_deinit(&msg_in);
|
|
nn_participant_generic_message_deinit(&msg_ser);
|
|
ddsrt_free(data);
|
|
}
|