check_namespace.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "opcua.h"
  4. #include "ua_namespace.h"
  5. #include "check.h"
  6. int zeroCnt = 0;
  7. int visitCnt = 0;
  8. void checkZeroVisitor(const UA_Node* node) {
  9. visitCnt++;
  10. if (node == UA_NULL) zeroCnt++;
  11. }
  12. START_TEST(test_Namespace) {
  13. Namespace *ns = UA_NULL;
  14. Namespace_new(&ns, 512, 0);
  15. Namespace_delete(ns);
  16. }
  17. END_TEST
  18. UA_Int32 createNode(UA_Node** p, UA_Int16 nsid, UA_Int32 id) {
  19. UA_Node_new(p);
  20. (*p)->nodeId.encodingByte = UA_NODEIDTYPE_FOURBYTE;
  21. (*p)->nodeId.namespace = nsid;
  22. (*p)->nodeId.identifier.numeric = id;
  23. return UA_SUCCESS;
  24. }
  25. START_TEST(confirmExistenceInNamespaceWithSingleEntry) {
  26. // given
  27. Namespace *ns;
  28. Namespace_new(&ns, 512, 0);
  29. UA_Node* n1; createNode(&n1,0,2253); Namespace_insert(ns,n1);
  30. const UA_Node* nr = UA_NULL;
  31. Namespace_Entry_Lock* nl = UA_NULL;
  32. UA_Int32 retval;
  33. // when
  34. retval = Namespace_contains(ns,&(n1->nodeId));
  35. // then
  36. ck_assert_int_eq(retval, UA_TRUE);
  37. // finally
  38. Namespace_delete(ns);
  39. }
  40. END_TEST
  41. START_TEST(findNodeInNamespaceWithSingleEntry) {
  42. // given
  43. Namespace *ns;
  44. Namespace_new(&ns, 512, 0);
  45. UA_Node* n1; createNode(&n1,0,2253); Namespace_insert(ns,n1);
  46. const UA_Node* nr = UA_NULL;
  47. Namespace_Entry_Lock* nl = UA_NULL;
  48. UA_Int32 retval;
  49. // when
  50. retval = Namespace_get(ns,&(n1->nodeId),&nr,&nl);
  51. // then
  52. ck_assert_int_eq(retval, UA_SUCCESS);
  53. ck_assert_ptr_eq(nr,n1);
  54. // finally
  55. Namespace_delete(ns);
  56. }
  57. END_TEST
  58. START_TEST(findNodeInNamespaceWithTwoEntries) {
  59. // given
  60. Namespace *ns;
  61. Namespace_new(&ns, 512, 0);
  62. UA_Node* n1; createNode(&n1,0,2253); Namespace_insert(ns,n1);
  63. UA_Node* n2; createNode(&n2,0,2255); Namespace_insert(ns,n2);
  64. const UA_Node* nr = UA_NULL;
  65. Namespace_Entry_Lock* nl = UA_NULL;
  66. UA_Int32 retval;
  67. // when
  68. retval = Namespace_get(ns,&(n2->nodeId),&nr,&nl);
  69. // then
  70. ck_assert_int_eq(retval, UA_SUCCESS);
  71. ck_assert_ptr_eq(nr,n2);
  72. // finally
  73. Namespace_delete(ns);
  74. }
  75. END_TEST
  76. START_TEST(failToFindNodeInOtherNamespace) {
  77. // given
  78. Namespace *ns;
  79. Namespace_new(&ns, 512, 0);
  80. UA_Node* n1; createNode(&n1,0,2253); Namespace_insert(ns,n1);
  81. UA_Node* n2; createNode(&n2,0,2255); Namespace_insert(ns,n2);
  82. const UA_Node* nr = UA_NULL;
  83. Namespace_Entry_Lock* nl = UA_NULL;
  84. UA_Int32 retval;
  85. // when
  86. UA_Node* n; createNode(&n,1,2255);
  87. retval = Namespace_get(ns,&(n->nodeId),&nr,&nl);
  88. // then
  89. ck_assert_int_ne(retval, UA_SUCCESS);
  90. // finally
  91. UA_free(n);
  92. Namespace_delete(ns);
  93. }
  94. END_TEST
  95. START_TEST(findNodeInNamespaceWithSeveralEntries) {
  96. // given
  97. Namespace *ns;
  98. Namespace_new(&ns, 512, 0);
  99. UA_Node* n1; createNode(&n1,0,2253); Namespace_insert(ns,n1);
  100. UA_Node* n2; createNode(&n2,0,2255); Namespace_insert(ns,n2);
  101. UA_Node* n3; createNode(&n3,0,2257); Namespace_insert(ns,n3);
  102. UA_Node* n4; createNode(&n4,0,2200); Namespace_insert(ns,n4);
  103. UA_Node* n5; createNode(&n5,0,1); Namespace_insert(ns,n5);
  104. UA_Node* n6; createNode(&n6,0,12); Namespace_insert(ns,n6);
  105. const UA_Node* nr = UA_NULL;
  106. Namespace_Entry_Lock* nl = UA_NULL;
  107. UA_Int32 retval;
  108. // when
  109. retval = Namespace_get(ns,&(n3->nodeId),&nr,&nl);
  110. // then
  111. ck_assert_int_eq(retval, UA_SUCCESS);
  112. ck_assert_ptr_eq(nr,n3);
  113. // finally
  114. Namespace_delete(ns);
  115. }
  116. END_TEST
  117. START_TEST(iterateOverNamespaceShallNotVisitEmptyNodes) {
  118. // given
  119. Namespace *ns;
  120. Namespace_new(&ns, 512, 0);
  121. UA_Node* n1; createNode(&n1,0,2253); Namespace_insert(ns,n1);
  122. UA_Node* n2; createNode(&n2,0,2255); Namespace_insert(ns,n2);
  123. UA_Node* n3; createNode(&n3,0,2257); Namespace_insert(ns,n3);
  124. UA_Node* n4; createNode(&n4,0,2200); Namespace_insert(ns,n4);
  125. UA_Node* n5; createNode(&n5,0,1); Namespace_insert(ns,n5);
  126. UA_Node* n6; createNode(&n6,0,12); Namespace_insert(ns,n6);
  127. UA_Int32 retval;
  128. // when
  129. zeroCnt = 0;
  130. visitCnt = 0;
  131. retval = Namespace_iterate(ns,checkZeroVisitor);
  132. // then
  133. ck_assert_int_eq(retval, UA_SUCCESS);
  134. ck_assert_int_eq(zeroCnt, 0);
  135. ck_assert_int_eq(visitCnt, 6);
  136. // finally
  137. Namespace_delete(ns);
  138. }
  139. END_TEST
  140. START_TEST(findNodeInExpandedNamespace) {
  141. // given
  142. Namespace *ns;
  143. Namespace_new(&ns, 10, 0);
  144. UA_Node* n;
  145. UA_Int32 i=0;
  146. for (; i<200; i++) {
  147. createNode(&n,0,i); Namespace_insert(ns,n);
  148. }
  149. const UA_Node* nr = UA_NULL;
  150. Namespace_Entry_Lock* nl = UA_NULL;
  151. UA_Int32 retval;
  152. // when
  153. createNode(&n,0,25);
  154. retval = Namespace_get(ns,&(n->nodeId),&nr,&nl);
  155. // then
  156. ck_assert_int_eq(retval, UA_SUCCESS);
  157. ck_assert_int_eq(nr->nodeId.identifier.numeric,n->nodeId.identifier.numeric);
  158. // finally
  159. UA_free(n);
  160. Namespace_delete(ns);
  161. }
  162. END_TEST
  163. START_TEST(iterateOverExpandedNamespaceShallNotVisitEmptyNodes) {
  164. // given
  165. Namespace *ns;
  166. Namespace_new(&ns, 10, 0);
  167. UA_Node* n;
  168. UA_Int32 i=0;
  169. for (; i<200; i++) {
  170. createNode(&n,0,i); Namespace_insert(ns,n);
  171. }
  172. // when
  173. UA_Int32 retval;
  174. zeroCnt = 0;
  175. visitCnt = 0;
  176. retval = Namespace_iterate(ns,checkZeroVisitor);
  177. // then
  178. ck_assert_int_eq(retval, UA_SUCCESS);
  179. ck_assert_int_eq(zeroCnt, 0);
  180. ck_assert_int_eq(visitCnt, 200);
  181. // finally
  182. Namespace_delete(ns);
  183. }
  184. END_TEST
  185. START_TEST(failToFindNonExistantNodeInNamespaceWithSeveralEntries) {
  186. // given
  187. Namespace *ns;
  188. Namespace_new(&ns, 512, 0);
  189. UA_Node* n1; createNode(&n1,0,2253); Namespace_insert(ns,n1);
  190. UA_Node* n2; createNode(&n2,0,2255); Namespace_insert(ns,n2);
  191. UA_Node* n3; createNode(&n3,0,2257); Namespace_insert(ns,n3);
  192. UA_Node* n4; createNode(&n4,0,2200); Namespace_insert(ns,n4);
  193. UA_Node* n5; createNode(&n5,0,1); Namespace_insert(ns,n5);
  194. UA_Node* n6; createNode(&n6,0,12);
  195. const UA_Node* nr = UA_NULL;
  196. Namespace_Entry_Lock* nl = UA_NULL;
  197. UA_Int32 retval;
  198. // when
  199. retval = Namespace_get(ns,&(n6->nodeId),&nr,&nl);
  200. // then
  201. ck_assert_int_ne(retval, UA_SUCCESS);
  202. // finally
  203. UA_free(n6);
  204. Namespace_delete(ns);
  205. }
  206. END_TEST
  207. Suite * namespace_suite (void) {
  208. Suite *s = suite_create ("Namespace");
  209. TCase *tc_cd = tcase_create ("Create/Delete");
  210. tcase_add_test (tc_cd, test_Namespace);
  211. suite_add_tcase (s, tc_cd);
  212. TCase* tc_find = tcase_create ("Find");
  213. tcase_add_test (tc_find, confirmExistenceInNamespaceWithSingleEntry);
  214. tcase_add_test (tc_find, findNodeInNamespaceWithSingleEntry);
  215. tcase_add_test (tc_find, findNodeInNamespaceWithTwoEntries);
  216. tcase_add_test (tc_find, findNodeInNamespaceWithSeveralEntries);
  217. tcase_add_test (tc_find, findNodeInExpandedNamespace);
  218. tcase_add_test (tc_find, failToFindNonExistantNodeInNamespaceWithSeveralEntries);
  219. tcase_add_test (tc_find, failToFindNodeInOtherNamespace);
  220. suite_add_tcase (s, tc_find);
  221. TCase* tc_iterate = tcase_create ("Iterate");
  222. tcase_add_test (tc_find, iterateOverNamespaceShallNotVisitEmptyNodes);
  223. tcase_add_test (tc_find, iterateOverExpandedNamespaceShallNotVisitEmptyNodes);
  224. suite_add_tcase (s, tc_iterate);
  225. return s;
  226. }
  227. int main (void) {
  228. int number_failed =0;
  229. Suite *s = namespace_suite ();
  230. SRunner *sr = srunner_create (s);
  231. // srunner_set_fork_status(sr,CK_NOFORK);
  232. srunner_run_all (sr, CK_NORMAL);
  233. number_failed += srunner_ntests_failed (sr);
  234. srunner_free (sr);
  235. return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  236. }