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" |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 " \"corpusId\" : \"http://localhost/foobar\"," | 360 " \"corpusId\" : \"http://localhost/foobar\"," |
361 " \"publisherData\": { \"sourceName\" : \"Foo News\" }" | 361 " \"publisherData\": { \"sourceName\" : \"Foo News\" }" |
362 " }]" | 362 " }]" |
363 " }" | 363 " }" |
364 "}]}"; | 364 "}]}"; |
365 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, | 365 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, |
366 net::URLRequestStatus::SUCCESS); | 366 net::URLRequestStatus::SUCCESS); |
367 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(1))).Times(1); | 367 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(1))).Times(1); |
368 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 368 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
369 /*count=*/1, | 369 /*count=*/1, |
370 /*force_request=*/true); | 370 /*interactive_request=*/true); |
371 FastForwardUntilNoTasksRemain(); | 371 FastForwardUntilNoTasksRemain(); |
372 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); | 372 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); |
373 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); | 373 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); |
374 EXPECT_THAT(histogram_tester().GetAllSamples( | 374 EXPECT_THAT(histogram_tester().GetAllSamples( |
375 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 375 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
376 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 376 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
377 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 377 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
378 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, | 378 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, |
379 /*count=*/1))); | 379 /*count=*/1))); |
380 } | 380 } |
(...skipping 14 matching lines...) Expand all Loading... |
395 " \"imageUrl\" : \"http://localhost/foobar.jpg\"," | 395 " \"imageUrl\" : \"http://localhost/foobar.jpg\"," |
396 " \"ampUrl\" : \"http://localhost/amp\"," | 396 " \"ampUrl\" : \"http://localhost/amp\"," |
397 " \"faviconUrl\" : \"http://localhost/favicon.ico\" " | 397 " \"faviconUrl\" : \"http://localhost/favicon.ico\" " |
398 " }]" | 398 " }]" |
399 "}]}"; | 399 "}]}"; |
400 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, | 400 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, |
401 net::URLRequestStatus::SUCCESS); | 401 net::URLRequestStatus::SUCCESS); |
402 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(1))).Times(1); | 402 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(1))).Times(1); |
403 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 403 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
404 /*count=*/1, | 404 /*count=*/1, |
405 /*force_request=*/true); | 405 /*interactive_request=*/true); |
406 FastForwardUntilNoTasksRemain(); | 406 FastForwardUntilNoTasksRemain(); |
407 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); | 407 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); |
408 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); | 408 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); |
409 EXPECT_THAT(histogram_tester().GetAllSamples( | 409 EXPECT_THAT(histogram_tester().GetAllSamples( |
410 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 410 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
411 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 411 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
412 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 412 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
413 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, | 413 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, |
414 /*count=*/1))); | 414 /*count=*/1))); |
415 } | 415 } |
416 | 416 |
417 TEST_F(NTPSnippetsFetcherTest, ShouldFetchSuccessfullyEmptyList) { | 417 TEST_F(NTPSnippetsFetcherTest, ShouldFetchSuccessfullyEmptyList) { |
418 const std::string kJsonStr = "{\"recos\": []}"; | 418 const std::string kJsonStr = "{\"recos\": []}"; |
419 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, | 419 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, |
420 net::URLRequestStatus::SUCCESS); | 420 net::URLRequestStatus::SUCCESS); |
421 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(0))).Times(1); | 421 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(0))).Times(1); |
422 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 422 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
423 /*count=*/1, | 423 /*count=*/1, |
424 /*force_request=*/true); | 424 /*interactive_request=*/true); |
425 FastForwardUntilNoTasksRemain(); | 425 FastForwardUntilNoTasksRemain(); |
426 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); | 426 EXPECT_THAT(snippets_fetcher().last_status(), Eq("OK")); |
427 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); | 427 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); |
428 EXPECT_THAT( | 428 EXPECT_THAT( |
429 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 429 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
430 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); | 430 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); |
431 EXPECT_THAT(histogram_tester().GetAllSamples( | 431 EXPECT_THAT(histogram_tester().GetAllSamples( |
432 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 432 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
433 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 433 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
434 } | 434 } |
435 | 435 |
436 TEST_F(NTPSnippetsFetcherHostRestrictedTest, ShouldReportEmptyHostsError) { | 436 TEST_F(NTPSnippetsFetcherHostRestrictedTest, ShouldReportEmptyHostsError) { |
437 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 437 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
438 snippets_fetcher().FetchSnippetsFromHosts(/*hosts=*/std::set<std::string>(), | 438 snippets_fetcher().FetchSnippetsFromHosts(/*hosts=*/std::set<std::string>(), |
439 /*language_code=*/"en-US", | 439 /*language_code=*/"en-US", |
440 /*count=*/1, | 440 /*count=*/1, |
441 /*force_request=*/true); | 441 /*interactive_request=*/true); |
442 FastForwardUntilNoTasksRemain(); | 442 FastForwardUntilNoTasksRemain(); |
443 EXPECT_THAT(snippets_fetcher().last_status(), | 443 EXPECT_THAT(snippets_fetcher().last_status(), |
444 Eq("Cannot fetch for empty hosts list.")); | 444 Eq("Cannot fetch for empty hosts list.")); |
445 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); | 445 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); |
446 EXPECT_THAT( | 446 EXPECT_THAT( |
447 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 447 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
448 ElementsAre(base::Bucket(/*min=*/1, /*count=*/1))); | 448 ElementsAre(base::Bucket(/*min=*/1, /*count=*/1))); |
449 EXPECT_THAT(histogram_tester().GetAllSamples( | 449 EXPECT_THAT(histogram_tester().GetAllSamples( |
450 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 450 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
451 IsEmpty()); | 451 IsEmpty()); |
452 // This particular error gets triggered prior to JSON parsing and hence tests | 452 // This particular error gets triggered prior to JSON parsing and hence tests |
453 // observe no fetch latency. | 453 // observe no fetch latency. |
454 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 454 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
455 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); | 455 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); |
456 } | 456 } |
457 | 457 |
458 TEST_F(NTPSnippetsFetcherHostRestrictedTest, ShouldRestrictToHosts) { | 458 TEST_F(NTPSnippetsFetcherHostRestrictedTest, ShouldRestrictToHosts) { |
459 net::TestURLFetcherFactory test_url_fetcher_factory; | 459 net::TestURLFetcherFactory test_url_fetcher_factory; |
460 snippets_fetcher().FetchSnippetsFromHosts( | 460 snippets_fetcher().FetchSnippetsFromHosts( |
461 {"www.somehost1.com", "www.somehost2.com"}, test_lang(), /*count=*/17, | 461 {"www.somehost1.com", "www.somehost2.com"}, test_lang(), /*count=*/17, |
462 /*force_request=*/true); | 462 /*interactive_request=*/true); |
463 net::TestURLFetcher* fetcher = test_url_fetcher_factory.GetFetcherByID(0); | 463 net::TestURLFetcher* fetcher = test_url_fetcher_factory.GetFetcherByID(0); |
464 ASSERT_THAT(fetcher, NotNull()); | 464 ASSERT_THAT(fetcher, NotNull()); |
465 std::unique_ptr<base::Value> value = | 465 std::unique_ptr<base::Value> value = |
466 base::JSONReader::Read(fetcher->upload_data()); | 466 base::JSONReader::Read(fetcher->upload_data()); |
467 ASSERT_TRUE(value) << " failed to parse JSON: " | 467 ASSERT_TRUE(value) << " failed to parse JSON: " |
468 << PrintToString(fetcher->upload_data()); | 468 << PrintToString(fetcher->upload_data()); |
469 const base::DictionaryValue* dict = nullptr; | 469 const base::DictionaryValue* dict = nullptr; |
470 ASSERT_TRUE(value->GetAsDictionary(&dict)); | 470 ASSERT_TRUE(value->GetAsDictionary(&dict)); |
471 const base::DictionaryValue* local_scoring_params = nullptr; | 471 const base::DictionaryValue* local_scoring_params = nullptr; |
472 ASSERT_TRUE(dict->GetDictionary("advanced_options.local_scoring_params", | 472 ASSERT_TRUE(dict->GetDictionary("advanced_options.local_scoring_params", |
(...skipping 11 matching lines...) Expand all Loading... |
484 EXPECT_TRUE(content_selector->GetString("value", &content_selector_value)); | 484 EXPECT_TRUE(content_selector->GetString("value", &content_selector_value)); |
485 EXPECT_THAT(content_selector_value, Eq("www.somehost2.com")); | 485 EXPECT_THAT(content_selector_value, Eq("www.somehost2.com")); |
486 } | 486 } |
487 | 487 |
488 TEST_F(NTPSnippetsFetcherTest, ShouldReportUrlStatusError) { | 488 TEST_F(NTPSnippetsFetcherTest, ShouldReportUrlStatusError) { |
489 SetFakeResponse(/*data=*/std::string(), net::HTTP_NOT_FOUND, | 489 SetFakeResponse(/*data=*/std::string(), net::HTTP_NOT_FOUND, |
490 net::URLRequestStatus::FAILED); | 490 net::URLRequestStatus::FAILED); |
491 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 491 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
492 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 492 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
493 /*count=*/1, | 493 /*count=*/1, |
494 /*force_request=*/true); | 494 /*interactive_request=*/true); |
495 FastForwardUntilNoTasksRemain(); | 495 FastForwardUntilNoTasksRemain(); |
496 EXPECT_THAT(snippets_fetcher().last_status(), | 496 EXPECT_THAT(snippets_fetcher().last_status(), |
497 Eq("URLRequestStatus error -2")); | 497 Eq("URLRequestStatus error -2")); |
498 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); | 498 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); |
499 EXPECT_THAT( | 499 EXPECT_THAT( |
500 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 500 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
501 ElementsAre(base::Bucket(/*min=*/2, /*count=*/1))); | 501 ElementsAre(base::Bucket(/*min=*/2, /*count=*/1))); |
502 EXPECT_THAT(histogram_tester().GetAllSamples( | 502 EXPECT_THAT(histogram_tester().GetAllSamples( |
503 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 503 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
504 ElementsAre(base::Bucket(/*min=*/-2, /*count=*/1))); | 504 ElementsAre(base::Bucket(/*min=*/-2, /*count=*/1))); |
505 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 505 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
506 Not(IsEmpty())); | 506 Not(IsEmpty())); |
507 } | 507 } |
508 | 508 |
509 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpError) { | 509 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpError) { |
510 SetFakeResponse(/*data=*/std::string(), net::HTTP_NOT_FOUND, | 510 SetFakeResponse(/*data=*/std::string(), net::HTTP_NOT_FOUND, |
511 net::URLRequestStatus::SUCCESS); | 511 net::URLRequestStatus::SUCCESS); |
512 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 512 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
513 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 513 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
514 /*count=*/1, | 514 /*count=*/1, |
515 /*force_request=*/true); | 515 /*interactive_request=*/true); |
516 FastForwardUntilNoTasksRemain(); | 516 FastForwardUntilNoTasksRemain(); |
517 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); | 517 EXPECT_THAT(snippets_fetcher().last_json(), IsEmpty()); |
518 EXPECT_THAT( | 518 EXPECT_THAT( |
519 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 519 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
520 ElementsAre(base::Bucket(/*min=*/3, /*count=*/1))); | 520 ElementsAre(base::Bucket(/*min=*/3, /*count=*/1))); |
521 EXPECT_THAT(histogram_tester().GetAllSamples( | 521 EXPECT_THAT(histogram_tester().GetAllSamples( |
522 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 522 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
523 ElementsAre(base::Bucket(/*min=*/404, /*count=*/1))); | 523 ElementsAre(base::Bucket(/*min=*/404, /*count=*/1))); |
524 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 524 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
525 Not(IsEmpty())); | 525 Not(IsEmpty())); |
526 } | 526 } |
527 | 527 |
528 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonError) { | 528 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonError) { |
529 const std::string kInvalidJsonStr = "{ \"recos\": []"; | 529 const std::string kInvalidJsonStr = "{ \"recos\": []"; |
530 SetFakeResponse(/*data=*/kInvalidJsonStr, net::HTTP_OK, | 530 SetFakeResponse(/*data=*/kInvalidJsonStr, net::HTTP_OK, |
531 net::URLRequestStatus::SUCCESS); | 531 net::URLRequestStatus::SUCCESS); |
532 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 532 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
533 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 533 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
534 /*count=*/1, | 534 /*count=*/1, |
535 /*force_request=*/true); | 535 /*interactive_request=*/true); |
536 FastForwardUntilNoTasksRemain(); | 536 FastForwardUntilNoTasksRemain(); |
537 EXPECT_THAT(snippets_fetcher().last_status(), | 537 EXPECT_THAT(snippets_fetcher().last_status(), |
538 StartsWith("Received invalid JSON (error ")); | 538 StartsWith("Received invalid JSON (error ")); |
539 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kInvalidJsonStr)); | 539 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kInvalidJsonStr)); |
540 EXPECT_THAT( | 540 EXPECT_THAT( |
541 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 541 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
542 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1))); | 542 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1))); |
543 EXPECT_THAT(histogram_tester().GetAllSamples( | 543 EXPECT_THAT(histogram_tester().GetAllSamples( |
544 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 544 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
545 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 545 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
546 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 546 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
547 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, | 547 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, |
548 /*count=*/1))); | 548 /*count=*/1))); |
549 } | 549 } |
550 | 550 |
551 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonErrorForEmptyResponse) { | 551 TEST_F(NTPSnippetsFetcherTest, ShouldReportJsonErrorForEmptyResponse) { |
552 SetFakeResponse(/*data=*/std::string(), net::HTTP_OK, | 552 SetFakeResponse(/*data=*/std::string(), net::HTTP_OK, |
553 net::URLRequestStatus::SUCCESS); | 553 net::URLRequestStatus::SUCCESS); |
554 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 554 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
555 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 555 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
556 /*count=*/1, | 556 /*count=*/1, |
557 /*force_request=*/true); | 557 /*interactive_request=*/true); |
558 FastForwardUntilNoTasksRemain(); | 558 FastForwardUntilNoTasksRemain(); |
559 EXPECT_THAT(snippets_fetcher().last_json(), std::string()); | 559 EXPECT_THAT(snippets_fetcher().last_json(), std::string()); |
560 EXPECT_THAT( | 560 EXPECT_THAT( |
561 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 561 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
562 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1))); | 562 ElementsAre(base::Bucket(/*min=*/4, /*count=*/1))); |
563 EXPECT_THAT(histogram_tester().GetAllSamples( | 563 EXPECT_THAT(histogram_tester().GetAllSamples( |
564 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 564 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
565 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 565 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
566 } | 566 } |
567 | 567 |
568 TEST_F(NTPSnippetsFetcherTest, ShouldReportInvalidListError) { | 568 TEST_F(NTPSnippetsFetcherTest, ShouldReportInvalidListError) { |
569 const std::string kJsonStr = | 569 const std::string kJsonStr = |
570 "{\"recos\": [{ \"contentInfo\": { \"foo\" : \"bar\" }}]}"; | 570 "{\"recos\": [{ \"contentInfo\": { \"foo\" : \"bar\" }}]}"; |
571 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, | 571 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, |
572 net::URLRequestStatus::SUCCESS); | 572 net::URLRequestStatus::SUCCESS); |
573 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 573 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
574 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 574 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
575 /*count=*/1, | 575 /*count=*/1, |
576 /*force_request=*/true); | 576 /*interactive_request=*/true); |
577 FastForwardUntilNoTasksRemain(); | 577 FastForwardUntilNoTasksRemain(); |
578 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); | 578 EXPECT_THAT(snippets_fetcher().last_json(), Eq(kJsonStr)); |
579 EXPECT_THAT( | 579 EXPECT_THAT( |
580 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 580 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
581 ElementsAre(base::Bucket(/*min=*/5, /*count=*/1))); | 581 ElementsAre(base::Bucket(/*min=*/5, /*count=*/1))); |
582 EXPECT_THAT(histogram_tester().GetAllSamples( | 582 EXPECT_THAT(histogram_tester().GetAllSamples( |
583 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 583 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
584 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 584 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
585 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 585 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
586 Not(IsEmpty())); | 586 Not(IsEmpty())); |
587 } | 587 } |
588 | 588 |
589 // This test actually verifies that the test setup itself is sane, to prevent | 589 // This test actually verifies that the test setup itself is sane, to prevent |
590 // hard-to-reproduce test failures. | 590 // hard-to-reproduce test failures. |
591 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpErrorForMissingBakedResponse) { | 591 TEST_F(NTPSnippetsFetcherTest, ShouldReportHttpErrorForMissingBakedResponse) { |
592 InitFakeURLFetcherFactory(); | 592 InitFakeURLFetcherFactory(); |
593 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); | 593 EXPECT_CALL(mock_callback(), Run(/*snippets=*/Not(HasValue()))).Times(1); |
594 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 594 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
595 /*count=*/1, | 595 /*count=*/1, |
596 /*force_request=*/true); | 596 /*interactive_request=*/true); |
597 FastForwardUntilNoTasksRemain(); | 597 FastForwardUntilNoTasksRemain(); |
598 } | 598 } |
599 | 599 |
600 TEST_F(NTPSnippetsFetcherTest, ShouldCancelOngoingFetch) { | 600 TEST_F(NTPSnippetsFetcherTest, ShouldCancelOngoingFetch) { |
601 const std::string kJsonStr = "{ \"recos\": [] }"; | 601 const std::string kJsonStr = "{ \"recos\": [] }"; |
602 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, | 602 SetFakeResponse(/*data=*/kJsonStr, net::HTTP_OK, |
603 net::URLRequestStatus::SUCCESS); | 603 net::URLRequestStatus::SUCCESS); |
604 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(0))).Times(1); | 604 EXPECT_CALL(mock_callback(), Run(/*snippets=*/PointeeSizeIs(0))).Times(1); |
605 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 605 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
606 /*count=*/1, | 606 /*count=*/1, |
607 /*force_request=*/true); | 607 /*interactive_request=*/true); |
608 // Second call to FetchSnippetsFromHosts() overrides/cancels the previous. | 608 // Second call to FetchSnippetsFromHosts() overrides/cancels the previous. |
609 // Callback is expected to be called once. | 609 // Callback is expected to be called once. |
610 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), | 610 snippets_fetcher().FetchSnippetsFromHosts(test_hosts(), test_lang(), |
611 /*count=*/1, | 611 /*count=*/1, |
612 /*force_request=*/true); | 612 /*interactive_request=*/true); |
613 FastForwardUntilNoTasksRemain(); | 613 FastForwardUntilNoTasksRemain(); |
614 EXPECT_THAT( | 614 EXPECT_THAT( |
615 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), | 615 histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchResult"), |
616 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); | 616 ElementsAre(base::Bucket(/*min=*/0, /*count=*/1))); |
617 EXPECT_THAT(histogram_tester().GetAllSamples( | 617 EXPECT_THAT(histogram_tester().GetAllSamples( |
618 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), | 618 "NewTabPage.Snippets.FetchHttpResponseOrErrorCode"), |
619 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); | 619 ElementsAre(base::Bucket(/*min=*/200, /*count=*/1))); |
620 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), | 620 EXPECT_THAT(histogram_tester().GetAllSamples("NewTabPage.Snippets.FetchTime"), |
621 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, | 621 ElementsAre(base::Bucket(/*min=*/kTestJsonParsingLatencyMs, |
622 /*count=*/1))); | 622 /*count=*/1))); |
623 } | 623 } |
624 | 624 |
625 ::std::ostream& operator<<( | 625 ::std::ostream& operator<<( |
626 ::std::ostream& os, | 626 ::std::ostream& os, |
627 const NTPSnippetsFetcher::OptionalSnippets& snippets) { | 627 const NTPSnippetsFetcher::OptionalSnippets& snippets) { |
628 if (snippets) { | 628 if (snippets) { |
629 // Matchers above aren't any more precise than this, so this is sufficient | 629 // Matchers above aren't any more precise than this, so this is sufficient |
630 // for test-failure diagnostics. | 630 // for test-failure diagnostics. |
631 return os << "list with " << snippets->size() << " elements"; | 631 return os << "list with " << snippets->size() << " elements"; |
632 } else { | 632 } else { |
633 return os << "null"; | 633 return os << "null"; |
634 } | 634 } |
635 } | 635 } |
636 | 636 |
637 } // namespace ntp_snippets | 637 } // namespace ntp_snippets |
OLD | NEW |