Index: components/ntp_tiles/popular_sites_unittest.cc |
diff --git a/components/ntp_tiles/popular_sites_unittest.cc b/components/ntp_tiles/popular_sites_unittest.cc |
index 76071cb36e82cf8f2041b5200c4b4ec505d7a725..c12e7dbb8576db8754b7b8a58e1ea2be14f349ca 100644 |
--- a/components/ntp_tiles/popular_sites_unittest.cc |
+++ b/components/ntp_tiles/popular_sites_unittest.cc |
@@ -28,7 +28,7 @@ |
#include "testing/gtest/include/gtest/gtest.h" |
using testing::Eq; |
-using testing::StrEq; |
+using testing::IsEmpty; |
namespace ntp_tiles { |
namespace { |
@@ -38,7 +38,7 @@ const char kUrl[] = "url"; |
const char kLargeIconUrl[] = "large_icon_url"; |
const char kFaviconUrl[] = "favicon_url"; |
-using TestPopularSite = std::vector<std::pair<std::string, std::string>>; |
+using TestPopularSite = std::map<std::string, std::string>; |
using TestPopularSiteVector = std::vector<TestPopularSite>; |
::testing::Matcher<const base::string16&> Str16Eq(const std::string& s) { |
@@ -88,10 +88,26 @@ class JsonUnsafeParser { |
class PopularSitesTest : public ::testing::Test { |
protected: |
PopularSitesTest() |
- : worker_pool_owner_(2, "PopularSitesTest."), |
+ : kWikipedia{ |
+ {kTitle, "Wikipedia, fhta Ph'nglui mglw'nafh"}, |
+ {kUrl, "https://zz.m.wikipedia.org/"}, |
+ {kLargeIconUrl, "https://zz.m.wikipedia.org/wikipedia.png"}, |
+ }, |
+ kYouTube{ |
+ {kTitle, "YouTube"}, |
+ {kUrl, "https://m.youtube.com/"}, |
+ {kLargeIconUrl, "https://s.ytimg.com/apple-touch-icon.png"}, |
+ }, |
+ kChromium{ |
+ {kTitle, "The Chromium Project"}, |
+ {kUrl, "https://www.chromium.org/"}, |
+ {kFaviconUrl, "https://www.chromium.org/favicon.ico"}, |
+ }, |
+ worker_pool_owner_(2, "PopularSitesTest."), |
url_fetcher_factory_(nullptr) { |
PopularSites::RegisterProfilePrefs(prefs_.registry()); |
- CHECK(cache_dir_.CreateUniqueTempDir()); |
+ CHECK(scoped_cache_dir_.CreateUniqueTempDir()); |
+ cache_dir_ = scoped_cache_dir_.GetPath(); |
} |
void SetCountryAndVersion(const std::string& country, |
@@ -116,6 +132,11 @@ class PopularSitesTest : public ::testing::Test { |
net::URLRequestStatus::SUCCESS); |
} |
+ void RespondWithData(const std::string& url, const std::string& data) { |
+ url_fetcher_factory_.SetFakeResponse(GURL(url), data, net::HTTP_OK, |
+ net::URLRequestStatus::SUCCESS); |
+ } |
+ |
void RespondWith404(const std::string& url) { |
url_fetcher_factory_.SetFakeResponse(GURL(url), "404", net::HTTP_NOT_FOUND, |
net::URLRequestStatus::SUCCESS); |
@@ -129,7 +150,7 @@ class PopularSitesTest : public ::testing::Test { |
PopularSites popular_sites(worker_pool_owner_.pool().get(), &prefs_, |
/*template_url_service=*/nullptr, |
/*variations_service=*/nullptr, |
- url_request_context.get(), cache_dir_.GetPath(), |
+ url_request_context.get(), cache_dir_, |
base::Bind(JsonUnsafeParser::Parse)); |
base::RunLoop loop; |
@@ -147,9 +168,14 @@ class PopularSitesTest : public ::testing::Test { |
return save_success; |
} |
+ const TestPopularSite kWikipedia; |
+ const TestPopularSite kYouTube; |
+ const TestPopularSite kChromium; |
+ |
base::MessageLoopForUI ui_loop_; |
base::SequencedWorkerPoolOwner worker_pool_owner_; |
- base::ScopedTempDir cache_dir_; |
+ base::ScopedTempDir scoped_cache_dir_; |
+ base::FilePath cache_dir_; |
user_prefs::TestingPrefServiceSyncable prefs_; |
net::FakeURLFetcherFactory url_fetcher_factory_; |
}; |
@@ -158,11 +184,7 @@ TEST_F(PopularSitesTest, Basic) { |
SetCountryAndVersion("ZZ", "9"); |
RespondWithJSON( |
"https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", |
- {{ |
- {kTitle, "Wikipedia, fhta Ph'nglui mglw'nafh"}, |
- {kUrl, "https://zz.m.wikipedia.org/"}, |
- {kLargeIconUrl, "https://zz.m.wikipedia.org/wikipedia.png"}, |
- }}); |
+ {kWikipedia}); |
std::vector<PopularSites::Site> sites; |
EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); |
@@ -181,16 +203,7 @@ TEST_F(PopularSitesTest, Fallback) { |
"https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); |
RespondWithJSON( |
"https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json", |
- {{ |
- {kTitle, "YouTube"}, |
- {kUrl, "https://m.youtube.com/"}, |
- {kLargeIconUrl, "https://s.ytimg.com/apple-touch-icon.png"}, |
- }, |
- { |
- {kTitle, "The Chromium Project"}, |
- {kUrl, "https://www.chromium.org/"}, |
- {kFaviconUrl, "https://www.chromium.org/favicon.ico"}, |
- }}); |
+ {kYouTube, kChromium}); |
std::vector<PopularSites::Site> sites; |
EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); |
@@ -217,7 +230,136 @@ TEST_F(PopularSitesTest, Failure) { |
std::vector<PopularSites::Site> sites; |
EXPECT_FALSE(FetchPopularSites(/*force_download=*/false, &sites)); |
- ASSERT_THAT(sites.size(), Eq(0u)); |
+ ASSERT_THAT(sites, IsEmpty()); |
+} |
+ |
+TEST_F(PopularSitesTest, FailsWithoutFetchIfNoCacheDir) { |
+ SetCountryAndVersion("ZZ", "9"); |
+ std::vector<PopularSites::Site> sites; |
+ cache_dir_ = base::FilePath(); // Override with invalid file path. |
+ EXPECT_FALSE(FetchPopularSites(/*force_download=*/false, &sites)); |
+} |
+ |
+TEST_F(PopularSitesTest, UsesCachedFile) { |
+ SetCountryAndVersion("ZZ", "9"); |
+ RespondWithJSON( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", |
+ {kWikipedia}); |
+ |
+ // First request succeeds and gets cached. |
+ std::vector<PopularSites::Site> sites; |
+ EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); |
+ |
+ // File disappears from server, but we don't need it because it's cached. |
+ RespondWith404( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); |
+ EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); |
+ EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); |
+} |
+ |
+TEST_F(PopularSitesTest, CachesEmptyFile) { |
+ SetCountryAndVersion("ZZ", "9"); |
+ RespondWithData( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", "[]"); |
+ RespondWithJSON( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json", |
+ {kWikipedia}); |
+ |
+ // First request succeeds and caches empty suggestions list (no fallback). |
+ std::vector<PopularSites::Site> sites; |
+ EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); |
+ EXPECT_THAT(sites, IsEmpty()); |
+ |
+ // File appears on server, but we continue to use our cached empty file. |
+ RespondWithJSON( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", |
+ {kWikipedia}); |
+ EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); |
+ EXPECT_THAT(sites, IsEmpty()); |
+} |
+ |
+TEST_F(PopularSitesTest, DoesntUseCachedFileIfDownloadForced) { |
+ SetCountryAndVersion("ZZ", "9"); |
+ RespondWithJSON( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", |
+ {kWikipedia}); |
+ |
+ // First request succeeds and gets cached. |
+ std::vector<PopularSites::Site> sites; |
+ EXPECT_TRUE(FetchPopularSites(/*force_download=*/true, &sites)); |
+ EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); |
+ |
+ // File disappears from server. Download is forced, so we get the new file. |
+ RespondWithJSON( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", |
+ {kChromium}); |
+ EXPECT_TRUE(FetchPopularSites(/*force_download=*/true, &sites)); |
+ EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); |
+} |
+ |
+TEST_F(PopularSitesTest, RefetchesAfterCountryMoved) { |
+ RespondWithJSON( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", |
+ {kWikipedia}); |
+ RespondWithJSON( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZX_9.json", |
+ {kChromium}); |
+ |
+ std::vector<PopularSites::Site> sites; |
+ |
+ // First request (in ZZ) saves Wikipedia. |
+ SetCountryAndVersion("ZZ", "9"); |
+ EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); |
+ EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); |
+ |
+ // Second request (now in ZX) saves Chromium. |
+ SetCountryAndVersion("ZX", "9"); |
+ EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); |
+ EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); |
+} |
+ |
+TEST_F(PopularSitesTest, DoesntCacheInvalidFile) { |
+ SetCountryAndVersion("ZZ", "9"); |
+ RespondWithData( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", |
+ "ceci n'est pas un json"); |
+ RespondWith404( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json"); |
+ |
+ // First request falls back and gets nothing there either. |
+ std::vector<PopularSites::Site> sites; |
+ EXPECT_FALSE(FetchPopularSites(/*force_download=*/false, &sites)); |
+ |
+ // Second request refetches ZZ_9, which now has data. |
+ RespondWithJSON( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", |
+ {kChromium}); |
+ EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); |
+ ASSERT_THAT(sites.size(), Eq(1u)); |
+ EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); |
+} |
+ |
+TEST_F(PopularSitesTest, RefetchesAfterFallback) { |
+ SetCountryAndVersion("ZZ", "9"); |
+ RespondWith404( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); |
+ RespondWithJSON( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json", |
+ {kWikipedia}); |
+ |
+ // First request falls back. |
+ std::vector<PopularSites::Site> sites; |
+ EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); |
+ ASSERT_THAT(sites.size(), Eq(1u)); |
+ EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); |
+ |
+ // Second request refetches ZZ_9, which now has data. |
+ RespondWithJSON( |
+ "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", |
+ {kChromium}); |
+ EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); |
+ ASSERT_THAT(sites.size(), Eq(1u)); |
+ EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); |
} |
} // namespace |