15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <algorithm>
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
10bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/debug/debugger.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_switches.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// ASan/TSan/MSan instrument each memory access. This may slow the execution
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// down significantly.
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(MEMORY_SANITIZER)
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)static const int kTimeoutMultiplier = 3;
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#elif defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    defined(SYZYASAN)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTimeoutMultiplier = 2;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTimeoutMultiplier = 1;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochconst int kAlmostInfiniteTimeoutMs = 100000000;
29bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets value to the greatest of:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) value's current value multiplied by kTimeoutMultiplier (assuming
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InitializeTimeout is called only once per value).
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) min_value.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3) the numerical value given by switch_name on the command line multiplied
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by kTimeoutMultiplier.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeTimeout(const char* switch_name, int min_value, int* value) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(value);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switch_name)) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string string_value(
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switch_name));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int timeout;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::StringToInt(string_value, &timeout);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *value = std::max(*value, timeout);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value *= kTimeoutMultiplier;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = std::max(*value, min_value);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets value to the greatest of:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) value's current value multiplied by kTimeoutMultiplier.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) 0
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3) the numerical value given by switch_name on the command line multiplied
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by kTimeoutMultiplier.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeTimeout(const char* switch_name, int* value) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeTimeout(switch_name, 0, value);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestTimeouts::initialized_ = false;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The timeout values should increase in the order they appear in this block.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestTimeouts::tiny_timeout_ms_ = 100;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestTimeouts::action_timeout_ms_ = 10000;
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef NDEBUG
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int TestTimeouts::action_max_timeout_ms_ = 45000;
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int TestTimeouts::action_max_timeout_ms_ = 30000;
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // NDEBUG
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestTimeouts::large_test_timeout_ms_ = 10 * 60 * 1000;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int TestTimeouts::test_launcher_timeout_ms_ = 45000;
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestTimeouts::Initialize() {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (initialized_) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initialized_ = true;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (base::debug::BeingDebugged()) {
85bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    fprintf(stdout,
86bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        "Detected presence of a debugger, running without test timeouts.\n");
87bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
88bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that these timeouts MUST be initialized in the correct order as
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // per the CHECKS below.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeTimeout(switches::kTestTinyTimeout, &tiny_timeout_ms_);
92bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  InitializeTimeout(switches::kUiTestActionTimeout,
93bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                    base::debug::BeingDebugged() ? kAlmostInfiniteTimeoutMs
94bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                                 : tiny_timeout_ms_,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &action_timeout_ms_);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeTimeout(switches::kUiTestActionMaxTimeout, action_timeout_ms_,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &action_max_timeout_ms_);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeTimeout(switches::kTestLargeTimeout, action_max_timeout_ms_,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &large_test_timeout_ms_);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Test launcher timeout is independent from anything above action timeout.
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  InitializeTimeout(switches::kTestLauncherTimeout, action_timeout_ms_,
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                    &test_launcher_timeout_ms_);
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The timeout values should be increasing in the right order.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(tiny_timeout_ms_ <= action_timeout_ms_);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(action_timeout_ms_ <= action_max_timeout_ms_);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(action_max_timeout_ms_ <= large_test_timeout_ms_);
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  CHECK(action_timeout_ms_ <= test_launcher_timeout_ms_);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
112