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

#include <ztest.h>

#define HELPER_STACK_SIZE 500

/**
 * @brief Verify @a va1 and @a val2 are within @a pcnt % of each other
 */
#define TEST_WITHIN_X_PERCENT(val1, val2, pcnt)                       \
	((((val1) * 100) < ((val2) * (100 + (pcnt)))) &&              \
	 (((val1) * 100) > ((val2) * (100 - (pcnt))))) ? true : false

#if defined(CONFIG_RISCV_MACHINE_TIMER)
#define IDLE_EVENT_STATS_PRECISION 5
#else
#define IDLE_EVENT_STATS_PRECISION 1
#endif

static struct k_thread helper_thread;
static K_THREAD_STACK_DEFINE(helper_stack, HELPER_STACK_SIZE);

static struct k_thread *main_thread;

/**
 * @brief Helper thread to test_thread_runtime_stats_get()
 */
void helper1(void *p1, void *p2, void *p3)
{
	while (1) {
	}
}

/**
 * @brief Busy wait for specified number of ticks
 */
void busy_loop(uint32_t ticks)
{
	uint32_t  tick = sys_clock_tick_get_32();

	while (sys_clock_tick_get_32() < (tick + ticks)) {
	}
}

/**
 * @brief Test the k_threads_runtime_stats_all_get() API
 *
 * 1. Create a helper thread.
 * 2. Busy loop for 2 ticks.
 *    - Idle time should not increase.
 * 3. Sleep for two ticks. Helper executes and busy loops.
 *    - Idle time should not increase
 * 4. Kill helper thread, and sleep for 2 ticks
 *    - Idle time should increase
 * 5. Busy loop for 3 ticks
 *    - Idle time should not increase
 *    - current, peak and average cycles should be different
 */
void test_all_stats_usage(void)
{
	int  priority;
	k_tid_t  tid;
	k_thread_runtime_stats_t  stats1;
	k_thread_runtime_stats_t  stats2;
	k_thread_runtime_stats_t  stats3;
	k_thread_runtime_stats_t  stats4;
	k_thread_runtime_stats_t  stats5;

	priority = k_thread_priority_get(_current);
	tid = k_thread_create(&helper_thread, helper_stack,
			      K_THREAD_STACK_SIZEOF(helper_stack),
			      helper1, NULL, NULL, NULL,
			      priority + 2, 0, K_NO_WAIT);

	k_thread_runtime_stats_all_get(&stats1);

	busy_loop(2);   /* Busy wait 2 ticks */

	k_thread_runtime_stats_all_get(&stats2);

	k_sleep(K_TICKS(2));  /* Helper runs for 2 ticks */

	k_thread_runtime_stats_all_get(&stats3);

	k_thread_abort(tid);

	k_sleep(K_TICKS(2));  /* Idle for 2 ticks */

	k_thread_runtime_stats_all_get(&stats4);

	busy_loop(3);   /* Busy wait for 3 ticks */

	k_thread_runtime_stats_all_get(&stats5);

	/*
	 * Verify that before the system idles for 2 ticks that
	 * [execution_cycles] is increasing, [total_cycles] matches
	 * [execution_cycles] and [idle_cycles] is not changing (as the
	 * system has been idle yet.
	 */

	zassert_true(stats2.execution_cycles > stats1.execution_cycles, NULL);
	zassert_true(stats3.execution_cycles > stats2.execution_cycles, NULL);
	zassert_true(stats1.execution_cycles == stats1.total_cycles, NULL);
	zassert_true(stats2.execution_cycles == stats2.total_cycles, NULL);
	zassert_true(stats3.execution_cycles == stats3.total_cycles, NULL);
#ifdef CONFIG_SCHED_THREAD_USAGE_ALL
	zassert_true(stats1.idle_cycles == stats2.idle_cycles, NULL);
	zassert_true(stats1.idle_cycles == stats3.idle_cycles, NULL);
#endif

#ifdef CONFIG_SCHED_THREAD_USAGE_ANALYSIS

	/*
	 * The analysis fields should behave as follows prior to the system
	 * going idle.
	 * 1. [current_cycles] increases.
	 * 2. [peak_cycles] matches [current_cycles].
	 * 3. [average_cycles] is 0 (because system has not gone idle yet)
	 * 4. [current_cycles] matches [execution_cycles].
	 */

	zassert_true(stats2.current_cycles > stats1.current_cycles, NULL);
	zassert_true(stats3.current_cycles > stats2.current_cycles, NULL);

	zassert_true(stats1.peak_cycles == stats1.current_cycles, NULL);
	zassert_true(stats2.peak_cycles == stats2.current_cycles, NULL);
	zassert_true(stats3.peak_cycles == stats3.current_cycles, NULL);

	zassert_true(stats1.average_cycles == 0, NULL);
	zassert_true(stats2.average_cycles == 0, NULL);
	zassert_true(stats3.average_cycles == 0, NULL);

	zassert_true(stats1.current_cycles == stats1.execution_cycles, NULL);
	zassert_true(stats2.current_cycles == stats2.execution_cycles, NULL);
	zassert_true(stats3.current_cycles == stats3.execution_cycles, NULL);
#endif

	/*
	 * Now process the statistics after the idle event.
	 *
	 * 1. [execution_cycles] continues to increase
	 * 2. [total_cycles] increases
	 * 3. [current_cycles] had a reset event but still increases
	 * 4. [peak_cycles] does not change
	 * 5. [average_cycles] increases
	 * 6. [idle_cycles] increased once.
	 */

	zassert_true(stats4.execution_cycles > stats3.execution_cycles, NULL);
	zassert_true(stats5.execution_cycles > stats4.execution_cycles, NULL);

	/*
	 * If the frequency is low enough, the [total_cycles] might not
	 * increase between sample points 3 and 4. Count this as acceptable.
	 */

	zassert_true(stats4.total_cycles >= stats3.total_cycles, NULL);
	zassert_true(stats5.total_cycles > stats4.total_cycles, NULL);

#ifdef CONFIG_SCHED_THREAD_USAGE_ANALYSIS
	zassert_true(stats4.current_cycles <= stats1.current_cycles, NULL);
	zassert_true(stats5.current_cycles > stats4.current_cycles, NULL);

	zassert_true(TEST_WITHIN_X_PERCENT(stats4.peak_cycles,
					   stats3.peak_cycles, IDLE_EVENT_STATS_PRECISION), NULL);
	zassert_true(stats4.peak_cycles == stats5.peak_cycles, NULL);

	zassert_true(stats4.average_cycles > stats3.average_cycles, NULL);
	zassert_true(stats5.average_cycles > stats4.average_cycles, NULL);
#endif

#ifdef CONFIG_SCHED_THREAD_USAGE_ALL
	zassert_true(stats4.idle_cycles > stats3.idle_cycles, NULL);
	zassert_true(stats4.idle_cycles == stats5.idle_cycles, NULL);
#endif
}

