check_pubsub_subscribe.c 79 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  4. *
  5. * Copyright (c) 2019 Kalycito Infotech Private Limited
  6. */
  7. #include <open62541/plugin/pubsub_udp.h>
  8. #include <open62541/server_config_default.h>
  9. #include <open62541/server_pubsub.h>
  10. #include <check.h>
  11. #include <time.h>
  12. #include "open62541/types_generated_encoding_binary.h"
  13. #include "ua_pubsub.h"
  14. #include "ua_server_internal.h"
  15. #define UA_SUBSCRIBER_PORT 4801 /* Port for Subscriber*/
  16. #define PUBLISH_INTERVAL 5 /* Publish interval*/
  17. #define PUBLISHER_ID 2234 /* Publisher Id*/
  18. #define DATASET_WRITER_ID 62541 /* DataSet Writer Id*/
  19. #define WRITER_GROUP_ID 100 /* Writer group Id */
  20. #define PUBLISHER_DATA 42 /* Published data */
  21. #define PUBLISHVARIABLE_NODEID 1000 /* Published data nodeId */
  22. #define SUBSCRIBEOBJECT_NODEID 1001 /* Object nodeId */
  23. #define SUBSCRIBEVARIABLE_NODEID 1002 /* Subscribed data nodeId */
  24. #define READERGROUP_COUNT 2 /* Value to add readergroup to connection */
  25. #define CHECK_READERGROUP_COUNT 3 /* Value to check readergroup count */
  26. /* Global declaration for test cases */
  27. UA_Server *server = NULL;
  28. UA_ServerConfig *config = NULL;
  29. UA_NodeId connection_test;
  30. UA_NodeId readerGroupTest;
  31. UA_NodeId publishedDataSetTest;
  32. /* setup() is to create an environment for test cases */
  33. static void setup(void) {
  34. /*Add setup by creating new server with valid configuration */
  35. server = UA_Server_new();
  36. config = UA_Server_getConfig(server);
  37. UA_ServerConfig_setMinimal(config, UA_SUBSCRIBER_PORT, NULL);
  38. UA_Server_run_startup(server);
  39. config->pubsubTransportLayers = (UA_PubSubTransportLayer *) UA_malloc(sizeof(UA_PubSubTransportLayer));
  40. if(!config->pubsubTransportLayers) {
  41. UA_ServerConfig_clean(config);
  42. }
  43. config->pubsubTransportLayers[0] = UA_PubSubTransportLayerUDPMP();
  44. config->pubsubTransportLayersSize++;
  45. /* Add connection to the server */
  46. UA_PubSubConnectionConfig connectionConfig;
  47. memset(&connectionConfig, 0, sizeof(UA_PubSubConnectionConfig));
  48. connectionConfig.name = UA_STRING("UADP Test Connection");
  49. UA_NetworkAddressUrlDataType networkAddressUrl = {UA_STRING_NULL, UA_STRING("opc.udp://224.0.0.22:4801/")};
  50. UA_Variant_setScalar(&connectionConfig.address, &networkAddressUrl,
  51. &UA_TYPES[UA_TYPES_NETWORKADDRESSURLDATATYPE]);
  52. connectionConfig.transportProfileUri = UA_STRING("http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp");
  53. connectionConfig.publisherId.numeric = PUBLISHER_ID;
  54. UA_Server_addPubSubConnection(server, &connectionConfig, &connection_test);
  55. UA_PubSubConnection_regist(server, &connection_test);
  56. }
  57. /* teardown() is to delete the environment set for test cases */
  58. static void teardown(void) {
  59. /*Call server delete functions */
  60. UA_Server_run_shutdown(server);
  61. UA_Server_delete(server);
  62. }
  63. START_TEST(AddReaderGroupWithValidConfiguration) {
  64. /* To test if ReaderGroup has been added to the connection with valid configuration */
  65. UA_StatusCode retVal;
  66. UA_ReaderGroupConfig readerGroupConfig;
  67. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  68. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  69. UA_NodeId localreaderGroup;
  70. retVal = UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  71. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  72. size_t readerGroupCount = 0;
  73. UA_ReaderGroup *readerGroup;
  74. LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry){
  75. readerGroupCount++;
  76. }
  77. /* Check readerGroup count */
  78. ck_assert_int_eq(readerGroupCount, 1);
  79. /* To Do: RemoveReaderGroup operation should be carried out when UA_Server_delete has been called */
  80. UA_Server_removeReaderGroup(server, localreaderGroup);
  81. } END_TEST
  82. START_TEST(AddReaderGroupWithNullConfig) {
  83. /* Check the status of adding ReaderGroup when NULL configuration is given */
  84. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  85. retVal |= UA_Server_addReaderGroup(server, connection_test, NULL, NULL);
  86. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  87. size_t readerGroupCount = 0;
  88. UA_ReaderGroup *readerGroup;
  89. LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry){
  90. readerGroupCount++;
  91. }
  92. /* Check readerGroup count */
  93. ck_assert_int_eq(readerGroupCount, 0);
  94. } END_TEST
  95. START_TEST(AddReaderGroupWithInvalidConnectionId) {
  96. /* Check status of adding ReaderGroup with invalid connection identifier */
  97. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  98. UA_ReaderGroupConfig readerGroupConfig;
  99. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  100. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  101. retVal |= UA_Server_addReaderGroup(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), &readerGroupConfig, NULL);
  102. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  103. size_t readerGroupCount = 0;
  104. UA_ReaderGroup *readerGroup;
  105. LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry){
  106. readerGroupCount++;
  107. }
  108. /* Check readerGroup count */
  109. ck_assert_int_eq(readerGroupCount, 0);
  110. } END_TEST
  111. START_TEST(RemoveReaderGroupWithInvalidIdentifier) {
  112. /* Check status of removing ReaderGroup when giving invalid ReaderGroup identifier */
  113. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  114. UA_ReaderGroupConfig readerGroupConfig;
  115. UA_NodeId localreaderGroup;
  116. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  117. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  118. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  119. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  120. /* Delete the added readerGroup */
  121. retVal |= UA_Server_removeReaderGroup(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX));
  122. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  123. size_t readerGroupCount = 0;
  124. UA_ReaderGroup *readerGroup;
  125. LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry){
  126. readerGroupCount++;
  127. }
  128. /* Check readerGroup count */
  129. ck_assert_int_eq(readerGroupCount, 1);
  130. UA_Server_removeReaderGroup(server, localreaderGroup);
  131. } END_TEST
  132. START_TEST(AddRemoveMultipleAddReaderGroupWithValidConfiguration) {
  133. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  134. UA_ReaderGroupConfig readerGroupConfig;
  135. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  136. readerGroupConfig.name = UA_STRING("ReaderGroup 1");
  137. UA_NodeId localReaderGroup;
  138. /* Add ReaderGroup */
  139. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localReaderGroup);
  140. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  141. /* Remove added ReaderGroup */
  142. retVal |= UA_Server_removeReaderGroup(server, localReaderGroup);
  143. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  144. size_t readerGroupCount = 0;
  145. UA_ReaderGroup *readerGroup;
  146. LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry) {
  147. readerGroupCount++;
  148. }
  149. /* Check ReaderGroup Count */
  150. ck_assert_int_eq(readerGroupCount, 0);
  151. /* Add Multiple ReaderGroups */
  152. for (int iterator = 0; iterator <= READERGROUP_COUNT; iterator++) {
  153. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localReaderGroup);
  154. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  155. }
  156. readerGroupCount = 0;
  157. /* Find ReaderGroup count */
  158. LIST_FOREACH(readerGroup, &UA_PubSubConnection_findConnectionbyId(server, connection_test)->readerGroups, listEntry) {
  159. readerGroupCount++;
  160. }
  161. /* Check ReaderGroup Count */
  162. ck_assert_int_eq(readerGroupCount, CHECK_READERGROUP_COUNT);
  163. } END_TEST
  164. START_TEST(UpdateReaderGroupWithInvalidIdentifier) {
  165. /* Check status of updating ReaderGroup with invalid identifier */
  166. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  167. UA_ReaderGroupConfig readerGroupConfig;
  168. UA_NodeId localreaderGroup;
  169. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  170. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  171. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  172. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  173. retVal |= UA_Server_ReaderGroup_updateConfig(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), NULL);
  174. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  175. UA_Server_removeReaderGroup(server, localreaderGroup);
  176. } END_TEST
  177. START_TEST(GetReaderGroupConfigWithInvalidConfig) {
  178. /* Check status of getting ReaderGroup configuration with invalid configuration */
  179. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  180. UA_ReaderGroupConfig readerGroupConfig;
  181. UA_NodeId localreaderGroup;
  182. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  183. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  184. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  185. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  186. retVal |= UA_Server_ReaderGroup_getConfig(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), NULL);
  187. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  188. UA_Server_removeReaderGroup(server, localreaderGroup);
  189. } END_TEST
  190. START_TEST(GetReaderGroupConfigWithInvalidIdentifier) {
  191. /* Check status of getting ReaderGroup configuration with invlaid identifier */
  192. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  193. UA_ReaderGroupConfig readerGroupConfig;
  194. UA_NodeId localreaderGroup;
  195. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  196. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  197. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  198. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  199. retVal |= UA_Server_ReaderGroup_getConfig(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), &readerGroupConfig);
  200. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  201. UA_Server_removeReaderGroup(server, localreaderGroup);
  202. } END_TEST
  203. START_TEST(GetReaderGroupConfigWithValidConfig) {
  204. /* Check status of getting ReaderGroup configuration with valid parameters */
  205. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  206. UA_NodeId localreaderGroup;
  207. UA_ReaderGroupConfig readerGroupConfig;
  208. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  209. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  210. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  211. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  212. retVal |= UA_Server_ReaderGroup_getConfig(server, localreaderGroup, &readerGroupConfig);
  213. /* To Do: DeleteMembers of readergroup config has to be a separate function */
  214. UA_String_deleteMembers (&readerGroupConfig.name);
  215. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  216. } END_TEST
  217. START_TEST(AddDataSetReaderWithValidConfiguration) {
  218. /* Check status of adding DataSetReader to ReaderGroup with valid parameters*/
  219. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  220. UA_DataSetReaderConfig dataSetreaderConfig;
  221. UA_NodeId localreaderGroup;
  222. UA_ReaderGroupConfig readerGroupConfig;
  223. UA_NodeId localDataSetreader;
  224. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  225. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  226. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  227. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  228. memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
  229. dataSetreaderConfig.name = UA_STRING("DataSetreader Test");
  230. retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
  231. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  232. } END_TEST
  233. START_TEST(AddDataSetReaderWithNullConfig) {
  234. /* Check status of adding DataSetReader to ReaderGroup with invalid parameters */
  235. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  236. UA_DataSetReaderConfig dataSetreaderConfig;
  237. UA_NodeId localreaderGroup;
  238. UA_ReaderGroupConfig readerGroupConfig;
  239. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  240. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  241. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  242. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  243. memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
  244. dataSetreaderConfig.name = UA_STRING("DataSetreader Test ");
  245. /* Remove the added DataSetReader */
  246. retVal |= UA_Server_addDataSetReader(server, localreaderGroup, NULL, NULL);
  247. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  248. } END_TEST
  249. START_TEST(RemoveDataSetReaderWithValidConfiguration) {
  250. /* Check status of adding DataSetReader to ReaderGroup with valid parameters */
  251. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  252. UA_DataSetReaderConfig dataSetreaderConfig;
  253. UA_NodeId localreaderGroup;
  254. UA_ReaderGroupConfig readerGroupConfig;
  255. UA_NodeId localDataSetreader;
  256. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  257. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  258. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  259. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  260. memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
  261. dataSetreaderConfig.name = UA_STRING("DataSetReader Test ");
  262. retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
  263. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  264. retVal |= UA_Server_removeDataSetReader(server, localDataSetreader);
  265. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  266. } END_TEST
  267. START_TEST(RemoveDataSetReaderWithInvalidIdentifier) {
  268. /* Check status of removing DataSetReader from ReaderGroup with invalid parameters */
  269. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  270. UA_DataSetReaderConfig dataSetreaderConfig;
  271. UA_NodeId localreaderGroup;
  272. UA_ReaderGroupConfig readerGroupConfig;
  273. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  274. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  275. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  276. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  277. memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
  278. dataSetreaderConfig.name = UA_STRING("DataSetReader Test ");
  279. retVal |= UA_Server_addDataSetReader(server, localreaderGroup, NULL, NULL);
  280. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  281. /* Remove the added DataSetReader */
  282. retVal |= UA_Server_removeDataSetReader(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX));
  283. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  284. } END_TEST
  285. START_TEST(AddMultipleDataSetReaderWithValidConfiguration) {
  286. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  287. UA_ReaderGroupConfig readerGroupConfig;
  288. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  289. readerGroupConfig.name = UA_STRING("ReaderGroup 1");
  290. UA_NodeId localReaderGroup;
  291. UA_NodeId localReaderGroup2;
  292. /* DataSetReader configuration */
  293. UA_DataSetReaderConfig readerConfig;
  294. memset (&readerConfig, 0, sizeof(readerConfig));
  295. readerConfig.name = UA_STRING("DataSet Reader 1");
  296. UA_NodeId dataSetReader;
  297. /* Add ReaderGroup */
  298. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localReaderGroup);
  299. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  300. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localReaderGroup2);
  301. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  302. UA_ReaderGroup *readerGroupIdent1 = UA_ReaderGroup_findRGbyId(server, localReaderGroup);
  303. UA_ReaderGroup *readerGroupIdent2 = UA_ReaderGroup_findRGbyId(server, localReaderGroup2);
  304. /* Add DataSetReaders to first ReaderGroup */
  305. retVal = UA_Server_addDataSetReader(server, localReaderGroup, &readerConfig, &dataSetReader);
  306. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  307. ck_assert_int_eq(readerGroupIdent1->readersCount, 1);
  308. retVal = UA_Server_addDataSetReader(server, localReaderGroup, &readerConfig, &dataSetReader);
  309. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  310. ck_assert_int_eq(readerGroupIdent1->readersCount, 2);
  311. /* Add DataSetReaders to second ReaderGroup */
  312. retVal = UA_Server_addDataSetReader(server, localReaderGroup2, &readerConfig, &dataSetReader);
  313. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  314. ck_assert_int_eq(readerGroupIdent2->readersCount, 1);
  315. retVal = UA_Server_addDataSetReader(server, localReaderGroup2, &readerConfig, &dataSetReader);
  316. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  317. ck_assert_int_eq(readerGroupIdent2->readersCount, 2);
  318. } END_TEST
  319. START_TEST(UpdateDataSetReaderConfigWithInvalidId) {
  320. /* Check status of updatting DataSetReader with invalid configuration */
  321. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  322. UA_DataSetReaderConfig dataSetreaderConfig;
  323. UA_NodeId localreaderGroup;
  324. UA_NodeId localDataSetreader;
  325. UA_ReaderGroupConfig readerGroupConfig;
  326. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  327. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  328. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  329. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  330. memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
  331. retVal |= UA_Server_addDataSetReader(server, localreaderGroup,
  332. &dataSetreaderConfig, &localDataSetreader);
  333. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  334. retVal |= UA_Server_DataSetReader_updateConfig(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX),
  335. localreaderGroup, &dataSetreaderConfig );
  336. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  337. } END_TEST
  338. START_TEST(GetDataSetReaderConfigWithValidConfiguration) {
  339. /* Check status of getting DataSetReader with Valid configuration */
  340. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  341. UA_DataSetReaderConfig dataSetreaderConfig;
  342. UA_NodeId localreaderGroup;
  343. UA_NodeId localDataSetreader;
  344. UA_ReaderGroupConfig readerGroupConfig;
  345. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  346. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  347. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  348. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  349. memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
  350. retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
  351. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  352. retVal |= UA_Server_DataSetReader_getConfig(server, localDataSetreader, &dataSetreaderConfig);
  353. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  354. } END_TEST
  355. START_TEST(GetDataSetReaderConfigWithInvalidConfiguration) {
  356. /* Check status of getting DataSetReader with Invalid configuration */
  357. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  358. UA_DataSetReaderConfig dataSetreaderConfig;
  359. UA_NodeId localreaderGroup;
  360. UA_NodeId localDataSetreader;
  361. UA_ReaderGroupConfig readerGroupConfig;
  362. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  363. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  364. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  365. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  366. memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
  367. retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
  368. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  369. retVal |= UA_Server_DataSetReader_getConfig(server, localDataSetreader, NULL);
  370. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  371. } END_TEST
  372. START_TEST(GetDataSetReaderConfigWithInvalidIdentifier) {
  373. /* Check status of getting DataSetReader with Invalid Identifier */
  374. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  375. UA_DataSetReaderConfig dataSetreaderConfig;
  376. UA_NodeId localreaderGroup;
  377. UA_NodeId localDataSetreader;
  378. UA_ReaderGroupConfig readerGroupConfig;
  379. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  380. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  381. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  382. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  383. memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
  384. retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
  385. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  386. retVal |= UA_Server_DataSetReader_getConfig(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), &dataSetreaderConfig);
  387. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  388. } END_TEST
  389. START_TEST(CreateTargetVariableWithInvalidConfiguration) {
  390. /* Check status to create target variable with invalid configuration */
  391. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  392. UA_DataSetReaderConfig dataSetreaderConfig;
  393. UA_NodeId localreaderGroup;
  394. UA_NodeId localDataSetreader;
  395. UA_TargetVariablesDataType localTargetVariable;
  396. UA_ReaderGroupConfig readerGroupConfig;
  397. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  398. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  399. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  400. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  401. memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
  402. retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
  403. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  404. retVal |= UA_Server_DataSetReader_createTargetVariables(server, UA_NODEID_NUMERIC(0, UA_UINT32_MAX), &localTargetVariable);
  405. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  406. } END_TEST
  407. START_TEST(AddTargetVariableWithInvalidConfiguration) {
  408. /* Check status to create target variable with invalid configuration */
  409. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  410. UA_DataSetReaderConfig dataSetreaderConfig;
  411. UA_NodeId localreaderGroup;
  412. UA_NodeId localDataSetreader;
  413. UA_ReaderGroupConfig readerGroupConfig;
  414. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  415. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  416. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroup);
  417. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  418. memset(&dataSetreaderConfig, 0, sizeof(dataSetreaderConfig));
  419. retVal |= UA_Server_addDataSetReader(server, localreaderGroup, &dataSetreaderConfig, &localDataSetreader);
  420. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  421. retVal |= UA_Server_DataSetReader_addTargetVariables(NULL, &localreaderGroup, localDataSetreader, UA_PUBSUB_SDS_TARGET);
  422. ck_assert_int_ne(retVal, UA_STATUSCODE_GOOD);
  423. } END_TEST
  424. START_TEST(AddTargetVariableWithValidConfiguration) {
  425. /* Check status after creating target variables with Valid configuration */
  426. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  427. UA_DataSetReaderConfig dataSetReaderConfig;
  428. UA_NodeId folderId;
  429. UA_QualifiedName folderBrowseName;
  430. UA_NodeId localreaderGroupIdentifier;
  431. UA_NodeId localDataSetreaderIdentifier;
  432. UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
  433. UA_ReaderGroupConfig readerGroupConfig;
  434. memset(&readerGroupConfig, 0, sizeof(readerGroupConfig));
  435. readerGroupConfig.name = UA_STRING("ReaderGroup Test");
  436. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &localreaderGroupIdentifier);
  437. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  438. memset(&dataSetReaderConfig, 0, sizeof(UA_DataSetReaderConfig));
  439. UA_DataSetMetaDataType *pMetaData = &dataSetReaderConfig.dataSetMetaData;
  440. UA_DataSetMetaDataType_init (pMetaData);
  441. pMetaData->name = UA_STRING ("DataSet Test");
  442. /* Static definition of number of fields size to 4 to create four different
  443. * targetVariables of distinct datatype */
  444. pMetaData->fieldsSize = 1;
  445. pMetaData->fields = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
  446. &UA_TYPES[UA_TYPES_FIELDMETADATA]);
  447. /* DateTime DataType */
  448. UA_FieldMetaData_init (&pMetaData->fields[0]);
  449. UA_NodeId_copy (&UA_TYPES[UA_TYPES_DATETIME].typeId,
  450. &pMetaData->fields[0].dataType);
  451. pMetaData->fields[0].builtInType = UA_NS0ID_DATETIME;
  452. pMetaData->fields[0].valueRank = -1; /* scalar */
  453. retVal |= UA_Server_addDataSetReader(server, localreaderGroupIdentifier, &dataSetReaderConfig, &localDataSetreaderIdentifier);
  454. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  455. folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
  456. UA_Server_addObjectNode (server, UA_NODEID_NULL,
  457. UA_NODEID_NUMERIC (0, UA_NS0ID_OBJECTSFOLDER),
  458. UA_NODEID_NUMERIC (0, UA_NS0ID_ORGANIZES),
  459. folderBrowseName, UA_NODEID_NUMERIC (0,
  460. UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
  461. retVal |= UA_Server_DataSetReader_addTargetVariables(server, &folderId, localDataSetreaderIdentifier, UA_PUBSUB_SDS_TARGET);
  462. UA_free(pMetaData->fields);
  463. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  464. } END_TEST
  465. START_TEST(SinglePublishSubscribeDateTime) {
  466. /* To check status after running both publisher and subscriber */
  467. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  468. UA_PublishedDataSetConfig pdsConfig;
  469. UA_NodeId dataSetWriter;
  470. UA_NodeId readerIdentifier;
  471. UA_NodeId writerGroup;
  472. UA_DataSetReaderConfig readerConfig;
  473. memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
  474. pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
  475. pdsConfig.name = UA_STRING("PublishedDataSet Test");
  476. UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSetTest);
  477. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  478. /* Data Set Field */
  479. UA_NodeId dataSetFieldId;
  480. UA_DataSetFieldConfig dataSetFieldConfig;
  481. memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
  482. dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
  483. dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Server localtime");
  484. dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
  485. dataSetFieldConfig.field.variable.publishParameters.publishedVariable = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_LOCALTIME);
  486. dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
  487. UA_Server_addDataSetField(server, publishedDataSetTest, &dataSetFieldConfig, &dataSetFieldId);
  488. /* Writer group */
  489. UA_WriterGroupConfig writerGroupConfig;
  490. memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
  491. writerGroupConfig.name = UA_STRING("WriterGroup Test");
  492. writerGroupConfig.publishingInterval = PUBLISH_INTERVAL;
  493. writerGroupConfig.enabled = UA_FALSE;
  494. writerGroupConfig.writerGroupId = WRITER_GROUP_ID;
  495. writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
  496. retVal |= UA_Server_addWriterGroup(server, connection_test, &writerGroupConfig, &writerGroup);
  497. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  498. /* DataSetWriter */
  499. UA_DataSetWriterConfig dataSetWriterConfig;
  500. memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
  501. dataSetWriterConfig.name = UA_STRING("DataSetWriter Test");
  502. dataSetWriterConfig.dataSetWriterId = DATASET_WRITER_ID;
  503. dataSetWriterConfig.keyFrameCount = 10;
  504. retVal |= UA_Server_addDataSetWriter(server, writerGroup, publishedDataSetTest, &dataSetWriterConfig, &dataSetWriter);
  505. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  506. /* Reader Group */
  507. UA_ReaderGroupConfig readerGroupConfig;
  508. memset (&readerGroupConfig, 0, sizeof (UA_ReaderGroupConfig));
  509. readerGroupConfig.name = UA_STRING ("ReaderGroup Test");
  510. retVal |= UA_Server_addReaderGroup (server, connection_test, &readerGroupConfig,
  511. &readerGroupTest);
  512. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  513. /* Data Set Reader */
  514. memset (&readerConfig, 0, sizeof (UA_DataSetReaderConfig));
  515. readerConfig.name = UA_STRING ("DataSetReader Test");
  516. readerConfig.dataSetWriterId = DATASET_WRITER_ID;
  517. /* Setting up Meta data configuration in DataSetReader for DateTime DataType */
  518. UA_DataSetMetaDataType *pMetaData = &readerConfig.dataSetMetaData;
  519. /* FilltestMetadata function in subscriber implementation */
  520. UA_DataSetMetaDataType_init (pMetaData);
  521. pMetaData->name = UA_STRING ("DataSet Test");
  522. /* Static definition of number of fields size to 1 to create one
  523. targetVariable */
  524. pMetaData->fieldsSize = 1;
  525. pMetaData->fields = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
  526. &UA_TYPES[UA_TYPES_FIELDMETADATA]);
  527. /* DateTime DataType */
  528. UA_FieldMetaData_init (&pMetaData->fields[0]);
  529. UA_NodeId_copy (&UA_TYPES[UA_TYPES_DATETIME].typeId,
  530. &pMetaData->fields[0].dataType);
  531. pMetaData->fields[0].builtInType = UA_NS0ID_DATETIME;
  532. pMetaData->fields[0].valueRank = -1; /* scalar */
  533. retVal |= UA_Server_addDataSetReader (server, readerGroupTest, &readerConfig,
  534. &readerIdentifier);
  535. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  536. /* Add Subscribed Variables */
  537. UA_NodeId folderId;
  538. UA_String folderName = readerConfig.dataSetMetaData.name;
  539. UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
  540. UA_QualifiedName folderBrowseName;
  541. if (folderName.length > 0) {
  542. oAttr.displayName.locale = UA_STRING ("en-US");
  543. oAttr.displayName.text = folderName;
  544. folderBrowseName.namespaceIndex = 1;
  545. folderBrowseName.name = folderName;
  546. }
  547. else {
  548. oAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Variables");
  549. folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
  550. }
  551. UA_Server_addObjectNode (server, UA_NODEID_NULL,
  552. UA_NODEID_NUMERIC (0, UA_NS0ID_OBJECTSFOLDER),
  553. UA_NODEID_NUMERIC (0, UA_NS0ID_ORGANIZES),
  554. folderBrowseName, UA_NODEID_NUMERIC (0,
  555. UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
  556. retVal |= UA_Server_DataSetReader_addTargetVariables (server, &folderId,
  557. readerIdentifier, UA_PUBSUB_SDS_TARGET);
  558. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  559. /* run server - publisher and subscriber */
  560. UA_Server_run_iterate(server,true);
  561. UA_Server_run_iterate(server,true);
  562. UA_free(pMetaData->fields);
  563. }END_TEST
  564. START_TEST(SinglePublishSubscribeInt32) {
  565. /* To check status after running both publisher and subscriber */
  566. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  567. UA_PublishedDataSetConfig pdsConfig;
  568. UA_NodeId dataSetWriter;
  569. UA_NodeId readerIdentifier;
  570. UA_NodeId writerGroup;
  571. UA_DataSetReaderConfig readerConfig;
  572. /* Published DataSet */
  573. memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
  574. pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
  575. pdsConfig.name = UA_STRING("PublishedDataSet Test");
  576. UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSetTest);
  577. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  578. /* Create variable to publish integer data */
  579. UA_NodeId publisherNode;
  580. UA_VariableAttributes attr = UA_VariableAttributes_default;
  581. attr.description = UA_LOCALIZEDTEXT("en-US","Published Int32");
  582. attr.displayName = UA_LOCALIZEDTEXT("en-US","Published Int32");
  583. attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
  584. UA_Int32 publisherData = 42;
  585. UA_Variant_setScalar(&attr.value, &publisherData, &UA_TYPES[UA_TYPES_INT32]);
  586. retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID),
  587. UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
  588. UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
  589. UA_QUALIFIEDNAME(1, "Published Int32"),
  590. UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
  591. attr, NULL, &publisherNode);
  592. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  593. /* Data Set Field */
  594. UA_NodeId dataSetFieldIdent;
  595. UA_DataSetFieldConfig dataSetFieldConfig;
  596. memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
  597. dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
  598. dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Published Int32");
  599. dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
  600. dataSetFieldConfig.field.variable.publishParameters.publishedVariable = publisherNode;
  601. dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
  602. UA_Server_addDataSetField (server, publishedDataSetTest, &dataSetFieldConfig, &dataSetFieldIdent);
  603. /* Writer group */
  604. UA_WriterGroupConfig writerGroupConfig;
  605. memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
  606. writerGroupConfig.name = UA_STRING("WriterGroup Test");
  607. writerGroupConfig.publishingInterval = PUBLISH_INTERVAL;
  608. writerGroupConfig.enabled = UA_FALSE;
  609. writerGroupConfig.writerGroupId = WRITER_GROUP_ID;
  610. writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
  611. /* Message settings in WriterGroup to include necessary headers */
  612. writerGroupConfig.messageSettings.encoding = UA_EXTENSIONOBJECT_DECODED;
  613. writerGroupConfig.messageSettings.content.decoded.type = &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
  614. UA_UadpWriterGroupMessageDataType *writerGroupMessage = UA_UadpWriterGroupMessageDataType_new();
  615. writerGroupMessage->networkMessageContentMask = (UA_UadpNetworkMessageContentMask)(UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID |
  616. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER |
  617. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID |
  618. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER);
  619. writerGroupConfig.messageSettings.content.decoded.data = writerGroupMessage;
  620. retVal |= UA_Server_addWriterGroup(server, connection_test, &writerGroupConfig, &writerGroup);
  621. UA_UadpWriterGroupMessageDataType_delete(writerGroupMessage);
  622. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  623. /* DataSetWriter */
  624. UA_DataSetWriterConfig dataSetWriterConfig;
  625. memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
  626. dataSetWriterConfig.name = UA_STRING("DataSetWriter Test");
  627. dataSetWriterConfig.dataSetWriterId = DATASET_WRITER_ID;
  628. dataSetWriterConfig.keyFrameCount = 10;
  629. retVal |= UA_Server_addDataSetWriter(server, writerGroup, publishedDataSetTest, &dataSetWriterConfig, &dataSetWriter);
  630. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  631. /* Reader Group */
  632. UA_ReaderGroupConfig readerGroupConfig;
  633. memset (&readerGroupConfig, 0, sizeof (UA_ReaderGroupConfig));
  634. readerGroupConfig.name = UA_STRING ("ReaderGroup Test");
  635. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &readerGroupTest);
  636. /* Data Set Reader */
  637. /* Parameters to filter received NetworkMessage */
  638. memset (&readerConfig, 0, sizeof (UA_DataSetReaderConfig));
  639. readerConfig.name = UA_STRING ("DataSetReader Test");
  640. UA_UInt16 publisherIdentifier = PUBLISHER_ID;
  641. readerConfig.publisherId.type = &UA_TYPES[UA_TYPES_UINT16];
  642. readerConfig.publisherId.data = &publisherIdentifier;
  643. readerConfig.writerGroupId = WRITER_GROUP_ID;
  644. readerConfig.dataSetWriterId = DATASET_WRITER_ID;
  645. /* Setting up Meta data configuration in DataSetReader */
  646. UA_DataSetMetaDataType *pMetaData = &readerConfig.dataSetMetaData;
  647. /* FilltestMetadata function in subscriber implementation */
  648. UA_DataSetMetaDataType_init (pMetaData);
  649. pMetaData->name = UA_STRING ("DataSet Test");
  650. /* Static definition of number of fields size to 1 to create one
  651. targetVariable */
  652. pMetaData->fieldsSize = 1;
  653. pMetaData->fields = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
  654. &UA_TYPES[UA_TYPES_FIELDMETADATA]);
  655. /* Unsigned Integer DataType */
  656. UA_FieldMetaData_init (&pMetaData->fields[0]);
  657. UA_NodeId_copy (&UA_TYPES[UA_TYPES_INT32].typeId,
  658. &pMetaData->fields[0].dataType);
  659. pMetaData->fields[0].builtInType = UA_NS0ID_INT32;
  660. pMetaData->fields[0].valueRank = -1; /* scalar */
  661. retVal |= UA_Server_addDataSetReader(server, readerGroupTest, &readerConfig,
  662. &readerIdentifier);
  663. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  664. /* Add Subscribed Variables */
  665. UA_NodeId folderId;
  666. UA_NodeId newnodeId;
  667. UA_String folderName = readerConfig.dataSetMetaData.name;
  668. UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
  669. UA_QualifiedName folderBrowseName;
  670. if (folderName.length > 0) {
  671. oAttr.displayName.locale = UA_STRING ("en-US");
  672. oAttr.displayName.text = folderName;
  673. folderBrowseName.namespaceIndex = 1;
  674. folderBrowseName.name = folderName;
  675. }
  676. else {
  677. oAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Variables");
  678. folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
  679. }
  680. retVal = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
  681. UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
  682. UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
  683. folderBrowseName, UA_NODEID_NUMERIC(0,
  684. UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
  685. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  686. /* Variable to subscribe data */
  687. UA_VariableAttributes vAttr = UA_VariableAttributes_default;
  688. vAttr.description = UA_LOCALIZEDTEXT ("en-US", "Subscribed Int32");
  689. vAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Int32");
  690. vAttr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
  691. retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID),
  692. UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
  693. UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_QUALIFIEDNAME(1, "Subscribed Int32"),
  694. UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, &newnodeId);
  695. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  696. UA_TargetVariablesDataType targetVars;
  697. targetVars.targetVariablesSize = 1;
  698. targetVars.targetVariables = (UA_FieldTargetDataType *)
  699. UA_calloc(targetVars.targetVariablesSize,
  700. sizeof(UA_FieldTargetDataType));
  701. /* For creating Targetvariable */
  702. UA_FieldTargetDataType_init(&targetVars.targetVariables[0]);
  703. targetVars.targetVariables[0].attributeId = UA_ATTRIBUTEID_VALUE;
  704. targetVars.targetVariables[0].targetNodeId = newnodeId;
  705. retVal |= UA_Server_DataSetReader_createTargetVariables(server, readerIdentifier,
  706. &targetVars);
  707. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  708. UA_TargetVariablesDataType_deleteMembers(&targetVars);
  709. UA_free(pMetaData->fields);
  710. /* run server - publisher and subscriber */
  711. UA_Server_run_iterate(server,true);
  712. /* Read data sent by the Publisher */
  713. UA_Variant *publishedNodeData = UA_Variant_new();
  714. retVal = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID), publishedNodeData);
  715. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  716. /* Read data received by the Subscriber */
  717. UA_Variant *subscribedNodeData = UA_Variant_new();
  718. retVal = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID), subscribedNodeData);
  719. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  720. /* Check if data sent from Publisher is being received by Subscriber */
  721. ck_assert_int_eq(*(UA_Int32 *)publishedNodeData->data, *(UA_Int32 *)subscribedNodeData->data);
  722. UA_Variant_delete(subscribedNodeData);
  723. UA_Variant_delete(publishedNodeData);
  724. } END_TEST
  725. START_TEST(SinglePublishSubscribeInt64) {
  726. /* To check status after running both publisher and subscriber */
  727. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  728. UA_PublishedDataSetConfig pdsConfig;
  729. UA_NodeId dataSetWriter;
  730. UA_NodeId readerIdentifier;
  731. UA_NodeId writerGroup;
  732. UA_DataSetReaderConfig readerConfig;
  733. /* Published DataSet */
  734. memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
  735. pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
  736. pdsConfig.name = UA_STRING("PublishedDataSet Test");
  737. UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSetTest);
  738. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  739. /* Create variable to publish integer data */
  740. UA_NodeId publisherNode;
  741. UA_VariableAttributes attr = UA_VariableAttributes_default;
  742. attr.description = UA_LOCALIZEDTEXT("en-US","Published Int64");
  743. attr.displayName = UA_LOCALIZEDTEXT("en-US","Published Int64");
  744. attr.dataType = UA_TYPES[UA_TYPES_INT64].typeId;
  745. UA_Int64 publisherData = 64;
  746. UA_Variant_setScalar(&attr.value, &publisherData, &UA_TYPES[UA_TYPES_INT64]);
  747. retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID),
  748. UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
  749. UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
  750. UA_QUALIFIEDNAME(1, "Published Int64"),
  751. UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
  752. attr, NULL, &publisherNode);
  753. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  754. /* Data Set Field */
  755. UA_NodeId dataSetFieldIdent;
  756. UA_DataSetFieldConfig dataSetFieldConfig;
  757. memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
  758. dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
  759. dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Published Int64");
  760. dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
  761. dataSetFieldConfig.field.variable.publishParameters.publishedVariable = publisherNode;
  762. dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
  763. UA_Server_addDataSetField (server, publishedDataSetTest, &dataSetFieldConfig, &dataSetFieldIdent);
  764. /* Writer group */
  765. UA_WriterGroupConfig writerGroupConfig;
  766. memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
  767. writerGroupConfig.name = UA_STRING("WriterGroup Test");
  768. writerGroupConfig.publishingInterval = PUBLISH_INTERVAL;
  769. writerGroupConfig.enabled = UA_FALSE;
  770. writerGroupConfig.writerGroupId = WRITER_GROUP_ID;
  771. writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
  772. /* Message settings in WriterGroup to include necessary headers */
  773. writerGroupConfig.messageSettings.encoding = UA_EXTENSIONOBJECT_DECODED;
  774. writerGroupConfig.messageSettings.content.decoded.type = &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
  775. UA_UadpWriterGroupMessageDataType *writerGroupMessage = UA_UadpWriterGroupMessageDataType_new();
  776. writerGroupMessage->networkMessageContentMask = (UA_UadpNetworkMessageContentMask)(UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID |
  777. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER |
  778. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID |
  779. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER);
  780. writerGroupConfig.messageSettings.content.decoded.data = writerGroupMessage;
  781. retVal |= UA_Server_addWriterGroup(server, connection_test, &writerGroupConfig, &writerGroup);
  782. UA_UadpWriterGroupMessageDataType_delete(writerGroupMessage);
  783. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  784. /* DataSetWriter */
  785. UA_DataSetWriterConfig dataSetWriterConfig;
  786. memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
  787. dataSetWriterConfig.name = UA_STRING("DataSetWriter Test");
  788. dataSetWriterConfig.dataSetWriterId = DATASET_WRITER_ID;
  789. dataSetWriterConfig.keyFrameCount = 10;
  790. retVal |= UA_Server_addDataSetWriter(server, writerGroup, publishedDataSetTest, &dataSetWriterConfig, &dataSetWriter);
  791. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  792. /* Reader Group */
  793. UA_ReaderGroupConfig readerGroupConfig;
  794. memset (&readerGroupConfig, 0, sizeof (UA_ReaderGroupConfig));
  795. readerGroupConfig.name = UA_STRING ("ReaderGroup Test");
  796. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &readerGroupTest);
  797. /* Data Set Reader */
  798. /* Parameters to filter received NetworkMessage */
  799. memset (&readerConfig, 0, sizeof (UA_DataSetReaderConfig));
  800. readerConfig.name = UA_STRING ("DataSetReader Test");
  801. UA_UInt16 publisherIdentifier = PUBLISHER_ID;
  802. readerConfig.publisherId.type = &UA_TYPES[UA_TYPES_UINT16];
  803. readerConfig.publisherId.data = &publisherIdentifier;
  804. readerConfig.writerGroupId = WRITER_GROUP_ID;
  805. readerConfig.dataSetWriterId = DATASET_WRITER_ID;
  806. /* Setting up Meta data configuration in DataSetReader */
  807. UA_DataSetMetaDataType *pMetaData = &readerConfig.dataSetMetaData;
  808. /* FilltestMetadata function in subscriber implementation */
  809. UA_DataSetMetaDataType_init (pMetaData);
  810. pMetaData->name = UA_STRING ("DataSet Test");
  811. /* Static definition of number of fields size to 1 to create one
  812. targetVariable */
  813. pMetaData->fieldsSize = 1;
  814. pMetaData->fields = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
  815. &UA_TYPES[UA_TYPES_FIELDMETADATA]);
  816. /* Unsigned Integer DataType */
  817. UA_FieldMetaData_init (&pMetaData->fields[0]);
  818. UA_NodeId_copy (&UA_TYPES[UA_TYPES_INT64].typeId,
  819. &pMetaData->fields[0].dataType);
  820. pMetaData->fields[0].builtInType = UA_NS0ID_INT64;
  821. pMetaData->fields[0].valueRank = -1; /* scalar */
  822. retVal |= UA_Server_addDataSetReader(server, readerGroupTest, &readerConfig,
  823. &readerIdentifier);
  824. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  825. /* Add Subscribed Variables */
  826. UA_NodeId folderId;
  827. UA_NodeId newnodeId;
  828. UA_String folderName = readerConfig.dataSetMetaData.name;
  829. UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
  830. UA_QualifiedName folderBrowseName;
  831. if (folderName.length > 0) {
  832. oAttr.displayName.locale = UA_STRING ("en-US");
  833. oAttr.displayName.text = folderName;
  834. folderBrowseName.namespaceIndex = 1;
  835. folderBrowseName.name = folderName;
  836. }
  837. else {
  838. oAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Variables");
  839. folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
  840. }
  841. retVal = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
  842. UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
  843. UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
  844. folderBrowseName, UA_NODEID_NUMERIC(0,
  845. UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
  846. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  847. /* Variable to subscribe data */
  848. UA_VariableAttributes vAttr = UA_VariableAttributes_default;
  849. vAttr.description = UA_LOCALIZEDTEXT ("en-US", "Subscribed Int64");
  850. vAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Int64");
  851. vAttr.dataType = UA_TYPES[UA_TYPES_INT64].typeId;
  852. retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID),
  853. UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
  854. UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_QUALIFIEDNAME(1, "Subscribed Int64"),
  855. UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, &newnodeId);
  856. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  857. UA_TargetVariablesDataType targetVars;
  858. targetVars.targetVariablesSize = 1;
  859. targetVars.targetVariables = (UA_FieldTargetDataType *)
  860. UA_calloc(targetVars.targetVariablesSize,
  861. sizeof(UA_FieldTargetDataType));
  862. /* For creating Targetvariable */
  863. UA_FieldTargetDataType_init(&targetVars.targetVariables[0]);
  864. targetVars.targetVariables[0].attributeId = UA_ATTRIBUTEID_VALUE;
  865. targetVars.targetVariables[0].targetNodeId = newnodeId;
  866. retVal |= UA_Server_DataSetReader_createTargetVariables(server, readerIdentifier,
  867. &targetVars);
  868. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  869. UA_TargetVariablesDataType_deleteMembers(&targetVars);
  870. UA_free(pMetaData->fields);
  871. /* run server - publisher and subscriber */
  872. UA_Server_run_iterate(server,true);
  873. /* Read data sent by the Publisher */
  874. UA_Variant *publishedNodeData = UA_Variant_new();
  875. retVal = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID), publishedNodeData);
  876. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  877. /* Read data received by the Subscriber */
  878. UA_Variant *subscribedNodeData = UA_Variant_new();
  879. retVal = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID), subscribedNodeData);
  880. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  881. /* Check if data sent from Publisher is being received by Subscriber */
  882. ck_assert_int_eq(*(UA_Int64 *)publishedNodeData->data, *(UA_Int64 *)subscribedNodeData->data);
  883. UA_Variant_delete(subscribedNodeData);
  884. UA_Variant_delete(publishedNodeData);
  885. } END_TEST
  886. START_TEST(SinglePublishSubscribeBool) {
  887. /* To check status after running both publisher and subscriber */
  888. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  889. UA_PublishedDataSetConfig pdsConfig;
  890. UA_NodeId dataSetWriter;
  891. UA_NodeId readerIdentifier;
  892. UA_NodeId writerGroup;
  893. UA_DataSetReaderConfig readerConfig;
  894. /* Published DataSet */
  895. memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
  896. pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
  897. pdsConfig.name = UA_STRING("PublishedDataSet Test");
  898. UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSetTest);
  899. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  900. /* Create variable to publish boolean data */
  901. UA_NodeId publisherNode;
  902. UA_VariableAttributes attr = UA_VariableAttributes_default;
  903. attr.description = UA_LOCALIZEDTEXT("en-US","Published Bool");
  904. attr.displayName = UA_LOCALIZEDTEXT("en-US","Published Bool");
  905. attr.dataType = UA_TYPES[UA_TYPES_BOOLEAN].typeId;
  906. UA_Boolean publisherData = UA_FALSE;
  907. UA_Variant_setScalar(&attr.value, &publisherData, &UA_TYPES[UA_TYPES_BOOLEAN]);
  908. retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID),
  909. UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
  910. UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
  911. UA_QUALIFIEDNAME(1, "Published Bool"),
  912. UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
  913. attr, NULL, &publisherNode);
  914. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  915. /* Data Set Field */
  916. UA_NodeId dataSetFieldIdent;
  917. UA_DataSetFieldConfig dataSetFieldConfig;
  918. memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
  919. dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
  920. dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Published Bool");
  921. dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
  922. dataSetFieldConfig.field.variable.publishParameters.publishedVariable = publisherNode;
  923. dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
  924. UA_Server_addDataSetField (server, publishedDataSetTest, &dataSetFieldConfig, &dataSetFieldIdent);
  925. /* Writer group */
  926. UA_WriterGroupConfig writerGroupConfig;
  927. memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
  928. writerGroupConfig.name = UA_STRING("WriterGroup Test");
  929. writerGroupConfig.publishingInterval = PUBLISH_INTERVAL;
  930. writerGroupConfig.enabled = UA_FALSE;
  931. writerGroupConfig.writerGroupId = WRITER_GROUP_ID;
  932. writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
  933. /* Message settings in WriterGroup to include necessary headers */
  934. writerGroupConfig.messageSettings.encoding = UA_EXTENSIONOBJECT_DECODED;
  935. writerGroupConfig.messageSettings.content.decoded.type = &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
  936. UA_UadpWriterGroupMessageDataType *writerGroupMessage = UA_UadpWriterGroupMessageDataType_new();
  937. writerGroupMessage->networkMessageContentMask = (UA_UadpNetworkMessageContentMask)(UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID |
  938. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER |
  939. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID |
  940. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER);
  941. writerGroupConfig.messageSettings.content.decoded.data = writerGroupMessage;
  942. retVal |= UA_Server_addWriterGroup(server, connection_test, &writerGroupConfig, &writerGroup);
  943. UA_UadpWriterGroupMessageDataType_delete(writerGroupMessage);
  944. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  945. /* DataSetWriter */
  946. UA_DataSetWriterConfig dataSetWriterConfig;
  947. memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
  948. dataSetWriterConfig.name = UA_STRING("DataSetWriter Test");
  949. dataSetWriterConfig.dataSetWriterId = DATASET_WRITER_ID;
  950. dataSetWriterConfig.keyFrameCount = 10;
  951. retVal |= UA_Server_addDataSetWriter(server, writerGroup, publishedDataSetTest, &dataSetWriterConfig, &dataSetWriter);
  952. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  953. /* Reader Group */
  954. UA_ReaderGroupConfig readerGroupConfig;
  955. memset (&readerGroupConfig, 0, sizeof (UA_ReaderGroupConfig));
  956. readerGroupConfig.name = UA_STRING ("ReaderGroup Test");
  957. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &readerGroupTest);
  958. /* Data Set Reader */
  959. /* Parameters to filter received NetworkMessage */
  960. memset (&readerConfig, 0, sizeof (UA_DataSetReaderConfig));
  961. readerConfig.name = UA_STRING ("DataSetReader Test");
  962. UA_UInt16 publisherIdentifier = PUBLISHER_ID;
  963. readerConfig.publisherId.type = &UA_TYPES[UA_TYPES_UINT16];
  964. readerConfig.publisherId.data = &publisherIdentifier;
  965. readerConfig.writerGroupId = WRITER_GROUP_ID;
  966. readerConfig.dataSetWriterId = DATASET_WRITER_ID;
  967. /* Setting up Meta data configuration in DataSetReader */
  968. UA_DataSetMetaDataType *pMetaData = &readerConfig.dataSetMetaData;
  969. /* FilltestMetadata function in subscriber implementation */
  970. UA_DataSetMetaDataType_init (pMetaData);
  971. pMetaData->name = UA_STRING ("DataSet Test");
  972. /* Static definition of number of fields size to 1 to create one
  973. targetVariable */
  974. pMetaData->fieldsSize = 1;
  975. pMetaData->fields = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
  976. &UA_TYPES[UA_TYPES_FIELDMETADATA]);
  977. /* Boolean DataType */
  978. UA_FieldMetaData_init (&pMetaData->fields[0]);
  979. UA_NodeId_copy (&UA_TYPES[UA_TYPES_BOOLEAN].typeId,
  980. &pMetaData->fields[0].dataType);
  981. pMetaData->fields[0].builtInType = UA_NS0ID_BOOLEAN;
  982. pMetaData->fields[0].valueRank = -1; /* scalar */
  983. retVal |= UA_Server_addDataSetReader(server, readerGroupTest, &readerConfig,
  984. &readerIdentifier);
  985. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  986. /* Add Subscribed Variables */
  987. UA_NodeId folderId;
  988. UA_NodeId newnodeId;
  989. UA_String folderName = readerConfig.dataSetMetaData.name;
  990. UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
  991. UA_QualifiedName folderBrowseName;
  992. if (folderName.length > 0) {
  993. oAttr.displayName.locale = UA_STRING ("en-US");
  994. oAttr.displayName.text = folderName;
  995. folderBrowseName.namespaceIndex = 1;
  996. folderBrowseName.name = folderName;
  997. }
  998. else {
  999. oAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Variables");
  1000. folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
  1001. }
  1002. retVal = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
  1003. UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
  1004. UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
  1005. folderBrowseName, UA_NODEID_NUMERIC(0,
  1006. UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
  1007. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1008. /* Variable to subscribe data */
  1009. UA_VariableAttributes vAttr = UA_VariableAttributes_default;
  1010. vAttr.description = UA_LOCALIZEDTEXT ("en-US", "Subscribed Bool");
  1011. vAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Bool");
  1012. vAttr.dataType = UA_TYPES[UA_TYPES_BOOLEAN].typeId;
  1013. retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID),
  1014. UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
  1015. UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_QUALIFIEDNAME(1, "Subscribed Bool"),
  1016. UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, &newnodeId);
  1017. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1018. UA_TargetVariablesDataType targetVars;
  1019. targetVars.targetVariablesSize = 1;
  1020. targetVars.targetVariables = (UA_FieldTargetDataType *)
  1021. UA_calloc(targetVars.targetVariablesSize,
  1022. sizeof(UA_FieldTargetDataType));
  1023. /* For creating Targetvariable */
  1024. UA_FieldTargetDataType_init(&targetVars.targetVariables[0]);
  1025. targetVars.targetVariables[0].attributeId = UA_ATTRIBUTEID_VALUE;
  1026. targetVars.targetVariables[0].targetNodeId = newnodeId;
  1027. retVal |= UA_Server_DataSetReader_createTargetVariables(server, readerIdentifier,
  1028. &targetVars);
  1029. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1030. UA_TargetVariablesDataType_deleteMembers(&targetVars);
  1031. UA_free(pMetaData->fields);
  1032. /* run server - publisher and subscriber */
  1033. UA_Server_run_iterate(server,true);
  1034. /* Read data sent by the Publisher */
  1035. UA_Variant *publishedNodeData = UA_Variant_new();
  1036. retVal = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID), publishedNodeData);
  1037. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1038. /* Read data received by the Subscriber */
  1039. UA_Variant *subscribedNodeData = UA_Variant_new();
  1040. retVal = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID), subscribedNodeData);
  1041. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1042. /* Check if data sent from Publisher is being received by Subscriber */
  1043. ck_assert_int_eq(*(UA_Boolean *)publishedNodeData->data, *(UA_Boolean *)subscribedNodeData->data);
  1044. UA_Variant_delete(subscribedNodeData);
  1045. UA_Variant_delete(publishedNodeData);
  1046. } END_TEST
  1047. START_TEST(SinglePublishSubscribewithValidIdentifiers) {
  1048. /* To check status after running both publisher and subscriber */
  1049. UA_StatusCode retVal = UA_STATUSCODE_GOOD;
  1050. UA_PublishedDataSetConfig pdsConfig;
  1051. UA_NodeId dataSetWriter;
  1052. UA_NodeId readerIdentifier;
  1053. UA_NodeId writerGroup;
  1054. UA_DataSetReaderConfig readerConfig;
  1055. /* Published DataSet */
  1056. memset(&pdsConfig, 0, sizeof(UA_PublishedDataSetConfig));
  1057. pdsConfig.publishedDataSetType = UA_PUBSUB_DATASET_PUBLISHEDITEMS;
  1058. pdsConfig.name = UA_STRING("PublishedDataSet Test");
  1059. UA_Server_addPublishedDataSet(server, &pdsConfig, &publishedDataSetTest);
  1060. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1061. /* Create variable to publish integer data */
  1062. UA_NodeId publisherNode;
  1063. UA_VariableAttributes attr = UA_VariableAttributes_default;
  1064. attr.description = UA_LOCALIZEDTEXT("en-US","Published Integer");
  1065. attr.displayName = UA_LOCALIZEDTEXT("en-US","Published Integer");
  1066. attr.dataType = UA_TYPES[UA_TYPES_UINT32].typeId;
  1067. attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
  1068. UA_UInt32 publisherData = PUBLISHER_DATA;
  1069. UA_Variant_setScalar(&attr.value, &publisherData, &UA_TYPES[UA_TYPES_UINT32]);
  1070. retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID),
  1071. UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
  1072. UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
  1073. UA_QUALIFIEDNAME(1, "Published Integer"),
  1074. UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
  1075. attr, NULL, &publisherNode);
  1076. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1077. /* Data Set Field */
  1078. UA_NodeId dataSetFieldIdent;
  1079. UA_DataSetFieldConfig dataSetFieldConfig;
  1080. memset(&dataSetFieldConfig, 0, sizeof(UA_DataSetFieldConfig));
  1081. dataSetFieldConfig.dataSetFieldType = UA_PUBSUB_DATASETFIELD_VARIABLE;
  1082. dataSetFieldConfig.field.variable.fieldNameAlias = UA_STRING("Published Integer");
  1083. dataSetFieldConfig.field.variable.promotedField = UA_FALSE;
  1084. dataSetFieldConfig.field.variable.publishParameters.publishedVariable = publisherNode;
  1085. dataSetFieldConfig.field.variable.publishParameters.attributeId = UA_ATTRIBUTEID_VALUE;
  1086. UA_Server_addDataSetField (server, publishedDataSetTest, &dataSetFieldConfig, &dataSetFieldIdent);
  1087. /* Writer group */
  1088. UA_WriterGroupConfig writerGroupConfig;
  1089. memset(&writerGroupConfig, 0, sizeof(writerGroupConfig));
  1090. writerGroupConfig.name = UA_STRING("WriterGroup Test");
  1091. writerGroupConfig.publishingInterval = PUBLISH_INTERVAL;
  1092. writerGroupConfig.enabled = UA_FALSE;
  1093. writerGroupConfig.writerGroupId = WRITER_GROUP_ID;
  1094. writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
  1095. /* Message settings in WriterGroup to include necessary headers */
  1096. writerGroupConfig.messageSettings.encoding = UA_EXTENSIONOBJECT_DECODED;
  1097. writerGroupConfig.messageSettings.content.decoded.type = &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
  1098. UA_UadpWriterGroupMessageDataType *writerGroupMessage = UA_UadpWriterGroupMessageDataType_new();
  1099. writerGroupMessage->networkMessageContentMask = (UA_UadpNetworkMessageContentMask)(UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID |
  1100. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER |
  1101. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID |
  1102. (UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER);
  1103. writerGroupConfig.messageSettings.content.decoded.data = writerGroupMessage;
  1104. retVal |= UA_Server_addWriterGroup(server, connection_test, &writerGroupConfig, &writerGroup);
  1105. UA_UadpWriterGroupMessageDataType_delete(writerGroupMessage);
  1106. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1107. /* DataSetWriter */
  1108. UA_DataSetWriterConfig dataSetWriterConfig;
  1109. memset(&dataSetWriterConfig, 0, sizeof(dataSetWriterConfig));
  1110. dataSetWriterConfig.name = UA_STRING("DataSetWriter Test");
  1111. dataSetWriterConfig.dataSetWriterId = DATASET_WRITER_ID;
  1112. dataSetWriterConfig.keyFrameCount = 10;
  1113. retVal |= UA_Server_addDataSetWriter(server, writerGroup, publishedDataSetTest, &dataSetWriterConfig, &dataSetWriter);
  1114. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1115. /* Reader Group */
  1116. UA_ReaderGroupConfig readerGroupConfig;
  1117. memset (&readerGroupConfig, 0, sizeof (UA_ReaderGroupConfig));
  1118. readerGroupConfig.name = UA_STRING ("ReaderGroup Test");
  1119. retVal |= UA_Server_addReaderGroup(server, connection_test, &readerGroupConfig, &readerGroupTest);
  1120. /* Data Set Reader */
  1121. /* Parameters to filter received NetworkMessage */
  1122. memset (&readerConfig, 0, sizeof (UA_DataSetReaderConfig));
  1123. readerConfig.name = UA_STRING ("DataSetReader Test");
  1124. UA_UInt16 publisherIdentifier = PUBLISHER_ID;
  1125. readerConfig.publisherId.type = &UA_TYPES[UA_TYPES_UINT16];
  1126. readerConfig.publisherId.data = &publisherIdentifier;
  1127. readerConfig.writerGroupId = WRITER_GROUP_ID;
  1128. readerConfig.dataSetWriterId = DATASET_WRITER_ID;
  1129. /* Setting up Meta data configuration in DataSetReader */
  1130. UA_DataSetMetaDataType *pMetaData = &readerConfig.dataSetMetaData;
  1131. /* FilltestMetadata function in subscriber implementation */
  1132. UA_DataSetMetaDataType_init (pMetaData);
  1133. pMetaData->name = UA_STRING ("DataSet Test");
  1134. /* Static definition of number of fields size to 1 to create one
  1135. targetVariable */
  1136. pMetaData->fieldsSize = 1;
  1137. pMetaData->fields = (UA_FieldMetaData*)UA_Array_new (pMetaData->fieldsSize,
  1138. &UA_TYPES[UA_TYPES_FIELDMETADATA]);
  1139. /* Unsigned Integer DataType */
  1140. UA_FieldMetaData_init (&pMetaData->fields[0]);
  1141. UA_NodeId_copy (&UA_TYPES[UA_TYPES_UINT32].typeId,
  1142. &pMetaData->fields[0].dataType);
  1143. pMetaData->fields[0].builtInType = UA_NS0ID_UINT32;
  1144. pMetaData->fields[0].valueRank = -1; /* scalar */
  1145. retVal |= UA_Server_addDataSetReader(server, readerGroupTest, &readerConfig,
  1146. &readerIdentifier);
  1147. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1148. /* Add Subscribed Variables */
  1149. UA_NodeId folderId;
  1150. UA_NodeId newnodeId;
  1151. UA_String folderName = readerConfig.dataSetMetaData.name;
  1152. UA_ObjectAttributes oAttr = UA_ObjectAttributes_default;
  1153. UA_QualifiedName folderBrowseName;
  1154. if (folderName.length > 0) {
  1155. oAttr.displayName.locale = UA_STRING ("en-US");
  1156. oAttr.displayName.text = folderName;
  1157. folderBrowseName.namespaceIndex = 1;
  1158. folderBrowseName.name = folderName;
  1159. }
  1160. else {
  1161. oAttr.displayName = UA_LOCALIZEDTEXT ("en-US", "Subscribed Variables");
  1162. folderBrowseName = UA_QUALIFIEDNAME (1, "Subscribed Variables");
  1163. }
  1164. retVal = UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
  1165. UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
  1166. UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
  1167. folderBrowseName, UA_NODEID_NUMERIC(0,
  1168. UA_NS0ID_BASEOBJECTTYPE), oAttr, NULL, &folderId);
  1169. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1170. /* Variable to subscribe data */
  1171. UA_VariableAttributes vAttr = UA_VariableAttributes_default;
  1172. vAttr.displayName.locale = UA_STRING ("en-US");
  1173. vAttr.displayName.text = UA_STRING ("Subscribed Integer");
  1174. vAttr.valueRank = -1;
  1175. retVal = UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID),
  1176. UA_NODEID_NUMERIC(1, SUBSCRIBEOBJECT_NODEID),
  1177. UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_QUALIFIEDNAME(1, "Subscribed Integer"),
  1178. UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), vAttr, NULL, &newnodeId);
  1179. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1180. UA_TargetVariablesDataType targetVars;
  1181. targetVars.targetVariablesSize = 1;
  1182. targetVars.targetVariables = (UA_FieldTargetDataType *)
  1183. UA_calloc(targetVars.targetVariablesSize,
  1184. sizeof(UA_FieldTargetDataType));
  1185. /* For creating Targetvariable */
  1186. UA_FieldTargetDataType_init(&targetVars.targetVariables[0]);
  1187. targetVars.targetVariables[0].attributeId = UA_ATTRIBUTEID_VALUE;
  1188. targetVars.targetVariables[0].targetNodeId = newnodeId;
  1189. retVal |= UA_Server_DataSetReader_createTargetVariables(server, readerIdentifier,
  1190. &targetVars);
  1191. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1192. UA_TargetVariablesDataType_deleteMembers(&targetVars);
  1193. UA_free(pMetaData->fields);
  1194. /* run server - publisher and subscriber */
  1195. UA_Server_run_iterate(server,true);
  1196. /* Read data sent by the Publisher */
  1197. UA_Variant *publishedNodeData = UA_Variant_new();
  1198. retVal = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, PUBLISHVARIABLE_NODEID), publishedNodeData);
  1199. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1200. /* Read data received by the Subscriber */
  1201. UA_Variant *subscribedNodeData = UA_Variant_new();
  1202. retVal = UA_Server_readValue(server, UA_NODEID_NUMERIC(1, SUBSCRIBEVARIABLE_NODEID), subscribedNodeData);
  1203. ck_assert_int_eq(retVal, UA_STATUSCODE_GOOD);
  1204. /* Check if data sent from Publisher is being received by Subscriber */
  1205. ck_assert_int_eq(*(UA_UInt32 *)publishedNodeData->data, *(UA_UInt32 *)subscribedNodeData->data);
  1206. UA_Variant_delete(subscribedNodeData);
  1207. UA_Variant_delete(publishedNodeData);
  1208. } END_TEST
  1209. int main(void) {
  1210. TCase *tc_add_pubsub_readergroup = tcase_create("PubSub readerGroup items handling");
  1211. tcase_add_checked_fixture(tc_add_pubsub_readergroup, setup, teardown);
  1212. /* Test cases for ReaderGroup functionality */
  1213. tcase_add_test(tc_add_pubsub_readergroup, AddReaderGroupWithValidConfiguration);
  1214. tcase_add_test(tc_add_pubsub_readergroup, AddReaderGroupWithNullConfig);
  1215. tcase_add_test(tc_add_pubsub_readergroup, AddReaderGroupWithInvalidConnectionId);
  1216. tcase_add_test(tc_add_pubsub_readergroup, RemoveReaderGroupWithInvalidIdentifier);
  1217. tcase_add_test(tc_add_pubsub_readergroup, AddRemoveMultipleAddReaderGroupWithValidConfiguration);
  1218. tcase_add_test(tc_add_pubsub_readergroup, UpdateReaderGroupWithInvalidIdentifier);
  1219. tcase_add_test(tc_add_pubsub_readergroup, GetReaderGroupConfigWithInvalidConfig);
  1220. tcase_add_test(tc_add_pubsub_readergroup, GetReaderGroupConfigWithInvalidIdentifier);
  1221. tcase_add_test(tc_add_pubsub_readergroup, GetReaderGroupConfigWithValidConfig);
  1222. /* Test cases for DataSetReader functionality */
  1223. tcase_add_test(tc_add_pubsub_readergroup, AddDataSetReaderWithValidConfiguration);
  1224. tcase_add_test(tc_add_pubsub_readergroup, AddDataSetReaderWithNullConfig);
  1225. tcase_add_test(tc_add_pubsub_readergroup, RemoveDataSetReaderWithValidConfiguration);
  1226. tcase_add_test(tc_add_pubsub_readergroup, RemoveDataSetReaderWithInvalidIdentifier);
  1227. tcase_add_test(tc_add_pubsub_readergroup, AddMultipleDataSetReaderWithValidConfiguration);
  1228. tcase_add_test(tc_add_pubsub_readergroup, UpdateDataSetReaderConfigWithInvalidId);
  1229. tcase_add_test(tc_add_pubsub_readergroup, GetDataSetReaderConfigWithValidConfiguration);
  1230. tcase_add_test(tc_add_pubsub_readergroup, GetDataSetReaderConfigWithInvalidConfiguration);
  1231. tcase_add_test(tc_add_pubsub_readergroup, GetDataSetReaderConfigWithInvalidIdentifier);
  1232. tcase_add_test(tc_add_pubsub_readergroup, CreateTargetVariableWithInvalidConfiguration);
  1233. tcase_add_test(tc_add_pubsub_readergroup, AddTargetVariableWithInvalidConfiguration);
  1234. tcase_add_test(tc_add_pubsub_readergroup, AddTargetVariableWithValidConfiguration);
  1235. /*Test case to run both publisher and subscriber */
  1236. TCase *tc_pubsub_publish_subscribe = tcase_create("Publisher publishing and Subscriber subscribing");
  1237. tcase_add_checked_fixture(tc_pubsub_publish_subscribe, setup, teardown);
  1238. tcase_add_test(tc_pubsub_publish_subscribe, SinglePublishSubscribeDateTime);
  1239. tcase_add_test(tc_pubsub_publish_subscribe, SinglePublishSubscribeInt32);
  1240. tcase_add_test(tc_pubsub_publish_subscribe, SinglePublishSubscribeInt64);
  1241. tcase_add_test(tc_pubsub_publish_subscribe, SinglePublishSubscribeBool);
  1242. tcase_add_test(tc_pubsub_publish_subscribe, SinglePublishSubscribewithValidIdentifiers);
  1243. Suite *suite = suite_create("PubSub readerGroups/reader/Fields handling and publishing");
  1244. suite_add_tcase(suite, tc_add_pubsub_readergroup);
  1245. suite_add_tcase(suite, tc_pubsub_publish_subscribe);
  1246. SRunner *suiteRunner = srunner_create(suite);
  1247. srunner_set_fork_status(suiteRunner, CK_NOFORK);
  1248. srunner_run_all(suiteRunner,CK_NORMAL);
  1249. int number_failed = srunner_ntests_failed(suiteRunner);
  1250. srunner_free(suiteRunner);
  1251. return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  1252. }