utils_module_tests.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. /*
  2. * utils module tests
  3. * Copyright (c) 2014-2015, Jouni Malinen <j@w1.fi>
  4. *
  5. * This software may be distributed under the terms of the BSD license.
  6. * See README for more details.
  7. */
  8. #include "utils/includes.h"
  9. #include "utils/common.h"
  10. #include "utils/bitfield.h"
  11. #include "utils/ext_password.h"
  12. #include "utils/trace.h"
  13. #include "utils/base64.h"
  14. struct printf_test_data {
  15. u8 *data;
  16. size_t len;
  17. char *encoded;
  18. };
  19. static const struct printf_test_data printf_tests[] = {
  20. { (u8 *) "abcde", 5, "abcde" },
  21. { (u8 *) "a\0b\nc\ed\re\tf\"\\", 13, "a\\0b\\nc\\ed\\re\\tf\\\"\\\\" },
  22. { (u8 *) "\x00\x31\x00\x32\x00\x39", 6, "\\x001\\0002\\09" },
  23. { (u8 *) "\n\n\n", 3, "\n\12\x0a" },
  24. { (u8 *) "\303\245\303\244\303\266\303\205\303\204\303\226", 12,
  25. "\\xc3\\xa5\xc3\\xa4\\xc3\\xb6\\xc3\\x85\\xc3\\x84\\xc3\\x96" },
  26. { (u8 *) "\303\245\303\244\303\266\303\205\303\204\303\226", 12,
  27. "\\303\\245\\303\\244\\303\\266\\303\\205\\303\\204\\303\\226" },
  28. { (u8 *) "\xe5\xe4\xf6\xc5\xc4\xd6", 6,
  29. "\\xe5\\xe4\\xf6\\xc5\\xc4\\xd6" },
  30. { NULL, 0, NULL }
  31. };
  32. static int printf_encode_decode_tests(void)
  33. {
  34. int i;
  35. size_t binlen;
  36. char buf[100];
  37. u8 bin[100];
  38. int errors = 0;
  39. wpa_printf(MSG_INFO, "printf encode/decode tests");
  40. for (i = 0; printf_tests[i].data; i++) {
  41. const struct printf_test_data *test = &printf_tests[i];
  42. printf_encode(buf, sizeof(buf), test->data, test->len);
  43. wpa_printf(MSG_INFO, "%d: -> \"%s\"", i, buf);
  44. binlen = printf_decode(bin, sizeof(bin), buf);
  45. if (binlen != test->len ||
  46. os_memcmp(bin, test->data, binlen) != 0) {
  47. wpa_hexdump(MSG_ERROR, "Error in decoding#1",
  48. bin, binlen);
  49. errors++;
  50. }
  51. binlen = printf_decode(bin, sizeof(bin), test->encoded);
  52. if (binlen != test->len ||
  53. os_memcmp(bin, test->data, binlen) != 0) {
  54. wpa_hexdump(MSG_ERROR, "Error in decoding#2",
  55. bin, binlen);
  56. errors++;
  57. }
  58. }
  59. buf[5] = 'A';
  60. printf_encode(buf, 5, (const u8 *) "abcde", 5);
  61. if (buf[5] != 'A') {
  62. wpa_printf(MSG_ERROR, "Error in bounds checking#1");
  63. errors++;
  64. }
  65. for (i = 5; i < 10; i++) {
  66. buf[i] = 'A';
  67. printf_encode(buf, i, (const u8 *) "\xdd\xdd\xdd\xdd\xdd", 5);
  68. if (buf[i] != 'A') {
  69. wpa_printf(MSG_ERROR, "Error in bounds checking#2(%d)",
  70. i);
  71. errors++;
  72. }
  73. }
  74. if (errors) {
  75. wpa_printf(MSG_ERROR, "%d printf test(s) failed", errors);
  76. return -1;
  77. }
  78. return 0;
  79. }
  80. static int bitfield_tests(void)
  81. {
  82. struct bitfield *bf;
  83. int i;
  84. int errors = 0;
  85. wpa_printf(MSG_INFO, "bitfield tests");
  86. bf = bitfield_alloc(123);
  87. if (bf == NULL)
  88. return -1;
  89. for (i = 0; i < 123; i++) {
  90. if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1))
  91. errors++;
  92. if (i > 0 && bitfield_is_set(bf, i - 1))
  93. errors++;
  94. bitfield_set(bf, i);
  95. if (!bitfield_is_set(bf, i))
  96. errors++;
  97. bitfield_clear(bf, i);
  98. if (bitfield_is_set(bf, i))
  99. errors++;
  100. }
  101. for (i = 123; i < 200; i++) {
  102. if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1))
  103. errors++;
  104. if (i > 0 && bitfield_is_set(bf, i - 1))
  105. errors++;
  106. bitfield_set(bf, i);
  107. if (bitfield_is_set(bf, i))
  108. errors++;
  109. bitfield_clear(bf, i);
  110. if (bitfield_is_set(bf, i))
  111. errors++;
  112. }
  113. for (i = 0; i < 123; i++) {
  114. if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1))
  115. errors++;
  116. bitfield_set(bf, i);
  117. if (!bitfield_is_set(bf, i))
  118. errors++;
  119. }
  120. for (i = 0; i < 123; i++) {
  121. if (!bitfield_is_set(bf, i))
  122. errors++;
  123. bitfield_clear(bf, i);
  124. if (bitfield_is_set(bf, i))
  125. errors++;
  126. }
  127. for (i = 0; i < 123; i++) {
  128. if (bitfield_get_first_zero(bf) != i)
  129. errors++;
  130. bitfield_set(bf, i);
  131. }
  132. if (bitfield_get_first_zero(bf) != -1)
  133. errors++;
  134. for (i = 0; i < 123; i++) {
  135. if (!bitfield_is_set(bf, i))
  136. errors++;
  137. bitfield_clear(bf, i);
  138. if (bitfield_get_first_zero(bf) != i)
  139. errors++;
  140. bitfield_set(bf, i);
  141. }
  142. if (bitfield_get_first_zero(bf) != -1)
  143. errors++;
  144. bitfield_free(bf);
  145. bf = bitfield_alloc(8);
  146. if (bf == NULL)
  147. return -1;
  148. if (bitfield_get_first_zero(bf) != 0)
  149. errors++;
  150. for (i = 0; i < 8; i++)
  151. bitfield_set(bf, i);
  152. if (bitfield_get_first_zero(bf) != -1)
  153. errors++;
  154. bitfield_free(bf);
  155. if (errors) {
  156. wpa_printf(MSG_ERROR, "%d bitfield test(s) failed", errors);
  157. return -1;
  158. }
  159. return 0;
  160. }
  161. static int int_array_tests(void)
  162. {
  163. int test1[] = { 1, 2, 3, 4, 5, 6, 0 };
  164. int test2[] = { 1, -1, 0 };
  165. int test3[] = { 1, 1, 1, -1, 2, 3, 4, 1, 2, 0 };
  166. int test3_res[] = { -1, 1, 2, 3, 4, 0 };
  167. int errors = 0;
  168. int len;
  169. wpa_printf(MSG_INFO, "int_array tests");
  170. if (int_array_len(test1) != 6 ||
  171. int_array_len(test2) != 2)
  172. errors++;
  173. int_array_sort_unique(test3);
  174. len = int_array_len(test3_res);
  175. if (int_array_len(test3) != len)
  176. errors++;
  177. else if (os_memcmp(test3, test3_res, len * sizeof(int)) != 0)
  178. errors++;
  179. if (errors) {
  180. wpa_printf(MSG_ERROR, "%d int_array test(s) failed", errors);
  181. return -1;
  182. }
  183. return 0;
  184. }
  185. static int ext_password_tests(void)
  186. {
  187. struct ext_password_data *data;
  188. int ret = 0;
  189. struct wpabuf *pw;
  190. wpa_printf(MSG_INFO, "ext_password tests");
  191. data = ext_password_init("unknown", "foo");
  192. if (data != NULL)
  193. return -1;
  194. data = ext_password_init("test", NULL);
  195. if (data == NULL)
  196. return -1;
  197. pw = ext_password_get(data, "foo");
  198. if (pw != NULL)
  199. ret = -1;
  200. ext_password_free(pw);
  201. ext_password_deinit(data);
  202. pw = ext_password_get(NULL, "foo");
  203. if (pw != NULL)
  204. ret = -1;
  205. ext_password_free(pw);
  206. return ret;
  207. }
  208. static int trace_tests(void)
  209. {
  210. wpa_printf(MSG_INFO, "trace tests");
  211. wpa_trace_show("test backtrace");
  212. wpa_trace_dump_funcname("test funcname", trace_tests);
  213. return 0;
  214. }
  215. static int base64_tests(void)
  216. {
  217. int errors = 0;
  218. unsigned char *res;
  219. size_t res_len;
  220. wpa_printf(MSG_INFO, "base64 tests");
  221. res = base64_encode((const unsigned char *) "", ~0, &res_len);
  222. if (res) {
  223. errors++;
  224. os_free(res);
  225. }
  226. res = base64_encode((const unsigned char *) "=", 1, &res_len);
  227. if (!res || res_len != 5 || res[0] != 'P' || res[1] != 'Q' ||
  228. res[2] != '=' || res[3] != '=' || res[4] != '\n')
  229. errors++;
  230. os_free(res);
  231. res = base64_encode((const unsigned char *) "=", 1, NULL);
  232. if (!res || res[0] != 'P' || res[1] != 'Q' ||
  233. res[2] != '=' || res[3] != '=' || res[4] != '\n')
  234. errors++;
  235. os_free(res);
  236. res = base64_decode((const unsigned char *) "", 0, &res_len);
  237. if (res) {
  238. errors++;
  239. os_free(res);
  240. }
  241. res = base64_decode((const unsigned char *) "a", 1, &res_len);
  242. if (res) {
  243. errors++;
  244. os_free(res);
  245. }
  246. res = base64_decode((const unsigned char *) "====", 4, &res_len);
  247. if (res) {
  248. errors++;
  249. os_free(res);
  250. }
  251. res = base64_decode((const unsigned char *) "PQ==", 4, &res_len);
  252. if (!res || res_len != 1 || res[0] != '=')
  253. errors++;
  254. os_free(res);
  255. res = base64_decode((const unsigned char *) "P.Q-=!=*", 8, &res_len);
  256. if (!res || res_len != 1 || res[0] != '=')
  257. errors++;
  258. os_free(res);
  259. if (errors) {
  260. wpa_printf(MSG_ERROR, "%d base64 test(s) failed", errors);
  261. return -1;
  262. }
  263. return 0;
  264. }
  265. int utils_module_tests(void)
  266. {
  267. int ret = 0;
  268. wpa_printf(MSG_INFO, "utils module tests");
  269. if (printf_encode_decode_tests() < 0 ||
  270. ext_password_tests() < 0 ||
  271. trace_tests() < 0 ||
  272. bitfield_tests() < 0 ||
  273. base64_tests() < 0 ||
  274. int_array_tests() < 0)
  275. ret = -1;
  276. return ret;
  277. }