52#include "lexleo_cmocka.h"
236 out_expect_t out_expect;
237} test_stream_fact_create_fs_case_t;
270 const test_stream_fact_create_fs_case_t *tc;
271} test_stream_fact_create_fs_fixture_t;
293static int setup_stream_fact_create_fs(
void **state)
295 const test_stream_fact_create_fs_case_t *tc =
296 (
const test_stream_fact_create_fs_case_t *)(*state);
298 test_stream_fact_create_fs_fixture_t *fx =
299 (test_stream_fact_create_fs_fixture_t *)malloc(
sizeof(*fx));
308 fake_file_set_backing(fx->backing,
sizeof(fx->backing), 0);
309 fake_file_set_pos(0);
310 fake_file_fail_disable();
313 fake_file_fail_enable(FAKE_FILE_OP_OPEN, 1, tc->open_fail_status);
322 fx->fs_stream_cfg.reserved = 0;
323 fx->stream_factory_cfg.fact_cap = 8;
330 &fx->stream_factory_cfg,
340 fx->stream_env.mem );
349 fx->args.path =
"crazy_injection.txt";
351 fx->args.autoclose =
true;
365static int teardown_stream_fact_create_fs(
void **state)
367 test_stream_fact_create_fs_fixture_t *fx =
368 (test_stream_fact_create_fs_fixture_t *)(*state);
397static void test_stream_fact_create_fs(
void **state)
399 test_stream_fact_create_fs_fixture_t *fx =
400 (test_stream_fact_create_fs_fixture_t *)(*state);
401 const test_stream_fact_create_fs_case_t *tc = fx->tc;
424 if (tc->out_expect == OUT_EXPECT_UNCHANGED && out_arg != NULL) {
425 fx->out = (
stream_t *)(uintptr_t)0xDEADC0DEu;
428 stream_t *out_arg_snapshot = fx->out;
434 assert_int_equal(ret, tc->expected_ret);
436 switch (tc->out_expect) {
437 case OUT_CHECK_NONE:
break;
438 case OUT_EXPECT_NULL: assert_null(fx->out);
break;
439 case OUT_EXPECT_NON_NULL: assert_non_null(fx->out);
break;
440 case OUT_EXPECT_UNCHANGED:
441 assert_ptr_equal(out_arg_snapshot, fx->out);
448 assert_non_null(fx->out);
449 const char msg[] =
"hello";
450 size_t w =
stream_write(fx->out, msg,
sizeof(msg) - 1, &st);
451 assert_int_equal((
int)w, (
int)(
sizeof(msg) - 1));
453 assert_int_equal(fake_file_backing_len(),
sizeof(msg) - 1);
454 assert_memory_equal(fx->backing, msg,
sizeof(msg) - 1);
463static const test_stream_fact_create_fs_case_t CASE_STREAM_FACT_CREATE_FS_OK = {
464 .name =
"fs_stream_fact_create_stream_ok",
468 .out_expect = OUT_EXPECT_NON_NULL
471static const test_stream_fact_create_fs_case_t CASE_STREAM_FACT_CREATE_FS_ARGS_NULL = {
472 .name =
"fs_stream_fact_create_stream_args_null",
476 .out_expect = OUT_EXPECT_UNCHANGED
479static const test_stream_fact_create_fs_case_t CASE_STREAM_FACT_CREATE_FS_OUT_NULL = {
480 .name =
"fs_stream_fact_create_stream_out_null",
484 .out_expect = OUT_CHECK_NONE
487static const test_stream_fact_create_fs_case_t CASE_STREAM_FACT_CREATE_FS_PATH_NULL = {
488 .name =
"fs_stream_fact_create_stream_path_null",
492 .out_expect = OUT_EXPECT_UNCHANGED
495static const test_stream_fact_create_fs_case_t CASE_STREAM_FACT_CREATE_FS_PATH_EMPTY = {
496 .name =
"fs_stream_fact_create_stream_path_empty",
500 .out_expect = OUT_EXPECT_UNCHANGED
503static const test_stream_fact_create_fs_case_t CASE_STREAM_FACT_CREATE_FS_FLAGS_ZERO = {
504 .name =
"fs_stream_fact_create_stream_flags_zero",
508 .out_expect = OUT_EXPECT_UNCHANGED
511static const test_stream_fact_create_fs_case_t CASE_STREAM_FACT_CREATE_FS_OPEN_FAIL = {
512 .name =
"fs_stream_fact_create_stream_open_fail",
516 .out_expect = OUT_EXPECT_UNCHANGED
519static const test_stream_fact_create_fs_case_t CASE_STREAM_FACT_CREATE_FS_FACTORY_NULL = {
520 .name =
"fs_stream_fact_create_stream_factory_null",
524 .out_expect = OUT_EXPECT_UNCHANGED
527static const test_stream_fact_create_fs_case_t CASE_STREAM_FACT_CREATE_FS_KEY_NULL = {
528 .name =
"fs_stream_fact_create_stream_key_null",
532 .out_expect = OUT_EXPECT_UNCHANGED
535static const test_stream_fact_create_fs_case_t CASE_STREAM_FACT_CREATE_FS_KEY_EMPTY = {
536 .name =
"fs_stream_fact_create_stream_key_empty",
540 .out_expect = OUT_EXPECT_UNCHANGED
543static const test_stream_fact_create_fs_case_t CASE_STREAM_FACT_CREATE_FS_KEY_UNKNOWN = {
544 .name =
"fs_stream_fact_create_stream_key_unknown",
548 .out_expect = OUT_EXPECT_UNCHANGED
555#define STREAM_FACT_CREATE_FS_CASES(X) \
556X(CASE_STREAM_FACT_CREATE_FS_OK) \
557X(CASE_STREAM_FACT_CREATE_FS_ARGS_NULL) \
558X(CASE_STREAM_FACT_CREATE_FS_OUT_NULL) \
559X(CASE_STREAM_FACT_CREATE_FS_PATH_NULL) \
560X(CASE_STREAM_FACT_CREATE_FS_PATH_EMPTY) \
561X(CASE_STREAM_FACT_CREATE_FS_FLAGS_ZERO) \
562X(CASE_STREAM_FACT_CREATE_FS_OPEN_FAIL) \
563X(CASE_STREAM_FACT_CREATE_FS_FACTORY_NULL) \
564X(CASE_STREAM_FACT_CREATE_FS_KEY_NULL) \
565X(CASE_STREAM_FACT_CREATE_FS_KEY_EMPTY) \
566X(CASE_STREAM_FACT_CREATE_FS_KEY_UNKNOWN)
568#define STREAM_MAKE_FACT_CREATE_FS_TEST(case_sym) \
569LEXLEO_MAKE_TEST(stream_fact_create_fs, case_sym)
571static const struct CMUnitTest fact_create_fs_tests[] = {
572 STREAM_FACT_CREATE_FS_CASES(STREAM_MAKE_FACT_CREATE_FS_TEST)
575#undef STREAM_FACT_CREATE_FS_CASES
576#undef STREAM_MAKE_FACT_CREATE_FS_TEST
584 failed += cmocka_run_group_tests(fact_create_fs_tests, NULL, NULL);
Composition Root API for wiring the fs_stream adapter into the stream factory.
stream_status_t fs_stream_create_desc(stream_adapter_desc_t *out, stream_key_t key, const fs_stream_cfg_t *cfg, const fs_stream_env_t *env, const osal_mem_ops_t *mem)
Build an adapter descriptor for registering fs_stream in a factory.
stream_fact_create_fs_scenario_t
Scenarios for stream_factory_create_stream() / fs_stream integration.
@ STREAM_FACT_CREATE_FS_SCENARIO_FLAGS_ZERO
@ STREAM_FACT_CREATE_FS_SCENARIO_PATH_NULL
@ STREAM_FACT_CREATE_FS_SCENARIO_KEY_EMPTY
@ STREAM_FACT_CREATE_FS_SCENARIO_OUT_NULL
@ STREAM_FACT_CREATE_FS_SCENARIO_KEY_UNKNOWN
@ STREAM_FACT_CREATE_FS_SCENARIO_ARGS_NULL
@ STREAM_FACT_CREATE_FS_SCENARIO_FACTORY_NULL
@ STREAM_FACT_CREATE_FS_SCENARIO_OPEN_FAIL
@ STREAM_FACT_CREATE_FS_SCENARIO_KEY_NULL
@ STREAM_FACT_CREATE_FS_SCENARIO_OK
@ STREAM_FACT_CREATE_FS_SCENARIO_PATH_EMPTY
const osal_file_ops_t * osal_file_test_fake_ops(void)
void * osal_memset(void *s, int c, size_t n)
const osal_mem_ops_t * osal_mem_default_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.
Composition Root factory API for the stream port.
stream_status_t stream_create_factory(stream_factory_t **out, const stream_factory_cfg_t *cfg, const stream_env_t *env)
Create a stream factory.
stream_status_t stream_factory_add_adapter(stream_factory_t *fact, const stream_adapter_desc_t *desc)
Register an adapter descriptor into a stream factory.
stream_status_t stream_factory_create_stream(const stream_factory_t *f, stream_key_t key, const void *args, stream_t **out)
Create a stream from a registered adapter key.
void stream_destroy_factory(stream_factory_t **fact)
Destroy a stream factory.
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.
@ STREAM_STATUS_NOT_FOUND
Arguments provided when creating a file-backed stream.
const char * path
UTF-8 path of the target file.
Configuration type for the fs_stream adapter.
Injected dependencies for the fs_stream adapter.
Public descriptor used to register a concrete stream adapter.
Runtime environment for the stream port.
Configuration for stream_factory_t.
Private handle structure for a stream_factory_t.
Private handle structure for a stream_t.