42#include "lexleo_cmocka.h"
65typedef struct fake_stream_backend_t {
74 const void *last_write_buf;
88} fake_stream_backend_t;
95static void fake_stream_backend_reset(fake_stream_backend_t *b) {
103 b->last_read_buf = NULL;
104 b->last_write_buf = NULL;
105 b->last_read_n = (size_t)-1;
106 b->last_write_n = (size_t)-1;
107 b->last_backend = NULL;
108 b->last_read_st = NULL;
109 b->last_write_st = NULL;
114 b->read_ret = (size_t)-1;
115 b->write_ret = (size_t)-1;
129static size_t fake_stream_read(
135 fake_stream_backend_t *b = (fake_stream_backend_t *)backend;
140 b->last_backend = backend;
141 b->last_read_buf = buf;
143 b->last_read_st = st;
145 if (st) *st = b->read_st_to_set;
158static size_t fake_stream_write(
164 fake_stream_backend_t *b = (fake_stream_backend_t *)backend;
169 b->last_backend = backend;
170 b->last_write_buf = buf;
172 b->last_write_st = st;
174 if (st) *st = b->write_st_to_set;
187 fake_stream_backend_t *b = (fake_stream_backend_t *)backend;
192 b->last_backend = backend;
210 fake_stream_backend_t *b = (fake_stream_backend_t *)backend;
214 b->last_backend = backend;
228 .
read = fake_stream_read,
229 .write = fake_stream_write,
230 .flush = fake_stream_flush,
231 .close = fake_stream_close
254 assert_non_null(ret);
255 assert_non_null(ret->
read);
256 assert_non_null(ret->
write);
257 assert_non_null(ret->
flush);
286 assert_ptr_equal(ret.
mem, dummy_p);
443 size_t fail_call_idx;
446 out_expect_t out_expect;
447} test_stream_lifecycle_case_t;
465 fake_stream_backend_t backend;
467 const test_stream_lifecycle_case_t *tc;
468} test_stream_lifecycle_fixture_t;
477static int setup_stream_lifecycle(
void **state)
479 const test_stream_lifecycle_case_t *tc =
480 (
const test_stream_lifecycle_case_t *)(*state);
482 test_stream_lifecycle_fixture_t *fx =
483 (test_stream_lifecycle_fixture_t *)malloc(
sizeof(*fx));
491 fake_memory_fail_only_on_call(tc->fail_call_idx);
507static int teardown_stream_lifecycle(
void **state)
509 test_stream_lifecycle_fixture_t *fx =
510 (test_stream_lifecycle_fixture_t *)(*state);
516 assert_true(fake_memory_no_leak());
517 assert_true(fake_memory_no_invalid_free());
518 assert_true(fake_memory_no_double_free());
531static void test_stream_lifecycle(
void **state)
533 test_stream_lifecycle_fixture_t *fx =
534 (test_stream_lifecycle_fixture_t *)(*state);
535 const test_stream_lifecycle_case_t *tc = fx->tc;
543 void *backend_arg = &fx->backend;
552 vtbl_local = fake_stream_vtbl;
553 vtbl_local.
read = NULL;
554 vtbl_arg = &vtbl_local;
558 if (tc->out_expect == OUT_EXPECT_UNCHANGED && out_arg != NULL) {
559 fx->out = (
stream_t *)(uintptr_t)0xDEADC0DEu;
562 stream_t *out_arg_snapshot = fx->out;
565 ret =
stream_create(out_arg, vtbl_arg, backend_arg, env_arg);
568 assert_non_null(fx->out);
571 assert_null(fx->out);
574 assert_null(fx->out);
578 assert_int_equal(ret, tc->expected_ret);
580 switch (tc->out_expect) {
581 case OUT_CHECK_NONE:
break;
582 case OUT_EXPECT_NULL: assert_null(fx->out);
break;
583 case OUT_EXPECT_NON_NULL: assert_non_null(fx->out);
break;
584 case OUT_EXPECT_UNCHANGED:
585 assert_ptr_equal(out_arg_snapshot, fx->out);
596static const test_stream_lifecycle_case_t CASE_STREAM_LIFECYCLE_OUT_NULL = {
597 .name =
"stream_lifecycle_out_null",
602 .out_expect = OUT_CHECK_NONE
605static const test_stream_lifecycle_case_t CASE_STREAM_LIFECYCLE_VTBL_NULL = {
606 .name =
"stream_lifecycle_vtbl_null",
611 .out_expect = OUT_EXPECT_UNCHANGED
614static const test_stream_lifecycle_case_t CASE_STREAM_LIFECYCLE_ENV_NULL = {
615 .name =
"stream_lifecycle_env_null",
620 .out_expect = OUT_EXPECT_UNCHANGED
623static const test_stream_lifecycle_case_t CASE_STREAM_LIFECYCLE_ENV_MEM_NULL = {
624 .name =
"stream_lifecycle_env_mem_null",
629 .out_expect = OUT_EXPECT_UNCHANGED
632static const test_stream_lifecycle_case_t CASE_STREAM_LIFECYCLE_OOM = {
633 .name =
"stream_lifecycle_oom",
638 .out_expect = OUT_EXPECT_UNCHANGED
641static const test_stream_lifecycle_case_t CASE_STREAM_LIFECYCLE_DESTROY_IDEMPOTENT = {
642 .name =
"stream_lifecycle_destroy_idempotent",
647 .out_expect = OUT_EXPECT_NULL
650static const test_stream_lifecycle_case_t CASE_STREAM_LIFECYCLE_OK = {
651 .name =
"stream_lifecycle_ok",
656 .out_expect = OUT_EXPECT_NON_NULL
659static const test_stream_lifecycle_case_t CASE_STREAM_LIFECYCLE_VTBL_READ_NULL = {
660 .name =
"stream_lifecycle_vtbl_read_null",
665 .out_expect = OUT_EXPECT_UNCHANGED
672#define STREAM_LIFECYCLE_CASES(X) \
673X(CASE_STREAM_LIFECYCLE_OUT_NULL) \
674X(CASE_STREAM_LIFECYCLE_VTBL_NULL) \
675X(CASE_STREAM_LIFECYCLE_ENV_NULL) \
676X(CASE_STREAM_LIFECYCLE_ENV_MEM_NULL) \
677X(CASE_STREAM_LIFECYCLE_OOM) \
678X(CASE_STREAM_LIFECYCLE_DESTROY_IDEMPOTENT) \
679X(CASE_STREAM_LIFECYCLE_OK) \
680X(CASE_STREAM_LIFECYCLE_VTBL_READ_NULL)
682#define STREAM_MAKE_LIFECYCLE_TEST(case_sym) \
683LEXLEO_MAKE_TEST(stream_lifecycle, case_sym)
685static const struct CMUnitTest stream_lifecycle_tests[] = {
686 STREAM_LIFECYCLE_CASES(STREAM_MAKE_LIFECYCLE_TEST)
689#undef STREAM_LIFECYCLE_CASES
690#undef STREAM_MAKE_LIFECYCLE_TEST
832} test_stream_read_case_t;
848 fake_stream_backend_t fake_backend;
851 const test_stream_read_case_t *tc;
852} test_stream_read_fixture_t;
861static int setup_stream_read(
void **state) {
862 const test_stream_read_case_t *tc = (
const test_stream_read_case_t *) *state;
863 test_stream_read_fixture_t *fx = (test_stream_read_fixture_t *)malloc(
sizeof(*fx));
875 stream_create(&fx->stream, &fake_stream_vtbl, &fx->fake_backend, &fx->stream_env),
880 stream_create(&fx->stream_no_backend, &fake_stream_vtbl, NULL, &fx->stream_env),
891static int teardown_stream_read(
void **state) {
892 test_stream_read_fixture_t *fx = (test_stream_read_fixture_t *)*state;
898 assert_true(fake_memory_no_leak());
899 assert_true(fake_memory_no_invalid_free());
900 assert_true(fake_memory_no_double_free());
914static void test_stream_read(
void **state) {
915 test_stream_read_fixture_t *fx = (test_stream_read_fixture_t *)*state;
918 size_t ret = (size_t)-1;
920 void *buf_arg = fx->buf;
927 fake_stream_backend_reset(&fx->fake_backend);
929 switch (fx->tc->scenario) {
939 fx->fake_backend.read_ret = n_arg;
943 fx->fake_backend.read_ret = 0;
947 fx->fake_backend.read_ret = 5;
957 switch (fx->tc->scenario) {
959 assert_int_equal((
int)ret, 0);
961 assert_int_equal(fx->fake_backend.read_called, 0);
964 assert_int_equal((
int)ret, 0);
965 assert_int_equal(fx->fake_backend.read_called, 0);
968 assert_int_equal((
int)ret, 0);
970 assert_int_equal(fx->fake_backend.read_called, 0);
973 assert_int_equal((
int)ret, 0);
974 assert_int_equal(fx->fake_backend.read_called, 0);
977 assert_int_equal((
int)ret, 0);
979 assert_int_equal(fx->fake_backend.read_called, 0);
982 assert_int_equal((
int)ret, 0);
983 assert_int_equal(fx->fake_backend.read_called, 0);
986 assert_int_equal((
int)ret, 0);
988 assert_int_equal(fx->fake_backend.read_called, 0);
991 assert_int_equal((
int)ret, 0);
992 assert_int_equal(fx->fake_backend.read_called, 0);
995 assert_int_equal((
int)ret, (
int)fx->fake_backend.read_ret);
997 assert_int_equal(fx->fake_backend.read_called, 1);
998 assert_ptr_equal(fx->fake_backend.last_backend, &fx->fake_backend);
999 assert_ptr_equal(fx->fake_backend.last_read_buf, buf_arg);
1000 assert_int_equal((
int)fx->fake_backend.last_read_n, (
int)n_arg);
1001 assert_ptr_equal(fx->fake_backend.last_read_st, st_arg);
1004 assert_int_equal((
int)ret, (
int)fx->fake_backend.read_ret);
1006 assert_int_equal(fx->fake_backend.read_called, 1);
1007 assert_ptr_equal(fx->fake_backend.last_backend, &fx->fake_backend);
1008 assert_ptr_equal(fx->fake_backend.last_read_buf, buf_arg);
1009 assert_int_equal((
int)fx->fake_backend.last_read_n, (
int)n_arg);
1010 assert_ptr_equal(fx->fake_backend.last_read_st, st_arg);
1013 assert_int_equal((
int)ret, (
int)fx->fake_backend.read_ret);
1014 assert_int_equal(fx->fake_backend.read_called, 1);
1015 assert_ptr_equal(fx->fake_backend.last_backend, &fx->fake_backend);
1016 assert_ptr_equal(fx->fake_backend.last_read_buf, buf_arg);
1017 assert_int_equal((
int)fx->fake_backend.last_read_n, (
int)n_arg);
1018 assert_ptr_equal(fx->fake_backend.last_read_st, NULL);
1023 assert_int_equal(fx->fake_backend.write_called, 0);
1024 assert_int_equal(fx->fake_backend.flush_called, 0);
1025 assert_int_equal(fx->fake_backend.close_called, 0);
1032static const test_stream_read_case_t CASE_STREAM_READ_N_ZERO = {
1033 .name =
"stream_read_n_zero",
1037static const test_stream_read_case_t CASE_STREAM_READ_N_ZERO_ST_NULL = {
1038 .name =
"stream_read_n_zero_st_null",
1042static const test_stream_read_case_t CASE_STREAM_READ_S_NULL = {
1043 .name =
"stream_read_s_null",
1047static const test_stream_read_case_t CASE_STREAM_READ_S_NULL_ST_NULL = {
1048 .name =
"stream_read_s_null_st_null",
1052static const test_stream_read_case_t CASE_STREAM_READ_BUF_NULL = {
1053 .name =
"stream_read_buf_null",
1057static const test_stream_read_case_t CASE_STREAM_READ_BUF_NULL_ST_NULL = {
1058 .name =
"stream_read_buf_null_st_null",
1062static const test_stream_read_case_t CASE_STREAM_READ_BACKEND_NULL = {
1063 .name =
"stream_read_backend_null",
1067static const test_stream_read_case_t CASE_STREAM_READ_BACKEND_NULL_ST_NULL = {
1068 .name =
"stream_read_backend_null_st_null",
1072static const test_stream_read_case_t CASE_STREAM_READ_NOMINAL_OK = {
1073 .name =
"stream_read_nominal_ok",
1077static const test_stream_read_case_t CASE_STREAM_READ_NOMINAL_EOF = {
1078 .name =
"stream_read_nominal_eof",
1082static const test_stream_read_case_t CASE_STREAM_READ_NOMINAL_ST_NULL = {
1083 .name =
"stream_read_nominal_st_null",
1091#define STREAM_READ_CASES(X) \
1092X(CASE_STREAM_READ_N_ZERO) \
1093X(CASE_STREAM_READ_N_ZERO_ST_NULL) \
1094X(CASE_STREAM_READ_S_NULL) \
1095X(CASE_STREAM_READ_S_NULL_ST_NULL) \
1096X(CASE_STREAM_READ_BUF_NULL) \
1097X(CASE_STREAM_READ_BUF_NULL_ST_NULL) \
1098X(CASE_STREAM_READ_BACKEND_NULL) \
1099X(CASE_STREAM_READ_BACKEND_NULL_ST_NULL) \
1100X(CASE_STREAM_READ_NOMINAL_OK) \
1101X(CASE_STREAM_READ_NOMINAL_EOF) \
1102X(CASE_STREAM_READ_NOMINAL_ST_NULL)
1104#define STREAM_MAKE_STREAM_READ_TEST(case_sym) \
1105LEXLEO_MAKE_TEST(stream_read, case_sym)
1107static const struct CMUnitTest stream_read_tests[] = {
1108 STREAM_READ_CASES(STREAM_MAKE_STREAM_READ_TEST)
1111#undef STREAM_READ_CASES
1112#undef STREAM_MAKE_STREAM_READ_TEST
1252} test_stream_write_case_t;
1268 fake_stream_backend_t fake_backend;
1271 const test_stream_write_case_t *tc;
1272} test_stream_write_fixture_t;
1281static int setup_stream_write(
void **state) {
1282 const test_stream_write_case_t *tc = (
const test_stream_write_case_t *) *state;
1283 test_stream_write_fixture_t *fx = (test_stream_write_fixture_t *)malloc(
sizeof(*fx));
1288 fake_memory_reset();
1295 stream_create(&fx->stream, &fake_stream_vtbl, &fx->fake_backend, &fx->stream_env),
1300 stream_create(&fx->stream_no_backend, &fake_stream_vtbl, NULL, &fx->stream_env),
1311static int teardown_stream_write(
void **state) {
1312 test_stream_write_fixture_t *fx = (test_stream_write_fixture_t *)*state;
1318 assert_true(fake_memory_no_leak());
1319 assert_true(fake_memory_no_invalid_free());
1320 assert_true(fake_memory_no_double_free());
1334static void test_stream_write(
void **state) {
1335 test_stream_write_fixture_t *fx = (test_stream_write_fixture_t *)*state;
1338 size_t ret = (size_t)-1;
1340 const void *buf_arg = fx->buf;
1347 fake_stream_backend_reset(&fx->fake_backend);
1349 switch (fx->tc->scenario) {
1359 fx->fake_backend.write_ret = n_arg;
1363 fx->fake_backend.write_ret = 0;
1367 fx->fake_backend.write_ret = 5;
1377 switch (fx->tc->scenario) {
1379 assert_int_equal((
int)ret, 0);
1381 assert_int_equal(fx->fake_backend.write_called, 0);
1384 assert_int_equal((
int)ret, 0);
1385 assert_int_equal(fx->fake_backend.write_called, 0);
1388 assert_int_equal((
int)ret, 0);
1390 assert_int_equal(fx->fake_backend.write_called, 0);
1393 assert_int_equal((
int)ret, 0);
1394 assert_int_equal(fx->fake_backend.write_called, 0);
1397 assert_int_equal((
int)ret, 0);
1399 assert_int_equal(fx->fake_backend.write_called, 0);
1402 assert_int_equal((
int)ret, 0);
1403 assert_int_equal(fx->fake_backend.write_called, 0);
1406 assert_int_equal((
int)ret, 0);
1408 assert_int_equal(fx->fake_backend.write_called, 0);
1411 assert_int_equal((
int)ret, 0);
1412 assert_int_equal(fx->fake_backend.write_called, 0);
1415 assert_int_equal((
int)ret, (
int)fx->fake_backend.write_ret);
1417 assert_int_equal(fx->fake_backend.write_called, 1);
1418 assert_ptr_equal(fx->fake_backend.last_backend, &fx->fake_backend);
1419 assert_ptr_equal(fx->fake_backend.last_write_buf, buf_arg);
1420 assert_int_equal((
int)fx->fake_backend.last_write_n, (
int)n_arg);
1421 assert_ptr_equal(fx->fake_backend.last_write_st, st_arg);
1424 assert_int_equal((
int)ret, (
int)fx->fake_backend.write_ret);
1426 assert_int_equal(fx->fake_backend.write_called, 1);
1427 assert_ptr_equal(fx->fake_backend.last_backend, &fx->fake_backend);
1428 assert_ptr_equal(fx->fake_backend.last_write_buf, buf_arg);
1429 assert_int_equal((
int)fx->fake_backend.last_write_n, (
int)n_arg);
1430 assert_ptr_equal(fx->fake_backend.last_write_st, st_arg);
1433 assert_int_equal((
int)ret, (
int)fx->fake_backend.write_ret);
1434 assert_int_equal(fx->fake_backend.write_called, 1);
1435 assert_ptr_equal(fx->fake_backend.last_backend, &fx->fake_backend);
1436 assert_ptr_equal(fx->fake_backend.last_write_buf, buf_arg);
1437 assert_int_equal((
int)fx->fake_backend.last_write_n, (
int)n_arg);
1438 assert_ptr_equal(fx->fake_backend.last_write_st, NULL);
1443 assert_int_equal(fx->fake_backend.read_called, 0);
1444 assert_int_equal(fx->fake_backend.flush_called, 0);
1445 assert_int_equal(fx->fake_backend.close_called, 0);
1452static const test_stream_write_case_t CASE_STREAM_WRITE_N_ZERO = {
1453 .name =
"stream_write_n_zero",
1457static const test_stream_write_case_t CASE_STREAM_WRITE_N_ZERO_ST_NULL = {
1458 .name =
"stream_write_n_zero_st_null",
1462static const test_stream_write_case_t CASE_STREAM_WRITE_S_NULL = {
1463 .name =
"stream_write_s_null",
1467static const test_stream_write_case_t CASE_STREAM_WRITE_S_NULL_ST_NULL = {
1468 .name =
"stream_write_s_null_st_null",
1472static const test_stream_write_case_t CASE_STREAM_WRITE_BUF_NULL = {
1473 .name =
"stream_write_buf_null",
1477static const test_stream_write_case_t CASE_STREAM_WRITE_BUF_NULL_ST_NULL = {
1478 .name =
"stream_write_buf_null_st_null",
1482static const test_stream_write_case_t CASE_STREAM_WRITE_BACKEND_NULL = {
1483 .name =
"stream_write_backend_null",
1487static const test_stream_write_case_t CASE_STREAM_WRITE_BACKEND_NULL_ST_NULL = {
1488 .name =
"stream_write_backend_null_st_null",
1492static const test_stream_write_case_t CASE_STREAM_WRITE_NOMINAL_OK = {
1493 .name =
"stream_write_nominal_ok",
1497static const test_stream_write_case_t CASE_STREAM_WRITE_NOMINAL_IO_ERROR = {
1498 .name =
"stream_write_nominal_io_error",
1502static const test_stream_write_case_t CASE_STREAM_WRITE_NOMINAL_ST_NULL = {
1503 .name =
"stream_write_nominal_st_null",
1511#define STREAM_WRITE_CASES(X) \
1512X(CASE_STREAM_WRITE_N_ZERO) \
1513X(CASE_STREAM_WRITE_N_ZERO_ST_NULL) \
1514X(CASE_STREAM_WRITE_S_NULL) \
1515X(CASE_STREAM_WRITE_S_NULL_ST_NULL) \
1516X(CASE_STREAM_WRITE_BUF_NULL) \
1517X(CASE_STREAM_WRITE_BUF_NULL_ST_NULL) \
1518X(CASE_STREAM_WRITE_BACKEND_NULL) \
1519X(CASE_STREAM_WRITE_BACKEND_NULL_ST_NULL) \
1520X(CASE_STREAM_WRITE_NOMINAL_OK) \
1521X(CASE_STREAM_WRITE_NOMINAL_IO_ERROR) \
1522X(CASE_STREAM_WRITE_NOMINAL_ST_NULL)
1524#define STREAM_MAKE_STREAM_WRITE_TEST(case_sym) \
1525LEXLEO_MAKE_TEST(stream_write, case_sym)
1527static const struct CMUnitTest stream_write_tests[] = {
1528 STREAM_WRITE_CASES(STREAM_MAKE_STREAM_WRITE_TEST)
1531#undef STREAM_WRITE_CASES
1532#undef STREAM_MAKE_STREAM_WRITE_TEST
1605} test_stream_flush_case_t;
1620 fake_stream_backend_t backend;
1621 const test_stream_flush_case_t *tc;
1622} test_stream_flush_fixture_t;
1631static int setup_stream_flush(
void **state)
1633 const test_stream_flush_case_t *tc = (
const test_stream_flush_case_t *)(*state);
1635 test_stream_flush_fixture_t *fx = (test_stream_flush_fixture_t *)malloc(
sizeof(*fx));
1641 fake_memory_reset();
1645 fake_stream_backend_reset(&fx->backend);
1649 stream_create(&fx->stream, &fake_stream_vtbl, &fx->backend, &fx->env),
1654 stream_create(&fx->stream_no_backend, &fake_stream_vtbl, NULL, &fx->env),
1665static int teardown_stream_flush(
void **state)
1667 test_stream_flush_fixture_t *fx = (test_stream_flush_fixture_t *)(*state);
1673 assert_true(fake_memory_no_leak());
1674 assert_true(fake_memory_no_invalid_free());
1675 assert_true(fake_memory_no_double_free());
1688static void test_stream_flush(
void **state)
1690 test_stream_flush_fixture_t *fx = (test_stream_flush_fixture_t *)*state;
1694 fake_stream_backend_reset(&fx->backend);
1696 switch (fx->tc->scenario) {
1701 s_arg = fx->stream_no_backend;
1715 switch (fx->tc->scenario) {
1718 assert_int_equal(fx->backend.flush_called, 0);
1722 assert_int_equal(fx->backend.flush_called, 0);
1726 assert_int_equal(fx->backend.flush_called, 1);
1727 assert_ptr_equal(fx->backend.last_backend, &fx->backend);
1731 assert_int_equal(fx->backend.flush_called, 1);
1732 assert_ptr_equal(fx->backend.last_backend, &fx->backend);
1738 assert_int_equal(fx->backend.read_called, 0);
1739 assert_int_equal(fx->backend.write_called, 0);
1740 assert_int_equal(fx->backend.close_called, 0);
1747static const test_stream_flush_case_t CASE_STREAM_FLUSH_S_NULL = {
1748 .name =
"stream_flush_s_null",
1752static const test_stream_flush_case_t CASE_STREAM_FLUSH_BACKEND_NULL = {
1753 .name =
"stream_flush_backend_null",
1757static const test_stream_flush_case_t CASE_STREAM_FLUSH_NOMINAL_OK = {
1758 .name =
"stream_flush_nominal_ok",
1762static const test_stream_flush_case_t CASE_STREAM_FLUSH_NOMINAL_IO_ERROR = {
1763 .name =
"stream_flush_nominal_io_error",
1771#define STREAM_FLUSH_CASES(X) \
1772X(CASE_STREAM_FLUSH_S_NULL) \
1773X(CASE_STREAM_FLUSH_BACKEND_NULL) \
1774X(CASE_STREAM_FLUSH_NOMINAL_OK) \
1775X(CASE_STREAM_FLUSH_NOMINAL_IO_ERROR)
1777#define STREAM_MAKE_STREAM_FLUSH_TEST(case_sym) \
1778LEXLEO_MAKE_TEST(stream_flush, case_sym)
1780static const struct CMUnitTest stream_flush_tests[] = {
1781 STREAM_FLUSH_CASES(STREAM_MAKE_STREAM_FLUSH_TEST)
1784#undef STREAM_FLUSH_CASES
1785#undef STREAM_MAKE_STREAM_FLUSH_TEST
1792 static const struct CMUnitTest stream_tests[] = {
1798 failed += cmocka_run_group_tests(stream_tests, NULL, NULL);
1799 failed += cmocka_run_group_tests(stream_lifecycle_tests, NULL, NULL);
1800 failed += cmocka_run_group_tests(stream_read_tests, NULL, NULL);
1801 failed += cmocka_run_group_tests(stream_write_tests, NULL, NULL);
1802 failed += cmocka_run_group_tests(stream_flush_tests, NULL, NULL);
void * osal_memset(void *s, int c, size_t n)
const osal_mem_ops_t * osal_mem_test_fake_ops(void)
Borrower-facing runtime operations for the stream port.
stream_status_t stream_flush(stream_t *s)
Flush a stream.
size_t stream_write(stream_t *s, const void *buf, size_t n, stream_status_t *st)
Write bytes to a stream.
size_t stream_read(stream_t *s, void *buf, size_t n, stream_status_t *st)
Read bytes from a stream.
Adapter-side API for constructing and binding stream_t objects.
stream_status_t stream_create(stream_t **out, const stream_vtbl_t *vtbl, void *backend, const stream_env_t *env)
Create a generic stream handle from adapter-provided backend bindings.
Composition Root helpers for the stream port.
const stream_ops_t * stream_default_ops(void)
Return the default borrower-facing ops table for the stream port.
stream_env_t stream_default_env(const osal_mem_ops_t *mem_ops)
Build a default stream_env_t from injected memory operations.
Lifecycle services for stream_t handles.
void stream_destroy(stream_t **s)
Destroy a stream handle.
stream_status_t
Public status codes used by the stream port.
@ STREAM_STATUS_NO_BACKEND
Runtime environment for the stream port.
const osal_mem_ops_t * mem
Memory operations used by the stream port.
Borrower-facing operation table for the stream port.
stream_status_t(* flush)(stream_t *s)
Flush a stream.
size_t(* read)(stream_t *s, void *buf, size_t n, stream_status_t *st)
Read bytes from a stream.
size_t(* write)(stream_t *s, const void *buf, size_t n, stream_status_t *st)
Write bytes to a stream.
Private handle structure for a stream_t.
Adapter dispatch table bound to a stream_t instance.
stream_lifecycle_scenario_t
Scenarios for stream_create() / stream_destroy().
@ STREAM_LIFECYCLE_SCENARIO_VTBL_NULL
@ STREAM_LIFECYCLE_SCENARIO_OOM
@ STREAM_LIFECYCLE_SCENARIO_ENV_MEM_NULL
@ STREAM_LIFECYCLE_SCENARIO_ENV_NULL
@ STREAM_LIFECYCLE_SCENARIO_OUT_NULL
@ STREAM_LIFECYCLE_SCENARIO_DESTROY_IDEMPOTENT
@ STREAM_LIFECYCLE_SCENARIO_VTBL_READ_NULL
@ STREAM_LIFECYCLE_SCENARIO_OK
stream_flush_scenario_t
Scenarios for stream_flush().
@ STREAM_FLUSH_SCENARIO_NOMINAL_IO_ERROR
@ STREAM_FLUSH_SCENARIO_BACKEND_NULL
@ STREAM_FLUSH_SCENARIO_S_NULL
@ STREAM_FLUSH_SCENARIO_NOMINAL_OK
static void test_stream_default_ops(void **state)
Test stream_default_ops().
static void test_stream_default_env(void **state)
Test stream_default_env().
stream_write_scenario_t
Scenarios for stream_write().
@ STREAM_WRITE_SCENARIO_NOMINAL_IO_ERROR
@ STREAM_WRITE_SCENARIO_N_ZERO
@ STREAM_WRITE_SCENARIO_BUF_NULL
@ STREAM_WRITE_SCENARIO_NOMINAL_ST_NULL
@ STREAM_WRITE_SCENARIO_S_NULL
@ STREAM_WRITE_SCENARIO_S_NULL_ST_NULL
@ STREAM_WRITE_SCENARIO_NOMINAL_OK
@ STREAM_WRITE_SCENARIO_BUF_NULL_ST_NULL
@ STREAM_WRITE_SCENARIO_N_ZERO_ST_NULL
@ STREAM_WRITE_SCENARIO_BACKEND_NULL
@ STREAM_WRITE_SCENARIO_BACKEND_NULL_ST_NULL
stream_read_scenario_t
Scenarios for stream_read().
@ STREAM_READ_SCENARIO_NOMINAL_ST_NULL
@ STREAM_READ_SCENARIO_BUF_NULL
@ STREAM_READ_SCENARIO_BACKEND_NULL
@ STREAM_READ_SCENARIO_S_NULL
@ STREAM_READ_SCENARIO_N_ZERO_ST_NULL
@ STREAM_READ_SCENARIO_BACKEND_NULL_ST_NULL
@ STREAM_READ_SCENARIO_N_ZERO
@ STREAM_READ_SCENARIO_NOMINAL_EOF
@ STREAM_READ_SCENARIO_S_NULL_ST_NULL
@ STREAM_READ_SCENARIO_NOMINAL_OK
@ STREAM_READ_SCENARIO_BUF_NULL_ST_NULL