blob: 1afcaaa42f8358512fceccdd902170e9361f2022 [file] [log] [blame]
// Copyright 2015 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 "chrome/browser/safe_browsing/srt_fetcher_win.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/prefs/pref_service.h"
#include "base/test/test_simple_task_runner.h"
#include "base/time/time.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/component_updater/pref_names.h"
#include "content/public/test/test_browser_thread_bundle.h"
namespace safe_browsing {
namespace {
class SRTFetcherTest : public InProcessBrowserTest {
public:
void SetUpInProcessBrowserTestFixture() override {
task_runner_ = new base::TestSimpleTaskRunner;
SetReporterLauncherForTesting(base::Bind(
&SRTFetcherTest::ReporterLauncherForTesting, base::Unretained(this)));
SetPromptTriggerForTesting(base::Bind(
&SRTFetcherTest::PromptTriggerForTesting, base::Unretained(this)));
}
void TearDownInProcessBrowserTestFixture() override {
SetReporterLauncherForTesting(ReporterLauncher());
SetPromptTriggerForTesting(PromptTrigger());
}
void RunReporter() {
RunSwReporter(base::FilePath(), "bla", task_runner_, task_runner_);
}
void PromptTriggerForTesting(Browser* browser, const std::string& version) {
prompt_trigger_called_ = true;
}
int ReporterLauncherForTesting(const base::FilePath& exe_path,
const std::string& version) {
reporter_launched_ = true;
return exit_code_to_report_;
}
void SetDaysSinceLastReport(int days) {
PrefService* local_state = g_browser_process->local_state();
local_state->SetInt64(prefs::kSwReporterLastTimeTriggered,
(base::Time::Now() - base::TimeDelta::FromDays(days))
.ToInternalValue());
}
void ExpectToRunAgain(int days) {
ASSERT_TRUE(task_runner_->HasPendingTask());
EXPECT_LE(task_runner_->NextPendingTaskDelay(),
base::TimeDelta::FromDays(days));
EXPECT_GT(task_runner_->NextPendingTaskDelay(),
base::TimeDelta::FromDays(days) - base::TimeDelta::FromHours(1));
}
scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
bool prompt_trigger_called_ = false;
bool reporter_launched_ = false;
int exit_code_to_report_ = kReporterFailureExitCode;
};
} // namespace
IN_PROC_BROWSER_TEST_F(SRTFetcherTest, NothingFound) {
exit_code_to_report_ = kSwReporterNothingFound;
RunReporter();
task_runner_->RunPendingTasks();
EXPECT_TRUE(reporter_launched_);
base::MessageLoop::current()->RunUntilIdle();
EXPECT_FALSE(prompt_trigger_called_);
ExpectToRunAgain(kDaysBetweenSuccessfulSwReporterRuns);
}
IN_PROC_BROWSER_TEST_F(SRTFetcherTest, CleanupNeeded) {
exit_code_to_report_ = kSwReporterCleanupNeeded;
RunReporter();
task_runner_->RunPendingTasks();
EXPECT_TRUE(reporter_launched_);
// The reply task from the task posted to run the reporter is run on a
// specific thread, as opposed to a specific task runner, and that thread is
// the current message loop's thread.
base::MessageLoop::current()->RunUntilIdle();
EXPECT_TRUE(prompt_trigger_called_);
ExpectToRunAgain(kDaysBetweenSuccessfulSwReporterRuns);
}
IN_PROC_BROWSER_TEST_F(SRTFetcherTest, RanRecently) {
static const int kDaysLeft = 1;
SetDaysSinceLastReport(kDaysBetweenSuccessfulSwReporterRuns - kDaysLeft);
RunReporter();
// Here we can't run until idle since the ReporterRunner will re-post
// infinitely.
task_runner_->RunPendingTasks();
EXPECT_FALSE(reporter_launched_);
ExpectToRunAgain(kDaysLeft);
task_runner_->ClearPendingTasks();
}
IN_PROC_BROWSER_TEST_F(SRTFetcherTest, WaitForBrowser) {
Profile* profile = browser()->profile();
CloseAllBrowsers();
exit_code_to_report_ = kSwReporterCleanupNeeded;
RunReporter();
task_runner_->RunPendingTasks();
EXPECT_TRUE(reporter_launched_);
CreateBrowser(profile);
EXPECT_TRUE(prompt_trigger_called_);
ExpectToRunAgain(kDaysBetweenSuccessfulSwReporterRuns);
}
IN_PROC_BROWSER_TEST_F(SRTFetcherTest, Failure) {
exit_code_to_report_ = kReporterFailureExitCode;
RunReporter();
task_runner_->RunPendingTasks();
EXPECT_TRUE(reporter_launched_);
base::MessageLoop::current()->RunUntilIdle();
EXPECT_FALSE(prompt_trigger_called_);
ExpectToRunAgain(kDaysBetweenSuccessfulSwReporterRuns);
}
IN_PROC_BROWSER_TEST_F(SRTFetcherTest, RunDaily) {
exit_code_to_report_ = kSwReporterNothingFound;
PrefService* local_state = g_browser_process->local_state();
local_state->SetBoolean(prefs::kSwReporterPendingPrompt, true);
SetDaysSinceLastReport(kDaysBetweenSuccessfulSwReporterRuns - 1);
DCHECK_GT(kDaysBetweenSuccessfulSwReporterRuns - 1,
kDaysBetweenSwReporterRunsForPendingPrompt);
RunReporter();
task_runner_->RunPendingTasks();
EXPECT_TRUE(reporter_launched_);
reporter_launched_ = false;
base::MessageLoop::current()->RunUntilIdle();
ExpectToRunAgain(kDaysBetweenSwReporterRunsForPendingPrompt);
local_state->SetBoolean(prefs::kSwReporterPendingPrompt, false);
task_runner_->RunPendingTasks();
EXPECT_FALSE(reporter_launched_);
base::MessageLoop::current()->RunUntilIdle();
ExpectToRunAgain(kDaysBetweenSuccessfulSwReporterRuns);
}
} // namespace safe_browsing