1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "base/test/test_timeouts.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <algorithm>
8*635a8641SAndroid Build Coastguard Worker
9*635a8641SAndroid Build Coastguard Worker #include "base/command_line.h"
10*635a8641SAndroid Build Coastguard Worker #include "base/debug/debugger.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/test/test_switches.h"
14*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
15*635a8641SAndroid Build Coastguard Worker
16*635a8641SAndroid Build Coastguard Worker namespace {
17*635a8641SAndroid Build Coastguard Worker
18*635a8641SAndroid Build Coastguard Worker // Sets value to the greatest of:
19*635a8641SAndroid Build Coastguard Worker // 1) value's current value multiplied by kTimeoutMultiplier (assuming
20*635a8641SAndroid Build Coastguard Worker // InitializeTimeout is called only once per value).
21*635a8641SAndroid Build Coastguard Worker // 2) min_value.
22*635a8641SAndroid Build Coastguard Worker // 3) the numerical value given by switch_name on the command line multiplied
23*635a8641SAndroid Build Coastguard Worker // by kTimeoutMultiplier.
InitializeTimeout(const char * switch_name,int min_value,int * value)24*635a8641SAndroid Build Coastguard Worker void InitializeTimeout(const char* switch_name, int min_value, int* value) {
25*635a8641SAndroid Build Coastguard Worker DCHECK(value);
26*635a8641SAndroid Build Coastguard Worker int command_line_timeout = 0;
27*635a8641SAndroid Build Coastguard Worker if (base::CommandLine::ForCurrentProcess()->HasSwitch(switch_name)) {
28*635a8641SAndroid Build Coastguard Worker std::string string_value(base::CommandLine::ForCurrentProcess()->
29*635a8641SAndroid Build Coastguard Worker GetSwitchValueASCII(switch_name));
30*635a8641SAndroid Build Coastguard Worker if (!base::StringToInt(string_value, &command_line_timeout)) {
31*635a8641SAndroid Build Coastguard Worker LOG(FATAL) << "Timeout value \"" << string_value << "\" was parsed as "
32*635a8641SAndroid Build Coastguard Worker << command_line_timeout;
33*635a8641SAndroid Build Coastguard Worker }
34*635a8641SAndroid Build Coastguard Worker }
35*635a8641SAndroid Build Coastguard Worker
36*635a8641SAndroid Build Coastguard Worker #if defined(MEMORY_SANITIZER)
37*635a8641SAndroid Build Coastguard Worker // ASan/TSan/MSan instrument each memory access. This may slow the execution
38*635a8641SAndroid Build Coastguard Worker // down significantly.
39*635a8641SAndroid Build Coastguard Worker // For MSan the slowdown depends heavily on the value of msan_track_origins
40*635a8641SAndroid Build Coastguard Worker // build flag. The multiplier below corresponds to msan_track_origins = 1.
41*635a8641SAndroid Build Coastguard Worker constexpr int kTimeoutMultiplier = 6;
42*635a8641SAndroid Build Coastguard Worker #elif defined(ADDRESS_SANITIZER) && defined(OS_WIN)
43*635a8641SAndroid Build Coastguard Worker // ASan/Win has not been optimized yet, give it a higher
44*635a8641SAndroid Build Coastguard Worker // timeout multiplier. See http://crbug.com/412471
45*635a8641SAndroid Build Coastguard Worker constexpr int kTimeoutMultiplier = 3;
46*635a8641SAndroid Build Coastguard Worker #elif defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER)
47*635a8641SAndroid Build Coastguard Worker constexpr int kTimeoutMultiplier = 2;
48*635a8641SAndroid Build Coastguard Worker #else
49*635a8641SAndroid Build Coastguard Worker constexpr int kTimeoutMultiplier = 1;
50*635a8641SAndroid Build Coastguard Worker #endif
51*635a8641SAndroid Build Coastguard Worker
52*635a8641SAndroid Build Coastguard Worker *value = std::max(std::max(*value, command_line_timeout) * kTimeoutMultiplier,
53*635a8641SAndroid Build Coastguard Worker min_value);
54*635a8641SAndroid Build Coastguard Worker }
55*635a8641SAndroid Build Coastguard Worker
56*635a8641SAndroid Build Coastguard Worker } // namespace
57*635a8641SAndroid Build Coastguard Worker
58*635a8641SAndroid Build Coastguard Worker // static
59*635a8641SAndroid Build Coastguard Worker bool TestTimeouts::initialized_ = false;
60*635a8641SAndroid Build Coastguard Worker
61*635a8641SAndroid Build Coastguard Worker // The timeout values should increase in the order they appear in this block.
62*635a8641SAndroid Build Coastguard Worker // static
63*635a8641SAndroid Build Coastguard Worker int TestTimeouts::tiny_timeout_ms_ = 100;
64*635a8641SAndroid Build Coastguard Worker int TestTimeouts::action_timeout_ms_ = 10000;
65*635a8641SAndroid Build Coastguard Worker #ifndef NDEBUG
66*635a8641SAndroid Build Coastguard Worker int TestTimeouts::action_max_timeout_ms_ = 45000;
67*635a8641SAndroid Build Coastguard Worker #else
68*635a8641SAndroid Build Coastguard Worker int TestTimeouts::action_max_timeout_ms_ = 30000;
69*635a8641SAndroid Build Coastguard Worker #endif // NDEBUG
70*635a8641SAndroid Build Coastguard Worker
71*635a8641SAndroid Build Coastguard Worker int TestTimeouts::test_launcher_timeout_ms_ = 45000;
72*635a8641SAndroid Build Coastguard Worker
73*635a8641SAndroid Build Coastguard Worker // static
Initialize()74*635a8641SAndroid Build Coastguard Worker void TestTimeouts::Initialize() {
75*635a8641SAndroid Build Coastguard Worker DCHECK(!initialized_);
76*635a8641SAndroid Build Coastguard Worker initialized_ = true;
77*635a8641SAndroid Build Coastguard Worker
78*635a8641SAndroid Build Coastguard Worker if (base::debug::BeingDebugged()) {
79*635a8641SAndroid Build Coastguard Worker fprintf(stdout,
80*635a8641SAndroid Build Coastguard Worker "Detected presence of a debugger, running without test timeouts.\n");
81*635a8641SAndroid Build Coastguard Worker }
82*635a8641SAndroid Build Coastguard Worker
83*635a8641SAndroid Build Coastguard Worker // Note that these timeouts MUST be initialized in the correct order as
84*635a8641SAndroid Build Coastguard Worker // per the CHECKS below.
85*635a8641SAndroid Build Coastguard Worker
86*635a8641SAndroid Build Coastguard Worker InitializeTimeout(switches::kTestTinyTimeout, 0, &tiny_timeout_ms_);
87*635a8641SAndroid Build Coastguard Worker
88*635a8641SAndroid Build Coastguard Worker // All timeouts other than the "tiny" one should be set to very large values
89*635a8641SAndroid Build Coastguard Worker // when in a debugger or when run interactively, so that tests will not get
90*635a8641SAndroid Build Coastguard Worker // auto-terminated. By setting the UI test action timeout to at least this
91*635a8641SAndroid Build Coastguard Worker // value, we guarantee the subsequent timeouts will be this large also.
92*635a8641SAndroid Build Coastguard Worker // Setting the "tiny" timeout to a large value as well would make some tests
93*635a8641SAndroid Build Coastguard Worker // hang (because it's used as a task-posting delay). In particular this
94*635a8641SAndroid Build Coastguard Worker // causes problems for some iOS device tests, which are always run inside a
95*635a8641SAndroid Build Coastguard Worker // debugger (thus BeingDebugged() is true even on the bots).
96*635a8641SAndroid Build Coastguard Worker int min_ui_test_action_timeout = tiny_timeout_ms_;
97*635a8641SAndroid Build Coastguard Worker if (base::debug::BeingDebugged() ||
98*635a8641SAndroid Build Coastguard Worker base::CommandLine::ForCurrentProcess()->HasSwitch(
99*635a8641SAndroid Build Coastguard Worker switches::kTestLauncherInteractive)) {
100*635a8641SAndroid Build Coastguard Worker constexpr int kVeryLargeTimeoutMs = 100'000'000;
101*635a8641SAndroid Build Coastguard Worker min_ui_test_action_timeout = kVeryLargeTimeoutMs;
102*635a8641SAndroid Build Coastguard Worker }
103*635a8641SAndroid Build Coastguard Worker
104*635a8641SAndroid Build Coastguard Worker InitializeTimeout(switches::kUiTestActionTimeout, min_ui_test_action_timeout,
105*635a8641SAndroid Build Coastguard Worker &action_timeout_ms_);
106*635a8641SAndroid Build Coastguard Worker InitializeTimeout(switches::kUiTestActionMaxTimeout, action_timeout_ms_,
107*635a8641SAndroid Build Coastguard Worker &action_max_timeout_ms_);
108*635a8641SAndroid Build Coastguard Worker
109*635a8641SAndroid Build Coastguard Worker // Test launcher timeout is independent from anything above action timeout.
110*635a8641SAndroid Build Coastguard Worker InitializeTimeout(switches::kTestLauncherTimeout, action_timeout_ms_,
111*635a8641SAndroid Build Coastguard Worker &test_launcher_timeout_ms_);
112*635a8641SAndroid Build Coastguard Worker
113*635a8641SAndroid Build Coastguard Worker // The timeout values should be increasing in the right order.
114*635a8641SAndroid Build Coastguard Worker CHECK_LE(tiny_timeout_ms_, action_timeout_ms_);
115*635a8641SAndroid Build Coastguard Worker CHECK_LE(action_timeout_ms_, action_max_timeout_ms_);
116*635a8641SAndroid Build Coastguard Worker CHECK_LE(action_timeout_ms_, test_launcher_timeout_ms_);
117*635a8641SAndroid Build Coastguard Worker }
118