/*
 * utils module tests
 * Copyright (c) 2014-2015, 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/const_time.h"
#include "common/ieee802_11_defs.h"
#include "utils/bitfield.h"
#include "utils/ext_password.h"
#include "utils/trace.h"
#include "utils/base64.h"
#include "utils/ip_addr.h"
#include "utils/eloop.h"
#include "utils/json.h"
#include "utils/module_tests.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;
	int array[10];

	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 (printf_decode(bin, 3, "abcde") != 2)
		errors++;

	if (printf_decode(bin, 3, "\\xa") != 1 || bin[0] != 10)
		errors++;

	if (printf_decode(bin, 3, "\\xq") != 1 || bin[0] != 'q')
		errors++;

	if (printf_decode(bin, 3, "\\a") != 1 || bin[0] != 'a')
		errors++;

	array[0] = 10;
	array[1] = 10;
	array[2] = 5;
	array[3] = 10;
	array[4] = 5;
	array[5] = 0;
	if (int_array_len(array) != 5)
		errors++;
	int_array_sort_unique(array);
	if (int_array_len(array) != 2)
		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);

	bf = bitfield_alloc(8);
	if (bf == NULL)
		return -1;
	if (bitfield_get_first_zero(bf) != 0)
		errors++;
	for (i = 0; i < 8; i++)
		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;
}


static int base64_tests(void)
{
	int errors = 0;
	unsigned char *res;
	size_t res_len;

	wpa_printf(MSG_INFO, "base64 tests");

	res = base64_encode((const unsigned char *) "", ~0, &res_len);
	if (res) {
		errors++;
		os_free(res);
	}

	res = base64_encode((const unsigned char *) "=", 1, &res_len);
	if (!res || res_len != 5 || res[0] != 'P' || res[1] != 'Q' ||
	    res[2] != '=' || res[3] != '=' || res[4] != '\n')
		errors++;
	os_free(res);

	res = base64_encode((const unsigned char *) "=", 1, NULL);
	if (!res || res[0] != 'P' || res[1] != 'Q' ||
	    res[2] != '=' || res[3] != '=' || res[4] != '\n')
		errors++;
	os_free(res);

	res = base64_decode((const unsigned char *) "", 0, &res_len);
	if (res) {
		errors++;
		os_free(res);
	}

	res = base64_decode((const unsigned char *) "a", 1, &res_len);
	if (res) {
		errors++;
		os_free(res);
	}

	res = base64_decode((const unsigned char *) "====", 4, &res_len);
	if (res) {
		errors++;
		os_free(res);
	}

	res = base64_decode((const unsigned char *) "PQ==", 4, &res_len);
	if (!res || res_len != 1 || res[0] != '=')
		errors++;
	os_free(res);

	res = base64_decode((const unsigned char *) "P.Q-=!=*", 8, &res_len);
	if (!res || res_len != 1 || res[0] != '=')
		errors++;
	os_free(res);

	if (errors) {
		wpa_printf(MSG_ERROR, "%d base64 test(s) failed", errors);
		return -1;
	}

	return 0;
}


static int common_tests(void)
{
	char buf[3], longbuf[100];
	u8 addr[ETH_ALEN] = { 1, 2, 3, 4, 5, 6 };
	u8 bin[3];
	int errors = 0;
	struct wpa_freq_range_list ranges;
	size_t len;
	const char *txt;
	u8 ssid[255];

	wpa_printf(MSG_INFO, "common tests");

	if (hwaddr_mask_txt(buf, 3, addr, addr) != -1)
		errors++;

	if (wpa_scnprintf(buf, 0, "hello") != 0 ||
	    wpa_scnprintf(buf, 3, "hello") != 2)
		errors++;

	if (wpa_snprintf_hex(buf, 0, addr, ETH_ALEN) != 0 ||
	    wpa_snprintf_hex(buf, 3, addr, ETH_ALEN) != 2)
		errors++;

	if (merge_byte_arrays(bin, 3, addr, ETH_ALEN, NULL, 0) != 3 ||
	    merge_byte_arrays(bin, 3, NULL, 0, addr, ETH_ALEN) != 3)
		errors++;

	if (dup_binstr(NULL, 0) != NULL)
		errors++;

	if (freq_range_list_includes(NULL, 0) != 0)
		errors++;

	os_memset(&ranges, 0, sizeof(ranges));
	if (freq_range_list_parse(&ranges, "") != 0 ||
	    freq_range_list_includes(&ranges, 0) != 0 ||
	    freq_range_list_str(&ranges) != NULL)
		errors++;

	if (utf8_unescape(NULL, 0, buf, sizeof(buf)) != 0 ||
	    utf8_unescape("a", 1, NULL, 0) != 0 ||
	    utf8_unescape("a\\", 2, buf, sizeof(buf)) != 0 ||
	    utf8_unescape("abcde", 5, buf, sizeof(buf)) != 0 ||
	    utf8_unescape("abc", 3, buf, 3) != 3)
		errors++;

	if (utf8_unescape("a", 0, buf, sizeof(buf)) != 1 || buf[0] != 'a')
		errors++;

	if (utf8_unescape("\\b", 2, buf, sizeof(buf)) != 1 || buf[0] != 'b')
		errors++;

	if (utf8_escape(NULL, 0, buf, sizeof(buf)) != 0 ||
	    utf8_escape("a", 1, NULL, 0) != 0 ||
	    utf8_escape("abcde", 5, buf, sizeof(buf)) != 0 ||
	    utf8_escape("a\\bcde", 6, buf, sizeof(buf)) != 0 ||
	    utf8_escape("ab\\cde", 6, buf, sizeof(buf)) != 0 ||
	    utf8_escape("abc\\de", 6, buf, sizeof(buf)) != 0 ||
	    utf8_escape("abc", 3, buf, 3) != 3)
		errors++;

	if (utf8_escape("a", 0, buf, sizeof(buf)) != 1 || buf[0] != 'a')
		errors++;

	os_memset(ssid, 0, sizeof(ssid));
	txt = wpa_ssid_txt(ssid, sizeof(ssid));
	len = os_strlen(txt);
	/* Verify that SSID_MAX_LEN * 4 buffer limit is enforced. */
	if (len != SSID_MAX_LEN * 4) {
		wpa_printf(MSG_ERROR,
			   "Unexpected wpa_ssid_txt() result with too long SSID");
		errors++;
	}

	if (wpa_snprintf_hex_sep(longbuf, 0, addr, ETH_ALEN, '-') != 0 ||
	    wpa_snprintf_hex_sep(longbuf, 5, addr, ETH_ALEN, '-') != 3 ||
	    os_strcmp(longbuf, "01-0") != 0)
		errors++;

	if (errors) {
		wpa_printf(MSG_ERROR, "%d common test(s) failed", errors);
		return -1;
	}

	return 0;
}


