18template <
typename T1,
typename T2>
20#pragma GCC diagnostic push
21#pragma GCC diagnostic ignored "-Wsign-compare"
23#pragma GCC diagnostic pop
24 if constexpr (std::is_convertible_v<T1, uint64_t> &&
25 std::is_convertible_v<T2, uint64_t>) {
26 klog::Err(
"FAIL: {}. Expected {}, got {}", msg,
27 static_cast<uint64_t
>(val2),
static_cast<uint64_t
>(val1));
36template <
typename T1,
typename T2>
38#pragma GCC diagnostic push
39#pragma GCC diagnostic ignored "-Wsign-compare"
41#pragma GCC diagnostic pop
42 if constexpr (std::is_convertible_v<T1, uint64_t> &&
43 std::is_convertible_v<T2, uint64_t>) {
44 klog::Err(
"FAIL: {}. Expected not {}, got {}", msg,
45 static_cast<uint64_t
>(val2),
static_cast<uint64_t
>(val1));
54template <
typename T1,
typename T2>
56#pragma GCC diagnostic push
57#pragma GCC diagnostic ignored "-Wsign-compare"
59#pragma GCC diagnostic pop
60 if constexpr (std::is_convertible_v<T1, uint64_t> &&
61 std::is_convertible_v<T2, uint64_t>) {
62 klog::Err(
"FAIL: {}. Expected {} > {}", msg,
static_cast<uint64_t
>(val1),
63 static_cast<uint64_t
>(val2));
72template <
typename T1,
typename T2>
74#pragma GCC diagnostic push
75#pragma GCC diagnostic ignored "-Wsign-compare"
77#pragma GCC diagnostic pop
78 if constexpr (std::is_convertible_v<T1, uint64_t> &&
79 std::is_convertible_v<T2, uint64_t>) {
80 klog::Err(
"FAIL: {}. Expected {} < {}", msg,
static_cast<uint64_t
>(val1),
81 static_cast<uint64_t
>(val2));
90template <
typename T1,
typename T2>
92#pragma GCC diagnostic push
93#pragma GCC diagnostic ignored "-Wsign-compare"
94 if (!(val1 >= val2)) {
95#pragma GCC diagnostic pop
96 if constexpr (std::is_convertible_v<T1, uint64_t> &&
97 std::is_convertible_v<T2, uint64_t>) {
98 klog::Err(
"FAIL: {}. Expected {} >= {}", msg,
static_cast<uint64_t
>(val1),
99 static_cast<uint64_t
>(val2));
108template <
typename T1,
typename T2>
110#pragma GCC diagnostic push
111#pragma GCC diagnostic ignored "-Wsign-compare"
112 if (!(val1 <= val2)) {
113#pragma GCC diagnostic pop
114 if constexpr (std::is_convertible_v<T1, uint64_t> &&
115 std::is_convertible_v<T2, uint64_t>) {
116 klog::Err(
"FAIL: {}. Expected {} <= {}", msg,
static_cast<uint64_t
>(val1),
117 static_cast<uint64_t
>(val2));
126#define EXPECT_EQ(val1, val2, msg) \
127 if (!expect_eq_helper(val1, val2, msg)) { \
131#define EXPECT_NE(val1, val2, msg) \
132 if (!expect_ne_helper(val1, val2, msg)) { \
136#define EXPECT_GT(val1, val2, msg) \
137 if (!expect_gt_helper(val1, val2, msg)) { \
141#define EXPECT_LT(val1, val2, msg) \
142 if (!expect_lt_helper(val1, val2, msg)) { \
146#define EXPECT_GE(val1, val2, msg) \
147 if (!expect_ge_helper(val1, val2, msg)) { \
151#define EXPECT_LE(val1, val2, msg) \
152 if (!expect_le_helper(val1, val2, msg)) { \
156#define EXPECT_TRUE(cond, msg) \
158 klog::Err("FAIL: {}", msg); \
162#define EXPECT_FALSE(cond, msg) \
164 klog::Err("FAIL: {}", msg); \
196inline void QemuExit([[maybe_unused]]
bool success) {
200 volatile auto* finisher =
reinterpret_cast<volatile uint32_t*
>(0x100000);
201 *finisher = success ? 0x5555 : 0x3333;
202#elif defined(__x86_64__)
206 uint32_t code = success ? 0 : 1;
207 asm volatile(
"outl %0, %1" ::
"a"(code),
"Nd"(
static_cast<uint16_t
>(0xf4)));
208#elif defined(__aarch64__)
211 register uint64_t x0
asm(
"x0") = 0x84000008;
212 asm volatile(
"hvc #0" :
"+r"(x0));
214 __builtin_unreachable();
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
auto ramfs_system_test() -> bool
bool expect_ge_helper(const T1 &val1, const T2 &val2, const char *msg)
auto idle_scheduler_test() -> bool
auto interrupt_test() -> bool
void QemuExit(bool success)
测试结束后退出 QEMU,success=true 表示全部通过
auto exit_system_test() -> bool
Exit 系统测试入口
auto wait_system_test() -> bool
Wait 系统测试入口
auto rr_scheduler_test() -> bool
auto clone_system_test() -> bool
bool expect_le_helper(const T1 &val1, const T2 &val2, const char *msg)
bool expect_gt_helper(const T1 &val1, const T2 &val2, const char *msg)
auto user_task_test() -> bool
auto thread_group_system_test() -> bool
线程组系统测试入口
bool expect_ne_helper(const T1 &val1, const T2 &val2, const char *msg)
auto mutex_test() -> bool
auto virtual_memory_test() -> bool
auto fatfs_system_test() -> bool
bool expect_eq_helper(const T1 &val1, const T2 &val2, const char *msg)
auto fifo_scheduler_test() -> bool
auto cfs_scheduler_test() -> bool
auto spinlock_test() -> bool
bool expect_lt_helper(const T1 &val1, const T2 &val2, const char *msg)
auto memory_test() -> bool
auto kernel_task_test() -> bool
auto ctor_dtor_test() -> bool