#ifdef CONFIG_SCHED_THREAD_USAGE_ANALYSIS
/**
 * @brief Test the k_thread_runtime_stats_enable/disable APIs
 */
void test_thread_stats_enable_disable(void)
{
	k_tid_t  tid;
	k_thread_runtime_stats_t  stats1;
	k_thread_runtime_stats_t  stats2;
	k_thread_runtime_stats_t  helper_stats1;
	k_thread_runtime_stats_t  helper_stats2;
	k_thread_runtime_stats_t  helper_stats3;
	int  priority;

	priority = k_thread_priority_get(_current);
	tid = k_thread_create(&helper_thread, helper_stack,
			      K_THREAD_STACK_SIZEOF(helper_stack),
			      helper1, NULL, NULL, NULL,
			      priority + 2, 0, K_NO_WAIT);

	/*
	 * Sleep to let the helper thread execute for some time before
	 * disabling the runtime stats on the helper thread.
	 */

	k_sleep(K_TICKS(5));

	k_thread_runtime_stats_get(_current, &stats1);
	k_thread_runtime_stats_get(tid, &helper_stats1);
	k_thread_runtime_stats_disable(tid);

	/*
	 * Busy wait for the remaining tick before re-enabling the thread
	 * runtime stats on the helper thread.
	 */

	busy_loop(1);

	/* Sleep for two ticks to let the helper thread execute. */

	k_sleep(K_TICKS(2));

	k_thread_runtime_stats_enable(tid);
	k_thread_runtime_stats_get(_current, &stats2);
	k_thread_runtime_stats_get(tid, &helper_stats2);

	/* Sleep for two ticks to let the helper thread execute again. */

	k_sleep(K_TICKS(2));

	k_thread_runtime_stats_get(tid, &helper_stats3);

	/*
	 * Verify that the between sample sets 1 and 2 that additional stats
	 * were not gathered for the helper thread, but were gathered for the
	 * main current thread.
	 */

	zassert_true(helper_stats1.execution_cycles ==
		     helper_stats2.execution_cycles, NULL);
	zassert_true(stats1.execution_cycles < stats2.execution_cycles, NULL);

	/*
	 * Verify that between sample sets 2 and 3 that additional stats were
	 * gathered for the helper thread.
	 */

	zassert_true(helper_stats2.execution_cycles <
		     helper_stats3.execution_cycles, NULL);

	k_thread_abort(tid);
}
#else
void test_thread_stats_enable_disable(void)
{
}
#endif

#ifdef CONFIG_SCHED_THREAD_USAGE_ALL
/**
 * @brief Test the k_sys_runtime_stats_enable/disable APIs
 */
