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.
5 #include "chrome/browser/profile_resetter/automatic_profile_resetter_delegate.h"
10 #include "base/bind_helpers.h"
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/prefs/pref_service.h"
14 #include "base/run_loop.h"
15 #include "base/strings/string_number_conversions.h"
16 #include "base/strings/string_split.h"
17 #include "base/strings/string_util.h"
18 #include "base/strings/utf_string_conversions.h"
19 #include "base/test/values_test_util.h"
20 #include "base/values.h"
21 #include "chrome/app/chrome_command_ids.h"
22 #include "chrome/browser/chrome_notification_types.h"
23 #include "chrome/browser/extensions/extension_service.h"
24 #include "chrome/browser/extensions/extension_service_test_base.h"
25 #include "chrome/browser/google/google_brand.h"
26 #include "chrome/browser/profile_resetter/brandcoded_default_settings.h"
27 #include "chrome/browser/profile_resetter/profile_reset_global_error.h"
28 #include "chrome/browser/search_engines/template_url_service_factory.h"
29 #include "chrome/browser/search_engines/template_url_service_factory_test_util.h"
30 #include "chrome/browser/ui/global_error/global_error.h"
31 #include "chrome/browser/ui/global_error/global_error_service.h"
32 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
33 #include "chrome/common/pref_names.h"
34 #include "chrome/test/base/testing_pref_service_syncable.h"
35 #include "chrome/test/base/testing_profile.h"
36 #include "components/search_engines/default_search_manager.h"
37 #include "components/search_engines/template_url_prepopulate_data.h"
38 #include "components/search_engines/template_url_service.h"
39 #include "content/public/browser/notification_service.h"
40 #include "net/http/http_response_headers.h"
41 #include "net/url_request/test_url_fetcher_factory.h"
42 #include "testing/gmock/include/gmock/gmock.h"
43 #include "testing/gtest/include/gtest/gtest.h"
46 #include "chrome/browser/enumerate_modules_model_win.h"
51 const char kTestBrandcode
[] = "FOOBAR";
53 const char kTestHomepage
[] = "http://google.com";
54 const char kTestBrandedHomepage
[] = "http://example.com";
56 const ProfileResetter::ResettableFlags kResettableAspectsForTest
=
57 ProfileResetter::ALL
& ~ProfileResetter::COOKIES_AND_SITE_DATA
;
59 // Helpers -------------------------------------------------------------------
61 // A testing version of the AutomaticProfileResetterDelegate that differs from
62 // the real one only in that it has its feedback reporting mocked out, and it
63 // will not reset COOKIES_AND_SITE_DATA, due to difficulties to set up some
64 // required URLRequestContexts in unit tests.
65 class AutomaticProfileResetterDelegateUnderTest
66 : public AutomaticProfileResetterDelegateImpl
{
68 explicit AutomaticProfileResetterDelegateUnderTest(Profile
* profile
)
69 : AutomaticProfileResetterDelegateImpl(
70 profile
, kResettableAspectsForTest
) {}
71 virtual ~AutomaticProfileResetterDelegateUnderTest() {}
73 MOCK_CONST_METHOD1(SendFeedback
, void(const std::string
&));
76 DISALLOW_COPY_AND_ASSIGN(AutomaticProfileResetterDelegateUnderTest
);
79 class MockCallbackTarget
{
81 MockCallbackTarget() {}
82 ~MockCallbackTarget() {}
84 MOCK_CONST_METHOD0(Run
, void(void));
86 base::Closure
CreateClosure() {
87 return base::Bind(&MockCallbackTarget::Run
, base::Unretained(this));
91 DISALLOW_COPY_AND_ASSIGN(MockCallbackTarget
);
94 // Returns the details of the default search provider from |prefs| in a format
95 // suitable for usage as |expected_details| in ExpectDetailsMatch().
96 const base::DictionaryValue
* GetDefaultSearchProviderDetailsFromPrefs(
97 const PrefService
* prefs
) {
98 return prefs
->GetDictionary(
99 DefaultSearchManager::kDefaultSearchProviderDataPrefName
);
102 // Verifies that the |details| of a search engine as provided by the delegate
103 // are correct in comparison to the |expected_details| coming from the Prefs.
104 void ExpectDetailsMatch(const base::DictionaryValue
& expected_details
,
105 const base::DictionaryValue
& details
) {
106 for (base::DictionaryValue::Iterator
it(expected_details
); !it
.IsAtEnd();
108 SCOPED_TRACE(testing::Message("Key: ") << it
.key());
109 if (it
.key() == "enabled" || it
.key() == "synced_guid") {
110 // These attributes should not be present.
111 EXPECT_FALSE(details
.HasKey(it
.key()));
114 const base::Value
* expected_value
= &it
.value();
115 const base::Value
* actual_value
= NULL
;
116 ASSERT_TRUE(details
.Get(it
.key(), &actual_value
));
118 // Ignore ID as it is dynamically assigned by the TemplateURLService.
119 // last_modified may get updated during a run, so ignore value differences.
120 if (it
.key() != "id" && it
.key() != "last_modified") {
121 // Everything else is the same format.
122 EXPECT_TRUE(actual_value
->Equals(expected_value
))
123 << "Expected: " << *expected_value
<< ". Actual: " << *actual_value
;
128 // If |simulate_failure| is false, then replies to the pending request on
129 // |fetcher| with a brandcoded config that only specifies a home page URL.
130 // If |simulate_failure| is true, replies with 404.
131 void ServicePendingBrancodedConfigFetch(net::TestURLFetcher
* fetcher
,
132 bool simulate_failure
) {
133 const char kBrandcodedXmlSettings
[] =
134 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
135 "<response protocol=\"3.0\" server=\"prod\">"
136 "<app appid=\"{8A69D345-D564-463C-AFF1-A69D9E530F96}\" status=\"ok\">"
137 "<data index=\"skipfirstrunui-importsearch-defaultbrowser\" "
138 "name=\"install\" status=\"ok\">"
139 "{\"homepage\" : \"$1\"}"
144 fetcher
->set_response_code(simulate_failure
? 404 : 200);
145 scoped_refptr
<net::HttpResponseHeaders
> response_headers(
146 new net::HttpResponseHeaders(""));
147 response_headers
->AddHeader("Content-Type: text/xml");
148 fetcher
->set_response_headers(response_headers
);
149 if (!simulate_failure
) {
150 std::string
response(kBrandcodedXmlSettings
);
151 size_t placeholder_index
= response
.find("$1");
152 ASSERT_NE(std::string::npos
, placeholder_index
);
153 response
.replace(placeholder_index
, 2, kTestBrandedHomepage
);
154 fetcher
->SetResponseString(response
);
156 fetcher
->delegate()->OnURLFetchComplete(fetcher
);
160 // Test fixture --------------------------------------------------------------
162 // ExtensionServiceTestBase sets up a TestingProfile with the ExtensionService,
163 // we then add the TemplateURLService, so the ProfileResetter can be exercised.
164 class AutomaticProfileResetterDelegateTest
165 : public extensions::ExtensionServiceTestBase
{
167 AutomaticProfileResetterDelegateTest() {}
168 ~AutomaticProfileResetterDelegateTest() override
{}
170 void SetUp() override
{
171 extensions::ExtensionServiceTestBase::SetUp();
172 ExtensionServiceInitParams params
= CreateDefaultInitParams();
173 params
.pref_file
.clear(); // Prescribes a TestingPrefService to be created.
174 InitializeExtensionService(params
);
175 template_url_service_test_util_
.reset(
176 new TemplateURLServiceFactoryTestUtil(profile_
.get()));
177 resetter_delegate_
.reset(
178 new AutomaticProfileResetterDelegateUnderTest(profile()));
181 void TearDown() override
{
182 resetter_delegate_
.reset();
183 template_url_service_test_util_
.reset();
184 extensions::ExtensionServiceTestBase::TearDown();
187 scoped_ptr
<TemplateURL
> CreateTestTemplateURL() {
188 TemplateURLData data
;
190 data
.SetURL("http://example.com/search?q={searchTerms}");
191 data
.suggestions_url
= "http://example.com/suggest?q={searchTerms}";
192 data
.instant_url
= "http://example.com/instant?q={searchTerms}";
193 data
.image_url
= "http://example.com/image?q={searchTerms}";
194 data
.search_url_post_params
= "search-post-params";
195 data
.suggestions_url_post_params
= "suggest-post-params";
196 data
.instant_url_post_params
= "instant-post-params";
197 data
.image_url_post_params
= "image-post-params";
199 data
.favicon_url
= GURL("http://example.com/favicon.ico");
200 data
.new_tab_url
= "http://example.com/newtab.html";
201 data
.alternate_urls
.push_back("http://example.com/s?q={searchTerms}");
203 data
.short_name
= base::ASCIIToUTF16("name");
204 data
.SetKeyword(base::ASCIIToUTF16("keyword"));
205 data
.search_terms_replacement_key
= "search-terms-replacment-key";
206 data
.prepopulate_id
= 42;
207 data
.input_encodings
.push_back("UTF-8");
208 data
.safe_for_autoreplace
= true;
210 return scoped_ptr
<TemplateURL
>(new TemplateURL(data
));
213 void ExpectNoPendingBrandcodedConfigFetch() {
214 EXPECT_FALSE(test_url_fetcher_factory_
.GetFetcherByID(0));
217 void ExpectAndServicePendingBrandcodedConfigFetch(bool simulate_failure
) {
218 net::TestURLFetcher
* fetcher
= test_url_fetcher_factory_
.GetFetcherByID(0);
219 ASSERT_TRUE(fetcher
);
220 EXPECT_THAT(fetcher
->upload_data(),
221 testing::HasSubstr(kTestBrandcode
));
222 ServicePendingBrancodedConfigFetch(fetcher
, simulate_failure
);
225 void ExpectResetPromptState(bool active
) {
226 GlobalErrorService
* global_error_service
=
227 GlobalErrorServiceFactory::GetForProfile(profile());
228 GlobalError
* global_error
= global_error_service
->
229 GetGlobalErrorByMenuItemCommandID(IDC_SHOW_SETTINGS_RESET_BUBBLE
);
230 EXPECT_EQ(active
, !!global_error
);
233 AutomaticProfileResetterDelegateUnderTest
* resetter_delegate() {
234 return resetter_delegate_
.get();
237 TemplateURLServiceFactoryTestUtil
* template_url_service_test_util() {
238 return template_url_service_test_util_
.get();
242 scoped_ptr
<TemplateURLServiceFactoryTestUtil
> template_url_service_test_util_
;
243 net::TestURLFetcherFactory test_url_fetcher_factory_
;
244 scoped_ptr
<AutomaticProfileResetterDelegateUnderTest
> resetter_delegate_
;
246 DISALLOW_COPY_AND_ASSIGN(AutomaticProfileResetterDelegateTest
);
250 // Tests ---------------------------------------------------------------------
252 TEST_F(AutomaticProfileResetterDelegateTest
,
253 TriggerAndWaitOnModuleEnumeration
) {
254 // Expect ready_callback to be called just after the modules have been
255 // enumerated. Fail if it is not called. Note: as the EnumerateModulesModel is
256 // a global singleton, the callback might be invoked immediately if another
257 // test-case (e.g. the one below) has already performed module enumeration.
258 testing::StrictMock
<MockCallbackTarget
> mock_target
;
259 EXPECT_CALL(mock_target
, Run());
260 resetter_delegate()->RequestCallbackWhenLoadedModulesAreEnumerated(
261 mock_target
.CreateClosure());
262 resetter_delegate()->EnumerateLoadedModulesIfNeeded();
263 base::RunLoop().RunUntilIdle();
265 testing::Mock::VerifyAndClearExpectations(&mock_target
);
267 // Expect ready_callback to be posted immediately when the modules have
268 // already been enumerated.
269 EXPECT_CALL(mock_target
, Run());
270 resetter_delegate()->RequestCallbackWhenLoadedModulesAreEnumerated(
271 mock_target
.CreateClosure());
272 base::RunLoop().RunUntilIdle();
275 testing::Mock::VerifyAndClearExpectations(&mock_target
);
277 // Expect ready_callback to be posted immediately even when the modules had
278 // already been enumerated when the delegate was constructed.
279 scoped_ptr
<AutomaticProfileResetterDelegate
> late_resetter_delegate(
280 new AutomaticProfileResetterDelegateImpl(profile(),
281 ProfileResetter::ALL
));
283 EXPECT_CALL(mock_target
, Run());
284 late_resetter_delegate
->RequestCallbackWhenLoadedModulesAreEnumerated(
285 mock_target
.CreateClosure());
286 base::RunLoop().RunUntilIdle();
290 TEST_F(AutomaticProfileResetterDelegateTest
, GetLoadedModuleNameDigests
) {
291 resetter_delegate()->EnumerateLoadedModulesIfNeeded();
292 base::RunLoop().RunUntilIdle();
293 scoped_ptr
<base::ListValue
> module_name_digests(
294 resetter_delegate()->GetLoadedModuleNameDigests());
296 // Just verify that each element looks like an MD5 hash in hexadecimal, and
297 // also that we have at least one element on Win.
298 ASSERT_TRUE(module_name_digests
);
299 for (base::ListValue::const_iterator it
= module_name_digests
->begin();
300 it
!= module_name_digests
->end(); ++it
) {
301 std::string digest_hex
;
302 std::vector
<uint8
> digest_raw
;
304 ASSERT_TRUE((*it
)->GetAsString(&digest_hex
));
305 ASSERT_TRUE(base::HexStringToBytes(digest_hex
, &digest_raw
));
306 EXPECT_EQ(16u, digest_raw
.size());
309 EXPECT_LE(1u, module_name_digests
->GetSize());
313 TEST_F(AutomaticProfileResetterDelegateTest
, LoadAndWaitOnTemplateURLService
) {
314 // Expect ready_callback to be called just after the template URL service gets
315 // initialized. Fail if it is not called, or called too early.
316 testing::StrictMock
<MockCallbackTarget
> mock_target
;
317 resetter_delegate()->RequestCallbackWhenTemplateURLServiceIsLoaded(
318 mock_target
.CreateClosure());
319 base::RunLoop().RunUntilIdle();
321 EXPECT_CALL(mock_target
, Run());
322 resetter_delegate()->LoadTemplateURLServiceIfNeeded();
323 base::RunLoop().RunUntilIdle();
325 testing::Mock::VerifyAndClearExpectations(&mock_target
);
327 // Expect ready_callback to be posted immediately when the template URL
328 // service is already initialized.
329 EXPECT_CALL(mock_target
, Run());
330 resetter_delegate()->RequestCallbackWhenTemplateURLServiceIsLoaded(
331 mock_target
.CreateClosure());
332 base::RunLoop().RunUntilIdle();
334 testing::Mock::VerifyAndClearExpectations(&mock_target
);
336 // Expect ready_callback to be posted immediately even when the template URL
337 // service had already been initialized when the delegate was constructed.
338 scoped_ptr
<AutomaticProfileResetterDelegate
> late_resetter_delegate(
339 new AutomaticProfileResetterDelegateImpl(profile(),
340 ProfileResetter::ALL
));
342 EXPECT_CALL(mock_target
, Run());
343 late_resetter_delegate
->RequestCallbackWhenTemplateURLServiceIsLoaded(
344 mock_target
.CreateClosure());
345 base::RunLoop().RunUntilIdle();
348 TEST_F(AutomaticProfileResetterDelegateTest
,
349 DefaultSearchProviderDataWhenNotManaged
) {
350 TemplateURLService
* template_url_service
=
351 TemplateURLServiceFactory::GetForProfile(profile());
352 template_url_service_test_util()->VerifyLoad();
354 // Check that the "managed state" and the details returned by the delegate are
355 // correct. We verify the details against the data stored by
356 // TemplateURLService into Prefs.
357 scoped_ptr
<TemplateURL
> owned_custom_dsp(CreateTestTemplateURL());
358 TemplateURL
* custom_dsp
= owned_custom_dsp
.get();
359 template_url_service
->Add(owned_custom_dsp
.release());
360 template_url_service
->SetUserSelectedDefaultSearchProvider(custom_dsp
);
362 PrefService
* prefs
= profile()->GetPrefs();
364 scoped_ptr
<base::DictionaryValue
> dsp_details(
365 resetter_delegate()->GetDefaultSearchProviderDetails());
366 const base::DictionaryValue
* expected_dsp_details
=
367 GetDefaultSearchProviderDetailsFromPrefs(prefs
);
369 ExpectDetailsMatch(*expected_dsp_details
, *dsp_details
);
370 EXPECT_FALSE(resetter_delegate()->IsDefaultSearchProviderManaged());
373 TEST_F(AutomaticProfileResetterDelegateTest
,
374 DefaultSearchProviderDataWhenManaged
) {
375 const char kTestSearchURL
[] = "http://example.com/search?q={searchTerms}";
376 const char kTestName
[] = "name";
377 const char kTestKeyword
[] = "keyword";
379 template_url_service_test_util()->VerifyLoad();
381 EXPECT_FALSE(resetter_delegate()->IsDefaultSearchProviderManaged());
383 // Set managed preferences to emulate a default search provider set by policy.
384 template_url_service_test_util()->SetManagedDefaultSearchPreferences(
385 true, kTestName
, kTestKeyword
, kTestSearchURL
, std::string(),
386 std::string(), std::string(), std::string(), std::string());
388 EXPECT_TRUE(resetter_delegate()->IsDefaultSearchProviderManaged());
389 scoped_ptr
<base::DictionaryValue
> dsp_details(
390 resetter_delegate()->GetDefaultSearchProviderDetails());
391 // Checking that all details are correct is already done by the above test.
392 // Just make sure details are reported about the correct engine.
393 base::ExpectDictStringValue(kTestSearchURL
, *dsp_details
, "search_url");
395 // Set managed preferences to emulate that having a default search provider is
396 // disabled by policy.
397 template_url_service_test_util()->RemoveManagedDefaultSearchPreferences();
398 template_url_service_test_util()->SetManagedDefaultSearchPreferences(
399 false, std::string(), std::string(), std::string(), std::string(),
400 std::string(), std::string(), std::string(), std::string());
402 dsp_details
= resetter_delegate()->GetDefaultSearchProviderDetails();
403 EXPECT_TRUE(resetter_delegate()->IsDefaultSearchProviderManaged());
404 EXPECT_TRUE(dsp_details
->empty());
407 TEST_F(AutomaticProfileResetterDelegateTest
,
408 GetPrepopulatedSearchProvidersDetails
) {
409 TemplateURLService
* template_url_service
=
410 TemplateURLServiceFactory::GetForProfile(profile());
411 template_url_service_test_util()->VerifyLoad();
413 scoped_ptr
<base::ListValue
> search_engines_details(
414 resetter_delegate()->GetPrepopulatedSearchProvidersDetails());
416 // Do the same kind of verification as for GetDefaultSearchEngineDetails:
417 // subsequently set each pre-populated engine as the default, so we can verify
418 // that the details returned by the delegate about one particular engine are
419 // correct in comparison to what has been stored to the Prefs.
420 std::vector
<TemplateURL
*> prepopulated_engines
=
421 template_url_service
->GetTemplateURLs();
423 ASSERT_EQ(prepopulated_engines
.size(), search_engines_details
->GetSize());
425 for (size_t i
= 0; i
< search_engines_details
->GetSize(); ++i
) {
426 const base::DictionaryValue
* details
= NULL
;
427 ASSERT_TRUE(search_engines_details
->GetDictionary(i
, &details
));
430 ASSERT_TRUE(details
->GetString("keyword", &keyword
));
431 TemplateURL
* search_engine
=
432 template_url_service
->GetTemplateURLForKeyword(
433 base::ASCIIToUTF16(keyword
));
434 ASSERT_TRUE(search_engine
);
435 template_url_service
->SetUserSelectedDefaultSearchProvider(
436 prepopulated_engines
[i
]);
438 PrefService
* prefs
= profile()->GetPrefs();
440 const base::DictionaryValue
* expected_dsp_details
=
441 GetDefaultSearchProviderDetailsFromPrefs(prefs
);
442 ExpectDetailsMatch(*expected_dsp_details
, *details
);
446 TEST_F(AutomaticProfileResetterDelegateTest
,
447 FetchAndWaitOnDefaultSettingsVanilla
) {
448 google_brand::BrandForTesting
scoped_brand_for_testing((std::string()));
450 // Expect ready_callback to be called just after empty brandcoded settings
451 // are loaded, given this is a vanilla build. Fail if it is not called, or
453 testing::StrictMock
<MockCallbackTarget
> mock_target
;
454 resetter_delegate()->RequestCallbackWhenBrandcodedDefaultsAreFetched(
455 mock_target
.CreateClosure());
456 base::RunLoop().RunUntilIdle();
457 EXPECT_FALSE(resetter_delegate()->brandcoded_defaults());
459 EXPECT_CALL(mock_target
, Run());
460 resetter_delegate()->FetchBrandcodedDefaultSettingsIfNeeded();
461 base::RunLoop().RunUntilIdle();
462 ExpectNoPendingBrandcodedConfigFetch();
464 testing::Mock::VerifyAndClearExpectations(&mock_target
);
465 EXPECT_TRUE(resetter_delegate()->brandcoded_defaults());
467 // Expect ready_callback to be posted immediately when the brandcoded settings
468 // have already been loaded.
469 EXPECT_CALL(mock_target
, Run());
470 resetter_delegate()->RequestCallbackWhenBrandcodedDefaultsAreFetched(
471 mock_target
.CreateClosure());
472 base::RunLoop().RunUntilIdle();
474 // No test for a new instance of AutomaticProfileResetterDelegate. That will
475 // need to fetch the brandcoded settings again.
478 TEST_F(AutomaticProfileResetterDelegateTest
,
479 FetchAndWaitOnDefaultSettingsBranded
) {
480 google_brand::BrandForTesting
scoped_brand_for_testing(kTestBrandcode
);
482 // Expect ready_callback to be called just after the brandcoded settings are
483 // downloaded. Fail if it is not called, or called too early.
484 testing::StrictMock
<MockCallbackTarget
> mock_target
;
485 resetter_delegate()->RequestCallbackWhenBrandcodedDefaultsAreFetched(
486 mock_target
.CreateClosure());
487 base::RunLoop().RunUntilIdle();
488 EXPECT_FALSE(resetter_delegate()->brandcoded_defaults());
490 EXPECT_CALL(mock_target
, Run());
491 resetter_delegate()->FetchBrandcodedDefaultSettingsIfNeeded();
492 ExpectAndServicePendingBrandcodedConfigFetch(false /*simulate_failure*/);
493 base::RunLoop().RunUntilIdle();
495 testing::Mock::VerifyAndClearExpectations(&mock_target
);
496 const BrandcodedDefaultSettings
* brandcoded_defaults
=
497 resetter_delegate()->brandcoded_defaults();
498 ASSERT_TRUE(brandcoded_defaults
);
499 std::string homepage_url
;
500 EXPECT_TRUE(brandcoded_defaults
->GetHomepage(&homepage_url
));
501 EXPECT_EQ(kTestBrandedHomepage
, homepage_url
);
503 // Expect ready_callback to be posted immediately when the brandcoded settings
504 // have already been downloaded.
505 EXPECT_CALL(mock_target
, Run());
506 resetter_delegate()->RequestCallbackWhenBrandcodedDefaultsAreFetched(
507 mock_target
.CreateClosure());
508 base::RunLoop().RunUntilIdle();
511 TEST_F(AutomaticProfileResetterDelegateTest
,
512 FetchAndWaitOnDefaultSettingsBrandedFailure
) {
513 google_brand::BrandForTesting
scoped_brand_for_testing(kTestBrandcode
);
515 // Expect ready_callback to be called just after the brandcoded settings have
516 // failed to download. Fail if it is not called, or called too early.
517 testing::StrictMock
<MockCallbackTarget
> mock_target
;
518 resetter_delegate()->RequestCallbackWhenBrandcodedDefaultsAreFetched(
519 mock_target
.CreateClosure());
520 base::RunLoop().RunUntilIdle();
522 EXPECT_CALL(mock_target
, Run());
523 resetter_delegate()->FetchBrandcodedDefaultSettingsIfNeeded();
524 ExpectAndServicePendingBrandcodedConfigFetch(true /*simulate_failure*/);
525 base::RunLoop().RunUntilIdle();
527 testing::Mock::VerifyAndClearExpectations(&mock_target
);
528 EXPECT_TRUE(resetter_delegate()->brandcoded_defaults());
530 // Expect ready_callback to be posted immediately when the brandcoded settings
531 // have already been attempted to be downloaded, but failed.
532 EXPECT_CALL(mock_target
, Run());
533 resetter_delegate()->RequestCallbackWhenBrandcodedDefaultsAreFetched(
534 mock_target
.CreateClosure());
535 base::RunLoop().RunUntilIdle();
538 TEST_F(AutomaticProfileResetterDelegateTest
, TriggerReset
) {
539 google_brand::BrandForTesting
scoped_brand_for_testing(kTestBrandcode
);
541 PrefService
* prefs
= profile()->GetPrefs();
543 prefs
->SetString(prefs::kHomePage
, kTestHomepage
);
545 testing::StrictMock
<MockCallbackTarget
> mock_target
;
546 EXPECT_CALL(mock_target
, Run());
547 EXPECT_CALL(*resetter_delegate(), SendFeedback(testing::_
)).Times(0);
548 resetter_delegate()->TriggerProfileSettingsReset(
549 false /*send_feedback*/, mock_target
.CreateClosure());
550 ExpectAndServicePendingBrandcodedConfigFetch(false /*simulate_failure*/);
551 base::RunLoop().RunUntilIdle();
553 EXPECT_EQ(kTestBrandedHomepage
, prefs
->GetString(prefs::kHomePage
));
556 TEST_F(AutomaticProfileResetterDelegateTest
,
557 TriggerResetWithDefaultSettingsAlreadyLoaded
) {
558 google_brand::BrandForTesting
scoped_brand_for_testing(kTestBrandcode
);
560 PrefService
* prefs
= profile()->GetPrefs();
562 prefs
->SetString(prefs::kHomePage
, kTestHomepage
);
564 resetter_delegate()->FetchBrandcodedDefaultSettingsIfNeeded();
565 ExpectAndServicePendingBrandcodedConfigFetch(false /*simulate_failure*/);
566 base::RunLoop().RunUntilIdle();
568 testing::StrictMock
<MockCallbackTarget
> mock_target
;
569 EXPECT_CALL(mock_target
, Run());
570 EXPECT_CALL(*resetter_delegate(), SendFeedback(testing::_
)).Times(0);
571 resetter_delegate()->TriggerProfileSettingsReset(
572 false /*send_feedback*/, mock_target
.CreateClosure());
573 base::RunLoop().RunUntilIdle();
575 EXPECT_EQ(kTestBrandedHomepage
, prefs
->GetString(prefs::kHomePage
));
578 TEST_F(AutomaticProfileResetterDelegateTest
,
579 TriggerResetAndSendFeedback
) {
580 google_brand::BrandForTesting
scoped_brand_for_testing(kTestBrandcode
);
582 PrefService
* prefs
= profile()->GetPrefs();
584 prefs
->SetString(prefs::kHomePage
, kTestHomepage
);
586 testing::StrictMock
<MockCallbackTarget
> mock_target
;
587 EXPECT_CALL(mock_target
, Run());
588 EXPECT_CALL(*resetter_delegate(),
589 SendFeedback(testing::HasSubstr(kTestHomepage
)));
591 resetter_delegate()->TriggerProfileSettingsReset(
592 true /*send_feedback*/, mock_target
.CreateClosure());
593 ExpectAndServicePendingBrandcodedConfigFetch(false /*simulate_failure*/);
594 base::RunLoop().RunUntilIdle();
597 TEST_F(AutomaticProfileResetterDelegateTest
, ShowAndDismissPrompt
) {
598 resetter_delegate()->TriggerPrompt();
599 if (ProfileResetGlobalError::IsSupportedOnPlatform())
600 ExpectResetPromptState(true /*active*/);
602 ExpectResetPromptState(false /*active*/);
603 resetter_delegate()->DismissPrompt();
604 ExpectResetPromptState(false /*active*/);
605 resetter_delegate()->DismissPrompt();