2018-04-10 17:03:59 +02:00
|
|
|
/*
|
|
|
|
* Copyright(c) 2006 to 2018 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
|
|
|
|
*/
|
2019-01-18 14:10:19 +01:00
|
|
|
#include "dds/dds.h"
|
|
|
|
#include "dds/ddsrt/misc.h"
|
|
|
|
#include "dds/ddsrt/process.h"
|
|
|
|
#include "dds/ddsrt/threads.h"
|
|
|
|
|
2020-03-24 18:50:09 +01:00
|
|
|
#include "test_common.h"
|
|
|
|
|
2018-04-10 17:03:59 +02:00
|
|
|
/**************************************************************************************************
|
|
|
|
*
|
|
|
|
* Test fixtures
|
|
|
|
*
|
|
|
|
*************************************************************************************************/
|
|
|
|
static dds_entity_t g_participant = 0;
|
|
|
|
static dds_entity_t g_topicRtmAddress = 0;
|
|
|
|
static dds_entity_t g_topicRtmDataType = 0;
|
|
|
|
|
|
|
|
static dds_qos_t *g_qos = NULL;
|
|
|
|
static dds_qos_t *g_qos_null = NULL;
|
|
|
|
static dds_listener_t *g_listener = NULL;
|
|
|
|
static dds_listener_t *g_list_null= NULL;
|
|
|
|
|
|
|
|
#define MAX_NAME_SIZE (100)
|
|
|
|
char g_topicRtmAddressName[MAX_NAME_SIZE];
|
|
|
|
char g_topicRtmDataTypeName[MAX_NAME_SIZE];
|
|
|
|
char g_nameBuffer[MAX_NAME_SIZE];
|
|
|
|
|
|
|
|
static void
|
|
|
|
ddsc_topic_init(void)
|
|
|
|
{
|
2020-03-24 18:50:09 +01:00
|
|
|
create_unique_topic_name("ddsc_topic_test_rtm_address", g_topicRtmAddressName, MAX_NAME_SIZE);
|
|
|
|
create_unique_topic_name("ddsc_topic_test_rtm_datatype", g_topicRtmDataTypeName, MAX_NAME_SIZE);
|
2018-04-10 17:03:59 +02:00
|
|
|
|
|
|
|
g_participant = dds_create_participant(DDS_DOMAIN_DEFAULT, NULL, NULL);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_FATAL(g_participant > 0);
|
2018-04-10 17:03:59 +02:00
|
|
|
|
2018-12-04 23:01:46 +01:00
|
|
|
g_topicRtmAddress = dds_create_topic(g_participant, &RoundTripModule_Address_desc, g_topicRtmAddressName, NULL, NULL);
|
|
|
|
CU_ASSERT_FATAL(g_topicRtmAddress > 0);
|
2018-04-10 17:03:59 +02:00
|
|
|
|
|
|
|
g_topicRtmDataType = dds_create_topic(g_participant, &RoundTripModule_DataType_desc, g_topicRtmDataTypeName, NULL, NULL);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_FATAL(g_topicRtmDataType > 0);
|
2018-04-10 17:03:59 +02:00
|
|
|
|
2018-11-09 11:16:24 +01:00
|
|
|
g_qos = dds_create_qos();
|
2018-11-09 12:16:12 +01:00
|
|
|
g_listener = dds_create_listener(NULL);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
ddsc_topic_fini(void)
|
|
|
|
{
|
2018-11-09 11:16:24 +01:00
|
|
|
dds_delete_qos(g_qos);
|
2018-11-09 12:16:12 +01:00
|
|
|
dds_delete_listener(g_listener);
|
2018-04-10 17:03:59 +02:00
|
|
|
dds_delete(g_topicRtmDataType);
|
|
|
|
dds_delete(g_topicRtmAddress);
|
|
|
|
dds_delete(g_participant);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************************************
|
|
|
|
*
|
|
|
|
* These will check the topic creation in various ways.
|
|
|
|
*
|
|
|
|
*************************************************************************************************/
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_TheoryDataPoints(ddsc_topic_create, valid) = {
|
|
|
|
CU_DataPoints(char *, "valid", "_VALID", "Val1d", "valid_", "vA_1d"),
|
|
|
|
CU_DataPoints(dds_qos_t**, &g_qos_null, &g_qos, &g_qos_null, &g_qos_null, &g_qos_null),
|
|
|
|
CU_DataPoints(dds_listener_t**, &g_list_null, &g_listener, &g_list_null, &g_list_null, &g_list_null),
|
2018-04-10 17:03:59 +02:00
|
|
|
};
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Theory((char *name, dds_qos_t **qos, dds_listener_t **listener), ddsc_topic_create, valid, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
|
|
|
dds_return_t ret;
|
|
|
|
topic = dds_create_topic(g_participant, &RoundTripModule_DataType_desc, name, *qos, *listener);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_FATAL(topic > 0);
|
2018-04-10 17:03:59 +02:00
|
|
|
ret = dds_delete(topic);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_create, invalid_qos, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
2018-11-09 11:16:24 +01:00
|
|
|
dds_qos_t *qos = dds_create_qos();
|
2019-01-18 14:10:19 +01:00
|
|
|
DDSRT_WARNING_MSVC_OFF(28020); /* Disable SAL warning on intentional misuse of the API */
|
Table-driven parameter list handling
The old parameter list parsing was a mess of custom code with tons of
duplicated checks, even though parameter list parsing really is a fairly
straightforward affair. This commit changes it to a mostly table-driven
implementation, where the vast majority of the settings are handled by a
generic deserializer and the irregular ones (like reliability, locators)
are handled by custom functions. The crazy ones (IPv4 address and port
rely on additional state and are completely special-cased).
Given these tables, the serialization, finalisation, validation,
merging, unalias'ing can all be handled by a very small amount of custom
code and an appropriately defined generic function for the common cases.
This also makes it possible to have all QoS validation in place, and so
removes the need for the specialized implementations for the various
entity kinds in the upper layer.
QoS inapplicable to an entity were previously ignored, allowing one to
have invalid values set in a QoS object when creating an entity,
provided that the invalid values are irrelevant to that entity. Whether
this is a good thing or not is debatable, but certainly it is a good
thing to avoid copying in inapplicable QoS settings. That in turn means
the behaviour of the API can remain the same.
It does turn out that the code used to return "inconsistent QoS" also
for invalid values. That has now been rectified, and it returns
"inconsistent QoS" or "bad parameter" as appropriate. Tests have been
updated accordingly.
Signed-off-by: Erik Boasson <eb@ilities.com>
2019-05-29 14:03:53 +02:00
|
|
|
dds_qset_resource_limits(qos, 1, 1, 2);
|
2019-01-18 14:10:19 +01:00
|
|
|
DDSRT_WARNING_MSVC_OFF(28020);
|
2018-04-10 17:03:59 +02:00
|
|
|
topic = dds_create_topic(g_participant, &RoundTripModule_DataType_desc, "inconsistent", qos, NULL);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_INCONSISTENT_POLICY);
|
2018-11-09 11:16:24 +01:00
|
|
|
dds_delete_qos(qos);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_create, non_participants, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
|
|
|
topic = dds_create_topic(g_topicRtmDataType, &RoundTripModule_DataType_desc, "non_participant", NULL, NULL);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_ILLEGAL_OPERATION);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_create, duplicate, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
2018-07-11 13:18:13 +02:00
|
|
|
dds_return_t ret;
|
|
|
|
/* Creating the same topic should succeed. */
|
2018-04-10 17:03:59 +02:00
|
|
|
topic = dds_create_topic(g_participant, &RoundTripModule_DataType_desc, g_topicRtmDataTypeName, NULL, NULL);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_FATAL(topic > 0);
|
2020-01-28 21:29:14 +01:00
|
|
|
CU_ASSERT_FATAL(topic != g_topicRtmDataType);
|
2018-07-11 13:18:13 +02:00
|
|
|
ret = dds_delete(topic);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
|
2020-01-28 21:29:14 +01:00
|
|
|
/* Old topic entity should remain in existence */
|
|
|
|
ret = dds_get_parent(g_topicRtmDataType);
|
|
|
|
CU_ASSERT(ret > 0);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_create, same_name, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
|
|
|
/* Creating the different topic with same name should fail. */
|
|
|
|
topic = dds_create_topic(g_participant, &RoundTripModule_Address_desc, g_topicRtmDataTypeName, NULL, NULL);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_PRECONDITION_NOT_MET);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_create, recreate, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
|
|
|
dds_return_t ret;
|
|
|
|
|
|
|
|
/* Re-creating previously created topic should succeed. */
|
|
|
|
ret = dds_delete(g_topicRtmDataType);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
|
2018-04-10 17:03:59 +02:00
|
|
|
topic = dds_create_topic (g_participant, &RoundTripModule_DataType_desc, g_topicRtmDataTypeName, NULL, NULL);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_FATAL(topic > 0);
|
2018-04-10 17:03:59 +02:00
|
|
|
|
|
|
|
ret = dds_delete(topic);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_create, desc_null, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
2019-01-18 14:10:19 +01:00
|
|
|
DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
|
2018-04-10 17:03:59 +02:00
|
|
|
topic = dds_create_topic (g_participant, NULL, "desc_null", NULL, NULL);
|
2019-01-18 14:10:19 +01:00
|
|
|
DDSRT_WARNING_MSVC_ON(6387);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_BAD_PARAMETER);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_TheoryDataPoints(ddsc_topic_create, invalid_names) = {
|
2019-11-21 12:01:34 +01:00
|
|
|
CU_DataPoints(char *, NULL, "", "mi-dle", "-start", "end-", "1st", "Thus$", "pl+s", "t(4)", "DCPSmytopic"),
|
2018-04-10 17:03:59 +02:00
|
|
|
};
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Theory((char *name), ddsc_topic_create, invalid_names, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
|
|
|
topic = dds_create_topic(g_participant, &RoundTripModule_DataType_desc, name, NULL, NULL);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_BAD_PARAMETER);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************************************
|
|
|
|
*
|
|
|
|
* These will check the topic finding in various ways.
|
|
|
|
*
|
|
|
|
*************************************************************************************************/
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_find, valid, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
|
|
|
dds_return_t ret;
|
|
|
|
|
|
|
|
topic = dds_find_topic(g_participant, g_topicRtmDataTypeName);
|
2020-01-28 21:29:14 +01:00
|
|
|
CU_ASSERT_NOT_EQUAL_FATAL(topic, g_topicRtmDataType);
|
2018-04-10 17:03:59 +02:00
|
|
|
|
|
|
|
ret = dds_delete(topic);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_find, non_participants, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
|
|
|
topic = dds_find_topic(g_topicRtmDataType, "non_participant");
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_ILLEGAL_OPERATION);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_find, null, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
2019-01-18 14:10:19 +01:00
|
|
|
DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
|
2018-04-10 17:03:59 +02:00
|
|
|
topic = dds_find_topic(g_participant, NULL);
|
2019-01-18 14:10:19 +01:00
|
|
|
DDSRT_WARNING_MSVC_ON(6387);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_BAD_PARAMETER);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_find, unknown, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
|
|
|
topic = dds_find_topic(g_participant, "unknown");
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_PRECONDITION_NOT_MET);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_find, deleted, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_entity_t topic;
|
|
|
|
dds_delete(g_topicRtmDataType);
|
|
|
|
topic = dds_find_topic(g_participant, g_topicRtmDataTypeName);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_PRECONDITION_NOT_MET);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************************************
|
|
|
|
*
|
|
|
|
* These will check getting the topic name in various ways.
|
|
|
|
*
|
|
|
|
*************************************************************************************************/
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_get_name, valid, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
char name[MAX_NAME_SIZE];
|
|
|
|
dds_return_t ret;
|
|
|
|
|
|
|
|
ret = dds_get_name(g_topicRtmDataType, name, MAX_NAME_SIZE);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
|
|
|
|
CU_ASSERT_STRING_EQUAL_FATAL(name, g_topicRtmDataTypeName);
|
2018-04-10 17:03:59 +02:00
|
|
|
|
|
|
|
ret = dds_get_name(g_topicRtmAddress, name, MAX_NAME_SIZE);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
|
|
|
|
CU_ASSERT_STRING_EQUAL_FATAL(name, g_topicRtmAddressName);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_get_name, too_small, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
char name[10];
|
|
|
|
dds_return_t ret;
|
|
|
|
|
|
|
|
ret = dds_get_name(g_topicRtmDataType, name, 10);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
|
2018-04-10 17:03:59 +02:00
|
|
|
g_topicRtmDataTypeName[9] = '\0';
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_STRING_EQUAL_FATAL(name, g_topicRtmDataTypeName);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_get_name, non_topic, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
char name[MAX_NAME_SIZE];
|
|
|
|
dds_return_t ret;
|
|
|
|
ret = dds_get_name(g_participant, name, MAX_NAME_SIZE);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_TheoryDataPoints(ddsc_topic_get_name, invalid_params) = {
|
|
|
|
CU_DataPoints(char*, g_nameBuffer, NULL),
|
|
|
|
CU_DataPoints(size_t, 0, MAX_NAME_SIZE),
|
2018-04-10 17:03:59 +02:00
|
|
|
};
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Theory((char *name, size_t size), ddsc_topic_get_name, invalid_params, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_return_t ret;
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_FATAL((name != g_nameBuffer) || (size != MAX_NAME_SIZE));
|
2018-04-10 17:03:59 +02:00
|
|
|
ret = dds_get_name(g_topicRtmDataType, name, size);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_get_name, deleted, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
char name[MAX_NAME_SIZE];
|
|
|
|
dds_return_t ret;
|
|
|
|
dds_delete(g_topicRtmDataType);
|
|
|
|
ret = dds_get_name(g_topicRtmDataType, name, MAX_NAME_SIZE);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************************************
|
|
|
|
*
|
|
|
|
* These will check getting the type name in various ways.
|
|
|
|
*
|
|
|
|
*************************************************************************************************/
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_get_type_name, valid, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
const char *rtmDataTypeType = "RoundTripModule::DataType";
|
|
|
|
const char *rtmAddressType = "RoundTripModule::Address";
|
|
|
|
char name[MAX_NAME_SIZE];
|
|
|
|
dds_return_t ret;
|
|
|
|
|
|
|
|
ret = dds_get_type_name(g_topicRtmDataType, name, MAX_NAME_SIZE);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
|
|
|
|
CU_ASSERT_STRING_EQUAL_FATAL(name, rtmDataTypeType);
|
2018-04-10 17:03:59 +02:00
|
|
|
|
|
|
|
ret = dds_get_type_name(g_topicRtmAddress, name, MAX_NAME_SIZE);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
|
|
|
|
CU_ASSERT_STRING_EQUAL_FATAL(name, rtmAddressType);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_get_type_name, too_small, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
const char *rtmDataTypeType = "RoundTrip";
|
|
|
|
char name[10];
|
|
|
|
dds_return_t ret;
|
|
|
|
|
|
|
|
ret = dds_get_type_name(g_topicRtmDataType, name, 10);
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
|
|
|
|
CU_ASSERT_STRING_EQUAL_FATAL(name, rtmDataTypeType);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_get_type_name, non_topic, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
char name[MAX_NAME_SIZE];
|
|
|
|
dds_return_t ret;
|
|
|
|
ret = dds_get_type_name(g_participant, name, MAX_NAME_SIZE);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_TheoryDataPoints(ddsc_topic_get_type_name, invalid_params) = {
|
|
|
|
CU_DataPoints(char*, g_nameBuffer, NULL),
|
|
|
|
CU_DataPoints(size_t, 0, MAX_NAME_SIZE),
|
2018-04-10 17:03:59 +02:00
|
|
|
};
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Theory((char *name, size_t size), ddsc_topic_get_type_name, invalid_params, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_return_t ret;
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_ASSERT_FATAL((name != g_nameBuffer) || (size != MAX_NAME_SIZE));
|
2018-04-10 17:03:59 +02:00
|
|
|
ret = dds_get_type_name(g_topicRtmDataType, name, size);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_get_type_name, deleted, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
char name[MAX_NAME_SIZE];
|
|
|
|
dds_return_t ret;
|
|
|
|
dds_delete(g_topicRtmDataType);
|
|
|
|
ret = dds_get_type_name(g_topicRtmDataType, name, MAX_NAME_SIZE);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**************************************************************************************************
|
|
|
|
*
|
|
|
|
* These will set the topic qos in various ways.
|
|
|
|
*
|
|
|
|
*************************************************************************************************/
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_set_qos, valid, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_return_t ret;
|
|
|
|
/* Latency is the only one allowed to change. */
|
|
|
|
dds_qset_latency_budget(g_qos, DDS_SECS(1));
|
|
|
|
ret = dds_set_qos(g_topicRtmDataType, g_qos);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_UNSUPPORTED);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_set_qos, inconsistent, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_return_t ret;
|
2019-01-18 14:10:19 +01:00
|
|
|
DDSRT_WARNING_MSVC_OFF(28020); /* Disable SAL warning on intentional misuse of the API */
|
2018-04-10 17:03:59 +02:00
|
|
|
dds_qset_lifespan(g_qos, DDS_SECS(-1));
|
2019-01-18 14:10:19 +01:00
|
|
|
DDSRT_WARNING_MSVC_ON(28020);
|
2018-04-10 17:03:59 +02:00
|
|
|
ret = dds_set_qos(g_topicRtmDataType, g_qos);
|
Table-driven parameter list handling
The old parameter list parsing was a mess of custom code with tons of
duplicated checks, even though parameter list parsing really is a fairly
straightforward affair. This commit changes it to a mostly table-driven
implementation, where the vast majority of the settings are handled by a
generic deserializer and the irregular ones (like reliability, locators)
are handled by custom functions. The crazy ones (IPv4 address and port
rely on additional state and are completely special-cased).
Given these tables, the serialization, finalisation, validation,
merging, unalias'ing can all be handled by a very small amount of custom
code and an appropriately defined generic function for the common cases.
This also makes it possible to have all QoS validation in place, and so
removes the need for the specialized implementations for the various
entity kinds in the upper layer.
QoS inapplicable to an entity were previously ignored, allowing one to
have invalid values set in a QoS object when creating an entity,
provided that the invalid values are irrelevant to that entity. Whether
this is a good thing or not is debatable, but certainly it is a good
thing to avoid copying in inapplicable QoS settings. That in turn means
the behaviour of the API can remain the same.
It does turn out that the code used to return "inconsistent QoS" also
for invalid values. That has now been rectified, and it returns
"inconsistent QoS" or "bad parameter" as appropriate. Tests have been
updated accordingly.
Signed-off-by: Erik Boasson <eb@ilities.com>
2019-05-29 14:03:53 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|
|
|
|
|
|
|
|
/*************************************************************************************************/
|
2018-12-04 23:01:46 +01:00
|
|
|
CU_Test(ddsc_topic_set_qos, immutable, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
|
2018-04-10 17:03:59 +02:00
|
|
|
{
|
|
|
|
dds_return_t ret;
|
|
|
|
dds_qset_destination_order(g_qos, DDS_DESTINATIONORDER_BY_SOURCE_TIMESTAMP); /* Immutable */
|
|
|
|
ret = dds_set_qos(g_topicRtmDataType, g_qos);
|
2019-05-23 16:51:43 +02:00
|
|
|
CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_IMMUTABLE_POLICY);
|
2018-04-10 17:03:59 +02:00
|
|
|
}
|
|
|
|
/*************************************************************************************************/
|