check_services_attributes.c 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include "check.h"
  5. #include "server/ua_nodestore.h"
  6. #include "server/ua_services.h"
  7. #include "ua_client.h"
  8. #include "ua_nodeids.h"
  9. #include "ua_statuscodes.h"
  10. #include "ua_types.h"
  11. #include "ua_util.h"
  12. #include "server/ua_server_internal.h"
  13. //#include "server/ua_services_attribute.c"
  14. #ifdef UA_MULTITHREADING
  15. #include <pthread.h>
  16. #include <urcu.h>
  17. #endif
  18. static void copyNames(UA_Node *node, char *name) {
  19. node->browseName = UA_QUALIFIEDNAME_ALLOC(0, name);
  20. node->displayName = UA_LOCALIZEDTEXT_ALLOC("", name);
  21. node->description = UA_LOCALIZEDTEXT_ALLOC("", name);
  22. }
  23. static UA_Server* makeTestSequence(void) {
  24. UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
  25. /* VariableNode */
  26. UA_Variant *myIntegerVariant = UA_Variant_new();
  27. UA_Int32 myInteger = 42;
  28. UA_Variant_setScalarCopy(myIntegerVariant, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
  29. const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
  30. const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
  31. UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
  32. UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
  33. UA_Server_addVariableNode(server, myIntegerNodeId, myIntegerName, UA_LOCALIZEDTEXT("en_US","the answer"), UA_LOCALIZEDTEXT("en_US","the answer"), 0, 0,
  34. parentNodeId, parentReferenceNodeId, myIntegerVariant, NULL);
  35. /* ObjectNode */
  36. UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 50), UA_QUALIFIEDNAME(1, "Demo"), UA_LOCALIZEDTEXT("en_US","Demo"),
  37. UA_LOCALIZEDTEXT("en_US","Demo"), 0, 0, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
  38. UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
  39. /* ReferenceTypeNode */
  40. UA_ReferenceTypeNode *organizes = UA_ReferenceTypeNode_new();
  41. copyNames((UA_Node*)organizes, "Organizes");
  42. organizes->inverseName = UA_LOCALIZEDTEXT_ALLOC("", "OrganizedBy");
  43. organizes->nodeId.identifier.numeric = UA_NS0ID_ORGANIZES;
  44. organizes->isAbstract = UA_FALSE;
  45. organizes->symmetric = UA_FALSE;
  46. UA_Server_addNode(server, (UA_Node*)organizes, UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_HIERARCHICALREFERENCES), UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE));
  47. /* ViewNode */
  48. UA_ViewNode *viewtest = UA_ViewNode_new();
  49. copyNames((UA_Node*)viewtest, "Viewtest");
  50. viewtest->nodeId.identifier.numeric = UA_NS0ID_VIEWNODE;
  51. UA_Server_addNode(server, (UA_Node*)viewtest,
  52. UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_VIEWSFOLDER),
  53. UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE));
  54. /* MethodNode */
  55. UA_MethodNode *methodtest = UA_MethodNode_new();
  56. copyNames((UA_Node*)methodtest, "Methodtest");
  57. methodtest->nodeId.identifier.numeric = UA_NS0ID_METHODNODE;
  58. UA_Server_addNode(server, (UA_Node*)methodtest,
  59. UA_EXPANDEDNODEID_NUMERIC(0, 3),
  60. UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE));
  61. return server;
  62. }
  63. static UA_VariableNode* makeCompareSequence(void) {
  64. UA_VariableNode *node = UA_VariableNode_new();
  65. UA_Variant *myIntegerVariant = UA_Variant_new();
  66. UA_Int32 myInteger = 42;
  67. UA_Variant_setScalarCopy(myIntegerVariant, &myInteger,
  68. &UA_TYPES[UA_TYPES_INT32]);
  69. const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
  70. const UA_LocalizedText myIntegerDisplName = UA_LOCALIZEDTEXT("en_US", "the answer");
  71. const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
  72. UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
  73. //UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
  74. node->value.variant=*myIntegerVariant;
  75. UA_NodeId_copy(&myIntegerNodeId,&node->nodeId);
  76. UA_QualifiedName_copy(&myIntegerName,&node->browseName);
  77. UA_LocalizedText_copy(&myIntegerDisplName, &node->displayName);
  78. UA_LocalizedText_copy(&myIntegerDisplName, &node->description);
  79. UA_ExpandedNodeId parentId;
  80. UA_ExpandedNodeId_init(&parentId);
  81. UA_NodeId_copy(&parentNodeId,&parentId.nodeId);
  82. return node;
  83. }
  84. START_TEST(ReadSingleAttributeValueWithoutTimestamp) {
  85. UA_Server *server = makeTestSequence();
  86. UA_DataValue resp;
  87. UA_DataValue_init(&resp);
  88. UA_ReadRequest rReq;
  89. UA_ReadRequest_init(&rReq);
  90. rReq.nodesToRead = UA_ReadValueId_new();
  91. rReq.nodesToReadSize = 1;
  92. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  93. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_VALUE;
  94. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  95. ck_assert_int_eq(-1, resp.value.arrayLength);
  96. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_INT32], resp.value.type);
  97. ck_assert_int_eq(42, *(UA_Int32* )resp.value.data);
  98. UA_Server_delete(server);
  99. UA_ReadRequest_deleteMembers(&rReq);
  100. UA_DataValue_deleteMembers(&resp);
  101. } END_TEST
  102. START_TEST(ReadSingleAttributeNodeIdWithoutTimestamp) {
  103. UA_Server *server = makeTestSequence();
  104. UA_DataValue resp;
  105. UA_DataValue_init(&resp);
  106. UA_ReadRequest rReq;
  107. UA_ReadRequest_init(&rReq);
  108. rReq.nodesToRead = UA_ReadValueId_new();
  109. rReq.nodesToReadSize = 1;
  110. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  111. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_NODEID;
  112. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  113. UA_NodeId* respval = (UA_NodeId*) resp.value.data;
  114. const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
  115. ck_assert_int_eq(-1, resp.value.arrayLength);
  116. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_NODEID], resp.value.type);
  117. ck_assert_int_eq(1, respval->namespaceIndex);
  118. for (int var = 0; var < respval->identifier.string.length; ++var) {
  119. ck_assert_int_eq(myIntegerNodeId.identifier.string.data[var],
  120. respval->identifier.string.data[var]);
  121. }
  122. UA_free(respval);
  123. UA_ReadRequest_deleteMembers(&rReq);
  124. UA_DataValue_deleteMembers(&resp);
  125. UA_Server_delete(server);
  126. } END_TEST
  127. START_TEST(ReadSingleAttributeNodeClassWithoutTimestamp) {
  128. UA_Server *server = makeTestSequence();
  129. UA_DataValue resp;
  130. UA_DataValue_init(&resp);
  131. UA_ReadRequest rReq;
  132. UA_ReadRequest_init(&rReq);
  133. rReq.nodesToRead = UA_ReadValueId_new();
  134. rReq.nodesToReadSize = 1;
  135. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  136. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_NODECLASS;
  137. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  138. ck_assert_int_eq(-1, resp.value.arrayLength);
  139. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_INT32],resp.value.type);
  140. ck_assert_int_eq(*(UA_Int32*)resp.value.data,UA_NODECLASS_VARIABLE);
  141. UA_ReadRequest_deleteMembers(&rReq);
  142. UA_DataValue_deleteMembers(&resp);
  143. UA_Server_delete(server);
  144. } END_TEST
  145. START_TEST(ReadSingleAttributeBrowseNameWithoutTimestamp) {
  146. UA_Server *server = makeTestSequence();
  147. UA_DataValue resp;
  148. UA_DataValue_init(&resp);
  149. UA_ReadRequest rReq;
  150. UA_ReadRequest_init(&rReq);
  151. rReq.nodesToRead = UA_ReadValueId_new();
  152. rReq.nodesToReadSize = 1;
  153. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  154. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_BROWSENAME;
  155. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  156. UA_QualifiedName* respval = (UA_QualifiedName*) resp.value.data;
  157. const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
  158. ck_assert_int_eq(-1, resp.value.arrayLength);
  159. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_QUALIFIEDNAME], resp.value.type);
  160. ck_assert_int_eq(1, respval->namespaceIndex);
  161. ck_assert_int_eq(myIntegerName.name.length, respval->name.length);
  162. for (int var = 0; var < respval->name.length - 1; ++var) {
  163. ck_assert_int_eq(myIntegerName.name.data[var],
  164. respval->name.data[var]);
  165. }
  166. UA_free(respval);
  167. UA_ReadRequest_deleteMembers(&rReq);
  168. UA_DataValue_deleteMembers(&resp);
  169. UA_Server_delete(server);
  170. } END_TEST
  171. START_TEST(ReadSingleAttributeDisplayNameWithoutTimestamp) {
  172. UA_Server *server = makeTestSequence();
  173. UA_DataValue resp;
  174. UA_DataValue_init(&resp);
  175. UA_ReadRequest rReq;
  176. UA_ReadRequest_init(&rReq);
  177. rReq.nodesToRead = UA_ReadValueId_new();
  178. rReq.nodesToReadSize = 1;
  179. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  180. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_DISPLAYNAME;
  181. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  182. UA_LocalizedText* respval = (UA_LocalizedText*) resp.value.data;
  183. const UA_LocalizedText comp = UA_LOCALIZEDTEXT("locale", "the answer");
  184. UA_VariableNode* compNode = makeCompareSequence();
  185. ck_assert_int_eq(-1, resp.value.arrayLength);
  186. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_LOCALIZEDTEXT], resp.value.type);
  187. ck_assert_int_eq(comp.text.length, respval->text.length);
  188. for (int var = 0; var < respval->text.length - 1; ++var) {
  189. ck_assert_int_eq(comp.text.data[var], respval->text.data[var]);
  190. }
  191. ck_assert_int_eq(compNode->displayName.locale.length, respval->locale.length);
  192. for (int var = 0; var < respval->locale.length - 1; ++var) {
  193. ck_assert_int_eq(compNode->displayName.locale.data[var], respval->locale.data[var]);
  194. }
  195. UA_free(respval);
  196. UA_Server_delete(server);
  197. UA_ReadRequest_deleteMembers(&rReq);
  198. UA_DataValue_deleteMembers(&resp);
  199. UA_VariableNode_delete(compNode);
  200. } END_TEST
  201. START_TEST(ReadSingleAttributeDescriptionWithoutTimestamp) {
  202. UA_Server *server = makeTestSequence();
  203. UA_DataValue resp;
  204. UA_DataValue_init(&resp);
  205. UA_ReadRequest rReq;
  206. UA_ReadRequest_init(&rReq);
  207. rReq.nodesToRead = UA_ReadValueId_new();
  208. rReq.nodesToReadSize = 1;
  209. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  210. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_DESCRIPTION;
  211. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  212. UA_LocalizedText* respval = (UA_LocalizedText*) resp.value.data;
  213. UA_VariableNode* compNode = makeCompareSequence();
  214. ck_assert_int_eq(-1, resp.value.arrayLength);
  215. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_LOCALIZEDTEXT], resp.value.type);
  216. ck_assert_int_eq(compNode->description.locale.length, respval->locale.length);
  217. for (int var = 0; var < respval->locale.length - 1; ++var) {
  218. ck_assert_int_eq(compNode->description.locale.data[var], respval->locale.data[var]);
  219. }
  220. ck_assert_int_eq(compNode->description.text.length, respval->text.length);
  221. for (int var = 0; var < respval->text.length - 1; ++var) {
  222. ck_assert_int_eq(compNode->description.text.data[var], respval->text.data[var]);
  223. }
  224. UA_free(respval);
  225. UA_ReadRequest_deleteMembers(&rReq);
  226. UA_DataValue_deleteMembers(&resp);
  227. UA_VariableNode_delete(compNode);
  228. UA_Server_delete(server);
  229. } END_TEST
  230. START_TEST(ReadSingleAttributeWriteMaskWithoutTimestamp) {
  231. UA_Server *server = makeTestSequence();
  232. UA_DataValue resp;
  233. UA_DataValue_init(&resp);
  234. UA_ReadRequest rReq;
  235. UA_ReadRequest_init(&rReq);
  236. rReq.nodesToRead = UA_ReadValueId_new();
  237. rReq.nodesToReadSize = 1;
  238. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  239. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_WRITEMASK;
  240. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  241. UA_UInt32* respval = (UA_UInt32*) resp.value.data;
  242. ck_assert_int_eq(-1, resp.value.arrayLength);
  243. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_UINT32], resp.value.type);
  244. ck_assert_int_eq(0,*respval);
  245. UA_ReadRequest_deleteMembers(&rReq);
  246. UA_DataValue_deleteMembers(&resp);
  247. UA_Server_delete(server);
  248. } END_TEST
  249. START_TEST(ReadSingleAttributeUserWriteMaskWithoutTimestamp) {
  250. UA_Server *server = makeTestSequence();
  251. UA_DataValue resp;
  252. UA_DataValue_init(&resp);
  253. UA_ReadRequest rReq;
  254. UA_ReadRequest_init(&rReq);
  255. rReq.nodesToRead = UA_ReadValueId_new();
  256. rReq.nodesToReadSize = 1;
  257. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  258. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_USERWRITEMASK;
  259. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  260. UA_UInt32* respval = (UA_UInt32*) resp.value.data;
  261. ck_assert_int_eq(-1, resp.value.arrayLength);
  262. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_UINT32], resp.value.type);
  263. ck_assert_int_eq(0,*respval);
  264. UA_ReadRequest_deleteMembers(&rReq);
  265. UA_DataValue_deleteMembers(&resp);
  266. UA_Server_delete(server);
  267. } END_TEST
  268. START_TEST(ReadSingleAttributeIsAbstractWithoutTimestamp) {
  269. UA_Server *server = makeTestSequence();
  270. UA_DataValue resp;
  271. UA_DataValue_init(&resp);
  272. UA_ReadRequest rReq;
  273. UA_ReadRequest_init(&rReq);
  274. rReq.nodesToRead = UA_ReadValueId_new();
  275. rReq.nodesToReadSize = 1;
  276. rReq.nodesToRead[0].nodeId.identifier.numeric = UA_NS0ID_ORGANIZES;
  277. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_ISABSTRACT;
  278. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  279. ck_assert_int_eq(-1, resp.value.arrayLength);
  280. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_BOOLEAN], resp.value.type);
  281. ck_assert(*(UA_Boolean* )resp.value.data==UA_FALSE);
  282. UA_ReadRequest_deleteMembers(&rReq);
  283. UA_DataValue_deleteMembers(&resp);
  284. UA_Server_delete(server);
  285. } END_TEST
  286. START_TEST(ReadSingleAttributeSymmetricWithoutTimestamp) {
  287. UA_Server *server = makeTestSequence();
  288. UA_DataValue resp;
  289. UA_DataValue_init(&resp);
  290. UA_ReadRequest rReq;
  291. UA_ReadRequest_init(&rReq);
  292. rReq.nodesToRead = UA_ReadValueId_new();
  293. rReq.nodesToReadSize = 1;
  294. rReq.nodesToRead[0].nodeId.identifier.numeric = UA_NS0ID_ORGANIZES;
  295. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_SYMMETRIC;
  296. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  297. ck_assert_int_eq(-1, resp.value.arrayLength);
  298. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_BOOLEAN], resp.value.type);
  299. ck_assert(*(UA_Boolean* )resp.value.data==UA_FALSE);
  300. UA_ReadRequest_deleteMembers(&rReq);
  301. UA_DataValue_deleteMembers(&resp);
  302. UA_Server_delete(server);
  303. } END_TEST
  304. START_TEST(ReadSingleAttributeInverseNameWithoutTimestamp) {
  305. UA_Server *server = makeTestSequence();
  306. UA_DataValue resp;
  307. UA_DataValue_init(&resp);
  308. UA_ReadRequest rReq;
  309. UA_ReadRequest_init(&rReq);
  310. rReq.nodesToRead = UA_ReadValueId_new();
  311. rReq.nodesToReadSize = 1;
  312. rReq.nodesToRead[0].nodeId.identifier.numeric = UA_NS0ID_ORGANIZES;
  313. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_INVERSENAME;
  314. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  315. UA_LocalizedText* respval = (UA_LocalizedText*) resp.value.data;
  316. const UA_LocalizedText comp = UA_LOCALIZEDTEXT("en_US", "OrganizedBy");
  317. ck_assert_int_eq(-1, resp.value.arrayLength);
  318. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_LOCALIZEDTEXT],resp.value.type);
  319. ck_assert_int_eq(comp.text.length, respval->text.length);
  320. for (int var = 0; var < respval->text.length - 1; ++var) {
  321. ck_assert_int_eq(comp.text.data[var], respval->text.data[var]);
  322. }
  323. ck_assert_int_eq(comp.locale.length, respval->locale.length);
  324. for (int var = 0; var < respval->locale.length - 1; ++var) {
  325. ck_assert_int_eq(comp.locale.data[var], respval->locale.data[var]);
  326. }
  327. UA_free(respval);
  328. UA_ReadRequest_deleteMembers(&rReq);
  329. UA_DataValue_deleteMembers(&resp);
  330. UA_Server_delete(server);
  331. } END_TEST
  332. START_TEST(ReadSingleAttributeContainsNoLoopsWithoutTimestamp) {
  333. UA_Server *server = makeTestSequence();
  334. UA_DataValue resp;
  335. UA_DataValue_init(&resp);
  336. UA_ReadRequest rReq;
  337. UA_ReadRequest_init(&rReq);
  338. rReq.nodesToRead = UA_ReadValueId_new();
  339. rReq.nodesToReadSize = 1;
  340. rReq.nodesToRead[0].nodeId.identifier.numeric = UA_NS0ID_VIEWNODE;
  341. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_CONTAINSNOLOOPS;
  342. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  343. ck_assert_int_eq(-1, resp.value.arrayLength);
  344. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_BOOLEAN], resp.value.type);
  345. ck_assert(*(UA_Boolean* )resp.value.data==UA_FALSE);
  346. UA_ReadRequest_deleteMembers(&rReq);
  347. UA_DataValue_deleteMembers(&resp);
  348. UA_Server_delete(server);
  349. } END_TEST
  350. START_TEST(ReadSingleAttributeEventNotifierWithoutTimestamp) {
  351. UA_Server *server = makeTestSequence();
  352. UA_DataValue resp;
  353. UA_DataValue_init(&resp);
  354. UA_ReadRequest rReq;
  355. UA_ReadRequest_init(&rReq);
  356. rReq.nodesToRead = UA_ReadValueId_new();
  357. rReq.nodesToReadSize = 1;
  358. rReq.nodesToRead[0].nodeId = UA_NODEID_NUMERIC(1, 50);
  359. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_EVENTNOTIFIER;
  360. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  361. ck_assert_int_eq(-1, resp.value.arrayLength);
  362. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_BYTE],resp.value.type);
  363. ck_assert_int_eq(*(UA_Byte*)resp.value.data, 0);
  364. UA_ReadRequest_deleteMembers(&rReq);
  365. UA_DataValue_deleteMembers(&resp);
  366. UA_Server_delete(server);
  367. } END_TEST
  368. START_TEST(ReadSingleAttributeDataTypeWithoutTimestamp) {
  369. UA_Server *server = makeTestSequence();
  370. UA_DataValue resp;
  371. UA_DataValue_init(&resp);
  372. UA_ReadRequest rReq;
  373. UA_ReadRequest_init(&rReq);
  374. rReq.nodesToRead = UA_ReadValueId_new();
  375. rReq.nodesToReadSize = 1;
  376. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  377. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_DATATYPE;
  378. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  379. UA_NodeId* respval = (UA_NodeId*) resp.value.data;
  380. ck_assert_int_eq(-1, resp.value.arrayLength);
  381. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_NODEID], resp.value.type);
  382. ck_assert_int_eq(respval->namespaceIndex,0);
  383. ck_assert_int_eq(respval->identifier.numeric,UA_NS0ID_INT32);
  384. UA_ReadRequest_deleteMembers(&rReq);
  385. UA_DataValue_deleteMembers(&resp);
  386. UA_Server_delete(server);
  387. } END_TEST
  388. START_TEST(ReadSingleAttributeValueRankWithoutTimestamp) {
  389. UA_Server *server = makeTestSequence();
  390. UA_DataValue resp;
  391. UA_DataValue_init(&resp);
  392. UA_ReadRequest rReq;
  393. UA_ReadRequest_init(&rReq);
  394. rReq.nodesToRead = UA_ReadValueId_new();
  395. rReq.nodesToReadSize = 1;
  396. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  397. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_VALUERANK;
  398. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  399. ck_assert_int_eq(-1, resp.value.arrayLength);
  400. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_INT32], resp.value.type);
  401. ck_assert_int_eq(-2, *(UA_Int32* )resp.value.data);
  402. UA_ReadRequest_deleteMembers(&rReq);
  403. UA_DataValue_deleteMembers(&resp);
  404. UA_Server_delete(server);
  405. } END_TEST
  406. START_TEST(ReadSingleAttributeArrayDimensionsWithoutTimestamp) {
  407. UA_Server *server = makeTestSequence();
  408. UA_DataValue resp;
  409. UA_DataValue_init(&resp);
  410. UA_ReadRequest rReq;
  411. UA_ReadRequest_init(&rReq);
  412. rReq.nodesToRead = UA_ReadValueId_new();
  413. rReq.nodesToReadSize = 1;
  414. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  415. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS;
  416. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  417. ck_assert_int_eq(-1, resp.value.arrayLength);
  418. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_INT32], resp.value.type);
  419. ck_assert_ptr_eq((UA_Int32*)resp.value.data,0);
  420. UA_DataValue_deleteMembers(&resp);
  421. UA_ReadRequest_deleteMembers(&rReq);
  422. UA_Server_delete(server);
  423. } END_TEST
  424. START_TEST(ReadSingleAttributeAccessLevelWithoutTimestamp) {
  425. UA_Server *server = makeTestSequence();
  426. UA_DataValue resp;
  427. UA_DataValue_init(&resp);
  428. UA_ReadRequest rReq;
  429. UA_ReadRequest_init(&rReq);
  430. rReq.nodesToRead = UA_ReadValueId_new();
  431. rReq.nodesToReadSize = 1;
  432. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  433. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_ACCESSLEVEL;
  434. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  435. ck_assert_int_eq(-1, resp.value.arrayLength);
  436. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_BYTE], resp.value.type);
  437. ck_assert_int_eq(*(UA_Byte*)resp.value.data, 0);
  438. UA_DataValue_deleteMembers(&resp);
  439. UA_ReadRequest_deleteMembers(&rReq);
  440. UA_Server_delete(server);
  441. } END_TEST
  442. START_TEST(ReadSingleAttributeUserAccessLevelWithoutTimestamp) {
  443. UA_Server *server = makeTestSequence();
  444. UA_DataValue resp;
  445. UA_DataValue_init(&resp);
  446. UA_ReadRequest rReq;
  447. UA_ReadRequest_init(&rReq);
  448. rReq.nodesToRead = UA_ReadValueId_new();
  449. rReq.nodesToReadSize = 1;
  450. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  451. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_USERACCESSLEVEL;
  452. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  453. UA_VariableNode* compNode = makeCompareSequence();
  454. ck_assert_int_eq(-1, resp.value.arrayLength);
  455. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_BYTE], resp.value.type);
  456. ck_assert_int_eq(*(UA_Byte*)resp.value.data, compNode->userAccessLevel);
  457. UA_Server_delete(server);
  458. UA_DataValue_deleteMembers(&resp);
  459. UA_ReadRequest_deleteMembers(&rReq);
  460. UA_VariableNode_delete(compNode);
  461. } END_TEST
  462. START_TEST(ReadSingleAttributeMinimumSamplingIntervalWithoutTimestamp) {
  463. UA_Server *server = makeTestSequence();
  464. UA_DataValue resp;
  465. UA_DataValue_init(&resp);
  466. UA_ReadRequest rReq;
  467. UA_ReadRequest_init(&rReq);
  468. rReq.nodesToRead = UA_ReadValueId_new();
  469. rReq.nodesToReadSize = 1;
  470. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  471. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL;
  472. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  473. UA_Double* respval = (UA_Double*) resp.value.data;
  474. UA_VariableNode *compNode = makeCompareSequence();
  475. UA_Double comp = (UA_Double) compNode->minimumSamplingInterval;
  476. ck_assert_int_eq(-1, resp.value.arrayLength);
  477. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_DOUBLE], resp.value.type);
  478. ck_assert(*respval == comp);
  479. UA_DataValue_deleteMembers(&resp);
  480. UA_ReadRequest_deleteMembers(&rReq);
  481. UA_VariableNode_delete(compNode);
  482. UA_Server_delete(server);
  483. } END_TEST
  484. START_TEST(ReadSingleAttributeHistorizingWithoutTimestamp) {
  485. UA_Server *server = makeTestSequence();
  486. UA_DataValue resp;
  487. UA_DataValue_init(&resp);
  488. UA_ReadRequest rReq;
  489. UA_ReadRequest_init(&rReq);
  490. rReq.nodesToRead = UA_ReadValueId_new();
  491. rReq.nodesToReadSize = 1;
  492. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  493. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_HISTORIZING;
  494. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  495. ck_assert_int_eq(-1, resp.value.arrayLength);
  496. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_BOOLEAN], resp.value.type);
  497. ck_assert(*(UA_Boolean* )resp.value.data==UA_FALSE);
  498. UA_ReadRequest_deleteMembers(&rReq);
  499. UA_DataValue_deleteMembers(&resp);
  500. UA_Server_delete(server);
  501. } END_TEST
  502. START_TEST(ReadSingleAttributeExecutableWithoutTimestamp) {
  503. UA_Server *server = makeTestSequence();
  504. UA_DataValue resp;
  505. UA_DataValue_init(&resp);
  506. UA_ReadRequest rReq;
  507. UA_ReadRequest_init(&rReq);
  508. rReq.nodesToRead = UA_ReadValueId_new();
  509. rReq.nodesToReadSize = 1;
  510. rReq.nodesToRead[0].nodeId.identifier.numeric = UA_NS0ID_METHODNODE;
  511. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_EXECUTABLE;
  512. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  513. ck_assert_int_eq(-1, resp.value.arrayLength);
  514. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_BOOLEAN], resp.value.type);
  515. ck_assert(*(UA_Boolean*)resp.value.data==UA_FALSE);
  516. UA_DataValue_deleteMembers(&resp);
  517. UA_ReadRequest_deleteMembers(&rReq);
  518. UA_Server_delete(server);
  519. } END_TEST
  520. START_TEST(ReadSingleAttributeUserExecutableWithoutTimestamp) {
  521. UA_Server *server = makeTestSequence();
  522. UA_DataValue resp;
  523. UA_DataValue_init(&resp);
  524. UA_ReadRequest rReq;
  525. UA_ReadRequest_init(&rReq);
  526. rReq.nodesToRead = UA_ReadValueId_new();
  527. rReq.nodesToReadSize = 1;
  528. rReq.nodesToRead[0].nodeId.identifier.numeric = UA_NS0ID_METHODNODE;
  529. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_USEREXECUTABLE;
  530. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  531. ck_assert_int_eq(-1, resp.value.arrayLength);
  532. ck_assert_ptr_eq(&UA_TYPES[UA_TYPES_BOOLEAN], resp.value.type);
  533. ck_assert(*(UA_Boolean*)resp.value.data==UA_FALSE);
  534. UA_DataValue_deleteMembers(&resp);
  535. UA_ReadRequest_deleteMembers(&rReq);
  536. UA_Server_delete(server);
  537. } END_TEST
  538. /* Tests for writeValue method */
  539. START_TEST(WriteSingleAttributeNodeId) {
  540. UA_Server *server = makeTestSequence();
  541. UA_WriteValue wValue;
  542. UA_WriteValue_init(&wValue);
  543. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  544. wValue.attributeId = UA_ATTRIBUTEID_NODEID;
  545. wValue.value.hasValue = UA_TRUE;
  546. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  547. ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
  548. UA_Server_delete(server);
  549. } END_TEST
  550. START_TEST(WriteSingleAttributeNodeclass) {
  551. UA_Server *server = makeTestSequence();
  552. UA_WriteValue wValue;
  553. UA_WriteValue_init(&wValue);
  554. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  555. wValue.attributeId = UA_ATTRIBUTEID_NODECLASS;
  556. wValue.value.hasValue = UA_TRUE;
  557. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  558. ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
  559. UA_Server_delete(server);
  560. } END_TEST
  561. START_TEST(WriteSingleAttributeBrowseName) {
  562. UA_Server *server = makeTestSequence();
  563. UA_WriteValue wValue;
  564. UA_WriteValue_init(&wValue);
  565. UA_QualifiedName testValue = UA_QUALIFIEDNAME(1, "the.answer");
  566. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
  567. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  568. wValue.attributeId = UA_ATTRIBUTEID_BROWSENAME;
  569. wValue.value.hasValue = UA_TRUE;
  570. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  571. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  572. UA_Server_delete(server);
  573. } END_TEST
  574. START_TEST(WriteSingleAttributeDisplayName) {
  575. UA_Server *server = makeTestSequence();
  576. UA_WriteValue wValue;
  577. UA_WriteValue_init(&wValue);
  578. UA_LocalizedText testValue = UA_LOCALIZEDTEXT("en_EN", "the.answer");
  579. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
  580. wValue.value.hasValue = UA_TRUE;
  581. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  582. wValue.attributeId = UA_ATTRIBUTEID_DISPLAYNAME;
  583. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  584. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  585. UA_Server_delete(server);
  586. } END_TEST
  587. START_TEST(WriteSingleAttributeDescription) {
  588. UA_Server *server = makeTestSequence();
  589. UA_WriteValue wValue;
  590. UA_WriteValue_init(&wValue);
  591. UA_LocalizedText testValue = UA_LOCALIZEDTEXT("en_EN", "the.answer");
  592. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
  593. wValue.value.hasValue = UA_TRUE;
  594. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  595. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  596. wValue.attributeId = UA_ATTRIBUTEID_DESCRIPTION;
  597. wValue.value.hasValue = UA_TRUE;
  598. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  599. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  600. UA_Server_delete(server);
  601. } END_TEST
  602. START_TEST(WriteSingleAttributeWriteMask) {
  603. UA_Server *server = makeTestSequence();
  604. UA_WriteValue wValue;
  605. UA_WriteValue_init(&wValue);
  606. UA_Int32 testValue = 0;
  607. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_UINT32]);
  608. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  609. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  610. wValue.attributeId = UA_ATTRIBUTEID_WRITEMASK;
  611. wValue.value.hasValue = UA_TRUE;
  612. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  613. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  614. UA_Server_delete(server);
  615. } END_TEST
  616. START_TEST(WriteSingleAttributeUserWriteMask) {
  617. UA_Server *server = makeTestSequence();
  618. UA_WriteValue wValue;
  619. UA_WriteValue_init(&wValue);
  620. UA_Int32 testValue = 0;
  621. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_UINT32]);
  622. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  623. wValue.attributeId = UA_ATTRIBUTEID_USERWRITEMASK;
  624. wValue.value.hasValue = UA_TRUE;
  625. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  626. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  627. UA_Server_delete(server);
  628. } END_TEST
  629. START_TEST(WriteSingleAttributeIsAbstract) {
  630. UA_Server *server = makeTestSequence();
  631. UA_WriteValue wValue;
  632. UA_WriteValue_init(&wValue);
  633. UA_Boolean testValue = UA_TRUE;
  634. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
  635. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  636. wValue.attributeId = UA_ATTRIBUTEID_ISABSTRACT;
  637. wValue.value.hasValue = UA_TRUE;
  638. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  639. ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
  640. UA_Server_delete(server);
  641. } END_TEST
  642. START_TEST(WriteSingleAttributeSymmetric) {
  643. UA_Server *server = makeTestSequence();
  644. UA_WriteValue wValue;
  645. UA_WriteValue_init(&wValue);
  646. UA_Boolean testValue = UA_TRUE;
  647. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
  648. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  649. wValue.attributeId = UA_ATTRIBUTEID_SYMMETRIC;
  650. wValue.value.hasValue = UA_TRUE;
  651. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  652. ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
  653. UA_Server_delete(server);
  654. } END_TEST
  655. START_TEST(WriteSingleAttributeInverseName) {
  656. UA_Server *server = makeTestSequence();
  657. UA_WriteValue wValue;
  658. UA_WriteValue_init(&wValue);
  659. UA_LocalizedText testValue = UA_LOCALIZEDTEXT("en_US", "not.the.answer");
  660. UA_Variant_setScalar(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
  661. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  662. wValue.attributeId = UA_ATTRIBUTEID_INVERSENAME;
  663. wValue.value.hasValue = UA_TRUE;
  664. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  665. ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
  666. UA_Server_delete(server);
  667. } END_TEST
  668. START_TEST(WriteSingleAttributeContainsNoLoops) {
  669. UA_Server *server = makeTestSequence();
  670. UA_WriteValue wValue;
  671. UA_WriteValue_init(&wValue);
  672. UA_Boolean testValue = UA_TRUE;
  673. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
  674. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  675. wValue.attributeId = UA_ATTRIBUTEID_CONTAINSNOLOOPS;
  676. wValue.value.hasValue = UA_TRUE;
  677. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  678. ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
  679. UA_Server_delete(server);
  680. } END_TEST
  681. START_TEST(WriteSingleAttributeEventNotifier) {
  682. UA_Server *server = makeTestSequence();
  683. UA_WriteValue wValue;
  684. UA_WriteValue_init(&wValue);
  685. UA_Byte testValue = 0;
  686. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BYTE]);
  687. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  688. wValue.attributeId = UA_ATTRIBUTEID_EVENTNOTIFIER;
  689. wValue.value.hasValue = UA_TRUE;
  690. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  691. ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
  692. UA_Server_delete(server);
  693. } END_TEST
  694. START_TEST(WriteSingleAttributeValue) {
  695. UA_Server *server = makeTestSequence();
  696. UA_WriteValue wValue;
  697. UA_WriteValue_init(&wValue);
  698. UA_Variant *myIntegerVariant = UA_Variant_new();
  699. UA_Int32 myInteger = 20;
  700. UA_Variant_setScalarCopy(myIntegerVariant, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
  701. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  702. wValue.attributeId = UA_ATTRIBUTEID_VALUE;
  703. wValue.value.hasValue = UA_TRUE;
  704. wValue.value.value = *myIntegerVariant;
  705. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  706. UA_DataValue resp;
  707. UA_DataValue_init(&resp);
  708. UA_ReadRequest rReq;
  709. UA_ReadRequest_init(&rReq);
  710. rReq.nodesToRead = UA_ReadValueId_new();
  711. rReq.nodesToReadSize = 1;
  712. rReq.nodesToRead[0].nodeId = UA_NODEID_STRING(1, "the.answer");
  713. rReq.nodesToRead[0].attributeId = UA_ATTRIBUTEID_VALUE;
  714. Service_Read_single(server, &adminSession, UA_TIMESTAMPSTORETURN_NEITHER, &rReq.nodesToRead[0], &resp);
  715. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  716. ck_assert(wValue.value.hasValue);
  717. const UA_Node *node = UA_NodeStore_get(server->nodestore, &wValue.nodeId);
  718. ck_assert_int_eq(node->nodeClass, UA_NODECLASS_VARIABLE);
  719. const UA_VariableNode *vn = (const UA_VariableNode*)node;
  720. const UA_Variant *oldV = &vn->value.variant;
  721. ck_assert_ptr_eq(&oldV->type->typeId, &wValue.value.value.type->typeId);
  722. ck_assert_int_eq(20, *(UA_Int32* )resp.value.data);
  723. UA_Server_delete(server);
  724. } END_TEST
  725. START_TEST(WriteSingleAttributeDataType) {
  726. UA_Server *server = makeTestSequence();
  727. UA_WriteValue wValue;
  728. UA_WriteValue_init(&wValue);
  729. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  730. wValue.attributeId = UA_ATTRIBUTEID_DATATYPE;
  731. wValue.value.hasValue = UA_TRUE;
  732. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  733. ck_assert_int_eq(retval, UA_STATUSCODE_BADWRITENOTSUPPORTED);
  734. UA_Server_delete(server);
  735. } END_TEST
  736. START_TEST(WriteSingleAttributeValueRank) {
  737. UA_Server *server = makeTestSequence();
  738. UA_WriteValue wValue;
  739. UA_WriteValue_init(&wValue);
  740. UA_Int32 testValue = -1;
  741. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_INT32]);
  742. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  743. wValue.attributeId = UA_ATTRIBUTEID_VALUERANK;
  744. wValue.value.hasValue = UA_TRUE;
  745. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  746. // Returns attributeInvalid, since variant/value may be writable
  747. ck_assert_int_eq(retval, UA_STATUSCODE_BADATTRIBUTEIDINVALID);
  748. UA_Server_delete(server);
  749. } END_TEST
  750. START_TEST(WriteSingleAttributeArrayDimensions) {
  751. UA_Server *server = makeTestSequence();
  752. UA_WriteValue wValue;
  753. UA_WriteValue_init(&wValue);
  754. UA_Int32 testValue[] = {-1,-1,-1};
  755. UA_Variant_setArrayCopy(&wValue.value.value, &testValue, 3, &UA_TYPES[UA_TYPES_INT32]);
  756. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  757. wValue.attributeId = UA_ATTRIBUTEID_ARRAYDIMENSIONS;
  758. wValue.value.hasValue = UA_TRUE;
  759. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  760. // Returns attributeInvalid, since variant/value may be writable
  761. ck_assert_int_eq(retval, UA_STATUSCODE_BADATTRIBUTEIDINVALID);
  762. UA_Server_delete(server);
  763. } END_TEST
  764. START_TEST(WriteSingleAttributeAccessLevel) {
  765. UA_Server *server = makeTestSequence();
  766. UA_WriteValue wValue;
  767. UA_WriteValue_init(&wValue);
  768. UA_Byte testValue = 0;
  769. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BYTE]);
  770. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  771. wValue.attributeId = UA_ATTRIBUTEID_ACCESSLEVEL;
  772. wValue.value.hasValue = UA_TRUE;
  773. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  774. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  775. UA_Server_delete(server);
  776. } END_TEST
  777. START_TEST(WriteSingleAttributeUserAccessLevel) {
  778. UA_Server *server = makeTestSequence();
  779. UA_WriteValue wValue;
  780. UA_WriteValue_init(&wValue);
  781. UA_Byte testValue = 0;
  782. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BYTE]);
  783. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  784. wValue.attributeId = UA_ATTRIBUTEID_USERACCESSLEVEL;
  785. wValue.value.hasValue = UA_TRUE;
  786. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  787. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  788. UA_Server_delete(server);
  789. } END_TEST
  790. START_TEST(WriteSingleAttributeMinimumSamplingInterval) {
  791. UA_Server *server = makeTestSequence();
  792. UA_WriteValue wValue;
  793. UA_WriteValue_init(&wValue);
  794. UA_Double testValue = 0.0;
  795. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_DOUBLE]);
  796. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  797. wValue.attributeId = UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL;
  798. wValue.value.hasValue = UA_TRUE;
  799. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  800. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  801. UA_Server_delete(server);
  802. } END_TEST
  803. START_TEST(WriteSingleAttributeHistorizing) {
  804. UA_Server *server = makeTestSequence();
  805. UA_WriteValue wValue;
  806. UA_WriteValue_init(&wValue);
  807. UA_Boolean testValue = UA_TRUE;
  808. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
  809. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  810. wValue.attributeId = UA_ATTRIBUTEID_HISTORIZING;
  811. wValue.value.hasValue = UA_TRUE;
  812. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  813. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  814. UA_Server_delete(server);
  815. } END_TEST
  816. START_TEST(WriteSingleAttributeExecutable) {
  817. UA_Server *server = makeTestSequence();
  818. UA_WriteValue wValue;
  819. UA_WriteValue_init(&wValue);
  820. UA_Boolean testValue = UA_TRUE;
  821. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
  822. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  823. wValue.attributeId = UA_ATTRIBUTEID_EXECUTABLE;
  824. wValue.value.hasValue = UA_TRUE;
  825. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  826. ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
  827. UA_Server_delete(server);
  828. } END_TEST
  829. START_TEST(WriteSingleAttributeUserExecutable) {
  830. UA_Server *server = makeTestSequence();
  831. UA_WriteValue wValue;
  832. UA_WriteValue_init(&wValue);
  833. UA_Boolean testValue = UA_TRUE;
  834. UA_Variant_setScalarCopy(&wValue.value.value, &testValue, &UA_TYPES[UA_TYPES_BOOLEAN]);
  835. wValue.nodeId = UA_NODEID_STRING(1, "the.answer");
  836. wValue.attributeId = UA_ATTRIBUTEID_USEREXECUTABLE;
  837. wValue.value.hasValue = UA_TRUE;
  838. UA_StatusCode retval = Service_Write_single(server, &adminSession, &wValue);
  839. ck_assert_int_eq(retval, UA_STATUSCODE_BADNODECLASSINVALID);
  840. UA_Server_delete(server);
  841. } END_TEST
  842. START_TEST(numericRange) {
  843. UA_NumericRange range;
  844. const UA_String str = (UA_String){9, (UA_Byte*)"1:2,0:3,5"};
  845. UA_StatusCode retval = parse_numericrange(str, &range);
  846. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  847. ck_assert_int_eq(range.dimensionsSize,3);
  848. ck_assert_int_eq(range.dimensions[0].min,1);
  849. ck_assert_int_eq(range.dimensions[0].max,2);
  850. ck_assert_int_eq(range.dimensions[1].min,0);
  851. ck_assert_int_eq(range.dimensions[1].max,3);
  852. ck_assert_int_eq(range.dimensions[2].min,5);
  853. ck_assert_int_eq(range.dimensions[2].max,5);
  854. } END_TEST
  855. static Suite * testSuite_services_attributes(void) {
  856. Suite *s = suite_create("services_attributes_read");
  857. TCase *tc_readSingleAttributes = tcase_create("readSingleAttributes");
  858. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeValueWithoutTimestamp);
  859. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeNodeIdWithoutTimestamp);
  860. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeNodeClassWithoutTimestamp);
  861. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeBrowseNameWithoutTimestamp);
  862. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeDisplayNameWithoutTimestamp);
  863. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeDescriptionWithoutTimestamp);
  864. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeWriteMaskWithoutTimestamp);
  865. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeUserWriteMaskWithoutTimestamp);
  866. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeIsAbstractWithoutTimestamp);
  867. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeSymmetricWithoutTimestamp);
  868. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeInverseNameWithoutTimestamp);
  869. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeContainsNoLoopsWithoutTimestamp);
  870. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeEventNotifierWithoutTimestamp);
  871. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeDataTypeWithoutTimestamp);
  872. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeValueRankWithoutTimestamp);
  873. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeArrayDimensionsWithoutTimestamp);
  874. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeAccessLevelWithoutTimestamp);
  875. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeUserAccessLevelWithoutTimestamp);
  876. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeMinimumSamplingIntervalWithoutTimestamp);
  877. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeHistorizingWithoutTimestamp);
  878. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeExecutableWithoutTimestamp);
  879. tcase_add_test(tc_readSingleAttributes, ReadSingleAttributeUserExecutableWithoutTimestamp);
  880. suite_add_tcase(s, tc_readSingleAttributes);
  881. TCase *tc_writeSingleAttributes = tcase_create("writeSingleAttributes");
  882. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeNodeId);
  883. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeNodeclass);
  884. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeBrowseName);
  885. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeDisplayName);
  886. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeDescription);
  887. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeWriteMask);
  888. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeUserWriteMask);
  889. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeIsAbstract);
  890. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeSymmetric);
  891. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeInverseName);
  892. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeContainsNoLoops);
  893. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeEventNotifier);
  894. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeValue);
  895. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeDataType);
  896. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeValueRank);
  897. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeArrayDimensions);
  898. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeAccessLevel);
  899. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeUserAccessLevel);
  900. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeMinimumSamplingInterval);
  901. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeHistorizing);
  902. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeExecutable);
  903. tcase_add_test(tc_writeSingleAttributes, WriteSingleAttributeUserExecutable);
  904. suite_add_tcase(s, tc_writeSingleAttributes);
  905. TCase *tc_parseNumericRange = tcase_create("parseNumericRange");
  906. tcase_add_test(tc_parseNumericRange, numericRange);
  907. suite_add_tcase(s, tc_parseNumericRange);
  908. return s;
  909. }
  910. int main(void) {
  911. int number_failed = 0;
  912. Suite *s;
  913. s = testSuite_services_attributes();
  914. SRunner *sr = srunner_create(s);
  915. srunner_set_log(sr, "test.log");
  916. srunner_set_fork_status(sr, CK_NOFORK);
  917. srunner_run_all(sr, CK_NORMAL);
  918. number_failed += srunner_ntests_failed(sr);
  919. srunner_free(sr);
  920. return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  921. }