| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/updater/win/test/test_executables.h" |
| |
| #include <memory> |
| |
| #include "base/base_paths.h" |
| #include "base/command_line.h" |
| #include "base/logging.h" |
| #include "base/path_service.h" |
| #include "base/process/launch.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "base/win/windows_handle_util.h" |
| #include "chrome/updater/constants.h" |
| #include "chrome/updater/updater_scope.h" |
| #include "chrome/updater/win/test/test_inheritable_event.h" |
| #include "chrome/updater/win/test/test_strings.h" |
| |
| namespace updater { |
| |
| base::Process LongRunningProcess(UpdaterScope scope, |
| const std::string& test_name, |
| base::CommandLine* cmd) { |
| base::CommandLine command_line = GetTestProcessCommandLine(scope, test_name); |
| |
| // This will ensure this new process will run for one minute before dying. |
| command_line.AppendSwitchUTF8(updater::kTestSleepSecondsSwitch, "60"); |
| |
| auto init_done_event = updater::CreateInheritableEvent( |
| base::WaitableEvent::ResetPolicy::AUTOMATIC, |
| base::WaitableEvent::InitialState::NOT_SIGNALED); |
| command_line.AppendSwitchNative( |
| updater::kInitDoneNotifierSwitch, |
| base::NumberToWString( |
| base::win::HandleToUint32(init_done_event->handle()))); |
| |
| if (cmd) { |
| *cmd = command_line; |
| } |
| |
| base::LaunchOptions launch_options; |
| launch_options.handles_to_inherit.push_back(init_done_event->handle()); |
| base::Process result = base::LaunchProcess(command_line, launch_options); |
| |
| if (!init_done_event->TimedWait(base::Seconds(10))) { |
| LOG(ERROR) << "Process did not signal"; |
| result.Terminate(/*exit_code=*/1, /*wait=*/false); |
| return base::Process(); |
| } |
| |
| return result; |
| } |
| |
| base::CommandLine GetTestProcessCommandLine(UpdaterScope scope, |
| const std::string& test_name) { |
| base::FilePath executable_path; |
| CHECK(base::PathService::Get(base::DIR_EXE, &executable_path)); |
| |
| base::CommandLine command_line( |
| executable_path.Append(kTestProcessExecutableName)); |
| if (IsSystemInstall(scope)) { |
| command_line.AppendSwitch(kSystemSwitch); |
| } |
| |
| command_line.AppendSwitchUTF8(kTestName, test_name); |
| return command_line; |
| } |
| |
| } // namespace updater |