Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(717)

Side by Side Diff: components/ntp_snippets/remote/ntp_snippets_fetcher_unittest.cc

Issue 2473483006: Adds a Fetch() method to the ContentSuggestionService which asks any provider to provide more conte… (Closed)
Patch Set: comments by Markus. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/remote/ntp_snippets_fetcher.h" 5 #include "components/ntp_snippets/remote/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"
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 UserClassifier::RegisterProfilePrefs(pref_service_->registry()); 166 UserClassifier::RegisterProfilePrefs(pref_service_->registry());
167 user_classifier_ = base::MakeUnique<UserClassifier>(pref_service_.get()); 167 user_classifier_ = base::MakeUnique<UserClassifier>(pref_service_.get());
168 168
169 snippets_fetcher_ = base::MakeUnique<NTPSnippetsFetcher>( 169 snippets_fetcher_ = base::MakeUnique<NTPSnippetsFetcher>(
170 fake_signin_manager_.get(), fake_token_service_.get(), 170 fake_signin_manager_.get(), fake_token_service_.get(),
171 scoped_refptr<net::TestURLRequestContextGetter>( 171 scoped_refptr<net::TestURLRequestContextGetter>(
172 new net::TestURLRequestContextGetter(mock_task_runner_.get())), 172 new net::TestURLRequestContextGetter(mock_task_runner_.get())),
173 pref_service_.get(), &category_factory_, nullptr, 173 pref_service_.get(), &category_factory_, nullptr,
174 base::Bind(&ParseJsonDelayed), kAPIKey, user_classifier_.get()); 174 base::Bind(&ParseJsonDelayed), kAPIKey, user_classifier_.get());
175 175
176 snippets_fetcher_->SetCallback(
177 base::Bind(&MockSnippetsAvailableCallback::WrappedRun,
178 base::Unretained(&mock_callback_)));
179 snippets_fetcher_->SetTickClockForTesting( 176 snippets_fetcher_->SetTickClockForTesting(
180 mock_task_runner_->GetMockTickClock()); 177 mock_task_runner_->GetMockTickClock());
181 // Increase initial time such that ticks are non-zero. 178 // Increase initial time such that ticks are non-zero.
182 mock_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(1234)); 179 mock_task_runner_->FastForwardBy(base::TimeDelta::FromMilliseconds(1234));
183 } 180 }
184 181
182 NTPSnippetsFetcher::SnippetsAvailableCallback ToSnippetsAvailableCallback(
183 MockSnippetsAvailableCallback* callback) {
184 return base::BindOnce(&MockSnippetsAvailableCallback::WrappedRun,
185 base::Unretained(callback));
186 }
187
185 NTPSnippetsFetcher& snippets_fetcher() { return *snippets_fetcher_; } 188 NTPSnippetsFetcher& snippets_fetcher() { return *snippets_fetcher_; }
186 MockSnippetsAvailableCallback& mock_callback() { return mock_callback_; } 189 MockSnippetsAvailableCallback& mock_callback() { return mock_callback_; }
187 void FastForwardUntilNoTasksRemain() { 190 void FastForwardUntilNoTasksRemain() {
188 mock_task_runner_->FastForwardUntilNoTasksRemain(); 191 mock_task_runner_->FastForwardUntilNoTasksRemain();
189 } 192 }
190 base::HistogramTester& histogram_tester() { return histogram_tester_; } 193 base::HistogramTester& histogram_tester() { return histogram_tester_; }
191 194
192 NTPSnippetsFetcher::Params test_params() { 195 NTPSnippetsFetcher::Params test_params() {
193 NTPSnippetsFetcher::Params result; 196 NTPSnippetsFetcher::Params result;
194 result.count_to_fetch = 1; 197 result.count_to_fetch = 1;
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 " \"sourceCorpusInfo\" : [{" 504 " \"sourceCorpusInfo\" : [{"
502 " \"ampUrl\" : \"http://localhost/amp\"," 505 " \"ampUrl\" : \"http://localhost/amp\","
503 " \"corpusId\" : \"http://localhost/foobar\"," 506 " \"corpusId\" : \"http://localhost/foobar\","
504 " \"publisherData\": { \"sourceName\" : \"Foo News\" }" 507 " \"publisherData\": { \"sourceName\" : \"Foo News\" }"
505 " }]" 508 " }]"
506 " }" 509 " }"
507 "}]}"; 510 "}]}";
508 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK, 511 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK,
509 net::URLRequestStatus::SUCCESS); 512 net::URLRequestStatus::SUCCESS);
510 EXPECT_CALL(mock_callback(), Run(IsSingleArticle("http://localhost/foobar"))); 513 EXPECT_CALL(mock_callback(), Run(IsSingleArticle("http://localhost/foobar")));
511 snippets_fetcher().FetchSnippets(test_params()); 514 snippets_fetcher().FetchSnippets(
515 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
512 FastForwardUntilNoTasksRemain(); 516 FastForwardUntilNoTasksRemain();
513 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); 517 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK"));
514 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); 518 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr));
515 EXPECT_THAT(histogram_tester().GetAllSamples( 519 EXPECT_THAT(histogram_tester().GetAllSamples(
516 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), 520 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
517 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); 521 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1)));
518 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), 522 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"),
519 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, 523 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs,
520 /*count=*/1))); 524 /*count=*/1)));
521 } 525 }
(...skipping 12 matching lines...) Expand all
534 " \"expirationTime\" : \"2016-07-01T11:01:37.000Z\"," 538 " \"expirationTime\" : \"2016-07-01T11:01:37.000Z\","
535 " \"attribution\" : \"Foo News\"," 539 " \"attribution\" : \"Foo News\","
536 " \"imageUrl\" : \"http://localhost/foobar.jpg\"," 540 " \"imageUrl\" : \"http://localhost/foobar.jpg\","
537 " \"ampUrl\" : \"http://localhost/amp\"," 541 " \"ampUrl\" : \"http://localhost/amp\","
538 " \"faviconUrl\" : \"http://localhost/favicon.ico\" " 542 " \"faviconUrl\" : \"http://localhost/favicon.ico\" "
539 " }]" 543 " }]"
540 "}]}"; 544 "}]}";
541 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK, 545 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK,
542 net::URLRequestStatus::SUCCESS); 546 net::URLRequestStatus::SUCCESS);
543 EXPECT_CALL(mock_callback(), Run(IsSingleArticle("http://localhost/foobar"))); 547 EXPECT_CALL(mock_callback(), Run(IsSingleArticle("http://localhost/foobar")));
544 snippets_fetcher().FetchSnippets(test_params()); 548 snippets_fetcher().FetchSnippets(
549 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
545 FastForwardUntilNoTasksRemain(); 550 FastForwardUntilNoTasksRemain();
546 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); 551 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK"));
547 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); 552 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr));
548 EXPECT_THAT(histogram_tester().GetAllSamples( 553 EXPECT_THAT(histogram_tester().GetAllSamples(
549 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), 554 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
550 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); 555 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1)));
551 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), 556 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"),
552 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, 557 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs,
553 /*count=*/1))); 558 /*count=*/1)));
554 } 559 }
555 560
556 TEST_F(NTPSnippetsContentSuggestionsFetcherTest, EmptyCategoryIsOK) { 561 TEST_F(NTPSnippetsContentSuggestionsFetcherTest, EmptyCategoryIsOK) {
557 const std::string kJsonStr = 562 const std::string kJsonStr =
558 "{\"categories\" : [{" 563 "{\"categories\" : [{"
559 " \"id\": 1," 564 " \"id\": 1,"
560 " \"localizedTitle\": \"Articles for You\"" 565 " \"localizedTitle\": \"Articles for You\""
561 "}]}"; 566 "}]}";
562 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK, 567 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK,
563 net::URLRequestStatus::SUCCESS); 568 net::URLRequestStatus::SUCCESS);
564 EXPECT_CALL(mock_callback(), Run(IsEmptyArticleList())); 569 EXPECT_CALL(mock_callback(), Run(IsEmptyArticleList()));
565 snippets_fetcher().FetchSnippets(test_params()); 570 snippets_fetcher().FetchSnippets(
571 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
566 FastForwardUntilNoTasksRemain(); 572 FastForwardUntilNoTasksRemain();
567 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); 573 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK"));
568 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); 574 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr));
569 EXPECT_THAT(histogram_tester().GetAllSamples( 575 EXPECT_THAT(histogram_tester().GetAllSamples(
570 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), 576 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
571 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); 577 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1)));
572 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), 578 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"),
573 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, 579 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs,
574 /*count=*/1))); 580 /*count=*/1)));
575 } 581 }
(...skipping 29 matching lines...) Expand all
605 " \"imageUrl\" : \"http://localhost/foo2.jpg\"," 611 " \"imageUrl\" : \"http://localhost/foo2.jpg\","
606 " \"ampUrl\" : \"http://localhost/amp\"," 612 " \"ampUrl\" : \"http://localhost/amp\","
607 " \"faviconUrl\" : \"http://localhost/favicon.ico\" " 613 " \"faviconUrl\" : \"http://localhost/favicon.ico\" "
608 " }]" 614 " }]"
609 "}]}"; 615 "}]}";
610 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK, 616 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK,
611 net::URLRequestStatus::SUCCESS); 617 net::URLRequestStatus::SUCCESS);
612 NTPSnippetsFetcher::OptionalFetchedCategories fetched_categories; 618 NTPSnippetsFetcher::OptionalFetchedCategories fetched_categories;
613 EXPECT_CALL(mock_callback(), Run(_)) 619 EXPECT_CALL(mock_callback(), Run(_))
614 .WillOnce(WithArg<0>(MovePointeeTo(&fetched_categories))); 620 .WillOnce(WithArg<0>(MovePointeeTo(&fetched_categories)));
615 snippets_fetcher().FetchSnippets(test_params()); 621 snippets_fetcher().FetchSnippets(
622 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
616 FastForwardUntilNoTasksRemain(); 623 FastForwardUntilNoTasksRemain();
617 624
618 ASSERT_TRUE(fetched_categories); 625 ASSERT_TRUE(fetched_categories);
619 ASSERT_THAT(fetched_categories->size(), Eq(2u)); 626 ASSERT_THAT(fetched_categories->size(), Eq(2u));
620 for (const auto& category : *fetched_categories) { 627 for (const auto& category : *fetched_categories) {
621 const auto& articles = category.snippets; 628 const auto& articles = category.snippets;
622 switch (category.category.id()) { 629 switch (category.category.id()) {
623 case static_cast<int>(KnownCategories::ARTICLES): 630 case static_cast<int>(KnownCategories::ARTICLES):
624 ASSERT_THAT(articles.size(), Eq(1u)); 631 ASSERT_THAT(articles.size(), Eq(1u));
625 EXPECT_THAT(articles[0]->best_source().url.spec(), 632 EXPECT_THAT(articles[0]->best_source().url.spec(),
(...skipping 12 matching lines...) Expand all
638 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); 645 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK"));
639 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); 646 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr));
640 EXPECT_THAT(histogram_tester().GetAllSamples( 647 EXPECT_THAT(histogram_tester().GetAllSamples(
641 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), 648 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
642 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); 649 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1)));
643 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), 650 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"),
644 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, 651 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs,
645 /*count=*/1))); 652 /*count=*/1)));
646 } 653 }
647 654
655 TEST_F(NTPSnippetsContentSuggestionsFetcherTest, ExclusiveCategoryOnly) {
656 const std::string kJsonStr =
657 "{\"categories\" : [{"
658 " \"id\": 1,"
659 " \"localizedTitle\": \"Articles for You\","
660 " \"suggestions\" : [{"
661 " \"ids\" : [\"http://localhost/foobar\"],"
662 " \"title\" : \"Foo Barred from Baz\","
663 " \"snippet\" : \"...\","
664 " \"fullPageUrl\" : \"http://localhost/foobar\","
665 " \"creationTime\" : \"2016-06-30T11:01:37.000Z\","
666 " \"expirationTime\" : \"2016-07-01T11:01:37.000Z\","
667 " \"attribution\" : \"Foo News\","
668 " \"imageUrl\" : \"http://localhost/foobar.jpg\","
669 " \"ampUrl\" : \"http://localhost/amp\","
670 " \"faviconUrl\" : \"http://localhost/favicon.ico\" "
671 " }]"
672 "}, {"
673 " \"id\": 2,"
674 " \"localizedTitle\": \"Articles for Me\","
675 " \"suggestions\" : [{"
676 " \"ids\" : [\"http://localhost/foo2\"],"
677 " \"title\" : \"Foo Barred from Baz\","
678 " \"snippet\" : \"...\","
679 " \"fullPageUrl\" : \"http://localhost/foo2\","
680 " \"creationTime\" : \"2016-06-30T11:01:37.000Z\","
681 " \"expirationTime\" : \"2016-07-01T11:01:37.000Z\","
682 " \"attribution\" : \"Foo News\","
683 " \"imageUrl\" : \"http://localhost/foo2.jpg\","
684 " \"ampUrl\" : \"http://localhost/amp\","
685 " \"faviconUrl\" : \"http://localhost/favicon.ico\" "
686 " }]"
687 "}]}";
688 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK,
689 net::URLRequestStatus::SUCCESS);
690 NTPSnippetsFetcher::OptionalFetchedCategories fetched_categories;
691 EXPECT_CALL(mock_callback(), Run(_))
692 .WillOnce(WithArg<0>(MovePointeeTo(&fetched_categories)));
693
694 NTPSnippetsFetcher::Params params = test_params();
695 params.exclusive_category = base::Optional<Category>(
696 CategoryFactory().FromKnownCategory(KnownCategories::ARTICLES));
697 snippets_fetcher().FetchSnippets(
698 params, ToSnippetsAvailableCallback(&mock_callback()));
699 FastForwardUntilNoTasksRemain();
700
701 ASSERT_TRUE(fetched_categories);
702 ASSERT_THAT(fetched_categories->size(), Eq(1u));
703 const auto& category = (*fetched_categories)[0];
704 EXPECT_THAT(category.category.id(),
705 Eq(static_cast<int>(KnownCategories::ARTICLES)));
706 ASSERT_THAT(category.snippets.size(), Eq(1u));
707 EXPECT_THAT(category.snippets[0]->best_source().url.spec(),
708 Eq("http://localhost/foobar"));
709 }
710
648 TEST_F(NTPSnippetsFetcherTest, ShouldFetchSuccessfullyEmptyList) { 711 TEST_F(NTPSnippetsFetcherTest, ShouldFetchSuccessfullyEmptyList) {
649 const std::string kJsonStr = "{\"recos\": []}"; 712 const std::string kJsonStr = "{\"recos\": []}";
650 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK, 713 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK,
651 net::URLRequestStatus::SUCCESS); 714 net::URLRequestStatus::SUCCESS);
652 EXPECT_CALL(mock_callback(), Run(IsEmptyArticleList())); 715 EXPECT_CALL(mock_callback(), Run(IsEmptyArticleList()));
653 snippets_fetcher().FetchSnippets(test_params()); 716 snippets_fetcher().FetchSnippets(
717 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
654 FastForwardUntilNoTasksRemain(); 718 FastForwardUntilNoTasksRemain();
655 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); 719 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK"));
656 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); 720 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr));
657 EXPECT_THAT( 721 EXPECT_THAT(
658 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), 722 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"),
659 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); 723 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1)));
660 EXPECT_THAT(histogram_tester().GetAllSamples( 724 EXPECT_THAT(histogram_tester().GetAllSamples(
661 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), 725 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
662 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); 726 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1)));
663 } 727 }
664 728
665 TEST_F(NTPSnippetsFetcherTest, ShouldRestrictToHosts) { 729 TEST_F(NTPSnippetsFetcherTest, ShouldRestrictToHosts) {
666 net::TestURLFetcherFactory test_url_fetcher_factory; 730 net::TestURLFetcherFactory test_url_fetcher_factory;
667 NTPSnippetsFetcher::Params params = test_params(); 731 NTPSnippetsFetcher::Params params = test_params();
668 params.hosts = {"www.somehost1.com", "www.somehost2.com"}; 732 params.hosts = {"www.somehost1.com", "www.somehost2.com"};
669 params.count_to_fetch = 17; 733 params.count_to_fetch = 17;
670 snippets_fetcher().FetchSnippets(params); 734 snippets_fetcher().FetchSnippets(
735 params, ToSnippetsAvailableCallback(&mock_callback()));
671 net::TestURLFetcher* fetcher = test_url_fetcher_factory.GetFetcherByID(0); 736 net::TestURLFetcher* fetcher = test_url_fetcher_factory.GetFetcherByID(0);
672 ASSERT_THAT(fetcher, NotNull()); 737 ASSERT_THAT(fetcher, NotNull());
673 std::unique_ptr<base::Value> value = 738 std::unique_ptr<base::Value> value =
674 base::JSONReader::Read(fetcher->upload_data()); 739 base::JSONReader::Read(fetcher->upload_data());
675 ASSERT_TRUE(value) << " failed to parse JSON: " 740 ASSERT_TRUE(value) << " failed to parse JSON: "
676 << PrintToString(fetcher->upload_data()); 741 << PrintToString(fetcher->upload_data());
677 const base::DictionaryValue* dict = nullptr; 742 const base::DictionaryValue* dict = nullptr;
678 ASSERT_TRUE(value->GetAsDictionary(&dict)); 743 ASSERT_TRUE(value->GetAsDictionary(&dict));
679 const base::DictionaryValue* local_scoring_params = nullptr; 744 const base::DictionaryValue* local_scoring_params = nullptr;
680 ASSERT_TRUE(dict->GetDictionary("advanced_options.local_scoring_params", 745 ASSERT_TRUE(dict->GetDictionary("advanced_options.local_scoring_params",
681 &local_scoring_params)); 746 &local_scoring_params));
682 const base::ListValue* content_selectors = nullptr; 747 const base::ListValue* content_selectors = nullptr;
683 ASSERT_TRUE( 748 ASSERT_TRUE(
684 local_scoring_params->GetList("content_selectors", &content_selectors)); 749 local_scoring_params->GetList("content_selectors", &content_selectors));
685 ASSERT_THAT(content_selectors->GetSize(), Eq(static_cast<size_t>(2))); 750 ASSERT_THAT(content_selectors->GetSize(), Eq(static_cast<size_t>(2)));
686 const base::DictionaryValue* content_selector = nullptr; 751 const base::DictionaryValue* content_selector = nullptr;
687 ASSERT_TRUE(content_selectors->GetDictionary(0, &content_selector)); 752 ASSERT_TRUE(content_selectors->GetDictionary(0, &content_selector));
688 std::string content_selector_value; 753 std::string content_selector_value;
689 EXPECT_TRUE(content_selector->GetString("value", &content_selector_value)); 754 EXPECT_TRUE(content_selector->GetString("value", &content_selector_value));
690 EXPECT_THAT(content_selector_value, Eq("www.somehost1.com")); 755 EXPECT_THAT(content_selector_value, Eq("www.somehost1.com"));
691 ASSERT_TRUE(content_selectors->GetDictionary(1, &content_selector)); 756 ASSERT_TRUE(content_selectors->GetDictionary(1, &content_selector));
692 EXPECT_TRUE(content_selector->GetString("value", &content_selector_value)); 757 EXPECT_TRUE(content_selector->GetString("value", &content_selector_value));
693 EXPECT_THAT(content_selector_value, Eq("www.somehost2.com")); 758 EXPECT_THAT(content_selector_value, Eq("www.somehost2.com"));
694 } 759 }
695 760
696 TEST_F(NTPSnippetsFetcherTest, ShouldReportUrlStatusError) { 761 TEST_F(NTPSnippetsFetcherTest, ShouldReportUrlStatusError) {
697 SetFakeResponse(/*response_data=*/std::string(), net::HTTP_NOT_FOUND, 762 SetFakeResponse(/*response_data=*/std::string(), net::HTTP_NOT_FOUND,
698 net::URLRequestStatus::FAILED); 763 net::URLRequestStatus::FAILED);
699 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); 764 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1);
700 snippets_fetcher().FetchSnippets(test_params()); 765 snippets_fetcher().FetchSnippets(
766 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
701 FastForwardUntilNoTasksRemain(); 767 FastForwardUntilNoTasksRemain();
702 EXPECT_THAT(snippets_fetcher().last_status(), 768 EXPECT_THAT(snippets_fetcher().last_status(),
703 Eq("URLRequestStatus error -2")); 769 Eq("URLRequestStatus error -2"));
704 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); 770 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty());
705 EXPECT_THAT( 771 EXPECT_THAT(
706 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), 772 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"),
707 ElementsAre(base::Bucket(/*min=*/2, /*count=*/1))); 773 ElementsAre(base::Bucket(/*min=*/2, /*count=*/1)));
708 EXPECT_THAT(histogram_tester().GetAllSamples( 774 EXPECT_THAT(histogram_tester().GetAllSamples(
709 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), 775 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
710 ElementsAre(base::Bucket(/*min=*/-2, /*count=*/1))); 776 ElementsAre(base::Bucket(/*min=*/-2, /*count=*/1)));
711 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), 777 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"),
712 Not(IsEmpty())); 778 Not(IsEmpty()));
713 } 779 }
714 780
715 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpError) { 781 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpError) {
716 SetFakeResponse(/*response_data=*/std::string(), net::HTTP_NOT_FOUND, 782 SetFakeResponse(/*response_data=*/std::string(), net::HTTP_NOT_FOUND,
717 net::URLRequestStatus::SUCCESS); 783 net::URLRequestStatus::SUCCESS);
718 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); 784 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1);
719 snippets_fetcher().FetchSnippets(test_params()); 785 snippets_fetcher().FetchSnippets(
786 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
720 FastForwardUntilNoTasksRemain(); 787 FastForwardUntilNoTasksRemain();
721 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); 788 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty());
722 EXPECT_THAT( 789 EXPECT_THAT(
723 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), 790 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"),
724 ElementsAre(base::Bucket(/*min=*/3, /*count=*/1))); 791 ElementsAre(base::Bucket(/*min=*/3, /*count=*/1)));
725 EXPECT_THAT(histogram_tester().GetAllSamples( 792 EXPECT_THAT(histogram_tester().GetAllSamples(
726 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), 793 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
727 ElementsAre(base::Bucket(/*min=*/404, /*count=*/1))); 794 ElementsAre(base::Bucket(/*min=*/404, /*count=*/1)));
728 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), 795 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"),
729 Not(IsEmpty())); 796 Not(IsEmpty()));
730 } 797 }
731 798
732 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonError) { 799 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonError) {
733 const std::string kInvalidJsonStr = "{ \"recos\": []"; 800 const std::string kInvalidJsonStr = "{ \"recos\": []";
734 SetFakeResponse(/*response_data=*/kInvalidJsonStr, net::HTTP_OK, 801 SetFakeResponse(/*response_data=*/kInvalidJsonStr, net::HTTP_OK,
735 net::URLRequestStatus::SUCCESS); 802 net::URLRequestStatus::SUCCESS);
736 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); 803 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1);
737 snippets_fetcher().FetchSnippets(test_params()); 804 snippets_fetcher().FetchSnippets(
805 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
738 FastForwardUntilNoTasksRemain(); 806 FastForwardUntilNoTasksRemain();
739 EXPECT_THAT(snippets_fetcher().last_status(), 807 EXPECT_THAT(snippets_fetcher().last_status(),
740 StartsWith("Received invalid JSON (error ")); 808 StartsWith("Received invalid JSON (error "));
741 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kInvalidJsonStr)); 809 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kInvalidJsonStr));
742 EXPECT_THAT( 810 EXPECT_THAT(
743 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), 811 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"),
744 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1))); 812 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1)));
745 EXPECT_THAT(histogram_tester().GetAllSamples( 813 EXPECT_THAT(histogram_tester().GetAllSamples(
746 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), 814 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
747 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); 815 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1)));
748 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), 816 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"),
749 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, 817 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs,
750 /*count=*/1))); 818 /*count=*/1)));
751 } 819 }
752 820
753 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonErrorForEmptyResponse) { 821 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonErrorForEmptyResponse) {
754 SetFakeResponse(/*response_data=*/std::string(), net::HTTP_OK, 822 SetFakeResponse(/*response_data=*/std::string(), net::HTTP_OK,
755 net::URLRequestStatus::SUCCESS); 823 net::URLRequestStatus::SUCCESS);
756 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); 824 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1);
757 snippets_fetcher().FetchSnippets(test_params()); 825 snippets_fetcher().FetchSnippets(
826 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
758 FastForwardUntilNoTasksRemain(); 827 FastForwardUntilNoTasksRemain();
759 EXPECT_THAT(snippets_fetcher().last_json(), std::string()); 828 EXPECT_THAT(snippets_fetcher().last_json(), std::string());
760 EXPECT_THAT( 829 EXPECT_THAT(
761 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), 830 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"),
762 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1))); 831 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1)));
763 EXPECT_THAT(histogram_tester().GetAllSamples( 832 EXPECT_THAT(histogram_tester().GetAllSamples(
764 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), 833 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
765 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); 834 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1)));
766 } 835 }
767 836
768 TEST_F(NTPSnippetsFetcherTest, ShouldReportInvalidListError) { 837 TEST_F(NTPSnippetsFetcherTest, ShouldReportInvalidListError) {
769 const std::string kJsonStr = 838 const std::string kJsonStr =
770 "{\"recos\": [{ \"contentInfo\": { \"foo\" : \"bar\" }}]}"; 839 "{\"recos\": [{ \"contentInfo\": { \"foo\" : \"bar\" }}]}";
771 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK, 840 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK,
772 net::URLRequestStatus::SUCCESS); 841 net::URLRequestStatus::SUCCESS);
773 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); 842 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1);
774 snippets_fetcher().FetchSnippets(test_params()); 843 snippets_fetcher().FetchSnippets(
844 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
775 FastForwardUntilNoTasksRemain(); 845 FastForwardUntilNoTasksRemain();
776 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); 846 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr));
777 EXPECT_THAT( 847 EXPECT_THAT(
778 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), 848 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"),
779 ElementsAre(base::Bucket(/*min=*/5, /*count=*/1))); 849 ElementsAre(base::Bucket(/*min=*/5, /*count=*/1)));
780 EXPECT_THAT(histogram_tester().GetAllSamples( 850 EXPECT_THAT(histogram_tester().GetAllSamples(
781 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), 851 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
782 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); 852 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1)));
783 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), 853 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"),
784 Not(IsEmpty())); 854 Not(IsEmpty()));
785 } 855 }
786 856
787 // This test actually verifies that the test setup itself is sane, to prevent 857 // This test actually verifies that the test setup itself is sane, to prevent
788 // hard-to-reproduce test failures. 858 // hard-to-reproduce test failures.
789 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpErrorForMissingBakedResponse) { 859 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpErrorForMissingBakedResponse) {
790 InitFakeURLFetcherFactory(); 860 InitFakeURLFetcherFactory();
791 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); 861 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1);
792 snippets_fetcher().FetchSnippets(test_params()); 862 snippets_fetcher().FetchSnippets(
863 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
793 FastForwardUntilNoTasksRemain(); 864 FastForwardUntilNoTasksRemain();
794 } 865 }
795 866
796 TEST_F(NTPSnippetsFetcherTest, ShouldCancelOngoingFetch) { 867 TEST_F(NTPSnippetsFetcherTest, ShouldCancelOngoingFetch) {
797 const std::string kJsonStr = "{ \"recos\": [] }"; 868 const std::string kJsonStr = "{ \"recos\": [] }";
798 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK, 869 SetFakeResponse(/*response_data=*/kJsonStr, net::HTTP_OK,
799 net::URLRequestStatus::SUCCESS); 870 net::URLRequestStatus::SUCCESS);
800 EXPECT_CALL(mock_callback(), Run(IsEmptyArticleList())); 871 EXPECT_CALL(mock_callback(), Run(IsEmptyArticleList()));
801 snippets_fetcher().FetchSnippets(test_params()); 872 snippets_fetcher().FetchSnippets(
873 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
802 // Second call to FetchSnippets() overrides/cancels the previous. 874 // Second call to FetchSnippets() overrides/cancels the previous.
803 // Callback is expected to be called once. 875 // Callback is expected to be called once.
804 snippets_fetcher().FetchSnippets(test_params()); 876 snippets_fetcher().FetchSnippets(
877 test_params(), ToSnippetsAvailableCallback(&mock_callback()));
805 FastForwardUntilNoTasksRemain(); 878 FastForwardUntilNoTasksRemain();
806 EXPECT_THAT( 879 EXPECT_THAT(
807 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), 880 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"),
808 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); 881 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1)));
809 EXPECT_THAT(histogram_tester().GetAllSamples( 882 EXPECT_THAT(histogram_tester().GetAllSamples(
810 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), 883 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"),
811 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); 884 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1)));
812 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), 885 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"),
813 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, 886 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs,
814 /*count=*/1))); 887 /*count=*/1)));
815 } 888 }
816 889
817 ::std::ostream& operator<<( 890 ::std::ostream& operator<<(
818 ::std::ostream& os, 891 ::std::ostream& os,
819 const NTPSnippetsFetcher::OptionalFetchedCategories& fetched_categories) { 892 const NTPSnippetsFetcher::OptionalFetchedCategories& fetched_categories) {
820 if (fetched_categories) { 893 if (fetched_categories) {
821 // Matchers above aren't any more precise than this, so this is sufficient 894 // Matchers above aren't any more precise than this, so this is sufficient
822 // for test-failure diagnostics. 895 // for test-failure diagnostics.
823 return os << "list with " << fetched_categories->size() << " elements"; 896 return os << "list with " << fetched_categories->size() << " elements";
824 } 897 }
825 return os << "null"; 898 return os << "null";
826 } 899 }
827 900
828 } // namespace ntp_snippets 901 } // namespace ntp_snippets
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698