#ifndef ROS_INC_TEST_INFRASTRUCTURE_H
#define ROS_INC_TEST_INFRASTRUCTURE_H

/*
 * Header file with infrastructure needed for kernel unit tests:
 *  - Assertion functions.
 *  - Test structures.
 */

#include <stdio.h>
#include <kmalloc.h>

/* Macros for assertions. 
 * They depend on <stdbool.h> and printk() to be included in the source file. 
 */
#define KT_ASSERT_M(message, test)                                               \
	do {                                                                         \
		if (!(test)) {                                                           \
			extern char *kern_test_msg;                                          \
			char prefix[] = "Assertion failed: ";                                \
			int msg_size = sizeof(prefix) + sizeof(message) - 1;                 \
			kern_test_msg = (char*) kmalloc(msg_size, 0);                        \
			snprintf(kern_test_msg, msg_size, "%s%s", prefix, message);          \
			return false;                                                        \
		}                                                                        \
	} while (0)

#define KT_ASSERT(test)                                                          \
	do {                                                                         \
		if (!(test)) {                                                           \
			return false;                                                        \
		}                                                                        \
	} while (0)


/* Postboot kernel tests: tests ran after boot in kernel mode. */

struct pb_kernel_test {
	char name[256]; // Name of the test function.
	bool (*func)(void); // Name of the test function, should be equal to 'name'.
	bool enabled; // Whether to run or not the test.
};

/* A macro for testing if another macro has been #defined or not.  Can be used
 * wherever you need a boolean defined.  Returns 0 or 1. */
#define is_defined(macro) is_defined_(macro)
#define is_defined_test_1 ,
#define is_defined_(value) is_defined__(is_defined_test_##value, value)
#define is_defined__(comma, value) is_defined___(comma value, 0)
#define is_defined___(_, v, ...) v

/* Macro for registering a postboot kernel test. */
#define PB_K_TEST_REG(name, config) \
	{"test_" #name, test_##name, is_defined(config)}

extern struct pb_kernel_test pb_kernel_tests[];
extern int num_pb_kernel_tests;

#endif // ROS_INC_TEST_INFRASTRUCTURE_H