static int os_tests(void)
{
	int errors = 0;
	void *ptr;
	os_time_t t;

	wpa_printf(MSG_INFO, "os tests");

	ptr = os_calloc((size_t) -1, (size_t) -1);
	if (ptr) {
		errors++;
		os_free(ptr);
	}
	ptr = os_calloc((size_t) 2, (size_t) -1);
	if (ptr) {
		errors++;
		os_free(ptr);
	}
	ptr = os_calloc((size_t) -1, (size_t) 2);
	if (ptr) {
		errors++;
		os_free(ptr);
	}

	ptr = os_realloc_array(NULL, (size_t) -1, (size_t) -1);
	if (ptr) {
		errors++;
		os_free(ptr);
	}

	os_sleep(1, 1);

	if (os_mktime(1969, 1, 1, 1, 1, 1, &t) == 0 ||
	    os_mktime(1971, 0, 1, 1, 1, 1, &t) == 0 ||
	    os_mktime(1971, 13, 1, 1, 1, 1, &t) == 0 ||
	    os_mktime(1971, 1, 0, 1, 1, 1, &t) == 0 ||
	    os_mktime(1971, 1, 32, 1, 1, 1, &t) == 0 ||
	    os_mktime(1971, 1, 1, -1, 1, 1, &t) == 0 ||
	    os_mktime(1971, 1, 1, 24, 1, 1, &t) == 0 ||
	    os_mktime(1971, 1, 1, 1, -1, 1, &t) == 0 ||
	    os_mktime(1971, 1, 1, 1, 60, 1, &t) == 0 ||
	    os_mktime(1971, 1, 1, 1, 1, -1, &t) == 0 ||
	    os_mktime(1971, 1, 1, 1, 1, 61, &t) == 0 ||
	    os_mktime(1971, 1, 1, 1, 1, 1, &t) != 0 ||
	    os_mktime(2020, 1, 2, 3, 4, 5, &t) != 0 ||
	    os_mktime(2015, 12, 31, 23, 59, 59, &t) != 0)
		errors++;

	if (os_setenv("hwsim_test_env", "test value", 0) != 0 ||
	    os_setenv("hwsim_test_env", "test value 2", 1) != 0 ||
	    os_unsetenv("hwsim_test_env") != 0)
		errors++;

	if (os_file_exists("/this-file-does-not-exists-hwsim") != 0)
		errors++;

	if (errors) {
		wpa_printf(MSG_ERROR, "%d os test(s) failed", errors);
		return -1;
	}

	return 0;
}


