check_services_attributes.c 37 KB

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