Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1324)

Unified Diff: chrome/browser/safe_browsing/incident_reporting_service_unittest.cc

Issue 341563003: Safe browsing incident reporting service improvements. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: linux_chromium_clang_dbg compile fix Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/safe_browsing/incident_reporting_service_unittest.cc
diff --git a/chrome/browser/safe_browsing/incident_reporting_service_unittest.cc b/chrome/browser/safe_browsing/incident_reporting_service_unittest.cc
index 58bee748f7184ef58f8b34a5581497eb19b3e655..f184a0dc848644107da09a86e0c251e888dca8d9 100644
--- a/chrome/browser/safe_browsing/incident_reporting_service_unittest.cc
+++ b/chrome/browser/safe_browsing/incident_reporting_service_unittest.cc
@@ -12,8 +12,18 @@
#include "base/test/test_simple_task_runner.h"
#include "base/thread_task_runner_handle.h"
#include "base/threading/thread_local.h"
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/prefs/browser_prefs.h"
#include "chrome/browser/safe_browsing/incident_report_uploader.h"
+#include "chrome/common/pref_names.h"
#include "chrome/common/safe_browsing/csd.pb.h"
+#include "chrome/test/base/scoped_testing_local_state.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_pref_service_syncable.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/notification_service.h"
#include "net/url_request/url_request_context_getter.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -74,11 +84,47 @@ class IncidentReportingServiceTest : public testing::Test {
StartUploadCallback start_upload_callback_;
};
+ // A class that registers for PROFILE_CREATED notifications and invokes a
+ // callback upon receipt. This is used by the test fixture to provide a means
+ // to submit an incident during profile initialization before the reporting
+ // service notices that profile creation has completed.
mattm 2014/06/18 21:07:18 Is it guaranteed that this observer will be called
grt (UTC plus 2) 2014/06/18 22:47:58 In the current implementation, yes. It's not docum
mattm 2014/06/18 23:05:38 Realistically it's probably fine.. main concern wo
grt (UTC plus 2) 2014/06/19 02:24:39 I've removed the notification service magic in fav
+ class PreProfileInitRegistrar : public content::NotificationObserver {
+ public:
+ PreProfileInitRegistrar(
+ const base::Callback<void(Profile*)>& profile_created_closure)
+ : profile_created_closure_(profile_created_closure) {
+ notification_registrar_.Add(this,
+ chrome::NOTIFICATION_PROFILE_CREATED,
+ content::NotificationService::AllSources());
+ }
+
+ private:
+ virtual void Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) OVERRIDE {
+ if (type == chrome::NOTIFICATION_PROFILE_CREATED) {
+ Profile* profile = content::Source<Profile>(source).ptr();
+ if (!profile->IsOffTheRecord())
+ profile_created_closure_.Run(profile);
+ }
+ }
+
+ content::NotificationRegistrar notification_registrar_;
+ base::Callback<void(Profile*)> profile_created_closure_;
+
+ DISALLOW_COPY_AND_ASSIGN(PreProfileInitRegistrar);
+ };
+
+ static const int64 kIncidentTimeMsec;
static const char kFakeOsName[];
IncidentReportingServiceTest()
: task_runner_(new base::TestSimpleTaskRunner),
thread_task_runner_handle_(task_runner_),
+ local_state_(TestingBrowserProcess::GetGlobal()),
+ pre_profile_init_registrar_(
+ base::Bind(&IncidentReportingServiceTest::PreProfileInit,
+ base::Unretained(this))),
instance_(new TestIncidentReportingService(
task_runner_,
base::Bind(&IncidentReportingServiceTest::CollectEnvironmentData,
@@ -87,20 +133,70 @@ class IncidentReportingServiceTest : public testing::Test {
base::Unretained(this)))),
upload_result_(safe_browsing::IncidentReportUploader::UPLOAD_SUCCESS),
environment_collected_(),
- uploader_destroyed_() {
- instance_->SetEnabled(true);
+ uploader_destroyed_() {}
+
+ // Begins the test by creating a profile. An incident will be created within
+ // PreProfileInit. Tasks are run to allow the service to operate to
+ // completion.
+ void CreateProfileAndRunTest(bool safe_browsing_enabled) {
+ // Create prefs for the profile with safe browsing enabled or not.
+ scoped_ptr<TestingPrefServiceSyncable> prefs(
+ new TestingPrefServiceSyncable);
+ chrome::RegisterUserProfilePrefs(prefs->registry());
+ prefs->SetBoolean(prefs::kSafeBrowsingEnabled, safe_browsing_enabled);
+
+ // Build the test profile (PreProfileInit will be called).
+ TestingProfile::Builder builder;
+ builder.SetPrefService(prefs.PassAs<PrefServiceSyncable>());
+ testing_profile_ = builder.Build().Pass();
+
+ // Let all tasks run.
+ task_runner_->RunUntilIdle();
mattm 2014/06/18 21:07:18 I didn't notice before, but how does this work? Sh
grt (UTC plus 2) 2014/06/18 22:47:58 I had the same "huh?" moment. TestSimpleTaskRunner
mattm 2014/06/18 23:05:38 Ah ha, thanks.
}
+ // Returns an incident suitable for testing.
+ scoped_ptr<safe_browsing::ClientIncidentReport_IncidentData>
+ MakeTestIncident() {
+ scoped_ptr<safe_browsing::ClientIncidentReport_IncidentData> incident(
+ new safe_browsing::ClientIncidentReport_IncidentData());
+ incident->set_incident_time_msec(kIncidentTimeMsec);
+ incident->mutable_tracked_preference();
+ return incident.Pass();
+ }
+
+ // Confirms that the test incident was uploaded by the service.
+ void ExpectTestIncidentUploaded() {
+ ASSERT_TRUE(uploaded_report_);
+ ASSERT_EQ(1, uploaded_report_->incident_size());
+ ASSERT_TRUE(uploaded_report_->incident(0).has_incident_time_msec());
+ ASSERT_EQ(kIncidentTimeMsec,
+ uploaded_report_->incident(0).incident_time_msec());
+ ASSERT_TRUE(uploaded_report_->has_environment());
+ ASSERT_TRUE(uploaded_report_->environment().has_os());
+ ASSERT_TRUE(uploaded_report_->environment().os().has_os_name());
+ ASSERT_EQ(std::string(kFakeOsName),
+ uploaded_report_->environment().os().os_name());
+ }
+
+ void ExpectNoUpload() { ASSERT_FALSE(uploaded_report_); }
+
bool HasCollectedEnvironmentData() const { return environment_collected_; }
bool UploaderDestroyed() const { return uploader_destroyed_; }
scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
base::ThreadTaskRunnerHandle thread_task_runner_handle_;
+ ScopedTestingLocalState local_state_;
+
+ // This registrar must be constructed before the service instance below.
+ PreProfileInitRegistrar pre_profile_init_registrar_;
+
+ // This service instance must be constructed after the registrar above.
scoped_ptr<safe_browsing::IncidentReportingService> instance_;
safe_browsing::IncidentReportUploader::Result upload_result_;
bool environment_collected_;
scoped_ptr<safe_browsing::ClientIncidentReport> uploaded_report_;
bool uploader_destroyed_;
+ scoped_ptr<TestingProfile> testing_profile_;
private:
// A fake IncidentReportUploader that posts a task to provide a given response
@@ -136,6 +232,17 @@ class IncidentReportingServiceTest : public testing::Test {
DISALLOW_COPY_AND_ASSIGN(FakeUploader);
};
+ // A callback run by the test fixture when a profile is created. An incident
+ // is added.
+ void PreProfileInit(Profile* profile) {
+ // The instance must have already been created.
+ ASSERT_TRUE(instance_);
+ // Add a test incident to the service.
+ instance_->GetAddIncidentCallback(profile).Run(MakeTestIncident().Pass());
+ }
+
+ // A fake CollectEnvironmentData implementation invoked by the service during
+ // operation.
void CollectEnvironmentData(
safe_browsing::ClientIncidentReport_EnvironmentData* data) {
ASSERT_NE(
@@ -145,6 +252,7 @@ class IncidentReportingServiceTest : public testing::Test {
environment_collected_ = true;
}
+ // A fake StartUpload implementation invoked by the service during operation.
scoped_ptr<safe_browsing::IncidentReportUploader> StartUpload(
const safe_browsing::IncidentReportUploader::OnResultCallback& callback,
const safe_browsing::ClientIncidentReport& report) {
@@ -167,43 +275,36 @@ base::LazyInstance<base::ThreadLocalPointer<
LAZY_INSTANCE_INITIALIZER;
// static
+const int64 IncidentReportingServiceTest::kIncidentTimeMsec = 47LL;
const char IncidentReportingServiceTest::kFakeOsName[] = "fakedows";
+// Tests that an incident added during profile initialization when safe browsing
+// is on is uploaded.
TEST_F(IncidentReportingServiceTest, AddIncident) {
- // Make up a dummy incident.
- const int64 kIncidentTimeMsec = 47LL;
- scoped_ptr<safe_browsing::ClientIncidentReport_IncidentData> incident(
- new safe_browsing::ClientIncidentReport_IncidentData());
- incident->set_incident_time_msec(kIncidentTimeMsec);
-
- // Add it to the service.
- instance_->GetAddIncidentCallback().Run(incident.Pass());
-
- // Let all tasks run.
- task_runner_->RunUntilIdle();
+ // Create the profile, thereby causing the test to begin.
+ CreateProfileAndRunTest(true);
// Verify that environment collection took place.
EXPECT_TRUE(HasCollectedEnvironmentData());
// Verify that report upload took place and contained the incident and
// environment data.
- ASSERT_TRUE(uploaded_report_);
- ASSERT_EQ(1, uploaded_report_->incident_size());
- ASSERT_TRUE(uploaded_report_->incident(0).has_incident_time_msec());
- ASSERT_EQ(kIncidentTimeMsec,
- uploaded_report_->incident(0).incident_time_msec());
- ASSERT_TRUE(uploaded_report_->has_environment());
- ASSERT_TRUE(uploaded_report_->environment().has_os());
- ASSERT_TRUE(uploaded_report_->environment().os().has_os_name());
- ASSERT_EQ(std::string(kFakeOsName),
- uploaded_report_->environment().os().os_name());
+ ExpectTestIncidentUploaded();
// Verify that the uploader was destroyed.
ASSERT_TRUE(UploaderDestroyed());
}
-// Nothing happens when disabled
-// Nothing is sent when disabled before/after environment collection
+// Tests that an incident added during profile initialization when safe browsing
+// is off is not uploaded.
+TEST_F(IncidentReportingServiceTest, NoSafeBrowsing) {
+ // Create the profile, thereby causing the test to begin.
+ CreateProfileAndRunTest(false);
+
+ // Verify that no report upload took place.
+ ExpectNoUpload();
+}
+
// Duplicate incidents are stripped
// Parallel uploads
// Shutdown during processing

Powered by Google App Engine
This is Rietveld 408576698