Chromium Code Reviews| Index: components/ntp_snippets/ntp_snippets_service_unittest.cc |
| diff --git a/components/ntp_snippets/ntp_snippets_service_unittest.cc b/components/ntp_snippets/ntp_snippets_service_unittest.cc |
| index b8f4e7161472b1adbccfbfe46d54e92b7a199f5e..fba0294ad225ce408f92edff3acb38ae7948bce0 100644 |
| --- a/components/ntp_snippets/ntp_snippets_service_unittest.cc |
| +++ b/components/ntp_snippets/ntp_snippets_service_unittest.cc |
| @@ -5,6 +5,7 @@ |
| #include "components/ntp_snippets/ntp_snippets_service.h" |
| #include <memory> |
| +#include <vector> |
| #include "base/json/json_reader.h" |
| #include "base/macros.h" |
| @@ -41,16 +42,15 @@ std::string GetTestJson(const std::string& content_creation_time_str, |
| "{ \"recos\": [ " |
| "{ \"contentInfo\": {" |
| "\"url\" : \"http://localhost/foobar\"," |
| - "\"site_title\" : \"Site Title\"," |
| - "\"favicon_url\" : \"http://localhost/favicon\"," |
| "\"title\" : \"Title\"," |
| "\"snippet\" : \"Snippet\"," |
| "\"thumbnailUrl\" : \"http://localhost/salient_image\"," |
| "\"creationTimestampSec\" : \"%s\"," |
| "\"expiryTimestampSec\" : \"%s\"," |
| "\"sourceCorpusInfo\" : [ " |
| - "{\"ampUrl\" : \"http://localhost/amp\"}," |
| - "{\"corpusId\" : \"id\"}]" |
| + "{\"ampUrl\" : \"http://localhost/amp\"," |
| + "\"corpusId\" : \"http://localhost/foobar\"," |
| + "\"publisherData\": { \"sourceName\" : \"Foo News\"}}]" |
| "}}" |
| "]}"; |
| @@ -58,6 +58,58 @@ std::string GetTestJson(const std::string& content_creation_time_str, |
| expiry_time_str.c_str()); |
| } |
| +std::string GetTestJsonWithSources(const std::string& content_creation_time_str, |
| + const std::string& expiry_time_str, |
| + const std::vector<std::string>& source_urls, |
| + const std::vector<std::string>& publishers, |
| + const std::vector<std::string>& amp_urls) { |
| + char json_str_format[] = |
| + "{ \"recos\": [ " |
| + "{ \"contentInfo\": {" |
| + "\"url\" : \"http://localhost/foobar\"," |
| + "\"title\" : \"Title\"," |
| + "\"snippet\" : \"Snippet\"," |
| + "\"thumbnailUrl\" : \"http://localhost/salient_image\"," |
| + "\"creationTimestampSec\" : \"%s\"," |
| + "\"expiryTimestampSec\" : \"%s\"," |
| + "\"sourceCorpusInfo\" : [%s]" |
| + "}}" |
| + "]}"; |
| + |
| + char source_corpus_info_format[] = |
| + "{\"corpusId\": \"%s\"," |
| + "\"publisherData\": {" |
| + "\"sourceName\": \"%s\"" |
| + "}," |
| + "\"ampUrl\": \"%s\"}"; |
| + |
| + std::string source_corpus_info_list_str; |
| + for (size_t i = 0; i < source_urls.size(); ++i) { |
| + std::string source_corpus_info_str = |
| + base::StringPrintf(source_corpus_info_format, |
| + source_urls[i].empty() ? "" : source_urls[i].c_str(), |
| + publishers[i].empty() ? "" : publishers[i].c_str(), |
| + amp_urls[i].empty() ? "" : amp_urls[i].c_str()); |
| + source_corpus_info_list_str.append(source_corpus_info_str); |
| + source_corpus_info_list_str.append(","); |
| + } |
| + // Remove the last comma |
| + source_corpus_info_list_str.pop_back(); |
| + return base::StringPrintf(json_str_format, content_creation_time_str.c_str(), |
| + expiry_time_str.c_str(), |
| + source_corpus_info_list_str.c_str()); |
| +} |
| + |
| +std::string GetTestJsonWithSources(const std::vector<std::string>& source_urls, |
| + const std::vector<std::string>& publishers, |
| + const std::vector<std::string>& amp_urls) { |
| + base::Time expiry_time = base::Time::Now() + base::TimeDelta::FromHours(1); |
| + return GetTestJsonWithSources( |
| + NTPSnippet::TimeToJsonString(GetDefaultCreationTime()), |
| + NTPSnippet::TimeToJsonString(expiry_time), source_urls, publishers, |
| + amp_urls); |
| +} |
| + |
| std::string GetTestJson(const std::string& content_creation_time_str) { |
| base::Time expiry_time = base::Time::Now() + base::TimeDelta::FromHours(1); |
| return GetTestJson(content_creation_time_str, |
| @@ -219,14 +271,13 @@ TEST_F(NTPSnippetsServiceTest, Full) { |
| for (auto& snippet : *service()) { |
| // Snippet here is a const. |
| EXPECT_EQ(snippet.url(), GURL("http://localhost/foobar")); |
| - EXPECT_EQ(snippet.site_title(), "Site Title"); |
| - EXPECT_EQ(snippet.favicon_url(), GURL("http://localhost/favicon")); |
| + EXPECT_EQ(snippet.site_title(), "Foo News"); |
| EXPECT_EQ(snippet.title(), "Title"); |
| EXPECT_EQ(snippet.snippet(), "Snippet"); |
| EXPECT_EQ(snippet.salient_image_url(), |
| GURL("http://localhost/salient_image")); |
| EXPECT_EQ(GetDefaultCreationTime(), snippet.publish_date()); |
| - EXPECT_EQ(snippet.amp_url(), GURL("http://localhost/amp")); |
| + EXPECT_EQ(snippet.amp_url().spec(), GURL("http://localhost/amp").spec()); |
| } |
| } |
| @@ -241,18 +292,28 @@ TEST_F(NTPSnippetsServiceTest, Clear) { |
| } |
| TEST_F(NTPSnippetsServiceTest, InsertAtFront) { |
| + std::vector<std::string> source_urls; |
|
Bernhard Bauer
2016/04/27 13:22:05
I think you could use an initializer list here to
Bernhard Bauer
2016/04/28 14:19:20
Ping :)
May
2016/04/28 18:01:52
Done.
|
| + source_urls.push_back(std::string("http://first")); |
| + std::vector<std::string> publishers; |
| + publishers.push_back(std::string("Source 1")); |
| + std::vector<std::string> amp_urls; |
| + amp_urls.push_back(std::string("")); |
|
Bernhard Bauer
2016/04/27 13:22:05
The empty string literal is unnecessary.
Bernhard Bauer
2016/04/28 14:19:20
Ping :)
May
2016/04/28 18:01:52
Done.
|
| std::string json_str( |
| - "{ \"recos\": [ " |
| - " { \"contentInfo\": { \"url\" : \"http://first\" }}" |
| - "]}"); |
| + GetTestJsonWithSources(source_urls, publishers, amp_urls)); |
| + |
| LoadFromJSONString(json_str); |
| + |
| ASSERT_EQ(service()->size(), 1u); |
| - std::string json_str2( |
| - "{ \"recos\": [ " |
| - " { \"contentInfo\": { \"url\" : \"http://second\" }}" |
| - "]}"); |
| - LoadFromJSONString(json_str2); |
| + source_urls.clear(); |
| + source_urls.push_back(std::string("http://second")); |
| + publishers.clear(); |
| + publishers.push_back(std::string("Source 1")); |
| + amp_urls.clear(); |
| + amp_urls.push_back(std::string("")); |
| + json_str = GetTestJsonWithSources(source_urls, publishers, amp_urls); |
| + |
| + LoadFromJSONString(json_str); |
| ASSERT_EQ(service()->size(), 2u); |
| // The snippet loaded last should be at the first position in the list now. |
| @@ -314,8 +375,15 @@ TEST_F(NTPSnippetsServiceTest, LoadIncompleteJsonWithExistingSnippets) { |
| } |
| TEST_F(NTPSnippetsServiceTest, Discard) { |
| + std::vector<std::string> source_urls; |
| + source_urls.push_back(std::string("http://site.com")); |
| + std::vector<std::string> publishers; |
| + publishers.push_back(std::string("Source 1")); |
| + std::vector<std::string> amp_urls; |
| + amp_urls.push_back(std::string("")); |
| std::string json_str( |
| - "{ \"recos\": [ { \"contentInfo\": { \"url\" : \"http://site.com\" }}]}"); |
| + GetTestJsonWithSources(source_urls, publishers, amp_urls)); |
| + |
| LoadFromJSONString(json_str); |
| ASSERT_EQ(1u, service()->size()); |
| @@ -345,17 +413,15 @@ TEST_F(NTPSnippetsServiceTest, Discard) { |
| } |
| TEST_F(NTPSnippetsServiceTest, GetDiscarded) { |
| - std::string json_str( |
| - "{ \"recos\": [ { \"contentInfo\": { \"url\" : \"http://site.com\" }}]}"); |
| - LoadFromJSONString(json_str); |
| + LoadFromJSONString(GetTestJson()); |
| // For the test, we need the snippet to get discarded. |
| - ASSERT_TRUE(service()->DiscardSnippet(GURL("http://site.com"))); |
| + ASSERT_TRUE(service()->DiscardSnippet(GURL("http://localhost/foobar"))); |
| const NTPSnippetsService::NTPSnippetStorage& snippets = |
| service()->discarded_snippets(); |
| EXPECT_EQ(1u, snippets.size()); |
| for (auto& snippet : snippets) { |
| - EXPECT_EQ(GURL("http://site.com"), snippet->url()); |
| + EXPECT_EQ(GURL("http://localhost/foobar"), snippet->url()); |
| } |
| // There should be no discarded snippet after clearing the list. |
| @@ -386,4 +452,258 @@ TEST_F(NTPSnippetsServiceTest, RemoveExpiredContent) { |
| EXPECT_EQ(service()->size(), 0u); |
| } |
| +TEST_F(NTPSnippetsServiceTest, TestSingleSource) { |
| + std::vector<std::string> source_urls; |
| + source_urls.push_back(std::string("http://source1.com")); |
| + std::vector<std::string> publishers; |
| + publishers.push_back(std::string("Source 1")); |
| + std::vector<std::string> amp_urls; |
| + amp_urls.push_back(std::string("http://source1.amp.com")); |
| + std::string json_str( |
| + GetTestJsonWithSources(source_urls, publishers, amp_urls)); |
| + |
| + LoadFromJSONString(json_str); |
| + EXPECT_EQ(service()->size(), 1u); |
| + |
| + for (auto& snippet : *service()) { |
| + EXPECT_EQ(snippet.url(), GURL("http://source1.com")); |
| + EXPECT_EQ(snippet.site_title(), std::string("Source 1")); |
| + EXPECT_EQ(snippet.amp_url(), GURL("http://source1.amp.com")); |
| + EXPECT_EQ(snippet.get_sources().size(), 1u); |
| + } |
| +} |
| + |
| +TEST_F(NTPSnippetsServiceTest, TestSingleSourceWithMalformedUrl) { |
| + std::vector<std::string> source_urls; |
| + source_urls.push_back(std::string("aaaa")); |
| + std::vector<std::string> publishers; |
| + publishers.push_back(std::string("Source 1")); |
| + std::vector<std::string> amp_urls; |
| + amp_urls.push_back(std::string("http://source1.amp.com")); |
| + std::string json_str( |
| + GetTestJsonWithSources(source_urls, publishers, amp_urls)); |
| + |
| + LoadFromJSONString(json_str); |
| +// If we're running a release build, we only add snippets that have a well- |
| +// formed source url |
| +#if !DCHECK_IS_ON() |
| + EXPECT_EQ(service()->size(), 0u); |
| +#else |
| + EXPECT_EQ(service()->size(), 1u); |
| + |
| + for (auto& snippet : *service()) { |
| + EXPECT_EQ(snippet.site_title(), std::string()); |
| + EXPECT_EQ(snippet.get_sources().size(), 0u); |
| + } |
| +#endif |
| +} |
| + |
| +TEST_F(NTPSnippetsServiceTest, TestSingleSourceWithMissingData) { |
| + std::vector<std::string> source_urls; |
| + source_urls.push_back(std::string("http://source1.com")); |
| + std::vector<std::string> publishers; |
| + publishers.push_back(std::string("")); |
| + std::vector<std::string> amp_urls; |
| + amp_urls.push_back(std::string("")); |
| + std::string json_str( |
| + GetTestJsonWithSources(source_urls, publishers, amp_urls)); |
| + |
| + LoadFromJSONString(json_str); |
| +// If we're running a release build, we only add snippets have a source url |
| +// and publisher |
| +#if !DCHECK_IS_ON() |
| + EXPECT_EQ(service()->size(), 0u); |
| +#else |
| + EXPECT_EQ(service()->size(), 1u); |
| + |
| + for (auto& snippet : *service()) { |
| + EXPECT_EQ(snippet.url(), GURL("http://source1.com")); |
| + EXPECT_EQ(snippet.site_title(), std::string()); |
| + EXPECT_EQ(snippet.amp_url(), GURL()); |
| + EXPECT_EQ(snippet.get_sources().size(), 1u); |
| + } |
| +#endif |
| +} |
| + |
| +TEST_F(NTPSnippetsServiceTest, TestMultipleSources) { |
| + std::vector<std::string> source_urls; |
| + source_urls.push_back(std::string("http://source1.com")); |
| + source_urls.push_back(std::string("http://source2.com")); |
| + std::vector<std::string> publishers; |
| + publishers.push_back(std::string("Source 1")); |
| + publishers.push_back(std::string("Source 2")); |
| + std::vector<std::string> amp_urls; |
| + amp_urls.push_back(std::string("http://source1.amp.com")); |
| + amp_urls.push_back(std::string("http://source2.amp.com")); |
| + std::string json_str( |
| + GetTestJsonWithSources(source_urls, publishers, amp_urls)); |
| + |
| + LoadFromJSONString(json_str); |
| + EXPECT_EQ(service()->size(), 1u); |
| + |
| + // Expect the first source to be chosen |
| + for (auto& snippet : *service()) { |
| + EXPECT_EQ(snippet.get_sources().size(), 2u); |
| + EXPECT_EQ(snippet.url(), GURL("http://source1.com")); |
| + EXPECT_EQ(snippet.site_title(), std::string("Source 1")); |
| + EXPECT_EQ(snippet.amp_url(), GURL("http://source1.amp.com")); |
| + } |
| +} |
| + |
| +TEST_F(NTPSnippetsServiceTest, TestMultipleIncompleteSources) { |
| + // Set Source 2 to have no AMP url, and Source 1 to have no publisher name |
| + // Source 2 should win since we favor publisher name over amp url |
| + std::vector<std::string> source_urls; |
| + source_urls.push_back(std::string("http://source1.com")); |
| + source_urls.push_back(std::string("http://source2.com")); |
| + std::vector<std::string> publishers; |
| + publishers.push_back(std::string("")); |
| + publishers.push_back(std::string("Source 2")); |
| + std::vector<std::string> amp_urls; |
| + amp_urls.push_back(std::string("http://source1.amp.com")); |
| + amp_urls.push_back(std::string("")); |
| + std::string json_str( |
| + GetTestJsonWithSources(source_urls, publishers, amp_urls)); |
| + |
| + LoadFromJSONString(json_str); |
| + EXPECT_EQ(service()->size(), 1u); |
| + |
| + for (auto& snippet : *service()) { |
| + EXPECT_EQ(snippet.get_sources().size(), 2u); |
| + EXPECT_EQ(snippet.url(), GURL("http://source2.com")); |
| + EXPECT_EQ(snippet.site_title(), std::string("Source 2")); |
| + EXPECT_EQ(snippet.amp_url(), GURL()); |
| + } |
| + |
| + service()->ClearSnippets(); |
| + // Set Source 1 to have no AMP url, and Source 2 to have no publisher name |
| + // Source 1 should win in this case since we prefer publisher name to AMP url |
| + source_urls.clear(); |
| + source_urls.push_back(std::string("http://source1.com")); |
| + source_urls.push_back(std::string("http://source2.com")); |
| + publishers.clear(); |
| + publishers.push_back(std::string("Source 1")); |
| + publishers.push_back(std::string("")); |
| + amp_urls.clear(); |
| + amp_urls.push_back(std::string("")); |
| + amp_urls.push_back(std::string("http://source2.amp.com")); |
| + json_str = GetTestJsonWithSources(source_urls, publishers, amp_urls); |
| + |
| + LoadFromJSONString(json_str); |
| + EXPECT_EQ(service()->size(), 1u); |
| + |
| + for (auto& snippet : *service()) { |
| + EXPECT_EQ(snippet.get_sources().size(), 2u); |
| + EXPECT_EQ(snippet.url(), GURL("http://source1.com")); |
| + EXPECT_EQ(snippet.site_title(), std::string("Source 1")); |
| + EXPECT_EQ(snippet.amp_url(), GURL()); |
| + } |
| + |
| + service()->ClearSnippets(); |
| + // Set source 1 to have no AMP url and no source. Source 1 should win since |
| + // all sources without publisher name are ranked equally |
| + source_urls.clear(); |
| + source_urls.push_back(std::string("http://source1.com")); |
| + source_urls.push_back(std::string("http://source2.com")); |
| + publishers.clear(); |
| + publishers.push_back(std::string("")); |
| + publishers.push_back(std::string("")); |
| + amp_urls.clear(); |
| + amp_urls.push_back(std::string("")); |
| + amp_urls.push_back(std::string("http://source2.amp.com")); |
| + json_str = GetTestJsonWithSources(source_urls, publishers, amp_urls); |
| + |
| + LoadFromJSONString(json_str); |
| +#if !DCHECK_IS_ON() |
| + EXPECT_EQ(service()->size(), 0u); |
| +#else |
| + EXPECT_EQ(service()->size(), 1u); |
| + for (auto& snippet : *service()) { |
| + EXPECT_EQ(snippet.get_sources().size(), 2u); |
| + EXPECT_EQ(snippet.url(), GURL("http://source1.com")); |
| + EXPECT_EQ(snippet.site_title(), std::string()); |
| + EXPECT_EQ(snippet.amp_url(), GURL()); |
| + } |
| +#endif |
| +} |
| + |
| +TEST_F(NTPSnippetsServiceTest, TestMultipleCompleteSources) { |
| + // Test 2 complete sources, we should choose the first complete source |
| + std::vector<std::string> source_urls; |
| + source_urls.push_back(std::string("http://source1.com")); |
| + source_urls.push_back(std::string("http://source2.com")); |
| + source_urls.push_back(std::string("http://source3.com")); |
| + std::vector<std::string> publishers; |
| + publishers.push_back(std::string("Source 1")); |
| + publishers.push_back(std::string("")); |
| + publishers.push_back(std::string("Source 3")); |
| + std::vector<std::string> amp_urls; |
| + amp_urls.push_back(std::string("http://source1.amp.com")); |
| + amp_urls.push_back(std::string("http://source2.amp.com")); |
| + amp_urls.push_back(std::string("http://source3.amp.com")); |
| + std::string json_str( |
| + GetTestJsonWithSources(source_urls, publishers, amp_urls)); |
| + |
| + LoadFromJSONString(json_str); |
| + EXPECT_EQ(service()->size(), 1u); |
| + |
| + for (auto& snippet : *service()) { |
| + EXPECT_EQ(snippet.get_sources().size(), 3u); |
| + EXPECT_EQ(snippet.url(), GURL("http://source1.com")); |
| + EXPECT_EQ(snippet.site_title(), std::string("Source 1")); |
| + EXPECT_EQ(snippet.amp_url(), GURL("http://source1.amp.com")); |
| + } |
| + |
| + // Test 2 complete sources, we should choose the first complete source |
| + service()->ClearSnippets(); |
| + source_urls.clear(); |
| + source_urls.push_back(std::string("http://source1.com")); |
| + source_urls.push_back(std::string("http://source2.com")); |
| + source_urls.push_back(std::string("http://source3.com")); |
| + publishers.clear(); |
| + publishers.push_back(std::string("")); |
| + publishers.push_back(std::string("Source 2")); |
| + publishers.push_back(std::string("Source 3")); |
| + amp_urls.clear(); |
| + amp_urls.push_back(std::string("http://source1.amp.com")); |
| + amp_urls.push_back(std::string("http://source2.amp.com")); |
| + amp_urls.push_back(std::string("http://source3.amp.com")); |
| + json_str = GetTestJsonWithSources(source_urls, publishers, amp_urls); |
| + |
| + LoadFromJSONString(json_str); |
| + EXPECT_EQ(service()->size(), 1u); |
| + |
| + for (auto& snippet : *service()) { |
| + EXPECT_EQ(snippet.get_sources().size(), 3u); |
| + EXPECT_EQ(snippet.url(), GURL("http://source2.com")); |
| + EXPECT_EQ(snippet.site_title(), std::string("Source 2")); |
| + EXPECT_EQ(snippet.amp_url(), GURL("http://source2.amp.com")); |
| + } |
| + |
| + // Test 3 complete sources, we should choose the first complete source |
| + service()->ClearSnippets(); |
| + source_urls.clear(); |
| + source_urls.push_back(std::string("http://source1.com")); |
| + source_urls.push_back(std::string("http://source2.com")); |
| + source_urls.push_back(std::string("http://source3.com")); |
| + publishers.clear(); |
| + publishers.push_back(std::string("Source 1")); |
| + publishers.push_back(std::string("Source 2")); |
| + publishers.push_back(std::string("Source 3")); |
| + amp_urls.clear(); |
| + amp_urls.push_back(std::string("")); |
| + amp_urls.push_back(std::string("http://source2.amp.com")); |
| + amp_urls.push_back(std::string("http://source3.amp.com")); |
| + json_str = GetTestJsonWithSources(source_urls, publishers, amp_urls); |
| + |
| + LoadFromJSONString(json_str); |
| + EXPECT_EQ(service()->size(), 1u); |
| + |
| + for (auto& snippet : *service()) { |
| + EXPECT_EQ(snippet.get_sources().size(), 3u); |
| + EXPECT_EQ(snippet.url(), GURL("http://source2.com")); |
| + EXPECT_EQ(snippet.site_title(), std::string("Source 2")); |
| + EXPECT_EQ(snippet.amp_url(), GURL("http://source2.amp.com")); |
| + } |
| +} |
| } // namespace ntp_snippets |