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