static int wpabuf_tests(void)
{
	int errors = 0;
	void *ptr;
	struct wpabuf *buf;

	wpa_printf(MSG_INFO, "wpabuf tests");

	ptr = os_malloc(100);
	if (ptr) {
		buf = wpabuf_alloc_ext_data(ptr, 100);
		if (buf) {
			if (wpabuf_resize(&buf, 100) < 0)
				errors++;
			else
				wpabuf_put(buf, 100);
			wpabuf_free(buf);
		} else {
			errors++;
			os_free(ptr);
		}
	} else {
		errors++;
	}

	buf = wpabuf_alloc(100);
	if (buf) {
		struct wpabuf *buf2;

		wpabuf_put(buf, 100);
		if (wpabuf_resize(&buf, 100) < 0)
			errors++;
		else
			wpabuf_put(buf, 100);
		buf2 = wpabuf_concat(buf, NULL);
		if (buf2 != buf)
			errors++;
		wpabuf_free(buf2);
	} else {
		errors++;
	}

	buf = NULL;
	buf = wpabuf_zeropad(buf, 10);
	if (buf != NULL)
		errors++;

	if (errors) {
		wpa_printf(MSG_ERROR, "%d wpabuf test(s) failed", errors);
		return -1;
	}

	return 0;
}


static int ip_addr_tests(void)
{
	int errors = 0;
	struct hostapd_ip_addr addr;
	char buf[100];

	wpa_printf(MSG_INFO, "ip_addr tests");

	if (hostapd_parse_ip_addr("1.2.3.4", &addr) != 0 ||
	    addr.af != AF_INET ||
	    hostapd_ip_txt(NULL, buf, sizeof(buf)) != NULL ||
	    hostapd_ip_txt(&addr, buf, 1) != buf || buf[0] != '\0' ||
	    hostapd_ip_txt(&addr, buf, 0) != NULL ||
	    hostapd_ip_txt(&addr, buf, sizeof(buf)) != buf)
		errors++;

	if (hostapd_parse_ip_addr("::", &addr) != 0 ||
	    addr.af != AF_INET6 ||
	    hostapd_ip_txt(&addr, buf, 1) != buf || buf[0] != '\0' ||
	    hostapd_ip_txt(&addr, buf, sizeof(buf)) != buf)
		errors++;

	if (errors) {
		wpa_printf(MSG_ERROR, "%d ip_addr test(s) failed", errors);
		return -1;
	}

	return 0;
}


struct test_eloop {
	unsigned int magic;
	int close_in_timeout;
	int pipefd1[2];
	int pipefd2[2];
};


static void eloop_tests_start(int close_in_timeout);


static void eloop_test_read_2(int sock, void *eloop_ctx, void *sock_ctx)
{
	struct test_eloop *t = eloop_ctx;
	ssize_t res;
	char buf[10];

	wpa_printf(MSG_INFO, "%s: sock=%d", __func__, sock);

	if (t->magic != 0x12345678) {
		wpa_printf(MSG_INFO, "%s: unexpected magic 0x%x",
			   __func__, t->magic);
	}

	if (t->pipefd2[0] != sock) {
		wpa_printf(MSG_INFO, "%s: unexpected sock %d != %d",
			   __func__, sock, t->pipefd2[0]);
	}

	res = read(sock, buf, sizeof(buf));
	wpa_printf(MSG_INFO, "%s: sock=%d --> res=%d",
		   __func__, sock, (int) res);
}


