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))); |