| #pragma once |
| |
| /* |
| * Header file with infrastructure needed for kernel unit tests: |
| * - Assertion functions. |
| * - Test structures. |
| */ |
| |
| #include <common.h> |
| #include <stdio.h> |
| #include <stdbool.h> |
| #include <kmalloc.h> |
| #include <arch/arch.h> |
| #include <time.h> |
| #include <sys/queue.h> |
| |
| /* Macros for assertions. |
| */ |
| #define KT_ASSERT(test) \ |
| KT_ASSERT_M("", test) |
| |
| #define KT_ASSERT_M(message, test) \ |
| do { \ |
| if (!(test)) { \ |
| char fmt[] = "Assertion failure in %s() at %s:%d: %s"; \ |
| snprintf(ktest_msg, sizeof(ktest_msg), fmt, __FUNCTION__, \ |
| __FILE__, __LINE__, message); \ |
| return false; \ |
| } \ |
| } while (0) |
| |
| struct ktest { |
| 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. |
| }; |
| |
| struct ktest_suite { |
| SLIST_ENTRY(ktest_suite) link; |
| char name[256]; |
| struct ktest *ktests; |
| int num_ktests; |
| }; |
| |
| #define KTEST_SUITE(name) \ |
| static struct ktest_suite ktest_suite = {{}, name, NULL, 0}; |
| |
| #define KTEST_REG(name, config) \ |
| {"test_" #name, test_##name, is_defined(config)} |
| |
| #define REGISTER_KTESTS(ktests, num_ktests) \ |
| do { \ |
| ktest_suite.ktests = ktests; \ |
| ktest_suite.num_ktests = num_ktests; \ |
| register_ktest_suite(&ktest_suite); \ |
| } while (0) |
| |
| /* Global string used to report info about the last completed test */ |
| extern char ktest_msg[1024]; |
| |
| void register_ktest_suite(struct ktest_suite *suite); |
| void run_ktest_suite(struct ktest_suite *suite); |
| void run_registered_ktest_suites(); |