diff --git a/src/core/ddsc/src/dds_instance.c b/src/core/ddsc/src/dds_instance.c index 8d43026..9441780 100644 --- a/src/core/ddsc/src/dds_instance.c +++ b/src/core/ddsc/src/dds_instance.c @@ -431,7 +431,7 @@ err: } _Pre_satisfies_(entity & DDS_ENTITY_KIND_MASK) -int +dds_return_t dds_instance_get_key( dds_entity_t entity, dds_instance_handle_t inst, @@ -458,7 +458,7 @@ dds_instance_get_key( if (dds_tkmap_get_key (map, topic->m_stopic, inst, data)) { ret = DDS_RETCODE_OK; } else{ - ret = DDS_ERRNO(DDS_RETCODE_PRECONDITION_NOT_MET, "No instance related with the provided entity is found"); + ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER, "No instance related with the provided entity is found"); } err: diff --git a/src/core/ddsc/src/dds_qos.c b/src/core/ddsc/src/dds_qos.c index 595834a..281255a 100644 --- a/src/core/ddsc/src/dds_qos.c +++ b/src/core/ddsc/src/dds_qos.c @@ -528,11 +528,11 @@ void dds_qset_partition } if (qos->partition.strs != NULL){ - for (i = 0; i < qos->partition.n; i++) { - dds_free(qos->partition.strs[i]); - } - dds_free(qos->partition.strs); - qos->partition.strs = NULL; + for (i = 0; i < qos->partition.n; i++) { + dds_free(qos->partition.strs[i]); + } + dds_free(qos->partition.strs); + qos->partition.strs = NULL; } qos->partition.n = n; diff --git a/src/core/ddsc/tests/instance_get_key.c b/src/core/ddsc/tests/instance_get_key.c new file mode 100644 index 0000000..8a934bf --- /dev/null +++ b/src/core/ddsc/tests/instance_get_key.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include + +#include "os/os.h" +#include "ddsc/dds.h" +#include "RoundTrip.h" + +static dds_entity_t participant = DDS_ENTITY_NIL; +static dds_entity_t topic = DDS_ENTITY_NIL; +static dds_entity_t publisher = DDS_ENTITY_NIL; +static dds_entity_t writer = DDS_ENTITY_NIL; + +static dds_instance_handle_t handle = DDS_HANDLE_NIL; + +static RoundTripModule_Address data; + +/* Fixture to create prerequisite entity */ +static void setup(void) +{ + participant = dds_create_participant(DDS_DOMAIN_DEFAULT, NULL, NULL); + cr_assert_gt(participant, 0); + topic = dds_create_topic(participant, &RoundTripModule_Address_desc, "ddsc_instance_get_key", NULL, NULL); + cr_assert_gt(topic, 0); + + publisher = dds_create_publisher(participant, NULL, NULL); + cr_assert_gt(publisher, 0); + + writer = dds_create_writer(publisher, topic, NULL, NULL); + cr_assert_gt(writer, 0); + + memset(&data, 0, sizeof(data)); + data.ip = os_strdup("some data"); + cr_assert_not_null(data.ip); + data.port = 1; +} + +/* Fixture to delete prerequisite entity */ +static void teardown(void) +{ + RoundTripModule_Address_free(&data, DDS_FREE_CONTENTS); + + dds_delete(writer); + dds_delete(publisher); + dds_delete(topic); + dds_delete(participant); +} + +Test(ddsc_instance_get_key, bad_entity, .init=setup, .fini=teardown) +{ + dds_return_t ret; + + ret = dds_instance_get_key(participant, handle, &data); + cr_assert_eq(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER, "returned %d", dds_err_nr(ret)); +} + +Test(ddsc_instance_get_key, null_data, .init=setup, .fini=teardown) +{ + dds_return_t ret; + + ret = dds_register_instance(writer, &handle, NULL); + cr_assert_eq(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER, "Argument data is NULL"); +} + +Test(ddsc_instance_get_key, null_handle, .init=setup, .fini=teardown) +{ + dds_return_t ret; + ret = dds_register_instance(writer, &handle, &data); + cr_assert_eq(ret, DDS_RETCODE_OK, "dds_register_instance succeeded (ret: %d)", dds_err_nr(ret)); + + ret = dds_instance_get_key(writer, DDS_HANDLE_NIL, &data); + cr_assert_eq(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER, "Argument data is not null, but handle is null"); +} + +Test(ddsc_instance_get_key, registered_instance, .init=setup, .fini=teardown) +{ + dds_return_t ret; + RoundTripModule_Address key_data; + + ret = dds_register_instance(writer, &handle, &data); + cr_assert_eq(ret, DDS_RETCODE_OK, "dds_register_instance succeeded (ret: %d)", dds_err_nr(ret)); + + memset(&key_data, 0, sizeof(key_data)); + + ret = dds_instance_get_key(writer, handle, &key_data); + + cr_assert_not_null(key_data.ip); + cr_assert_eq(strcmp(key_data.ip, data.ip) , 0); + cr_assert_eq(key_data.port, data.port); + cr_assert_eq(dds_err_nr(ret), DDS_RETCODE_OK); + + RoundTripModule_Address_free(&key_data, DDS_FREE_CONTENTS); +} + diff --git a/src/core/ddsc/tests/qos.c b/src/core/ddsc/tests/qos.c index b5242ab..fdd71cf 100644 --- a/src/core/ddsc/tests/qos.c +++ b/src/core/ddsc/tests/qos.c @@ -14,7 +14,6 @@ #include #include - /* We are deliberately testing some bad arguments that SAL will complain about. * So, silence SAL regarding these issues. */ #ifdef _MSC_VER @@ -240,6 +239,45 @@ qos_fini(void) /**************************************************************************** * API tests ****************************************************************************/ +Test(ddsc_qos, copy_bad_source, .init=qos_init, .fini=qos_fini) +{ + dds_return_t result; + + result = dds_qos_copy(g_qos, NULL); + cr_assert_eq(dds_err_nr(result), DDS_RETCODE_BAD_PARAMETER, "returned %d", dds_err_nr(result)); +} + +Test(ddsc_qos, copy_bad_destination, .init=qos_init, .fini=qos_fini) +{ + dds_return_t result; + + result = dds_qos_copy(NULL, g_qos); + cr_assert_eq(dds_err_nr(result), DDS_RETCODE_BAD_PARAMETER, "returned %d", dds_err_nr(result)); +} + +Test(ddsc_qos, copy_with_partition, .init=qos_init, .fini=qos_fini) +{ + dds_return_t result; + dds_qos_t *qos; + struct pol_partition p = { 0, NULL }; + + qos = dds_qos_create(); + cr_assert_not_null(qos); + + dds_qset_partition(g_qos, g_pol_partition.n, g_pol_partition.ps); + result = dds_qos_copy(qos, g_qos); + + cr_assert_eq(result, DDS_RETCODE_OK); + dds_qget_partition(qos, &p.n, &p.ps); + cr_assert_eq(p.n, g_pol_partition.n); + + for (uint32_t cnt = 0; cnt < p.n; cnt++) { + cr_assert_str_eq(p.ps[cnt], g_pol_partition.ps[cnt]); + } + + dds_qos_delete(qos); +} + Test(ddsc_qos, userdata, .init=qos_init, .fini=qos_fini) { struct pol_userdata p = { NULL, 0 }; diff --git a/src/core/ddsc/tests/time.c b/src/core/ddsc/tests/time.c new file mode 100644 index 0000000..5aceb37 --- /dev/null +++ b/src/core/ddsc/tests/time.c @@ -0,0 +1,17 @@ +#include +#include + +#include "ddsc/dds.h" + +Test(ddsc_time, request_time) +{ + dds_time_t now, then; + dds_duration_t pause = 1 * DDS_NSECS_IN_SEC; + + now = dds_time(); + cr_assert_gt(now, 0); + /* Sleep for 1 second, every platform should (hopefully) support that */ + dds_sleepfor(pause); + then = dds_time(); + cr_assert_geq(then, now + pause); +}