xref: /aosp_15_r20/external/cronet/base/test/test_suite.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/test/test_suite.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <signal.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <algorithm>
10*6777b538SAndroid Build Coastguard Worker #include <memory>
11*6777b538SAndroid Build Coastguard Worker #include <string>
12*6777b538SAndroid Build Coastguard Worker #include <string_view>
13*6777b538SAndroid Build Coastguard Worker #include <vector>
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #include "base/at_exit.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/base_paths.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/base_switches.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/command_line.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/debug/asan_service.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/debug/debugger.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/debug/profiler.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/debug/stack_trace.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/feature_list.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/files/file_util.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
27*6777b538SAndroid Build Coastguard Worker #include "base/i18n/icu_util.h"
28*6777b538SAndroid Build Coastguard Worker #include "base/i18n/rtl.h"
29*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
30*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
31*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
32*6777b538SAndroid Build Coastguard Worker #include "base/metrics/statistics_recorder.h"
33*6777b538SAndroid Build Coastguard Worker #include "base/no_destructor.h"
34*6777b538SAndroid Build Coastguard Worker #include "base/path_service.h"
35*6777b538SAndroid Build Coastguard Worker #include "base/process/launch.h"
36*6777b538SAndroid Build Coastguard Worker #include "base/process/memory.h"
37*6777b538SAndroid Build Coastguard Worker #include "base/process/process.h"
38*6777b538SAndroid Build Coastguard Worker #include "base/process/process_handle.h"
39*6777b538SAndroid Build Coastguard Worker #include "base/strings/strcat.h"
40*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
41*6777b538SAndroid Build Coastguard Worker #include "base/task/thread_pool/thread_pool_instance.h"
42*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_xml_unittest_result_printer.h"
43*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_xml_util.h"
44*6777b538SAndroid Build Coastguard Worker #include "base/test/icu_test_util.h"
45*6777b538SAndroid Build Coastguard Worker #include "base/test/launcher/unit_test_launcher.h"
46*6777b538SAndroid Build Coastguard Worker #include "base/test/mock_entropy_provider.h"
47*6777b538SAndroid Build Coastguard Worker #include "base/test/multiprocess_test.h"
48*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_feature_list.h"
49*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_run_loop_timeout.h"
50*6777b538SAndroid Build Coastguard Worker #include "base/test/test_switches.h"
51*6777b538SAndroid Build Coastguard Worker #include "base/test/test_timeouts.h"
52*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
53*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
54*6777b538SAndroid Build Coastguard Worker #include "base/tracing_buildflags.h"
55*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
56*6777b538SAndroid Build Coastguard Worker #include "partition_alloc/partition_alloc_buildflags.h"
57*6777b538SAndroid Build Coastguard Worker #include "partition_alloc/tagging.h"
58*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
59*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
60*6777b538SAndroid Build Coastguard Worker #include "testing/multiprocess_func_list.h"
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
63*6777b538SAndroid Build Coastguard Worker #include "base/apple/scoped_nsautorelease_pool.h"
64*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_APPLE)
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS)
67*6777b538SAndroid Build Coastguard Worker #include "base/test/test_listener_ios.h"
68*6777b538SAndroid Build Coastguard Worker #include "base/test/test_support_ios.h"
69*6777b538SAndroid Build Coastguard Worker #else
70*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
71*6777b538SAndroid Build Coastguard Worker #include "third_party/icu/source/common/unicode/uloc.h"
72*6777b538SAndroid Build Coastguard Worker #endif
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
75*6777b538SAndroid Build Coastguard Worker #include "base/test/test_support_android.h"
76*6777b538SAndroid Build Coastguard Worker #endif
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
79*6777b538SAndroid Build Coastguard Worker #include "third_party/test_fonts/fontconfig/fontconfig_util_linux.h"
80*6777b538SAndroid Build Coastguard Worker #endif
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
83*6777b538SAndroid Build Coastguard Worker #include "base/fuchsia/system_info.h"
84*6777b538SAndroid Build Coastguard Worker #endif
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
87*6777b538SAndroid Build Coastguard Worker #if defined(_DEBUG)
88*6777b538SAndroid Build Coastguard Worker #include <crtdbg.h>
89*6777b538SAndroid Build Coastguard Worker #endif  // _DEBUG
90*6777b538SAndroid Build Coastguard Worker #include <windows.h>
91*6777b538SAndroid Build Coastguard Worker 
92*6777b538SAndroid Build Coastguard Worker #include "base/debug/handle_hooks_win.h"
93*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN)
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PARTITION_ALLOC)
96*6777b538SAndroid Build Coastguard Worker #include "base/allocator/partition_alloc_support.h"
97*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(USE_PARTITION_ALLOC)
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
100*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h"
101*6777b538SAndroid Build Coastguard Worker #endif
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker namespace base {
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker namespace {
106*6777b538SAndroid Build Coastguard Worker 
107*6777b538SAndroid Build Coastguard Worker // Returns true if the test is marked as "MAYBE_".
108*6777b538SAndroid Build Coastguard Worker // When using different prefixes depending on platform, we use MAYBE_ and
109*6777b538SAndroid Build Coastguard Worker // preprocessor directives to replace MAYBE_ with the target prefix.
IsMarkedMaybe(const testing::TestInfo & test)110*6777b538SAndroid Build Coastguard Worker bool IsMarkedMaybe(const testing::TestInfo& test) {
111*6777b538SAndroid Build Coastguard Worker   return strncmp(test.name(), "MAYBE_", 6) == 0;
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker 
114*6777b538SAndroid Build Coastguard Worker class DisableMaybeTests : public testing::EmptyTestEventListener {
115*6777b538SAndroid Build Coastguard Worker  public:
OnTestStart(const testing::TestInfo & test_info)116*6777b538SAndroid Build Coastguard Worker   void OnTestStart(const testing::TestInfo& test_info) override {
117*6777b538SAndroid Build Coastguard Worker     ASSERT_FALSE(IsMarkedMaybe(test_info))
118*6777b538SAndroid Build Coastguard Worker         << "Probably the OS #ifdefs don't include all of the necessary "
119*6777b538SAndroid Build Coastguard Worker            "platforms.\nPlease ensure that no tests have the MAYBE_ prefix "
120*6777b538SAndroid Build Coastguard Worker            "after the code is preprocessed.";
121*6777b538SAndroid Build Coastguard Worker   }
122*6777b538SAndroid Build Coastguard Worker };
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker class ResetCommandLineBetweenTests : public testing::EmptyTestEventListener {
125*6777b538SAndroid Build Coastguard Worker  public:
ResetCommandLineBetweenTests()126*6777b538SAndroid Build Coastguard Worker   ResetCommandLineBetweenTests() : old_command_line_(CommandLine::NO_PROGRAM) {
127*6777b538SAndroid Build Coastguard Worker     // TODO(crbug.com/1123627): Remove this after A/B test is done.
128*6777b538SAndroid Build Coastguard Worker     // Workaround a test-specific race conditon with StatisticsRecorder lock
129*6777b538SAndroid Build Coastguard Worker     // initialization checking CommandLine by ensuring it's created here (when
130*6777b538SAndroid Build Coastguard Worker     // we start the test process), rather than in some arbitrary test. This
131*6777b538SAndroid Build Coastguard Worker     // prevents a race with OnTestEnd().
132*6777b538SAndroid Build Coastguard Worker     StatisticsRecorder::FindHistogram("Dummy");
133*6777b538SAndroid Build Coastguard Worker   }
134*6777b538SAndroid Build Coastguard Worker 
135*6777b538SAndroid Build Coastguard Worker   ResetCommandLineBetweenTests(const ResetCommandLineBetweenTests&) = delete;
136*6777b538SAndroid Build Coastguard Worker   ResetCommandLineBetweenTests& operator=(const ResetCommandLineBetweenTests&) =
137*6777b538SAndroid Build Coastguard Worker       delete;
138*6777b538SAndroid Build Coastguard Worker 
OnTestStart(const testing::TestInfo & test_info)139*6777b538SAndroid Build Coastguard Worker   void OnTestStart(const testing::TestInfo& test_info) override {
140*6777b538SAndroid Build Coastguard Worker     old_command_line_ = *CommandLine::ForCurrentProcess();
141*6777b538SAndroid Build Coastguard Worker   }
142*6777b538SAndroid Build Coastguard Worker 
OnTestEnd(const testing::TestInfo & test_info)143*6777b538SAndroid Build Coastguard Worker   void OnTestEnd(const testing::TestInfo& test_info) override {
144*6777b538SAndroid Build Coastguard Worker     *CommandLine::ForCurrentProcess() = old_command_line_;
145*6777b538SAndroid Build Coastguard Worker   }
146*6777b538SAndroid Build Coastguard Worker 
147*6777b538SAndroid Build Coastguard Worker  private:
148*6777b538SAndroid Build Coastguard Worker   CommandLine old_command_line_;
149*6777b538SAndroid Build Coastguard Worker };
150*6777b538SAndroid Build Coastguard Worker 
151*6777b538SAndroid Build Coastguard Worker // Initializes a base::test::ScopedFeatureList for each individual test, which
152*6777b538SAndroid Build Coastguard Worker // involves a FeatureList and a FieldTrialList, such that unit test don't need
153*6777b538SAndroid Build Coastguard Worker // to initialize them manually.
154*6777b538SAndroid Build Coastguard Worker class FeatureListScopedToEachTest : public testing::EmptyTestEventListener {
155*6777b538SAndroid Build Coastguard Worker  public:
156*6777b538SAndroid Build Coastguard Worker   FeatureListScopedToEachTest() = default;
157*6777b538SAndroid Build Coastguard Worker   ~FeatureListScopedToEachTest() override = default;
158*6777b538SAndroid Build Coastguard Worker 
159*6777b538SAndroid Build Coastguard Worker   FeatureListScopedToEachTest(const FeatureListScopedToEachTest&) = delete;
160*6777b538SAndroid Build Coastguard Worker   FeatureListScopedToEachTest& operator=(const FeatureListScopedToEachTest&) =
161*6777b538SAndroid Build Coastguard Worker       delete;
162*6777b538SAndroid Build Coastguard Worker 
OnTestStart(const testing::TestInfo & test_info)163*6777b538SAndroid Build Coastguard Worker   void OnTestStart(const testing::TestInfo& test_info) override {
164*6777b538SAndroid Build Coastguard Worker     const CommandLine* command_line = CommandLine::ForCurrentProcess();
165*6777b538SAndroid Build Coastguard Worker 
166*6777b538SAndroid Build Coastguard Worker     // We set up a FeatureList via ScopedFeatureList::InitFromCommandLine().
167*6777b538SAndroid Build Coastguard Worker     // This ensures that code using that API will not hit an error that it's
168*6777b538SAndroid Build Coastguard Worker     // not set. It will be cleared by ~ScopedFeatureList().
169*6777b538SAndroid Build Coastguard Worker 
170*6777b538SAndroid Build Coastguard Worker     // TestFeatureForBrowserTest1 and TestFeatureForBrowserTest2 used in
171*6777b538SAndroid Build Coastguard Worker     // ContentBrowserTestScopedFeatureListTest to ensure ScopedFeatureList keeps
172*6777b538SAndroid Build Coastguard Worker     // features from command line.
173*6777b538SAndroid Build Coastguard Worker     // TestBlinkFeatureDefault is used in RuntimeEnabledFeaturesTest to test a
174*6777b538SAndroid Build Coastguard Worker     // behavior with OverrideState::OVERIDE_USE_DEFAULT.
175*6777b538SAndroid Build Coastguard Worker     std::string enabled =
176*6777b538SAndroid Build Coastguard Worker         command_line->GetSwitchValueASCII(switches::kEnableFeatures);
177*6777b538SAndroid Build Coastguard Worker     std::string disabled =
178*6777b538SAndroid Build Coastguard Worker         command_line->GetSwitchValueASCII(switches::kDisableFeatures);
179*6777b538SAndroid Build Coastguard Worker     enabled += ",TestFeatureForBrowserTest1,*TestBlinkFeatureDefault";
180*6777b538SAndroid Build Coastguard Worker     disabled += ",TestFeatureForBrowserTest2";
181*6777b538SAndroid Build Coastguard Worker     scoped_feature_list_.InitFromCommandLine(enabled, disabled);
182*6777b538SAndroid Build Coastguard Worker 
183*6777b538SAndroid Build Coastguard Worker     // The enable-features and disable-features flags were just slurped into a
184*6777b538SAndroid Build Coastguard Worker     // FeatureList, so remove them from the command line. Tests should enable
185*6777b538SAndroid Build Coastguard Worker     // and disable features via the ScopedFeatureList API rather than
186*6777b538SAndroid Build Coastguard Worker     // command-line flags.
187*6777b538SAndroid Build Coastguard Worker     CommandLine new_command_line(command_line->GetProgram());
188*6777b538SAndroid Build Coastguard Worker     CommandLine::SwitchMap switches = command_line->GetSwitches();
189*6777b538SAndroid Build Coastguard Worker 
190*6777b538SAndroid Build Coastguard Worker     switches.erase(switches::kEnableFeatures);
191*6777b538SAndroid Build Coastguard Worker     switches.erase(switches::kDisableFeatures);
192*6777b538SAndroid Build Coastguard Worker 
193*6777b538SAndroid Build Coastguard Worker     for (const auto& iter : switches)
194*6777b538SAndroid Build Coastguard Worker       new_command_line.AppendSwitchNative(iter.first, iter.second);
195*6777b538SAndroid Build Coastguard Worker 
196*6777b538SAndroid Build Coastguard Worker     *CommandLine::ForCurrentProcess() = new_command_line;
197*6777b538SAndroid Build Coastguard Worker 
198*6777b538SAndroid Build Coastguard Worker     // TODO(https://crbug.com/1413674): Enable PartitionAlloc in unittests with
199*6777b538SAndroid Build Coastguard Worker     // ASAN.
200*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PARTITION_ALLOC) && !defined(ADDRESS_SANITIZER)
201*6777b538SAndroid Build Coastguard Worker     allocator::PartitionAllocSupport::Get()->ReconfigureAfterFeatureListInit(
202*6777b538SAndroid Build Coastguard Worker         "",
203*6777b538SAndroid Build Coastguard Worker         /*configure_dangling_pointer_detector=*/true);
204*6777b538SAndroid Build Coastguard Worker #endif
205*6777b538SAndroid Build Coastguard Worker   }
206*6777b538SAndroid Build Coastguard Worker 
OnTestEnd(const testing::TestInfo & test_info)207*6777b538SAndroid Build Coastguard Worker   void OnTestEnd(const testing::TestInfo& test_info) override {
208*6777b538SAndroid Build Coastguard Worker     scoped_feature_list_.Reset();
209*6777b538SAndroid Build Coastguard Worker   }
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker  private:
212*6777b538SAndroid Build Coastguard Worker   test::ScopedFeatureList scoped_feature_list_;
213*6777b538SAndroid Build Coastguard Worker };
214*6777b538SAndroid Build Coastguard Worker 
215*6777b538SAndroid Build Coastguard Worker class CheckForLeakedGlobals : public testing::EmptyTestEventListener {
216*6777b538SAndroid Build Coastguard Worker  public:
217*6777b538SAndroid Build Coastguard Worker   CheckForLeakedGlobals() = default;
218*6777b538SAndroid Build Coastguard Worker 
219*6777b538SAndroid Build Coastguard Worker   CheckForLeakedGlobals(const CheckForLeakedGlobals&) = delete;
220*6777b538SAndroid Build Coastguard Worker   CheckForLeakedGlobals& operator=(const CheckForLeakedGlobals&) = delete;
221*6777b538SAndroid Build Coastguard Worker 
222*6777b538SAndroid Build Coastguard Worker   // Check for leaks in individual tests.
OnTestStart(const testing::TestInfo & test)223*6777b538SAndroid Build Coastguard Worker   void OnTestStart(const testing::TestInfo& test) override {
224*6777b538SAndroid Build Coastguard Worker     feature_list_set_before_test_ = FeatureList::GetInstance();
225*6777b538SAndroid Build Coastguard Worker     thread_pool_set_before_test_ = ThreadPoolInstance::Get();
226*6777b538SAndroid Build Coastguard Worker   }
OnTestEnd(const testing::TestInfo & test)227*6777b538SAndroid Build Coastguard Worker   void OnTestEnd(const testing::TestInfo& test) override {
228*6777b538SAndroid Build Coastguard Worker     DCHECK_EQ(feature_list_set_before_test_, FeatureList::GetInstance())
229*6777b538SAndroid Build Coastguard Worker         << " in test " << test.test_suite_name() << "." << test.name();
230*6777b538SAndroid Build Coastguard Worker     DCHECK_EQ(thread_pool_set_before_test_, ThreadPoolInstance::Get())
231*6777b538SAndroid Build Coastguard Worker         << " in test " << test.test_suite_name() << "." << test.name();
232*6777b538SAndroid Build Coastguard Worker     feature_list_set_before_test_ = nullptr;
233*6777b538SAndroid Build Coastguard Worker     thread_pool_set_before_test_ = nullptr;
234*6777b538SAndroid Build Coastguard Worker   }
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker   // Check for leaks in test suites (consisting of one or more tests).
OnTestSuiteStart(const testing::TestSuite & test_suite)237*6777b538SAndroid Build Coastguard Worker   void OnTestSuiteStart(const testing::TestSuite& test_suite) override {
238*6777b538SAndroid Build Coastguard Worker     feature_list_set_before_suite_ = FeatureList::GetInstance();
239*6777b538SAndroid Build Coastguard Worker     thread_pool_set_before_suite_ = ThreadPoolInstance::Get();
240*6777b538SAndroid Build Coastguard Worker   }
OnTestSuiteEnd(const testing::TestSuite & test_suite)241*6777b538SAndroid Build Coastguard Worker   void OnTestSuiteEnd(const testing::TestSuite& test_suite) override {
242*6777b538SAndroid Build Coastguard Worker     DCHECK_EQ(feature_list_set_before_suite_, FeatureList::GetInstance())
243*6777b538SAndroid Build Coastguard Worker         << " in suite " << test_suite.name();
244*6777b538SAndroid Build Coastguard Worker     DCHECK_EQ(thread_pool_set_before_suite_, ThreadPoolInstance::Get())
245*6777b538SAndroid Build Coastguard Worker         << " in suite " << test_suite.name();
246*6777b538SAndroid Build Coastguard Worker     feature_list_set_before_suite_ = nullptr;
247*6777b538SAndroid Build Coastguard Worker     thread_pool_set_before_suite_ = nullptr;
248*6777b538SAndroid Build Coastguard Worker   }
249*6777b538SAndroid Build Coastguard Worker 
250*6777b538SAndroid Build Coastguard Worker  private:
251*6777b538SAndroid Build Coastguard Worker   raw_ptr<FeatureList, DanglingUntriaged> feature_list_set_before_test_ =
252*6777b538SAndroid Build Coastguard Worker       nullptr;
253*6777b538SAndroid Build Coastguard Worker   raw_ptr<FeatureList> feature_list_set_before_suite_ = nullptr;
254*6777b538SAndroid Build Coastguard Worker   raw_ptr<ThreadPoolInstance> thread_pool_set_before_test_ = nullptr;
255*6777b538SAndroid Build Coastguard Worker   raw_ptr<ThreadPoolInstance> thread_pool_set_before_suite_ = nullptr;
256*6777b538SAndroid Build Coastguard Worker };
257*6777b538SAndroid Build Coastguard Worker 
258*6777b538SAndroid Build Coastguard Worker // iOS: base::Process is not available.
259*6777b538SAndroid Build Coastguard Worker // macOS: Tests may run at background priority locally (crbug.com/1358639#c6) or
260*6777b538SAndroid Build Coastguard Worker // on bots (crbug.com/931721#c7).
261*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_APPLE)
262*6777b538SAndroid Build Coastguard Worker class CheckProcessPriority : public testing::EmptyTestEventListener {
263*6777b538SAndroid Build Coastguard Worker  public:
CheckProcessPriority()264*6777b538SAndroid Build Coastguard Worker   CheckProcessPriority() { CHECK(!IsProcessBackgrounded()); }
265*6777b538SAndroid Build Coastguard Worker 
266*6777b538SAndroid Build Coastguard Worker   CheckProcessPriority(const CheckProcessPriority&) = delete;
267*6777b538SAndroid Build Coastguard Worker   CheckProcessPriority& operator=(const CheckProcessPriority&) = delete;
268*6777b538SAndroid Build Coastguard Worker 
OnTestStart(const testing::TestInfo & test)269*6777b538SAndroid Build Coastguard Worker   void OnTestStart(const testing::TestInfo& test) override {
270*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(IsProcessBackgrounded());
271*6777b538SAndroid Build Coastguard Worker   }
OnTestEnd(const testing::TestInfo & test)272*6777b538SAndroid Build Coastguard Worker   void OnTestEnd(const testing::TestInfo& test) override {
273*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(IsProcessBackgrounded());
274*6777b538SAndroid Build Coastguard Worker   }
275*6777b538SAndroid Build Coastguard Worker 
276*6777b538SAndroid Build Coastguard Worker  private:
IsProcessBackgrounded() const277*6777b538SAndroid Build Coastguard Worker   bool IsProcessBackgrounded() const {
278*6777b538SAndroid Build Coastguard Worker     return Process::Current().GetPriority() == Process::Priority::kBestEffort;
279*6777b538SAndroid Build Coastguard Worker   }
280*6777b538SAndroid Build Coastguard Worker };
281*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_APPLE)
282*6777b538SAndroid Build Coastguard Worker 
GetProfileName()283*6777b538SAndroid Build Coastguard Worker const std::string& GetProfileName() {
284*6777b538SAndroid Build Coastguard Worker   static const NoDestructor<std::string> profile_name([]() {
285*6777b538SAndroid Build Coastguard Worker     const CommandLine& command_line = *CommandLine::ForCurrentProcess();
286*6777b538SAndroid Build Coastguard Worker     if (command_line.HasSwitch(switches::kProfilingFile))
287*6777b538SAndroid Build Coastguard Worker       return command_line.GetSwitchValueASCII(switches::kProfilingFile);
288*6777b538SAndroid Build Coastguard Worker     else
289*6777b538SAndroid Build Coastguard Worker       return std::string("test-profile-{pid}");
290*6777b538SAndroid Build Coastguard Worker   }());
291*6777b538SAndroid Build Coastguard Worker   return *profile_name;
292*6777b538SAndroid Build Coastguard Worker }
293*6777b538SAndroid Build Coastguard Worker 
InitializeLogging()294*6777b538SAndroid Build Coastguard Worker void InitializeLogging() {
295*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
296*6777b538SAndroid Build Coastguard Worker   constexpr auto kLoggingDest = logging::LOG_TO_STDERR;
297*6777b538SAndroid Build Coastguard Worker #else
298*6777b538SAndroid Build Coastguard Worker   constexpr auto kLoggingDest =
299*6777b538SAndroid Build Coastguard Worker       logging::LOG_TO_SYSTEM_DEBUG_LOG | logging::LOG_TO_STDERR;
300*6777b538SAndroid Build Coastguard Worker #endif
301*6777b538SAndroid Build Coastguard Worker   CHECK(logging::InitLogging({.logging_dest = kLoggingDest}));
302*6777b538SAndroid Build Coastguard Worker 
303*6777b538SAndroid Build Coastguard Worker   // We want process and thread IDs because we may have multiple processes.
304*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
305*6777b538SAndroid Build Coastguard Worker   // To view log output with IDs and timestamps use "adb logcat -v threadtime".
306*6777b538SAndroid Build Coastguard Worker   logging::SetLogItems(false, false, false, false);
307*6777b538SAndroid Build Coastguard Worker #else
308*6777b538SAndroid Build Coastguard Worker   // We want process and thread IDs because we may have multiple processes.
309*6777b538SAndroid Build Coastguard Worker   logging::SetLogItems(true, true, false, false);
310*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(IS_ANDROID)
311*6777b538SAndroid Build Coastguard Worker }
312*6777b538SAndroid Build Coastguard Worker 
313*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
314*6777b538SAndroid Build Coastguard Worker // Handlers for invalid parameter, pure call, and abort. They generate a
315*6777b538SAndroid Build Coastguard Worker // breakpoint to ensure that we get a call stack on these failures.
316*6777b538SAndroid Build Coastguard Worker // These functions should be written to be unique in order to avoid confusing
317*6777b538SAndroid Build Coastguard Worker // call stacks from /OPT:ICF function folding. Printing a unique message or
318*6777b538SAndroid Build Coastguard Worker // returning a unique value will do this. Note that for best results they need
319*6777b538SAndroid Build Coastguard Worker // to be unique from *all* functions in Chrome.
InvalidParameter(const wchar_t * expression,const wchar_t * function,const wchar_t * file,unsigned int line,uintptr_t reserved)320*6777b538SAndroid Build Coastguard Worker void InvalidParameter(const wchar_t* expression,
321*6777b538SAndroid Build Coastguard Worker                       const wchar_t* function,
322*6777b538SAndroid Build Coastguard Worker                       const wchar_t* file,
323*6777b538SAndroid Build Coastguard Worker                       unsigned int line,
324*6777b538SAndroid Build Coastguard Worker                       uintptr_t reserved) {
325*6777b538SAndroid Build Coastguard Worker   // CRT printed message is sufficient.
326*6777b538SAndroid Build Coastguard Worker   __debugbreak();
327*6777b538SAndroid Build Coastguard Worker   _exit(1);
328*6777b538SAndroid Build Coastguard Worker }
329*6777b538SAndroid Build Coastguard Worker 
PureCall()330*6777b538SAndroid Build Coastguard Worker void PureCall() {
331*6777b538SAndroid Build Coastguard Worker   fprintf(stderr, "Pure-virtual function call. Terminating.\n");
332*6777b538SAndroid Build Coastguard Worker   __debugbreak();
333*6777b538SAndroid Build Coastguard Worker   _exit(1);
334*6777b538SAndroid Build Coastguard Worker }
335*6777b538SAndroid Build Coastguard Worker 
AbortHandler(int signal)336*6777b538SAndroid Build Coastguard Worker void AbortHandler(int signal) {
337*6777b538SAndroid Build Coastguard Worker   // Print EOL after the CRT abort message.
338*6777b538SAndroid Build Coastguard Worker   fprintf(stderr, "\n");
339*6777b538SAndroid Build Coastguard Worker   __debugbreak();
340*6777b538SAndroid Build Coastguard Worker }
341*6777b538SAndroid Build Coastguard Worker #endif
342*6777b538SAndroid Build Coastguard Worker 
343*6777b538SAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
344*6777b538SAndroid Build Coastguard Worker // Returns a friendly message to tell developers how to see the stack traces for
345*6777b538SAndroid Build Coastguard Worker // unexpected crashes in death test child processes. Since death tests generate
346*6777b538SAndroid Build Coastguard Worker // stack traces as a consequence of their expected crashes and stack traces are
347*6777b538SAndroid Build Coastguard Worker // expensive to compute, stack traces in death test child processes are
348*6777b538SAndroid Build Coastguard Worker // suppressed unless `--with-stack-traces` is on the command line.
GetStackTraceMessage()349*6777b538SAndroid Build Coastguard Worker std::string GetStackTraceMessage() {
350*6777b538SAndroid Build Coastguard Worker   // When Google Test launches a "threadsafe" death test's child proc, it uses
351*6777b538SAndroid Build Coastguard Worker   // `--gtest_filter` to convey the test to be run. It appendeds it to the end
352*6777b538SAndroid Build Coastguard Worker   // of the command line, so Chromium's `CommandLine` will preserve only the
353*6777b538SAndroid Build Coastguard Worker   // value of interest.
354*6777b538SAndroid Build Coastguard Worker   auto filter_switch =
355*6777b538SAndroid Build Coastguard Worker       CommandLine::ForCurrentProcess()->GetSwitchValueNative("gtest_filter");
356*6777b538SAndroid Build Coastguard Worker   return StrCat({"Stack trace suppressed; retry with `--",
357*6777b538SAndroid Build Coastguard Worker                  switches::kWithDeathTestStackTraces, " --gtest_filter=",
358*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
359*6777b538SAndroid Build Coastguard Worker                  WideToUTF8(filter_switch)
360*6777b538SAndroid Build Coastguard Worker #else
361*6777b538SAndroid Build Coastguard Worker                  filter_switch
362*6777b538SAndroid Build Coastguard Worker #endif
363*6777b538SAndroid Build Coastguard Worker                      ,
364*6777b538SAndroid Build Coastguard Worker                  "`."});
365*6777b538SAndroid Build Coastguard Worker }
366*6777b538SAndroid Build Coastguard Worker #endif  // GTEST_HAS_DEATH_TEST
367*6777b538SAndroid Build Coastguard Worker 
368*6777b538SAndroid Build Coastguard Worker }  // namespace
369*6777b538SAndroid Build Coastguard Worker 
RunUnitTestsUsingBaseTestSuite(int argc,char ** argv)370*6777b538SAndroid Build Coastguard Worker int RunUnitTestsUsingBaseTestSuite(int argc, char** argv) {
371*6777b538SAndroid Build Coastguard Worker   TestSuite test_suite(argc, argv);
372*6777b538SAndroid Build Coastguard Worker   return LaunchUnitTests(argc, argv,
373*6777b538SAndroid Build Coastguard Worker                          BindOnce(&TestSuite::Run, Unretained(&test_suite)));
374*6777b538SAndroid Build Coastguard Worker }
375*6777b538SAndroid Build Coastguard Worker 
TestSuite(int argc,char ** argv)376*6777b538SAndroid Build Coastguard Worker TestSuite::TestSuite(int argc, char** argv) : argc_(argc), argv_(argv) {
377*6777b538SAndroid Build Coastguard Worker   PreInitialize();
378*6777b538SAndroid Build Coastguard Worker }
379*6777b538SAndroid Build Coastguard Worker 
380*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
TestSuite(int argc,wchar_t ** argv)381*6777b538SAndroid Build Coastguard Worker TestSuite::TestSuite(int argc, wchar_t** argv) : argc_(argc) {
382*6777b538SAndroid Build Coastguard Worker   argv_as_strings_.reserve(argc);
383*6777b538SAndroid Build Coastguard Worker   argv_as_pointers_.reserve(argc + 1);
384*6777b538SAndroid Build Coastguard Worker   std::for_each(argv, argv + argc, [this](wchar_t* arg) {
385*6777b538SAndroid Build Coastguard Worker     argv_as_strings_.push_back(WideToUTF8(arg));
386*6777b538SAndroid Build Coastguard Worker     // Have to use .data() here to get a mutable pointer.
387*6777b538SAndroid Build Coastguard Worker     argv_as_pointers_.push_back(argv_as_strings_.back().data());
388*6777b538SAndroid Build Coastguard Worker   });
389*6777b538SAndroid Build Coastguard Worker   // `argv` is specified as containing `argc + 1` pointers, of which the last is
390*6777b538SAndroid Build Coastguard Worker   // null.
391*6777b538SAndroid Build Coastguard Worker   argv_as_pointers_.push_back(nullptr);
392*6777b538SAndroid Build Coastguard Worker   argv_ = argv_as_pointers_.data();
393*6777b538SAndroid Build Coastguard Worker   PreInitialize();
394*6777b538SAndroid Build Coastguard Worker }
395*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN)
396*6777b538SAndroid Build Coastguard Worker 
~TestSuite()397*6777b538SAndroid Build Coastguard Worker TestSuite::~TestSuite() {
398*6777b538SAndroid Build Coastguard Worker   if (initialized_command_line_)
399*6777b538SAndroid Build Coastguard Worker     CommandLine::Reset();
400*6777b538SAndroid Build Coastguard Worker }
401*6777b538SAndroid Build Coastguard Worker 
402*6777b538SAndroid Build Coastguard Worker // Don't add additional code to this method.  Instead add it to
403*6777b538SAndroid Build Coastguard Worker // Initialize().  See bug 6436.
Run()404*6777b538SAndroid Build Coastguard Worker int TestSuite::Run() {
405*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
406*6777b538SAndroid Build Coastguard Worker   apple::ScopedNSAutoreleasePool scoped_pool;
407*6777b538SAndroid Build Coastguard Worker #endif
408*6777b538SAndroid Build Coastguard Worker 
409*6777b538SAndroid Build Coastguard Worker   std::string client_func =
410*6777b538SAndroid Build Coastguard Worker       CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
411*6777b538SAndroid Build Coastguard Worker           switches::kTestChildProcess);
412*6777b538SAndroid Build Coastguard Worker 
413*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
414*6777b538SAndroid Build Coastguard Worker   // Cache the system info so individual tests do not need to worry about it.
415*6777b538SAndroid Build Coastguard Worker   // Some ProcessUtilTest cases, which use kTestChildProcess, do not pass any
416*6777b538SAndroid Build Coastguard Worker   // services, so skip this if that switch was present.
417*6777b538SAndroid Build Coastguard Worker   // This must be called before Initialize() because, for example,
418*6777b538SAndroid Build Coastguard Worker   // content::ContentTestSuite::Initialize() may use the cached values.
419*6777b538SAndroid Build Coastguard Worker   if (client_func.empty())
420*6777b538SAndroid Build Coastguard Worker     CHECK(FetchAndCacheSystemInfo());
421*6777b538SAndroid Build Coastguard Worker #endif
422*6777b538SAndroid Build Coastguard Worker 
423*6777b538SAndroid Build Coastguard Worker   Initialize();
424*6777b538SAndroid Build Coastguard Worker 
425*6777b538SAndroid Build Coastguard Worker   // Check to see if we are being run as a client process.
426*6777b538SAndroid Build Coastguard Worker   if (!client_func.empty())
427*6777b538SAndroid Build Coastguard Worker     return multi_process_function_list::InvokeChildProcessTest(client_func);
428*6777b538SAndroid Build Coastguard Worker 
429*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS)
430*6777b538SAndroid Build Coastguard Worker   test_listener_ios::RegisterTestEndListener();
431*6777b538SAndroid Build Coastguard Worker #endif
432*6777b538SAndroid Build Coastguard Worker 
433*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX)
434*6777b538SAndroid Build Coastguard Worker   // There's no standard way to opt processes into MTE on Linux just yet,
435*6777b538SAndroid Build Coastguard Worker   // so this call explicitly opts this test into synchronous MTE mode, where
436*6777b538SAndroid Build Coastguard Worker   // pointer mismatches are detected immediately.
437*6777b538SAndroid Build Coastguard Worker   ::partition_alloc::ChangeMemoryTaggingModeForCurrentThread(
438*6777b538SAndroid Build Coastguard Worker       ::partition_alloc::TagViolationReportingMode::kSynchronous);
439*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_ANDROID)
440*6777b538SAndroid Build Coastguard Worker     // On Android, the tests are opted into synchronous MTE mode by the
441*6777b538SAndroid Build Coastguard Worker     // memtagMode attribute in an AndroidManifest.xml file or via an `am compat`
442*6777b538SAndroid Build Coastguard Worker     // command, so and explicit call to ChangeMemoryTaggingModeForCurrentThread
443*6777b538SAndroid Build Coastguard Worker     // is not needed.
444*6777b538SAndroid Build Coastguard Worker #endif
445*6777b538SAndroid Build Coastguard Worker 
446*6777b538SAndroid Build Coastguard Worker   int result = RunAllTests();
447*6777b538SAndroid Build Coastguard Worker 
448*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
449*6777b538SAndroid Build Coastguard Worker   // This MUST happen before Shutdown() since Shutdown() tears down
450*6777b538SAndroid Build Coastguard Worker   // objects (such as NotificationService::current()) that Cocoa
451*6777b538SAndroid Build Coastguard Worker   // objects use to remove themselves as observers.
452*6777b538SAndroid Build Coastguard Worker   scoped_pool.Recycle();
453*6777b538SAndroid Build Coastguard Worker #endif
454*6777b538SAndroid Build Coastguard Worker 
455*6777b538SAndroid Build Coastguard Worker   Shutdown();
456*6777b538SAndroid Build Coastguard Worker 
457*6777b538SAndroid Build Coastguard Worker   return result;
458*6777b538SAndroid Build Coastguard Worker }
459*6777b538SAndroid Build Coastguard Worker 
DisableCheckForThreadAndProcessPriority()460*6777b538SAndroid Build Coastguard Worker void TestSuite::DisableCheckForThreadAndProcessPriority() {
461*6777b538SAndroid Build Coastguard Worker   DCHECK(!is_initialized_);
462*6777b538SAndroid Build Coastguard Worker   check_for_thread_and_process_priority_ = false;
463*6777b538SAndroid Build Coastguard Worker }
464*6777b538SAndroid Build Coastguard Worker 
DisableCheckForLeakedGlobals()465*6777b538SAndroid Build Coastguard Worker void TestSuite::DisableCheckForLeakedGlobals() {
466*6777b538SAndroid Build Coastguard Worker   DCHECK(!is_initialized_);
467*6777b538SAndroid Build Coastguard Worker   check_for_leaked_globals_ = false;
468*6777b538SAndroid Build Coastguard Worker }
469*6777b538SAndroid Build Coastguard Worker 
UnitTestAssertHandler(const char * file,int line,const std::string_view summary,const std::string_view stack_trace)470*6777b538SAndroid Build Coastguard Worker void TestSuite::UnitTestAssertHandler(const char* file,
471*6777b538SAndroid Build Coastguard Worker                                       int line,
472*6777b538SAndroid Build Coastguard Worker                                       const std::string_view summary,
473*6777b538SAndroid Build Coastguard Worker                                       const std::string_view stack_trace) {
474*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
475*6777b538SAndroid Build Coastguard Worker   // Correlating test stdio with logcat can be difficult, so we emit this
476*6777b538SAndroid Build Coastguard Worker   // helpful little hint about what was running.  Only do this for Android
477*6777b538SAndroid Build Coastguard Worker   // because other platforms don't separate out the relevant logs in the same
478*6777b538SAndroid Build Coastguard Worker   // way.
479*6777b538SAndroid Build Coastguard Worker   const ::testing::TestInfo* const test_info =
480*6777b538SAndroid Build Coastguard Worker       ::testing::UnitTest::GetInstance()->current_test_info();
481*6777b538SAndroid Build Coastguard Worker   if (test_info) {
482*6777b538SAndroid Build Coastguard Worker     LOG(ERROR) << "Currently running: " << test_info->test_suite_name() << "."
483*6777b538SAndroid Build Coastguard Worker                << test_info->name();
484*6777b538SAndroid Build Coastguard Worker     fflush(stderr);
485*6777b538SAndroid Build Coastguard Worker   }
486*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID)
487*6777b538SAndroid Build Coastguard Worker 
488*6777b538SAndroid Build Coastguard Worker   // XmlUnitTestResultPrinter inherits gtest format, where assert has summary
489*6777b538SAndroid Build Coastguard Worker   // and message. In GTest, summary is just a logged text, and message is a
490*6777b538SAndroid Build Coastguard Worker   // logged text, concatenated with stack trace of assert.
491*6777b538SAndroid Build Coastguard Worker   // Concatenate summary and stack_trace here, to pass it as a message.
492*6777b538SAndroid Build Coastguard Worker   if (printer_) {
493*6777b538SAndroid Build Coastguard Worker     const std::string summary_str(summary);
494*6777b538SAndroid Build Coastguard Worker     const std::string stack_trace_str = summary_str + std::string(stack_trace);
495*6777b538SAndroid Build Coastguard Worker     printer_->OnAssert(file, line, summary_str, stack_trace_str);
496*6777b538SAndroid Build Coastguard Worker   }
497*6777b538SAndroid Build Coastguard Worker 
498*6777b538SAndroid Build Coastguard Worker   // The logging system actually prints the message before calling the assert
499*6777b538SAndroid Build Coastguard Worker   // handler. Just exit now to avoid printing too many stack traces.
500*6777b538SAndroid Build Coastguard Worker   _exit(1);
501*6777b538SAndroid Build Coastguard Worker }
502*6777b538SAndroid Build Coastguard Worker 
SuppressErrorDialogs()503*6777b538SAndroid Build Coastguard Worker void TestSuite::SuppressErrorDialogs() {
504*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
505*6777b538SAndroid Build Coastguard Worker   UINT new_flags =
506*6777b538SAndroid Build Coastguard Worker       SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX;
507*6777b538SAndroid Build Coastguard Worker 
508*6777b538SAndroid Build Coastguard Worker   // Preserve existing error mode, as discussed at
509*6777b538SAndroid Build Coastguard Worker   // http://blogs.msdn.com/oldnewthing/archive/2004/07/27/198410.aspx
510*6777b538SAndroid Build Coastguard Worker   UINT existing_flags = SetErrorMode(new_flags);
511*6777b538SAndroid Build Coastguard Worker   SetErrorMode(existing_flags | new_flags);
512*6777b538SAndroid Build Coastguard Worker 
513*6777b538SAndroid Build Coastguard Worker #if defined(_DEBUG)
514*6777b538SAndroid Build Coastguard Worker   // Suppress the "Debug Assertion Failed" dialog.
515*6777b538SAndroid Build Coastguard Worker   // TODO(hbono): remove this code when gtest has it.
516*6777b538SAndroid Build Coastguard Worker   // http://groups.google.com/d/topic/googletestframework/OjuwNlXy5ac/discussion
517*6777b538SAndroid Build Coastguard Worker   _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
518*6777b538SAndroid Build Coastguard Worker   _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
519*6777b538SAndroid Build Coastguard Worker   _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
520*6777b538SAndroid Build Coastguard Worker   _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
521*6777b538SAndroid Build Coastguard Worker #endif  // defined(_DEBUG)
522*6777b538SAndroid Build Coastguard Worker 
523*6777b538SAndroid Build Coastguard Worker   // See crbug.com/783040 for test code to trigger all of these failures.
524*6777b538SAndroid Build Coastguard Worker   _set_invalid_parameter_handler(InvalidParameter);
525*6777b538SAndroid Build Coastguard Worker   _set_purecall_handler(PureCall);
526*6777b538SAndroid Build Coastguard Worker   signal(SIGABRT, AbortHandler);
527*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN)
528*6777b538SAndroid Build Coastguard Worker }
529*6777b538SAndroid Build Coastguard Worker 
Initialize()530*6777b538SAndroid Build Coastguard Worker void TestSuite::Initialize() {
531*6777b538SAndroid Build Coastguard Worker   DCHECK(!is_initialized_);
532*6777b538SAndroid Build Coastguard Worker 
533*6777b538SAndroid Build Coastguard Worker   InitializeFromCommandLine(&argc_, argv_);
534*6777b538SAndroid Build Coastguard Worker 
535*6777b538SAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
536*6777b538SAndroid Build Coastguard Worker   if (::testing::internal::InDeathTestChild() &&
537*6777b538SAndroid Build Coastguard Worker       !CommandLine::ForCurrentProcess()->HasSwitch(
538*6777b538SAndroid Build Coastguard Worker           switches::kWithDeathTestStackTraces)) {
539*6777b538SAndroid Build Coastguard Worker     // For death tests using the "threadsafe" style (which includes all such
540*6777b538SAndroid Build Coastguard Worker     // tests on Windows and Fuchsia, and is the default for all Chromium tests
541*6777b538SAndroid Build Coastguard Worker     // on all platforms except Android; see `PreInitialize`),
542*6777b538SAndroid Build Coastguard Worker     //
543*6777b538SAndroid Build Coastguard Worker     // For more information, see
544*6777b538SAndroid Build Coastguard Worker     // https://github.com/google/googletest/blob/main/docs/advanced.md#death-test-styles.
545*6777b538SAndroid Build Coastguard Worker     debug::StackTrace::SuppressStackTracesWithMessageForTesting(
546*6777b538SAndroid Build Coastguard Worker         GetStackTraceMessage());
547*6777b538SAndroid Build Coastguard Worker   }
548*6777b538SAndroid Build Coastguard Worker #endif
549*6777b538SAndroid Build Coastguard Worker 
550*6777b538SAndroid Build Coastguard Worker   // Logging must be initialized before any thread has a chance to call logging
551*6777b538SAndroid Build Coastguard Worker   // functions.
552*6777b538SAndroid Build Coastguard Worker   InitializeLogging();
553*6777b538SAndroid Build Coastguard Worker 
554*6777b538SAndroid Build Coastguard Worker   // The AsanService causes ASAN errors to emit additional information. It is
555*6777b538SAndroid Build Coastguard Worker   // helpful on its own. It is also required by ASAN BackupRefPtr when
556*6777b538SAndroid Build Coastguard Worker   // reconfiguring PartitionAlloc below.
557*6777b538SAndroid Build Coastguard Worker #if defined(ADDRESS_SANITIZER)
558*6777b538SAndroid Build Coastguard Worker   base::debug::AsanService::GetInstance()->Initialize();
559*6777b538SAndroid Build Coastguard Worker #endif
560*6777b538SAndroid Build Coastguard Worker 
561*6777b538SAndroid Build Coastguard Worker   // TODO(https://crbug.com/1400058): Enable BackupRefPtr in unittests on
562*6777b538SAndroid Build Coastguard Worker   // Android too. Same for ASAN.
563*6777b538SAndroid Build Coastguard Worker   // TODO(https://crbug.com/1413674): Enable PartitionAlloc in unittests with
564*6777b538SAndroid Build Coastguard Worker   // ASAN.
565*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PARTITION_ALLOC) && !defined(ADDRESS_SANITIZER)
566*6777b538SAndroid Build Coastguard Worker   allocator::PartitionAllocSupport::Get()->ReconfigureForTests();
567*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN)
568*6777b538SAndroid Build Coastguard Worker 
569*6777b538SAndroid Build Coastguard Worker   test::ScopedRunLoopTimeout::SetAddGTestFailureOnTimeout();
570*6777b538SAndroid Build Coastguard Worker 
571*6777b538SAndroid Build Coastguard Worker   const CommandLine* command_line = CommandLine::ForCurrentProcess();
572*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_IOS)
573*6777b538SAndroid Build Coastguard Worker   if (command_line->HasSwitch(switches::kWaitForDebugger)) {
574*6777b538SAndroid Build Coastguard Worker     debug::WaitForDebugger(60, true);
575*6777b538SAndroid Build Coastguard Worker   }
576*6777b538SAndroid Build Coastguard Worker #endif
577*6777b538SAndroid Build Coastguard Worker 
578*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(DCHECK_IS_CONFIGURABLE)
579*6777b538SAndroid Build Coastguard Worker   // Default the configurable DCHECK level to FATAL when running death tests'
580*6777b538SAndroid Build Coastguard Worker   // child process, so that they behave as expected.
581*6777b538SAndroid Build Coastguard Worker   // TODO(crbug.com/1057995): Remove this in favor of the codepath in
582*6777b538SAndroid Build Coastguard Worker   // FeatureList::SetInstance() when/if OnTestStart() TestEventListeners
583*6777b538SAndroid Build Coastguard Worker   // are fixed to be invoked in the child process as expected.
584*6777b538SAndroid Build Coastguard Worker   if (command_line->HasSwitch("gtest_internal_run_death_test"))
585*6777b538SAndroid Build Coastguard Worker     logging::LOGGING_DCHECK = logging::LOGGING_FATAL;
586*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(DCHECK_IS_CONFIGURABLE)
587*6777b538SAndroid Build Coastguard Worker 
588*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS)
589*6777b538SAndroid Build Coastguard Worker   InitIOSTestMessageLoop();
590*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_IOS)
591*6777b538SAndroid Build Coastguard Worker 
592*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
593*6777b538SAndroid Build Coastguard Worker   InitAndroidTestMessageLoop();
594*6777b538SAndroid Build Coastguard Worker #endif  // else BUILDFLAG(IS_ANDROID)
595*6777b538SAndroid Build Coastguard Worker 
596*6777b538SAndroid Build Coastguard Worker   CHECK(debug::EnableInProcessStackDumping());
597*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
598*6777b538SAndroid Build Coastguard Worker   RouteStdioToConsole(true);
599*6777b538SAndroid Build Coastguard Worker   // Make sure we run with high resolution timer to minimize differences
600*6777b538SAndroid Build Coastguard Worker   // between production code and test code.
601*6777b538SAndroid Build Coastguard Worker   Time::EnableHighResolutionTimer(true);
602*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN)
603*6777b538SAndroid Build Coastguard Worker 
604*6777b538SAndroid Build Coastguard Worker   // In some cases, we do not want to see standard error dialogs.
605*6777b538SAndroid Build Coastguard Worker   if (!debug::BeingDebugged() &&
606*6777b538SAndroid Build Coastguard Worker       !command_line->HasSwitch("show-error-dialogs")) {
607*6777b538SAndroid Build Coastguard Worker     SuppressErrorDialogs();
608*6777b538SAndroid Build Coastguard Worker     debug::SetSuppressDebugUI(true);
609*6777b538SAndroid Build Coastguard Worker     assert_handler_ = std::make_unique<logging::ScopedLogAssertHandler>(
610*6777b538SAndroid Build Coastguard Worker         BindRepeating(&TestSuite::UnitTestAssertHandler, Unretained(this)));
611*6777b538SAndroid Build Coastguard Worker   }
612*6777b538SAndroid Build Coastguard Worker 
613*6777b538SAndroid Build Coastguard Worker   // Child processes generally do not need ICU.
614*6777b538SAndroid Build Coastguard Worker   if (!command_line->HasSwitch("test-child-process")) {
615*6777b538SAndroid Build Coastguard Worker     test::InitializeICUForTesting();
616*6777b538SAndroid Build Coastguard Worker 
617*6777b538SAndroid Build Coastguard Worker     // A number of tests only work if the locale is en_US. This can be an issue
618*6777b538SAndroid Build Coastguard Worker     // on all platforms. To fix this we force the default locale to en_US. This
619*6777b538SAndroid Build Coastguard Worker     // does not affect tests that explicitly overrides the locale for testing.
620*6777b538SAndroid Build Coastguard Worker     // TODO(jshin): Should we set the locale via an OS X locale API here?
621*6777b538SAndroid Build Coastguard Worker     i18n::SetICUDefaultLocale("en_US");
622*6777b538SAndroid Build Coastguard Worker   }
623*6777b538SAndroid Build Coastguard Worker 
624*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
625*6777b538SAndroid Build Coastguard Worker   test_fonts::SetUpFontconfig();
626*6777b538SAndroid Build Coastguard Worker #endif
627*6777b538SAndroid Build Coastguard Worker 
628*6777b538SAndroid Build Coastguard Worker   // Add TestEventListeners to enforce certain properties across tests.
629*6777b538SAndroid Build Coastguard Worker   testing::TestEventListeners& listeners =
630*6777b538SAndroid Build Coastguard Worker       testing::UnitTest::GetInstance()->listeners();
631*6777b538SAndroid Build Coastguard Worker   listeners.Append(new DisableMaybeTests);
632*6777b538SAndroid Build Coastguard Worker   listeners.Append(new ResetCommandLineBetweenTests);
633*6777b538SAndroid Build Coastguard Worker   listeners.Append(new FeatureListScopedToEachTest);
634*6777b538SAndroid Build Coastguard Worker   if (check_for_leaked_globals_)
635*6777b538SAndroid Build Coastguard Worker     listeners.Append(new CheckForLeakedGlobals);
636*6777b538SAndroid Build Coastguard Worker   if (check_for_thread_and_process_priority_) {
637*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_APPLE)
638*6777b538SAndroid Build Coastguard Worker     listeners.Append(new CheckProcessPriority);
639*6777b538SAndroid Build Coastguard Worker #endif
640*6777b538SAndroid Build Coastguard Worker   }
641*6777b538SAndroid Build Coastguard Worker 
642*6777b538SAndroid Build Coastguard Worker   AddTestLauncherResultPrinter();
643*6777b538SAndroid Build Coastguard Worker 
644*6777b538SAndroid Build Coastguard Worker   TestTimeouts::Initialize();
645*6777b538SAndroid Build Coastguard Worker 
646*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(ENABLE_BASE_TRACING)
647*6777b538SAndroid Build Coastguard Worker   trace_to_file_.BeginTracingFromCommandLineOptions();
648*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(ENABLE_BASE_TRACING)
649*6777b538SAndroid Build Coastguard Worker 
650*6777b538SAndroid Build Coastguard Worker   debug::StartProfiling(GetProfileName());
651*6777b538SAndroid Build Coastguard Worker 
652*6777b538SAndroid Build Coastguard Worker   debug::VerifyDebugger();
653*6777b538SAndroid Build Coastguard Worker 
654*6777b538SAndroid Build Coastguard Worker   is_initialized_ = true;
655*6777b538SAndroid Build Coastguard Worker }
656*6777b538SAndroid Build Coastguard Worker 
InitializeFromCommandLine(int * argc,char ** argv)657*6777b538SAndroid Build Coastguard Worker void TestSuite::InitializeFromCommandLine(int* argc, char** argv) {
658*6777b538SAndroid Build Coastguard Worker   // CommandLine::Init() is called earlier from PreInitialize().
659*6777b538SAndroid Build Coastguard Worker   testing::InitGoogleTest(argc, argv);
660*6777b538SAndroid Build Coastguard Worker   testing::InitGoogleMock(argc, argv);
661*6777b538SAndroid Build Coastguard Worker 
662*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_IOS)
663*6777b538SAndroid Build Coastguard Worker   InitIOSArgs(*argc, argv);
664*6777b538SAndroid Build Coastguard Worker #endif
665*6777b538SAndroid Build Coastguard Worker }
666*6777b538SAndroid Build Coastguard Worker 
RunAllTests()667*6777b538SAndroid Build Coastguard Worker int TestSuite::RunAllTests() {
668*6777b538SAndroid Build Coastguard Worker   return RUN_ALL_TESTS();
669*6777b538SAndroid Build Coastguard Worker }
670*6777b538SAndroid Build Coastguard Worker 
Shutdown()671*6777b538SAndroid Build Coastguard Worker void TestSuite::Shutdown() {
672*6777b538SAndroid Build Coastguard Worker   DCHECK(is_initialized_);
673*6777b538SAndroid Build Coastguard Worker #if GTEST_HAS_DEATH_TEST
674*6777b538SAndroid Build Coastguard Worker   if (::testing::internal::InDeathTestChild()) {
675*6777b538SAndroid Build Coastguard Worker     debug::StackTrace::SuppressStackTracesWithMessageForTesting({});
676*6777b538SAndroid Build Coastguard Worker   }
677*6777b538SAndroid Build Coastguard Worker #endif
678*6777b538SAndroid Build Coastguard Worker   debug::StopProfiling();
679*6777b538SAndroid Build Coastguard Worker }
680*6777b538SAndroid Build Coastguard Worker 
PreInitialize()681*6777b538SAndroid Build Coastguard Worker void TestSuite::PreInitialize() {
682*6777b538SAndroid Build Coastguard Worker   DCHECK(!is_initialized_);
683*6777b538SAndroid Build Coastguard Worker 
684*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
685*6777b538SAndroid Build Coastguard Worker   base::debug::HandleHooks::PatchLoadedModules();
686*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN)
687*6777b538SAndroid Build Coastguard Worker 
688*6777b538SAndroid Build Coastguard Worker   // The default death_test_style of "fast" is a frequent source of subtle test
689*6777b538SAndroid Build Coastguard Worker   // flakiness. And on some platforms like macOS, use of system libraries after
690*6777b538SAndroid Build Coastguard Worker   // fork() but before exec() is unsafe. Using the threadsafe style by default
691*6777b538SAndroid Build Coastguard Worker   // alleviates these concerns.
692*6777b538SAndroid Build Coastguard Worker   //
693*6777b538SAndroid Build Coastguard Worker   // However, the threasafe style does not work reliably on Android, so that
694*6777b538SAndroid Build Coastguard Worker   // will keep the default of "fast". See https://crbug.com/815537,
695*6777b538SAndroid Build Coastguard Worker   // https://github.com/google/googletest/issues/1496, and
696*6777b538SAndroid Build Coastguard Worker   // https://github.com/google/googletest/issues/2093.
697*6777b538SAndroid Build Coastguard Worker   // TODO(danakj): Determine if all death tests should be skipped on Android
698*6777b538SAndroid Build Coastguard Worker   // (many already are, such as for DCHECK-death tests).
699*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID)
700*6777b538SAndroid Build Coastguard Worker   GTEST_FLAG_SET(death_test_style, "threadsafe");
701*6777b538SAndroid Build Coastguard Worker #endif
702*6777b538SAndroid Build Coastguard Worker 
703*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
704*6777b538SAndroid Build Coastguard Worker   GTEST_FLAG_SET(catch_exceptions, false);
705*6777b538SAndroid Build Coastguard Worker #endif
706*6777b538SAndroid Build Coastguard Worker   EnableTerminationOnHeapCorruption();
707*6777b538SAndroid Build Coastguard Worker #if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(USE_AURA)
708*6777b538SAndroid Build Coastguard Worker   // When calling native char conversion functions (e.g wrctomb) we need to
709*6777b538SAndroid Build Coastguard Worker   // have the locale set. In the absence of such a call the "C" locale is the
710*6777b538SAndroid Build Coastguard Worker   // default. In the gtk code (below) gtk_init() implicitly sets a locale.
711*6777b538SAndroid Build Coastguard Worker   setlocale(LC_ALL, "");
712*6777b538SAndroid Build Coastguard Worker   // We still need number to string conversions to be locale insensitive.
713*6777b538SAndroid Build Coastguard Worker   setlocale(LC_NUMERIC, "C");
714*6777b538SAndroid Build Coastguard Worker #endif  // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(USE_AURA)
715*6777b538SAndroid Build Coastguard Worker 
716*6777b538SAndroid Build Coastguard Worker   // On Android, AtExitManager is created in
717*6777b538SAndroid Build Coastguard Worker   // testing/android/native_test_wrapper.cc before main() is called.
718*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID)
719*6777b538SAndroid Build Coastguard Worker   at_exit_manager_ = std::make_unique<AtExitManager>();
720*6777b538SAndroid Build Coastguard Worker #endif
721*6777b538SAndroid Build Coastguard Worker 
722*6777b538SAndroid Build Coastguard Worker   // This needs to be done during construction as some users of this class rely
723*6777b538SAndroid Build Coastguard Worker   // on the constructor to initialise the CommandLine.
724*6777b538SAndroid Build Coastguard Worker   initialized_command_line_ = CommandLine::Init(argc_, argv_);
725*6777b538SAndroid Build Coastguard Worker 
726*6777b538SAndroid Build Coastguard Worker   // Don't add additional code to this function.  Instead add it to
727*6777b538SAndroid Build Coastguard Worker   // Initialize().  See bug 6436.
728*6777b538SAndroid Build Coastguard Worker }
729*6777b538SAndroid Build Coastguard Worker 
AddTestLauncherResultPrinter()730*6777b538SAndroid Build Coastguard Worker void TestSuite::AddTestLauncherResultPrinter() {
731*6777b538SAndroid Build Coastguard Worker   // Only add the custom printer if requested.
732*6777b538SAndroid Build Coastguard Worker   if (!CommandLine::ForCurrentProcess()->HasSwitch(
733*6777b538SAndroid Build Coastguard Worker           switches::kTestLauncherOutput)) {
734*6777b538SAndroid Build Coastguard Worker     return;
735*6777b538SAndroid Build Coastguard Worker   }
736*6777b538SAndroid Build Coastguard Worker 
737*6777b538SAndroid Build Coastguard Worker   FilePath output_path(CommandLine::ForCurrentProcess()->GetSwitchValuePath(
738*6777b538SAndroid Build Coastguard Worker       switches::kTestLauncherOutput));
739*6777b538SAndroid Build Coastguard Worker 
740*6777b538SAndroid Build Coastguard Worker   // Do not add the result printer if output path already exists. It's an
741*6777b538SAndroid Build Coastguard Worker   // indicator there is a process printing to that file, and we're likely
742*6777b538SAndroid Build Coastguard Worker   // its child. Do not clobber the results in that case.
743*6777b538SAndroid Build Coastguard Worker   if (PathExists(output_path)) {
744*6777b538SAndroid Build Coastguard Worker     LOG(WARNING) << "Test launcher output path " << output_path.AsUTF8Unsafe()
745*6777b538SAndroid Build Coastguard Worker                  << " exists. Not adding test launcher result printer.";
746*6777b538SAndroid Build Coastguard Worker     return;
747*6777b538SAndroid Build Coastguard Worker   }
748*6777b538SAndroid Build Coastguard Worker 
749*6777b538SAndroid Build Coastguard Worker   printer_ = new XmlUnitTestResultPrinter;
750*6777b538SAndroid Build Coastguard Worker   CHECK(printer_->Initialize(output_path))
751*6777b538SAndroid Build Coastguard Worker       << "Output path is " << output_path.AsUTF8Unsafe()
752*6777b538SAndroid Build Coastguard Worker       << " and PathExists(output_path) is " << PathExists(output_path);
753*6777b538SAndroid Build Coastguard Worker   testing::TestEventListeners& listeners =
754*6777b538SAndroid Build Coastguard Worker       testing::UnitTest::GetInstance()->listeners();
755*6777b538SAndroid Build Coastguard Worker   listeners.Append(printer_);
756*6777b538SAndroid Build Coastguard Worker }
757*6777b538SAndroid Build Coastguard Worker 
758*6777b538SAndroid Build Coastguard Worker }  // namespace base
759