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)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
8bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/debug/debugger.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_switches.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ASan and TSan instrument each memory access. This may slow the execution
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// down significantly.
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTimeoutMultiplier = 2;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTimeoutMultiplier = 1;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochconst int kAlmostInfiniteTimeoutMs = 100000000;
24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets value to the greatest of:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) value's current value multiplied by kTimeoutMultiplier (assuming
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InitializeTimeout is called only once per value).
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) min_value.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3) the numerical value given by switch_name on the command line multiplied
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by kTimeoutMultiplier.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeTimeout(const char* switch_name, int min_value, int* value) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(value);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switch_name)) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string string_value(
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switch_name));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int timeout;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::StringToInt(string_value, &timeout);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *value = std::max(*value, timeout);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value *= kTimeoutMultiplier;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *value = std::max(*value, min_value);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets value to the greatest of:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) value's current value multiplied by kTimeoutMultiplier.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) 0
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3) the numerical value given by switch_name on the command line multiplied
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by kTimeoutMultiplier.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InitializeTimeout(const char* switch_name, int* value) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeTimeout(switch_name, 0, value);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestTimeouts::initialized_ = false;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The timeout values should increase in the order they appear in this block.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestTimeouts::tiny_timeout_ms_ = 100;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestTimeouts::action_timeout_ms_ = 10000;
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef NDEBUG
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int TestTimeouts::action_max_timeout_ms_ = 45000;
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#else
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int TestTimeouts::action_max_timeout_ms_ = 30000;
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // NDEBUG
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TestTimeouts::large_test_timeout_ms_ = 10 * 60 * 1000;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestTimeouts::Initialize() {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (initialized_) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  initialized_ = true;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (base::debug::BeingDebugged()) {
78bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    fprintf(stdout,
79bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        "Detected presence of a debugger, running without test timeouts.\n");
80bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
81bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that these timeouts MUST be initialized in the correct order as
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // per the CHECKS below.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeTimeout(switches::kTestTinyTimeout, &tiny_timeout_ms_);
85bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  InitializeTimeout(switches::kUiTestActionTimeout,
86bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                    base::debug::BeingDebugged() ? kAlmostInfiniteTimeoutMs
87bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                                 : tiny_timeout_ms_,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &action_timeout_ms_);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeTimeout(switches::kUiTestActionMaxTimeout, action_timeout_ms_,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &action_max_timeout_ms_);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitializeTimeout(switches::kTestLargeTimeout, action_max_timeout_ms_,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    &large_test_timeout_ms_);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The timeout values should be increasing in the right order.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(tiny_timeout_ms_ <= action_timeout_ms_);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(action_timeout_ms_ <= action_max_timeout_ms_);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(action_max_timeout_ms_ <= large_test_timeout_ms_);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
99