/* libhw_generic/tests/test_io.c - Tests for * * Copyright (C) 2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include #include #include "test.h" int main() { char data[] = "abcdefghijklmnopqrstuvwxyz"; struct iovec src[] = { {.iov_base = &data[1], .iov_len=3}, /* "bcd" */ {.iov_base = &data[20], .iov_len=4}, /* "uvwx" */ }; const int src_cnt = sizeof(src)/sizeof(src[0]); struct duplex_iovec dst[2]; #define TC(start, max, ...) do { \ char *exp[] = {__VA_ARGS__}; \ int exp_cnt = sizeof(exp)/sizeof(exp[0]); \ int act_cnt = io_slice_cnt(src, src_cnt, start, max); \ test_assert(act_cnt == exp_cnt); \ memset(dst, 0, sizeof(dst)); \ io_slice_wr_to_duplex(dst, src, src_cnt, start, max); \ for (int i = 0; i < act_cnt; i++) { \ test_assert(dst[i].iov_read_to == IOVEC_DISCARD); \ test_assert(dst[i].iov_write_from != IOVEC_DISCARD); \ test_assert(dst[i].iov_len == strlen(exp[i])); \ test_assert(memcmp(dst[i].iov_write_from, exp[i], dst[i].iov_len) == 0); \ } \ } while (0) TC(0, 0, /* => */ "bcd", "uvwx"); TC(1, 0, /* => */ "cd", "uvwx"); TC(2, 0, /* => */ "d", "uvwx"); TC(3, 0, /* => */ "uvwx"); TC(4, 0, /* => */ "vwx"); TC(5, 0, /* => */ "wx"); TC(6, 0, /* => */ "x"); TC(7, 0, /* => */ ); TC(0, 2, /* => */ "bc"); TC(1, 2, /* => */ "cd"); TC(2, 2, /* => */ "d", "u"); TC(3, 2, /* => */ "uv"); TC(4, 2, /* => */ "vw"); TC(5, 2, /* => */ "wx"); TC(6, 2, /* => */ "x"); TC(7, 2, /* => */ ); return 0; }