1 | //===-- Implementation of libc death test executors -----------------------===// |
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 | #include "LibcTest.h" |
10 | |
11 | #include "src/__support/macros/config.h" |
12 | #include "test/UnitTest/ExecuteFunction.h" |
13 | #include "test/UnitTest/TestLogger.h" |
14 | |
15 | #include <assert.h> |
16 | |
17 | namespace { |
18 | constexpr unsigned TIMEOUT_MS = 10000; |
19 | } // Anonymous namespace |
20 | |
21 | namespace LIBC_NAMESPACE_DECL { |
22 | namespace testing { |
23 | |
24 | bool Test::testProcessKilled(testutils::FunctionCaller *Func, int Signal, |
25 | const char *LHSStr, const char *RHSStr, |
26 | internal::Location Loc) { |
27 | testutils::ProcessStatus Result = |
28 | testutils::invoke_in_subprocess(Func, TIMEOUT_MS); |
29 | |
30 | if (const char *error = Result.get_error()) { |
31 | Ctx->markFail(); |
32 | tlog << Loc; |
33 | tlog << error << '\n'; |
34 | return false; |
35 | } |
36 | |
37 | if (Result.timed_out()) { |
38 | Ctx->markFail(); |
39 | tlog << Loc; |
40 | tlog << "Process timed out after " << TIMEOUT_MS << " milliseconds.\n" ; |
41 | return false; |
42 | } |
43 | |
44 | if (Result.exited_normally()) { |
45 | Ctx->markFail(); |
46 | tlog << Loc; |
47 | tlog << "Expected " << LHSStr |
48 | << " to be killed by a signal\nBut it exited normally!\n" ; |
49 | return false; |
50 | } |
51 | |
52 | int KilledBy = Result.get_fatal_signal(); |
53 | assert(KilledBy != 0 && "Not killed by any signal" ); |
54 | if (Signal == -1 || KilledBy == Signal) |
55 | return true; |
56 | |
57 | using testutils::signal_as_string; |
58 | Ctx->markFail(); |
59 | tlog << Loc; |
60 | tlog << " Expected: " << LHSStr << '\n' |
61 | << "To be killed by signal: " << Signal << '\n' |
62 | << " Which is: " << signal_as_string(Signal) << '\n' |
63 | << " But it was killed by: " << KilledBy << '\n' |
64 | << " Which is: " << signal_as_string(KilledBy) << '\n'; |
65 | return false; |
66 | } |
67 | |
68 | bool Test::testProcessExits(testutils::FunctionCaller *Func, int ExitCode, |
69 | const char *LHSStr, const char *RHSStr, |
70 | internal::Location Loc) { |
71 | testutils::ProcessStatus Result = |
72 | testutils::invoke_in_subprocess(Func, TIMEOUT_MS); |
73 | |
74 | if (const char *error = Result.get_error()) { |
75 | Ctx->markFail(); |
76 | tlog << Loc; |
77 | tlog << error << '\n'; |
78 | return false; |
79 | } |
80 | |
81 | if (Result.timed_out()) { |
82 | Ctx->markFail(); |
83 | tlog << Loc; |
84 | tlog << "Process timed out after " << TIMEOUT_MS << " milliseconds.\n" ; |
85 | return false; |
86 | } |
87 | |
88 | if (!Result.exited_normally()) { |
89 | Ctx->markFail(); |
90 | tlog << Loc; |
91 | tlog << "Expected " << LHSStr << '\n' |
92 | << "to exit with exit code " << ExitCode << '\n' |
93 | << "But it exited abnormally!\n" ; |
94 | return false; |
95 | } |
96 | |
97 | int ActualExit = Result.get_exit_code(); |
98 | if (ActualExit == ExitCode) |
99 | return true; |
100 | |
101 | Ctx->markFail(); |
102 | tlog << Loc; |
103 | tlog << "Expected exit code of: " << LHSStr << '\n' |
104 | << " Which is: " << ActualExit << '\n' |
105 | << " To be equal to: " << RHSStr << '\n' |
106 | << " Which is: " << ExitCode << '\n'; |
107 | return false; |
108 | } |
109 | |
110 | } // namespace testing |
111 | } // namespace LIBC_NAMESPACE_DECL |
112 | |