check_utils.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. #include <stdlib.h>
  5. #include "ua_types.h"
  6. #include "ua_client.h"
  7. #include "ua_util.h"
  8. #include "check.h"
  9. START_TEST(EndpointUrl_split) {
  10. UA_String hostname = UA_STRING_NULL;
  11. UA_String path = UA_STRING_NULL;
  12. UA_UInt16 port = 0;
  13. // check for too short url
  14. UA_String endPointUrl = UA_STRING("inv.ali:/");
  15. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
  16. UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
  17. // check for opc.tcp:// protocol
  18. endPointUrl = UA_STRING("inv.ali://");
  19. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
  20. UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
  21. // empty url
  22. endPointUrl = UA_STRING("opc.tcp://");
  23. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
  24. UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
  25. ck_assert(UA_String_equal(&hostname, &UA_STRING_NULL));
  26. ck_assert_uint_eq(port, 0);
  27. ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
  28. // only hostname
  29. endPointUrl = UA_STRING("opc.tcp://hostname");
  30. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
  31. UA_String expected = UA_STRING("hostname");
  32. ck_assert(UA_String_equal(&hostname, &expected));
  33. ck_assert_uint_eq(port, 0);
  34. ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
  35. // empty port
  36. endPointUrl = UA_STRING("opc.tcp://hostname:");
  37. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
  38. UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
  39. ck_assert(UA_String_equal(&hostname, &expected));
  40. ck_assert_uint_eq(port, 0);
  41. ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
  42. // specific port
  43. endPointUrl = UA_STRING("opc.tcp://hostname:1234");
  44. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
  45. UA_STATUSCODE_GOOD);
  46. ck_assert(UA_String_equal(&hostname, &expected));
  47. ck_assert_uint_eq(port, 1234);
  48. ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
  49. // IPv6
  50. endPointUrl = UA_STRING("opc.tcp://[2001:0db8:85a3::8a2e:0370:7334]:1234/path");
  51. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
  52. expected = UA_STRING("[2001:0db8:85a3::8a2e:0370:7334]");
  53. UA_String expectedPath = UA_STRING("path");
  54. ck_assert(UA_String_equal(&hostname, &expected));
  55. ck_assert_uint_eq(port, 1234);
  56. ck_assert(UA_String_equal(&path, &expectedPath));
  57. // empty hostname
  58. endPointUrl = UA_STRING("opc.tcp://:");
  59. port = 0;
  60. path = UA_STRING_NULL;
  61. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
  62. UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
  63. ck_assert(UA_String_equal(&hostname, &UA_STRING_NULL));
  64. ck_assert_uint_eq(port, 0);
  65. ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
  66. // empty hostname and no port
  67. endPointUrl = UA_STRING("opc.tcp:///");
  68. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
  69. ck_assert(UA_String_equal(&hostname, &UA_STRING_NULL));
  70. ck_assert_uint_eq(port, 0);
  71. ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
  72. // overlength port
  73. endPointUrl = UA_STRING("opc.tcp://hostname:12345678");
  74. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
  75. UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
  76. // port not a number
  77. endPointUrl = UA_STRING("opc.tcp://hostname:6x6");
  78. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path),
  79. UA_STATUSCODE_BADTCPENDPOINTURLINVALID);
  80. expected = UA_STRING("hostname");
  81. ck_assert(UA_String_equal(&hostname, &expected));
  82. ck_assert_uint_eq(port, 0);
  83. ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
  84. // no port but path
  85. endPointUrl = UA_STRING("opc.tcp://hostname/");
  86. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
  87. ck_assert(UA_String_equal(&hostname, &expected));
  88. ck_assert_uint_eq(port, 0);
  89. ck_assert(UA_String_equal(&path, &UA_STRING_NULL));
  90. // port and path
  91. endPointUrl = UA_STRING("opc.tcp://hostname:1234/path");
  92. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
  93. ck_assert(UA_String_equal(&hostname, &expected));
  94. ck_assert_uint_eq(port, 1234);
  95. ck_assert(UA_String_equal(&path, &expectedPath));
  96. // port and path with a slash
  97. endPointUrl = UA_STRING("opc.tcp://hostname:1234/path/");
  98. ck_assert_uint_eq(UA_parseEndpointUrl(&endPointUrl, &hostname, &port, &path), UA_STATUSCODE_GOOD);
  99. ck_assert(UA_String_equal(&hostname, &expected));
  100. ck_assert_uint_eq(port, 1234);
  101. ck_assert(UA_String_equal(&path, &expectedPath));
  102. }
  103. END_TEST
  104. START_TEST(readNumber) {
  105. UA_UInt32 result;
  106. ck_assert_uint_eq(UA_readNumber((UA_Byte*)"x", 1, &result), 0);
  107. ck_assert_uint_eq(UA_readNumber((UA_Byte*)"1x", 2, &result), 1);
  108. ck_assert_uint_eq(result, 1);
  109. ck_assert_uint_eq(UA_readNumber((UA_Byte*)"123456789", 9, &result), 9);
  110. ck_assert_uint_eq(result, 123456789);
  111. }
  112. END_TEST
  113. START_TEST(StatusCode_msg) {
  114. #ifndef UA_ENABLE_STATUSCODE_DESCRIPTIONS
  115. return;
  116. #endif
  117. // first element in table
  118. ck_assert_str_eq(UA_StatusCode_name(UA_STATUSCODE_GOOD), "Good");
  119. // just some randomly picked status codes
  120. ck_assert_str_eq(UA_StatusCode_name(UA_STATUSCODE_BADNOCOMMUNICATION),
  121. "BadNoCommunication");
  122. ck_assert_str_eq(UA_StatusCode_name(UA_STATUSCODE_GOODNODATA), "GoodNoData");
  123. // last element in table
  124. ck_assert_str_eq(UA_StatusCode_name(UA_STATUSCODE_BADMAXCONNECTIONSREACHED),
  125. "BadMaxConnectionsReached");
  126. // an invalid status code
  127. ck_assert_str_eq(UA_StatusCode_name(0x80123456), "Unknown StatusCode");
  128. }
  129. END_TEST
  130. static void assertNodeIdString(const UA_String *gotStr, const char* expectedStr) {
  131. size_t expectedStringLength = strlen(expectedStr);
  132. ck_assert_uint_ge(gotStr->length, expectedStringLength);
  133. char *gotChars = (char*)UA_malloc(gotStr->length+1);
  134. memcpy(gotChars, gotStr->data, gotStr->length);
  135. gotChars[gotStr->length] = 0;
  136. ck_assert_str_eq(gotChars, expectedStr);
  137. UA_free(gotChars);
  138. }
  139. START_TEST(idToStringNumeric) {
  140. UA_NodeId n;
  141. UA_String str = UA_STRING_NULL;
  142. n = UA_NODEID_NUMERIC(0,0);
  143. UA_NodeId_toString(&n, &str);
  144. assertNodeIdString(&str, "ns=0;i=0");
  145. n = UA_NODEID_NUMERIC(12345,1234567890);
  146. UA_NodeId_toString(&n, &str);
  147. assertNodeIdString(&str, "ns=12345;i=1234567890");
  148. n = UA_NODEID_NUMERIC(0xFFFF,0xFFFFFFFF);
  149. UA_NodeId_toString(&n, &str);
  150. assertNodeIdString(&str, "ns=65535;i=4294967295");
  151. UA_String_deleteMembers(&str);
  152. } END_TEST
  153. START_TEST(idToStringString) {
  154. UA_NodeId n;
  155. UA_String str = UA_STRING_NULL;
  156. n = UA_NODEID_STRING(0,"");
  157. UA_NodeId_toString(&n, &str);
  158. assertNodeIdString(&str, "ns=0;i=");
  159. n = UA_NODEID_STRING(54321,"Some String");
  160. UA_NodeId_toString(&n, &str);
  161. assertNodeIdString(&str, "ns=54321;i=Some String");
  162. UA_String_deleteMembers(&str);
  163. } END_TEST
  164. START_TEST(idToStringGuid) {
  165. UA_NodeId n;
  166. UA_String str = UA_STRING_NULL;
  167. UA_Guid g = UA_GUID_NULL;
  168. n = UA_NODEID_GUID(0,UA_GUID_NULL);
  169. UA_NodeId_toString(&n, &str);
  170. assertNodeIdString(&str, "ns=0;i=00000000-0000-0000-0000-000000000000");
  171. g.data1 = 0xA123456C;
  172. g.data2 = 0x0ABC;
  173. g.data3 = 0x1A2B;
  174. g.data4[0] = 0x81;
  175. g.data4[1] = 0x5F;
  176. g.data4[2] = 0x68;
  177. g.data4[3] = 0x72;
  178. g.data4[4] = 0x12;
  179. g.data4[5] = 0xAA;
  180. g.data4[6] = 0xEE;
  181. g.data4[7] = 0x1B;
  182. n = UA_NODEID_GUID(65535,g);
  183. UA_NodeId_toString(&n, &str);
  184. assertNodeIdString(&str, "ns=65535;i=a123456c-0abc-1a2b-815f-687212aaee1b");
  185. g.data1 = 0xFFFFFFFF;
  186. g.data2 = 0xFFFF;
  187. g.data3 = 0xFFFF;
  188. g.data4[0] = 0xFF;
  189. g.data4[1] = 0xFF;
  190. g.data4[2] = 0xFF;
  191. g.data4[3] = 0xFF;
  192. g.data4[4] = 0xFF;
  193. g.data4[5] = 0xFF;
  194. g.data4[6] = 0xFF;
  195. g.data4[7] = 0xFF;
  196. n = UA_NODEID_GUID(65535,g);
  197. UA_NodeId_toString(&n, &str);
  198. assertNodeIdString(&str, "ns=65535;i=ffffffff-ffff-ffff-ffff-ffffffffffff");
  199. UA_String_deleteMembers(&str);
  200. } END_TEST
  201. START_TEST(idToStringByte) {
  202. UA_NodeId n;
  203. UA_String str = UA_STRING_NULL;
  204. n.namespaceIndex = 0;
  205. n.identifierType = UA_NODEIDTYPE_BYTESTRING;
  206. n.identifier.byteString.data = NULL;
  207. n.identifier.byteString.length = 0;
  208. UA_NodeId_toString(&n, &str);
  209. assertNodeIdString(&str, "ns=0;i=");
  210. UA_ByteString bs = UA_BYTESTRING_NULL;
  211. bs.length = 1;
  212. bs.data = (UA_Byte*)UA_malloc(bs.length);
  213. bs.data[0] = 0x2C;
  214. n.identifier.byteString = bs;
  215. n.namespaceIndex = 123;
  216. UA_NodeId_toString(&n, &str);
  217. assertNodeIdString(&str, "ns=123;i=2c");
  218. UA_free(bs.data);
  219. bs.length = 5;
  220. bs.data = (UA_Byte*)UA_malloc(bs.length);
  221. bs.data[0] = 0x21;
  222. bs.data[1] = 0x83;
  223. bs.data[2] = 0xE0;
  224. bs.data[3] = 0x54;
  225. bs.data[4] = 0x78;
  226. n.identifier.byteString = bs;
  227. n.namespaceIndex = 599;
  228. UA_NodeId_toString(&n, &str);
  229. assertNodeIdString(&str, "ns=599;i=2183e05478");
  230. UA_free(bs.data);
  231. UA_String_deleteMembers(&str);
  232. } END_TEST
  233. static Suite* testSuite_Utils(void) {
  234. Suite *s = suite_create("Utils");
  235. TCase *tc_endpointUrl_split = tcase_create("EndpointUrl_split");
  236. tcase_add_test(tc_endpointUrl_split, EndpointUrl_split);
  237. suite_add_tcase(s,tc_endpointUrl_split);
  238. TCase *tc_utils = tcase_create("Utils");
  239. tcase_add_test(tc_utils, readNumber);
  240. tcase_add_test(tc_utils, StatusCode_msg);
  241. suite_add_tcase(s,tc_utils);
  242. TCase *tc1 = tcase_create("test nodeid string");
  243. tcase_add_test(tc1, idToStringNumeric);
  244. tcase_add_test(tc1, idToStringString);
  245. tcase_add_test(tc1, idToStringGuid);
  246. tcase_add_test(tc1, idToStringByte);
  247. suite_add_tcase(s, tc1);
  248. return s;
  249. }
  250. int main(void) {
  251. Suite *s = testSuite_Utils();
  252. SRunner *sr = srunner_create(s);
  253. srunner_set_fork_status(sr, CK_NOFORK);
  254. srunner_run_all(sr,CK_NORMAL);
  255. int number_failed = srunner_ntests_failed(sr);
  256. srunner_free(sr);
  257. return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  258. }