blob: 59c8b215c47af1a3f8a8d6b8d70a3543a5745f56 [file] [log] [blame]
#pragma once
/*
* 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 = 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;