xref: /llvm-project/libc/test/UnitTest/ExecuteFunction.h (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
1e3645eadSSiva Chandra Reddy //===-- ExecuteFunction.h ---------------------------------------*- C++ -*-===//
2e3645eadSSiva Chandra Reddy //
3e3645eadSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e3645eadSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5e3645eadSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e3645eadSSiva Chandra Reddy //
7e3645eadSSiva Chandra Reddy //===----------------------------------------------------------------------===//
8e3645eadSSiva Chandra Reddy 
9330793c9SNick Desaulniers #ifndef LLVM_LIBC_TEST_UNITTEST_EXECUTEFUNCTION_H
10330793c9SNick Desaulniers #define LLVM_LIBC_TEST_UNITTEST_EXECUTEFUNCTION_H
11e3645eadSSiva Chandra Reddy 
12*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h"
13e3645eadSSiva Chandra Reddy #include <stdint.h>
14e3645eadSSiva Chandra Reddy 
15*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL {
16e3645eadSSiva Chandra Reddy namespace testutils {
17e3645eadSSiva Chandra Reddy 
18e3645eadSSiva Chandra Reddy class FunctionCaller {
19e3645eadSSiva Chandra Reddy public:
20e3645eadSSiva Chandra Reddy   virtual ~FunctionCaller() {}
21e3645eadSSiva Chandra Reddy   virtual void operator()() = 0;
22e3645eadSSiva Chandra Reddy };
23e3645eadSSiva Chandra Reddy 
24e3645eadSSiva Chandra Reddy struct ProcessStatus {
25e3645eadSSiva Chandra Reddy   int platform_defined;
26e3645eadSSiva Chandra Reddy   const char *failure = nullptr;
27e3645eadSSiva Chandra Reddy 
28e3645eadSSiva Chandra Reddy   static constexpr unsigned TIMEOUT = ~0U;
29e3645eadSSiva Chandra Reddy 
30e3645eadSSiva Chandra Reddy   static ProcessStatus error(const char *error) { return {0, error}; }
31e3645eadSSiva Chandra Reddy   static ProcessStatus timed_out_ps() {
32e3645eadSSiva Chandra Reddy     return {0, reinterpret_cast<const char *>(TIMEOUT)};
33e3645eadSSiva Chandra Reddy   }
34e3645eadSSiva Chandra Reddy 
35e3645eadSSiva Chandra Reddy   bool timed_out() const {
36e3645eadSSiva Chandra Reddy     return failure == reinterpret_cast<const char *>(TIMEOUT);
37e3645eadSSiva Chandra Reddy   }
38e3645eadSSiva Chandra Reddy   const char *get_error() const { return timed_out() ? nullptr : failure; }
39e3645eadSSiva Chandra Reddy   bool exited_normally();
40e3645eadSSiva Chandra Reddy   int get_exit_code();
41e3645eadSSiva Chandra Reddy   int get_fatal_signal();
42e3645eadSSiva Chandra Reddy };
43e3645eadSSiva Chandra Reddy 
44e3645eadSSiva Chandra Reddy ProcessStatus
45e3645eadSSiva Chandra Reddy invoke_in_subprocess(FunctionCaller *func,
46e3645eadSSiva Chandra Reddy                      unsigned timeout_ms = ProcessStatus::TIMEOUT);
47e3645eadSSiva Chandra Reddy 
48e3645eadSSiva Chandra Reddy const char *signal_as_string(int signum);
49e3645eadSSiva Chandra Reddy 
50e3645eadSSiva Chandra Reddy } // namespace testutils
51*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL
52e3645eadSSiva Chandra Reddy 
53330793c9SNick Desaulniers #endif // LLVM_LIBC_TEST_UNITTEST_EXECUTEFUNCTION_H
54