check_services_attributes.c 42 KB

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