check_namespace.c 6.8 KB

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