Home | History | Annotate | Download | only in profile_resetter
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/profile_resetter/automatic_profile_resetter.h"
      6 
      7 #include <string>
      8 
      9 #include "base/bind.h"
     10 #include "base/bind_helpers.h"
     11 #include "base/metrics/field_trial.h"
     12 #include "base/prefs/pref_registry_simple.h"
     13 #include "base/prefs/testing_pref_service.h"
     14 #include "base/run_loop.h"
     15 #include "base/test/test_simple_task_runner.h"
     16 #include "base/threading/sequenced_worker_pool.h"
     17 #include "base/values.h"
     18 #include "chrome/browser/profile_resetter/automatic_profile_resetter_delegate.h"
     19 #include "chrome/browser/profile_resetter/automatic_profile_resetter_factory.h"
     20 #include "chrome/browser/profile_resetter/automatic_profile_resetter_mementos.h"
     21 #include "chrome/browser/profile_resetter/jtl_foundation.h"
     22 #include "chrome/browser/profile_resetter/jtl_instructions.h"
     23 #include "chrome/test/base/scoped_testing_local_state.h"
     24 #include "chrome/test/base/testing_browser_process.h"
     25 #include "chrome/test/base/testing_pref_service_syncable.h"
     26 #include "chrome/test/base/testing_profile.h"
     27 #include "components/pref_registry/pref_registry_syncable.h"
     28 #include "components/variations/variations_associated_data.h"
     29 #include "content/public/browser/browser_thread.h"
     30 #include "content/public/test/test_browser_thread_bundle.h"
     31 #include "testing/gmock/include/gmock/gmock.h"
     32 #include "testing/gtest/include/gtest/gtest.h"
     33 
     34 using testing::_;
     35 
     36 namespace {
     37 
     38 const char kAutomaticProfileResetStudyName[] = "AutomaticProfileReset";
     39 const char kStudyDisabledGroupName[] = "Disabled";
     40 const char kStudyDryRunGroupName[] = "DryRun";
     41 const char kStudyEnabledGroupName[] = "Enabled";
     42 
     43 const char kTestHashSeed[] = "testing-hash-seed";
     44 const char kTestMementoValue[] = "01234567890123456789012345678901";
     45 const char kTestInvalidMementoValue[] = "12345678901234567890123456789012";
     46 
     47 const char kTestPreferencePath[] = "testing.preference";
     48 const char kTestPreferenceValue[] = "testing-preference-value";
     49 
     50 const char kSearchURLAttributeKey[] = "search_url";
     51 const char kTestSearchURL[] = "http://example.com/search?q={searchTerms}";
     52 const char kTestSearchURL2[] = "http://google.com/?q={searchTerms}";
     53 
     54 const char kTestModuleDigest[] = "01234567890123456789012345678901";
     55 const char kTestModuleDigest2[] = "12345678901234567890123456789012";
     56 
     57 // Helpers ------------------------------------------------------------------
     58 
     59 // A testing version of the AutomaticProfileResetter that differs from the real
     60 // one only in that it has its statistics reporting mocked out for verification.
     61 class AutomaticProfileResetterUnderTest : public AutomaticProfileResetter {
     62  public:
     63   explicit AutomaticProfileResetterUnderTest(Profile* profile)
     64       : AutomaticProfileResetter(profile) {}
     65   virtual ~AutomaticProfileResetterUnderTest() {}
     66 
     67   MOCK_METHOD2(ReportStatistics, void(uint32, uint32));
     68   MOCK_METHOD1(ReportPromptResult,
     69       void(AutomaticProfileResetter::PromptResult));
     70 
     71  private:
     72   DISALLOW_COPY_AND_ASSIGN(AutomaticProfileResetterUnderTest);
     73 };
     74 
     75 class MockProfileResetterDelegate : public AutomaticProfileResetterDelegate {
     76  public:
     77   MockProfileResetterDelegate()
     78       : emulated_is_default_search_provider_managed_(false) {}
     79   virtual ~MockProfileResetterDelegate() {}
     80 
     81   MOCK_METHOD0(EnumerateLoadedModulesIfNeeded, void());
     82   MOCK_CONST_METHOD1(RequestCallbackWhenLoadedModulesAreEnumerated,
     83                      void(const base::Closure&));
     84 
     85   MOCK_METHOD0(LoadTemplateURLServiceIfNeeded, void());
     86   MOCK_CONST_METHOD1(RequestCallbackWhenTemplateURLServiceIsLoaded,
     87                      void(const base::Closure&));
     88 
     89   MOCK_METHOD0(FetchBrandcodedDefaultSettingsIfNeeded, void());
     90   MOCK_CONST_METHOD1(RequestCallbackWhenBrandcodedDefaultsAreFetched,
     91                      void(const base::Closure&));
     92 
     93   MOCK_CONST_METHOD0(OnGetLoadedModuleNameDigestsCalled, void());
     94   MOCK_CONST_METHOD0(OnGetDefaultSearchProviderDetailsCalled, void());
     95   MOCK_CONST_METHOD0(OnIsDefaultSearchProviderManagedCalled, void());
     96   MOCK_CONST_METHOD0(OnGetPrepopulatedSearchProvidersDetailsCalled, void());
     97 
     98   MOCK_METHOD0(TriggerPrompt, bool());
     99   MOCK_METHOD2(TriggerProfileSettingsReset, void(bool, const base::Closure&));
    100   MOCK_METHOD0(DismissPrompt, void());
    101 
    102   virtual scoped_ptr<base::ListValue>
    103       GetLoadedModuleNameDigests() const OVERRIDE {
    104     OnGetLoadedModuleNameDigestsCalled();
    105     return scoped_ptr<base::ListValue>(
    106         emulated_loaded_module_digests_.DeepCopy());
    107   }
    108 
    109   virtual scoped_ptr<base::DictionaryValue>
    110       GetDefaultSearchProviderDetails() const OVERRIDE {
    111     OnGetDefaultSearchProviderDetailsCalled();
    112     return scoped_ptr<base::DictionaryValue>(
    113         emulated_default_search_provider_details_.DeepCopy());
    114   }
    115 
    116   virtual bool IsDefaultSearchProviderManaged() const OVERRIDE {
    117     OnIsDefaultSearchProviderManagedCalled();
    118     return emulated_is_default_search_provider_managed_;
    119   }
    120 
    121   virtual scoped_ptr<base::ListValue>
    122       GetPrepopulatedSearchProvidersDetails() const OVERRIDE {
    123     OnGetPrepopulatedSearchProvidersDetailsCalled();
    124     return scoped_ptr<base::ListValue>(
    125         emulated_search_providers_details_.DeepCopy());
    126   }
    127 
    128   static void ClosureInvoker(const base::Closure& closure) { closure.Run(); }
    129 
    130   void ExpectCallsToDependenciesSetUpMethods() {
    131     EXPECT_CALL(*this, EnumerateLoadedModulesIfNeeded());
    132     EXPECT_CALL(*this, LoadTemplateURLServiceIfNeeded());
    133     EXPECT_CALL(*this, RequestCallbackWhenLoadedModulesAreEnumerated(_))
    134         .WillOnce(testing::Invoke(ClosureInvoker));
    135     EXPECT_CALL(*this, RequestCallbackWhenTemplateURLServiceIsLoaded(_))
    136         .WillOnce(testing::Invoke(ClosureInvoker));
    137   }
    138 
    139   void ExpectCallsToGetterMethods() {
    140     EXPECT_CALL(*this, OnGetLoadedModuleNameDigestsCalled());
    141     EXPECT_CALL(*this, OnGetDefaultSearchProviderDetailsCalled());
    142     EXPECT_CALL(*this, OnIsDefaultSearchProviderManagedCalled());
    143     EXPECT_CALL(*this, OnGetPrepopulatedSearchProvidersDetailsCalled());
    144   }
    145 
    146   void ExpectCallToShowPrompt() {
    147     EXPECT_CALL(*this, TriggerPrompt()).WillOnce(testing::Return(true));
    148     EXPECT_CALL(*this, FetchBrandcodedDefaultSettingsIfNeeded());
    149   }
    150 
    151   void ExpectCallToTriggerReset(bool send_feedback) {
    152     EXPECT_CALL(*this, TriggerProfileSettingsReset(send_feedback, _))
    153         .WillOnce(testing::SaveArg<1>(&reset_completion_));
    154   }
    155 
    156   base::DictionaryValue& emulated_default_search_provider_details() {
    157     return emulated_default_search_provider_details_;
    158   }
    159 
    160   base::ListValue& emulated_search_providers_details() {
    161     return emulated_search_providers_details_;
    162   }
    163 
    164   base::ListValue& emulated_loaded_module_digests() {
    165     return emulated_loaded_module_digests_;
    166   }
    167 
    168   void set_emulated_is_default_search_provider_managed(bool value) {
    169     emulated_is_default_search_provider_managed_ = value;
    170   }
    171 
    172   void EmulateProfileResetCompleted() {
    173     reset_completion_.Run();
    174   }
    175 
    176  private:
    177   base::DictionaryValue emulated_default_search_provider_details_;
    178   base::ListValue emulated_search_providers_details_;
    179   base::ListValue emulated_loaded_module_digests_;
    180   bool emulated_is_default_search_provider_managed_;
    181   base::Closure reset_completion_;
    182 
    183   DISALLOW_COPY_AND_ASSIGN(MockProfileResetterDelegate);
    184 };
    185 
    186 class FileHostedPromptMementoSynchronous : protected FileHostedPromptMemento {
    187  public:
    188   explicit FileHostedPromptMementoSynchronous(Profile* profile)
    189       : FileHostedPromptMemento(profile) {}
    190 
    191   std::string ReadValue() const {
    192     std::string result;
    193     FileHostedPromptMemento::ReadValue(base::Bind(&AssignArgumentTo, &result));
    194     base::RunLoop().RunUntilIdle();
    195     return result;
    196   }
    197 
    198   void StoreValue(const std::string& value) {
    199     FileHostedPromptMemento::StoreValue(value);
    200     base::RunLoop().RunUntilIdle();
    201   }
    202 
    203  private:
    204   static void AssignArgumentTo(std::string* target, const std::string& value) {
    205     *target = value;
    206   }
    207 
    208   DISALLOW_COPY_AND_ASSIGN(FileHostedPromptMementoSynchronous);
    209 };
    210 
    211 std::string GetHash(const std::string& input) {
    212   return jtl_foundation::Hasher(kTestHashSeed).GetHash(input);
    213 }
    214 
    215 // Encodes a Boolean argument value into JTL bytecode.
    216 std::string EncodeBool(bool value) { return value ? VALUE_TRUE : VALUE_FALSE; }
    217 
    218 // Constructs a simple evaluation program to test that basic input/output works
    219 // well. It will emulate a scenario in which the reset criteria are satisfied as
    220 // prescribed by |emulate_satisfied_criterion_{1|2}|, and the reset is triggered
    221 // when either of them is true. The bits in the combined status mask will be set
    222 // according to whether or not the memento values received in the input were as
    223 // expected.
    224 //
    225 // More specifically, the output of the program will be as follows:
    226 // {
    227 //   "satisfied_criteria_mask_bit1": emulate_satisfied_criterion_1,
    228 //   "satisfied_criteria_mask_bit2": emulate_satisfied_criterion_2,
    229 //   "combined_status_mask_bit1":
    230 //      (emulate_satisfied_criterion_1 || emulate_satisfied_criterion_2),
    231 //   "combined_status_mask_bit2":
    232 //      (input["memento_value_in_prefs"] == kTestMementoValue),
    233 //   "combined_status_mask_bit3":
    234 //      (input["memento_value_in_local_state"] == kTestMementoValue),
    235 //   "combined_status_mask_bit4":
    236 //      (input["memento_value_in_file"] == kTestMementoValue),
    237 //   "should_prompt":
    238 //      (emulate_satisfied_criterion_1 || emulate_satisfied_criterion_2),
    239 //   "had_prompted_already": <OR-combination of above three>,
    240 //   "memento_value_in_prefs": kTestMementoValue,
    241 //   "memento_value_in_local_state": kTestMementoValue,
    242 //   "memento_value_in_file": kTestMementoValue
    243 // }
    244 std::string ConstructProgram(bool emulate_satisfied_criterion_1,
    245                              bool emulate_satisfied_criterion_2) {
    246   std::string bytecode;
    247   bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit1"),
    248                             EncodeBool(emulate_satisfied_criterion_1));
    249   bytecode += OP_END_OF_SENTENCE;
    250   bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit2"),
    251                             EncodeBool(emulate_satisfied_criterion_2));
    252   bytecode += OP_END_OF_SENTENCE;
    253   bytecode += OP_STORE_BOOL(GetHash("should_prompt"),
    254                             EncodeBool(emulate_satisfied_criterion_1 ||
    255                                        emulate_satisfied_criterion_2));
    256   bytecode += OP_END_OF_SENTENCE;
    257   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit1"),
    258                             EncodeBool(emulate_satisfied_criterion_1 ||
    259                                        emulate_satisfied_criterion_2));
    260   bytecode += OP_END_OF_SENTENCE;
    261   bytecode += OP_NAVIGATE(GetHash("memento_value_in_prefs"));
    262   bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestMementoValue));
    263   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit2"), VALUE_TRUE);
    264   bytecode += OP_STORE_BOOL(GetHash("had_prompted_already"), VALUE_TRUE);
    265   bytecode += OP_END_OF_SENTENCE;
    266   bytecode += OP_NAVIGATE(GetHash("memento_value_in_local_state"));
    267   bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestMementoValue));
    268   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit3"), VALUE_TRUE);
    269   bytecode += OP_STORE_BOOL(GetHash("had_prompted_already"), VALUE_TRUE);
    270   bytecode += OP_END_OF_SENTENCE;
    271   bytecode += OP_NAVIGATE(GetHash("memento_value_in_file"));
    272   bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestMementoValue));
    273   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit4"), VALUE_TRUE);
    274   bytecode += OP_STORE_BOOL(GetHash("had_prompted_already"), VALUE_TRUE);
    275   bytecode += OP_END_OF_SENTENCE;
    276   bytecode += OP_STORE_HASH(GetHash("memento_value_in_prefs"),
    277                             kTestMementoValue);
    278   bytecode += OP_END_OF_SENTENCE;
    279   bytecode += OP_STORE_HASH(GetHash("memento_value_in_local_state"),
    280                             kTestMementoValue);
    281   bytecode += OP_END_OF_SENTENCE;
    282   bytecode += OP_STORE_HASH(GetHash("memento_value_in_file"),
    283                             kTestMementoValue);
    284   bytecode += OP_END_OF_SENTENCE;
    285   return bytecode;
    286 }
    287 
    288 // Constructs another evaluation program to specifically test that bits of the
    289 // "satisfied_criteria_mask" are correctly assigned, and so is "should_prompt";
    290 // and that reset is triggered iff the latter is true, regardless of the bits
    291 // in the mask (so as to allow for a non-disjunctive compound criterion).
    292 //
    293 // More specifically, the output of the program will be as follows:
    294 // {
    295 //   "satisfied_criteria_mask_bitN": emulate_satisfied_odd_criteria,
    296 //   "satisfied_criteria_mask_bitM": emulate_satisfied_even_criteria,
    297 //   "combined_status_mask_bit1": emulate_should_prompt,
    298 //   "should_prompt": emulate_should_prompt,
    299 //   "memento_value_in_prefs": kTestMementoValue,
    300 //   "memento_value_in_local_state": kTestMementoValue,
    301 //   "memento_value_in_file": kTestMementoValue
    302 // }
    303 // ... such that N is {1,3,5} and M is {2,4}.
    304 std::string ConstructProgramToExerciseCriteria(
    305     bool emulate_should_prompt,
    306     bool emulate_satisfied_odd_criteria,
    307     bool emulate_satisfied_even_criteria) {
    308   std::string bytecode;
    309   bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit1"),
    310                             EncodeBool(emulate_satisfied_odd_criteria));
    311   bytecode += OP_END_OF_SENTENCE;
    312   bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit3"),
    313                             EncodeBool(emulate_satisfied_odd_criteria));
    314   bytecode += OP_END_OF_SENTENCE;
    315   bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit5"),
    316                             EncodeBool(emulate_satisfied_odd_criteria));
    317   bytecode += OP_END_OF_SENTENCE;
    318   bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit2"),
    319                             EncodeBool(emulate_satisfied_even_criteria));
    320   bytecode += OP_END_OF_SENTENCE;
    321   bytecode += OP_STORE_BOOL(GetHash("satisfied_criteria_mask_bit4"),
    322                             EncodeBool(emulate_satisfied_even_criteria));
    323   bytecode += OP_END_OF_SENTENCE;
    324   bytecode += OP_STORE_BOOL(GetHash("should_prompt"),
    325                             EncodeBool(emulate_should_prompt));
    326   bytecode += OP_END_OF_SENTENCE;
    327   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit1"),
    328                             EncodeBool(emulate_should_prompt));
    329   bytecode += OP_END_OF_SENTENCE;
    330   bytecode += OP_STORE_HASH(GetHash("memento_value_in_prefs"),
    331                             kTestMementoValue);
    332   bytecode += OP_END_OF_SENTENCE;
    333   bytecode += OP_STORE_HASH(GetHash("memento_value_in_local_state"),
    334                             kTestMementoValue);
    335   bytecode += OP_END_OF_SENTENCE;
    336   bytecode += OP_STORE_HASH(GetHash("memento_value_in_file"),
    337                             kTestMementoValue);
    338   bytecode += OP_END_OF_SENTENCE;
    339   return bytecode;
    340 }
    341 
    342 // Constructs another evaluation program to specifically test that local state
    343 // and user preference values are included in the input as expected. We will
    344 // re-purpose the output bitmasks to channel out information about the outcome
    345 // of the checks.
    346 //
    347 // More specifically, the output of the program will be as follows:
    348 // {
    349 //   "combined_status_mask_bit1":
    350 //       (input["preferences.testing.preference"] == kTestPreferenceValue)
    351 //   "combined_status_mask_bit2":
    352 //       (input["local_state.testing.preference"] == kTestPreferenceValue)
    353 //   "combined_status_mask_bit3": input["preferences_iuc.testing.preference"]
    354 //   "combined_status_mask_bit4": input["local_state_iuc.testing.preference"]
    355 // }
    356 std::string ConstructProgramToCheckPreferences() {
    357   std::string bytecode;
    358   bytecode += OP_NAVIGATE(GetHash("preferences"));
    359   bytecode += OP_NAVIGATE(GetHash("testing"));
    360   bytecode += OP_NAVIGATE(GetHash("preference"));
    361   bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestPreferenceValue));
    362   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit1"),
    363                             EncodeBool(true));
    364   bytecode += OP_END_OF_SENTENCE;
    365   bytecode += OP_NAVIGATE(GetHash("local_state"));
    366   bytecode += OP_NAVIGATE(GetHash("testing"));
    367   bytecode += OP_NAVIGATE(GetHash("preference"));
    368   bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestPreferenceValue));
    369   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit2"),
    370                             EncodeBool(true));
    371   bytecode += OP_END_OF_SENTENCE;
    372   bytecode += OP_NAVIGATE(GetHash("preferences_iuc"));
    373   bytecode += OP_NAVIGATE(GetHash("testing"));
    374   bytecode += OP_NAVIGATE(GetHash("preference"));
    375   bytecode += OP_COMPARE_NODE_BOOL(EncodeBool(true));
    376   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit3"),
    377                             EncodeBool(true));
    378   bytecode += OP_END_OF_SENTENCE;
    379   bytecode += OP_NAVIGATE(GetHash("local_state_iuc"));
    380   bytecode += OP_NAVIGATE(GetHash("testing"));
    381   bytecode += OP_NAVIGATE(GetHash("preference"));
    382   bytecode += OP_COMPARE_NODE_BOOL(EncodeBool(true));
    383   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit4"),
    384                             EncodeBool(true));
    385   bytecode += OP_END_OF_SENTENCE;
    386   return bytecode;
    387 }
    388 
    389 // Legend for the bitmask returned by the above program.
    390 enum CombinedStatusMaskLegendForCheckingPreferences {
    391   HAS_EXPECTED_USER_PREFERENCE = 1 << 0,
    392   HAS_EXPECTED_LOCAL_STATE_PREFERENCE = 1 << 1,
    393   USER_PREFERENCE_IS_USER_CONTROLLED = 1 << 2,
    394   LOCAL_STATE_IS_USER_CONTROLLED = 1 << 3,
    395 };
    396 
    397 // Constructs yet another evaluation program to specifically test that default
    398 // and pre-populated search engines are included in the input as expected. We
    399 // will re-purpose the output bitmasks to channel out information about the
    400 // outcome of the checks.
    401 //
    402 // More specifically, the output of the program will be as follows:
    403 // {
    404 //   "combined_status_mask_bit1":
    405 //       (input["default_search_provider.search_url"] == kTestSearchURL)
    406 //   "combined_status_mask_bit2": input["default_search_provider_iuc"]
    407 //   "combined_status_mask_bit3":
    408 //       (input["search_providers.*.search_url"] == kTestSearchURL)
    409 //   "combined_status_mask_bit4":
    410 //       (input["search_providers.*.search_url"] == kTestSearchURL2)
    411 // }
    412 std::string ConstructProgramToCheckSearchEngines() {
    413   std::string bytecode;
    414   bytecode += OP_NAVIGATE(GetHash("default_search_provider"));
    415   bytecode += OP_NAVIGATE(GetHash("search_url"));
    416   bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestSearchURL));
    417   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit1"),
    418                             EncodeBool(true));
    419   bytecode += OP_END_OF_SENTENCE;
    420   bytecode += OP_NAVIGATE(GetHash("default_search_provider_iuc"));
    421   bytecode += OP_COMPARE_NODE_BOOL(EncodeBool(true));
    422   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit2"),
    423                             EncodeBool(true));
    424   bytecode += OP_END_OF_SENTENCE;
    425   bytecode += OP_NAVIGATE(GetHash("search_providers"));
    426   bytecode += OP_NAVIGATE_ANY;
    427   bytecode += OP_NAVIGATE(GetHash("search_url"));
    428   bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestSearchURL));
    429   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit3"),
    430                             EncodeBool(true));
    431   bytecode += OP_END_OF_SENTENCE;
    432   bytecode += OP_NAVIGATE(GetHash("search_providers"));
    433   bytecode += OP_NAVIGATE_ANY;
    434   bytecode += OP_NAVIGATE(GetHash("search_url"));
    435   bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestSearchURL2));
    436   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit4"),
    437                             EncodeBool(true));
    438   bytecode += OP_END_OF_SENTENCE;
    439   return bytecode;
    440 }
    441 
    442 // Legend for the bitmask returned by the above program.
    443 enum CombinedStatusMaskLegendForCheckingSearchEngines {
    444   HAS_EXPECTED_DEFAULT_SEARCH_PROVIDER = 1 << 0,
    445   DEFAULT_SEARCH_PROVIDER_IS_USER_CONTROLLED = 1 << 1,
    446   HAS_EXPECTED_PREPOPULATED_SEARCH_PROVIDER_1 = 1 << 2,
    447   HAS_EXPECTED_PREPOPULATED_SEARCH_PROVIDER_2 = 1 << 3,
    448 };
    449 
    450 // Constructs yet another evaluation program to specifically test that loaded
    451 // module digests are included in the input as expected. We will re-purpose the
    452 // output bitmasks to channel out information about the outcome of the checks.
    453 //
    454 // More specifically, the output of the program will be as follows:
    455 // {
    456 //   "combined_status_mask_bit1":
    457 //       (input["loaded_modules.*"] == kTestModuleDigest)
    458 //   "combined_status_mask_bit2":
    459 //       (input["loaded_modules.*"] == kTestModuleDigest2)
    460 // }
    461 std::string ConstructProgramToCheckLoadedModuleDigests() {
    462   std::string bytecode;
    463   bytecode += OP_NAVIGATE(GetHash("loaded_modules"));
    464   bytecode += OP_NAVIGATE_ANY;
    465   bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestModuleDigest));
    466   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit1"),
    467                             EncodeBool(true));
    468   bytecode += OP_END_OF_SENTENCE;
    469   bytecode += OP_NAVIGATE(GetHash("loaded_modules"));
    470   bytecode += OP_NAVIGATE_ANY;
    471   bytecode += OP_COMPARE_NODE_HASH(GetHash(kTestModuleDigest2));
    472   bytecode += OP_STORE_BOOL(GetHash("combined_status_mask_bit2"),
    473                             EncodeBool(true));
    474   bytecode += OP_END_OF_SENTENCE;
    475   return bytecode;
    476 }
    477 
    478 // Legend for the bitmask returned by the above program.
    479 enum CombinedStatusMaskLegendForCheckingLoadedModules {
    480   HAS_EXPECTED_MODULE_DIGEST_1 = 1 << 0,
    481   HAS_EXPECTED_MODULE_DIGEST_2 = 1 << 1,
    482 };
    483 
    484 // Test fixtures -------------------------------------------------------------
    485 
    486 class AutomaticProfileResetterTestBase : public testing::Test {
    487  protected:
    488   explicit AutomaticProfileResetterTestBase(
    489       const std::string& experiment_group_name)
    490       : waiting_task_runner_(new base::TestSimpleTaskRunner),
    491         local_state_(TestingBrowserProcess::GetGlobal()),
    492         profile_(new TestingProfile()),
    493         field_trials_(new base::FieldTrialList(NULL)),
    494         memento_in_prefs_(new PreferenceHostedPromptMemento(profile())),
    495         memento_in_local_state_(new LocalStateHostedPromptMemento(profile())),
    496         memento_in_file_(new FileHostedPromptMementoSynchronous(profile())),
    497         experiment_group_name_(experiment_group_name),
    498         inject_data_through_variation_params_(false),
    499         mock_delegate_(NULL) {
    500     // Make sure the factory is not optimized away, so whatever preferences it
    501     // wants to register will actually get registered.
    502     AutomaticProfileResetterFactory::GetInstance();
    503 
    504     // Register some additional local state preferences for testing purposes.
    505     PrefRegistrySimple* local_state_registry = local_state_.Get()->registry();
    506     DCHECK(local_state_registry);
    507     local_state_registry->RegisterStringPref(kTestPreferencePath, "");
    508 
    509     // Register some additional user preferences for testing purposes.
    510     user_prefs::PrefRegistrySyncable* user_prefs_registry =
    511         profile_->GetTestingPrefService()->registry();
    512     DCHECK(user_prefs_registry);
    513     user_prefs_registry->RegisterStringPref(
    514         kTestPreferencePath, std::string(),
    515         user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
    516   }
    517 
    518   virtual void SetUp() OVERRIDE {
    519     variations::testing::ClearAllVariationParams();
    520     base::FieldTrialList::CreateFieldTrial(kAutomaticProfileResetStudyName,
    521                                            experiment_group_name_);
    522     resetter_.reset(
    523         new testing::StrictMock<AutomaticProfileResetterUnderTest>(profile()));
    524     mock_delegate_owned_.reset(
    525         new testing::StrictMock<MockProfileResetterDelegate>());
    526     mock_delegate_ = mock_delegate_owned_.get();
    527 
    528     ExpectAllMementoValuesEqualTo(std::string());
    529   }
    530 
    531   void SetTestingHashSeed(const std::string& hash_seed) {
    532     testing_hash_seed_ = hash_seed;
    533   }
    534 
    535   void SetTestingProgram(const std::string& source_code) {
    536     testing_program_ = source_code;
    537   }
    538 
    539   void AllowInjectingTestDataThroughVariationParams(bool value) {
    540     inject_data_through_variation_params_ = value;
    541   }
    542 
    543   void ExpectAllMementoValuesEqualTo(const std::string& value) {
    544     EXPECT_EQ(value, memento_in_prefs_->ReadValue());
    545     EXPECT_EQ(value, memento_in_local_state_->ReadValue());
    546     EXPECT_EQ(value, memento_in_file_->ReadValue());
    547   }
    548 
    549   void UnleashResetterAndWait() {
    550     if (inject_data_through_variation_params_) {
    551       std::map<std::string, std::string> variation_params;
    552       variation_params["program"] = testing_program_;
    553       variation_params["hash_seed"] = testing_hash_seed_;
    554       ASSERT_TRUE(variations::AssociateVariationParams(
    555           kAutomaticProfileResetStudyName,
    556           experiment_group_name_,
    557           variation_params));
    558     }
    559     resetter_->Initialize();
    560     resetter_->SetDelegateForTesting(
    561         mock_delegate_owned_.PassAs<AutomaticProfileResetterDelegate>());
    562     resetter_->SetTaskRunnerForWaitingForTesting(waiting_task_runner_);
    563     if (!inject_data_through_variation_params_) {
    564       resetter_->SetProgramForTesting(testing_program_);
    565       resetter_->SetHashSeedForTesting(testing_hash_seed_);
    566     }
    567     resetter_->Activate();
    568 
    569     if (waiting_task_runner_->HasPendingTask()) {
    570       ASSERT_EQ(base::TimeDelta::FromSeconds(55),
    571                 waiting_task_runner_->NextPendingTaskDelay());
    572       waiting_task_runner_->RunPendingTasks();
    573     }
    574     base::RunLoop().RunUntilIdle();
    575     content::BrowserThread::GetBlockingPool()->FlushForTesting();
    576     base::RunLoop().RunUntilIdle();
    577   }
    578 
    579   // Goes through an evaluation flow such that the reset criteria are satisfied.
    580   // Used to reduce boilerplate for tests that need to verify behavior during
    581   // the reset prompt flow.
    582   void OrchestrateThroughEvaluationFlow() {
    583     SetTestingProgram(ConstructProgram(true, true));
    584     SetTestingHashSeed(kTestHashSeed);
    585 
    586     mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    587     mock_delegate().ExpectCallsToGetterMethods();
    588     mock_delegate().ExpectCallToShowPrompt();
    589     EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u));
    590 
    591     UnleashResetterAndWait();
    592 
    593     EXPECT_TRUE(resetter().ShouldShowResetBanner());
    594     testing::Mock::VerifyAndClearExpectations(&resetter());
    595     testing::Mock::VerifyAndClearExpectations(&mock_delegate());
    596   }
    597 
    598   // Explicitly shut down the service to double-check that nothing explodes, but
    599   // first, verify expectations to make sure the service makes no more calls to
    600   // any mocked functions during or after shutdown.
    601   void VerifyExpectationsThenShutdownResetter() {
    602     testing::Mock::VerifyAndClearExpectations(&resetter());
    603     testing::Mock::VerifyAndClearExpectations(&mock_delegate());
    604 
    605     resetter_->Shutdown();
    606     resetter_.reset();
    607   }
    608 
    609   TestingProfile* profile() { return profile_.get(); }
    610   TestingPrefServiceSimple* local_state() { return local_state_.Get(); }
    611 
    612   PreferenceHostedPromptMemento& memento_in_prefs() {
    613     return *memento_in_prefs_;
    614   }
    615 
    616   LocalStateHostedPromptMemento& memento_in_local_state() {
    617     return *memento_in_local_state_;
    618   }
    619 
    620   FileHostedPromptMementoSynchronous& memento_in_file() {
    621     return *memento_in_file_;
    622   }
    623 
    624   MockProfileResetterDelegate& mock_delegate() { return *mock_delegate_; }
    625   AutomaticProfileResetterUnderTest& resetter() { return *resetter_; }
    626 
    627  private:
    628   content::TestBrowserThreadBundle thread_bundle_;
    629   scoped_refptr<base::TestSimpleTaskRunner> waiting_task_runner_;
    630   ScopedTestingLocalState local_state_;
    631   scoped_ptr<TestingProfile> profile_;
    632   scoped_ptr<base::FieldTrialList> field_trials_;
    633   scoped_ptr<PreferenceHostedPromptMemento> memento_in_prefs_;
    634   scoped_ptr<LocalStateHostedPromptMemento> memento_in_local_state_;
    635   scoped_ptr<FileHostedPromptMementoSynchronous> memento_in_file_;
    636 
    637   std::string experiment_group_name_;
    638   std::string testing_program_;
    639   std::string testing_hash_seed_;
    640   bool inject_data_through_variation_params_;
    641 
    642   scoped_ptr<AutomaticProfileResetterUnderTest> resetter_;
    643   scoped_ptr<MockProfileResetterDelegate> mock_delegate_owned_;
    644   MockProfileResetterDelegate* mock_delegate_;
    645 
    646   DISALLOW_COPY_AND_ASSIGN(AutomaticProfileResetterTestBase);
    647 };
    648 
    649 class AutomaticProfileResetterTest : public AutomaticProfileResetterTestBase {
    650  protected:
    651   AutomaticProfileResetterTest()
    652       : AutomaticProfileResetterTestBase(kStudyEnabledGroupName) {}
    653 };
    654 
    655 class AutomaticProfileResetterTestDryRun
    656     : public AutomaticProfileResetterTestBase {
    657  protected:
    658   AutomaticProfileResetterTestDryRun()
    659       : AutomaticProfileResetterTestBase(kStudyDryRunGroupName) {}
    660 };
    661 
    662 class AutomaticProfileResetterTestDisabled
    663     : public AutomaticProfileResetterTestBase {
    664  protected:
    665   AutomaticProfileResetterTestDisabled()
    666       : AutomaticProfileResetterTestBase(kStudyDisabledGroupName) {}
    667 };
    668 
    669 // Tests ---------------------------------------------------------------------
    670 
    671 TEST_F(AutomaticProfileResetterTestDisabled, NothingIsDoneWhenDisabled) {
    672   SetTestingProgram(ConstructProgram(true, true));
    673   SetTestingHashSeed(kTestHashSeed);
    674 
    675   // No calls are expected to the delegate.
    676 
    677   UnleashResetterAndWait();
    678 
    679   EXPECT_FALSE(resetter().ShouldShowResetBanner());
    680   VerifyExpectationsThenShutdownResetter();
    681 
    682   ExpectAllMementoValuesEqualTo(std::string());
    683 }
    684 
    685 TEST_F(AutomaticProfileResetterTestDryRun, CriteriaNotSatisfied) {
    686   SetTestingProgram(ConstructProgramToExerciseCriteria(false, true, true));
    687   SetTestingHashSeed(kTestHashSeed);
    688 
    689   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    690   mock_delegate().ExpectCallsToGetterMethods();
    691   EXPECT_CALL(resetter(), ReportStatistics(0x1fu, 0x00u));
    692 
    693   UnleashResetterAndWait();
    694 
    695   EXPECT_FALSE(resetter().ShouldShowResetBanner());
    696   VerifyExpectationsThenShutdownResetter();
    697 
    698   ExpectAllMementoValuesEqualTo(std::string());
    699 }
    700 
    701 TEST_F(AutomaticProfileResetterTestDryRun, OddCriteriaSatisfied) {
    702   SetTestingProgram(ConstructProgramToExerciseCriteria(true, true, false));
    703   SetTestingHashSeed(kTestHashSeed);
    704 
    705   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    706   mock_delegate().ExpectCallsToGetterMethods();
    707   EXPECT_CALL(resetter(), ReportStatistics(0x15u, 0x01u));
    708   EXPECT_CALL(resetter(), ReportPromptResult(
    709       AutomaticProfileResetter::PROMPT_NOT_TRIGGERED));
    710 
    711   UnleashResetterAndWait();
    712 
    713   ExpectAllMementoValuesEqualTo(kTestMementoValue);
    714   EXPECT_FALSE(resetter().ShouldShowResetBanner());
    715   VerifyExpectationsThenShutdownResetter();
    716 }
    717 
    718 TEST_F(AutomaticProfileResetterTestDryRun, EvenCriteriaSatisfied) {
    719   SetTestingProgram(ConstructProgramToExerciseCriteria(true, false, true));
    720   SetTestingHashSeed(kTestHashSeed);
    721 
    722   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    723   mock_delegate().ExpectCallsToGetterMethods();
    724   EXPECT_CALL(resetter(), ReportStatistics(0x0au, 0x01u));
    725   EXPECT_CALL(resetter(), ReportPromptResult(
    726       AutomaticProfileResetter::PROMPT_NOT_TRIGGERED));
    727 
    728   UnleashResetterAndWait();
    729 
    730   ExpectAllMementoValuesEqualTo(kTestMementoValue);
    731   EXPECT_FALSE(resetter().ShouldShowResetBanner());
    732   VerifyExpectationsThenShutdownResetter();
    733 }
    734 
    735 #if defined(GOOGLE_CHROME_BUILD)
    736 TEST_F(AutomaticProfileResetterTestDryRun, ProgramSetThroughVariationParams) {
    737   SetTestingProgram(ConstructProgram(true, true));
    738   SetTestingHashSeed(kTestHashSeed);
    739   AllowInjectingTestDataThroughVariationParams(true);
    740 
    741   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    742   mock_delegate().ExpectCallsToGetterMethods();
    743   EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u));
    744   EXPECT_CALL(resetter(), ReportPromptResult(
    745       AutomaticProfileResetter::PROMPT_NOT_TRIGGERED));
    746 
    747   UnleashResetterAndWait();
    748 
    749   ExpectAllMementoValuesEqualTo(kTestMementoValue);
    750   EXPECT_FALSE(resetter().ShouldShowResetBanner());
    751   VerifyExpectationsThenShutdownResetter();
    752 }
    753 #endif
    754 
    755 TEST_F(AutomaticProfileResetterTestDryRun,
    756        ConditionsSatisfiedAndInvalidMementos) {
    757   memento_in_prefs().StoreValue(kTestInvalidMementoValue);
    758   memento_in_local_state().StoreValue(kTestInvalidMementoValue);
    759   memento_in_file().StoreValue(kTestInvalidMementoValue);
    760 
    761   SetTestingProgram(ConstructProgram(true, true));
    762   SetTestingHashSeed(kTestHashSeed);
    763 
    764   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    765   mock_delegate().ExpectCallsToGetterMethods();
    766   EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u));
    767   EXPECT_CALL(resetter(), ReportPromptResult(
    768       AutomaticProfileResetter::PROMPT_NOT_TRIGGERED));
    769 
    770   UnleashResetterAndWait();
    771 
    772   ExpectAllMementoValuesEqualTo(kTestMementoValue);
    773   EXPECT_FALSE(resetter().ShouldShowResetBanner());
    774   VerifyExpectationsThenShutdownResetter();
    775 }
    776 
    777 TEST_F(AutomaticProfileResetterTestDryRun, AlreadyHadPrefHostedMemento) {
    778   memento_in_prefs().StoreValue(kTestMementoValue);
    779 
    780   SetTestingProgram(ConstructProgram(true, true));
    781   SetTestingHashSeed(kTestHashSeed);
    782 
    783   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    784   mock_delegate().ExpectCallsToGetterMethods();
    785   EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x03u));
    786 
    787   UnleashResetterAndWait();
    788 
    789   EXPECT_FALSE(resetter().ShouldShowResetBanner());
    790   VerifyExpectationsThenShutdownResetter();
    791 
    792   EXPECT_EQ(kTestMementoValue, memento_in_prefs().ReadValue());
    793   EXPECT_EQ(std::string(), memento_in_local_state().ReadValue());
    794   EXPECT_EQ(std::string(), memento_in_file().ReadValue());
    795 }
    796 
    797 TEST_F(AutomaticProfileResetterTestDryRun, AlreadyHadLocalStateHostedMemento) {
    798   memento_in_local_state().StoreValue(kTestMementoValue);
    799 
    800   SetTestingProgram(ConstructProgram(true, true));
    801   SetTestingHashSeed(kTestHashSeed);
    802 
    803   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    804   mock_delegate().ExpectCallsToGetterMethods();
    805   EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x05u));
    806 
    807   UnleashResetterAndWait();
    808 
    809   EXPECT_FALSE(resetter().ShouldShowResetBanner());
    810   VerifyExpectationsThenShutdownResetter();
    811 
    812   EXPECT_EQ(std::string(), memento_in_prefs().ReadValue());
    813   EXPECT_EQ(kTestMementoValue, memento_in_local_state().ReadValue());
    814   EXPECT_EQ(std::string(), memento_in_file().ReadValue());
    815 }
    816 
    817 TEST_F(AutomaticProfileResetterTestDryRun, AlreadyHadFileHostedMemento) {
    818   memento_in_file().StoreValue(kTestMementoValue);
    819 
    820   SetTestingProgram(ConstructProgram(true, true));
    821   SetTestingHashSeed(kTestHashSeed);
    822 
    823   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    824   mock_delegate().ExpectCallsToGetterMethods();
    825   EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x09u));
    826 
    827   UnleashResetterAndWait();
    828 
    829   EXPECT_FALSE(resetter().ShouldShowResetBanner());
    830   VerifyExpectationsThenShutdownResetter();
    831 
    832   EXPECT_EQ(std::string(), memento_in_prefs().ReadValue());
    833   EXPECT_EQ(std::string(), memento_in_local_state().ReadValue());
    834   EXPECT_EQ(kTestMementoValue, memento_in_file().ReadValue());
    835 }
    836 
    837 TEST_F(AutomaticProfileResetterTestDryRun, DoNothingWhenResourcesAreMissing) {
    838   SetTestingProgram(std::string());
    839   SetTestingHashSeed(std::string());
    840 
    841   // No calls are expected to the delegate.
    842 
    843   UnleashResetterAndWait();
    844 
    845   EXPECT_FALSE(resetter().ShouldShowResetBanner());
    846   VerifyExpectationsThenShutdownResetter();
    847 
    848   ExpectAllMementoValuesEqualTo(std::string());
    849 }
    850 
    851 TEST_F(AutomaticProfileResetterTest, CriteriaNotSatisfied) {
    852   SetTestingProgram(ConstructProgramToExerciseCriteria(false, true, true));
    853   SetTestingHashSeed(kTestHashSeed);
    854 
    855   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    856   mock_delegate().ExpectCallsToGetterMethods();
    857   EXPECT_CALL(resetter(), ReportStatistics(0x1fu, 0x00u));
    858 
    859   UnleashResetterAndWait();
    860 
    861   EXPECT_FALSE(resetter().ShouldShowResetBanner());
    862   VerifyExpectationsThenShutdownResetter();
    863 
    864   ExpectAllMementoValuesEqualTo(std::string());
    865 }
    866 
    867 TEST_F(AutomaticProfileResetterTest, OddCriteriaSatisfied) {
    868   SetTestingProgram(ConstructProgramToExerciseCriteria(true, true, false));
    869   SetTestingHashSeed(kTestHashSeed);
    870 
    871   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    872   mock_delegate().ExpectCallsToGetterMethods();
    873   mock_delegate().ExpectCallToShowPrompt();
    874   EXPECT_CALL(resetter(), ReportStatistics(0x15u, 0x01u));
    875 
    876   UnleashResetterAndWait();
    877 
    878   EXPECT_TRUE(resetter().ShouldShowResetBanner());
    879   VerifyExpectationsThenShutdownResetter();
    880 }
    881 
    882 TEST_F(AutomaticProfileResetterTest, EvenCriteriaSatisfied) {
    883   SetTestingProgram(ConstructProgramToExerciseCriteria(true, false, true));
    884   SetTestingHashSeed(kTestHashSeed);
    885 
    886   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    887   mock_delegate().ExpectCallsToGetterMethods();
    888   mock_delegate().ExpectCallToShowPrompt();
    889   EXPECT_CALL(resetter(), ReportStatistics(0x0au, 0x01u));
    890 
    891   UnleashResetterAndWait();
    892 
    893   EXPECT_TRUE(resetter().ShouldShowResetBanner());
    894   VerifyExpectationsThenShutdownResetter();
    895 }
    896 
    897 #if defined(GOOGLE_CHROME_BUILD)
    898 TEST_F(AutomaticProfileResetterTest, ProgramSetThroughVariationParams) {
    899   SetTestingProgram(ConstructProgram(true, true));
    900   SetTestingHashSeed(kTestHashSeed);
    901   AllowInjectingTestDataThroughVariationParams(true);
    902 
    903   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    904   mock_delegate().ExpectCallsToGetterMethods();
    905   mock_delegate().ExpectCallToShowPrompt();
    906   EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u));
    907   EXPECT_CALL(resetter(), ReportPromptResult(
    908       AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE));
    909 
    910   UnleashResetterAndWait();
    911   resetter().NotifyDidShowResetBubble();
    912 
    913   ExpectAllMementoValuesEqualTo(kTestMementoValue);
    914   EXPECT_TRUE(resetter().ShouldShowResetBanner());
    915   VerifyExpectationsThenShutdownResetter();
    916 }
    917 #endif
    918 
    919 TEST_F(AutomaticProfileResetterTest, ConditionsSatisfiedAndInvalidMementos) {
    920   memento_in_prefs().StoreValue(kTestInvalidMementoValue);
    921   memento_in_local_state().StoreValue(kTestInvalidMementoValue);
    922   memento_in_file().StoreValue(kTestInvalidMementoValue);
    923 
    924   SetTestingProgram(ConstructProgram(true, true));
    925   SetTestingHashSeed(kTestHashSeed);
    926 
    927   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    928   mock_delegate().ExpectCallsToGetterMethods();
    929   mock_delegate().ExpectCallToShowPrompt();
    930   EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u));
    931   EXPECT_CALL(resetter(), ReportPromptResult(
    932       AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE));
    933 
    934   UnleashResetterAndWait();
    935   resetter().NotifyDidShowResetBubble();
    936 
    937   ExpectAllMementoValuesEqualTo(kTestMementoValue);
    938   EXPECT_TRUE(resetter().ShouldShowResetBanner());
    939   VerifyExpectationsThenShutdownResetter();
    940 }
    941 
    942 TEST_F(AutomaticProfileResetterTest, PrefHostedMementoPreventsPrompt) {
    943   memento_in_prefs().StoreValue(kTestMementoValue);
    944 
    945   SetTestingProgram(ConstructProgram(true, true));
    946   SetTestingHashSeed(kTestHashSeed);
    947 
    948   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    949   mock_delegate().ExpectCallsToGetterMethods();
    950   EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x03u));
    951 
    952   UnleashResetterAndWait();
    953 
    954   EXPECT_TRUE(resetter().ShouldShowResetBanner());
    955   VerifyExpectationsThenShutdownResetter();
    956 
    957   EXPECT_EQ(kTestMementoValue, memento_in_prefs().ReadValue());
    958   EXPECT_EQ(std::string(), memento_in_local_state().ReadValue());
    959   EXPECT_EQ(std::string(), memento_in_file().ReadValue());
    960 }
    961 
    962 TEST_F(AutomaticProfileResetterTest, LocalStateHostedMementoPreventsPrompt) {
    963   memento_in_local_state().StoreValue(kTestMementoValue);
    964 
    965   SetTestingProgram(ConstructProgram(true, true));
    966   SetTestingHashSeed(kTestHashSeed);
    967 
    968   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    969   mock_delegate().ExpectCallsToGetterMethods();
    970   EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x05u));
    971 
    972   UnleashResetterAndWait();
    973 
    974   EXPECT_TRUE(resetter().ShouldShowResetBanner());
    975   VerifyExpectationsThenShutdownResetter();
    976 
    977   EXPECT_EQ(std::string(), memento_in_prefs().ReadValue());
    978   EXPECT_EQ(kTestMementoValue, memento_in_local_state().ReadValue());
    979   EXPECT_EQ(std::string(), memento_in_file().ReadValue());
    980 }
    981 
    982 TEST_F(AutomaticProfileResetterTest, FileHostedMementoPreventsPrompt) {
    983   memento_in_file().StoreValue(kTestMementoValue);
    984 
    985   SetTestingProgram(ConstructProgram(true, true));
    986   SetTestingHashSeed(kTestHashSeed);
    987 
    988   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
    989   mock_delegate().ExpectCallsToGetterMethods();
    990   EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x09u));
    991 
    992   UnleashResetterAndWait();
    993 
    994   EXPECT_TRUE(resetter().ShouldShowResetBanner());
    995   VerifyExpectationsThenShutdownResetter();
    996 
    997   EXPECT_EQ(std::string(), memento_in_prefs().ReadValue());
    998   EXPECT_EQ(std::string(), memento_in_local_state().ReadValue());
    999   EXPECT_EQ(kTestMementoValue, memento_in_file().ReadValue());
   1000 }
   1001 
   1002 TEST_F(AutomaticProfileResetterTest, DoNothingWhenResourcesAreMissing) {
   1003   SetTestingProgram(std::string());
   1004   SetTestingHashSeed(std::string());
   1005 
   1006   // No calls are expected to the delegate.
   1007 
   1008   UnleashResetterAndWait();
   1009 
   1010   EXPECT_FALSE(resetter().ShouldShowResetBanner());
   1011   VerifyExpectationsThenShutdownResetter();
   1012 
   1013   ExpectAllMementoValuesEqualTo(std::string());
   1014 }
   1015 
   1016 TEST_F(AutomaticProfileResetterTest, PromptSuppressed) {
   1017   OrchestrateThroughEvaluationFlow();
   1018 
   1019   VerifyExpectationsThenShutdownResetter();
   1020 
   1021   ExpectAllMementoValuesEqualTo(std::string());
   1022 }
   1023 
   1024 TEST_F(AutomaticProfileResetterTest, PromptNotSupported) {
   1025   SetTestingProgram(ConstructProgram(true, true));
   1026   SetTestingHashSeed(kTestHashSeed);
   1027 
   1028   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
   1029   mock_delegate().ExpectCallsToGetterMethods();
   1030   EXPECT_CALL(mock_delegate(), TriggerPrompt())
   1031       .WillOnce(testing::Return(false));
   1032   EXPECT_CALL(resetter(), ReportStatistics(0x03u, 0x01u));
   1033   EXPECT_CALL(resetter(), ReportPromptResult(
   1034       AutomaticProfileResetter::PROMPT_NOT_TRIGGERED));
   1035 
   1036   UnleashResetterAndWait();
   1037 
   1038   ExpectAllMementoValuesEqualTo(kTestMementoValue);
   1039   EXPECT_TRUE(resetter().ShouldShowResetBanner());
   1040   VerifyExpectationsThenShutdownResetter();
   1041 }
   1042 
   1043 TEST_F(AutomaticProfileResetterTest, PromptIgnored) {
   1044   OrchestrateThroughEvaluationFlow();
   1045 
   1046   EXPECT_CALL(resetter(), ReportPromptResult(
   1047       AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE));
   1048   resetter().NotifyDidShowResetBubble();
   1049   ExpectAllMementoValuesEqualTo(kTestMementoValue);
   1050   VerifyExpectationsThenShutdownResetter();
   1051 }
   1052 
   1053 TEST_F(AutomaticProfileResetterTest, PromptActionReset) {
   1054   OrchestrateThroughEvaluationFlow();
   1055 
   1056   EXPECT_CALL(resetter(), ReportPromptResult(
   1057       AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE));
   1058   resetter().NotifyDidShowResetBubble();
   1059   ExpectAllMementoValuesEqualTo(kTestMementoValue);
   1060   testing::Mock::VerifyAndClearExpectations(&resetter());
   1061 
   1062   mock_delegate().ExpectCallToTriggerReset(false);
   1063   EXPECT_CALL(resetter(), ReportPromptResult(
   1064       AutomaticProfileResetter::PROMPT_ACTION_RESET));
   1065   resetter().TriggerProfileReset(false /*send_feedback*/);
   1066   testing::Mock::VerifyAndClearExpectations(&resetter());
   1067   testing::Mock::VerifyAndClearExpectations(&mock_delegate());
   1068 
   1069   EXPECT_CALL(mock_delegate(), DismissPrompt());
   1070   mock_delegate().EmulateProfileResetCompleted();
   1071   EXPECT_FALSE(resetter().ShouldShowResetBanner());
   1072   VerifyExpectationsThenShutdownResetter();
   1073 }
   1074 
   1075 TEST_F(AutomaticProfileResetterTest, PromptActionResetWithFeedback) {
   1076   OrchestrateThroughEvaluationFlow();
   1077 
   1078   EXPECT_CALL(resetter(), ReportPromptResult(
   1079       AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE));
   1080   resetter().NotifyDidShowResetBubble();
   1081   ExpectAllMementoValuesEqualTo(kTestMementoValue);
   1082   testing::Mock::VerifyAndClearExpectations(&resetter());
   1083 
   1084   mock_delegate().ExpectCallToTriggerReset(true);
   1085   EXPECT_CALL(resetter(), ReportPromptResult(
   1086       AutomaticProfileResetter::PROMPT_ACTION_RESET));
   1087   resetter().TriggerProfileReset(true /*send_feedback*/);
   1088   testing::Mock::VerifyAndClearExpectations(&resetter());
   1089   testing::Mock::VerifyAndClearExpectations(&mock_delegate());
   1090 
   1091   EXPECT_CALL(mock_delegate(), DismissPrompt());
   1092   mock_delegate().EmulateProfileResetCompleted();
   1093   EXPECT_FALSE(resetter().ShouldShowResetBanner());
   1094   VerifyExpectationsThenShutdownResetter();
   1095 }
   1096 
   1097 TEST_F(AutomaticProfileResetterTest, PromptActionNoReset) {
   1098   OrchestrateThroughEvaluationFlow();
   1099 
   1100   EXPECT_CALL(resetter(), ReportPromptResult(
   1101       AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE));
   1102   resetter().NotifyDidShowResetBubble();
   1103   ExpectAllMementoValuesEqualTo(kTestMementoValue);
   1104   testing::Mock::VerifyAndClearExpectations(&resetter());
   1105 
   1106   EXPECT_CALL(mock_delegate(), DismissPrompt());
   1107   EXPECT_CALL(resetter(), ReportPromptResult(
   1108       AutomaticProfileResetter::PROMPT_ACTION_NO_RESET));
   1109   resetter().SkipProfileReset();
   1110   EXPECT_FALSE(resetter().ShouldShowResetBanner());
   1111   VerifyExpectationsThenShutdownResetter();
   1112 }
   1113 
   1114 TEST_F(AutomaticProfileResetterTest, PromptFollowedByWebUIReset) {
   1115   OrchestrateThroughEvaluationFlow();
   1116 
   1117   EXPECT_CALL(resetter(), ReportPromptResult(
   1118       AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE));
   1119   resetter().NotifyDidShowResetBubble();
   1120   ExpectAllMementoValuesEqualTo(kTestMementoValue);
   1121   testing::Mock::VerifyAndClearExpectations(&resetter());
   1122 
   1123   EXPECT_CALL(mock_delegate(), DismissPrompt());
   1124   resetter().NotifyDidOpenWebUIResetDialog();
   1125   testing::Mock::VerifyAndClearExpectations(&mock_delegate());
   1126 
   1127   EXPECT_CALL(resetter(), ReportPromptResult(
   1128       AutomaticProfileResetter::PROMPT_FOLLOWED_BY_WEBUI_RESET));
   1129   resetter().NotifyDidCloseWebUIResetDialog(true);
   1130   EXPECT_TRUE(resetter().ShouldShowResetBanner());
   1131   VerifyExpectationsThenShutdownResetter();
   1132 }
   1133 
   1134 TEST_F(AutomaticProfileResetterTest, PromptFollowedByWebUINoReset) {
   1135   OrchestrateThroughEvaluationFlow();
   1136 
   1137   EXPECT_CALL(resetter(), ReportPromptResult(
   1138       AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE));
   1139   resetter().NotifyDidShowResetBubble();
   1140   ExpectAllMementoValuesEqualTo(kTestMementoValue);
   1141   testing::Mock::VerifyAndClearExpectations(&resetter());
   1142 
   1143   EXPECT_CALL(mock_delegate(), DismissPrompt());
   1144   resetter().NotifyDidOpenWebUIResetDialog();
   1145   testing::Mock::VerifyAndClearExpectations(&mock_delegate());
   1146 
   1147   EXPECT_CALL(resetter(), ReportPromptResult(
   1148       AutomaticProfileResetter::PROMPT_FOLLOWED_BY_WEBUI_NO_RESET));
   1149   resetter().NotifyDidCloseWebUIResetDialog(false);
   1150   EXPECT_TRUE(resetter().ShouldShowResetBanner());
   1151   VerifyExpectationsThenShutdownResetter();
   1152 }
   1153 
   1154 TEST_F(AutomaticProfileResetterTest, PromptFollowedByIncidentalWebUIReset) {
   1155   OrchestrateThroughEvaluationFlow();
   1156 
   1157   EXPECT_CALL(resetter(), ReportPromptResult(
   1158       AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE));
   1159   resetter().NotifyDidShowResetBubble();
   1160   ExpectAllMementoValuesEqualTo(kTestMementoValue);
   1161   testing::Mock::VerifyAndClearExpectations(&resetter());
   1162 
   1163   // Missing NotifyDidOpenWebUIResetDialog().
   1164   // This can arise if a settings page was already opened at the time the prompt
   1165   // was triggered, and this already opened dialog was used to initiate a reset
   1166   // after having dismissed the prompt.
   1167 
   1168   EXPECT_CALL(mock_delegate(), DismissPrompt());
   1169   EXPECT_CALL(resetter(), ReportPromptResult(
   1170       AutomaticProfileResetter::PROMPT_FOLLOWED_BY_WEBUI_RESET));
   1171   resetter().NotifyDidCloseWebUIResetDialog(true);
   1172   EXPECT_TRUE(resetter().ShouldShowResetBanner());
   1173   VerifyExpectationsThenShutdownResetter();
   1174 }
   1175 
   1176 TEST_F(AutomaticProfileResetterTest, PromptSuppressedButHadWebUIReset) {
   1177   OrchestrateThroughEvaluationFlow();
   1178 
   1179   EXPECT_CALL(mock_delegate(), DismissPrompt());
   1180   resetter().NotifyDidOpenWebUIResetDialog();
   1181   testing::Mock::VerifyAndClearExpectations(&mock_delegate());
   1182 
   1183   EXPECT_CALL(resetter(), ReportPromptResult(
   1184       AutomaticProfileResetter::PROMPT_NOT_SHOWN_BUBBLE_BUT_HAD_WEBUI_RESET));
   1185   resetter().NotifyDidCloseWebUIResetDialog(true);
   1186   ExpectAllMementoValuesEqualTo(kTestMementoValue);
   1187   EXPECT_TRUE(resetter().ShouldShowResetBanner());
   1188   VerifyExpectationsThenShutdownResetter();
   1189 }
   1190 
   1191 TEST_F(AutomaticProfileResetterTest, PromptSuppressedButHadWebUINoReset) {
   1192   OrchestrateThroughEvaluationFlow();
   1193 
   1194   EXPECT_CALL(mock_delegate(), DismissPrompt());
   1195   resetter().NotifyDidOpenWebUIResetDialog();
   1196   testing::Mock::VerifyAndClearExpectations(&mock_delegate());
   1197 
   1198   EXPECT_CALL(resetter(), ReportPromptResult(AutomaticProfileResetter::
   1199       PROMPT_NOT_SHOWN_BUBBLE_BUT_HAD_WEBUI_NO_RESET));
   1200   resetter().NotifyDidCloseWebUIResetDialog(false);
   1201   ExpectAllMementoValuesEqualTo(kTestMementoValue);
   1202   EXPECT_TRUE(resetter().ShouldShowResetBanner());
   1203   VerifyExpectationsThenShutdownResetter();
   1204 }
   1205 
   1206 TEST_F(AutomaticProfileResetterTest, BannerDismissed) {
   1207   OrchestrateThroughEvaluationFlow();
   1208 
   1209   EXPECT_CALL(resetter(), ReportPromptResult(
   1210       AutomaticProfileResetter::PROMPT_SHOWN_BUBBLE));
   1211   resetter().NotifyDidShowResetBubble();
   1212   ExpectAllMementoValuesEqualTo(kTestMementoValue);
   1213   testing::Mock::VerifyAndClearExpectations(&resetter());
   1214 
   1215   resetter().NotifyDidCloseWebUIResetBanner();
   1216 
   1217   EXPECT_TRUE(resetter().IsResetPromptFlowActive());
   1218   EXPECT_FALSE(resetter().ShouldShowResetBanner());
   1219 
   1220   // Note: we use strict mocks, so this also checks the bubble is not closed.
   1221   VerifyExpectationsThenShutdownResetter();
   1222 }
   1223 
   1224 TEST_F(AutomaticProfileResetterTest, BannerDismissedWhilePromptSuppressed) {
   1225   OrchestrateThroughEvaluationFlow();
   1226 
   1227   resetter().NotifyDidCloseWebUIResetBanner();
   1228 
   1229   EXPECT_TRUE(resetter().IsResetPromptFlowActive());
   1230   EXPECT_FALSE(resetter().ShouldShowResetBanner());
   1231   VerifyExpectationsThenShutdownResetter();
   1232 
   1233   ExpectAllMementoValuesEqualTo(std::string());
   1234 }
   1235 
   1236 // Please see comments above ConstructProgramToCheckPreferences() to understand
   1237 // how the following tests work.
   1238 
   1239 TEST_F(AutomaticProfileResetterTest, InputUserPreferencesCorrect) {
   1240   SetTestingProgram(ConstructProgramToCheckPreferences());
   1241   SetTestingHashSeed(kTestHashSeed);
   1242 
   1243   PrefService* prefs = profile()->GetPrefs();
   1244   prefs->SetString(kTestPreferencePath, kTestPreferenceValue);
   1245 
   1246   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
   1247   mock_delegate().ExpectCallsToGetterMethods();
   1248   uint32 expected_mask = HAS_EXPECTED_USER_PREFERENCE |
   1249                          USER_PREFERENCE_IS_USER_CONTROLLED;
   1250   EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask));
   1251 
   1252   UnleashResetterAndWait();
   1253 }
   1254 
   1255 TEST_F(AutomaticProfileResetterTest, InputLocalStateCorrect) {
   1256   SetTestingProgram(ConstructProgramToCheckPreferences());
   1257   SetTestingHashSeed(kTestHashSeed);
   1258 
   1259   PrefService* prefs = local_state();
   1260   prefs->SetString(kTestPreferencePath, kTestPreferenceValue);
   1261 
   1262   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
   1263   mock_delegate().ExpectCallsToGetterMethods();
   1264   uint32 expected_mask = HAS_EXPECTED_LOCAL_STATE_PREFERENCE |
   1265                          LOCAL_STATE_IS_USER_CONTROLLED;
   1266   EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask));
   1267 
   1268   UnleashResetterAndWait();
   1269 }
   1270 
   1271 TEST_F(AutomaticProfileResetterTest, InputManagedUserPreferencesCorrect) {
   1272   SetTestingProgram(ConstructProgramToCheckPreferences());
   1273   SetTestingHashSeed(kTestHashSeed);
   1274 
   1275   TestingPrefServiceSyncable* prefs = profile()->GetTestingPrefService();
   1276   prefs->SetManagedPref(kTestPreferencePath,
   1277                         new base::StringValue(kTestPreferenceValue));
   1278 
   1279   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
   1280   mock_delegate().ExpectCallsToGetterMethods();
   1281   uint32 expected_mask = HAS_EXPECTED_USER_PREFERENCE;
   1282   EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask));
   1283 
   1284   UnleashResetterAndWait();
   1285 }
   1286 
   1287 TEST_F(AutomaticProfileResetterTest, InputManagedLocalStateCorrect) {
   1288   SetTestingProgram(ConstructProgramToCheckPreferences());
   1289   SetTestingHashSeed(kTestHashSeed);
   1290 
   1291   TestingPrefServiceSimple* prefs = local_state();
   1292   prefs->SetManagedPref(kTestPreferencePath,
   1293                         new base::StringValue(kTestPreferenceValue));
   1294 
   1295   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
   1296   mock_delegate().ExpectCallsToGetterMethods();
   1297   uint32 expected_mask = HAS_EXPECTED_LOCAL_STATE_PREFERENCE;
   1298   EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask));
   1299 
   1300   UnleashResetterAndWait();
   1301 }
   1302 
   1303 // Please see comments above ConstructProgramToCheckSearchEngines() to
   1304 // understand how the following tests work.
   1305 
   1306 TEST_F(AutomaticProfileResetterTest, InputDefaultSearchProviderCorrect) {
   1307   SetTestingProgram(ConstructProgramToCheckSearchEngines());
   1308   SetTestingHashSeed(kTestHashSeed);
   1309 
   1310   mock_delegate().emulated_default_search_provider_details().SetString(
   1311       kSearchURLAttributeKey, kTestSearchURL);
   1312 
   1313   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
   1314   mock_delegate().ExpectCallsToGetterMethods();
   1315   uint32 expected_mask = HAS_EXPECTED_DEFAULT_SEARCH_PROVIDER |
   1316                          DEFAULT_SEARCH_PROVIDER_IS_USER_CONTROLLED;
   1317   EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask));
   1318 
   1319   UnleashResetterAndWait();
   1320 }
   1321 
   1322 TEST_F(AutomaticProfileResetterTest, InputSearchProviderManagedCorrect) {
   1323   SetTestingProgram(ConstructProgramToCheckSearchEngines());
   1324   SetTestingHashSeed(kTestHashSeed);
   1325 
   1326   mock_delegate().emulated_default_search_provider_details().SetString(
   1327       kSearchURLAttributeKey, kTestSearchURL);
   1328   mock_delegate().set_emulated_is_default_search_provider_managed(true);
   1329 
   1330   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
   1331   mock_delegate().ExpectCallsToGetterMethods();
   1332   uint32 expected_mask = HAS_EXPECTED_DEFAULT_SEARCH_PROVIDER;
   1333   EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask));
   1334 
   1335   UnleashResetterAndWait();
   1336 }
   1337 
   1338 TEST_F(AutomaticProfileResetterTest, InputSearchProvidersCorrect) {
   1339   SetTestingProgram(ConstructProgramToCheckSearchEngines());
   1340   SetTestingHashSeed(kTestHashSeed);
   1341 
   1342   base::DictionaryValue* search_provider_1 = new base::DictionaryValue;
   1343   base::DictionaryValue* search_provider_2 = new base::DictionaryValue;
   1344   search_provider_1->SetString(kSearchURLAttributeKey, kTestSearchURL);
   1345   search_provider_2->SetString(kSearchURLAttributeKey, kTestSearchURL2);
   1346   mock_delegate().emulated_search_providers_details().Append(search_provider_1);
   1347   mock_delegate().emulated_search_providers_details().Append(search_provider_2);
   1348 
   1349   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
   1350   mock_delegate().ExpectCallsToGetterMethods();
   1351   uint32 expected_mask = DEFAULT_SEARCH_PROVIDER_IS_USER_CONTROLLED |
   1352                          HAS_EXPECTED_PREPOPULATED_SEARCH_PROVIDER_1 |
   1353                          HAS_EXPECTED_PREPOPULATED_SEARCH_PROVIDER_2;
   1354   EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask));
   1355 
   1356   UnleashResetterAndWait();
   1357 }
   1358 
   1359 // Please see comments above ConstructProgramToCheckLoadedModuleDigests() to
   1360 // understand how the following tests work.
   1361 
   1362 TEST_F(AutomaticProfileResetterTest, InputModuleDigestsCorrect) {
   1363   SetTestingProgram(ConstructProgramToCheckLoadedModuleDigests());
   1364   SetTestingHashSeed(kTestHashSeed);
   1365 
   1366   mock_delegate().emulated_loaded_module_digests().AppendString(
   1367       kTestModuleDigest);
   1368   mock_delegate().emulated_loaded_module_digests().AppendString(
   1369       kTestModuleDigest2);
   1370 
   1371   mock_delegate().ExpectCallsToDependenciesSetUpMethods();
   1372   mock_delegate().ExpectCallsToGetterMethods();
   1373   uint32 expected_mask =
   1374       HAS_EXPECTED_MODULE_DIGEST_1 | HAS_EXPECTED_MODULE_DIGEST_2;
   1375   EXPECT_CALL(resetter(), ReportStatistics(0x00u, expected_mask));
   1376 
   1377   UnleashResetterAndWait();
   1378 }
   1379 
   1380 }  // namespace
   1381