43#include "lexleo_cmocka.h"
51#define TEST_STREAM_SENTINEL_1 ((stream_t *)0x1111)
52#define TEST_STREAM_SENTINEL_2 ((stream_t *)0x2222)
72 *out = TEST_STREAM_SENTINEL_1;
94 *out = TEST_STREAM_SENTINEL_2;
280 out_expect_t out_expect;
281} test_stream_fact_lifecycle_case_t;
301 const test_stream_fact_lifecycle_case_t *tc;
302} test_stream_fact_lifecycle_fixture_t;
312static int setup_stream_fact_lifecycle(
void **state)
314 const test_stream_fact_lifecycle_case_t *tc =
315 (
const test_stream_fact_lifecycle_case_t *)(*state);
317 test_stream_fact_lifecycle_fixture_t *fx =
318 (test_stream_fact_lifecycle_fixture_t *)malloc(
sizeof(*fx));
324 fx->stream_factory_cfg.fact_cap = 8;
336static int teardown_stream_fact_lifecycle(
void **state)
338 test_stream_fact_lifecycle_fixture_t *fx =
339 (test_stream_fact_lifecycle_fixture_t *)(*state);
358static void test_stream_fact_lifecycle(
void **state)
360 test_stream_fact_lifecycle_fixture_t *fx =
361 (test_stream_fact_lifecycle_fixture_t *)(*state);
362 const test_stream_fact_lifecycle_case_t *tc = fx->tc;
372 bool use_mem_ops_copy =
false;
380 mem_ops = *fx->stream_env.mem;
381 use_mem_ops_copy =
true;
385 mem_ops = *fx->stream_env.mem;
386 use_mem_ops_copy =
true;
390 if (use_mem_ops_copy) {
395 if (tc->out_expect == OUT_EXPECT_UNCHANGED && out_arg != NULL) {
405 assert_non_null(fx->out);
408 assert_null(fx->out);
411 assert_null(fx->out);
415 assert_int_equal(ret, tc->expected_ret);
417 switch (tc->out_expect) {
418 case OUT_CHECK_NONE:
break;
419 case OUT_EXPECT_NULL: assert_null(fx->out);
break;
420 case OUT_EXPECT_NON_NULL: assert_non_null(fx->out);
break;
421 case OUT_EXPECT_UNCHANGED:
422 assert_ptr_equal(out_arg_snapshot, fx->out);
433static const test_stream_fact_lifecycle_case_t CASE_STREAM_FACT_LIFECYCLE_OK = {
434 .name =
"stream_fact_lifecycle_ok",
438 .out_expect = OUT_EXPECT_NON_NULL
441static const test_stream_fact_lifecycle_case_t CASE_STREAM_FACT_LIFECYCLE_OUT_NULL = {
442 .name =
"stream_fact_lifecycle_out_null",
446 .out_expect = OUT_CHECK_NONE
449static const test_stream_fact_lifecycle_case_t CASE_STREAM_FACT_LIFECYCLE_CFG_NULL = {
450 .name =
"stream_fact_lifecycle_cfg_null",
454 .out_expect = OUT_EXPECT_UNCHANGED
457static const test_stream_fact_lifecycle_case_t CASE_STREAM_FACT_LIFECYCLE_ENV_NULL = {
458 .name =
"stream_fact_lifecycle_env_null",
462 .out_expect = OUT_EXPECT_UNCHANGED
465static const test_stream_fact_lifecycle_case_t CASE_STREAM_FACT_LIFECYCLE_ENV_MEM_NULL = {
466 .name =
"stream_fact_lifecycle_env_mem_null",
470 .out_expect = OUT_EXPECT_UNCHANGED
473static const test_stream_fact_lifecycle_case_t CASE_STREAM_FACT_LIFECYCLE_ENV_MEM_CALLOC_NULL = {
474 .name =
"stream_fact_lifecycle_env_mem_calloc_null",
478 .out_expect = OUT_EXPECT_UNCHANGED
481static const test_stream_fact_lifecycle_case_t CASE_STREAM_FACT_LIFECYCLE_ENV_MEM_FREE_NULL = {
482 .name =
"stream_fact_lifecycle_env_mem_free_null",
486 .out_expect = OUT_EXPECT_UNCHANGED
489static const test_stream_fact_lifecycle_case_t CASE_STREAM_FACT_LIFECYCLE_DESTROY_IDEMPOTENT = {
490 .name =
"stream_fact_lifecycle_destroy_idempotent",
494 .out_expect = OUT_EXPECT_NULL
501#define STREAM_FACT_LIFECYCLE_CASES(X) \
502X(CASE_STREAM_FACT_LIFECYCLE_OK) \
503X(CASE_STREAM_FACT_LIFECYCLE_OUT_NULL) \
504X(CASE_STREAM_FACT_LIFECYCLE_CFG_NULL) \
505X(CASE_STREAM_FACT_LIFECYCLE_ENV_NULL) \
506X(CASE_STREAM_FACT_LIFECYCLE_ENV_MEM_NULL) \
507X(CASE_STREAM_FACT_LIFECYCLE_ENV_MEM_CALLOC_NULL) \
508X(CASE_STREAM_FACT_LIFECYCLE_ENV_MEM_FREE_NULL) \
509X(CASE_STREAM_FACT_LIFECYCLE_DESTROY_IDEMPOTENT)
511#define STREAM_MAKE_FACT_LIFECYCLE_TEST(case_sym) \
512LEXLEO_MAKE_TEST(stream_fact_lifecycle, case_sym)
514static const struct CMUnitTest fact_lifecycle_tests[] = {
515 STREAM_FACT_LIFECYCLE_CASES(STREAM_MAKE_FACT_LIFECYCLE_TEST)
518#undef STREAM_FACT_LIFECYCLE_CASES
519#undef STREAM_MAKE_FACT_LIFECYCLE_TEST
650 bool check_resolution;
653} test_stream_fact_add_adapter_case_t;
686 const test_stream_fact_add_adapter_case_t *tc;
687} test_stream_fact_add_adapter_fixture_t;
697static int setup_stream_fact_add_adapter(
void **state)
699 const test_stream_fact_add_adapter_case_t *tc =
700 (
const test_stream_fact_add_adapter_case_t *)(*state);
702 test_stream_fact_add_adapter_fixture_t *fx =
703 (test_stream_fact_add_adapter_fixture_t *)malloc(
sizeof(*fx));
719 fx->desc = make_test_desc(
"key_1", test_stream_ctor_1);
720 fx->other_desc = make_test_desc(
"key_2", test_stream_ctor_2);
729static int teardown_stream_fact_add_adapter(
void **state)
731 test_stream_fact_add_adapter_fixture_t *fx =
732 (test_stream_fact_add_adapter_fixture_t *)(*state);
750static void test_stream_fact_add_adapter(
void **state)
752 test_stream_fact_add_adapter_fixture_t *fx =
753 (test_stream_fact_add_adapter_fixture_t *)(*state);
754 const test_stream_fact_add_adapter_case_t *tc = fx->tc;
767 fx->other_desc.key = fx->desc.key;
768 desc_arg = &fx->other_desc;
769 resolution_key = fx->desc.
key;
784 desc_arg = &fx->other_desc;
785 resolution_key = fx->other_desc.
key;
792 assert_int_equal(ret, tc->expected_ret);
793 if (tc->check_resolution) {
794 assert_null(fx->created_stream);
799 (
void*)&fx->dummy_args,
800 &fx->created_stream ),
801 tc->expected_create_ret );
804 tc->expected_created_stream );
812static const test_stream_fact_add_adapter_case_t CASE_STREAM_FACT_ADD_ADAPTER_FACT_NULL = {
813 .name =
"stream_fact_add_adapter_fact_null",
817 .check_resolution =
false,
820static const test_stream_fact_add_adapter_case_t CASE_STREAM_FACT_ADD_ADAPTER_DESC_NULL = {
821 .name =
"stream_fact_add_adapter_desc_null",
825 .check_resolution =
false,
828static const test_stream_fact_add_adapter_case_t CASE_STREAM_FACT_ADD_ADAPTER_KEY_NULL = {
829 .name =
"stream_fact_add_adapter_key_null",
833 .check_resolution =
false,
836static const test_stream_fact_add_adapter_case_t CASE_STREAM_FACT_ADD_ADAPTER_KEY_EMPTY = {
837 .name =
"stream_fact_add_adapter_key_empty",
841 .check_resolution =
false,
844static const test_stream_fact_add_adapter_case_t CASE_STREAM_FACT_ADD_ADAPTER_CTOR_NULL = {
845 .name =
"stream_fact_add_adapter_ctor_null",
849 .check_resolution =
false,
852static const test_stream_fact_add_adapter_case_t CASE_STREAM_FACT_ADD_ADAPTER_DUPLICATE_KEY = {
853 .name =
"stream_fact_add_adapter_duplicate_key",
857 .check_resolution =
true,
859 .expected_created_stream = TEST_STREAM_SENTINEL_1,
862static const test_stream_fact_add_adapter_case_t CASE_STREAM_FACT_ADD_ADAPTER_CAP_REACHED = {
863 .name =
"stream_fact_add_adapter_cap_reached",
867 .check_resolution =
true,
869 .expected_created_stream = NULL,
872static const test_stream_fact_add_adapter_case_t CASE_STREAM_FACT_ADD_ADAPTER_OK = {
873 .name =
"stream_fact_add_adapter_ok",
877 .check_resolution =
true,
879 .expected_created_stream = TEST_STREAM_SENTINEL_1,
886#define STREAM_FACT_ADD_ADAPTER_CASES(X) \
887X(CASE_STREAM_FACT_ADD_ADAPTER_FACT_NULL) \
888X(CASE_STREAM_FACT_ADD_ADAPTER_DESC_NULL) \
889X(CASE_STREAM_FACT_ADD_ADAPTER_KEY_NULL) \
890X(CASE_STREAM_FACT_ADD_ADAPTER_KEY_EMPTY) \
891X(CASE_STREAM_FACT_ADD_ADAPTER_CTOR_NULL) \
892X(CASE_STREAM_FACT_ADD_ADAPTER_DUPLICATE_KEY) \
893X(CASE_STREAM_FACT_ADD_ADAPTER_CAP_REACHED) \
894X(CASE_STREAM_FACT_ADD_ADAPTER_OK)
896#define STREAM_MAKE_STREAM_FACT_ADD_ADAPTER_TEST(case_sym) \
897LEXLEO_MAKE_TEST(stream_fact_add_adapter, case_sym)
899static const struct CMUnitTest stream_fact_add_adapter_tests[] = {
900 STREAM_FACT_ADD_ADAPTER_CASES(STREAM_MAKE_STREAM_FACT_ADD_ADAPTER_TEST)
903#undef STREAM_FACT_ADD_ADAPTER_CASES
904#undef STREAM_MAKE_STREAM_FACT_ADD_ADAPTER_TEST
912 failed += cmocka_run_group_tests(fact_lifecycle_tests, NULL, NULL);
913 failed += cmocka_run_group_tests(stream_fact_add_adapter_tests, NULL, NULL);
stream_fact_lifecycle_scenario_t
Scenarios for stream_create_factory() / stream_destroy_factory().
@ STREAM_FACT_LIFECYCLE_SCENARIO_ENV_MEM_NULL
@ STREAM_FACT_LIFECYCLE_SCENARIO_ENV_MEM_CALLOC_NULL
@ STREAM_FACT_LIFECYCLE_SCENARIO_DESTROY_IDEMPOTENT
@ STREAM_FACT_LIFECYCLE_SCENARIO_ENV_NULL
@ STREAM_FACT_LIFECYCLE_SCENARIO_OUT_NULL
@ STREAM_FACT_LIFECYCLE_SCENARIO_ENV_MEM_FREE_NULL
@ STREAM_FACT_LIFECYCLE_SCENARIO_CFG_NULL
@ STREAM_FACT_LIFECYCLE_SCENARIO_OK
stream_fact_add_adapter_scenario_t
Scenarios for stream_factory_add_adapter().
@ STREAM_FACT_ADD_ADAPTER_SCENARIO_KEY_EMPTY
@ STREAM_FACT_ADD_ADAPTER_SCENARIO_KEY_NULL
@ STREAM_FACT_ADD_ADAPTER_SCENARIO_DUPLICATE_KEY
@ STREAM_FACT_ADD_ADAPTER_SCENARIO_CTOR_NULL
@ STREAM_FACT_ADD_ADAPTER_SCENARIO_DESC_NULL
@ STREAM_FACT_ADD_ADAPTER_SCENARIO_FACT_NULL
@ STREAM_FACT_ADD_ADAPTER_SCENARIO_CAP_REACHED
@ STREAM_FACT_ADD_ADAPTER_SCENARIO_OK
void * osal_memset(void *s, int c, size_t n)
const osal_mem_ops_t * osal_mem_default_ops(void)
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.
stream_status_t(* stream_ctor_fn_t)(const void *ud, const void *args, stream_t **out)
Adapter constructor contract used by stream factory services.
const char * stream_key_t
Public identifier type for a registered stream adapter.
stream_status_t
Public status codes used by the stream port.
@ STREAM_STATUS_NOT_FOUND
@ STREAM_STATUS_ALREADY_EXISTS
void *(* calloc)(size_t nmemb, size_t size)
Public descriptor used to register a concrete stream adapter.
stream_key_t key
Public key used to identify the adapter.
const void * ud
Optional opaque user data bound to the constructor.
ud_dtor_fn_t ud_dtor
Optional destructor for ud.
stream_ctor_fn_t ctor
Adapter constructor used to create a stream_t.
Runtime environment for the stream port.
const osal_mem_ops_t * mem
Memory operations used by the stream port.
Configuration for stream_factory_t.
Private handle structure for a stream_factory_t.
Private handle structure for a stream_t.