OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/ntp_snippets/ntp_snippets_fetcher.h" | 5 #include "components/ntp_snippets/ntp_snippets_fetcher.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
13 #include "base/test/histogram_tester.h" | 13 #include "base/test/histogram_tester.h" |
14 #include "base/test/test_mock_time_task_runner.h" | 14 #include "base/test/test_mock_time_task_runner.h" |
15 #include "base/threading/thread_task_runner_handle.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
16 #include "base/time/time.h" | 16 #include "base/time/time.h" |
17 #include "base/values.h" | 17 #include "base/values.h" |
18 #include "components/ntp_snippets/ntp_snippet.h" | 18 #include "components/ntp_snippets/ntp_snippet.h" |
19 #include "components/ntp_snippets/ntp_snippets_constants.h" | 19 #include "components/ntp_snippets/ntp_snippets_constants.h" |
20 #include "components/prefs/testing_pref_service.h" | |
20 #include "components/signin/core/browser/account_tracker_service.h" | 21 #include "components/signin/core/browser/account_tracker_service.h" |
21 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h" | 22 #include "components/signin/core/browser/fake_profile_oauth2_token_service.h" |
22 #include "components/signin/core/browser/fake_signin_manager.h" | 23 #include "components/signin/core/browser/fake_signin_manager.h" |
23 #include "components/signin/core/browser/test_signin_client.h" | 24 #include "components/signin/core/browser/test_signin_client.h" |
24 #include "components/variations/entropy_provider.h" | 25 #include "components/variations/entropy_provider.h" |
25 #include "components/variations/variations_associated_data.h" | 26 #include "components/variations/variations_associated_data.h" |
26 #include "google_apis/google_api_keys.h" | 27 #include "google_apis/google_api_keys.h" |
27 #include "net/url_request/test_url_fetcher_factory.h" | 28 #include "net/url_request/test_url_fetcher_factory.h" |
28 #include "net/url_request/url_request_test_util.h" | 29 #include "net/url_request/url_request_test_util.h" |
29 #include "testing/gmock/include/gmock/gmock.h" | 30 #include "testing/gmock/include/gmock/gmock.h" |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
142 NTPSnippetsFetcherTest(const GURL& gurl, | 143 NTPSnippetsFetcherTest(const GURL& gurl, |
143 const std::map<std::string, std::string>& params) | 144 const std::map<std::string, std::string>& params) |
144 : params_manager_(ntp_snippets::kStudyName, params), | 145 : params_manager_(ntp_snippets::kStudyName, params), |
145 mock_task_runner_(new base::TestMockTimeTaskRunner()), | 146 mock_task_runner_(new base::TestMockTimeTaskRunner()), |
146 mock_task_runner_handle_(mock_task_runner_), | 147 mock_task_runner_handle_(mock_task_runner_), |
147 signin_client_(new TestSigninClient(nullptr)), | 148 signin_client_(new TestSigninClient(nullptr)), |
148 account_tracker_(new AccountTrackerService()), | 149 account_tracker_(new AccountTrackerService()), |
149 fake_signin_manager_(new FakeSigninManagerBase(signin_client_.get(), | 150 fake_signin_manager_(new FakeSigninManagerBase(signin_client_.get(), |
150 account_tracker_.get())), | 151 account_tracker_.get())), |
151 fake_token_service_(new FakeProfileOAuth2TokenService()), | 152 fake_token_service_(new FakeProfileOAuth2TokenService()), |
152 snippets_fetcher_( | 153 pref_service_(new TestingPrefServiceSimple()), |
154 test_lang_("en-US"), | |
155 test_url_(gurl) { | |
156 RequestThrottler::RegisterProfilePrefs(pref_service_->registry()); | |
157 | |
158 snippets_fetcher_ = base::MakeUnique<NTPSnippetsFetcher>( | |
153 fake_signin_manager_.get(), | 159 fake_signin_manager_.get(), |
154 fake_token_service_.get(), | 160 fake_token_service_.get(), |
155 scoped_refptr<net::TestURLRequestContextGetter>( | 161 scoped_refptr<net::TestURLRequestContextGetter>( |
156 new net::TestURLRequestContextGetter(mock_task_runner_.get())), | 162 new net::TestURLRequestContextGetter(mock_task_runner_.get())), |
163 pref_service_.get(), | |
157 base::Bind(&ParseJsonDelayed), | 164 base::Bind(&ParseJsonDelayed), |
158 /*is_stable_channel=*/true), | 165 /*is_stable_channel=*/true); |
159 test_lang_("en-US"), | 166 |
160 test_url_(gurl) { | 167 snippets_fetcher_->SetCallback( |
161 snippets_fetcher_.SetCallback( | |
162 base::Bind(&MockSnippetsAvailableCallback::WrappedRun, | 168 base::Bind(&MockSnippetsAvailableCallback::WrappedRun, |
163 base::Unretained(&mock_callback_))); | 169 base::Unretained(&mock_callback_))); |
164 snippets_fetcher_.SetTickClockForTesting( | 170 snippets_fetcher_->SetTickClockForTesting( |
165 mock_task_runner_->GetMockTickClock()); | 171 mock_task_runner_->GetMockTickClock()); |
166 test_hosts_.insert("www.somehost.com"); | 172 test_hosts_.insert("www.somehost.com"); |
167 // Increase initial time such that ticks are non-zero. | 173 // Increase initial time such that ticks are non-zero. |
168 mock_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(1234)); | 174 mock_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(1234)); |
169 } | 175 } |
170 | 176 |
171 NTPSnippetsFetcher& snippets_fetcher() { return snippets_fetcher_; } | 177 NTPSnippetsFetcher& snippets_fetcher() { return *snippets_fetcher_.get(); } |
Marc Treib
2016/07/22 13:52:52
I think the .get() isn't needed?
jkrcal
2016/07/25 10:05:38
Done. Thanks! I am still not used to the magic of
| |
172 MockSnippetsAvailableCallback& mock_callback() { return mock_callback_; } | 178 MockSnippetsAvailableCallback& mock_callback() { return mock_callback_; } |
173 void FastForwardUntilNoTasksRemain() { | 179 void FastForwardUntilNoTasksRemain() { |
174 mock_task_runner_->FastForwardUntilNoTasksRemain(); | 180 mock_task_runner_->FastForwardUntilNoTasksRemain(); |
175 } | 181 } |
176 const std::string& test_lang() const { return test_lang_; } | 182 const std::string& test_lang() const { return test_lang_; } |
177 const GURL& test_url() { return test_url_; } | 183 const GURL& test_url() { return test_url_; } |
178 const std::set<std::string>& test_hosts() const { return test_hosts_; } | 184 const std::set<std::string>& test_hosts() const { return test_hosts_; } |
179 base::HistogramTester& histogram_tester() { return histogram_tester_; } | 185 base::HistogramTester& histogram_tester() { return histogram_tester_; } |
180 | 186 |
181 void InitFakeURLFetcherFactory() { | 187 void InitFakeURLFetcherFactory() { |
(...skipping 17 matching lines...) Expand all Loading... | |
199 variations::testing::VariationParamsManager params_manager_; | 205 variations::testing::VariationParamsManager params_manager_; |
200 scoped_refptr<base::TestMockTimeTaskRunner> mock_task_runner_; | 206 scoped_refptr<base::TestMockTimeTaskRunner> mock_task_runner_; |
201 base::ThreadTaskRunnerHandle mock_task_runner_handle_; | 207 base::ThreadTaskRunnerHandle mock_task_runner_handle_; |
202 FailingFakeURLFetcherFactory failing_url_fetcher_factory_; | 208 FailingFakeURLFetcherFactory failing_url_fetcher_factory_; |
203 // Initialized lazily in SetFakeResponse(). | 209 // Initialized lazily in SetFakeResponse(). |
204 std::unique_ptr<net::FakeURLFetcherFactory> fake_url_fetcher_factory_; | 210 std::unique_ptr<net::FakeURLFetcherFactory> fake_url_fetcher_factory_; |
205 std::unique_ptr<TestSigninClient> signin_client_; | 211 std::unique_ptr<TestSigninClient> signin_client_; |
206 std::unique_ptr<AccountTrackerService> account_tracker_; | 212 std::unique_ptr<AccountTrackerService> account_tracker_; |
207 std::unique_ptr<SigninManagerBase> fake_signin_manager_; | 213 std::unique_ptr<SigninManagerBase> fake_signin_manager_; |
208 std::unique_ptr<OAuth2TokenService> fake_token_service_; | 214 std::unique_ptr<OAuth2TokenService> fake_token_service_; |
209 NTPSnippetsFetcher snippets_fetcher_; | 215 std::unique_ptr<NTPSnippetsFetcher> snippets_fetcher_; |
216 std::unique_ptr<TestingPrefServiceSimple> pref_service_; | |
210 MockSnippetsAvailableCallback mock_callback_; | 217 MockSnippetsAvailableCallback mock_callback_; |
211 const std::string test_lang_; | 218 const std::string test_lang_; |
212 const GURL test_url_; | 219 const GURL test_url_; |
213 std::set<std::string> test_hosts_; | 220 std::set<std::string> test_hosts_; |
214 base::HistogramTester histogram_tester_; | 221 base::HistogramTester histogram_tester_; |
215 | 222 |
216 DISALLOW_COPY_AND_ASSIGN(NTPSnippetsFetcherTest); | 223 DISALLOW_COPY_AND_ASSIGN(NTPSnippetsFetcherTest); |
217 }; | 224 }; |
218 | 225 |
219 class NTPSnippetsContentSuggestionsFetcherTest : public NTPSnippetsFetcherTest { | 226 class NTPSnippetsContentSuggestionsFetcherTest : public NTPSnippetsFetcherTest { |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
354 " \"ampUrl\" : \"http://localhost/amp\"," | 361 " \"ampUrl\" : \"http://localhost/amp\"," |
355 " \"corpusId\" : \"http://localhost/foobar\"," | 362 " \"corpusId\" : \"http://localhost/foobar\"," |
356 " \"publisherData\": { \"sourceName\" : \"Foo News\" }" | 363 " \"publisherData\": { \"sourceName\" : \"Foo News\" }" |
357 " }]" | 364 " }]" |
358 " }" | 365 " }" |
359 "}]}"; | 366 "}]}"; |
360 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, | 367 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, |
361 net::URLRequestStatus::SUCCESS); | 368 net::URLRequestStatus::SUCCESS); |
362 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(1))).Times(1); | 369 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(1))).Times(1); |
363 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 370 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
364 /*count=*/1); | 371 /*count=*/1, |
372 /*force_request=*/true); | |
365 FastForwardUntilNoTasksRemain(); | 373 FastForwardUntilNoTasksRemain(); |
366 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); | 374 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); |
367 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); | 375 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); |
368 EXPECT_THAT(histogram_tester().GetAllSamples( | 376 EXPECT_THAT(histogram_tester().GetAllSamples( |
369 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 377 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
370 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 378 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
371 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 379 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
372 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, | 380 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, |
373 /*count=*/1))); | 381 /*count=*/1))); |
374 } | 382 } |
375 | 383 |
376 TEST_F(NTPSnippetsContentSuggestionsFetcherTest, ShouldFetchSuccessfully) { | 384 TEST_F(NTPSnippetsContentSuggestionsFetcherTest, ShouldFetchSuccessfully) { |
377 const std::string kJsonStr = | 385 const std::string kJsonStr = |
378 "{\"snippet\" : [{" | 386 "{\"snippet\" : [{" |
379 " \"id\" : [\"http://localhost/foobar\"]," | 387 " \"id\" : [\"http://localhost/foobar\"]," |
380 " \"title\" : \"Foo Barred from Baz\"," | 388 " \"title\" : \"Foo Barred from Baz\"," |
381 " \"summaryText\" : \"...\"," | 389 " \"summaryText\" : \"...\"," |
382 " \"fullPageUrl\" : \"http://localhost/foobar\"," | 390 " \"fullPageUrl\" : \"http://localhost/foobar\"," |
383 " \"publishTime\" : \"2016-06-30T11:01:37.000Z\"," | 391 " \"publishTime\" : \"2016-06-30T11:01:37.000Z\"," |
384 " \"expirationTime\" : \"2016-07-01T11:01:37.000Z\"," | 392 " \"expirationTime\" : \"2016-07-01T11:01:37.000Z\"," |
385 " \"publisherName\" : \"Foo News\"," | 393 " \"publisherName\" : \"Foo News\"," |
386 " \"imageUrl\" : \"http://localhost/foobar.jpg\"," | 394 " \"imageUrl\" : \"http://localhost/foobar.jpg\"," |
387 " \"ampUrl\" : \"http://localhost/amp\"," | 395 " \"ampUrl\" : \"http://localhost/amp\"," |
388 " \"faviconUrl\" : \"http://localhost/favicon.ico\" " | 396 " \"faviconUrl\" : \"http://localhost/favicon.ico\" " |
389 "}]}"; | 397 "}]}"; |
390 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, | 398 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, |
391 net::URLRequestStatus::SUCCESS); | 399 net::URLRequestStatus::SUCCESS); |
392 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(1))).Times(1); | 400 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(1))).Times(1); |
393 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 401 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
394 /*count=*/1); | 402 /*count=*/1, |
403 /*force_request=*/true); | |
395 FastForwardUntilNoTasksRemain(); | 404 FastForwardUntilNoTasksRemain(); |
396 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); | 405 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); |
397 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); | 406 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); |
398 EXPECT_THAT(histogram_tester().GetAllSamples( | 407 EXPECT_THAT(histogram_tester().GetAllSamples( |
399 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 408 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
400 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 409 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
401 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 410 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
402 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, | 411 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, |
403 /*count=*/1))); | 412 /*count=*/1))); |
404 } | 413 } |
405 | 414 |
406 TEST_F(NTPSnippetsFetcherTest, ShouldFetchSuccessfullyEmptyList) { | 415 TEST_F(NTPSnippetsFetcherTest, ShouldFetchSuccessfullyEmptyList) { |
407 const std::string kJsonStr = "{\"recos\": []}"; | 416 const std::string kJsonStr = "{\"recos\": []}"; |
408 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, | 417 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, |
409 net::URLRequestStatus::SUCCESS); | 418 net::URLRequestStatus::SUCCESS); |
410 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(0))).Times(1); | 419 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(0))).Times(1); |
411 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 420 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
412 /*count=*/1); | 421 /*count=*/1, |
422 /*force_request=*/true); | |
413 FastForwardUntilNoTasksRemain(); | 423 FastForwardUntilNoTasksRemain(); |
414 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); | 424 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); |
415 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); | 425 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); |
416 EXPECT_THAT( | 426 EXPECT_THAT( |
417 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 427 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
418 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); | 428 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); |
419 EXPECT_THAT(histogram_tester().GetAllSamples( | 429 EXPECT_THAT(histogram_tester().GetAllSamples( |
420 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 430 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
421 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 431 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
422 } | 432 } |
423 | 433 |
424 TEST_F(NTPSnippetsFetcherHostRestrictedTest, ShouldReportEmptyHostsError) { | 434 TEST_F(NTPSnippetsFetcherHostRestrictedTest, ShouldReportEmptyHostsError) { |
425 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 435 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
426 snippets_fetcher().FetchSnippetsFromHosts(/*hosts=*/std::set<std::string>(), | 436 snippets_fetcher().FetchSnippetsFromHosts(/*hosts=*/std::set<std::string>(), |
427 /*language_code=*/"en-US", | 437 /*language_code=*/"en-US", |
428 /*count=*/1); | 438 /*count=*/1, |
439 /*force_request=*/true); | |
429 FastForwardUntilNoTasksRemain(); | 440 FastForwardUntilNoTasksRemain(); |
430 EXPECT_THAT(snippets_fetcher().last_status(), | 441 EXPECT_THAT(snippets_fetcher().last_status(), |
431 Eq("Cannot fetch for empty hosts list.")); | 442 Eq("Cannot fetch for empty hosts list.")); |
432 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); | 443 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); |
433 EXPECT_THAT( | 444 EXPECT_THAT( |
434 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 445 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
435 ElementsAre(base::Bucket(/*min=*/1, /*count=*/1))); | 446 ElementsAre(base::Bucket(/*min=*/1, /*count=*/1))); |
436 EXPECT_THAT(histogram_tester().GetAllSamples( | 447 EXPECT_THAT(histogram_tester().GetAllSamples( |
437 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 448 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
438 IsEmpty()); | 449 IsEmpty()); |
439 // This particular error gets triggered prior to JSON parsing and hence tests | 450 // This particular error gets triggered prior to JSON parsing and hence tests |
440 // observe no fetch latency. | 451 // observe no fetch latency. |
441 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 452 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
442 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); | 453 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); |
443 } | 454 } |
444 | 455 |
445 TEST_F(NTPSnippetsFetcherHostRestrictedTest, ShouldRestrictToHosts) { | 456 TEST_F(NTPSnippetsFetcherHostRestrictedTest, ShouldRestrictToHosts) { |
446 net::TestURLFetcherFactory test_url_fetcher_factory; | 457 net::TestURLFetcherFactory test_url_fetcher_factory; |
447 snippets_fetcher().FetchSnippetsFromHosts( | 458 snippets_fetcher().FetchSnippetsFromHosts( |
448 {"www.somehost1.com", "www.somehost2.com"}, test_lang(), /*count=*/17); | 459 {"www.somehost1.com", "www.somehost2.com"}, test_lang(), /*count=*/17, |
460 /*force_request=*/true); | |
449 net::TestURLFetcher* fetcher = test_url_fetcher_factory.GetFetcherByID(0); | 461 net::TestURLFetcher* fetcher = test_url_fetcher_factory.GetFetcherByID(0); |
450 ASSERT_THAT(fetcher, NotNull()); | 462 ASSERT_THAT(fetcher, NotNull()); |
451 std::unique_ptr<base::Value> value = | 463 std::unique_ptr<base::Value> value = |
452 base::JSONReader::Read(fetcher->upload_data()); | 464 base::JSONReader::Read(fetcher->upload_data()); |
453 ASSERT_TRUE(value) << " failed to parse JSON: " | 465 ASSERT_TRUE(value) << " failed to parse JSON: " |
454 << PrintToString(fetcher->upload_data()); | 466 << PrintToString(fetcher->upload_data()); |
455 const base::DictionaryValue* dict = nullptr; | 467 const base::DictionaryValue* dict = nullptr; |
456 ASSERT_TRUE(value->GetAsDictionary(&dict)); | 468 ASSERT_TRUE(value->GetAsDictionary(&dict)); |
457 const base::DictionaryValue* local_scoring_params = nullptr; | 469 const base::DictionaryValue* local_scoring_params = nullptr; |
458 ASSERT_TRUE(dict->GetDictionary("advanced_options.local_scoring_params", | 470 ASSERT_TRUE(dict->GetDictionary("advanced_options.local_scoring_params", |
(...skipping 10 matching lines...) Expand all Loading... | |
469 ASSERT_TRUE(content_selectors->GetDictionary(1, &content_selector)); | 481 ASSERT_TRUE(content_selectors->GetDictionary(1, &content_selector)); |
470 EXPECT_TRUE(content_selector->GetString("value", &content_selector_value)); | 482 EXPECT_TRUE(content_selector->GetString("value", &content_selector_value)); |
471 EXPECT_THAT(content_selector_value, Eq("www.somehost2.com")); | 483 EXPECT_THAT(content_selector_value, Eq("www.somehost2.com")); |
472 } | 484 } |
473 | 485 |
474 TEST_F(NTPSnippetsFetcherTest, ShouldReportUrlStatusError) { | 486 TEST_F(NTPSnippetsFetcherTest, ShouldReportUrlStatusError) { |
475 SetFakeResponse(/*data=*/std::string(), net::HTTP_NOT_FOUND, | 487 SetFakeResponse(/*data=*/std::string(), net::HTTP_NOT_FOUND, |
476 net::URLRequestStatus::FAILED); | 488 net::URLRequestStatus::FAILED); |
477 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 489 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
478 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 490 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
479 /*count=*/1); | 491 /*count=*/1, |
492 /*force_request=*/true); | |
480 FastForwardUntilNoTasksRemain(); | 493 FastForwardUntilNoTasksRemain(); |
481 EXPECT_THAT(snippets_fetcher().last_status(), | 494 EXPECT_THAT(snippets_fetcher().last_status(), |
482 Eq("URLRequestStatus error -2")); | 495 Eq("URLRequestStatus error -2")); |
483 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); | 496 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); |
484 EXPECT_THAT( | 497 EXPECT_THAT( |
485 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 498 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
486 ElementsAre(base::Bucket(/*min=*/2, /*count=*/1))); | 499 ElementsAre(base::Bucket(/*min=*/2, /*count=*/1))); |
487 EXPECT_THAT(histogram_tester().GetAllSamples( | 500 EXPECT_THAT(histogram_tester().GetAllSamples( |
488 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 501 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
489 ElementsAre(base::Bucket(/*min=*/-2, /*count=*/1))); | 502 ElementsAre(base::Bucket(/*min=*/-2, /*count=*/1))); |
490 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 503 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
491 Not(IsEmpty())); | 504 Not(IsEmpty())); |
492 } | 505 } |
493 | 506 |
494 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpError) { | 507 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpError) { |
495 SetFakeResponse(/*data=*/std::string(), net::HTTP_NOT_FOUND, | 508 SetFakeResponse(/*data=*/std::string(), net::HTTP_NOT_FOUND, |
496 net::URLRequestStatus::SUCCESS); | 509 net::URLRequestStatus::SUCCESS); |
497 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 510 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
498 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 511 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
499 /*count=*/1); | 512 /*count=*/1, |
513 /*force_request=*/true); | |
500 FastForwardUntilNoTasksRemain(); | 514 FastForwardUntilNoTasksRemain(); |
501 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); | 515 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); |
502 EXPECT_THAT( | 516 EXPECT_THAT( |
503 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 517 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
504 ElementsAre(base::Bucket(/*min=*/3, /*count=*/1))); | 518 ElementsAre(base::Bucket(/*min=*/3, /*count=*/1))); |
505 EXPECT_THAT(histogram_tester().GetAllSamples( | 519 EXPECT_THAT(histogram_tester().GetAllSamples( |
506 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 520 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
507 ElementsAre(base::Bucket(/*min=*/404, /*count=*/1))); | 521 ElementsAre(base::Bucket(/*min=*/404, /*count=*/1))); |
508 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 522 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
509 Not(IsEmpty())); | 523 Not(IsEmpty())); |
510 } | 524 } |
511 | 525 |
512 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonError) { | 526 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonError) { |
513 const std::string kInvalidJsonStr = "{ \"recos\": []"; | 527 const std::string kInvalidJsonStr = "{ \"recos\": []"; |
514 SetFakeResponse(/*data=*/kInvalidJsonStr, net::HTTP_OK, | 528 SetFakeResponse(/*data=*/kInvalidJsonStr, net::HTTP_OK, |
515 net::URLRequestStatus::SUCCESS); | 529 net::URLRequestStatus::SUCCESS); |
516 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 530 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
517 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 531 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
518 /*count=*/1); | 532 /*count=*/1, |
533 /*force_request=*/true); | |
519 FastForwardUntilNoTasksRemain(); | 534 FastForwardUntilNoTasksRemain(); |
520 EXPECT_THAT(snippets_fetcher().last_status(), | 535 EXPECT_THAT(snippets_fetcher().last_status(), |
521 StartsWith("Received invalid JSON (error ")); | 536 StartsWith("Received invalid JSON (error ")); |
522 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kInvalidJsonStr)); | 537 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kInvalidJsonStr)); |
523 EXPECT_THAT( | 538 EXPECT_THAT( |
524 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 539 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
525 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1))); | 540 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1))); |
526 EXPECT_THAT(histogram_tester().GetAllSamples( | 541 EXPECT_THAT(histogram_tester().GetAllSamples( |
527 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 542 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
528 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 543 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
529 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 544 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
530 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, | 545 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, |
531 /*count=*/1))); | 546 /*count=*/1))); |
532 } | 547 } |
533 | 548 |
534 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonErrorForEmptyResponse) { | 549 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonErrorForEmptyResponse) { |
535 SetFakeResponse(/*data=*/std::string(), net::HTTP_OK, | 550 SetFakeResponse(/*data=*/std::string(), net::HTTP_OK, |
536 net::URLRequestStatus::SUCCESS); | 551 net::URLRequestStatus::SUCCESS); |
537 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 552 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
538 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 553 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
539 /*count=*/1); | 554 /*count=*/1, |
555 /*force_request=*/true); | |
540 FastForwardUntilNoTasksRemain(); | 556 FastForwardUntilNoTasksRemain(); |
541 EXPECT_THAT(snippets_fetcher().last_json(), std::string()); | 557 EXPECT_THAT(snippets_fetcher().last_json(), std::string()); |
542 EXPECT_THAT( | 558 EXPECT_THAT( |
543 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 559 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
544 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1))); | 560 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1))); |
545 EXPECT_THAT(histogram_tester().GetAllSamples( | 561 EXPECT_THAT(histogram_tester().GetAllSamples( |
546 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 562 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
547 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 563 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
548 } | 564 } |
549 | 565 |
550 TEST_F(NTPSnippetsFetcherTest, ShouldReportInvalidListError) { | 566 TEST_F(NTPSnippetsFetcherTest, ShouldReportInvalidListError) { |
551 const std::string kJsonStr = | 567 const std::string kJsonStr = |
552 "{\"recos\": [{ \"contentInfo\": { \"foo\" : \"bar\" }}]}"; | 568 "{\"recos\": [{ \"contentInfo\": { \"foo\" : \"bar\" }}]}"; |
553 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, | 569 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, |
554 net::URLRequestStatus::SUCCESS); | 570 net::URLRequestStatus::SUCCESS); |
555 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 571 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
556 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 572 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
557 /*count=*/1); | 573 /*count=*/1, |
574 /*force_request=*/true); | |
558 FastForwardUntilNoTasksRemain(); | 575 FastForwardUntilNoTasksRemain(); |
559 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); | 576 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); |
560 EXPECT_THAT( | 577 EXPECT_THAT( |
561 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 578 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
562 ElementsAre(base::Bucket(/*min=*/5, /*count=*/1))); | 579 ElementsAre(base::Bucket(/*min=*/5, /*count=*/1))); |
563 EXPECT_THAT(histogram_tester().GetAllSamples( | 580 EXPECT_THAT(histogram_tester().GetAllSamples( |
564 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 581 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
565 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 582 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
566 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 583 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
567 Not(IsEmpty())); | 584 Not(IsEmpty())); |
568 } | 585 } |
569 | 586 |
570 // This test actually verifies that the test setup itself is sane, to prevent | 587 // This test actually verifies that the test setup itself is sane, to prevent |
571 // hard-to-reproduce test failures. | 588 // hard-to-reproduce test failures. |
572 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpErrorForMissingBakedResponse) { | 589 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpErrorForMissingBakedResponse) { |
573 InitFakeURLFetcherFactory(); | 590 InitFakeURLFetcherFactory(); |
574 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 591 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
575 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 592 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
576 /*count=*/1); | 593 /*count=*/1, |
594 /*force_request=*/true); | |
577 FastForwardUntilNoTasksRemain(); | 595 FastForwardUntilNoTasksRemain(); |
578 } | 596 } |
579 | 597 |
580 TEST_F(NTPSnippetsFetcherTest, ShouldCancelOngoingFetch) { | 598 TEST_F(NTPSnippetsFetcherTest, ShouldCancelOngoingFetch) { |
581 const std::string kJsonStr = "{ \"recos\": [] }"; | 599 const std::string kJsonStr = "{ \"recos\": [] }"; |
582 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, | 600 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, |
583 net::URLRequestStatus::SUCCESS); | 601 net::URLRequestStatus::SUCCESS); |
584 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(0))).Times(1); | 602 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(0))).Times(1); |
585 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 603 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
586 /*count=*/1); | 604 /*count=*/1, |
605 /*force_request=*/true); | |
587 // Second call to FetchSnippetsFromHosts() overrides/cancels the previous. | 606 // Second call to FetchSnippetsFromHosts() overrides/cancels the previous. |
588 // Callback is expected to be called once. | 607 // Callback is expected to be called once. |
589 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 608 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
590 /*count=*/1); | 609 /*count=*/1, |
610 /*force_request=*/true); | |
591 FastForwardUntilNoTasksRemain(); | 611 FastForwardUntilNoTasksRemain(); |
592 EXPECT_THAT( | 612 EXPECT_THAT( |
593 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 613 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
594 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); | 614 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); |
595 EXPECT_THAT(histogram_tester().GetAllSamples( | 615 EXPECT_THAT(histogram_tester().GetAllSamples( |
596 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 616 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
597 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 617 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
598 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 618 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
599 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, | 619 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, |
600 /*count=*/1))); | 620 /*count=*/1))); |
601 } | 621 } |
602 | 622 |
603 ::std::ostream& operator<<( | 623 ::std::ostream& operator<<( |
604 ::std::ostream& os, | 624 ::std::ostream& os, |
605 const NTPSnippetsFetcher::OptionalSnippets& snippets) { | 625 const NTPSnippetsFetcher::OptionalSnippets& snippets) { |
606 if (snippets) { | 626 if (snippets) { |
607 // Matchers above aren't any more precise than this, so this is sufficient | 627 // Matchers above aren't any more precise than this, so this is sufficient |
608 // for test-failure diagnostics. | 628 // for test-failure diagnostics. |
609 return os << "list with " << snippets->size() << " elements"; | 629 return os << "list with " << snippets->size() << " elements"; |
610 } else { | 630 } else { |
611 return os << "null"; | 631 return os << "null"; |
612 } | 632 } |
613 } | 633 } |
614 | 634 |
615 } // namespace ntp_snippets | 635 } // namespace ntp_snippets |
OLD | NEW |