File: MozHelpers.h

package info (click to toggle)
firefox 149.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,767,760 kB
  • sloc: cpp: 7,416,064; javascript: 6,752,859; ansic: 3,774,850; python: 1,250,473; xml: 641,578; asm: 439,191; java: 186,617; sh: 56,634; makefile: 18,856; objc: 13,092; perl: 12,763; pascal: 5,960; yacc: 4,583; cs: 3,846; lex: 1,720; ruby: 1,002; php: 436; lisp: 258; awk: 105; sql: 66; sed: 53; csh: 10; exp: 6
file content (137 lines) | stat: -rw-r--r-- 4,293 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#ifndef TESTING_GTEST_MOZILLA_HELPERS_H_
#define TESTING_GTEST_MOZILLA_HELPERS_H_

#include "gtest/gtest.h"

#include "mozilla/UniquePtr.h"
#include "nsCOMPtr.h"
#include "nsServiceManagerUtils.h"
#include "nsICrashReporter.h"

#if defined(DEBUG) && !defined(XP_WIN) && !defined(ANDROID)
#  define HAS_GDB_SLEEP_DURATION 1
extern unsigned int _gdb_sleep_duration;
#endif

namespace mozilla::gtest {

#if defined(HAS_GDB_SLEEP_DURATION)
#  define ZERO_GDB_SLEEP() _gdb_sleep_duration = 0;

#  define SAVE_GDB_SLEEP(v)  \
    v = _gdb_sleep_duration; \
    ZERO_GDB_SLEEP();
#  define RESTORE_GDB_SLEEP(v) _gdb_sleep_duration = v;

// Some use needs to be in the global namespace
#  define SAVE_GDB_SLEEP_GLOBAL(v) \
    v = ::_gdb_sleep_duration;     \
    ZERO_GDB_SLEEP();
#  define RESTORE_GDB_SLEEP_GLOBAL(v) ::_gdb_sleep_duration = v;

#  define SAVE_GDB_SLEEP_LOCAL()          \
    unsigned int _old_gdb_sleep_duration; \
    SAVE_GDB_SLEEP(_old_gdb_sleep_duration);
#  define RESTORE_GDB_SLEEP_LOCAL() RESTORE_GDB_SLEEP(_old_gdb_sleep_duration);

#else  // defined(HAS_GDB_SLEEP_DURATION)

#  define ZERO_GDB_SLEEP() ;

#  define SAVE_GDB_SLEEP(v)
#  define SAVE_GDB_SLEEP_GLOBAL(v)
#  define SAVE_GDB_SLEEP_LOCAL()
#  define RESTORE_GDB_SLEEP(v)
#  define RESTORE_GDB_SLEEP_GLOBAL(v)
#  define RESTORE_GDB_SLEEP_LOCAL()
#endif  // defined(HAS_GDB_SLEEP_DURATION)

// Death tests are too slow on OSX because of the system crash reporter.
#if !defined(XP_DARWIN)
// Wrap ASSERT_DEATH_IF_SUPPORTED to disable the crash reporter
// when entering the subprocess, so that the expected crashes don't
// create a minidump that the gtest harness will interpret as an error.
#  define ASSERT_DEATH_WRAP(a, b)                 \
    ASSERT_DEATH_IF_SUPPORTED(                    \
        {                                         \
          mozilla::gtest::DisableCrashReporter(); \
          a;                                      \
        },                                        \
        b)

// Wrap EXPECT_DEATH_* macros to also disable the crash reporter.
#  define EXPECT_DEATH_WRAP(a, b)                 \
    EXPECT_DEATH_IF_SUPPORTED(                    \
        {                                         \
          mozilla::gtest::DisableCrashReporter(); \
          a;                                      \
        },                                        \
        b)
#  define EXPECT_DEBUG_DEATH_WRAP(a, b)           \
    EXPECT_DEBUG_DEATH(                           \
        {                                         \
          mozilla::gtest::DisableCrashReporter(); \
          a;                                      \
        },                                        \
        b)
#else
#  define ASSERT_DEATH_WRAP(a, b)
#  define EXPECT_DEATH_WRAP(a, b)
#  define EXPECT_DEBUG_DEATH_WRAP(a, b)
#endif

void DisableCrashReporter();

/**
 * Exit mode used for ScopedTestResultReporter.
 */
enum class ExitMode {
  // The user of the reporter handles exit.
  NoExit,
  // As the reporter goes out of scope, exit with ExitCode().
  ExitOnDtor,
};

/**
 * Status used by ScopedTestResultReporter.
 */
enum class TestResultStatus : int {
  Pass = 0,
  NonFatalFailure = 1,
  FatalFailure = 2,
};

inline int ExitCode(TestResultStatus aStatus) {
  return static_cast<int>(aStatus);
}

/**
 * This is a helper that reports test results to stderr in death test child
 * processes, since that is normally disabled by default (with no way of
 * enabling).
 *
 * Note that for this to work as intended the death test child has to, on
 * failure, exit with an exit code that is unexpected to the death test parent,
 * so the parent can mark the test case as failed.
 *
 * If the parent expects a graceful exit (code 0), ExitCode() can be used with
 * Status() to exit the child process.
 *
 * For simplicity the reporter can exit automatically as it goes out of scope,
 * when created with ExitMode::ExitOnDtor.
 */
class ScopedTestResultReporter {
 public:
  virtual ~ScopedTestResultReporter() = default;

  /**
   * The aggregate status of all observed test results.
   */
  virtual TestResultStatus Status() const = 0;

  static UniquePtr<ScopedTestResultReporter> Create(ExitMode aExitMode);
};

}  // namespace mozilla::gtest

#endif  // TESTING_GTEST_MOZILLA_HELPERS_H_