| /* |
| * Copyright (c) 2021 Intel Corporation |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| #include <zephyr/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); |
| } |