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