| /* |
| * utils module tests |
| * Copyright (c) 2014, Jouni Malinen <j@w1.fi> |
| * |
| * This software may be distributed under the terms of the BSD license. |
| * See README for more details. |
| */ |
| |
| #include "utils/includes.h" |
| |
| #include "utils/common.h" |
| #include "utils/bitfield.h" |
| #include "utils/ext_password.h" |
| #include "utils/trace.h" |
| |
| |
| struct printf_test_data { |
| u8 *data; |
| size_t len; |
| char *encoded; |
| }; |
| |
| static const struct printf_test_data printf_tests[] = { |
| { (u8 *) "abcde", 5, "abcde" }, |
| { (u8 *) "a\0b\nc\ed\re\tf\"\\", 13, "a\\0b\\nc\\ed\\re\\tf\\\"\\\\" }, |
| { (u8 *) "\x00\x31\x00\x32\x00\x39", 6, "\\x001\\0002\\09" }, |
| { (u8 *) "\n\n\n", 3, "\n\12\x0a" }, |
| { (u8 *) "\303\245\303\244\303\266\303\205\303\204\303\226", 12, |
| "\\xc3\\xa5\xc3\\xa4\\xc3\\xb6\\xc3\\x85\\xc3\\x84\\xc3\\x96" }, |
| { (u8 *) "\303\245\303\244\303\266\303\205\303\204\303\226", 12, |
| "\\303\\245\\303\\244\\303\\266\\303\\205\\303\\204\\303\\226" }, |
| { (u8 *) "\xe5\xe4\xf6\xc5\xc4\xd6", 6, |
| "\\xe5\\xe4\\xf6\\xc5\\xc4\\xd6" }, |
| { NULL, 0, NULL } |
| }; |
| |
| |
| static int printf_encode_decode_tests(void) |
| { |
| int i; |
| size_t binlen; |
| char buf[100]; |
| u8 bin[100]; |
| int errors = 0; |
| |
| wpa_printf(MSG_INFO, "printf encode/decode tests"); |
| |
| for (i = 0; printf_tests[i].data; i++) { |
| const struct printf_test_data *test = &printf_tests[i]; |
| printf_encode(buf, sizeof(buf), test->data, test->len); |
| wpa_printf(MSG_INFO, "%d: -> \"%s\"", i, buf); |
| |
| binlen = printf_decode(bin, sizeof(bin), buf); |
| if (binlen != test->len || |
| os_memcmp(bin, test->data, binlen) != 0) { |
| wpa_hexdump(MSG_ERROR, "Error in decoding#1", |
| bin, binlen); |
| errors++; |
| } |
| |
| binlen = printf_decode(bin, sizeof(bin), test->encoded); |
| if (binlen != test->len || |
| os_memcmp(bin, test->data, binlen) != 0) { |
| wpa_hexdump(MSG_ERROR, "Error in decoding#2", |
| bin, binlen); |
| errors++; |
| } |
| } |
| |
| buf[5] = 'A'; |
| printf_encode(buf, 5, (const u8 *) "abcde", 5); |
| if (buf[5] != 'A') { |
| wpa_printf(MSG_ERROR, "Error in bounds checking#1"); |
| errors++; |
| } |
| |
| for (i = 5; i < 10; i++) { |
| buf[i] = 'A'; |
| printf_encode(buf, i, (const u8 *) "\xdd\xdd\xdd\xdd\xdd", 5); |
| if (buf[i] != 'A') { |
| wpa_printf(MSG_ERROR, "Error in bounds checking#2(%d)", |
| i); |
| errors++; |
| } |
| } |
| |
| if (errors) { |
| wpa_printf(MSG_ERROR, "%d printf test(s) failed", errors); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| |
| static int bitfield_tests(void) |
| { |
| struct bitfield *bf; |
| int i; |
| int errors = 0; |
| |
| wpa_printf(MSG_INFO, "bitfield tests"); |
| |
| bf = bitfield_alloc(123); |
| if (bf == NULL) |
| return -1; |
| |
| for (i = 0; i < 123; i++) { |
| if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1)) |
| errors++; |
| if (i > 0 && bitfield_is_set(bf, i - 1)) |
| errors++; |
| bitfield_set(bf, i); |
| if (!bitfield_is_set(bf, i)) |
| errors++; |
| bitfield_clear(bf, i); |
| if (bitfield_is_set(bf, i)) |
| errors++; |
| } |
| |
| for (i = 123; i < 200; i++) { |
| if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1)) |
| errors++; |
| if (i > 0 && bitfield_is_set(bf, i - 1)) |
| errors++; |
| bitfield_set(bf, i); |
| if (bitfield_is_set(bf, i)) |
| errors++; |
| bitfield_clear(bf, i); |
| if (bitfield_is_set(bf, i)) |
| errors++; |
| } |
| |
| for (i = 0; i < 123; i++) { |
| if (bitfield_is_set(bf, i) || bitfield_is_set(bf, i + 1)) |
| errors++; |
| bitfield_set(bf, i); |
| if (!bitfield_is_set(bf, i)) |
| errors++; |
| } |
| |
| for (i = 0; i < 123; i++) { |
| if (!bitfield_is_set(bf, i)) |
| errors++; |
| bitfield_clear(bf, i); |
| if (bitfield_is_set(bf, i)) |
| errors++; |
| } |
| |
| for (i = 0; i < 123; i++) { |
| if (bitfield_get_first_zero(bf) != i) |
| errors++; |
| bitfield_set(bf, i); |
| } |
| if (bitfield_get_first_zero(bf) != -1) |
| errors++; |
| for (i = 0; i < 123; i++) { |
| if (!bitfield_is_set(bf, i)) |
| errors++; |
| bitfield_clear(bf, i); |
| if (bitfield_get_first_zero(bf) != i) |
| errors++; |
| bitfield_set(bf, i); |
| } |
| if (bitfield_get_first_zero(bf) != -1) |
| errors++; |
| |
| bitfield_free(bf); |
| |
| if (errors) { |
| wpa_printf(MSG_ERROR, "%d bitfield test(s) failed", errors); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| |
| static int int_array_tests(void) |
| { |
| int test1[] = { 1, 2, 3, 4, 5, 6, 0 }; |
| int test2[] = { 1, -1, 0 }; |
| int test3[] = { 1, 1, 1, -1, 2, 3, 4, 1, 2, 0 }; |
| int test3_res[] = { -1, 1, 2, 3, 4, 0 }; |
| int errors = 0; |
| int len; |
| |
| wpa_printf(MSG_INFO, "int_array tests"); |
| |
| if (int_array_len(test1) != 6 || |
| int_array_len(test2) != 2) |
| errors++; |
| |
| int_array_sort_unique(test3); |
| len = int_array_len(test3_res); |
| if (int_array_len(test3) != len) |
| errors++; |
| else if (os_memcmp(test3, test3_res, len * sizeof(int)) != 0) |
| errors++; |
| |
| if (errors) { |
| wpa_printf(MSG_ERROR, "%d int_array test(s) failed", errors); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| |
| static int ext_password_tests(void) |
| { |
| struct ext_password_data *data; |
| int ret = 0; |
| struct wpabuf *pw; |
| |
| wpa_printf(MSG_INFO, "ext_password tests"); |
| |
| data = ext_password_init("unknown", "foo"); |
| if (data != NULL) |
| return -1; |
| |
| data = ext_password_init("test", NULL); |
| if (data == NULL) |
| return -1; |
| pw = ext_password_get(data, "foo"); |
| if (pw != NULL) |
| ret = -1; |
| ext_password_free(pw); |
| |
| ext_password_deinit(data); |
| |
| pw = ext_password_get(NULL, "foo"); |
| if (pw != NULL) |
| ret = -1; |
| ext_password_free(pw); |
| |
| return ret; |
| } |
| |
| |
| static int trace_tests(void) |
| { |
| wpa_printf(MSG_INFO, "trace tests"); |
| |
| wpa_trace_show("test backtrace"); |
| wpa_trace_dump_funcname("test funcname", trace_tests); |
| |
| return 0; |
| } |
| |
| |
| int utils_module_tests(void) |
| { |
| int ret = 0; |
| |
| wpa_printf(MSG_INFO, "utils module tests"); |
| |
| if (printf_encode_decode_tests() < 0 || |
| ext_password_tests() < 0 || |
| trace_tests() < 0 || |
| bitfield_tests() < 0 || |
| int_array_tests() < 0) |
| ret = -1; |
| |
| return ret; |
| } |