| Index: chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win_unittest.cc
|
| diff --git a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win_unittest.cc b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win_unittest.cc
|
| index 9b9a5cbbb67b2ef53059fe62b0edd28c5aa946e5..d63a48c9c94706a5f07a44b8019864825bd890b9 100644
|
| --- a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win_unittest.cc
|
| +++ b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_win_unittest.cc
|
| @@ -27,6 +27,7 @@
|
| #include "components/chrome_cleaner/public/constants/constants.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/test/test_browser_thread_bundle.h"
|
| +#include "content/public/test/test_utils.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "testing/multiprocess_func_list.h"
|
| @@ -34,6 +35,7 @@
|
| namespace safe_browsing {
|
| namespace {
|
|
|
| +using ::chrome_cleaner::mojom::PromptAcceptance;
|
| using ::testing::Combine;
|
| using ::testing::DoAll;
|
| using ::testing::InvokeWithoutArgs;
|
| @@ -47,6 +49,24 @@ using IdleReason = ChromeCleanerController::IdleReason;
|
| using State = ChromeCleanerController::State;
|
| using UserResponse = ChromeCleanerController::UserResponse;
|
|
|
| +// Returns the PromptAcceptance value that ChromeCleanerController is supposed
|
| +// to send to the Chrome Cleaner process when ReplyWithUserResponse() is
|
| +// called with |user_response|.
|
| +PromptAcceptance UserResponseToPromptAcceptance(UserResponse user_response) {
|
| + switch (user_response) {
|
| + case UserResponse::kAcceptedWithLogs:
|
| + return PromptAcceptance::ACCEPTED_WITH_LOGS;
|
| + case UserResponse::kAcceptedWithoutLogs:
|
| + return PromptAcceptance::ACCEPTED_WITHOUT_LOGS;
|
| + case UserResponse::kDenied: // Fallthrough
|
| + case UserResponse::kDismissed:
|
| + return PromptAcceptance::DENIED;
|
| + }
|
| +
|
| + NOTREACHED();
|
| + return PromptAcceptance::UNSPECIFIED;
|
| +}
|
| +
|
| class MockChromeCleanerControllerObserver
|
| : public ChromeCleanerController::Observer {
|
| public:
|
| @@ -55,6 +75,8 @@ class MockChromeCleanerControllerObserver
|
| MOCK_METHOD1(OnInfected, void(const std::set<base::FilePath>&));
|
| MOCK_METHOD1(OnCleaning, void(const std::set<base::FilePath>&));
|
| MOCK_METHOD0(OnRebootRequired, void());
|
| + MOCK_METHOD0(OnRebootFailed, void());
|
| + MOCK_METHOD1(OnLogsEnabledChanged, void(bool));
|
| };
|
|
|
| enum class MetricsStatus {
|
| @@ -95,6 +117,7 @@ class ChromeCleanerControllerSimpleTest
|
| scout_enabled_ = scout_status == ScoutStatus::kEnabled;
|
|
|
| SetChromeCleanerRunnerTestDelegateForTesting(this);
|
| + ChromeCleanerController::ResetInstanceForTesting();
|
| ChromeCleanerController::GetInstance()->SetDelegateForTesting(this);
|
| scoped_feature_list_.InitAndEnableFeature(kInBrowserCleanerUIFeature);
|
| }
|
| @@ -140,6 +163,9 @@ class ChromeCleanerControllerSimpleTest
|
| return base::Process();
|
| }
|
|
|
| + void OnCleanerProcessDone(
|
| + const ChromeCleanerRunner::ProcessStatus& process_status) override {}
|
| +
|
| protected:
|
| // We need this because we need UI and IO threads during tests. The thread
|
| // bundle should be the first member of the class so that it will be destroyed
|
| @@ -233,7 +259,12 @@ class ChromeCleanerControllerTest
|
| cleaner_process_options_.set_reboot_required(
|
| uws_found_status_ == UwsFoundStatus::kUwsFoundRebootRequired);
|
| cleaner_process_options_.set_crash_point(crash_point_);
|
| + cleaner_process_options_.set_expected_user_response(
|
| + uws_found_status_ == UwsFoundStatus::kNoUwsFound
|
| + ? PromptAcceptance::DENIED
|
| + : UserResponseToPromptAcceptance(user_response_));
|
|
|
| + ChromeCleanerController::ResetInstanceForTesting();
|
| controller_ = ChromeCleanerController::GetInstance();
|
| ASSERT_TRUE(controller_);
|
|
|
| @@ -243,9 +274,6 @@ class ChromeCleanerControllerTest
|
| }
|
|
|
| void TearDown() override {
|
| - if (controller_->state() == State::kRebootRequired)
|
| - controller_->DismissRebootForTesting();
|
| -
|
| controller_->SetDelegateForTesting(nullptr);
|
| SetChromeCleanerRunnerTestDelegateForTesting(nullptr);
|
| }
|
| @@ -311,11 +339,17 @@ class ChromeCleanerControllerTest
|
| return std::move(result.process);
|
| }
|
|
|
| + void OnCleanerProcessDone(
|
| + const ChromeCleanerRunner::ProcessStatus& process_status) override {
|
| + cleaner_process_status_ = process_status;
|
| + }
|
| +
|
| ChromeCleanerController::State ExpectedFinalState() {
|
| if (process_status_ == CleanerProcessStatus::kFetchSuccessValidProcess &&
|
| crash_point_ == CrashPoint::kNone &&
|
| uws_found_status_ == UwsFoundStatus::kUwsFoundRebootRequired &&
|
| - user_response_ == UserResponse::kAccepted) {
|
| + (user_response_ == UserResponse::kAcceptedWithLogs ||
|
| + user_response_ == UserResponse::kAcceptedWithoutLogs)) {
|
| return State::kRebootRequired;
|
| }
|
| return State::kIdle;
|
| @@ -333,7 +367,8 @@ class ChromeCleanerControllerTest
|
| bool ExpectedOnCleaningCalled() {
|
| return ExpectedOnInfectedCalled() &&
|
| crash_point_ != CrashPoint::kAfterRequestSent &&
|
| - user_response_ == UserResponse::kAccepted;
|
| + (user_response_ == UserResponse::kAcceptedWithLogs ||
|
| + user_response_ == UserResponse::kAcceptedWithoutLogs);
|
| }
|
|
|
| bool ExpectedOnRebootRequiredCalled() {
|
| @@ -348,14 +383,16 @@ class ChromeCleanerControllerTest
|
| crash_point_ == CrashPoint::kAfterResponseReceived) &&
|
| (uws_found_status_ == UwsFoundStatus::kUwsFoundNoRebootRequired ||
|
| uws_found_status_ == UwsFoundStatus::kUwsFoundRebootRequired) &&
|
| - user_response_ == UserResponse::kAccepted;
|
| + (user_response_ == UserResponse::kAcceptedWithLogs ||
|
| + user_response_ == UserResponse::kAcceptedWithoutLogs);
|
| }
|
|
|
| bool ExpectedToResetSettings() {
|
| return process_status_ == CleanerProcessStatus::kFetchSuccessValidProcess &&
|
| crash_point_ == CrashPoint::kNone &&
|
| uws_found_status_ == UwsFoundStatus::kUwsFoundNoRebootRequired &&
|
| - user_response_ == UserResponse::kAccepted;
|
| + (user_response_ == UserResponse::kAcceptedWithLogs ||
|
| + user_response_ == UserResponse::kAcceptedWithoutLogs);
|
| }
|
|
|
| ChromeCleanerController::IdleReason ExpectedIdleReason() {
|
| @@ -377,7 +414,8 @@ class ChromeCleanerControllerTest
|
| }
|
|
|
| if (ExpectedOnInfectedCalled() &&
|
| - user_response_ == UserResponse::kAccepted &&
|
| + (user_response_ == UserResponse::kAcceptedWithLogs ||
|
| + user_response_ == UserResponse::kAcceptedWithoutLogs) &&
|
| crash_point_ == CrashPoint::kAfterResponseReceived) {
|
| return IdleReason::kCleaningFailed;
|
| }
|
| @@ -401,6 +439,7 @@ class ChromeCleanerControllerTest
|
|
|
| StrictMock<MockChromeCleanerControllerObserver> mock_observer_;
|
| ChromeCleanerController* controller_;
|
| + ChromeCleanerRunner::ProcessStatus cleaner_process_status_;
|
|
|
| std::vector<Profile*> profiles_tagged_;
|
| std::vector<Profile*> profiles_to_reset_if_tagged_;
|
| @@ -469,6 +508,10 @@ TEST_P(ChromeCleanerControllerTest, WithMockCleanerProcess) {
|
| controller_->ReplyWithUserResponse(profile1,
|
| user_response_);
|
| })));
|
| + // Since logs upload is enabled by default, OnLogsEnabledChanged() will be
|
| + // called only if the user response is kAcceptedWithoutLogs.
|
| + if (user_response_ == UserResponse::kAcceptedWithoutLogs)
|
| + EXPECT_CALL(mock_observer_, OnLogsEnabledChanged(false));
|
| }
|
|
|
| if (ExpectedOnCleaningCalled()) {
|
| @@ -487,7 +530,12 @@ TEST_P(ChromeCleanerControllerTest, WithMockCleanerProcess) {
|
| // never stop.
|
| ASSERT_TRUE(ExpectedOnIdleCalled() || ExpectedOnRebootRequiredCalled());
|
| run_loop.Run();
|
| + // Also ensure that we wait until the mock cleaner process has finished and
|
| + // that all tasks that posted by ChromeCleanerRunner have run.
|
| + content::RunAllBlockingPoolTasksUntilIdle();
|
|
|
| + EXPECT_NE(cleaner_process_status_.exit_code,
|
| + MockChromeCleanerProcess::kInternalTestFailureExitCode);
|
| EXPECT_EQ(controller_->state(), ExpectedFinalState());
|
| EXPECT_EQ(!files_to_delete_on_infected.empty(), ExpectedUwsFound());
|
| EXPECT_EQ(!files_to_delete_on_cleaning.empty(),
|
| @@ -529,7 +577,8 @@ INSTANTIATE_TEST_CASE_P(
|
| Values(UwsFoundStatus::kNoUwsFound,
|
| UwsFoundStatus::kUwsFoundRebootRequired,
|
| UwsFoundStatus::kUwsFoundNoRebootRequired),
|
| - Values(UserResponse::kAccepted,
|
| + Values(UserResponse::kAcceptedWithLogs,
|
| + UserResponse::kAcceptedWithoutLogs,
|
| UserResponse::kDenied,
|
| UserResponse::kDismissed)));
|
|
|
|
|