void test_sys_stats_enable_disable(void)
{
	k_thread_runtime_stats_t  sys_stats1;
	k_thread_runtime_stats_t  sys_stats2;
	k_thread_runtime_stats_t  sys_stats3;
	k_thread_runtime_stats_t  thread_stats1;
	k_thread_runtime_stats_t  thread_stats2;
	k_thread_runtime_stats_t  thread_stats3;

	/*
	 * Disable system runtime stats gathering.
	 * This should not impact thread runtime stats gathering.
	 */

	k_sys_runtime_stats_disable();

	k_thread_runtime_stats_get(_current, &thread_stats1);
	k_thread_runtime_stats_all_get(&sys_stats1);

	busy_loop(2);

	k_thread_runtime_stats_get(_current, &thread_stats2);
	k_thread_runtime_stats_all_get(&sys_stats2);

	/*
	 * Enable system runtime stats gathering.
	 * This should not impact thread runtime stats gathering.
	 */

	k_sys_runtime_stats_enable();

	busy_loop(2);

	k_thread_runtime_stats_get(_current, &thread_stats3);
	k_thread_runtime_stats_all_get(&sys_stats3);

	/*
	 * There ought to be no differences between sys_stat1 and sys_stat2.
	 * Although a memory compare of the two structures would be sufficient,
	 * each individual field is being tested in case to more easily
	 * isolate the cause of any error.
	 */

	zassert_true(sys_stats1.execution_cycles == sys_stats2.execution_cycles,
		     NULL);
	zassert_true(sys_stats1.total_cycles == sys_stats2.total_cycles, NULL);

#ifdef CONFIG_SCHED_THREAD_USAGE_ANALYSIS
	zassert_true(sys_stats1.current_cycles == sys_stats2.current_cycles,
		     NULL);
	zassert_true(sys_stats1.peak_cycles == sys_stats2.peak_cycles, NULL);
	zassert_true(sys_stats1.average_cycles == sys_stats2.average_cycles,
		     NULL);
#endif

#ifdef CONFIG_SCHED_THREAD_USAGE_ALL
	zassert_true(sys_stats1.idle_cycles == sys_stats2.idle_cycles, NULL);
#endif

	/*
	 * As only system stats have been disabled, thread stats should be
	 * unaffected. To simplify things, just check [execution_cycles] and
	 * [current_cycles] (if enabled).
	 */

	zassert_true(thread_stats1.execution_cycles <
		     thread_stats2.execution_cycles, NULL);

#ifdef CONFIG_SCHED_THREAD_USAGE_ANALYSIS
	zassert_true(thread_stats1.current_cycles <
		     thread_stats2.current_cycles, NULL);
#endif

	/*
	 * Now verify that the enabling of system runtime stats gathering
	 * has resulted in the gathering of system runtime stats. Again,
	 * thread runtime stats gathering should be unaffected.
	 */

	zassert_true(sys_stats2.execution_cycles < sys_stats3.execution_cycles,
		     NULL);
	zassert_true(sys_stats2.total_cycles < sys_stats3.total_cycles, NULL);

#ifdef CONFIG_SCHED_THREAD_USAGE_ANALYSIS

	/*
	 * As enabling reset [current_cycles], it is not easy to predict
	 * what its value should be. For now, settle for ensuring that it
	 * is different and not zero.
	 */

	zassert_true(sys_stats2.current_cycles != sys_stats3.current_cycles,
		     NULL);
	zassert_true(sys_stats2.current_cycles != 0, NULL);
	zassert_true(sys_stats2.peak_cycles == sys_stats3.peak_cycles, NULL);
	zassert_true(sys_stats2.average_cycles > sys_stats3.average_cycles,
		     NULL);
#endif

#ifdef CONFIG_SCHED_THREAD_USAGE_ALL
	zassert_true(sys_stats2.idle_cycles == sys_stats3.idle_cycles, NULL);
#endif
}
#else
void test_sys_stats_enable_disable(void)
{
}
#endif

/**
 * @brief Timer handler to resume the main thread
 */
void resume_main(struct k_timer *timer)
{
	k_thread_resume(main_thread);
}

/**
 * @brief Test the k_thread_runtime_stats_get() API
 *
 * This routine tests the k_thread_runtime_stats_get() routine. It verifies
 * that the contents of the fields guarded by CONFIG_SCHED_THREAD_USAGE
 * are correct.
 */
