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

#include <zephyr/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);
K_EVENT_DEFINE(event_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;
	struct k_event event;
	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");

	k_event_init(&event);
	count = 0;
	list = _track_list_k_event;
	while (list != NULL) {
		if (list == &event || list == &event_s) {
			count++;
		}
		list = SYS_PORT_TRACK_NEXT((struct k_event *)list);
	}
	zassert_equal(count, 2, "Wrong number of queue objects");


}

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