check_namespace.c 7.2 KB

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