| // Copyright 2018 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 <windows.h> |
| |
| #include <string> |
| |
| #include "base/at_exit.h" |
| #include "base/command_line.h" |
| #include "base/files/file_path.h" |
| #include "base/logging.h" |
| #include "base/strings/string16.h" |
| #include "base/strings/string_number_conversions.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "base/time/time.h" |
| #include "chrome/chrome_cleaner/os/disk_util.h" |
| #include "chrome/chrome_cleaner/os/initializer.h" |
| #include "chrome/chrome_cleaner/os/pre_fetched_paths.h" |
| #include "chrome/chrome_cleaner/os/secure_dll_loading.h" |
| #include "chrome/chrome_cleaner/test/test_strings.h" |
| #include "chrome/chrome_cleaner/test/test_util.h" |
| |
| namespace { |
| |
| constexpr base::char16 kLogFileExtension[] = L"log"; |
| |
| } // namespace |
| |
| int main(int, char**) { |
| // This must be executed as soon as possible to reduce the number of dlls that |
| // the code might try to load before we can lock things down. |
| chrome_cleaner::EnableSecureDllLoading(); |
| |
| base::AtExitManager at_exit; |
| |
| bool success = base::CommandLine::Init(0, nullptr); |
| DCHECK(success); |
| |
| if (!chrome_cleaner::SetupTestConfigs()) |
| return 1; |
| |
| // Initialize the logging settings to set a specific log file name. |
| base::FilePath exe_file_path = |
| chrome_cleaner::PreFetchedPaths::GetInstance()->GetExecutablePath(); |
| |
| base::FilePath log_file_path( |
| exe_file_path.ReplaceExtension(kLogFileExtension)); |
| logging::LoggingSettings logging_settings; |
| logging_settings.logging_dest = logging::LOG_TO_FILE; |
| logging_settings.log_file = log_file_path.value().c_str(); |
| success = logging::InitLogging(logging_settings); |
| DCHECK(success); |
| |
| LOG(INFO) << "Process Started."; |
| |
| chrome_cleaner::NotifyInitializationDoneForTesting(); |
| |
| base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
| if (command_line->HasSwitch( |
| chrome_cleaner::kTestForceOverwriteZoneIdentifier)) { |
| LOG(INFO) << "Process is overwriting the zone identifier."; |
| chrome_cleaner::OverwriteZoneIdentifier(exe_file_path); |
| } |
| |
| if (command_line->HasSwitch(chrome_cleaner::kTestSleepMinutesSwitch)) { |
| std::string value = command_line->GetSwitchValueASCII( |
| chrome_cleaner::kTestSleepMinutesSwitch); |
| int sleep_minutes = 0; |
| if (base::StringToInt(value, &sleep_minutes) && sleep_minutes > 0) { |
| LOG(INFO) << "Process is sleeping for " << sleep_minutes << " minutes"; |
| ::Sleep(base::TimeDelta::FromMinutes(sleep_minutes).InMilliseconds()); |
| } else { |
| LOG(ERROR) << "Invalid sleep delay value " << value; |
| } |
| NOTREACHED(); |
| return 1; |
| } |
| |
| if (command_line->HasSwitch(chrome_cleaner::kTestEventToSignal)) { |
| LOG(INFO) << "Process is signaling event '" |
| << chrome_cleaner::kTestEventToSignal << "'"; |
| base::string16 event_name = |
| command_line->GetSwitchValueNative(chrome_cleaner::kTestEventToSignal); |
| base::win::ScopedHandle handle( |
| ::OpenEvent(EVENT_ALL_ACCESS, TRUE, event_name.c_str())); |
| PLOG_IF(ERROR, !handle.IsValid()) |
| << "Cannot create event '" << chrome_cleaner::kTestEventToSignal << "'"; |
| base::WaitableEvent event(std::move(handle)); |
| event.Signal(); |
| } |
| |
| // TODO(pmbureau): Add more behavior to test processes termination. |
| |
| LOG(INFO) << "Process ended."; |
| return 0; |
| } |