| 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_tiles/popular_sites.h" | 5 #include "components/ntp_tiles/popular_sites.h" | 
| 6 | 6 | 
| 7 #include <string> | 7 #include <string> | 
| 8 #include <utility> | 8 #include <utility> | 
| 9 #include <vector> | 9 #include <vector> | 
| 10 | 10 | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 61             {kUrl, "https://m.youtube.com/"}, | 61             {kUrl, "https://m.youtube.com/"}, | 
| 62             {kLargeIconUrl, "https://s.ytimg.com/apple-touch-icon.png"}, | 62             {kLargeIconUrl, "https://s.ytimg.com/apple-touch-icon.png"}, | 
| 63         }, | 63         }, | 
| 64         kChromium{ | 64         kChromium{ | 
| 65             {kTitle, "The Chromium Project"}, | 65             {kTitle, "The Chromium Project"}, | 
| 66             {kUrl, "https://www.chromium.org/"}, | 66             {kUrl, "https://www.chromium.org/"}, | 
| 67             {kFaviconUrl, "https://www.chromium.org/favicon.ico"}, | 67             {kFaviconUrl, "https://www.chromium.org/favicon.ico"}, | 
| 68         }, | 68         }, | 
| 69         worker_pool_owner_(2, "PopularSitesTest."), | 69         worker_pool_owner_(2, "PopularSitesTest."), | 
| 70         url_fetcher_factory_(nullptr) { | 70         url_fetcher_factory_(nullptr) { | 
| 71     PopularSites::RegisterProfilePrefs(prefs_.registry()); | 71     PopularSitesImpl::RegisterProfilePrefs(prefs_.registry()); | 
| 72     CHECK(scoped_cache_dir_.CreateUniqueTempDir()); | 72     CHECK(scoped_cache_dir_.CreateUniqueTempDir()); | 
| 73     cache_dir_ = scoped_cache_dir_.GetPath(); | 73     cache_dir_ = scoped_cache_dir_.GetPath(); | 
| 74   } | 74   } | 
| 75 | 75 | 
| 76   void SetCountryAndVersion(const std::string& country, | 76   void SetCountryAndVersion(const std::string& country, | 
| 77                             const std::string& version) { | 77                             const std::string& version) { | 
| 78     prefs_.SetString(prefs::kPopularSitesOverrideCountry, country); | 78     prefs_.SetString(prefs::kPopularSitesOverrideCountry, country); | 
| 79     prefs_.SetString(prefs::kPopularSitesOverrideVersion, version); | 79     prefs_.SetString(prefs::kPopularSitesOverrideVersion, version); | 
| 80   } | 80   } | 
| 81 | 81 | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 99     url_fetcher_factory_.SetFakeResponse(GURL(url), data, net::HTTP_OK, | 99     url_fetcher_factory_.SetFakeResponse(GURL(url), data, net::HTTP_OK, | 
| 100                                          net::URLRequestStatus::SUCCESS); | 100                                          net::URLRequestStatus::SUCCESS); | 
| 101   } | 101   } | 
| 102 | 102 | 
| 103   void RespondWith404(const std::string& url) { | 103   void RespondWith404(const std::string& url) { | 
| 104     url_fetcher_factory_.SetFakeResponse(GURL(url), "404", net::HTTP_NOT_FOUND, | 104     url_fetcher_factory_.SetFakeResponse(GURL(url), "404", net::HTTP_NOT_FOUND, | 
| 105                                          net::URLRequestStatus::SUCCESS); | 105                                          net::URLRequestStatus::SUCCESS); | 
| 106   } | 106   } | 
| 107 | 107 | 
| 108   bool FetchPopularSites(bool force_download, | 108   bool FetchPopularSites(bool force_download, | 
| 109                          std::vector<PopularSites::Site>* sites) { | 109                          PopularSites::SitesVector* sites) { | 
| 110     scoped_refptr<net::TestURLRequestContextGetter> url_request_context( | 110     scoped_refptr<net::TestURLRequestContextGetter> url_request_context( | 
| 111         new net::TestURLRequestContextGetter( | 111         new net::TestURLRequestContextGetter( | 
| 112             base::ThreadTaskRunnerHandle::Get())); | 112             base::ThreadTaskRunnerHandle::Get())); | 
| 113     PopularSites popular_sites(worker_pool_owner_.pool().get(), &prefs_, | 113     PopularSitesImpl popular_sites(worker_pool_owner_.pool().get(), &prefs_, | 
| 114                                /*template_url_service=*/nullptr, | 114                                    /*template_url_service=*/nullptr, | 
| 115                                /*variations_service=*/nullptr, | 115                                    /*variations_service=*/nullptr, | 
| 116                                url_request_context.get(), cache_dir_, | 116                                    url_request_context.get(), cache_dir_, | 
| 117                                base::Bind(JsonUnsafeParser::Parse)); | 117                                    base::Bind(JsonUnsafeParser::Parse)); | 
| 118 | 118 | 
| 119     base::RunLoop loop; | 119     base::RunLoop loop; | 
| 120     bool save_success = false; | 120     bool save_success = false; | 
| 121     popular_sites.StartFetch( | 121     popular_sites.StartFetch( | 
| 122         force_download, | 122         force_download, | 
| 123         base::Bind( | 123         base::Bind( | 
| 124             [](bool* save_success, base::RunLoop* loop, bool success) { | 124             [](bool* save_success, base::RunLoop* loop, bool success) { | 
| 125               *save_success = success; | 125               *save_success = success; | 
| 126               loop->Quit(); | 126               loop->Quit(); | 
| 127             }, | 127             }, | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 142   sync_preferences::TestingPrefServiceSyncable prefs_; | 142   sync_preferences::TestingPrefServiceSyncable prefs_; | 
| 143   net::FakeURLFetcherFactory url_fetcher_factory_; | 143   net::FakeURLFetcherFactory url_fetcher_factory_; | 
| 144 }; | 144 }; | 
| 145 | 145 | 
| 146 TEST_F(PopularSitesTest, Basic) { | 146 TEST_F(PopularSitesTest, Basic) { | 
| 147   SetCountryAndVersion("ZZ", "9"); | 147   SetCountryAndVersion("ZZ", "9"); | 
| 148   RespondWithJSON( | 148   RespondWithJSON( | 
| 149       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 149       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 
| 150       {kWikipedia}); | 150       {kWikipedia}); | 
| 151 | 151 | 
| 152   std::vector<PopularSites::Site> sites; | 152   PopularSites::SitesVector sites; | 
| 153   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 153   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 154 | 154 | 
| 155   ASSERT_THAT(sites.size(), Eq(1u)); | 155   ASSERT_THAT(sites.size(), Eq(1u)); | 
| 156   EXPECT_THAT(sites[0].title, Str16Eq("Wikipedia, fhta Ph'nglui mglw'nafh")); | 156   EXPECT_THAT(sites[0].title, Str16Eq("Wikipedia, fhta Ph'nglui mglw'nafh")); | 
| 157   EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); | 157   EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); | 
| 158   EXPECT_THAT(sites[0].large_icon_url, | 158   EXPECT_THAT(sites[0].large_icon_url, | 
| 159               URLEq("https://zz.m.wikipedia.org/wikipedia.png")); | 159               URLEq("https://zz.m.wikipedia.org/wikipedia.png")); | 
| 160   EXPECT_THAT(sites[0].favicon_url, URLEq("")); | 160   EXPECT_THAT(sites[0].favicon_url, URLEq("")); | 
| 161 } | 161 } | 
| 162 | 162 | 
| 163 TEST_F(PopularSitesTest, Fallback) { | 163 TEST_F(PopularSitesTest, Fallback) { | 
| 164   SetCountryAndVersion("ZZ", "9"); | 164   SetCountryAndVersion("ZZ", "9"); | 
| 165   RespondWith404( | 165   RespondWith404( | 
| 166       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); | 166       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); | 
| 167   RespondWithJSON( | 167   RespondWithJSON( | 
| 168       "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json", | 168       "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json", | 
| 169       {kYouTube, kChromium}); | 169       {kYouTube, kChromium}); | 
| 170 | 170 | 
| 171   std::vector<PopularSites::Site> sites; | 171   PopularSites::SitesVector sites; | 
| 172   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 172   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 173 | 173 | 
| 174   ASSERT_THAT(sites.size(), Eq(2u)); | 174   ASSERT_THAT(sites.size(), Eq(2u)); | 
| 175   EXPECT_THAT(sites[0].title, Str16Eq("YouTube")); | 175   EXPECT_THAT(sites[0].title, Str16Eq("YouTube")); | 
| 176   EXPECT_THAT(sites[0].url, URLEq("https://m.youtube.com/")); | 176   EXPECT_THAT(sites[0].url, URLEq("https://m.youtube.com/")); | 
| 177   EXPECT_THAT(sites[0].large_icon_url, | 177   EXPECT_THAT(sites[0].large_icon_url, | 
| 178               URLEq("https://s.ytimg.com/apple-touch-icon.png")); | 178               URLEq("https://s.ytimg.com/apple-touch-icon.png")); | 
| 179   EXPECT_THAT(sites[0].favicon_url, URLEq("")); | 179   EXPECT_THAT(sites[0].favicon_url, URLEq("")); | 
| 180   EXPECT_THAT(sites[1].title, Str16Eq("The Chromium Project")); | 180   EXPECT_THAT(sites[1].title, Str16Eq("The Chromium Project")); | 
| 181   EXPECT_THAT(sites[1].url, URLEq("https://www.chromium.org/")); | 181   EXPECT_THAT(sites[1].url, URLEq("https://www.chromium.org/")); | 
| 182   EXPECT_THAT(sites[1].large_icon_url, URLEq("")); | 182   EXPECT_THAT(sites[1].large_icon_url, URLEq("")); | 
| 183   EXPECT_THAT(sites[1].favicon_url, | 183   EXPECT_THAT(sites[1].favicon_url, | 
| 184               URLEq("https://www.chromium.org/favicon.ico")); | 184               URLEq("https://www.chromium.org/favicon.ico")); | 
| 185 } | 185 } | 
| 186 | 186 | 
| 187 TEST_F(PopularSitesTest, Failure) { | 187 TEST_F(PopularSitesTest, Failure) { | 
| 188   SetCountryAndVersion("ZZ", "9"); | 188   SetCountryAndVersion("ZZ", "9"); | 
| 189   RespondWith404( | 189   RespondWith404( | 
| 190       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); | 190       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); | 
| 191   RespondWith404( | 191   RespondWith404( | 
| 192       "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json"); | 192       "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json"); | 
| 193 | 193 | 
| 194   std::vector<PopularSites::Site> sites; | 194   PopularSites::SitesVector sites; | 
| 195   EXPECT_FALSE(FetchPopularSites(/*force_download=*/false, &sites)); | 195   EXPECT_FALSE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 196   ASSERT_THAT(sites, IsEmpty()); | 196   ASSERT_THAT(sites, IsEmpty()); | 
| 197 } | 197 } | 
| 198 | 198 | 
| 199 TEST_F(PopularSitesTest, FailsWithoutFetchIfNoCacheDir) { | 199 TEST_F(PopularSitesTest, FailsWithoutFetchIfNoCacheDir) { | 
| 200   SetCountryAndVersion("ZZ", "9"); | 200   SetCountryAndVersion("ZZ", "9"); | 
| 201   std::vector<PopularSites::Site> sites; | 201   PopularSites::SitesVector sites; | 
| 202   cache_dir_ = base::FilePath();  // Override with invalid file path. | 202   cache_dir_ = base::FilePath();  // Override with invalid file path. | 
| 203   EXPECT_FALSE(FetchPopularSites(/*force_download=*/false, &sites)); | 203   EXPECT_FALSE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 204 } | 204 } | 
| 205 | 205 | 
| 206 TEST_F(PopularSitesTest, UsesCachedFile) { | 206 TEST_F(PopularSitesTest, UsesCachedFile) { | 
| 207   SetCountryAndVersion("ZZ", "9"); | 207   SetCountryAndVersion("ZZ", "9"); | 
| 208   RespondWithJSON( | 208   RespondWithJSON( | 
| 209       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 209       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 
| 210       {kWikipedia}); | 210       {kWikipedia}); | 
| 211 | 211 | 
| 212   // First request succeeds and gets cached. | 212   // First request succeeds and gets cached. | 
| 213   std::vector<PopularSites::Site> sites; | 213   PopularSites::SitesVector sites; | 
| 214   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 214   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 215 | 215 | 
| 216   // File disappears from server, but we don't need it because it's cached. | 216   // File disappears from server, but we don't need it because it's cached. | 
| 217   RespondWith404( | 217   RespondWith404( | 
| 218       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); | 218       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); | 
| 219   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 219   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 220   EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); | 220   EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); | 
| 221 } | 221 } | 
| 222 | 222 | 
| 223 TEST_F(PopularSitesTest, CachesEmptyFile) { | 223 TEST_F(PopularSitesTest, CachesEmptyFile) { | 
| 224   SetCountryAndVersion("ZZ", "9"); | 224   SetCountryAndVersion("ZZ", "9"); | 
| 225   RespondWithData( | 225   RespondWithData( | 
| 226       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", "[]"); | 226       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", "[]"); | 
| 227   RespondWithJSON( | 227   RespondWithJSON( | 
| 228       "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json", | 228       "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json", | 
| 229       {kWikipedia}); | 229       {kWikipedia}); | 
| 230 | 230 | 
| 231   // First request succeeds and caches empty suggestions list (no fallback). | 231   // First request succeeds and caches empty suggestions list (no fallback). | 
| 232   std::vector<PopularSites::Site> sites; | 232   PopularSites::SitesVector sites; | 
| 233   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 233   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 234   EXPECT_THAT(sites, IsEmpty()); | 234   EXPECT_THAT(sites, IsEmpty()); | 
| 235 | 235 | 
| 236   // File appears on server, but we continue to use our cached empty file. | 236   // File appears on server, but we continue to use our cached empty file. | 
| 237   RespondWithJSON( | 237   RespondWithJSON( | 
| 238       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 238       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 
| 239       {kWikipedia}); | 239       {kWikipedia}); | 
| 240   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 240   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 241   EXPECT_THAT(sites, IsEmpty()); | 241   EXPECT_THAT(sites, IsEmpty()); | 
| 242 } | 242 } | 
| 243 | 243 | 
| 244 TEST_F(PopularSitesTest, DoesntUseCachedFileIfDownloadForced) { | 244 TEST_F(PopularSitesTest, DoesntUseCachedFileIfDownloadForced) { | 
| 245   SetCountryAndVersion("ZZ", "9"); | 245   SetCountryAndVersion("ZZ", "9"); | 
| 246   RespondWithJSON( | 246   RespondWithJSON( | 
| 247       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 247       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 
| 248       {kWikipedia}); | 248       {kWikipedia}); | 
| 249 | 249 | 
| 250   // First request succeeds and gets cached. | 250   // First request succeeds and gets cached. | 
| 251   std::vector<PopularSites::Site> sites; | 251   PopularSites::SitesVector sites; | 
| 252   EXPECT_TRUE(FetchPopularSites(/*force_download=*/true, &sites)); | 252   EXPECT_TRUE(FetchPopularSites(/*force_download=*/true, &sites)); | 
| 253   EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); | 253   EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); | 
| 254 | 254 | 
| 255   // File disappears from server. Download is forced, so we get the new file. | 255   // File disappears from server. Download is forced, so we get the new file. | 
| 256   RespondWithJSON( | 256   RespondWithJSON( | 
| 257       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 257       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 
| 258       {kChromium}); | 258       {kChromium}); | 
| 259   EXPECT_TRUE(FetchPopularSites(/*force_download=*/true, &sites)); | 259   EXPECT_TRUE(FetchPopularSites(/*force_download=*/true, &sites)); | 
| 260   EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); | 260   EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); | 
| 261 } | 261 } | 
| 262 | 262 | 
| 263 TEST_F(PopularSitesTest, RefetchesAfterCountryMoved) { | 263 TEST_F(PopularSitesTest, RefetchesAfterCountryMoved) { | 
| 264   RespondWithJSON( | 264   RespondWithJSON( | 
| 265       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 265       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 
| 266       {kWikipedia}); | 266       {kWikipedia}); | 
| 267   RespondWithJSON( | 267   RespondWithJSON( | 
| 268       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZX_9.json", | 268       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZX_9.json", | 
| 269       {kChromium}); | 269       {kChromium}); | 
| 270 | 270 | 
| 271   std::vector<PopularSites::Site> sites; | 271   PopularSites::SitesVector sites; | 
| 272 | 272 | 
| 273   // First request (in ZZ) saves Wikipedia. | 273   // First request (in ZZ) saves Wikipedia. | 
| 274   SetCountryAndVersion("ZZ", "9"); | 274   SetCountryAndVersion("ZZ", "9"); | 
| 275   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 275   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 276   EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); | 276   EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); | 
| 277 | 277 | 
| 278   // Second request (now in ZX) saves Chromium. | 278   // Second request (now in ZX) saves Chromium. | 
| 279   SetCountryAndVersion("ZX", "9"); | 279   SetCountryAndVersion("ZX", "9"); | 
| 280   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 280   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 281   EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); | 281   EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); | 
| 282 } | 282 } | 
| 283 | 283 | 
| 284 TEST_F(PopularSitesTest, DoesntCacheInvalidFile) { | 284 TEST_F(PopularSitesTest, DoesntCacheInvalidFile) { | 
| 285   SetCountryAndVersion("ZZ", "9"); | 285   SetCountryAndVersion("ZZ", "9"); | 
| 286   RespondWithData( | 286   RespondWithData( | 
| 287       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 287       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 
| 288       "ceci n'est pas un json"); | 288       "ceci n'est pas un json"); | 
| 289   RespondWith404( | 289   RespondWith404( | 
| 290       "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json"); | 290       "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json"); | 
| 291 | 291 | 
| 292   // First request falls back and gets nothing there either. | 292   // First request falls back and gets nothing there either. | 
| 293   std::vector<PopularSites::Site> sites; | 293   PopularSites::SitesVector sites; | 
| 294   EXPECT_FALSE(FetchPopularSites(/*force_download=*/false, &sites)); | 294   EXPECT_FALSE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 295 | 295 | 
| 296   // Second request refetches ZZ_9, which now has data. | 296   // Second request refetches ZZ_9, which now has data. | 
| 297   RespondWithJSON( | 297   RespondWithJSON( | 
| 298       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 298       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 
| 299       {kChromium}); | 299       {kChromium}); | 
| 300   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 300   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 301   ASSERT_THAT(sites.size(), Eq(1u)); | 301   ASSERT_THAT(sites.size(), Eq(1u)); | 
| 302   EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); | 302   EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); | 
| 303 } | 303 } | 
| 304 | 304 | 
| 305 TEST_F(PopularSitesTest, RefetchesAfterFallback) { | 305 TEST_F(PopularSitesTest, RefetchesAfterFallback) { | 
| 306   SetCountryAndVersion("ZZ", "9"); | 306   SetCountryAndVersion("ZZ", "9"); | 
| 307   RespondWith404( | 307   RespondWith404( | 
| 308       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); | 308       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json"); | 
| 309   RespondWithJSON( | 309   RespondWithJSON( | 
| 310       "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json", | 310       "https://www.gstatic.com/chrome/ntp/suggested_sites_DEFAULT_5.json", | 
| 311       {kWikipedia}); | 311       {kWikipedia}); | 
| 312 | 312 | 
| 313   // First request falls back. | 313   // First request falls back. | 
| 314   std::vector<PopularSites::Site> sites; | 314   PopularSites::SitesVector sites; | 
| 315   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 315   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 316   ASSERT_THAT(sites.size(), Eq(1u)); | 316   ASSERT_THAT(sites.size(), Eq(1u)); | 
| 317   EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); | 317   EXPECT_THAT(sites[0].url, URLEq("https://zz.m.wikipedia.org/")); | 
| 318 | 318 | 
| 319   // Second request refetches ZZ_9, which now has data. | 319   // Second request refetches ZZ_9, which now has data. | 
| 320   RespondWithJSON( | 320   RespondWithJSON( | 
| 321       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 321       "https://www.gstatic.com/chrome/ntp/suggested_sites_ZZ_9.json", | 
| 322       {kChromium}); | 322       {kChromium}); | 
| 323   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 323   EXPECT_TRUE(FetchPopularSites(/*force_download=*/false, &sites)); | 
| 324   ASSERT_THAT(sites.size(), Eq(1u)); | 324   ASSERT_THAT(sites.size(), Eq(1u)); | 
| 325   EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); | 325   EXPECT_THAT(sites[0].url, URLEq("https://www.chromium.org/")); | 
| 326 } | 326 } | 
| 327 | 327 | 
| 328 }  // namespace | 328 }  // namespace | 
| 329 }  // namespace ntp_tiles | 329 }  // namespace ntp_tiles | 
| OLD | NEW | 
|---|