#include "base/test/test_timeouts.h"
#include <algorithm>
#include <string>
#include "base/cfi_buildflags.h"
#include "base/check_op.h"
#include "base/clang_profiling_buildflags.h"
#include "base/command_line.h"
#include "base/debug/debugger.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/test/test_switches.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
namespace {
void InitializeTimeout(const char* switch_name,
base::TimeDelta min_value,
base::TimeDelta* value) {
DCHECK(value);
base::TimeDelta command_line_timeout;
if (base::CommandLine::ForCurrentProcess()->HasSwitch(switch_name)) {
std::string string_value(base::CommandLine::ForCurrentProcess()->
GetSwitchValueASCII(switch_name));
int command_line_timeout_ms = 0;
if (!base::StringToInt(string_value, &command_line_timeout_ms)) {
LOG(FATAL) << "Timeout value \"" << string_value << "\" was parsed as "
<< command_line_timeout_ms;
}
command_line_timeout = base::Milliseconds(command_line_timeout_ms);
}
#if defined(MEMORY_SANITIZER)
#if BUILDFLAG(IS_CHROMEOS_ASH)
constexpr int kTimeoutMultiplier = 10;
#else
constexpr int kTimeoutMultiplier = 6;
#endif
#elif BUILDFLAG(CFI_DIAG)
constexpr int kTimeoutMultiplier = 3;
#elif defined(ADDRESS_SANITIZER) && BUILDFLAG(IS_WIN)
constexpr int kTimeoutMultiplier = 3;
#elif defined(ADDRESS_SANITIZER) && BUILDFLAG(IS_CHROMEOS_ASH)
constexpr int kTimeoutMultiplier = 3;
#elif defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER)
constexpr int kTimeoutMultiplier = 2;
#elif BUILDFLAG(CLANG_PROFILING)
constexpr int kTimeoutMultiplier = 3;
#elif !defined(NDEBUG) && BUILDFLAG(IS_CHROMEOS_ASH)
constexpr int kTimeoutMultiplier = 3;
#elif !defined(NDEBUG) && BUILDFLAG(IS_MAC)
constexpr int kTimeoutMultiplier = 2;
#else
constexpr int kTimeoutMultiplier = 1;
#endif
*value = std::max(std::max(*value, command_line_timeout) * kTimeoutMultiplier,
min_value);
}
}
bool TestTimeouts::initialized_ = false;
base::TimeDelta TestTimeouts::tiny_timeout_ = base::Milliseconds(100);
base::TimeDelta TestTimeouts::action_timeout_ = base::Seconds(10);
base::TimeDelta TestTimeouts::action_max_timeout_ = base::Seconds(30);
base::TimeDelta TestTimeouts::test_launcher_timeout_ = base::Seconds(45);
void TestTimeouts::Initialize() {
DCHECK(!initialized_);
initialized_ = true;
const bool being_debugged = base::debug::BeingDebugged();
if (being_debugged) {
fprintf(stdout,
"Detected presence of a debugger, running without test timeouts.\n");
}
InitializeTimeout(switches::kTestTinyTimeout, base::TimeDelta(),
&tiny_timeout_);
base::TimeDelta min_ui_test_action_timeout = tiny_timeout_;
if (being_debugged || base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kTestLauncherInteractive)) {
min_ui_test_action_timeout = base::Days(1);
}
InitializeTimeout(switches::kUiTestActionTimeout, min_ui_test_action_timeout,
&action_timeout_);
InitializeTimeout(switches::kUiTestActionMaxTimeout, action_timeout_,
&action_max_timeout_);
InitializeTimeout(switches::kTestLauncherTimeout, action_timeout_,
&test_launcher_timeout_);
CHECK_LE(tiny_timeout_, action_timeout_);
CHECK_LE(action_timeout_, action_max_timeout_);
CHECK_LE(action_timeout_, test_launcher_timeout_);
}