2021-12-31 11:29:49 +08:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2021 Intel Corporation
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
2022-07-19 22:16:24 +08:00
|
|
|
#include <zephyr/ztest.h>
|
2022-05-06 16:44:33 +08:00
|
|
|
#include <zephyr/sys/winstream.h>
|
2021-12-31 11:29:49 +08:00
|
|
|
|
|
|
|
/* This, uh, seems to be the standard way to unit test library code.
|
|
|
|
* Or so I gather from tests/unit/rbtree ...
|
|
|
|
*/
|
2023-12-20 21:07:43 +08:00
|
|
|
#include "../../../lib/utils/winstream.c"
|
2021-12-31 11:29:49 +08:00
|
|
|
|
|
|
|
#define BUFLEN 64
|
|
|
|
|
|
|
|
const char *msg = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
|
|
char wsmem[BUFLEN + 1]; /* Extra 1 to have a null for easier debugging */
|
|
|
|
|
2022-08-21 16:28:00 +08:00
|
|
|
ZTEST(winstream, test_winstream)
|
2021-12-31 11:29:49 +08:00
|
|
|
{
|
|
|
|
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, "");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-08-21 16:28:00 +08:00
|
|
|
ZTEST_SUITE(winstream, NULL, NULL, NULL, NULL, NULL);
|