62#include "lexleo_cmocka.h"
124 assert_ptr_equal(ret.
mem, dummy_mem_p);
233 size_t fail_call_idx;
237 out_expect_t out_expect;
238} test_dynamic_buffer_stream_create_stream_case_t;
258 const test_dynamic_buffer_stream_create_stream_case_t *tc;
259} test_dynamic_buffer_stream_create_stream_fixture_t;
269static int setup_dynamic_buffer_stream_create_stream(
void **state)
271 const test_dynamic_buffer_stream_create_stream_case_t *tc =
272 (
const test_dynamic_buffer_stream_create_stream_case_t *)(*state);
274 test_dynamic_buffer_stream_create_stream_fixture_t *fx =
275 (test_dynamic_buffer_stream_create_stream_fixture_t *)malloc(
sizeof(*fx));
283 && tc->fail_call_idx > 0) {
284 fake_memory_fail_only_on_call(tc->fail_call_idx);
291 fx->cfg.default_cap = 16;
301static int teardown_dynamic_buffer_stream_create_stream(
void **state)
303 test_dynamic_buffer_stream_create_stream_fixture_t *fx =
304 (test_dynamic_buffer_stream_create_stream_fixture_t *)(*state);
311 assert_true(fake_memory_no_leak());
312 assert_true(fake_memory_no_invalid_free());
313 assert_true(fake_memory_no_double_free());
327static void test_dynamic_buffer_stream_create_stream(
void **state)
329 test_dynamic_buffer_stream_create_stream_fixture_t *fx =
330 (test_dynamic_buffer_stream_create_stream_fixture_t *)(*state);
331 const test_dynamic_buffer_stream_create_stream_case_t *tc = fx->tc;
347 if (tc->out_expect == OUT_EXPECT_UNCHANGED && out_arg != NULL) {
348 fx->out = (
stream_t *)(uintptr_t)0xDEADC0DEu;
351 stream_t *out_arg_snapshot = fx->out;
357 assert_int_equal(ret, tc->expected_ret);
359 switch (tc->out_expect) {
360 case OUT_CHECK_NONE:
break;
361 case OUT_EXPECT_NULL: assert_null(fx->out);
break;
362 case OUT_EXPECT_NON_NULL: assert_non_null(fx->out);
break;
363 case OUT_EXPECT_UNCHANGED:
364 assert_ptr_equal(out_arg_snapshot, fx->out);
367 default: assert_true(
false);
371 assert_non_null(fx->out);
373 const char msg[] =
"hello";
374 size_t w =
stream_write(fx->out, msg,
sizeof(msg) - 1, &st);
375 assert_int_equal((
int)w, (
int)(
sizeof(msg) - 1));
386static const test_dynamic_buffer_stream_create_stream_case_t
387CASE_DYNAMIC_BUFFER_STREAM_CREATE_STREAM_OK = {
388 .name =
"dynamic_buffer_stream_create_stream_ok",
393 .out_expect = OUT_EXPECT_NON_NULL
396static const test_dynamic_buffer_stream_create_stream_case_t
397CASE_DYNAMIC_BUFFER_STREAM_CREATE_STREAM_OUT_NULL = {
398 .name =
"dynamic_buffer_stream_create_stream_out_null",
403 .out_expect = OUT_CHECK_NONE
406static const test_dynamic_buffer_stream_create_stream_case_t
407CASE_DYNAMIC_BUFFER_STREAM_CREATE_STREAM_CFG_NULL = {
408 .name =
"dynamic_buffer_stream_create_stream_cfg_null",
413 .out_expect = OUT_EXPECT_UNCHANGED
416static const test_dynamic_buffer_stream_create_stream_case_t
417CASE_DYNAMIC_BUFFER_STREAM_CREATE_STREAM_ENV_NULL = {
418 .name =
"dynamic_buffer_stream_create_stream_env_null",
423 .out_expect = OUT_EXPECT_UNCHANGED
426static const test_dynamic_buffer_stream_create_stream_case_t
427CASE_DYNAMIC_BUFFER_STREAM_CREATE_STREAM_OOM = {
428 .name =
"dynamic_buffer_stream_create_stream_oom",
433 .out_expect = OUT_EXPECT_UNCHANGED
440#define DYNAMIC_BUFFER_STREAM_CREATE_STREAM_CASES(X) \
441X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_STREAM_OK) \
442X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_STREAM_OUT_NULL) \
443X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_STREAM_CFG_NULL) \
444X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_STREAM_ENV_NULL) \
445X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_STREAM_OOM)
447#define DYNAMIC_BUFFER_STREAM_MAKE_CREATE_STREAM_TEST(case_sym) \
448LEXLEO_MAKE_TEST(dynamic_buffer_stream_create_stream, case_sym)
450static const struct CMUnitTest dynamic_buffer_stream_create_stream_tests[] = {
451 DYNAMIC_BUFFER_STREAM_CREATE_STREAM_CASES(
452 DYNAMIC_BUFFER_STREAM_MAKE_CREATE_STREAM_TEST)
455#undef DYNAMIC_BUFFER_STREAM_CREATE_STREAM_CASES
456#undef DYNAMIC_BUFFER_STREAM_MAKE_CREATE_STREAM_TEST
591 size_t fail_call_idx;
595 desc_expect_t desc_expect;
596} test_dynamic_buffer_stream_create_desc_case_t;
619 const test_dynamic_buffer_stream_create_desc_case_t *tc;
620} test_dynamic_buffer_stream_create_desc_fixture_t;
630static int setup_dynamic_buffer_stream_create_desc(
void **state)
632 const test_dynamic_buffer_stream_create_desc_case_t *tc =
633 (
const test_dynamic_buffer_stream_create_desc_case_t *)(*state);
635 test_dynamic_buffer_stream_create_desc_fixture_t *fx =
636 (test_dynamic_buffer_stream_create_desc_fixture_t *)malloc(
sizeof(*fx));
644 && tc->fail_call_idx > 0) {
645 fake_memory_fail_only_on_call(tc->fail_call_idx);
653 fx->key =
"dynamic_buffer";
655 fx->cfg.default_cap = 16u;
665static int teardown_dynamic_buffer_stream_create_desc(
void **state)
667 test_dynamic_buffer_stream_create_desc_fixture_t *fx =
668 (test_dynamic_buffer_stream_create_desc_fixture_t *)(*state);
670 if (fx->out.ud_dtor) fx->out.ud_dtor(fx->out.ud, fx->mem);
672 assert_true(fake_memory_no_leak());
673 assert_true(fake_memory_no_invalid_free());
674 assert_true(fake_memory_no_double_free());
688static void test_dynamic_buffer_stream_create_desc(
void **state)
690 test_dynamic_buffer_stream_create_desc_fixture_t *fx =
691 (test_dynamic_buffer_stream_create_desc_fixture_t *)(*state);
692 const test_dynamic_buffer_stream_create_desc_case_t *tc = fx->tc;
711 if (tc->desc_expect == DESC_EXPECT_EMPTY && out_arg != NULL) {
713 fx->out.ctor = (
void *)(uintptr_t)0xDEADC0DEu;
714 fx->out.ud = (
void *)(uintptr_t)0xDEADC0DEu;
715 fx->out.ud_dtor = (
void *)(uintptr_t)0xDEADC0DEu;
722 assert_int_equal(ret, tc->expected_ret);
724 if (tc->desc_expect == DESC_EXPECT_EMPTY) {
725 assert_null(fx->out.key);
726 assert_null(fx->out.ctor);
727 assert_null(fx->out.ud);
728 assert_null(fx->out.ud_dtor);
730 else if (tc->desc_expect == DESC_EXPECT_VALID) {
731 assert_true(fx->out.key != (
stream_key_t)(uintptr_t)0xDEADC0DEu);
732 assert_non_null(fx->out.key);
733 assert_true(*fx->out.key !=
'\0');
734 assert_true(fx->out.ctor != (
void *)(uintptr_t)0xDEADC0DEu);
735 assert_non_null(fx->out.ctor);
736 assert_true(fx->out.ud != (
void *)(uintptr_t)0xDEADC0DEu);
737 assert_non_null(fx->out.ud);
738 assert_true(fx->out.ud_dtor != (
void *)(uintptr_t)0xDEADC0DEu);
739 assert_non_null(fx->out.ud_dtor);
742 assert_true(tc->desc_expect == DESC_CHECK_NONE);
750static const test_dynamic_buffer_stream_create_desc_case_t
751CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_OK = {
752 .name =
"dynamic_buffer_stream_create_desc_ok",
757 .desc_expect = DESC_EXPECT_VALID
760static const test_dynamic_buffer_stream_create_desc_case_t
761CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_OUT_NULL = {
762 .name =
"dynamic_buffer_stream_create_desc_out_null",
767 .desc_expect = DESC_CHECK_NONE
770static const test_dynamic_buffer_stream_create_desc_case_t
771CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_KEY_NULL = {
772 .name =
"dynamic_buffer_stream_create_desc_key_null",
777 .desc_expect = DESC_EXPECT_EMPTY
780static const test_dynamic_buffer_stream_create_desc_case_t
781CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_KEY_EMPTY = {
782 .name =
"dynamic_buffer_stream_create_desc_key_empty",
787 .desc_expect = DESC_EXPECT_EMPTY
790static const test_dynamic_buffer_stream_create_desc_case_t
791CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_CFG_NULL = {
792 .name =
"dynamic_buffer_stream_create_desc_cfg_null",
797 .desc_expect = DESC_EXPECT_EMPTY
800static const test_dynamic_buffer_stream_create_desc_case_t
801CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_ENV_NULL = {
802 .name =
"dynamic_buffer_stream_create_desc_env_null",
807 .desc_expect = DESC_EXPECT_EMPTY
810static const test_dynamic_buffer_stream_create_desc_case_t
811CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_MEM_NULL = {
812 .name =
"dynamic_buffer_stream_create_desc_mem_null",
817 .desc_expect = DESC_EXPECT_EMPTY
820static const test_dynamic_buffer_stream_create_desc_case_t
821CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_OOM_1 = {
822 .name =
"dynamic_buffer_stream_create_desc_oom_1",
827 .desc_expect = DESC_EXPECT_EMPTY
834#define DYNAMIC_BUFFER_STREAM_CREATE_DESC_CASES(X) \
835X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_OK) \
836X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_OUT_NULL) \
837X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_KEY_NULL) \
838X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_KEY_EMPTY) \
839X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_CFG_NULL) \
840X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_ENV_NULL) \
841X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_MEM_NULL) \
842X(CASE_DYNAMIC_BUFFER_STREAM_CREATE_DESC_OOM_1)
844#define DYNAMIC_BUFFER_STREAM_MAKE_CREATE_DESC_TEST(case_sym) \
845LEXLEO_MAKE_TEST(dynamic_buffer_stream_create_desc, case_sym)
847static const struct CMUnitTest create_desc_dynamic_buffer_stream_tests[] = {
848 DYNAMIC_BUFFER_STREAM_CREATE_DESC_CASES(
849 DYNAMIC_BUFFER_STREAM_MAKE_CREATE_DESC_TEST)
852#undef DYNAMIC_BUFFER_STREAM_CREATE_DESC_CASES
853#undef DYNAMIC_BUFFER_STREAM_MAKE_CREATE_DESC_TEST
1007 size_t prefill_read_pos;
1009 size_t fail_call_idx;
1012 size_t expected_written;
1014 bool expect_cap_growth;
1015 bool expect_backend_unchanged;
1016} test_dynamic_buffer_stream_write_case_t;
1036 uint8_t payload[64];
1038 const test_dynamic_buffer_stream_write_case_t *tc;
1039} test_dynamic_buffer_stream_write_fixture_t;
1049static int setup_dynamic_buffer_stream_write(
void **state)
1051 const test_dynamic_buffer_stream_write_case_t *tc =
1052 (
const test_dynamic_buffer_stream_write_case_t *)(*state);
1054 test_dynamic_buffer_stream_write_fixture_t *fx =
1055 (test_dynamic_buffer_stream_write_fixture_t *)malloc(
sizeof(*fx));
1061 fake_memory_reset();
1067 fx->cfg.default_cap = tc->initial_cap;
1069 for (
size_t i = 0; i <
sizeof(fx->payload); ++i) {
1070 fx->payload[i] = (uint8_t)(
'A' + (i % 26));
1083 && tc->fail_call_idx > 0) {
1084 fake_memory_fail_only_on_call(tc->fail_call_idx);
1095static int teardown_dynamic_buffer_stream_write(
void **state)
1097 test_dynamic_buffer_stream_write_fixture_t *fx =
1098 (test_dynamic_buffer_stream_write_fixture_t *)(*state);
1105 assert_true(fake_memory_no_leak());
1106 assert_true(fake_memory_no_invalid_free());
1107 assert_true(fake_memory_no_double_free());
1125static void test_dynamic_buffer_stream_write(
void **state)
1127 test_dynamic_buffer_stream_write_fixture_t *fx =
1128 (test_dynamic_buffer_stream_write_fixture_t *)(*state);
1129 const test_dynamic_buffer_stream_write_case_t *tc = fx->tc;
1139 assert_non_null(dbs);
1142 assert_non_null(dbuf);
1153 assert_true(tc->prefill_len <= tc->initial_cap);
1154 if (tc->prefill_len > 0) {
1155 assert_non_null(dbuf->
buf);
1158 dbuf->
len = tc->prefill_len;
1159 dbuf->
read_pos = tc->prefill_read_pos;
1162 dbuf->
len = SIZE_MAX;
1163 dbuf->
read_pos = tc->prefill_read_pos;
1166 const void *buf_arg = fx->payload;
1167 size_t n_arg = tc->write_len;
1181 uint8_t before_bytes[64];
1182 const size_t snap_n =
1183 (dbuf->
len <
sizeof(before_bytes)) ? dbuf->
len :
sizeof(before_bytes);
1184 if (snap_n > 0 && dbuf->
buf) {
1188 const void *buf_snapshot = dbuf->
buf;
1189 const size_t len_snapshot = dbuf->
len;
1190 const size_t cap_snapshot = dbuf->
cap;
1191 const size_t read_pos_snapshot = dbuf->
read_pos;
1197 assert_int_equal((
int)written, (
int)tc->expected_written);
1198 assert_int_equal((
int)st, (
int)tc->expected_st);
1200 if (tc->expect_backend_unchanged) {
1201 assert_ptr_equal(dbuf->
buf, buf_snapshot);
1202 assert_int_equal((
int)dbuf->
len, (
int)len_snapshot);
1203 assert_int_equal((
int)dbuf->
cap, (
int)cap_snapshot);
1204 assert_int_equal((
int)dbuf->
read_pos, (
int)read_pos_snapshot);
1206 if (snap_n > 0 && dbuf->
buf) {
1207 assert_memory_equal(dbuf->
buf, before_bytes, snap_n);
1213 assert_int_equal((
int)dbuf->
read_pos, (
int)read_pos_snapshot);
1214 assert_int_equal((
int)dbuf->
len, (
int)(len_snapshot + tc->write_len));
1216 if (tc->expect_cap_growth) {
1217 assert_true(dbuf->
cap > cap_snapshot);
1220 assert_true(dbuf->
cap >= cap_snapshot);
1223 if (len_snapshot > 0) {
1224 assert_memory_equal(dbuf->
buf, before_bytes, snap_n);
1226 if (tc->write_len > 0) {
1227 assert_memory_equal(
1228 (uint8_t *)dbuf->
buf + len_snapshot,
1238static const test_dynamic_buffer_stream_write_case_t
1239CASE_DYNAMIC_BUFFER_STREAM_WRITE_OK_NO_GROW = {
1240 .name =
"dynamic_buffer_stream_write_ok_no_grow",
1244 .prefill_read_pos = 1u,
1246 .fail_call_idx = 0u,
1248 .expected_written = 5u,
1250 .expect_cap_growth =
false,
1251 .expect_backend_unchanged =
false
1254static const test_dynamic_buffer_stream_write_case_t
1255CASE_DYNAMIC_BUFFER_STREAM_WRITE_ZERO_LEN = {
1256 .name =
"dynamic_buffer_stream_write_zero_len",
1260 .prefill_read_pos = 1u,
1262 .fail_call_idx = 0u,
1264 .expected_written = 0u,
1266 .expect_cap_growth =
false,
1267 .expect_backend_unchanged =
true
1270static const test_dynamic_buffer_stream_write_case_t
1271CASE_DYNAMIC_BUFFER_STREAM_WRITE_BUF_NULL_ZERO_LEN = {
1272 .name =
"dynamic_buffer_stream_write_buf_null_zero_len",
1276 .prefill_read_pos = 1u,
1278 .fail_call_idx = 0u,
1280 .expected_written = 0u,
1282 .expect_cap_growth =
false,
1283 .expect_backend_unchanged =
true
1286static const test_dynamic_buffer_stream_write_case_t
1287CASE_DYNAMIC_BUFFER_STREAM_WRITE_OK_GROW = {
1288 .name =
"dynamic_buffer_stream_write_ok_grow",
1292 .prefill_read_pos = 2u,
1294 .fail_call_idx = 0u,
1296 .expected_written = 5u,
1298 .expect_cap_growth =
true,
1299 .expect_backend_unchanged =
false
1302static const test_dynamic_buffer_stream_write_case_t
1303CASE_DYNAMIC_BUFFER_STREAM_WRITE_BUF_NULL_NONZERO = {
1304 .name =
"dynamic_buffer_stream_write_buf_null_nonzero",
1308 .prefill_read_pos = 1u,
1310 .fail_call_idx = 0u,
1312 .expected_written = 0u,
1314 .expect_cap_growth =
false,
1315 .expect_backend_unchanged =
true
1318static const test_dynamic_buffer_stream_write_case_t
1319CASE_DYNAMIC_BUFFER_STREAM_WRITE_RESERVE_OOM = {
1320 .name =
"dynamic_buffer_stream_write_reserve_oom",
1324 .prefill_read_pos = 2u,
1326 .fail_call_idx = 1u,
1328 .expected_written = 0u,
1330 .expect_cap_growth =
false,
1331 .expect_backend_unchanged =
true
1334static const test_dynamic_buffer_stream_write_case_t
1335CASE_DYNAMIC_BUFFER_STREAM_WRITE_SIZE_OVERFLOW = {
1336 .name =
"dynamic_buffer_stream_write_size_overflow",
1340 .prefill_read_pos = 0u,
1342 .fail_call_idx = 0u,
1344 .expected_written = 0u,
1346 .expect_cap_growth =
false,
1347 .expect_backend_unchanged =
true
1354#define DYNAMIC_BUFFER_STREAM_WRITE_CASES(X) \
1355X(CASE_DYNAMIC_BUFFER_STREAM_WRITE_OK_NO_GROW) \
1356X(CASE_DYNAMIC_BUFFER_STREAM_WRITE_ZERO_LEN) \
1357X(CASE_DYNAMIC_BUFFER_STREAM_WRITE_BUF_NULL_ZERO_LEN) \
1358X(CASE_DYNAMIC_BUFFER_STREAM_WRITE_OK_GROW) \
1359X(CASE_DYNAMIC_BUFFER_STREAM_WRITE_BUF_NULL_NONZERO) \
1360X(CASE_DYNAMIC_BUFFER_STREAM_WRITE_RESERVE_OOM) \
1361X(CASE_DYNAMIC_BUFFER_STREAM_WRITE_SIZE_OVERFLOW)
1363#define DYNAMIC_BUFFER_STREAM_MAKE_WRITE_TEST(case_sym) \
1364LEXLEO_MAKE_TEST(dynamic_buffer_stream_write, case_sym)
1366static const struct CMUnitTest dynamic_buffer_stream_write_tests[] = {
1367 DYNAMIC_BUFFER_STREAM_WRITE_CASES(DYNAMIC_BUFFER_STREAM_MAKE_WRITE_TEST)
1370#undef DYNAMIC_BUFFER_STREAM_WRITE_CASES
1371#undef DYNAMIC_BUFFER_STREAM_MAKE_WRITE_TEST
1506 size_t prefill_read_pos;
1510 size_t expected_read;
1512 bool expect_backend_unchanged;
1513} test_dynamic_buffer_stream_read_case_t;
1534 uint8_t payload[64];
1535 uint8_t read_buf[64];
1537 const test_dynamic_buffer_stream_read_case_t *tc;
1538} test_dynamic_buffer_stream_read_fixture_t;
1548static int setup_dynamic_buffer_stream_read(
void **state)
1550 const test_dynamic_buffer_stream_read_case_t *tc =
1551 (
const test_dynamic_buffer_stream_read_case_t *)(*state);
1553 test_dynamic_buffer_stream_read_fixture_t *fx =
1554 (test_dynamic_buffer_stream_read_fixture_t *)malloc(
sizeof(*fx));
1560 fake_memory_reset();
1566 fx->cfg.default_cap = tc->initial_cap;
1568 for (
size_t i = 0; i <
sizeof(fx->payload); ++i) {
1569 fx->payload[i] = (uint8_t)(
'A' + (i % 26));
1571 for (
size_t i = 0; i <
sizeof(fx->read_buf); ++i) {
1572 fx->read_buf[i] = (uint8_t)0xCDu;
1589static int teardown_dynamic_buffer_stream_read(
void **state)
1591 test_dynamic_buffer_stream_read_fixture_t *fx =
1592 (test_dynamic_buffer_stream_read_fixture_t *)(*state);
1599 assert_true(fake_memory_no_leak());
1600 assert_true(fake_memory_no_invalid_free());
1601 assert_true(fake_memory_no_double_free());
1620static void test_dynamic_buffer_stream_read(
void **state)
1622 test_dynamic_buffer_stream_read_fixture_t *fx =
1623 (test_dynamic_buffer_stream_read_fixture_t *)(*state);
1624 const test_dynamic_buffer_stream_read_case_t *tc = fx->tc;
1634 assert_non_null(dbs);
1637 assert_non_null(dbuf);
1648 assert_true(tc->prefill_len <= dbuf->
cap);
1649 if (tc->prefill_len > 0) {
1650 assert_non_null(dbuf->
buf);
1653 dbuf->
len = tc->prefill_len;
1654 dbuf->
read_pos = tc->prefill_read_pos;
1656 void *buf_arg = fx->read_buf;
1657 size_t n_arg = tc->read_len;
1670 const size_t unread_before =
1672 const size_t expected_copy =
1673 (tc->read_len < unread_before) ? tc->read_len : unread_before;
1675 uint8_t before_bytes[64];
1676 const size_t snap_n =
1677 (dbuf->
len <
sizeof(before_bytes)) ? dbuf->
len :
sizeof(before_bytes);
1678 if (snap_n > 0 && dbuf->
buf) {
1682 uint8_t read_buf_snapshot[64];
1683 osal_memcpy(read_buf_snapshot, fx->read_buf,
sizeof(read_buf_snapshot));
1685 const void *buf_snapshot = dbuf->
buf;
1686 const size_t len_snapshot = dbuf->
len;
1687 const size_t cap_snapshot = dbuf->
cap;
1688 const size_t read_pos_snapshot = dbuf->
read_pos;
1694 assert_int_equal((
int)rd, (
int)tc->expected_read);
1695 assert_int_equal((
int)st, (
int)tc->expected_st);
1697 if (tc->expect_backend_unchanged) {
1698 assert_ptr_equal(dbuf->
buf, buf_snapshot);
1699 assert_int_equal((
int)dbuf->
len, (
int)len_snapshot);
1700 assert_int_equal((
int)dbuf->
cap, (
int)cap_snapshot);
1701 assert_int_equal((
int)dbuf->
read_pos, (
int)read_pos_snapshot);
1703 if (snap_n > 0 && dbuf->
buf) {
1704 assert_memory_equal(dbuf->
buf, before_bytes, snap_n);
1707 if (buf_arg != NULL) {
1708 assert_memory_equal(fx->read_buf, read_buf_snapshot,
sizeof(fx->read_buf));
1714 assert_ptr_equal(dbuf->
buf, buf_snapshot);
1715 assert_int_equal((
int)dbuf->
len, (
int)len_snapshot);
1716 assert_int_equal((
int)dbuf->
cap, (
int)cap_snapshot);
1717 assert_int_equal((
int)dbuf->
read_pos, (
int)(read_pos_snapshot + expected_copy));
1719 if (snap_n > 0 && dbuf->
buf) {
1720 assert_memory_equal(dbuf->
buf, before_bytes, snap_n);
1723 if (expected_copy > 0) {
1724 assert_memory_equal(
1726 fx->payload + read_pos_snapshot,
1729 if (expected_copy <
sizeof(fx->read_buf)) {
1730 assert_memory_equal(
1731 fx->read_buf + expected_copy,
1732 read_buf_snapshot + expected_copy,
1733 sizeof(fx->read_buf) - expected_copy);
1741static const test_dynamic_buffer_stream_read_case_t
1742CASE_DYNAMIC_BUFFER_STREAM_READ_OK_EXACT = {
1743 .name =
"dynamic_buffer_stream_read_ok_exact",
1747 .prefill_read_pos = 2u,
1750 .expected_read = 3u,
1752 .expect_backend_unchanged =
false
1755static const test_dynamic_buffer_stream_read_case_t
1756CASE_DYNAMIC_BUFFER_STREAM_READ_OK_CLAMP_TO_AVAILABLE = {
1757 .name =
"dynamic_buffer_stream_read_ok_clamp_to_available",
1761 .prefill_read_pos = 6u,
1764 .expected_read = 2u,
1766 .expect_backend_unchanged =
false
1769static const test_dynamic_buffer_stream_read_case_t
1770CASE_DYNAMIC_BUFFER_STREAM_READ_ZERO_LEN = {
1771 .name =
"dynamic_buffer_stream_read_zero_len",
1775 .prefill_read_pos = 2u,
1778 .expected_read = 0u,
1780 .expect_backend_unchanged =
true
1783static const test_dynamic_buffer_stream_read_case_t
1784CASE_DYNAMIC_BUFFER_STREAM_READ_BUF_NULL_ZERO_LEN = {
1785 .name =
"dynamic_buffer_stream_read_buf_null_zero_len",
1789 .prefill_read_pos = 2u,
1792 .expected_read = 0u,
1794 .expect_backend_unchanged =
true
1797static const test_dynamic_buffer_stream_read_case_t
1798CASE_DYNAMIC_BUFFER_STREAM_READ_BUF_NULL_NONZERO = {
1799 .name =
"dynamic_buffer_stream_read_buf_null_nonzero",
1803 .prefill_read_pos = 2u,
1806 .expected_read = 0u,
1808 .expect_backend_unchanged =
true
1811static const test_dynamic_buffer_stream_read_case_t
1812CASE_DYNAMIC_BUFFER_STREAM_READ_EOF = {
1813 .name =
"dynamic_buffer_stream_read_eof",
1817 .prefill_read_pos = 8u,
1820 .expected_read = 0u,
1822 .expect_backend_unchanged =
true
1829#define DYNAMIC_BUFFER_STREAM_READ_CASES(X) \
1830X(CASE_DYNAMIC_BUFFER_STREAM_READ_OK_EXACT) \
1831X(CASE_DYNAMIC_BUFFER_STREAM_READ_OK_CLAMP_TO_AVAILABLE) \
1832X(CASE_DYNAMIC_BUFFER_STREAM_READ_ZERO_LEN) \
1833X(CASE_DYNAMIC_BUFFER_STREAM_READ_BUF_NULL_ZERO_LEN) \
1834X(CASE_DYNAMIC_BUFFER_STREAM_READ_BUF_NULL_NONZERO) \
1835X(CASE_DYNAMIC_BUFFER_STREAM_READ_EOF)
1837#define DYNAMIC_BUFFER_STREAM_MAKE_READ_TEST(case_sym) \
1838LEXLEO_MAKE_TEST(dynamic_buffer_stream_read, case_sym)
1840static const struct CMUnitTest dynamic_buffer_stream_read_tests[] = {
1841 DYNAMIC_BUFFER_STREAM_READ_CASES(DYNAMIC_BUFFER_STREAM_MAKE_READ_TEST)
1844#undef DYNAMIC_BUFFER_STREAM_READ_CASES
1845#undef DYNAMIC_BUFFER_STREAM_MAKE_READ_TEST
1892 assert_non_null(dbs);
1895 assert_non_null(dbuf);
1896 assert_non_null(dbuf->
buf);
1902 char before_bytes[5];
1905 const void *buf_snapshot = dbuf->
buf;
1906 const size_t len_snapshot = dbuf->
len;
1907 const size_t cap_snapshot = dbuf->
cap;
1908 const size_t read_pos_snapshot = dbuf->
read_pos;
1912 assert_ptr_equal(dbuf->
buf, buf_snapshot);
1913 assert_int_equal((
int)dbuf->
len, (
int)len_snapshot);
1914 assert_int_equal((
int)dbuf->
cap, (
int)cap_snapshot);
1915 assert_int_equal((
int)dbuf->
read_pos, (
int)read_pos_snapshot);
1916 assert_memory_equal(dbuf->
buf, before_bytes,
sizeof(before_bytes));
1921 assert_true(fake_memory_no_leak());
1922 assert_true(fake_memory_no_invalid_free());
1923 assert_true(fake_memory_no_double_free());
1950 fake_memory_reset();
1972 assert_non_null(dbs);
1975 assert_non_null(dbuf);
1976 assert_non_null(dbuf->
buf);
1992 assert_true(fake_memory_no_leak());
1993 assert_true(fake_memory_no_invalid_free());
1994 assert_true(fake_memory_no_double_free());
2004 static const struct CMUnitTest dynamic_buffer_stream_stream_non_parametric_tests[] = {
2012 failed += cmocka_run_group_tests(dynamic_buffer_stream_stream_non_parametric_tests, NULL, NULL);
2013 failed += cmocka_run_group_tests(dynamic_buffer_stream_create_stream_tests, NULL, NULL);
2014 failed += cmocka_run_group_tests(create_desc_dynamic_buffer_stream_tests, NULL, NULL);
2015 failed += cmocka_run_group_tests(dynamic_buffer_stream_write_tests, NULL, NULL);
2016 failed += cmocka_run_group_tests(dynamic_buffer_stream_read_tests, NULL, NULL);
Composition Root API for the dynamic_buffer_stream adapter.
stream_status_t dynamic_buffer_stream_create_desc(stream_adapter_desc_t *out, stream_key_t key, const dynamic_buffer_stream_cfg_t *cfg, const dynamic_buffer_stream_env_t *env, const osal_mem_ops_t *mem)
Build a stream adapter descriptor for the dynamic_buffer_stream adapter.
stream_status_t dynamic_buffer_stream_create_stream(stream_t **out, const dynamic_buffer_stream_cfg_t *cfg, const dynamic_buffer_stream_env_t *env)
Create a dynamic_buffer_stream instance directly.
dynamic_buffer_stream_cfg_t dynamic_buffer_stream_default_cfg(void)
Return the default configuration for the dynamic_buffer_stream adapter.
dynamic_buffer_stream_env_t dynamic_buffer_stream_default_env(const osal_mem_ops_t *mem, const stream_env_t *port_env)
Return the default injected environment for the dynamic_buffer_stream adapter.
Private backend handle definition for the dynamic_buffer_stream adapter.
void * osal_memset(void *s, int c, size_t n)
void * osal_memcpy(void *dest, const void *src, 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.
Private stream handle definition for the stream port.
const char * stream_key_t
Public identifier type for a registered stream adapter.
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.
Configuration type for the dynamic_buffer_stream adapter.
size_t default_cap
Default initial capacity of the internal dynamic buffer.
Injected dependencies for the dynamic_buffer_stream adapter.
const osal_mem_ops_t * mem
Borrowed memory operations table for adapter-owned allocations.
stream_env_t port_env
Borrowed stream port environment.
Private backend handle for the dynamic_buffer_stream adapter.
dynamic_buffer_stream_state_t state
Private dynamic buffer state used by the dynamic_buffer_stream backend.
Public descriptor used to register a concrete stream adapter.
Runtime environment for the stream port.
Private handle structure for a stream_t.
static void test_dynamic_buffer_stream_close(void **state)
Test dynamic_buffer_stream_close().
dynamic_buffer_stream_write_scenario_t
Scenarios for dynamic_buffer_stream_write().
@ DYNAMIC_BUFFER_STREAM_WRITE_SCENARIO_RESERVE_OOM
@ DYNAMIC_BUFFER_STREAM_WRITE_SCENARIO_ZERO_LEN
@ DYNAMIC_BUFFER_STREAM_WRITE_SCENARIO_SIZE_OVERFLOW
@ DYNAMIC_BUFFER_STREAM_WRITE_SCENARIO_BUF_NULL_ZERO_LEN
@ DYNAMIC_BUFFER_STREAM_WRITE_SCENARIO_OK_NO_GROW
@ DYNAMIC_BUFFER_STREAM_WRITE_SCENARIO_BUF_NULL_NONZERO
@ DYNAMIC_BUFFER_STREAM_WRITE_SCENARIO_OK_GROW
static void test_dynamic_buffer_stream_flush(void **state)
Test dynamic_buffer_stream_flush().
static void test_dynamic_buffer_stream_default_env(void **state)
Test dynamic_buffer_stream_default_env().
dynamic_buffer_stream_read_scenario_t
Scenarios for dynamic_buffer_stream_read().
@ DYNAMIC_BUFFER_STREAM_READ_SCENARIO_BUF_NULL_NONZERO
@ DYNAMIC_BUFFER_STREAM_READ_SCENARIO_BUF_NULL_ZERO_LEN
@ DYNAMIC_BUFFER_STREAM_READ_SCENARIO_OK_CLAMP_TO_AVAILABLE
@ DYNAMIC_BUFFER_STREAM_READ_SCENARIO_OK_EXACT
@ DYNAMIC_BUFFER_STREAM_READ_SCENARIO_ZERO_LEN
@ DYNAMIC_BUFFER_STREAM_READ_SCENARIO_EOF
dynamic_buffer_stream_create_desc_scenario_t
Scenarios for dynamic_buffer_stream_create_desc().
@ DYNAMIC_BUFFER_STREAM_CREATE_DESC_SCENARIO_MEM_NULL
@ DYNAMIC_BUFFER_STREAM_CREATE_DESC_SCENARIO_KEY_NULL
@ DYNAMIC_BUFFER_STREAM_CREATE_DESC_SCENARIO_ENV_NULL
@ DYNAMIC_BUFFER_STREAM_CREATE_DESC_SCENARIO_OUT_NULL
@ DYNAMIC_BUFFER_STREAM_CREATE_DESC_SCENARIO_OK
@ DYNAMIC_BUFFER_STREAM_CREATE_DESC_SCENARIO_OOM
@ DYNAMIC_BUFFER_STREAM_CREATE_DESC_SCENARIO_KEY_EMPTY
@ DYNAMIC_BUFFER_STREAM_CREATE_DESC_SCENARIO_CFG_NULL
static void test_dynamic_buffer_stream_default_cfg(void **state)
Test dynamic_buffer_stream_default_cfg().
dynamic_buffer_stream_create_stream_scenario_t
Scenarios for dynamic_buffer_stream_create_stream().
@ DYNAMIC_BUFFER_STREAM_CREATE_STREAM_SCENARIO_CFG_NULL
@ DYNAMIC_BUFFER_STREAM_CREATE_STREAM_SCENARIO_OUT_NULL
@ DYNAMIC_BUFFER_STREAM_CREATE_STREAM_SCENARIO_OOM
@ DYNAMIC_BUFFER_STREAM_CREATE_STREAM_SCENARIO_ENV_NULL
@ DYNAMIC_BUFFER_STREAM_CREATE_STREAM_SCENARIO_OK