15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/thumbnails/thumbnail_service_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/top_sites_impl.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef testing::Test ThumbnailServiceTest; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A mock version of TopSitesImpl, used for testing 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ShouldAcquirePageThumbnail(). 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MockTopSites : public history::TopSitesImpl { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit MockTopSites(Profile* profile) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : history::TopSitesImpl(profile), 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) capacity_(1) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // history::TopSitesImpl overrides. 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool IsNonForcedFull() OVERRIDE { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return known_url_map_.size() >= capacity_; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool IsForcedFull() OVERRIDE { 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsKnownURL(const GURL& url) OVERRIDE { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return known_url_map_.find(url.spec()) != known_url_map_.end(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetPageThumbnailScore(const GURL& url, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore* score) OVERRIDE { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, ThumbnailScore>::const_iterator iter = 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) known_url_map_.find(url.spec()); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == known_url_map_.end()) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *score = iter->second; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds a known URL with the associated thumbnail score. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddKnownURL(const GURL& url, const ThumbnailScore& score) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) known_url_map_[url.spec()] = score; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockTopSites() {} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t capacity_; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<std::string, ThumbnailScore> known_url_map_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockTopSites); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A mock version of TestingProfile holds MockTopSites. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockProfile : public TestingProfile { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockProfile() : mock_top_sites_(new MockTopSites(this)) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual history::TopSites* GetTopSites() OVERRIDE { 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return mock_top_sites_.get(); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddKnownURL(const GURL& url, const ThumbnailScore& score) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_top_sites_->AddKnownURL(url, score); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockTopSites> mock_top_sites_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockProfile); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ThumbnailServiceTest, ShouldUpdateThumbnail) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL kGoodURL("http://www.google.com/"); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL kBadURL("chrome://newtab"); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set up the mock profile along with mock top sites. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockProfile profile; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<thumbnails::ThumbnailService> thumbnail_service( 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new thumbnails::ThumbnailServiceImpl(&profile)); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be false because it's a bad URL. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(thumbnail_service->ShouldAcquirePageThumbnail(kBadURL)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be true, as it's a good URL. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(thumbnail_service->ShouldAcquirePageThumbnail(kGoodURL)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not checking incognito mode since the service wouldn't have been created 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in that case anyway. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a known URL. This makes the top sites data full. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore bad_score; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bad_score.time_at_snapshot = base::Time::UnixEpoch(); // Ancient time stamp. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile.AddKnownURL(kGoodURL, bad_score); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(profile.GetTopSites()->IsNonForcedFull()); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be false, as the top sites data is full, and the new URL is 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not known. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL kAnotherGoodURL("http://www.youtube.com/"); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(thumbnail_service->ShouldAcquirePageThumbnail(kAnotherGoodURL)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be true, as the existing thumbnail is bad (i.e. need a better one). 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(thumbnail_service->ShouldAcquirePageThumbnail(kGoodURL)); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace the thumbnail score with a really good one. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore good_score; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) good_score.time_at_snapshot = base::Time::Now(); // Very new. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) good_score.at_top = true; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) good_score.good_clipping = true; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) good_score.boring_score = 0.0; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) good_score.load_completed = true; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile.AddKnownURL(kGoodURL, good_score); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should be false, as the existing thumbnail is good enough (i.e. don't 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to replace the existing thumbnail which is new and good). 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(thumbnail_service->ShouldAcquirePageThumbnail(kGoodURL)); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 127