/* * Copyright (c) 2019 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include "mock_backend.h" #include #include #include #include #include #include #define LOG_MODULE_NAME log_switch_format LOG_MODULE_REGISTER(LOG_MODULE_NAME, LOG_LEVEL_ERR); extern size_t log_format_table_size(void); K_SEM_DEFINE(my_sem, 0, 1); void log_msgs(void) { /* standard print */ LOG_ERR("Error message example."); #if CONFIG_LOG_MODE_DEFERRED && !(CONFIG_LOG_CUSTOM_FORMAT_SUPPORT) /* * When deferred logging is enabled, the work is being performed by * another thread. The semaphore my_sem gives that thread time to process * those messages. */ k_sem_take(&my_sem, K_FOREVER); #endif /* raw string */ printk("hello sys-t on board %s\n", CONFIG_BOARD); } void test_log_switch_format_success_case(void) { const struct log_backend *backend; const char *raw_data_str; uint32_t log_type = LOG_OUTPUT_SYST; const char *text_raw_data_str = " log_switch_format: Error message example."; const char *syst_raw_data_str = "SYS-T RAW DATA: "; raw_data_str = syst_raw_data_str; log_msgs(); validate_log_type(raw_data_str, log_type); log_type = LOG_OUTPUT_TEXT; raw_data_str = text_raw_data_str; backend = log_format_set_all_active_backends(log_type); zassert_is_null(backend, "Unexpected failure in switching log format"); log_msgs(); validate_log_type(raw_data_str, log_type); log_type = LOG_OUTPUT_SYST; raw_data_str = syst_raw_data_str; backend = log_format_set_all_active_backends(log_type); zassert_is_null(backend, "Unexpected failure in switching log format"); log_msgs(); validate_log_type(raw_data_str, log_type); log_type = LOG_OUTPUT_TEXT; raw_data_str = text_raw_data_str; backend = log_format_set_all_active_backends(log_type); zassert_is_null(backend, "Unexpected failure in switching log format"); log_msgs(); validate_log_type(raw_data_str, log_type); } void test_log_switch_format_set(void) { const char *backend_name; const struct log_backend *backend; int ret; uint32_t log_type; log_type = LOG_OUTPUT_TEXT; backend_name = "not_exists"; backend = log_backend_get_by_name(backend_name); zassert_is_null(backend, "Backend unexpectedly found"); ret = log_backend_format_set(backend, log_type); zassert_equal(ret, -EINVAL, "Expected -EINVAL, Got %d\n", ret); backend_name = CONFIG_LOG_BACKEND_DEFAULT; backend = log_backend_get_by_name(backend_name); zassert_not_null(backend, "Backend not found"); log_type = log_format_table_size() + 1; ret = log_backend_format_set(backend, log_type); zassert_equal(ret, -EINVAL, "Log type not supported, Invalid value returned"); } void test_log_switch_format_set_all_active_backends(void) { size_t log_type = log_format_table_size() + 1; const struct log_backend *backend; backend = log_format_set_all_active_backends(log_type); zassert_not_null(backend, "Unexpectedly all active backends switched the logging format"); log_type = LOG_OUTPUT_SYST; backend = log_format_set_all_active_backends(log_type); zassert_is_null(backend, "Not all active backends have switched logging formats"); } /* Testcase to verify the entries in function pointer table */ void test_log_switch_format_func_t_get(void) { const log_format_func_t expected_values[] = { [LOG_OUTPUT_TEXT] = IS_ENABLED(CONFIG_LOG_OUTPUT) ? log_output_msg_process : NULL, [LOG_OUTPUT_SYST] = IS_ENABLED(CONFIG_LOG_MIPI_SYST_ENABLE) ? log_output_msg_syst_process : NULL, [LOG_OUTPUT_DICT] = IS_ENABLED(CONFIG_LOG_DICTIONARY_SUPPORT) ? log_dict_output_msg_process : NULL, [LOG_OUTPUT_CUSTOM] = IS_ENABLED(CONFIG_LOG_CUSTOM_FORMAT_SUPPORT) ? log_custom_output_msg_process : NULL, }; zassert_equal(log_format_table_size(), ARRAY_SIZE(expected_values), "Update test for expected_values table"); for (int i = 0; i < ARRAY_SIZE(expected_values); i++) { zassert_equal(log_format_func_t_get(i), expected_values[i], "Log Format Not supported"); } } ZTEST(log_switch_format, test_log_switch_format) { test_log_switch_format_success_case(); test_log_switch_format_set(); test_log_switch_format_set_all_active_backends(); test_log_switch_format_func_t_get(); } #if CONFIG_LOG_CUSTOM_FORMAT_SUPPORT void custom_formatting(const struct log_output *output, struct log_msg *msg, uint32_t flags) { uint8_t buffer[] = "Hello world"; output->func((uint8_t *)buffer, sizeof(buffer), (void *)output); } ZTEST(log_switch_format, test_log_switch_format_custom_output_handles_null) { const char *backend_name; const struct log_backend *backend; backend_name = CONFIG_LOG_BACKEND_DEFAULT; backend = log_backend_get_by_name(backend_name); log_backend_format_set(backend, LOG_OUTPUT_CUSTOM); log_custom_output_msg_set(NULL); log_msgs(); validate_log_type("", LOG_OUTPUT_CUSTOM); } ZTEST(log_switch_format, test_log_switch_format_custom_output_called_when_set) { uint32_t log_type; const char *backend_name; const char *raw_data_str; const char *text_custom_data_str = "Hello world"; const struct log_backend *backend; backend_name = CONFIG_LOG_BACKEND_DEFAULT; backend = log_backend_get_by_name(backend_name); log_backend_format_set(backend, LOG_OUTPUT_CUSTOM); log_custom_output_msg_set(custom_formatting); log_msgs(); log_type = LOG_OUTPUT_CUSTOM; raw_data_str = text_custom_data_str; validate_log_type(raw_data_str, log_type); } ZTEST(log_switch_format, test_log_switch_format_does_not_log_when_uninit) { const char *backend_name; const struct log_backend *backend; backend_name = CONFIG_LOG_BACKEND_DEFAULT; backend = log_backend_get_by_name(backend_name); log_backend_format_set(backend, LOG_OUTPUT_CUSTOM); log_msgs(); validate_log_type("", LOG_OUTPUT_CUSTOM); } #endif ZTEST_SUITE(log_switch_format, NULL, NULL, NULL, NULL, NULL);