tests: logging: log_api: Extend to test LOG_OVERRIDE_LEVEL

Extended test to validate CONFIG_LOG_OVERRIDE_LEVEL
option.

Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
Krzysztof Chruscinski 2022-03-26 07:47:59 +01:00 committed by Carles Cufí
commit 0b8b1ae997
7 changed files with 138 additions and 9 deletions

View file

@ -5,7 +5,7 @@ find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(log_api) project(log_api)
target_sources(app PRIVATE src/main.c src/mock_frontend.c target_sources(app PRIVATE src/main.c src/mock_frontend.c
src/mock_backend.c src/test_module.c) src/mock_backend.c src/test_module.c src/test_module2.c)
if(CONFIG_CPLUSPLUS) if(CONFIG_CPLUSPLUS)
# When testing for C++ force test file C++ compilation # When testing for C++ force test file C++ compilation

View file

@ -19,9 +19,6 @@
#define NO_BACKENDS 0 #define NO_BACKENDS 0
#endif #endif
#define MODULE_NAME test
#define CXX_MODULE_NAME test_cxx
LOG_MODULE_REGISTER(test, CONFIG_SAMPLE_MODULE_LOG_LEVEL); LOG_MODULE_REGISTER(test, CONFIG_SAMPLE_MODULE_LOG_LEVEL);
#define LOG2_SIMPLE_MSG_LEN \ #define LOG2_SIMPLE_MSG_LEN \
@ -44,7 +41,7 @@ MOCK_LOG_BACKEND_DEFINE(backend2, false);
static log_timestamp_t stamp; static log_timestamp_t stamp;
static bool in_panic; static bool in_panic;
static int16_t test_source_id; static int16_t test_source_id;
static int16_t test_cxx_source_id; static int16_t test2_source_id;
static log_timestamp_t timestamp_get(void) static log_timestamp_t timestamp_get(void)
{ {
@ -103,8 +100,8 @@ static void log_setup(bool backend2_enable)
mock_log_frontend_reset(); mock_log_frontend_reset();
test_source_id = log_source_id_get(STRINGIFY(MODULE_NAME)); test_source_id = log_source_id_get(STRINGIFY(test));
test_cxx_source_id = log_source_id_get(STRINGIFY(CXX_MODULE_NAME)); test2_source_id = log_source_id_get(STRINGIFY(test2));
if (NO_BACKENDS) { if (NO_BACKENDS) {
return; return;
@ -798,6 +795,41 @@ ZTEST(test_log_api, test_log_arg_evaluation)
#undef TEST_MSG_0_PREFIX #undef TEST_MSG_0_PREFIX
} }
ZTEST(test_log_api, test_log_override_level)
{
log_timestamp_t exp_timestamp = TIMESTAMP_INIT_VAL;
log_setup(false);
if (CONFIG_LOG_OVERRIDE_LEVEL == 4) {
char str[128];
/* If prefix is enabled, add function name prefix */
if (IS_ENABLED(CONFIG_LOG_FUNC_NAME_PREFIX_DBG)) {
snprintk(str, sizeof(str),
"%s: " TEST_DBG_MSG, "test_func");
} else {
snprintk(str, sizeof(str), TEST_DBG_MSG);
}
mock_log_frontend_record(test2_source_id, LOG_LEVEL_DBG, str);
mock_log_backend_record(&backend1, test2_source_id,
CONFIG_LOG_DOMAIN_ID, LOG_LEVEL_DBG,
exp_timestamp++, str);
mock_log_frontend_record(test2_source_id, LOG_LEVEL_ERR, TEST_ERR_MSG);
mock_log_backend_record(&backend1, test2_source_id,
CONFIG_LOG_DOMAIN_ID, LOG_LEVEL_ERR,
exp_timestamp++, TEST_ERR_MSG);
} else if (CONFIG_LOG_OVERRIDE_LEVEL != 0) {
zassert_true(false, "Unexpected configuration.");
}
test_func2();
process_and_validate(false, false);
}
/* Disable backends because same suite may be executed again but compiled by C++ */ /* Disable backends because same suite may be executed again but compiled by C++ */
static void log_api_suite_teardown(void *data) static void log_api_suite_teardown(void *data)
{ {
@ -847,6 +879,9 @@ static void log_api_suite_before(void *data)
/* Flush logs and enable test backends. */ /* Flush logs and enable test backends. */
flush_log(); flush_log();
if (IS_ENABLED(CONFIG_LOG_FRONTEND)) {
mock_log_frontend_check_enable();
}
mock_log_backend_check_enable(&backend1); mock_log_backend_check_enable(&backend1);
mock_log_backend_check_enable(&backend2); mock_log_backend_check_enable(&backend2);
} }
@ -867,6 +902,9 @@ static void log_api_suite_after(void *data)
/* Disable testing backends after the test. Otherwise test may fail due /* Disable testing backends after the test. Otherwise test may fail due
* to unexpected log message. * to unexpected log message.
*/ */
if (IS_ENABLED(CONFIG_LOG_FRONTEND)) {
mock_log_frontend_check_disable();
}
mock_log_backend_check_disable(&backend1); mock_log_backend_check_disable(&backend1);
mock_log_backend_check_disable(&backend2); mock_log_backend_check_disable(&backend2);
} }

