| #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; |