check_pubsub_subscribe.c 63 KB

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