void test_thread_stats_usage(void)
{
	k_tid_t  tid;
	int  priority;
	int  status;
	struct k_timer   timer;
	k_thread_runtime_stats_t  stats1;
	k_thread_runtime_stats_t  stats2;
	k_thread_runtime_stats_t  stats3;

	priority = k_thread_priority_get(_current);

	/*
	 * Verify that k_thread_runtime_stats_get() returns the expected
	 * values for error cases.
	 */

	status = k_thread_runtime_stats_get(NULL, &stats1);
	zassert_true(status == -EINVAL, NULL);

	status = k_thread_runtime_stats_get(_current, NULL);
	zassert_true(status == -EINVAL, NULL);

	/* Align to the next tick */

	k_sleep(K_TICKS(1));

	/* Create a low priority helper thread to start in 1 tick. */

	tid = k_thread_create(&helper_thread, helper_stack,
			      K_THREAD_STACK_SIZEOF(helper_stack),
			      helper1, NULL, NULL, NULL,
			      priority + 2, 0, K_TICKS(1));

	main_thread = _current;
	k_timer_init(&timer, resume_main, NULL);
	k_timer_start(&timer, K_TICKS(1), K_TICKS(10));

	/* Verify thread creation succeeded */

	zassert_true(tid == &helper_thread, NULL);

	/* Get a valid set of thread runtime stats */

	status = k_thread_runtime_stats_get(tid, &stats1);
	zassert_true(status == 0, NULL);

	/*
	 * Suspend main thread. Timer will wake it 1 tick to sample
	 * the helper threads runtime stats.
	 */

	k_thread_suspend(_current);

	/*
	 * T = 1.
	 * Timer woke the main thread. Sample runtime stats for helper thread
	 * before suspending.
	 */

	k_thread_runtime_stats_get(tid, &stats1);
	k_thread_suspend(_current);

	/*
	 * T = 11.
	 * Timer woke the main thread. Suspend main thread again.
	 */

	k_thread_suspend(_current);

	/*
	 * T = 21.
	 * Timer woke the main thread. Sample runtime stats for helper thread
	 * before suspending.
	 */

	k_thread_runtime_stats_get(tid, &stats2);
	k_thread_suspend(_current);

	/*
	 * T = 31.
	 * Timer woke the main thread. Sample runtime stats for helper thread
	 * and stop the timer.
	 */

	k_thread_runtime_stats_get(tid, &stats3);
	k_timer_stop(&timer);

#ifdef CONFIG_SCHED_THREAD_USAGE_ANALYSIS
	k_thread_runtime_stats_t  stats4;
	k_thread_runtime_stats_t  stats5;

	/*
	 * Sleep for 20 ticks, and then 1 tick. This will allow the helper
	 * thread to have two different scheduled execution windows.
	 */

	k_sleep(K_TICKS(20));
	k_thread_runtime_stats_get(tid, &stats4);

	k_sleep(K_TICKS(1));
	k_thread_runtime_stats_get(tid, &stats5);
#endif

	/* Verify execution_cycles are identical to total_cycles */

	zassert_true(stats1.execution_cycles == stats1.total_cycles, NULL);
	zassert_true(stats2.execution_cycles == stats2.total_cycles, NULL);

#ifdef CONFIG_SCHED_THREAD_USAGE_ALL
	zassert_true(stats3.idle_cycles == 0, NULL);
#endif

	/*
	 * Verify that the time for which the helper thread executed between
	 * the first and second samplings is more than that between the
	 * second and third.
	 */

	uint64_t  diff12;
	uint64_t  diff23;

	diff12 = stats2.execution_cycles - stats1.execution_cycles;
	diff23 = stats3.execution_cycles - stats2.execution_cycles;

	zassert_true(diff12 > diff23, NULL);

#ifdef CONFIG_SCHED_THREAD_USAGE_ANALYSIS

	/* Verify that [current_cycles] change as expected. */

	zassert_true(stats4.current_cycles >= stats5.current_cycles, NULL);
	zassert_true(stats4.current_cycles > stats3.current_cycles, NULL);
	zassert_true(stats5.current_cycles < stats3.current_cycles, NULL);

	/* Verify that [peak_cycles] change as expected */

	zassert_true(stats4.peak_cycles > stats2.peak_cycles, NULL);
	zassert_true(stats4.peak_cycles == stats5.peak_cycles, NULL);
	zassert_true(stats4.peak_cycles == stats4.current_cycles, NULL);

	/* Verify that [average_cycles] change as expected */

	zassert_true(stats4.average_cycles > stats3.average_cycles, NULL);
	zassert_true(stats4.average_cycles > stats5.average_cycles, NULL);
	zassert_true(stats5.average_cycles >= stats3.average_cycles, NULL);
#endif

	/* Abort the helper thread */

	k_thread_abort(tid);
}

/**
 * @brief - main entry point for thread runtime statistics (usage) test
 */
void test_main(void)
{
	ztest_test_suite(usage_api,
		 ztest_1cpu_unit_test(test_all_stats_usage),
		 ztest_1cpu_unit_test(test_thread_stats_enable_disable),
		 ztest_1cpu_unit_test(test_sys_stats_enable_disable),
		 ztest_1cpu_unit_test(test_thread_stats_usage)
		 );
	ztest_run_test_suite(usage_api);
}
