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