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 |
deleted file mode 100644 |
index ad6ed0381471744ab052faa4726ff8ae71ac849f..0000000000000000000000000000000000000000 |
--- a/chrome/browser/profile_resetter/automatic_profile_resetter_unittest.cc |
+++ /dev/null |
@@ -1,1380 +0,0 @@ |
-// 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 "chrome/browser/profile_resetter/automatic_profile_resetter.h" |
- |
-#include <string> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/metrics/field_trial.h" |
-#include "base/prefs/pref_registry_simple.h" |
-#include "base/prefs/testing_pref_service.h" |
-#include "base/run_loop.h" |
-#include "base/test/test_simple_task_runner.h" |
-#include "base/threading/sequenced_worker_pool.h" |
-#include "base/values.h" |
-#include "chrome/browser/profile_resetter/automatic_profile_resetter_delegate.h" |
-#include "chrome/browser/profile_resetter/automatic_profile_resetter_factory.h" |
-#include "chrome/browser/profile_resetter/automatic_profile_resetter_mementos.h" |
-#include "chrome/browser/profile_resetter/jtl_foundation.h" |
-#include "chrome/browser/profile_resetter/jtl_instructions.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 "components/pref_registry/pref_registry_syncable.h" |
-#include "components/variations/variations_associated_data.h" |
-#include "content/public/browser/browser_thread.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::_; |
- |
-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[] = "01234567890123456789012345678901"; |
-const char kTestInvalidMementoValue[] = "12345678901234567890123456789012"; |
- |
-const char kTestPreferencePath[] = "testing.preference"; |
-const char kTestPreferenceValue[] = "testing-preference-value"; |
- |
-const char kSearchURLAttributeKey[] = "search_url"; |
-const char kTestSearchURL[] = "http://example.com/search?q={searchTerms}"; |
-const char kTestSearchURL2[] = "http://google.com/?q={searchTerms}"; |
- |
-const char kTestModuleDigest[] = "01234567890123456789012345678901"; |
-const char kTestModuleDigest2[] = "12345678901234567890123456789012"; |
- |
-// Helpers ------------------------------------------------------------------ |
- |
-// A testing version of the AutomaticProfileResetter that differs from the real |
-// one only in that it has its statistics reporting mocked out for verification. |
-class AutomaticProfileResetterUnderTest : public AutomaticProfileResetter { |
- public: |
- explicit AutomaticProfileResetterUnderTest(Profile* profile) |
- : AutomaticProfileResetter(profile) {} |
- virtual ~AutomaticProfileResetterUnderTest() {} |
- |
- MOCK_METHOD2(ReportStatistics, void(uint32, uint32)); |
- MOCK_METHOD1(ReportPromptResult, |
- void(AutomaticProfileResetter::PromptResult)); |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(AutomaticProfileResetterUnderTest); |
-}; |
- |
-class MockProfileResetterDelegate : public AutomaticProfileResetterDelegate { |
- public: |
- MockProfileResetterDelegate() |
- : emulated_is_default_search_provider_managed_(false) {} |
- virtual ~MockProfileResetterDelegate() {} |
- |
- MOCK_METHOD0(EnumerateLoadedModulesIfNeeded, void()); |
- MOCK_CONST_METHOD1(RequestCallbackWhenLoadedModulesAreEnumerated, |
- void(const base::Closure&)); |
- |
- MOCK_METHOD0(LoadTemplateURLServiceIfNeeded, void()); |
- MOCK_CONST_METHOD1(RequestCallbackWhenTemplateURLServiceIsLoaded, |
- void(const base::Closure&)); |
- |
- MOCK_METHOD0(FetchBrandcodedDefaultSettingsIfNeeded, void()); |
- MOCK_CONST_METHOD1(RequestCallbackWhenBrandcodedDefaultsAreFetched, |
- void(const base::Closure&)); |
- |
- MOCK_CONST_METHOD0(OnGetLoadedModuleNameDigestsCalled, void()); |
- MOCK_CONST_METHOD0(OnGetDefaultSearchProviderDetailsCalled, void()); |
- MOCK_CONST_METHOD0(OnIsDefaultSearchProviderManagedCalled, void()); |
- MOCK_CONST_METHOD0(OnGetPrepopulatedSearchProvidersDetailsCalled, void()); |
- |
- MOCK_METHOD0(TriggerPrompt, bool()); |
- MOCK_METHOD2(TriggerProfileSettingsReset, void(bool, const base::Closure&)); |
- MOCK_METHOD0(DismissPrompt, void()); |
- |
- virtual scoped_ptr<base::ListValue> |
- GetLoadedModuleNameDigests() const OVERRIDE { |
- OnGetLoadedModuleNameDigestsCalled(); |
- return scoped_ptr<base::ListValue>( |
- emulated_loaded_module_digests_.DeepCopy()); |
- } |
- |
- virtual scoped_ptr<base::DictionaryValue> |
- GetDefaultSearchProviderDetails() const OVERRIDE { |
- OnGetDefaultSearchProviderDetailsCalled(); |
- return scoped_ptr<base::DictionaryValue>( |
- emulated_default_search_provider_details_.DeepCopy()); |
- } |
- |
- virtual bool IsDefaultSearchProviderManaged() const OVERRIDE { |
- OnIsDefaultSearchProviderManagedCalled(); |
- return emulated_is_default_search_provider_managed_; |
- } |
- |
- virtual scoped_ptr<base::ListValue> |
- GetPrepopulatedSearchProvidersDetails() const OVERRIDE { |
- OnGetPrepopulatedSearchProvidersDetailsCalled(); |
- return scoped_ptr<base::ListValue>( |
- emulated_search_providers_details_.DeepCopy()); |
- } |
- |
- static void ClosureInvoker(const base::Closure& closure) { closure.Run(); } |
- |
- void ExpectCallsToDependenciesSetUpMethods() { |
- EXPECT_CALL(*this, EnumerateLoadedModulesIfNeeded()); |
- EXPECT_CALL(*this, LoadTemplateURLServiceIfNeeded()); |
- EXPECT_CALL(*this, RequestCallbackWhenLoadedModulesAreEnumerated(_)) |
- .WillOnce(testing::Invoke(ClosureInvoker)); |
- EXPECT_CALL(*this, RequestCallbackWhenTemplateURLServiceIsLoaded(_)) |
- .WillOnce(testing::Invoke(ClosureInvoker)); |
- } |
- |
- void ExpectCallsToGetterMethods() { |
- EXPECT_CALL(*this, OnGetLoadedModuleNameDigestsCalled()); |
- EXPECT_CALL(*this, OnGetDefaultSearchProviderDetailsCalled()); |
- EXPECT_CALL(*this, OnIsDefaultSearchProviderManagedCalled()); |
- EXPECT_CALL(*this, OnGetPrepopulatedSearchProvidersDetailsCalled()); |
- } |
- |
- void ExpectCallToShowPrompt() { |
- EXPECT_CALL(*this, TriggerPrompt()).WillOnce(testing::Return(true)); |
- EXPECT_CALL(*this, FetchBrandcodedDefaultSettingsIfNeeded()); |
- } |
- |
- void ExpectCallToTriggerReset(bool send_feedback) { |
- EXPECT_CALL(*this, TriggerProfileSettingsReset(send_feedback, _)) |
- .WillOnce(testing::SaveArg<1>(&reset_completion_)); |
- } |
- |
- base::DictionaryValue& emulated_default_search_provider_details() { |
- return emulated_default_search_provider_details_; |
- } |
- |
- base::ListValue& emulated_search_providers_details() { |
- return emulated_search_providers_details_; |
- } |
- |
- base::ListValue& emulated_loaded_module_digests() { |
- return emulated_loaded_module_digests_; |
- } |
- |
- void set_emulated_is_default_search_provider_managed(bool value) { |
- emulated_is_default_search_provider_managed_ = value; |
- } |
- |
- void EmulateProfileResetCompleted() { |
- reset_completion_.Run(); |
- } |
- |
- private: |
- base::DictionaryValue emulated_default_search_provider_details_; |
- base::ListValue emulated_search_providers_details_; |
- base::ListValue emulated_loaded_module_digests_; |
- bool emulated_is_default_search_provider_managed_; |
- base::Closure reset_completion_; |
- |
- 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); |
-}; |
- |
-std::string GetHash(const std::string& input) { |
- return jtl_foundation::Hasher(kTestHashSeed).GetHash(input); |
-} |
- |
-// Encodes a Boolean argument value into JTL bytecode. |
-std::string EncodeBool(bool value) { return value ? VALUE_TRUE : VALUE_FALSE; } |
- |
-// Constructs a simple evaluation program to test that basic input/output works |
-// well. It will emulate a scenario in which the reset criteria are satisfied as |
-// prescribed by |emulate_satisfied_criterion_{1|2}|, and the reset is triggered |
-// when either of them is true. The bits in the combined status mask will be set |
-// according to whether or not the memento values received in the input were as |
-// expected. |
-// |
-// More specifically, the output of the program will be as follows: |
-// { |
-// "satisfied_criteria_mask_bit1": emulate_satisfied_criterion_1, |
-// "satisfied_criteria_mask_bit2": emulate_satisfied_criterion_2, |
-// "combined_status_mask_bit1": |
-// (emulate_satisfied_criterion_1 || emulate_satisfied_criterion_2), |
-// "combined_status_mask_bit2": |
-// (input["memento_value_in_prefs"] == kTestMementoValue), |
-// "combined_status_mask_bit3": |
-// (input["memento_value_in_local_state"] == kTestMementoValue), |
-// "combined_status_mask_bit4": |
-// (input["memento_value_in_file"] == kTestMementoValue), |
-// "should_prompt": |
-// (emulate_satisfied_criterion_1 || emulate_satisfied_criterion_2), |
-// "had_prompted_already": <OR-combination of above three>, |
-// "memento_value_in_prefs": kTestMementoValue, |
-// "memento_value_in_local_state": kTestMementoValue, |
-// "memento_value_in_file": kTestMementoValue |
-// } |
-std::string ConstructProgram(bool emulate_satisfied_criterion_1, |
- bool emulate_satisfied_criterion_2) { |
- std::string bytecode; |
- bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit1"), |
- EncodeBool(emulate_satisfied_criterion_1)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit2"), |
- EncodeBool(emulate_satisfied_criterion_2)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_BOOL(GetHash("should_prompt"), |
- EncodeBool(emulate_satisfied_criterion_1 || |
- emulate_satisfied_criterion_2)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit1"), |
- EncodeBool(emulate_satisfied_criterion_1 || |
- emulate_satisfied_criterion_2)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_NAVIGATE(GetHash("memento_value_in_prefs")); |
- bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestMementoValue)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit2"), VALUE_TRUE); |
- bytecode += OP_STORE_BOOL(GetHash("had_prompted_already"), VALUE_TRUE); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_NAVIGATE(GetHash("memento_value_in_local_state")); |
- bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestMementoValue)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit3"), VALUE_TRUE); |
- bytecode += OP_STORE_BOOL(GetHash("had_prompted_already"), VALUE_TRUE); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_NAVIGATE(GetHash("memento_value_in_file")); |
- bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestMementoValue)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit4"), VALUE_TRUE); |
- bytecode += OP_STORE_BOOL(GetHash("had_prompted_already"), VALUE_TRUE); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_HASH(GetHash("memento_value_in_prefs"), |
- kTestMementoValue); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_HASH(GetHash("memento_value_in_local_state"), |
- kTestMementoValue); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_HASH(GetHash("memento_value_in_file"), |
- kTestMementoValue); |
- bytecode += OP_END_OF_SENTENCE; |
- return bytecode; |
-} |
- |
-// Constructs another evaluation program to specifically test that bits of the |
-// "satisfied_criteria_mask" are correctly assigned, and so is "should_prompt"; |
-// and that reset is triggered iff the latter is true, regardless of the bits |
-// in the mask (so as to allow for a non-disjunctive compound criterion). |
-// |
-// More specifically, the output of the program will be as follows: |
-// { |
-// "satisfied_criteria_mask_bitN": emulate_satisfied_odd_criteria, |
-// "satisfied_criteria_mask_bitM": emulate_satisfied_even_criteria, |
-// "combined_status_mask_bit1": emulate_should_prompt, |
-// "should_prompt": emulate_should_prompt, |
-// "memento_value_in_prefs": kTestMementoValue, |
-// "memento_value_in_local_state": kTestMementoValue, |
-// "memento_value_in_file": kTestMementoValue |
-// } |
-// ... such that N is {1,3,5} and M is {2,4}. |
-std::string ConstructProgramToExerciseCriteria( |
- bool emulate_should_prompt, |
- bool emulate_satisfied_odd_criteria, |
- bool emulate_satisfied_even_criteria) { |
- std::string bytecode; |
- bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit1"), |
- EncodeBool(emulate_satisfied_odd_criteria)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit3"), |
- EncodeBool(emulate_satisfied_odd_criteria)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit5"), |
- EncodeBool(emulate_satisfied_odd_criteria)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit2"), |
- EncodeBool(emulate_satisfied_even_criteria)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit4"), |
- EncodeBool(emulate_satisfied_even_criteria)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_BOOL(GetHash("should_prompt"), |
- EncodeBool(emulate_should_prompt)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit1"), |
- EncodeBool(emulate_should_prompt)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_HASH(GetHash("memento_value_in_prefs"), |
- kTestMementoValue); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_HASH(GetHash("memento_value_in_local_state"), |
- kTestMementoValue); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_STORE_HASH(GetHash("memento_value_in_file"), |
- kTestMementoValue); |
- bytecode += OP_END_OF_SENTENCE; |
- return bytecode; |
-} |
- |
-// Constructs another evaluation program to specifically test that local state |
-// and user preference values are included in the input as expected. We will |
-// re-purpose the output bitmasks to channel out information about the outcome |
-// of the checks. |
-// |
-// More specifically, the output of the program will be as follows: |
-// { |
-// "combined_status_mask_bit1": |
-// (input["preferences.testing.preference"] == kTestPreferenceValue) |
-// "combined_status_mask_bit2": |
-// (input["local_state.testing.preference"] == kTestPreferenceValue) |
-// "combined_status_mask_bit3": input["preferences_iuc.testing.preference"] |
-// "combined_status_mask_bit4": input["local_state_iuc.testing.preference"] |
-// } |
-std::string ConstructProgramToCheckPreferences() { |
- std::string bytecode; |
- bytecode += OP_NAVIGATE(GetHash("preferences")); |
- bytecode += OP_NAVIGATE(GetHash("testing")); |
- bytecode += OP_NAVIGATE(GetHash("preference")); |
- bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestPreferenceValue)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit1"), |
- EncodeBool(true)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_NAVIGATE(GetHash("local_state")); |
- bytecode += OP_NAVIGATE(GetHash("testing")); |
- bytecode += OP_NAVIGATE(GetHash("preference")); |
- bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestPreferenceValue)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit2"), |
- EncodeBool(true)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_NAVIGATE(GetHash("preferences_iuc")); |
- bytecode += OP_NAVIGATE(GetHash("testing")); |
- bytecode += OP_NAVIGATE(GetHash("preference")); |
- bytecode += OP_COMPARE_NODE_BOOL(EncodeBool(true)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit3"), |
- EncodeBool(true)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_NAVIGATE(GetHash("local_state_iuc")); |
- bytecode += OP_NAVIGATE(GetHash("testing")); |
- bytecode += OP_NAVIGATE(GetHash("preference")); |
- bytecode += OP_COMPARE_NODE_BOOL(EncodeBool(true)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit4"), |
- EncodeBool(true)); |
- bytecode += OP_END_OF_SENTENCE; |
- return bytecode; |
-} |
- |
-// Legend for the bitmask returned by the above program. |
-enum CombinedStatusMaskLegendForCheckingPreferences { |
- HAS_EXPECTED_USER_PREFERENCE = 1 << 0, |
- HAS_EXPECTED_LOCAL_STATE_PREFERENCE = 1 << 1, |
- USER_PREFERENCE_IS_USER_CONTROLLED = 1 << 2, |
- LOCAL_STATE_IS_USER_CONTROLLED = 1 << 3, |
-}; |
- |
-// Constructs yet another evaluation program to specifically test that default |
-// and pre-populated search engines are included in the input as expected. We |
-// will re-purpose the output bitmasks to channel out information about the |
-// outcome of the checks. |
-// |
-// More specifically, the output of the program will be as follows: |
-// { |
-// "combined_status_mask_bit1": |
-// (input["default_search_provider.search_url"] == kTestSearchURL) |
-// "combined_status_mask_bit2": input["default_search_provider_iuc"] |
-// "combined_status_mask_bit3": |
-// (input["search_providers.*.search_url"] == kTestSearchURL) |
-// "combined_status_mask_bit4": |
-// (input["search_providers.*.search_url"] == kTestSearchURL2) |
-// } |
-std::string ConstructProgramToCheckSearchEngines() { |
- std::string bytecode; |
- bytecode += OP_NAVIGATE(GetHash("default_search_provider")); |
- bytecode += OP_NAVIGATE(GetHash("search_url")); |
- bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestSearchURL)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit1"), |
- EncodeBool(true)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_NAVIGATE(GetHash("default_search_provider_iuc")); |
- bytecode += OP_COMPARE_NODE_BOOL(EncodeBool(true)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit2"), |
- EncodeBool(true)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_NAVIGATE(GetHash("search_providers")); |
- bytecode += OP_NAVIGATE_ANY; |
- bytecode += OP_NAVIGATE(GetHash("search_url")); |
- bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestSearchURL)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit3"), |
- EncodeBool(true)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_NAVIGATE(GetHash("search_providers")); |
- bytecode += OP_NAVIGATE_ANY; |
- bytecode += OP_NAVIGATE(GetHash("search_url")); |
- bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestSearchURL2)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit4"), |
- EncodeBool(true)); |
- bytecode += OP_END_OF_SENTENCE; |
- return bytecode; |
-} |
- |
-// Legend for the bitmask returned by the above program. |
-enum CombinedStatusMaskLegendForCheckingSearchEngines { |
- HAS_EXPECTED_DEFAULT_SEARCH_PROVIDER = 1 << 0, |
- DEFAULT_SEARCH_PROVIDER_IS_USER_CONTROLLED = 1 << 1, |
- HAS_EXPECTED_PREPOPULATED_SEARCH_PROVIDER_1 = 1 << 2, |
- HAS_EXPECTED_PREPOPULATED_SEARCH_PROVIDER_2 = 1 << 3, |
-}; |
- |
-// Constructs yet another evaluation program to specifically test that loaded |
-// module digests are included in the input as expected. We will re-purpose the |
-// output bitmasks to channel out information about the outcome of the checks. |
-// |
-// More specifically, the output of the program will be as follows: |
-// { |
-// "combined_status_mask_bit1": |
-// (input["loaded_modules.*"] == kTestModuleDigest) |
-// "combined_status_mask_bit2": |
-// (input["loaded_modules.*"] == kTestModuleDigest2) |
-// } |
-std::string ConstructProgramToCheckLoadedModuleDigests() { |
- std::string bytecode; |
- bytecode += OP_NAVIGATE(GetHash("loaded_modules")); |
- bytecode += OP_NAVIGATE_ANY; |
- bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestModuleDigest)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit1"), |
- EncodeBool(true)); |
- bytecode += OP_END_OF_SENTENCE; |
- bytecode += OP_NAVIGATE(GetHash("loaded_modules")); |
- bytecode += OP_NAVIGATE_ANY; |
- bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestModuleDigest2)); |
- bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit2"), |
- EncodeBool(true)); |
- bytecode += OP_END_OF_SENTENCE; |
- return bytecode; |
-} |
- |
-// Legend for the bitmask returned by the above program. |
-enum CombinedStatusMaskLegendForCheckingLoadedModules { |
- HAS_EXPECTED_MODULE_DIGEST_1 = 1 << 0, |
- HAS_EXPECTED_MODULE_DIGEST_2 = 1 << 1, |
-}; |
- |
-// Test fixtures ------------------------------------------------------------- |
- |
-class AutomaticProfileResetterTestBase : public testing::Test { |
- protected: |
- explicit AutomaticProfileResetterTestBase( |
- const std::string& experiment_group_name) |
- : waiting_task_runner_(new base::TestSimpleTaskRunner), |
- local_state_(TestingBrowserProcess::GetGlobal()), |
- profile_(new TestingProfile()), |
- field_trials_(new base::FieldTrialList(NULL)), |
- memento_in_prefs_(new PreferenceHostedPromptMemento(profile())), |
- memento_in_local_state_(new LocalStateHostedPromptMemento(profile())), |
- memento_in_file_(new FileHostedPromptMementoSynchronous(profile())), |
- experiment_group_name_(experiment_group_name), |
- inject_data_through_variation_params_(false), |
- mock_delegate_(NULL) { |
- // Make sure the factory is not optimized away, so whatever preferences it |
- // wants to register will actually get registered. |
- AutomaticProfileResetterFactory::GetInstance(); |
- |
- // Register some additional local state preferences for testing purposes. |
- PrefRegistrySimple* local_state_registry = local_state_.Get()->registry(); |
- DCHECK(local_state_registry); |
- local_state_registry->RegisterStringPref(kTestPreferencePath, ""); |
- |
- // Register some additional user preferences for testing purposes. |
- user_prefs::PrefRegistrySyncable* user_prefs_registry = |
- profile_->GetTestingPrefService()->registry(); |
- DCHECK(user_prefs_registry); |
- user_prefs_registry->RegisterStringPref( |
- kTestPreferencePath, std::string(), |
- user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
- } |
- |
- virtual void SetUp() OVERRIDE { |
- variations::testing::ClearAllVariationParams(); |
- base::FieldTrialList::CreateFieldTrial(kAutomaticProfileResetStudyName, |
- experiment_group_name_); |
- resetter_.reset( |
- new testing::StrictMock<AutomaticProfileResetterUnderTest>(profile())); |
- mock_delegate_owned_.reset( |
- new testing::StrictMock<MockProfileResetterDelegate>()); |
- mock_delegate_ = mock_delegate_owned_.get(); |
- |
- ExpectAllMementoValuesEqualTo(std::string()); |
- } |
- |
- void SetTestingHashSeed(const std::string& hash_seed) { |
- testing_hash_seed_ = hash_seed; |
- } |
- |
- void SetTestingProgram(const std::string& source_code) { |
- testing_program_ = source_code; |
- } |
- |
- void AllowInjectingTestDataThroughVariationParams(bool value) { |
- inject_data_through_variation_params_ = value; |
- } |
- |
- void ExpectAllMementoValuesEqualTo(const std::string& value) { |
- EXPECT_EQ(value, memento_in_prefs_->ReadValue()); |
- EXPECT_EQ(value, memento_in_local_state_->ReadValue()); |
- EXPECT_EQ(value, memento_in_file_->ReadValue()); |
- } |
- |
- void UnleashResetterAndWait() { |
- if (inject_data_through_variation_params_) { |
- std::map<std::string, std::string> variation_params; |
- variation_params["program"] = testing_program_; |
- variation_params["hash_seed"] = testing_hash_seed_; |
- ASSERT_TRUE(variations::AssociateVariationParams( |
- kAutomaticProfileResetStudyName, |
- experiment_group_name_, |
- variation_params)); |
- } |
- resetter_->Initialize(); |
- resetter_->SetDelegateForTesting( |
- mock_delegate_owned_.PassAs<AutomaticProfileResetterDelegate>()); |
- resetter_->SetTaskRunnerForWaitingForTesting(waiting_task_runner_); |
- if (!inject_data_through_variation_params_) { |
- resetter_->SetProgramForTesting(testing_program_); |
- resetter_->SetHashSeedForTesting(testing_hash_seed_); |
- } |
- resetter_->Activate(); |
- |
- if (waiting_task_runner_->HasPendingTask()) { |
- ASSERT_EQ(base::TimeDelta::FromSeconds(55), |
- waiting_task_runner_->NextPendingTaskDelay()); |
- waiting_task_runner_->RunPendingTasks(); |
- } |
- base::RunLoop().RunUntilIdle(); |
- content::BrowserThread::GetBlockingPool()->FlushForTesting(); |
- base::RunLoop().RunUntilIdle(); |
- } |
- |
- // Goes through an evaluation flow such that the reset criteria are satisfied. |
- // Used to reduce boilerplate for tests that need to verify behavior during |
- // the reset prompt flow. |
- void OrchestrateThroughEvaluationFlow() { |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- mock_delegate().ExpectCallToShowPrompt(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u)); |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- testing::Mock::VerifyAndClearExpectations(&resetter()); |
- testing::Mock::VerifyAndClearExpectations(&mock_delegate()); |
- } |
- |
- // Explicitly shut down the service to double-check that nothing explodes, but |
- // first, verify expectations to make sure the service makes no more calls to |
- // any mocked functions during or after shutdown. |
- void VerifyExpectationsThenShutdownResetter() { |
- testing::Mock::VerifyAndClearExpectations(&resetter()); |
- testing::Mock::VerifyAndClearExpectations(&mock_delegate()); |
- |
- resetter_->Shutdown(); |
- resetter_.reset(); |
- } |
- |
- TestingProfile* profile() { return profile_.get(); } |
- TestingPrefServiceSimple* local_state() { return local_state_.Get(); } |
- |
- PreferenceHostedPromptMemento& memento_in_prefs() { |
- return *memento_in_prefs_; |
- } |
- |
- LocalStateHostedPromptMemento& memento_in_local_state() { |
- return *memento_in_local_state_; |
- } |
- |
- FileHostedPromptMementoSynchronous& memento_in_file() { |
- return *memento_in_file_; |
- } |
- |
- MockProfileResetterDelegate& mock_delegate() { return *mock_delegate_; } |
- AutomaticProfileResetterUnderTest& resetter() { return *resetter_; } |
- |
- private: |
- content::TestBrowserThreadBundle thread_bundle_; |
- scoped_refptr<base::TestSimpleTaskRunner> waiting_task_runner_; |
- ScopedTestingLocalState local_state_; |
- scoped_ptr<TestingProfile> profile_; |
- scoped_ptr<base::FieldTrialList> field_trials_; |
- scoped_ptr<PreferenceHostedPromptMemento> memento_in_prefs_; |
- scoped_ptr<LocalStateHostedPromptMemento> memento_in_local_state_; |
- scoped_ptr<FileHostedPromptMementoSynchronous> memento_in_file_; |
- |
- std::string experiment_group_name_; |
- std::string testing_program_; |
- std::string testing_hash_seed_; |
- bool inject_data_through_variation_params_; |
- |
- scoped_ptr<AutomaticProfileResetterUnderTest> resetter_; |
- scoped_ptr<MockProfileResetterDelegate> mock_delegate_owned_; |
- MockProfileResetterDelegate* mock_delegate_; |
- |
- DISALLOW_COPY_AND_ASSIGN(AutomaticProfileResetterTestBase); |
-}; |
- |
-class AutomaticProfileResetterTest : public AutomaticProfileResetterTestBase { |
- protected: |
- AutomaticProfileResetterTest() |
- : AutomaticProfileResetterTestBase(kStudyEnabledGroupName) {} |
-}; |
- |
-class AutomaticProfileResetterTestDryRun |
- : public AutomaticProfileResetterTestBase { |
- protected: |
- AutomaticProfileResetterTestDryRun() |
- : AutomaticProfileResetterTestBase(kStudyDryRunGroupName) {} |
-}; |
- |
-class AutomaticProfileResetterTestDisabled |
- : public AutomaticProfileResetterTestBase { |
- protected: |
- AutomaticProfileResetterTestDisabled() |
- : AutomaticProfileResetterTestBase(kStudyDisabledGroupName) {} |
-}; |
- |
-// Tests --------------------------------------------------------------------- |
- |
-TEST_F(AutomaticProfileResetterTestDisabled, NothingIsDoneWhenDisabled) { |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- // No calls are expected to the delegate. |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- ExpectAllMementoValuesEqualTo(std::string()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTestDryRun, CriteriaNotSatisfied) { |
- SetTestingProgram(ConstructProgramToExerciseCriteria(false, true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x1fu, 0x00u)); |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- ExpectAllMementoValuesEqualTo(std::string()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTestDryRun, OddCriteriaSatisfied) { |
- SetTestingProgram(ConstructProgramToExerciseCriteria(true, true, false)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x15u, 0x01u)); |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_NOT_TRIGGERED)); |
- |
- UnleashResetterAndWait(); |
- |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTestDryRun, EvenCriteriaSatisfied) { |
- SetTestingProgram(ConstructProgramToExerciseCriteria(true, false, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x0au, 0x01u)); |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_NOT_TRIGGERED)); |
- |
- UnleashResetterAndWait(); |
- |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-#if defined(GOOGLE_CHROME_BUILD) |
-TEST_F(AutomaticProfileResetterTestDryRun, ProgramSetThroughVariationParams) { |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- AllowInjectingTestDataThroughVariationParams(true); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u)); |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_NOT_TRIGGERED)); |
- |
- UnleashResetterAndWait(); |
- |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
-#endif |
- |
-TEST_F(AutomaticProfileResetterTestDryRun, |
- ConditionsSatisfiedAndInvalidMementos) { |
- memento_in_prefs().StoreValue(kTestInvalidMementoValue); |
- memento_in_local_state().StoreValue(kTestInvalidMementoValue); |
- memento_in_file().StoreValue(kTestInvalidMementoValue); |
- |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u)); |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_NOT_TRIGGERED)); |
- |
- UnleashResetterAndWait(); |
- |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTestDryRun, AlreadyHadPrefHostedMemento) { |
- memento_in_prefs().StoreValue(kTestMementoValue); |
- |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x03u)); |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- EXPECT_EQ(kTestMementoValue, memento_in_prefs().ReadValue()); |
- EXPECT_EQ(std::string(), memento_in_local_state().ReadValue()); |
- EXPECT_EQ(std::string(), memento_in_file().ReadValue()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTestDryRun, AlreadyHadLocalStateHostedMemento) { |
- memento_in_local_state().StoreValue(kTestMementoValue); |
- |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x05u)); |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- EXPECT_EQ(std::string(), memento_in_prefs().ReadValue()); |
- EXPECT_EQ(kTestMementoValue, memento_in_local_state().ReadValue()); |
- EXPECT_EQ(std::string(), memento_in_file().ReadValue()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTestDryRun, AlreadyHadFileHostedMemento) { |
- memento_in_file().StoreValue(kTestMementoValue); |
- |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x09u)); |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- EXPECT_EQ(std::string(), memento_in_prefs().ReadValue()); |
- EXPECT_EQ(std::string(), memento_in_local_state().ReadValue()); |
- EXPECT_EQ(kTestMementoValue, memento_in_file().ReadValue()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTestDryRun, DoNothingWhenResourcesAreMissing) { |
- SetTestingProgram(std::string()); |
- SetTestingHashSeed(std::string()); |
- |
- // No calls are expected to the delegate. |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- ExpectAllMementoValuesEqualTo(std::string()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, CriteriaNotSatisfied) { |
- SetTestingProgram(ConstructProgramToExerciseCriteria(false, true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x1fu, 0x00u)); |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- ExpectAllMementoValuesEqualTo(std::string()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, OddCriteriaSatisfied) { |
- SetTestingProgram(ConstructProgramToExerciseCriteria(true, true, false)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- mock_delegate().ExpectCallToShowPrompt(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x15u, 0x01u)); |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, EvenCriteriaSatisfied) { |
- SetTestingProgram(ConstructProgramToExerciseCriteria(true, false, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- mock_delegate().ExpectCallToShowPrompt(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x0au, 0x01u)); |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-#if defined(GOOGLE_CHROME_BUILD) |
-TEST_F(AutomaticProfileResetterTest, ProgramSetThroughVariationParams) { |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- AllowInjectingTestDataThroughVariationParams(true); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- mock_delegate().ExpectCallToShowPrompt(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u)); |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE)); |
- |
- UnleashResetterAndWait(); |
- resetter().NotifyDidShowResetBubble(); |
- |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
-#endif |
- |
-TEST_F(AutomaticProfileResetterTest, ConditionsSatisfiedAndInvalidMementos) { |
- memento_in_prefs().StoreValue(kTestInvalidMementoValue); |
- memento_in_local_state().StoreValue(kTestInvalidMementoValue); |
- memento_in_file().StoreValue(kTestInvalidMementoValue); |
- |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- mock_delegate().ExpectCallToShowPrompt(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u)); |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE)); |
- |
- UnleashResetterAndWait(); |
- resetter().NotifyDidShowResetBubble(); |
- |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PrefHostedMementoPreventsPrompt) { |
- memento_in_prefs().StoreValue(kTestMementoValue); |
- |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x03u)); |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- EXPECT_EQ(kTestMementoValue, memento_in_prefs().ReadValue()); |
- EXPECT_EQ(std::string(), memento_in_local_state().ReadValue()); |
- EXPECT_EQ(std::string(), memento_in_file().ReadValue()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, LocalStateHostedMementoPreventsPrompt) { |
- memento_in_local_state().StoreValue(kTestMementoValue); |
- |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x05u)); |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- EXPECT_EQ(std::string(), memento_in_prefs().ReadValue()); |
- EXPECT_EQ(kTestMementoValue, memento_in_local_state().ReadValue()); |
- EXPECT_EQ(std::string(), memento_in_file().ReadValue()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, FileHostedMementoPreventsPrompt) { |
- memento_in_file().StoreValue(kTestMementoValue); |
- |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x09u)); |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- EXPECT_EQ(std::string(), memento_in_prefs().ReadValue()); |
- EXPECT_EQ(std::string(), memento_in_local_state().ReadValue()); |
- EXPECT_EQ(kTestMementoValue, memento_in_file().ReadValue()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, DoNothingWhenResourcesAreMissing) { |
- SetTestingProgram(std::string()); |
- SetTestingHashSeed(std::string()); |
- |
- // No calls are expected to the delegate. |
- |
- UnleashResetterAndWait(); |
- |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- ExpectAllMementoValuesEqualTo(std::string()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PromptSuppressed) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- VerifyExpectationsThenShutdownResetter(); |
- |
- ExpectAllMementoValuesEqualTo(std::string()); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PromptNotSupported) { |
- SetTestingProgram(ConstructProgram(true, true)); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- EXPECT_CALL(mock_delegate(), TriggerPrompt()) |
- .WillOnce(testing::Return(false)); |
- EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u)); |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_NOT_TRIGGERED)); |
- |
- UnleashResetterAndWait(); |
- |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PromptIgnored) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE)); |
- resetter().NotifyDidShowResetBubble(); |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PromptActionReset) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE)); |
- resetter().NotifyDidShowResetBubble(); |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- testing::Mock::VerifyAndClearExpectations(&resetter()); |
- |
- mock_delegate().ExpectCallToTriggerReset(false); |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_ACTION_RESET)); |
- resetter().TriggerProfileReset(false /*send_feedback*/); |
- testing::Mock::VerifyAndClearExpectations(&resetter()); |
- testing::Mock::VerifyAndClearExpectations(&mock_delegate()); |
- |
- EXPECT_CALL(mock_delegate(), DismissPrompt()); |
- mock_delegate().EmulateProfileResetCompleted(); |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PromptActionResetWithFeedback) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE)); |
- resetter().NotifyDidShowResetBubble(); |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- testing::Mock::VerifyAndClearExpectations(&resetter()); |
- |
- mock_delegate().ExpectCallToTriggerReset(true); |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_ACTION_RESET)); |
- resetter().TriggerProfileReset(true /*send_feedback*/); |
- testing::Mock::VerifyAndClearExpectations(&resetter()); |
- testing::Mock::VerifyAndClearExpectations(&mock_delegate()); |
- |
- EXPECT_CALL(mock_delegate(), DismissPrompt()); |
- mock_delegate().EmulateProfileResetCompleted(); |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PromptActionNoReset) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE)); |
- resetter().NotifyDidShowResetBubble(); |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- testing::Mock::VerifyAndClearExpectations(&resetter()); |
- |
- EXPECT_CALL(mock_delegate(), DismissPrompt()); |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_ACTION_NO_RESET)); |
- resetter().SkipProfileReset(); |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PromptFollowedByWebUIReset) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE)); |
- resetter().NotifyDidShowResetBubble(); |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- testing::Mock::VerifyAndClearExpectations(&resetter()); |
- |
- EXPECT_CALL(mock_delegate(), DismissPrompt()); |
- resetter().NotifyDidOpenWebUIResetDialog(); |
- testing::Mock::VerifyAndClearExpectations(&mock_delegate()); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_FOLLOWED_BY_WEBUI_RESET)); |
- resetter().NotifyDidCloseWebUIResetDialog(true); |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PromptFollowedByWebUINoReset) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE)); |
- resetter().NotifyDidShowResetBubble(); |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- testing::Mock::VerifyAndClearExpectations(&resetter()); |
- |
- EXPECT_CALL(mock_delegate(), DismissPrompt()); |
- resetter().NotifyDidOpenWebUIResetDialog(); |
- testing::Mock::VerifyAndClearExpectations(&mock_delegate()); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_FOLLOWED_BY_WEBUI_NO_RESET)); |
- resetter().NotifyDidCloseWebUIResetDialog(false); |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PromptFollowedByIncidentalWebUIReset) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE)); |
- resetter().NotifyDidShowResetBubble(); |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- testing::Mock::VerifyAndClearExpectations(&resetter()); |
- |
- // Missing NotifyDidOpenWebUIResetDialog(). |
- // This can arise if a settings page was already opened at the time the prompt |
- // was triggered, and this already opened dialog was used to initiate a reset |
- // after having dismissed the prompt. |
- |
- EXPECT_CALL(mock_delegate(), DismissPrompt()); |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_FOLLOWED_BY_WEBUI_RESET)); |
- resetter().NotifyDidCloseWebUIResetDialog(true); |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PromptSuppressedButHadWebUIReset) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- EXPECT_CALL(mock_delegate(), DismissPrompt()); |
- resetter().NotifyDidOpenWebUIResetDialog(); |
- testing::Mock::VerifyAndClearExpectations(&mock_delegate()); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_NOT_SHOWN_BUBBLE_BUT_HAD_WEBUI_RESET)); |
- resetter().NotifyDidCloseWebUIResetDialog(true); |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, PromptSuppressedButHadWebUINoReset) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- EXPECT_CALL(mock_delegate(), DismissPrompt()); |
- resetter().NotifyDidOpenWebUIResetDialog(); |
- testing::Mock::VerifyAndClearExpectations(&mock_delegate()); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult(AutomaticProfileResetter:: |
- PROMPT_NOT_SHOWN_BUBBLE_BUT_HAD_WEBUI_NO_RESET)); |
- resetter().NotifyDidCloseWebUIResetDialog(false); |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- EXPECT_TRUE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, BannerDismissed) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- EXPECT_CALL(resetter(), ReportPromptResult( |
- AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE)); |
- resetter().NotifyDidShowResetBubble(); |
- ExpectAllMementoValuesEqualTo(kTestMementoValue); |
- testing::Mock::VerifyAndClearExpectations(&resetter()); |
- |
- resetter().NotifyDidCloseWebUIResetBanner(); |
- |
- EXPECT_TRUE(resetter().IsResetPromptFlowActive()); |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- |
- // Note: we use strict mocks, so this also checks the bubble is not closed. |
- VerifyExpectationsThenShutdownResetter(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, BannerDismissedWhilePromptSuppressed) { |
- OrchestrateThroughEvaluationFlow(); |
- |
- resetter().NotifyDidCloseWebUIResetBanner(); |
- |
- EXPECT_TRUE(resetter().IsResetPromptFlowActive()); |
- EXPECT_FALSE(resetter().ShouldShowResetBanner()); |
- VerifyExpectationsThenShutdownResetter(); |
- |
- ExpectAllMementoValuesEqualTo(std::string()); |
-} |
- |
-// Please see comments above ConstructProgramToCheckPreferences() to understand |
-// how the following tests work. |
- |
-TEST_F(AutomaticProfileResetterTest, InputUserPreferencesCorrect) { |
- SetTestingProgram(ConstructProgramToCheckPreferences()); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- PrefService* prefs = profile()->GetPrefs(); |
- prefs->SetString(kTestPreferencePath, kTestPreferenceValue); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- uint32 expected_mask = HAS_EXPECTED_USER_PREFERENCE | |
- USER_PREFERENCE_IS_USER_CONTROLLED; |
- EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask)); |
- |
- UnleashResetterAndWait(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, InputLocalStateCorrect) { |
- SetTestingProgram(ConstructProgramToCheckPreferences()); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- PrefService* prefs = local_state(); |
- prefs->SetString(kTestPreferencePath, kTestPreferenceValue); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- uint32 expected_mask = HAS_EXPECTED_LOCAL_STATE_PREFERENCE | |
- LOCAL_STATE_IS_USER_CONTROLLED; |
- EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask)); |
- |
- UnleashResetterAndWait(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, InputManagedUserPreferencesCorrect) { |
- SetTestingProgram(ConstructProgramToCheckPreferences()); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- TestingPrefServiceSyncable* prefs = profile()->GetTestingPrefService(); |
- prefs->SetManagedPref(kTestPreferencePath, |
- new base::StringValue(kTestPreferenceValue)); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- uint32 expected_mask = HAS_EXPECTED_USER_PREFERENCE; |
- EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask)); |
- |
- UnleashResetterAndWait(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, InputManagedLocalStateCorrect) { |
- SetTestingProgram(ConstructProgramToCheckPreferences()); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- TestingPrefServiceSimple* prefs = local_state(); |
- prefs->SetManagedPref(kTestPreferencePath, |
- new base::StringValue(kTestPreferenceValue)); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- uint32 expected_mask = HAS_EXPECTED_LOCAL_STATE_PREFERENCE; |
- EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask)); |
- |
- UnleashResetterAndWait(); |
-} |
- |
-// Please see comments above ConstructProgramToCheckSearchEngines() to |
-// understand how the following tests work. |
- |
-TEST_F(AutomaticProfileResetterTest, InputDefaultSearchProviderCorrect) { |
- SetTestingProgram(ConstructProgramToCheckSearchEngines()); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().emulated_default_search_provider_details().SetString( |
- kSearchURLAttributeKey, kTestSearchURL); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- uint32 expected_mask = HAS_EXPECTED_DEFAULT_SEARCH_PROVIDER | |
- DEFAULT_SEARCH_PROVIDER_IS_USER_CONTROLLED; |
- EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask)); |
- |
- UnleashResetterAndWait(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, InputSearchProviderManagedCorrect) { |
- SetTestingProgram(ConstructProgramToCheckSearchEngines()); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().emulated_default_search_provider_details().SetString( |
- kSearchURLAttributeKey, kTestSearchURL); |
- mock_delegate().set_emulated_is_default_search_provider_managed(true); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- uint32 expected_mask = HAS_EXPECTED_DEFAULT_SEARCH_PROVIDER; |
- EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask)); |
- |
- UnleashResetterAndWait(); |
-} |
- |
-TEST_F(AutomaticProfileResetterTest, InputSearchProvidersCorrect) { |
- SetTestingProgram(ConstructProgramToCheckSearchEngines()); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- base::DictionaryValue* search_provider_1 = new base::DictionaryValue; |
- base::DictionaryValue* search_provider_2 = new base::DictionaryValue; |
- search_provider_1->SetString(kSearchURLAttributeKey, kTestSearchURL); |
- search_provider_2->SetString(kSearchURLAttributeKey, kTestSearchURL2); |
- mock_delegate().emulated_search_providers_details().Append(search_provider_1); |
- mock_delegate().emulated_search_providers_details().Append(search_provider_2); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- uint32 expected_mask = DEFAULT_SEARCH_PROVIDER_IS_USER_CONTROLLED | |
- HAS_EXPECTED_PREPOPULATED_SEARCH_PROVIDER_1 | |
- HAS_EXPECTED_PREPOPULATED_SEARCH_PROVIDER_2; |
- EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask)); |
- |
- UnleashResetterAndWait(); |
-} |
- |
-// Please see comments above ConstructProgramToCheckLoadedModuleDigests() to |
-// understand how the following tests work. |
- |
-TEST_F(AutomaticProfileResetterTest, InputModuleDigestsCorrect) { |
- SetTestingProgram(ConstructProgramToCheckLoadedModuleDigests()); |
- SetTestingHashSeed(kTestHashSeed); |
- |
- mock_delegate().emulated_loaded_module_digests().AppendString( |
- kTestModuleDigest); |
- mock_delegate().emulated_loaded_module_digests().AppendString( |
- kTestModuleDigest2); |
- |
- mock_delegate().ExpectCallsToDependenciesSetUpMethods(); |
- mock_delegate().ExpectCallsToGetterMethods(); |
- uint32 expected_mask = |
- HAS_EXPECTED_MODULE_DIGEST_1 | HAS_EXPECTED_MODULE_DIGEST_2; |
- EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask)); |
- |
- UnleashResetterAndWait(); |
-} |
- |
-} // namespace |