check_services_attributes.c 42 KB

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