View file

@ -30,6 +30,16 @@ void mock_log_frontend_dummy_record(int cnt)
mock_log_backend_dummy_record(&backend, cnt); mock_log_backend_dummy_record(&backend, cnt);
} }
void mock_log_frontend_check_enable(void)
{
mock.do_check = true;
}
void mock_log_frontend_check_disable(void)
{
mock.do_check = false;
}
void mock_log_frontend_generic_record(uint16_t source_id, void mock_log_frontend_generic_record(uint16_t source_id,
uint16_t domain_id, uint16_t domain_id,
uint8_t level, uint8_t level,
@ -79,6 +89,10 @@ static void log_frontend_n(struct log_msg_ids src_level, const char *fmt, ...)
char str[128]; char str[128];
va_list ap; va_list ap;
if (mock.do_check == false) {
return;
}
mock.msg_proc_idx++; mock.msg_proc_idx++;
if (!exp_msg->check) { if (!exp_msg->check) {
@ -105,6 +119,10 @@ void log_frontend_hexdump(const char *str,
{ {
struct mock_log_backend_msg *exp_msg = &mock.exp_msgs[mock.msg_proc_idx]; struct mock_log_backend_msg *exp_msg = &mock.exp_msgs[mock.msg_proc_idx];
if (mock.do_check == false) {
return;
}
zassert_equal(exp_msg->data_len, length, NULL); zassert_equal(exp_msg->data_len, length, NULL);
if (exp_msg->data_len <= sizeof(exp_msg->data)) { if (exp_msg->data_len <= sizeof(exp_msg->data)) {
zassert_equal(memcmp(data, exp_msg->data, length), 0, NULL); zassert_equal(memcmp(data, exp_msg->data, length), 0, NULL);
@ -115,6 +133,10 @@ void log_frontend_hexdump(const char *str,
void log_frontend_0(const char *str, struct log_msg_ids src_level) void log_frontend_0(const char *str, struct log_msg_ids src_level)
{ {
if (mock.do_check == false) {
return;
}
log_frontend_n(src_level, str); log_frontend_n(src_level, str);
} }
@ -125,6 +147,10 @@ void log_frontend_1(const char *str, log_arg_t arg0, struct log_msg_ids src_leve
void log_frontend_2(const char *str, log_arg_t arg0, log_arg_t arg1, struct log_msg_ids src_level) void log_frontend_2(const char *str, log_arg_t arg0, log_arg_t arg1, struct log_msg_ids src_level)
{ {
if (mock.do_check == false) {
return;
}
log_frontend_n(src_level, str, arg0, arg1); log_frontend_n(src_level, str, arg0, arg1);
} }
@ -134,6 +160,10 @@ void log_frontend_msg(const void *source,
{ {
struct mock_log_backend_msg *exp_msg = &mock.exp_msgs[mock.msg_proc_idx]; struct mock_log_backend_msg *exp_msg = &mock.exp_msgs[mock.msg_proc_idx];
if (mock.do_check == false) {
return;
}
mock.msg_proc_idx++; mock.msg_proc_idx++;
if (!exp_msg->check) { if (!exp_msg->check) {
@ -147,7 +177,8 @@ void log_frontend_msg(const void *source,
log_dynamic_source_id((struct log_source_dynamic_data *)source) : log_dynamic_source_id((struct log_source_dynamic_data *)source) :
log_const_source_id((const struct log_source_const_data *)source); log_const_source_id((const struct log_source_const_data *)source);
zassert_equal(source_id, exp_msg->source_id, NULL); zassert_equal(source_id, exp_msg->source_id, "got: %d, exp: %d",
source_id, exp_msg->source_id);
zassert_equal(exp_msg->data_len, desc.data_len, NULL); zassert_equal(exp_msg->data_len, desc.data_len, NULL);
if (exp_msg->data_len <= sizeof(exp_msg->data)) { if (exp_msg->data_len <= sizeof(exp_msg->data)) {

View file

@ -27,7 +27,8 @@ static inline void mock_log_frontend_record(uint16_t source_id, uint8_t level, c
} }
void mock_log_frontend_validate(bool panic); void mock_log_frontend_validate(bool panic);
void mock_log_frontend_check_enable(void);
void mock_log_frontend_check_disable(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -14,6 +14,7 @@ extern "C" {
#endif #endif
void test_func(void); void test_func(void);
void test_func2(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -0,0 +1,23 @@
/*
* Copyright (c) 2022 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief Test module for log api test
*
*/
#include "test_module.h"
#include <logging/log.h>
/* Module disabled by default, will emit logs only when CONFIG_LOG_OVERRIDE_LEVEL. */
LOG_MODULE_REGISTER(test2, 0);
void test_func2(void)
{
LOG_DBG(TEST_DBG_MSG);
LOG_ERR(TEST_ERR_MSG);
}

View file

@ -127,6 +127,23 @@ tests:
- CONFIG_LOG_MODE_DEFERRED=y - CONFIG_LOG_MODE_DEFERRED=y
- CONFIG_LOG_TIMESTAMP_64BIT=y - CONFIG_LOG_TIMESTAMP_64BIT=y
logging.log2_api_deferred_override_level:
# Testing on selected platforms as it enables all logs in the application
# and it cannot be handled on many platforms.
platform_allow: qemu_cortex_m3 qemu_cortex_a9
extra_configs:
- CONFIG_LOG_MODE_DEFERRED=y
- CONFIG_LOG_OVERRIDE_LEVEL=4
logging.log2_api_deferred_override_level_rt_filtering:
# Testing on selected platforms as it enables all logs in the application
# and it cannot be handled on many platforms.
platform_allow: qemu_cortex_m3 qemu_cortex_a9
extra_configs:
- CONFIG_LOG_MODE_DEFERRED=y
- CONFIG_LOG_RUNTIME_FILTERING=y
- CONFIG_LOG_OVERRIDE_LEVEL=4
logging.log2_api_immediate: logging.log2_api_immediate:
# FIXME: qemu_arc_hs6x excluded, see #38041 # FIXME: qemu_arc_hs6x excluded, see #38041
platform_exclude: qemu_arc_hs6x platform_exclude: qemu_arc_hs6x
@ -183,6 +200,24 @@ tests:
- CONFIG_LOG_FRONTEND=y - CONFIG_LOG_FRONTEND=y
- CONFIG_LOG_MODE_IMMEDIATE=y - CONFIG_LOG_MODE_IMMEDIATE=y
logging.log_api_frontend_immediate_override_level:
# Testing on selected platforms as it enables all logs in the application
# and it cannot be handled on many platforms.
platform_allow: qemu_cortex_m3 qemu_cortex_a9
extra_configs:
- CONFIG_LOG_FRONTEND=y
- CONFIG_LOG_MODE_IMMEDIATE=y
- CONFIG_LOG_OVERRIDE_LEVEL=4
logging.log2_api_deferred_override_level_rt_filtering:
# Testing on selected platforms as it enables all logs in the application
# and it cannot be handled on many platforms.
platform_allow: qemu_cortex_m3 qemu_cortex_a9
extra_configs:
- CONFIG_LOG_MODE_DEFERRED=y
- CONFIG_LOG_RUNTIME_FILTERING=y
- CONFIG_LOG_OVERRIDE_LEVEL=4
logging.log_api_frontend_only: logging.log_api_frontend_only:
# FIXME: qemu_arc_hs6x excluded, see #38041 # FIXME: qemu_arc_hs6x excluded, see #38041
platform_exclude: qemu_arc_hs6x platform_exclude: qemu_arc_hs6x