blob: 98460b38b8e67c59c180cff60b7058ddea22c044 [file] [log] [blame]
/*
* Copyright (c) 2018 Nordic Semiconductor
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file
* @brief Test log message
*/
#include <logging/log.h>
#include <logging/log_output.h>
#include <tc_util.h>
#include <stdbool.h>
#include <zephyr.h>
#include <ztest.h>
#define LOG_MODULE_NAME test
LOG_MODULE_REGISTER(LOG_MODULE_NAME);
static uint8_t mock_buffer[512];
static uint8_t log_output_buf[8];
static uint32_t mock_len;
static void reset_mock_buffer(void)
{
mock_len = 0U;
memset(mock_buffer, 0, sizeof(mock_buffer));
}
static void setup(void)
{
reset_mock_buffer();
}
static void teardown(void)
{
}
static int mock_output_func(uint8_t *buf, size_t size, void *ctx)
{
memcpy(&mock_buffer[mock_len], buf, size);
mock_len += size;
return size;
}
LOG_OUTPUT_DEFINE(log_output, mock_output_func,
log_output_buf, sizeof(log_output_buf));
static void validate_output_string(const char *exp)
{
int len = strlen(exp);
zassert_equal(len, mock_len, "Unexpected string length");
zassert_equal(0, memcmp(exp, mock_buffer, mock_len),
"Unexpected string");
}
static void log_output_string_varg(const struct log_output *log_output,
struct log_msg_ids src_level, uint32_t timestamp,
uint32_t flags, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
log_output_string(log_output, src_level, timestamp, fmt, ap, flags);
va_end(ap);
}
void test_log_output_raw_string(void)
{
const char *exp_str = "abc 1 3";
const char *exp_str2 = "abc efg 3\n\r";
struct log_msg_ids src_level = {
.level = LOG_LEVEL_INTERNAL_RAW_STRING,
.source_id = 0, /* not used as level indicates raw string. */
.domain_id = 0, /* not used as level indicates raw string. */
};
log_output_string_varg(&log_output, src_level, 0, 0,
"abc %d %d", 1, 3);
/* test if log_output flushed correct string */
validate_output_string(exp_str);
reset_mock_buffer();
/* Test adding \r after new line feed */
log_output_string_varg(&log_output, src_level, 0, 0,
"abc %s %d\n", "efg", 3);
/* test if log_output flushed correct string */
validate_output_string(exp_str2);
}
void test_log_output_string(void)
{
const char *exp_str = STRINGIFY(LOG_MODULE_NAME) ".abc 1 3\r\n";
const char *exp_str_lvl =
"<dbg> " STRINGIFY(LOG_MODULE_NAME) ".abc 1 3\r\n";
const char *exp_str_timestamp =
"[00123456] " STRINGIFY(LOG_MODULE_NAME) ".abc 1 3\r\n";
const char *exp_str_no_crlf = STRINGIFY(LOG_MODULE_NAME) ".abc 1 3";
struct log_msg_ids src_level = {
.level = LOG_LEVEL_DBG,
.source_id = log_const_source_id(
&Z_LOG_ITEM_CONST_DATA(LOG_MODULE_NAME)),
.domain_id = CONFIG_LOG_DOMAIN_ID,
};
log_output_string_varg(&log_output, src_level, 0,
0 /* no flags */,
"abc %d %d", 1, 3);
/* test if log_output flushed correct string */
validate_output_string(exp_str);
reset_mock_buffer();
/* Test that LOG_OUTPUT_FLAG_LEVEL adds log level prefix. */
log_output_string_varg(&log_output, src_level, 0,
LOG_OUTPUT_FLAG_LEVEL,
"abc %d %d", 1, 3);
/* test if log_output flushed correct string */
validate_output_string(exp_str_lvl);
reset_mock_buffer();
/* Test that LOG_OUTPUT_FLAG_TIMESTAMP adds timestamp. */
log_output_string_varg(&log_output, src_level, 123456,
LOG_OUTPUT_FLAG_TIMESTAMP,
"abc %d %d", 1, 3);
/* test if log_output flushed correct string */
validate_output_string(exp_str_timestamp);
reset_mock_buffer();
/* Test that LOG_OUTPUT_FLAG_CRLF_NONE adds no crlf */
log_output_string_varg(&log_output, src_level, 0,
LOG_OUTPUT_FLAG_CRLF_NONE,
"abc %d %d", 1, 3);
/* test if log_output flushed correct string */
validate_output_string(exp_str_no_crlf);
}
/*test case main entry*/
void test_main(void)
{
ztest_test_suite(test_log_output,
ztest_unit_test_setup_teardown(test_log_output_raw_string,
setup, teardown),
ztest_unit_test_setup_teardown(test_log_output_string,
setup, teardown)
);
ztest_run_test_suite(test_log_output);
}