check_services_attributes.c 37 KB

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