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

#include <ztest.h>

void dummy_fn(struct k_timer *timer)
{
	ARG_UNUSED(timer);
}

K_TIMER_DEFINE(timer_s, dummy_fn, NULL);
K_MEM_SLAB_DEFINE(slab_s, 8, 2, 8);
K_SEM_DEFINE(sem_s, 0, 1);
K_MUTEX_DEFINE(mutex_s);
K_STACK_DEFINE(stack_s, 64);
K_MSGQ_DEFINE(msgq_s, sizeof(int), 2, 4);
K_MBOX_DEFINE(mbox_s);
K_PIPE_DEFINE(pipe_s, 64, 4);
K_QUEUE_DEFINE(queue_s);

unsigned char __aligned(4) pipe_buffer[64];
char __aligned(4) slab_buffer[8 * 4];
stack_data_t stack_array[8 * 4];
int msgq_buffer[64];

void test_obj_tracking_sanity(void)
{
	struct k_timer timer;
	struct k_mem_slab slab;
	struct k_sem sem;
	struct k_mutex mutex;
	struct k_stack stack;
	struct k_msgq msgq;
	struct k_mbox mbox;
	struct k_pipe pipe;
	struct k_queue queue;
	void *list;
	int count;

	k_timer_init(&timer, dummy_fn, NULL);
	count = 0;
	list = _track_list_k_timer;
	while (list != NULL) {
		if (list == &timer || list == &timer_s) {
			count++;
		}
		list = SYS_PORT_TRACK_NEXT((struct k_timer *)list);
	}
	zassert_equal(count, 2, "Wrong number of timer objects");

	k_mem_slab_init(&slab, slab_buffer, 8, 4);
	count = 0;
	list = _track_list_k_mem_slab;
	while (list != NULL) {
		if (list == &slab || list == &slab_s) {
			count++;
		}
		list = SYS_PORT_TRACK_NEXT((struct k_mem_slab *)list);
	}
	zassert_equal(count, 2, "Wrong number of mem_slab objects");

	k_sem_init(&sem, 1, 2);
	count = 0;
	list = _track_list_k_sem;
	while (list != NULL) {
		if (list == &sem || list == &sem_s) {
			count++;
		}
		list = SYS_PORT_TRACK_NEXT((struct k_sem *)list);
	}
	zassert_equal(count, 2, "Wrong number of semaphore objects");

	k_mutex_init(&mutex);
	count = 0;
	list = _track_list_k_mutex;
	while (list != NULL) {
		if (list == &mutex || list == &mutex_s) {
			count++;
		}
		list = SYS_PORT_TRACK_NEXT((struct k_mutex *)list);
	}
	zassert_equal(count, 2, "Wrong number of mutex objects");

	k_stack_init(&stack, stack_array, 20);
	count = 0;
	list = _track_list_k_stack;
	while (list != NULL) {
		if (list == &stack || list == &stack_s) {
			count++;
		}
		list = SYS_PORT_TRACK_NEXT((struct k_stack *)list);
	}
	zassert_equal(count, 2, "Wrong number of stack objects");

	k_msgq_init(&msgq, (char *)msgq_buffer, sizeof(int), 8);
	count = 0;
	list = _track_list_k_msgq;
	while (list != NULL) {
		if (list == &msgq || list == &msgq_s) {
			count++;
		}
		list = SYS_PORT_TRACK_NEXT((struct k_msgq *)list);
	}
	zassert_equal(count, 2, "Wrong number of message queue objects");

	k_mbox_init(&mbox);
	count = 0;
	list = _track_list_k_mbox;
	while (list != NULL) {
		if (list == &mbox || list == &mbox_s) {
			count++;
		}
		list = SYS_PORT_TRACK_NEXT((struct k_mbox *)list);
	}
	zassert_equal(count, 2, "Wrong number of mbox objects");

	k_pipe_init(&pipe, pipe_buffer, sizeof(pipe_buffer));
	count = 0;
	list = _track_list_k_pipe;
	while (list != NULL) {
		if (list == &pipe || list == &pipe_s) {
			count++;
		}
		list = SYS_PORT_TRACK_NEXT((struct k_pipe *)list);
	}
	zassert_equal(count, 2, "Wrong number of pipe objects");

	k_queue_init(&queue);
	count = 0;
	list = _track_list_k_queue;
	while (list != NULL) {
		if (list == &queue || list == &queue_s) {
			count++;
		}
		list = SYS_PORT_TRACK_NEXT((struct k_queue *)list);
	}
	zassert_equal(count, 2, "Wrong number of queue objects");
}

void test_main(void)
{
	ztest_test_suite(obj_tracking,
			 ztest_unit_test(test_obj_tracking_sanity)
			 );

	ztest_run_test_suite(obj_tracking);
}
