Index: chrome/browser/profile_resetter/automatic_profile_resetter_unittest.cc |
diff --git a/chrome/browser/profile_resetter/automatic_profile_resetter_unittest.cc b/chrome/browser/profile_resetter/automatic_profile_resetter_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..798b3ca35aa3d251823d3903cb2bc2c2f941055d |
--- /dev/null |
+++ b/chrome/browser/profile_resetter/automatic_profile_resetter_unittest.cc |
@@ -0,0 +1,256 @@ |
+// Copyright 2013 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 "base/metrics/field_trial.h" |
+#include "base/run_loop.h" |
+#include "chrome/browser/profile_resetter/automatic_profile_resetter.h" |
+#include "chrome/browser/profile_resetter/automatic_profile_resetter_factory.h" |
+#include "chrome/browser/profile_resetter/automatic_profile_resetter_mementos.h" |
+#include "chrome/common/extensions/value_builder.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/test/test_browser_thread_bundle.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+using testing::_; |
+using testing::Invoke; |
+using testing::Return; |
+ |
+namespace profile_resetter { |
+namespace { |
+ |
+const char kAutomaticProfileResetStudyName[] = "AutomaticProfileReset"; |
+const char kStudyDisabledGroupName[] = "Disabled"; |
+const char kStudyDryRunGroupName[] = "DryRun"; |
+const char kStudyEnabledGroupName[] = "Enabled"; |
+ |
+const char kTestHashSeed[] = "testing-hash-seed"; |
+const char kTestMementoValue[] = "testing-menento-value"; |
+ |
+// Helpers ------------------------------------------------------------------ |
+ |
+class MockProfileResetterDelegate : public AutomaticProfileResetterDelegate { |
+ public: |
+ MockProfileResetterDelegate() {} |
+ virtual ~MockProfileResetterDelegate() {} |
+ |
+ MOCK_METHOD0(ShowPrompt, void()); |
+ MOCK_METHOD2(ReportStatistics, void(uint32, uint32)); |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MockProfileResetterDelegate); |
+}; |
+ |
+class FileHostedPromptMementoSynchronous : protected FileHostedPromptMemento { |
+ public: |
+ explicit FileHostedPromptMementoSynchronous(Profile* profile) |
+ : FileHostedPromptMemento(profile) {} |
+ |
+ std::string ReadValue() const { |
+ std::string result; |
+ FileHostedPromptMemento::ReadValue(base::Bind(&AssignArgumentTo, &result)); |
+ base::RunLoop().RunUntilIdle(); |
+ return result; |
+ } |
+ |
+ void StoreValue(const std::string& value) { |
+ FileHostedPromptMemento::StoreValue(value); |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ |
+ private: |
+ static void AssignArgumentTo(std::string* target, const std::string& value) { |
+ *target = value; |
+ } |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FileHostedPromptMementoSynchronous); |
+}; |
+ |
+// Test fixtures ------------------------------------------------------------- |
+ |
+class AutomaticProfileResetterTestBase : public testing::Test { |
+ protected: |
+ explicit AutomaticProfileResetterTestBase( |
+ const std::string& experiment_group_name) |
+ : local_state_(TestingBrowserProcess::GetGlobal()), |
+ experiment_group_name_(experiment_group_name), |
+ mock_delegate_(NULL) { |
+ // Make sure the factory is not optimized away, so prefs get registered. |
+ AutomaticProfileResetterFactory::GetInstance(); |
+ } |
+ |
+ virtual void SetUp() OVERRIDE { |
+ profile_.reset(new TestingProfile()); |
+ field_trials_.reset(new base::FieldTrialList(NULL)); |
+ base::FieldTrialList::CreateFieldTrial(kAutomaticProfileResetStudyName, |
+ experiment_group_name_); |
+ mock_delegate_ = new testing::StrictMock<MockProfileResetterDelegate>(); |
+ resetter_.reset(new AutomaticProfileResetter(profile_.get())); |
+ } |
+ |
+ void UnleashResetterAndWait() { |
+ resetter_->Initialize(); |
+ resetter_->SetDelegateForTesting(mock_delegate_); // Takes ownership. |
+ resetter_->SetHashSeedForTesting(kTestHashSeed); |
+ resetter_->SetProgramForTesting(""); // TODO(engedy). |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ |
+ TestingProfile* profile() { return profile_.get(); } |
+ |
+ MockProfileResetterDelegate& mock_delegate() { return *mock_delegate_; } |
+ AutomaticProfileResetter* resetter() { return resetter_.get(); } |
+ |
+ private: |
+ content::TestBrowserThreadBundle thread_bundle_; |
+ ScopedTestingLocalState local_state_; |
+ scoped_ptr<TestingProfile> profile_; |
+ scoped_ptr<base::FieldTrialList> field_trials_; |
+ std::string experiment_group_name_; |
+ std::string fake_program_; |
+ |
+ scoped_ptr<AutomaticProfileResetter> resetter_; |
+ MockProfileResetterDelegate* mock_delegate_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AutomaticProfileResetterTestBase); |
+}; |
+ |
+class AutomaticProfileResetterTest : public AutomaticProfileResetterTestBase { |
+ protected: |
+ AutomaticProfileResetterTest() |
+ : AutomaticProfileResetterTestBase(kStudyEnabledGroupName) {} |
+}; |
+ |
+class AutomaticProfileResetterDryRun : public AutomaticProfileResetterTestBase { |
+ protected: |
+ AutomaticProfileResetterDryRun() |
+ : AutomaticProfileResetterTestBase(kStudyDryRunGroupName) {} |
+}; |
+ |
+class AutomaticProfileResetterTestDisabled |
+ : public AutomaticProfileResetterTestBase { |
+ protected: |
+ AutomaticProfileResetterTestDisabled() |
+ : AutomaticProfileResetterTestBase(kStudyDisabledGroupName) {} |
+}; |
+ |
+// Tests --------------------------------------------------------------------- |
+ |
+TEST_F(AutomaticProfileResetterTestDisabled, NothingIsDoneWhenDisabled) { |
+ // Nothing is expected to be done. |
+ UnleashResetterAndWait(); |
+} |
+ |
+TEST_F(AutomaticProfileResetterTest, ConditionNotSatisfied) { |
+ PreferenceHostedPromptMemento memento_in_prefs(profile()); |
+ LocalStateHostedPromptMemento memento_in_local_state(profile()); |
+ FileHostedPromptMementoSynchronous memento_in_file(profile()); |
+ |
+ EXPECT_EQ("", memento_in_prefs.ReadValue()); |
+ EXPECT_EQ("", memento_in_local_state.ReadValue()); |
+ EXPECT_EQ("", memento_in_file.ReadValue()); |
+ |
+ // The preference value that would trigger reset is not set, so ShowPrompt() |
+ // is not expected to be called, and mementos are not expected to be stored. |
+ |
+ UnleashResetterAndWait(); |
+ |
+ EXPECT_EQ("", memento_in_prefs.ReadValue()); |
+ EXPECT_EQ("", memento_in_local_state.ReadValue()); |
+ EXPECT_EQ("", memento_in_file.ReadValue()); |
+} |
+ |
+TEST_F(AutomaticProfileResetterTest, ConditionSatisfied) { |
+ PreferenceHostedPromptMemento memento_in_prefs(profile()); |
+ LocalStateHostedPromptMemento memento_in_local_state(profile()); |
+ FileHostedPromptMementoSynchronous memento_in_file(profile()); |
+ |
+ EXPECT_EQ("", memento_in_prefs.ReadValue()); |
+ EXPECT_EQ("", memento_in_local_state.ReadValue()); |
+ EXPECT_EQ("", memento_in_file.ReadValue()); |
+ |
+ // TODO(engedy): Fake satisfied conditions. |
+ |
+ EXPECT_CALL(mock_delegate(), ShowPrompt()); |
+ |
+ UnleashResetterAndWait(); |
+ |
+ EXPECT_EQ(kTestMementoValue, memento_in_prefs.ReadValue()); |
+ EXPECT_EQ(kTestMementoValue, memento_in_local_state.ReadValue()); |
+ EXPECT_EQ(kTestMementoValue, memento_in_file.ReadValue()); |
+} |
+ |
+TEST_F(AutomaticProfileResetterTest, ConditionNotSatisfiedButManagedPref) { |
+ PreferenceHostedPromptMemento memento_in_prefs(profile()); |
+ LocalStateHostedPromptMemento memento_in_local_state(profile()); |
+ FileHostedPromptMementoSynchronous memento_in_file(profile()); |
+ |
+ EXPECT_EQ("", memento_in_prefs.ReadValue()); |
+ EXPECT_EQ("", memento_in_local_state.ReadValue()); |
+ EXPECT_EQ("", memento_in_file.ReadValue()); |
+ |
+ // TODO(engedy): Fake satisfied conditions, but with a managed pref. |
+ |
+ // No prompt is expected to be shown. |
+ |
+ UnleashResetterAndWait(); |
+ |
+ EXPECT_EQ("", memento_in_prefs.ReadValue()); |
+ EXPECT_EQ("", memento_in_local_state.ReadValue()); |
+ EXPECT_EQ("", memento_in_file.ReadValue()); |
+} |
+ |
+TEST_F(AutomaticProfileResetterTest, PrefHostedMementoPreventsPrompt) { |
+ PreferenceHostedPromptMemento memento_in_prefs(profile()); |
+ LocalStateHostedPromptMemento memento_in_local_state(profile()); |
+ FileHostedPromptMementoSynchronous memento_in_file(profile()); |
+ |
+ memento_in_prefs.StoreValue(kTestMementoValue); |
+ |
+ // No prompt is expected to be shown. |
+ |
+ UnleashResetterAndWait(); |
+ |
+ EXPECT_EQ(kTestMementoValue, memento_in_prefs.ReadValue()); |
+ EXPECT_EQ("", memento_in_local_state.ReadValue()); |
+ EXPECT_EQ("", memento_in_file.ReadValue()); |
+} |
+ |
+TEST_F(AutomaticProfileResetterTest, LocalStateHostedMementoPreventsPrompt) { |
+ PreferenceHostedPromptMemento memento_in_prefs(profile()); |
+ LocalStateHostedPromptMemento memento_in_local_state(profile()); |
+ FileHostedPromptMementoSynchronous memento_in_file(profile()); |
+ |
+ memento_in_local_state.StoreValue(kTestMementoValue); |
+ |
+ // No prompt is expected to be shown. |
+ |
+ UnleashResetterAndWait(); |
+ |
+ EXPECT_EQ("", memento_in_prefs.ReadValue()); |
+ EXPECT_EQ(kTestMementoValue, memento_in_local_state.ReadValue()); |
+ EXPECT_EQ("", memento_in_file.ReadValue()); |
+} |
+ |
+TEST_F(AutomaticProfileResetterTest, FileHostedMementoPreventsPrompt) { |
+ PreferenceHostedPromptMemento memento_in_prefs(profile()); |
+ LocalStateHostedPromptMemento memento_in_local_state(profile()); |
+ FileHostedPromptMementoSynchronous memento_in_file(profile()); |
+ |
+ memento_in_file.StoreValue(kTestMementoValue); |
+ |
+ // No prompt is expected to be shown. |
+ |
+ UnleashResetterAndWait(); |
+ |
+ EXPECT_EQ("", memento_in_prefs.ReadValue()); |
+ EXPECT_EQ("", memento_in_local_state.ReadValue()); |
+ EXPECT_EQ(kTestMementoValue, memento_in_file.ReadValue()); |
+} |
+ |
+} // namespace |
+} // namespace profile_resetter |