static void eloop_test_read_2_wrong(int sock, void *eloop_ctx, void *sock_ctx)
{
	struct test_eloop *t = eloop_ctx;

	wpa_printf(MSG_INFO, "%s: sock=%d", __func__, sock);

	if (t->magic != 0x12345678) {
		wpa_printf(MSG_INFO, "%s: unexpected magic 0x%x",
			   __func__, t->magic);
	}

	if (t->pipefd2[0] != sock) {
		wpa_printf(MSG_INFO, "%s: unexpected sock %d != %d",
			   __func__, sock, t->pipefd2[0]);
	}

	/*
	 * This is expected to block due to the original socket with data having
	 * been closed and no new data having been written to the new socket
	 * with the same fd. To avoid blocking the process during test, skip the
	 * read here.
	 */
	wpa_printf(MSG_ERROR, "%s: FAIL - should not have called this function",
		   __func__);
}


static void reopen_pipefd2(struct test_eloop *t)
{
	if (t->pipefd2[0] < 0) {
		wpa_printf(MSG_INFO, "pipefd2 had been closed");
	} else {
		int res;

		wpa_printf(MSG_INFO, "close pipefd2");
		eloop_unregister_read_sock(t->pipefd2[0]);
		close(t->pipefd2[0]);
		t->pipefd2[0] = -1;
		close(t->pipefd2[1]);
		t->pipefd2[1] = -1;

		res = pipe(t->pipefd2);
		if (res < 0) {
			wpa_printf(MSG_INFO, "pipe: %s", strerror(errno));
			t->pipefd2[0] = -1;
			t->pipefd2[1] = -1;
			return;
		}

		wpa_printf(MSG_INFO,
			   "re-register pipefd2 with new sockets %d,%d",
			   t->pipefd2[0], t->pipefd2[1]);
		eloop_register_read_sock(t->pipefd2[0], eloop_test_read_2_wrong,
					 t, NULL);
	}
}


static void eloop_test_read_1(int sock, void *eloop_ctx, void *sock_ctx)
{
	struct test_eloop *t = eloop_ctx;
	ssize_t res;
	char buf[10];

	wpa_printf(MSG_INFO, "%s: sock=%d", __func__, sock);

	if (t->magic != 0x12345678) {
		wpa_printf(MSG_INFO, "%s: unexpected magic 0x%x",
			   __func__, t->magic);
	}

	if (t->pipefd1[0] != sock) {
		wpa_printf(MSG_INFO, "%s: unexpected sock %d != %d",
			   __func__, sock, t->pipefd1[0]);
	}

	res = read(sock, buf, sizeof(buf));
	wpa_printf(MSG_INFO, "%s: sock=%d --> res=%d",
		   __func__, sock, (int) res);

	if (!t->close_in_timeout)
		reopen_pipefd2(t);
}


static void eloop_test_cb(void *eloop_data, void *user_ctx)
{
	struct test_eloop *t = eloop_data;

	wpa_printf(MSG_INFO, "%s", __func__);

	if (t->magic != 0x12345678) {
		wpa_printf(MSG_INFO, "%s: unexpected magic 0x%x",
			   __func__, t->magic);
	}

	if (t->close_in_timeout)
		reopen_pipefd2(t);
}


static void eloop_test_timeout(void *eloop_data, void *user_ctx)
{
	struct test_eloop *t = eloop_data;
	int next_run = 0;

	wpa_printf(MSG_INFO, "%s", __func__);

	if (t->magic != 0x12345678) {
		wpa_printf(MSG_INFO, "%s: unexpected magic 0x%x",
			   __func__, t->magic);
	}

	if (t->pipefd1[0] >= 0) {
		wpa_printf(MSG_INFO, "pipefd1 had not been closed");
		eloop_unregister_read_sock(t->pipefd1[0]);
		close(t->pipefd1[0]);
		t->pipefd1[0] = -1;
		close(t->pipefd1[1]);
		t->pipefd1[1] = -1;
	}

	if (t->pipefd2[0] >= 0) {
		wpa_printf(MSG_INFO, "pipefd2 had not been closed");
		eloop_unregister_read_sock(t->pipefd2[0]);
		close(t->pipefd2[0]);
		t->pipefd2[0] = -1;
		close(t->pipefd2[1]);
		t->pipefd2[1] = -1;
	}

	next_run = t->close_in_timeout;
	t->magic = 0;
	wpa_printf(MSG_INFO, "%s - free(%p)", __func__, t);
	os_free(t);

	if (next_run)
		eloop_tests_start(0);
}


