utils_module_tests.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /*
  2. * utils module tests
  3. * Copyright (c) 2014, 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. struct printf_test_data {
  14. u8 *data;
  15. size_t len;
  16. char *encoded;
  17. };
  18. static const struct printf_test_data printf_tests[] = {
  19. { (u8 *) "abcde", 5, "abcde" },
  20. { (u8 *) "a\0b\nc\ed\re\tf\"\\", 13, "a\\0b\\nc\\ed\\re\\tf\\\"\\\\" },
  21. { (u8 *) "\x00\x31\x00\x32\x00\x39", 6, "\\x001\\0002\\09" },
  22. { (u8 *) "\n\n\n", 3, "\n\12\x0a" },
  23. { (u8 *) "\303\245\303\244\303\266\303\205\303\204\303\226", 12,
  24. "\\xc3\\xa5\xc3\\xa4\\xc3\\xb6\\xc3\\x85\\xc3\\x84\\xc3\\x96" },
  25. { (u8 *) "\303\245\303\244\303\266\303\205\303\204\303\226", 12,
  26. "\\303\\245\\303\\244\\303\\266\\303\\205\\303\\204\\303\\226" },
  27. { (u8 *) "\xe5\xe4\xf6\xc5\xc4\xd6", 6,
  28. "\\xe5\\xe4\\xf6\\xc5\\xc4\\xd6" },
  29. { NULL, 0, NULL }
  30. };
  31. static int printf_encode_decode_tests(void)
  32. {
  33. int i;
  34. size_t binlen;
  35. char buf[100];
  36. u8 bin[100];
  37. int errors = 0;
  38. wpa_printf(MSG_INFO, "printf encode/decode tests");
  39. for (i = 0; printf_tests[i].data; i++) {
  40. const struct printf_test_data *test = &printf_tests[i];
  41. printf_encode(buf, sizeof(buf), test->data, test->len);
  42. wpa_printf(MSG_INFO, "%d: -> \"%s\"", i, buf);
  43. binlen = printf_decode(bin, sizeof(bin), buf);
  44. if (binlen != test->len ||
  45. os_memcmp(bin, test->data, binlen) != 0) {
  46. wpa_hexdump(MSG_ERROR, "Error in decoding#1",
  47. bin, binlen);
  48. errors++;
  49. }
  50. binlen = printf_decode(bin, sizeof(bin), test->encoded);
  51. if (binlen != test->len ||
  52. os_memcmp(bin, test->data, binlen) != 0) {
  53. wpa_hexdump(MSG_ERROR, "Error in decoding#2",
  54. bin, binlen);
  55. errors++;
  56. }
  57. }
  58. buf[5] = 'A';
  59. printf_encode(buf, 5, (const u8 *) "abcde", 5);
  60. if (buf[5] != 'A') {
  61. wpa_printf(MSG_ERROR, "Error in bounds checking#1");
  62. errors++;
  63. }
  64. for (i = 5; i < 10; i++) {
  65. buf[i] = 'A';
  66. printf_encode(buf, i, (const u8 *) "\xdd\xdd\xdd\xdd\xdd", 5);
  67. if (buf[i] != 'A') {
  68. wpa_printf(MSG_ERROR, "Error in bounds checking#2(%d)",
  69. i);
  70. errors++;
  71. }
  72. }
  73. if (errors) {
  74. wpa_printf(MSG_ERROR, "%d printf test(s) failed", errors);
  75. return -1;
  76. }
  77. return 0;
  78. }
  79. static int bitfield_tests(void)
  80. {
  81. struct bitfield *bf;
  82. int i;
  83. int errors = 0;
  84. wpa_printf(MSG_INFO, "bitfield tests");
  85. bf = bitfield_alloc(123);
  86. if (bf == NULL)
  87. return -1;
  88. for (i = 0; i < 123; i++) {
  89. if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1))
  90. errors++;
  91. if (i > 0 && bitfield_is_set(bf, i - 1))
  92. errors++;
  93. bitfield_set(bf, i);
  94. if (!bitfield_is_set(bf, i))
  95. errors++;
  96. bitfield_clear(bf, i);
  97. if (bitfield_is_set(bf, i))
  98. errors++;
  99. }
  100. for (i = 123; i < 200; i++) {
  101. if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1))
  102. errors++;
  103. if (i > 0 && bitfield_is_set(bf, i - 1))
  104. errors++;
  105. bitfield_set(bf, i);
  106. if (bitfield_is_set(bf, i))
  107. errors++;
  108. bitfield_clear(bf, i);
  109. if (bitfield_is_set(bf, i))
  110. errors++;
  111. }
  112. for (i = 0; i < 123; i++) {
  113. if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1))
  114. errors++;
  115. bitfield_set(bf, i);
  116. if (!bitfield_is_set(bf, i))
  117. errors++;
  118. }
  119. for (i = 0; i < 123; i++) {
  120. if (!bitfield_is_set(bf, i))
  121. errors++;
  122. bitfield_clear(bf, i);
  123. if (bitfield_is_set(bf, i))
  124. errors++;
  125. }
  126. for (i = 0; i < 123; i++) {
  127. if (bitfield_get_first_zero(bf) != i)
  128. errors++;
  129. bitfield_set(bf, i);
  130. }
  131. if (bitfield_get_first_zero(bf) != -1)
  132. errors++;
  133. for (i = 0; i < 123; i++) {
  134. if (!bitfield_is_set(bf, i))
  135. errors++;
  136. bitfield_clear(bf, i);
  137. if (bitfield_get_first_zero(bf) != i)
  138. errors++;
  139. bitfield_set(bf, i);
  140. }
  141. if (bitfield_get_first_zero(bf) != -1)
  142. errors++;
  143. bitfield_free(bf);
  144. if (errors) {
  145. wpa_printf(MSG_ERROR, "%d bitfield test(s) failed", errors);
  146. return -1;
  147. }
  148. return 0;
  149. }
  150. static int int_array_tests(void)
  151. {
  152. int test1[] = { 1, 2, 3, 4, 5, 6, 0 };
  153. int test2[] = { 1, -1, 0 };
  154. int test3[] = { 1, 1, 1, -1, 2, 3, 4, 1, 2, 0 };
  155. int test3_res[] = { -1, 1, 2, 3, 4, 0 };
  156. int errors = 0;
  157. int len;
  158. wpa_printf(MSG_INFO, "int_array tests");
  159. if (int_array_len(test1) != 6 ||
  160. int_array_len(test2) != 2)
  161. errors++;
  162. int_array_sort_unique(test3);
  163. len = int_array_len(test3_res);
  164. if (int_array_len(test3) != len)
  165. errors++;
  166. else if (os_memcmp(test3, test3_res, len * sizeof(int)) != 0)
  167. errors++;
  168. if (errors) {
  169. wpa_printf(MSG_ERROR, "%d int_array test(s) failed", errors);
  170. return -1;
  171. }
  172. return 0;
  173. }
  174. static int ext_password_tests(void)
  175. {
  176. struct ext_password_data *data;
  177. int ret = 0;
  178. struct wpabuf *pw;
  179. wpa_printf(MSG_INFO, "ext_password tests");
  180. data = ext_password_init("unknown", "foo");
  181. if (data != NULL)
  182. return -1;
  183. data = ext_password_init("test", NULL);
  184. if (data == NULL)
  185. return -1;
  186. pw = ext_password_get(data, "foo");
  187. if (pw != NULL)
  188. ret = -1;
  189. ext_password_free(pw);
  190. ext_password_deinit(data);
  191. pw = ext_password_get(NULL, "foo");
  192. if (pw != NULL)
  193. ret = -1;
  194. ext_password_free(pw);
  195. return ret;
  196. }
  197. static int trace_tests(void)
  198. {
  199. wpa_printf(MSG_INFO, "trace tests");
  200. wpa_trace_show("test backtrace");
  201. wpa_trace_dump_funcname("test funcname", trace_tests);
  202. return 0;
  203. }
  204. int utils_module_tests(void)
  205. {
  206. int ret = 0;
  207. wpa_printf(MSG_INFO, "utils module tests");
  208. if (printf_encode_decode_tests() < 0 ||
  209. ext_password_tests() < 0 ||
  210. trace_tests() < 0 ||
  211. bitfield_tests() < 0 ||
  212. int_array_tests() < 0)
  213. ret = -1;
  214. return ret;
  215. }