/*
 * 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];

ZTEST(obj_tracking, test_obj_tracking_sanity)
{
	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");
}

ZTEST_SUITE(obj_tracking, NULL, NULL, NULL, NULL, NULL);
