1 | //===-- Simple checkers for integrations tests ------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLVM_LIBC_UTILS_INTEGRATION_TEST_TEST_H |
10 | #define LLVM_LIBC_UTILS_INTEGRATION_TEST_TEST_H |
11 | |
12 | #include "src/__support/OSUtil/io.h" |
13 | #include "src/__support/OSUtil/quick_exit.h" |
14 | |
15 | #define __AS_STRING(val) #val |
16 | #define __CHECK_TRUE(file, line, val, should_exit) \ |
17 | if (!(val)) { \ |
18 | LIBC_NAMESPACE::write_to_stderr(file ":" __AS_STRING( \ |
19 | line) ": Expected '" #val "' to be true, but is false\n"); \ |
20 | if (should_exit) \ |
21 | LIBC_NAMESPACE::quick_exit(127); \ |
22 | } |
23 | |
24 | #define __CHECK_FALSE(file, line, val, should_exit) \ |
25 | if (val) { \ |
26 | LIBC_NAMESPACE::write_to_stderr(file ":" __AS_STRING( \ |
27 | line) ": Expected '" #val "' to be false, but is true\n"); \ |
28 | if (should_exit) \ |
29 | LIBC_NAMESPACE::quick_exit(127); \ |
30 | } |
31 | |
32 | #define __CHECK_EQ(file, line, val1, val2, should_exit) \ |
33 | if ((val1) != (val2)) { \ |
34 | LIBC_NAMESPACE::write_to_stderr(file ":" __AS_STRING( \ |
35 | line) ": Expected '" #val1 "' to be equal to '" #val2 "'\n"); \ |
36 | if (should_exit) \ |
37 | LIBC_NAMESPACE::quick_exit(127); \ |
38 | } |
39 | |
40 | #define __CHECK_NE(file, line, val1, val2, should_exit) \ |
41 | if ((val1) == (val2)) { \ |
42 | LIBC_NAMESPACE::write_to_stderr(file ":" __AS_STRING( \ |
43 | line) ": Expected '" #val1 "' to not be equal to '" #val2 "'\n"); \ |
44 | if (should_exit) \ |
45 | LIBC_NAMESPACE::quick_exit(127); \ |
46 | } |
47 | |
48 | //////////////////////////////////////////////////////////////////////////////// |
49 | // Boolean checks are handled as comparison to the true / false values. |
50 | |
51 | #define EXPECT_TRUE(val) __CHECK_TRUE(__FILE__, __LINE__, val, false) |
52 | #define ASSERT_TRUE(val) __CHECK_TRUE(__FILE__, __LINE__, val, true) |
53 | #define EXPECT_FALSE(val) __CHECK_FALSE(__FILE__, __LINE__, val, false) |
54 | #define ASSERT_FALSE(val) __CHECK_FALSE(__FILE__, __LINE__, val, true) |
55 | |
56 | //////////////////////////////////////////////////////////////////////////////// |
57 | // Binary equality / inequality. |
58 | |
59 | #define EXPECT_EQ(val1, val2) \ |
60 | __CHECK_EQ(__FILE__, __LINE__, (val1), (val2), false) |
61 | #define ASSERT_EQ(val1, val2) \ |
62 | __CHECK_EQ(__FILE__, __LINE__, (val1), (val2), true) |
63 | #define EXPECT_NE(val1, val2) \ |
64 | __CHECK_NE(__FILE__, __LINE__, (val1), (val2), false) |
65 | #define ASSERT_NE(val1, val2) \ |
66 | __CHECK_NE(__FILE__, __LINE__, (val1), (val2), true) |
67 | |
68 | //////////////////////////////////////////////////////////////////////////////// |
69 | // Errno checks. |
70 | |
71 | #define ASSERT_ERRNO_EQ(VAL) \ |
72 | ASSERT_EQ(VAL, static_cast<int>(LIBC_NAMESPACE::libc_errno)) |
73 | #define ASSERT_ERRNO_SUCCESS() \ |
74 | ASSERT_EQ(0, static_cast<int>(LIBC_NAMESPACE::libc_errno)) |
75 | #define ASSERT_ERRNO_FAILURE() \ |
76 | ASSERT_NE(0, static_cast<int>(LIBC_NAMESPACE::libc_errno)) |
77 | |
78 | // Integration tests are compiled with -ffreestanding which stops treating |
79 | // the main function as a non-overloadable special function. Hence, we use a |
80 | // convenience macro which declares it 'extern "C"'. |
81 | // |
82 | // When we are able to reuse the unit test infrastructure for integration |
83 | // tests, then we should not need to explicitly declare/define the main |
84 | // function in individual integration tests. We will not need this macro |
85 | // then. |
86 | #define TEST_MAIN extern "C" int main |
87 | |
88 | #endif // LLVM_LIBC_UTILS_INTEGRATION_TEST_TEST_H |
89 | |