/*
 * Copyright (c) 2021 Intel Corporation
 * SPDX-License-Identifier: Apache-2.0
 */
#include <ztest.h>
#include <zephyr/sys/winstream.h>

/* This, uh, seems to be the standard way to unit test library code.
 * Or so I gather from tests/unit/rbtree ...
 */
#include "../../../lib/os/winstream.c"

#define BUFLEN 64

const char *msg = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
char wsmem[BUFLEN + 1]; /* Extra 1 to have a null for easier debugging */

void test_winstream(void)
{
	struct sys_winstream *ws = sys_winstream_init(wsmem, BUFLEN);

	/* Write one byte */
	sys_winstream_write(ws, "a", 1);

	uint32_t seq = 0;
	char c;

	/* Read the byte back */
	uint32_t bytes = sys_winstream_read(ws, &seq, &c, 1);

	zassert_true(bytes == 1, "");
	zassert_true(seq == 1, "");
	zassert_true(c == 'a', "");

	/* Read from an empty buffer */
	bytes = sys_winstream_read(ws, &seq, &c, 1);
	zassert_true(bytes == 0, "");
	zassert_true(seq == 1, "");

	/* Write an overflowing string */
	sys_winstream_write(ws, msg, strlen(msg));
	zassert_true(ws->seq == 1 + strlen(msg), "");
	zassert_true(ws->start == 1, "");
	zassert_true(ws->end == 0, "");

	/* Read after underflow, verify empty string comes back with the
	 * correct sequence number
	 */
	char readback[BUFLEN + 1];

	memset(readback, 0, sizeof(readback));
	bytes = sys_winstream_read(ws, &seq, readback, sizeof(readback));
	zassert_true(seq == ws->seq, "");
	zassert_true(bytes == 0, "");

	/* Read back from empty buffer */
	uint32_t seq0 = seq;

	bytes = sys_winstream_read(ws, &seq, readback, sizeof(readback));
	zassert_true(seq == seq0, "");
	zassert_true(bytes == 0, "");

	/* Write a "short-enough" string that fits in before the wrap,
	 * then read it out
	 */
	seq0 = seq;
	sys_winstream_write(ws, msg, ws->len / 2);
	bytes = sys_winstream_read(ws, &seq, readback, sizeof(readback));
	zassert_true(bytes == ws->len / 2, "");
	zassert_true(seq == seq0 + ws->len / 2, "");
	zassert_true(strncmp(readback, msg, ws->len / 2) == 0, "");

	/* Do it again, this time it will need to wrap around the buffer */
	memset(readback, 0, sizeof(readback));
	seq0 = seq;
	sys_winstream_write(ws, msg, ws->len / 2);
	bytes = sys_winstream_read(ws, &seq, readback, sizeof(readback));
	zassert_true(bytes == ws->len / 2, "");
	zassert_true(seq == seq0 + ws->len / 2, "");
	zassert_true(strncmp(readback, msg, ws->len / 2) == 0, "");

	/* Finally loop with a relatively prime (actually prime prime)
	 * buffer size to stress for edges.
	 */
	int n = 13;
	char msg2[13];

	for (int i = 0; i < (n + 1) * (ws->len + 1); i++) {
		memset(msg2, 'A' + (i % 26), n);
		seq0 = seq;
		memset(readback, 0, sizeof(readback));
		sys_winstream_write(ws, msg2, n);
		bytes = sys_winstream_read(ws, &seq, readback, sizeof(readback));
		zassert_true(bytes == n, "");
		zassert_true(seq == seq0 + n, "");
		zassert_true(strncmp(readback, msg2, n) == 0, "");
	}
}

void test_main(void)
{
	ztest_test_suite(test_winstream,
			 ztest_unit_test(test_winstream)
			 );
	ztest_run_test_suite(test_winstream);
}
