blob: 739245040e8339f0db77aef3d982026ecf0bec89 [file] [log] [blame]
hnguyen@chromium.org12b98042011-04-12 07:14:29 +09001// Copyright (c) 2011 The Chromium Authors. All rights reserved.
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/test/test_timeouts.h"
6
scottmg@chromium.orgfd621b92013-10-16 05:29:03 +09007#include <algorithm>
8
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +09009#include "base/command_line.h"
jochen@chromium.orgd9144782013-07-25 04:34:04 +090010#include "base/debug/debugger.h"
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090011#include "base/logging.h"
brettw@chromium.orgabcde5c2013-02-07 11:57:22 +090012#include "base/strings/string_number_conversions.h"
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090013#include "base/test/test_switches.h"
14
15namespace {
16
earthdok@chromium.orga43b6c22014-06-16 23:24:28 +090017// ASan/TSan/MSan instrument each memory access. This may slow the execution
glider@chromium.orgab53e932013-04-19 21:56:51 +090018// down significantly.
earthdok@chromium.org7915acf2014-06-17 22:53:57 +090019#if defined(MEMORY_SANITIZER)
earthdok@chromium.org1fb53c22014-07-28 20:45:16 +090020// For MSan the slowdown depends heavily on the value of msan_track_origins GYP
21// flag. The multiplier below corresponds to msan_track_origins=1.
22static const int kTimeoutMultiplier = 6;
earthdok@chromium.org7915acf2014-06-17 22:53:57 +090023#elif defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \
24 defined(SYZYASAN)
glotov@google.comd532a0c2012-06-04 22:15:28 +090025static const int kTimeoutMultiplier = 2;
glider@chromium.org0a283702011-11-15 17:43:28 +090026#else
27static const int kTimeoutMultiplier = 1;
28#endif
29
jochen@chromium.orgd9144782013-07-25 04:34:04 +090030const int kAlmostInfiniteTimeoutMs = 100000000;
31
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090032// Sets value to the greatest of:
glider@chromium.org0a283702011-11-15 17:43:28 +090033// 1) value's current value multiplied by kTimeoutMultiplier (assuming
34// InitializeTimeout is called only once per value).
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090035// 2) min_value.
glider@chromium.org0a283702011-11-15 17:43:28 +090036// 3) the numerical value given by switch_name on the command line multiplied
37// by kTimeoutMultiplier.
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090038void InitializeTimeout(const char* switch_name, int min_value, int* value) {
39 DCHECK(value);
40 if (CommandLine::ForCurrentProcess()->HasSwitch(switch_name)) {
41 std::string string_value(
42 CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switch_name));
43 int timeout;
44 base::StringToInt(string_value, &timeout);
45 *value = std::max(*value, timeout);
46 }
glider@chromium.org0a283702011-11-15 17:43:28 +090047 *value *= kTimeoutMultiplier;
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090048 *value = std::max(*value, min_value);
49}
50
51// Sets value to the greatest of:
glider@chromium.org0a283702011-11-15 17:43:28 +090052// 1) value's current value multiplied by kTimeoutMultiplier.
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090053// 2) 0
glider@chromium.org0a283702011-11-15 17:43:28 +090054// 3) the numerical value given by switch_name on the command line multiplied
55// by kTimeoutMultiplier.
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090056void InitializeTimeout(const char* switch_name, int* value) {
57 InitializeTimeout(switch_name, 0, value);
58}
59
60} // namespace
61
62// static
63bool TestTimeouts::initialized_ = false;
64
65// The timeout values should increase in the order they appear in this block.
66// static
annacc@chromium.org34ff1402010-12-17 03:49:52 +090067int TestTimeouts::tiny_timeout_ms_ = 100;
phajdan.jr@chromium.org98d596a2011-09-13 01:51:30 +090068int TestTimeouts::action_timeout_ms_ = 10000;
phajdan.jr@chromium.orgf5f2f2b2013-06-13 01:40:16 +090069#ifndef NDEBUG
70int TestTimeouts::action_max_timeout_ms_ = 45000;
71#else
phajdan.jr@chromium.org6ef5d502012-11-29 03:07:01 +090072int TestTimeouts::action_max_timeout_ms_ = 30000;
phajdan.jr@chromium.orgf5f2f2b2013-06-13 01:40:16 +090073#endif // NDEBUG
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090074
phajdan.jr@chromium.org7fc78a62013-11-23 11:01:04 +090075int TestTimeouts::test_launcher_timeout_ms_ = 45000;
phajdan.jr@chromium.org9e7b5d32013-09-25 02:00:14 +090076
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090077// static
78void TestTimeouts::Initialize() {
79 if (initialized_) {
80 NOTREACHED();
81 return;
82 }
83 initialized_ = true;
84
jochen@chromium.orgd9144782013-07-25 04:34:04 +090085 if (base::debug::BeingDebugged()) {
86 fprintf(stdout,
87 "Detected presence of a debugger, running without test timeouts.\n");
88 }
89
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090090 // Note that these timeouts MUST be initialized in the correct order as
91 // per the CHECKS below.
annacc@chromium.org34ff1402010-12-17 03:49:52 +090092 InitializeTimeout(switches::kTestTinyTimeout, &tiny_timeout_ms_);
jochen@chromium.orgd9144782013-07-25 04:34:04 +090093 InitializeTimeout(switches::kUiTestActionTimeout,
94 base::debug::BeingDebugged() ? kAlmostInfiniteTimeoutMs
95 : tiny_timeout_ms_,
annacc@chromium.org34ff1402010-12-17 03:49:52 +090096 &action_timeout_ms_);
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090097 InitializeTimeout(switches::kUiTestActionMaxTimeout, action_timeout_ms_,
98 &action_max_timeout_ms_);
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +090099
phajdan.jr@chromium.org9e7b5d32013-09-25 02:00:14 +0900100 // Test launcher timeout is independent from anything above action timeout.
101 InitializeTimeout(switches::kTestLauncherTimeout, action_timeout_ms_,
102 &test_launcher_timeout_ms_);
103
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +0900104 // The timeout values should be increasing in the right order.
annacc@chromium.org34ff1402010-12-17 03:49:52 +0900105 CHECK(tiny_timeout_ms_ <= action_timeout_ms_);
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +0900106 CHECK(action_timeout_ms_ <= action_max_timeout_ms_);
phajdan.jr@chromium.org9e7b5d32013-09-25 02:00:14 +0900107
108 CHECK(action_timeout_ms_ <= test_launcher_timeout_ms_);
sergeyu@chromium.org0f6abbc2010-10-06 04:03:05 +0900109}