static void eloop_tests_start(int close_in_timeout)
{
	struct test_eloop *t;
	int res;

	t = os_zalloc(sizeof(*t));
	if (!t)
		return;
	t->magic = 0x12345678;
	t->close_in_timeout = close_in_timeout;

	wpa_printf(MSG_INFO, "starting eloop tests (%p) (close_in_timeout=%d)",
		   t, close_in_timeout);

	res = pipe(t->pipefd1);
	if (res < 0) {
		wpa_printf(MSG_INFO, "pipe: %s", strerror(errno));
		os_free(t);
		return;
	}

	res = pipe(t->pipefd2);
	if (res < 0) {
		wpa_printf(MSG_INFO, "pipe: %s", strerror(errno));
		close(t->pipefd1[0]);
		close(t->pipefd1[1]);
		os_free(t);
		return;
	}

	wpa_printf(MSG_INFO, "pipe fds: %d,%d %d,%d",
		   t->pipefd1[0], t->pipefd1[1],
		   t->pipefd2[0], t->pipefd2[1]);

	eloop_register_read_sock(t->pipefd1[0], eloop_test_read_1, t, NULL);
	eloop_register_read_sock(t->pipefd2[0], eloop_test_read_2, t, NULL);
	eloop_register_timeout(0, 0, eloop_test_cb, t, NULL);
	eloop_register_timeout(0, 200000, eloop_test_timeout, t, NULL);

	if (write(t->pipefd1[1], "HELLO", 5) < 0)
		wpa_printf(MSG_INFO, "write: %s", strerror(errno));
	if (write(t->pipefd2[1], "TEST", 4) < 0)
		wpa_printf(MSG_INFO, "write: %s", strerror(errno));
	os_sleep(0, 50000);
	wpa_printf(MSG_INFO, "waiting for eloop callbacks");
}


static void eloop_tests_run(void *eloop_data, void *user_ctx)
{
	eloop_tests_start(1);
}


static int eloop_tests(void)
{
	wpa_printf(MSG_INFO, "schedule eloop tests to be run");

	/*
	 * Cannot return error from these without a significant design change,
	 * so for now, run the tests from a scheduled timeout and require
	 * separate verification of the results from the debug log.
	 */
	eloop_register_timeout(0, 0, eloop_tests_run, NULL, NULL);

	return 0;
}


#ifdef CONFIG_JSON
struct json_test_data {
	const char *json;
	const char *tree;
};

static const struct json_test_data json_test_cases[] = {
	{ "{}", "[1:OBJECT:]" },
	{ "[]", "[1:ARRAY:]" },
	{ "{", NULL },
	{ "[", NULL },
	{ "}", NULL },
	{ "]", NULL },
	{ "[[]]", "[1:ARRAY:][2:ARRAY:]" },
	{ "{\"t\":\"test\"}", "[1:OBJECT:][2:STRING:t]" },
	{ "{\"t\":123}", "[1:OBJECT:][2:NUMBER:t]" },
	{ "{\"t\":true}", "[1:OBJECT:][2:BOOLEAN:t]" },
	{ "{\"t\":false}", "[1:OBJECT:][2:BOOLEAN:t]" },
	{ "{\"t\":null}", "[1:OBJECT:][2:NULL:t]" },
	{ "{\"t\":truetrue}", NULL },
	{ "\"test\"", "[1:STRING:]" },
	{ "123", "[1:NUMBER:]" },
	{ "true", "[1:BOOLEAN:]" },
	{ "false", "[1:BOOLEAN:]" },
	{ "null", "[1:NULL:]" },
	{ "truetrue", NULL },
	{ " {\t\n\r\"a\"\n:\r1\n,\n\"b\":3\n}\n",
	  "[1:OBJECT:][2:NUMBER:a][2:NUMBER:b]" },
	{ ",", NULL },
	{ "{,}", NULL },
	{ "[,]", NULL },
	{ ":", NULL },
	{ "{:}", NULL },
	{ "[:]", NULL },
	{ "{ \"\\u005c\" : \"\\u005c\" }", "[1:OBJECT:][2:STRING:\\]" },
	{ "[{},{}]", "[1:ARRAY:][2:OBJECT:][2:OBJECT:]" },
	{ "[1,2]", "[1:ARRAY:][2:NUMBER:][2:NUMBER:]" },
	{ "[\"1\",\"2\"]", "[1:ARRAY:][2:STRING:][2:STRING:]" },
	{ "[true,false]", "[1:ARRAY:][2:BOOLEAN:][2:BOOLEAN:]" },
};
#endif /* CONFIG_JSON */


