/*
 * Copyright (c) 2021 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Additional test case for log core
 *
 */

#include <tc_util.h>
#include <stdbool.h>
#include <zephyr.h>
#include <ztest.h>
#include <logging/log_backend.h>
#include <logging/log_ctrl.h>
#include <logging/log.h>

/* Interfaces tested in these cases have been tested in kernel space.
 * Test cases in this file run in user space to improve test coverage
 */
void test_log_from_user(void)
{
	struct log_msg_ids src_level = {
		.level = LOG_LEVEL_INF,
		.domain_id = CONFIG_LOG_DOMAIN_ID,
		.source_id = 0,
	};
	uint32_t cnt0, cnt1;

	log_from_user(src_level, "log from user\n");
	log_from_user(src_level, "log from user, level %d\n", src_level.level);
	cnt0 = log_buffered_cnt();
	while (log_process(false)) {
	}
	cnt1 = log_buffered_cnt();
	zassert_true(cnt1 <= cnt0, "no message is handled");
}

/* test log_hexdump_from_user() from user space */
void test_log_hexdump_from_user(void)
{
	int32_t data = 128;
	struct log_msg_ids src_level = {
		.level = LOG_LEVEL_INF,
		.domain_id = CONFIG_LOG_DOMAIN_ID,
		.source_id = 0,
	};

	log_hexdump_from_user(src_level, "test_hexdump", &data, sizeof(data));
	while (log_process(false)) {
	}
}

static void call_log_generic(uint32_t source_id, const char *fmt, ...)
{
	struct log_msg_ids src_level = {
		.level = LOG_LEVEL_INF,
		.domain_id = CONFIG_LOG_DOMAIN_ID,
		.source_id = source_id,
	};

	va_list ap;

	va_start(ap, fmt);
	log_generic(src_level, fmt, ap, LOG_STRDUP_SKIP);
	va_end(ap);
}

/* test log_generic() from user space */
void test_log_generic_user(void)
{
	uint32_t source_id = 0;

	call_log_generic(source_id, "log generic\n");
	while (log_process(false)) {
	}
}

/* test log_filter_set from user space */
void test_log_filter_set(void)
{
	log_filter_set(NULL, CONFIG_LOG_DOMAIN_ID, 0, LOG_LEVEL_WRN);
}

/* test log_panic() from user space */
void test_log_panic(void)
{
	struct log_msg_ids src_level = {
		.level = LOG_LEVEL_ERR,
		.domain_id = CONFIG_LOG_DOMAIN_ID,
		.source_id = 0,
	};

	log_from_user(src_level, "log from user\n");
	log_from_user(src_level, "log from user, level %d\n", src_level.level);

	log_panic();
}
