xref: /aosp_15_r20/external/llvm-libc/test/UnitTest/ExecuteFunction.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===-- ExecuteFunction.h ---------------------------------------*- 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_TEST_UNITTEST_EXECUTEFUNCTION_H
10 #define LLVM_LIBC_TEST_UNITTEST_EXECUTEFUNCTION_H
11 
12 #include "src/__support/macros/config.h"
13 #include <stdint.h>
14 
15 namespace LIBC_NAMESPACE_DECL {
16 namespace testutils {
17 
18 class FunctionCaller {
19 public:
~FunctionCaller()20   virtual ~FunctionCaller() {}
21   virtual void operator()() = 0;
22 };
23 
24 struct ProcessStatus {
25   int platform_defined;
26   const char *failure = nullptr;
27 
28   static constexpr unsigned TIMEOUT = ~0U;
29 
errorProcessStatus30   static ProcessStatus error(const char *error) { return {0, error}; }
timed_out_psProcessStatus31   static ProcessStatus timed_out_ps() {
32     return {0, reinterpret_cast<const char *>(TIMEOUT)};
33   }
34 
timed_outProcessStatus35   bool timed_out() const {
36     return failure == reinterpret_cast<const char *>(TIMEOUT);
37   }
get_errorProcessStatus38   const char *get_error() const { return timed_out() ? nullptr : failure; }
39   bool exited_normally();
40   int get_exit_code();
41   int get_fatal_signal();
42 };
43 
44 ProcessStatus
45 invoke_in_subprocess(FunctionCaller *func,
46                      unsigned timeout_ms = ProcessStatus::TIMEOUT);
47 
48 const char *signal_as_string(int signum);
49 
50 } // namespace testutils
51 } // namespace LIBC_NAMESPACE_DECL
52 
53 #endif // LLVM_LIBC_TEST_UNITTEST_EXECUTEFUNCTION_H
54