static int json_tests(void)
{
#ifdef CONFIG_JSON
	unsigned int i;
	struct json_token *root;
	char buf[1000];

	wpa_printf(MSG_INFO, "JSON tests");

	for (i = 0; i < ARRAY_SIZE(json_test_cases); i++) {
		const struct json_test_data *test = &json_test_cases[i];
		int res = 0;

		root = json_parse(test->json, os_strlen(test->json));
		if ((root && !test->tree) || (!root && test->tree)) {
			wpa_printf(MSG_INFO, "JSON test %u failed", i);
			res = -1;
		} else if (root) {
			json_print_tree(root, buf, sizeof(buf));
			if (os_strcmp(buf, test->tree) != 0) {
				wpa_printf(MSG_INFO,
					   "JSON test %u tree mismatch: %s %s",
					   i, buf, test->tree);
				res = -1;
			}
		}
		json_free(root);
		if (res < 0)
			return -1;

	}
#endif /* CONFIG_JSON */
	return 0;
}


static int const_time_tests(void)
{
	struct const_time_fill_msb_test {
		unsigned int val;
		unsigned int expected;
	} const_time_fill_msb_tests[] = {
		{ 0, 0 },
		{ 1, 0 },
		{ 2, 0 },
		{ 1 << (sizeof(unsigned int) * 8 - 1), ~0 },
		{ ~0 - 1, ~0 },
		{ ~0, ~0 }
	};
	struct const_time_is_zero_test {
		unsigned int val;
		unsigned int expected;
	} const_time_is_zero_tests[] = {
		{ 0, ~0 },
		{ 1, 0 },
		{ 2, 0 },
		{ 1 << (sizeof(unsigned int) * 8 - 1), 0 },
		{ ~0 - 1, 0 },
		{ ~0, 0 }
	};
	struct const_time_eq_test {
		unsigned int a;
		unsigned int b;
		unsigned int expected;
		unsigned int expected_u8;
	} const_time_eq_tests[] = {
		{ 0, 1, 0, 0 },
		{ 1, 2, 0, 0 },
		{ 1, 1, ~0, 0xff },
		{ ~0, ~0, ~0, 0xff },
		{ ~0, ~0 - 1, 0, 0 },
		{ 0, 0, ~0, 0xff }
	};
	struct const_time_eq_bin_test {
		u8 *a;
		u8 *b;
		size_t len;
		unsigned int expected;
	} const_time_eq_bin_tests[] = {
		{ (u8 *) "", (u8 *) "", 0, ~0 },
		{ (u8 *) "abcde", (u8 *) "abcde", 5, ~0 },
		{ (u8 *) "abcde", (u8 *) "Abcde", 5, 0 },
		{ (u8 *) "abcde", (u8 *) "aBcde", 5, 0 },
		{ (u8 *) "abcde", (u8 *) "abCde", 5, 0 },
		{ (u8 *) "abcde", (u8 *) "abcDe", 5, 0 },
		{ (u8 *) "abcde", (u8 *) "abcdE", 5, 0 },
		{ (u8 *) "\x00", (u8 *) "\x01", 1, 0 },
		{ (u8 *) "\x00", (u8 *) "\x80", 1, 0 },
		{ (u8 *) "\x00", (u8 *) "\x00", 1, ~0 }
	};
	struct const_time_select_test {
		unsigned int mask;
		unsigned int true_val;
		unsigned int false_val;
		unsigned int expected;
	} const_time_select_tests[] = {
		{ ~0, ~0, ~0, ~0 },
		{ 0, ~0, ~0, ~0 },
		{ ~0, ~0, 0, ~0 },
		{ 0, ~0, 0, 0 },
		{ ~0, 0xaaaaaaaa, 0x55555555, 0xaaaaaaaa },
		{ 0, 0xaaaaaaaa, 0x55555555, 0x55555555 },
		{ ~0, 3, 3, 3 },
		{ 0, 3, 3, 3 },
		{ ~0, 1, 2, 1 },
		{ 0, 1, 2, 2 }
	};
	struct const_time_select_int_test {
		unsigned int mask;
		int true_val;
		int false_val;
		int expected;
	} const_time_select_int_tests[] = {
		{ ~0, -128, 127, -128 },
		{ 0, -128, 127, 127 },
		{ ~0, -2147483648, 2147483647, -2147483648 },
		{ 0, -2147483648, 2147483647, 2147483647 },
		{ ~0, 0, 0, 0 },
		{ 0, 0, 0, 0 },
		{ ~0, -1, 1, -1 },
		{ 0, -1, 1, 1 }
	};
	struct const_time_select_u8_test {
		u8 mask;
		u8 true_val;
		u8 false_val;
		u8 expected;
	} const_time_select_u8_tests[] = {
		{ ~0, ~0, ~0, ~0 },
		{ 0, ~0, ~0, ~0 },
		{ ~0, ~0, 0, ~0 },
		{ 0, ~0, 0, 0 },
		{ ~0, 0xaa, 0x55, 0xaa },
		{ 0, 0xaa, 0x55, 0x55 },
		{ ~0, 1, 2, 1 },
		{ 0, 1, 2, 2 }
	};
	struct const_time_select_s8_test {
		u8 mask;
		s8 true_val;
		s8 false_val;
		s8 expected;
	} const_time_select_s8_tests[] = {
		{ ~0, -128, 127, -128 },
		{ 0, -128, 127, 127 },
		{ ~0, 0, 0, 0 },
		{ 0, 0, 0, 0 },
		{ ~0, -1, 1, -1 },
		{ 0, -1, 1, 1 }
	};
	struct const_time_select_bin_test {
		u8 mask;
		u8 *true_val;
		u8 *false_val;
		size_t len;
		u8 *expected;
	} const_time_select_bin_tests[] = {
		{ ~0, (u8 *) "abcde", (u8 *) "ABCDE", 5, (u8 *) "abcde" },
		{ 0, (u8 *) "abcde", (u8 *) "ABCDE", 5, (u8 *) "ABCDE" },
		{ ~0, (u8 *) "", (u8 *) "", 0, (u8 *) "" },
		{ 0, (u8 *) "", (u8 *) "", 0, (u8 *) "" }
	};
	struct const_time_memcmp_test {
		char *a;
		char *b;
		size_t len;
		int expected;
	} const_time_memcmp_tests[] = {
		{ "abcde", "abcde", 5, 0 },
		{ "abcde", "bbcde", 5, -1 },
		{ "bbcde", "abcde", 5, 1 },
		{ "accde", "abcde", 5, 1 },
		{ "abcee", "abcde", 5, 1 },
		{ "abcdf", "abcde", 5, 1 },
		{ "cbcde", "aXXXX", 5, 2 },
		{ "a", "d", 1, -3 },
		{ "", "", 0, 0 }
	};
	unsigned int i;
	int ret = 0;

	wpa_printf(MSG_INFO, "constant time tests");

	for (i = 0; i < ARRAY_SIZE(const_time_fill_msb_tests); i++) {
		struct const_time_fill_msb_test *test;

		test = &const_time_fill_msb_tests[i];
		if (const_time_fill_msb(test->val) != test->expected) {
			wpa_printf(MSG_ERROR,
				   "const_time_fill_msb(0x%x) test failed",
				   test->val);
			ret = -1;
		}
	}

	for (i = 0; i < ARRAY_SIZE(const_time_is_zero_tests); i++) {
		struct const_time_is_zero_test *test;

		test = &const_time_is_zero_tests[i];
		if (const_time_is_zero(test->val) != test->expected) {
			wpa_printf(MSG_ERROR,
				   "const_time_is_zero(0x%x) test failed",
				   test->val);
			ret = -1;
		}
	}

	for (i = 0; i < ARRAY_SIZE(const_time_eq_tests); i++) {
		struct const_time_eq_test *test;

		test = &const_time_eq_tests[i];
		if (const_time_eq(test->a, test->b) != test->expected) {
			wpa_printf(MSG_ERROR,
				   "const_time_eq(0x%x,0x%x) test failed",
				   test->a, test->b);
			ret = -1;
		}
		if (const_time_eq_u8(test->a, test->b) != test->expected_u8) {
			wpa_printf(MSG_ERROR,
				   "const_time_eq_u8(0x%x,0x%x) test failed",
				   test->a, test->b);
			ret = -1;
		}
	}

	for (i = 0; i < ARRAY_SIZE(const_time_eq_bin_tests); i++) {
		struct const_time_eq_bin_test *test;

		test = &const_time_eq_bin_tests[i];
		if (const_time_eq_bin(test->a, test->b, test->len) !=
		    test->expected) {
			wpa_printf(MSG_ERROR,
				   "const_time_eq_bin(len=%u) test failed",
				   (unsigned int) test->len);
			ret = -1;
		}
	}

	for (i = 0; i < ARRAY_SIZE(const_time_select_tests); i++) {
		struct const_time_select_test *test;

		test = &const_time_select_tests[i];
		if (const_time_select(test->mask, test->true_val,
				      test->false_val) != test->expected) {
			wpa_printf(MSG_ERROR,
				   "const_time_select(0x%x,0x%x,0x%x) test failed",
				   test->mask, test->true_val, test->false_val);
			ret = -1;
		}
	}

	for (i = 0; i < ARRAY_SIZE(const_time_select_int_tests); i++) {
		struct const_time_select_int_test *test;

		test = &const_time_select_int_tests[i];
		if (const_time_select_int(test->mask, test->true_val,
					  test->false_val) != test->expected) {
			wpa_printf(MSG_ERROR,
				   "const_time_select_int(0x%x,%d,%d) test failed",
				   test->mask, test->true_val, test->false_val);
			ret = -1;
		}
	}

	for (i = 0; i < ARRAY_SIZE(const_time_select_u8_tests); i++) {
		struct const_time_select_u8_test *test;

		test = &const_time_select_u8_tests[i];
		if (const_time_select_u8(test->mask, test->true_val,
					 test->false_val) != test->expected) {
			wpa_printf(MSG_ERROR,
				   "const_time_select_u8(0x%x,0x%x,0x%x) test failed",
				   test->mask, test->true_val, test->false_val);
			ret = -1;
		}
	}

	for (i = 0; i < ARRAY_SIZE(const_time_select_s8_tests); i++) {
		struct const_time_select_s8_test *test;

		test = &const_time_select_s8_tests[i];
		if (const_time_select_s8(test->mask, test->true_val,
					 test->false_val) != test->expected) {
			wpa_printf(MSG_ERROR,
				   "const_time_select_s8(0x%x,0x%x,0x%x) test failed",
				   test->mask, test->true_val, test->false_val);
			ret = -1;
		}
	}

	for (i = 0; i < ARRAY_SIZE(const_time_select_bin_tests); i++) {
		struct const_time_select_bin_test *test;
		u8 dst[100];

		test = &const_time_select_bin_tests[i];
		const_time_select_bin(test->mask, test->true_val,
				      test->false_val, test->len, dst);
		if (os_memcmp(dst, test->expected, test->len) != 0) {
			wpa_printf(MSG_ERROR,
				   "const_time_select_bin(0x%x,%u) test failed",
				   test->mask, (unsigned int) test->len);
			ret = -1;
		}
	}

	for (i = 0; i < ARRAY_SIZE(const_time_memcmp_tests); i++) {
		struct const_time_memcmp_test *test;
		int res;

		test = &const_time_memcmp_tests[i];
		res = const_time_memcmp(test->a, test->b, test->len);
		if (res != test->expected) {
			wpa_printf(MSG_ERROR,
				   "const_time_memcmp(%s,%s,%d) test failed (%d != %d)",
				   test->a, test->b, (int) test->len,
				   res, test->expected);
			ret = -1;
		}
	}

	return ret;
}


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 ||
	    base64_tests() < 0 ||
	    common_tests() < 0 ||
	    os_tests() < 0 ||
	    wpabuf_tests() < 0 ||
	    ip_addr_tests() < 0 ||
	    eloop_tests() < 0 ||
	    json_tests() < 0 ||
	    const_time_tests() < 0 ||
	    int_array_tests() < 0)
		ret = -1;

	return ret;
}
