// Copyright 2020 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/at_exit.h" #include "base/bind.h" #include "base/command_line.h" #include "base/logging.h" #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/test/task_environment.h" #include "base/test/test_timeouts.h" #include "base/threading/sequenced_task_runner_handle.h" #include "base/time/time.h" int main(int argc, char* argv[]) { base::AtExitManager exit_manager; base::CommandLine::Init(argc, argv); TestTimeouts::Initialize(); base::test::TaskEnvironment task_environment{ base::test::TaskEnvironment::TimeSource::SYSTEM_TIME}; if (argc <= 1) { LOG(INFO) << argv[0] << ": missing operand"; return -1; } int duration_seconds = 0; if (!base::StringToInt(argv[1], &duration_seconds) || duration_seconds < 0) { LOG(INFO) << ": invalid time interval '" << argv[1] << "'"; return -1; } base::RunLoop run_loop; base::TimeDelta duration = base::TimeDelta::FromSeconds(duration_seconds); base::SequencedTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::BindOnce(run_loop.QuitClosure()), duration); // Tasks are run asynchronously, so this will print before the task runs. LOG(INFO) << "Going to sleep for " << duration_seconds << " seconds..."; // Runs all the tasks that have been posted to the |SequencedTaskRunner|. run_loop.Run(); // This will NOT complete until |run_loop.QuitClosure()| runs. LOG(INFO) << "I'm awake!"; return 0; }