44#include "lexleo_cmocka.h"
120 assert_ptr_equal(ret.
stream, dummy_stream_p);
121 assert_ptr_equal(ret.
time_ops, dummy_time_ops);
122 assert_ptr_equal(ret.
adapter_mem, dummy_adapter_mem_p);
208 size_t fail_call_idx;
212 out_expect_t out_expect;
213} test_logger_default_create_logger_case_t;
226 const test_logger_default_create_logger_case_t *tc;
227} test_logger_default_create_logger_fixture_t;
233static int setup_logger_default_create_logger(
void **state)
235 const test_logger_default_create_logger_case_t *tc =
236 (
const test_logger_default_create_logger_case_t *)(*state);
238 test_logger_default_create_logger_fixture_t *fx = malloc(
sizeof(*fx));
245 fx->cfg.append_newline =
true;
255 fx->env.stream = fx->fake_stream;
263 fake_memory_fail_only_on_call(tc->fail_call_idx);
271static int teardown_logger_default_create_logger(
void **state)
273 test_logger_default_create_logger_fixture_t *fx =
274 (test_logger_default_create_logger_fixture_t *)(*state);
283 assert_true(fake_memory_no_leak());
284 assert_true(fake_memory_no_invalid_free());
285 assert_true(fake_memory_no_double_free());
296static void test_logger_default_create_logger(
void **state)
298 test_logger_default_create_logger_fixture_t *fx =
299 (test_logger_default_create_logger_fixture_t *)(*state);
300 const test_logger_default_create_logger_case_t *tc = fx->tc;
315 if (tc->out_expect == OUT_EXPECT_UNCHANGED && out_arg != NULL) {
316 fx->out = (
logger_t *)(uintptr_t)0xDEADC0DEu;
319 logger_t *out_arg_snapshot = fx->out;
325 assert_int_equal(ret, tc->expected_ret);
327 switch (tc->out_expect) {
328 case OUT_CHECK_NONE:
break;
329 case OUT_EXPECT_NULL: assert_null(fx->out);
break;
330 case OUT_EXPECT_NON_NULL: assert_non_null(fx->out);
break;
331 case OUT_EXPECT_UNCHANGED:
332 assert_ptr_equal(out_arg_snapshot, fx->out);
335 default: assert_true(
false);
339 assert_non_null(fx->out);
347static const test_logger_default_create_logger_case_t CASE_LOGGER_DEFAULT_CREATE_LOGGER_OUT_NULL = {
348 .name =
"logger_default_create_logger_out_null",
353 .out_expect = OUT_CHECK_NONE
356static const test_logger_default_create_logger_case_t CASE_LOGGER_DEFAULT_CREATE_LOGGER_CFG_NULL = {
357 .name =
"logger_default_create_logger_cfg_null",
362 .out_expect = OUT_EXPECT_UNCHANGED
365static const test_logger_default_create_logger_case_t CASE_LOGGER_DEFAULT_CREATE_LOGGER_ENV_NULL = {
366 .name =
"logger_default_create_logger_env_null",
371 .out_expect = OUT_EXPECT_UNCHANGED
374static const test_logger_default_create_logger_case_t CASE_LOGGER_DEFAULT_CREATE_LOGGER_OOM_1 = {
375 .name =
"logger_default_create_logger_oom_1",
380 .out_expect = OUT_EXPECT_UNCHANGED
383static const test_logger_default_create_logger_case_t CASE_LOGGER_DEFAULT_CREATE_LOGGER_OOM_2 = {
384 .name =
"logger_default_create_logger_oom_2",
389 .out_expect = OUT_EXPECT_UNCHANGED
392static const test_logger_default_create_logger_case_t CASE_LOGGER_DEFAULT_CREATE_LOGGER_OK = {
393 .name =
"logger_default_create_logger_ok",
398 .out_expect = OUT_EXPECT_NON_NULL
405#define LOGGER_DEFAULT_CREATE_LOGGER_CASES(X) \
406X(CASE_LOGGER_DEFAULT_CREATE_LOGGER_OUT_NULL) \
407X(CASE_LOGGER_DEFAULT_CREATE_LOGGER_CFG_NULL) \
408X(CASE_LOGGER_DEFAULT_CREATE_LOGGER_ENV_NULL) \
409X(CASE_LOGGER_DEFAULT_CREATE_LOGGER_OOM_1) \
410X(CASE_LOGGER_DEFAULT_CREATE_LOGGER_OOM_2) \
411X(CASE_LOGGER_DEFAULT_CREATE_LOGGER_OK)
413#define LOGGER_DEFAULT_MAKE_CREATE_LOGGER_TEST(case_sym) \
414LEXLEO_MAKE_TEST(logger_default_create_logger, case_sym)
416static const struct CMUnitTest logger_default_create_logger_tests[] = {
417 LOGGER_DEFAULT_CREATE_LOGGER_CASES(LOGGER_DEFAULT_MAKE_CREATE_LOGGER_TEST)
420#undef LOGGER_DEFAULT_CREATE_LOGGER_CASES
421#undef LOGGER_DEFAULT_MAKE_CREATE_LOGGER_TEST
471 size_t expected_written_len;
472 const char *expected_written_message;
473} test_logger_default_log_case_t;
484 const test_logger_default_log_case_t *tc;
485} test_logger_default_log_fixture_t;
491static int setup_logger_default_log(
void **state)
493 const test_logger_default_log_case_t *tc = *state;
495 test_logger_default_log_fixture_t *fx = malloc(
sizeof(*fx));
503 fake_time_set_now_out((
osal_time_t){ .epoch_seconds = 0 });
512 fx->cfg.append_newline =
515 fx->env.stream = fx->fake_stream;
531static int teardown_logger_default_log(
void **state)
533 test_logger_default_log_fixture_t *fx = *state;
538 assert_true(fake_memory_no_leak());
539 assert_true(fake_memory_no_invalid_free());
540 assert_true(fake_memory_no_double_free());
550static void test_logger_default_log(
void **state)
552 test_logger_default_log_fixture_t *fx = *state;
558 fx->fake_stream_adapter,
565 fake_time_set_now_status(fx->tc->time_ops_status);
568 ret =
logger_log(fx->logger, fx->tc->message);
570 assert_int_equal(ret, fx->tc->expected_ret);
573 fx->tc->write_call ==
577 if (fx->tc->expected_written_message) {
579 fx->tc->expected_written_len,
585 fx->tc->expected_written_message,
586 fx->tc->expected_written_len
595static const test_logger_default_log_case_t CASE_LOGGER_DEFAULT_LOG_MESSAGE_NULL = {
596 .name =
"logger_default_log_message_null",
603static const test_logger_default_log_case_t CASE_LOGGER_DEFAULT_LOG_OK_NO_NEWLINE = {
604 .name =
"logger_default_log_ok_no_newline",
611 .expected_written_len =
sizeof(
"[1970-01-01 00:00:00 UTC+0] abc") - 1,
612 .expected_written_message =
"[1970-01-01 00:00:00 UTC+0] abc"
615static const test_logger_default_log_case_t CASE_LOGGER_DEFAULT_LOG_OK_APPEND_NEWLINE = {
616 .name =
"logger_default_log_ok_append_newline",
623 .expected_written_len =
sizeof(
"[1970-01-01 00:00:00 UTC+0] abc\n") - 1,
624 .expected_written_message =
"[1970-01-01 00:00:00 UTC+0] abc\n"
627static const test_logger_default_log_case_t CASE_LOGGER_DEFAULT_LOG_WRITE_FAIL = {
628 .name =
"logger_default_log_write_fail",
636static const test_logger_default_log_case_t CASE_LOGGER_DEFAULT_LOG_TIME_FAIL = {
637 .name =
"logger_default_log_time_fail",
643 .expected_written_len =
sizeof(
"[timestamp error] abc") - 1,
644 .expected_written_message =
"[timestamp error] abc"
651#define LOGGER_DEFAULT_LOG_CASES(X) \
652X(CASE_LOGGER_DEFAULT_LOG_MESSAGE_NULL) \
653X(CASE_LOGGER_DEFAULT_LOG_OK_NO_NEWLINE) \
654X(CASE_LOGGER_DEFAULT_LOG_OK_APPEND_NEWLINE) \
655X(CASE_LOGGER_DEFAULT_LOG_WRITE_FAIL) \
656X(CASE_LOGGER_DEFAULT_LOG_TIME_FAIL)
658#define LOGGER_DEFAULT_MAKE_LOG_TEST(case_sym) \
659LEXLEO_MAKE_TEST(logger_default_log, case_sym)
661static const struct CMUnitTest logger_default_log_tests[] = {
662 LOGGER_DEFAULT_LOG_CASES(LOGGER_DEFAULT_MAKE_LOG_TEST)
665#undef LOGGER_DEFAULT_LOG_CASES
666#undef LOGGER_DEFAULT_MAKE_LOG_TEST
722 &fake_stream_adapter,
730 env_local.
stream = fake_stream;
739 assert_non_null(logger);
750 assert_true(fake_memory_no_leak());
751 assert_true(fake_memory_no_invalid_free());
752 assert_true(fake_memory_no_double_free());
762 static const struct CMUnitTest logger_default_non_parametric_tests[] = {
769 failed += cmocka_run_group_tests(logger_default_non_parametric_tests, NULL, NULL);
770 failed += cmocka_run_group_tests(logger_default_create_logger_tests, NULL, NULL);
771 failed += cmocka_run_group_tests(logger_default_log_tests, NULL, NULL);
Borrower-facing runtime operations for the logger port.
logger_status_t logger_log(logger_t *l, const char *message)
Emit a log message through a logger.
Composition Root helpers for the logger port.
Composition Root API for wiring the logger_default adapter.
logger_default_env_t logger_default_default_env(stream_t *stream, const osal_time_ops_t *time_ops, const osal_mem_ops_t *adapter_mem, const logger_env_t *port_env)
Build a default environment for the logger_default adapter.
logger_status_t logger_default_create_logger(logger_t **out, const logger_default_cfg_t *cfg, const logger_default_env_t *env)
Create a logger instance backed by the logger_default adapter.
logger_default_cfg_t logger_default_default_cfg(void)
Return a default configuration for the logger_default adapter.
Lifecycle services for logger_t handles.
void logger_destroy(logger_t **l)
Destroy a logger handle.
void * osal_memset(void *s, int c, size_t n)
const osal_mem_ops_t * osal_mem_test_fake_ops(void)
const osal_time_ops_t * osal_time_test_fake_ops(void)
Fake stream provider used by stream tests.
const stream_fake_counters_t * stream_fake_counters(const stream_fake_t *fake)
Return the current call counters recorded by the fake stream.
void stream_fake_destroy(stream_fake_t **fake, stream_t **stream)
Destroy a fake stream backend and its associated public stream.
void stream_fake_fail_write_since(stream_fake_t *fake, size_t call_idx, stream_status_t status)
Make fake writes fail starting from a given call index.
void stream_fake_reset(stream_fake_t *fake)
Reset the fake stream runtime state and counters.
size_t stream_fake_written_len(const stream_fake_t *fake)
Return the number of bytes captured by the fake stream.
const uint8_t * stream_fake_written_data(const stream_fake_t *fake)
Return the captured bytes written through the fake stream.
stream_status_t stream_fake_create(stream_fake_t **out_fake, stream_t **out_stream, const osal_mem_ops_t *mem)
Create a fake stream backend and its associated public stream_t.
Borrower-visible public types for the stream port.
stream_status_t
Public status codes used by the stream port.
Configuration type for the logger_default adapter.
bool append_newline
Whether the adapter appends a trailing newline to emitted messages.
Injected dependencies for the logger_default adapter.
logger_env_t port_env
Borrowed logger port environment.
const osal_mem_ops_t * adapter_mem
Borrowed memory operations used for adapter-backend allocation.
stream_t * stream
Borrowed target stream used by the adapter.
const osal_time_ops_t * time_ops
Borrowed time operations used for timestamp generation.
Runtime environment for the logger port.
const osal_mem_ops_t * mem
Memory operations used by the logger port.
Private handle structure for a logger_t.
Private handle structure for a stream_t.
const osal_mem_ops_t * mem
logger_default_create_logger_scenario_t
Scenarios for logger_default_create_logger().
@ LOGGER_DEFAULT_CREATE_LOGGER_SCENARIO_CFG_NULL
@ LOGGER_DEFAULT_CREATE_LOGGER_SCENARIO_OUT_NULL
@ LOGGER_DEFAULT_CREATE_LOGGER_SCENARIO_OK
@ LOGGER_DEFAULT_CREATE_LOGGER_SCENARIO_ENV_NULL
@ LOGGER_DEFAULT_CREATE_LOGGER_SCENARIO_OOM
logger_default_log_scenario_t
Scenarios for logger_default_log().
@ LOGGER_DEFAULT_LOG_SCENARIO_OK_APPEND_NEWLINE
@ LOGGER_DEFAULT_LOG_SCENARIO_TIME_OPS_FAIL
@ LOGGER_DEFAULT_LOG_SCENARIO_MESSAGE_NULL
@ LOGGER_DEFAULT_LOG_SCENARIO_OK_NO_NEWLINE
@ LOGGER_DEFAULT_LOG_SCENARIO_STREAM_WRITE_FAIL
static void test_logger_default_default_cfg(void **state)
Test logger_default_default_cfg().
static void test_logger_default_destroy(void **state)
Test logger_default_destroy().
static void test_logger_default_default_env(void **state)
Test logger_default_default_env().