1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <string> 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/file_path.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/run_loop.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/profiles/profile.h" 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/search/suggestions/image_manager_impl.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/browser.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/leveldb_proto/proto_database.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/leveldb_proto/testing/fake_db.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/suggestions/proto/suggestions.pb.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/test/test_utils.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/base/load_flags.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "url/gurl.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace suggestions { 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kTestUrl1[] = "http://go.com/"; 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kTestUrl2[] = "http://goal.com/"; 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kTestBitmapUrl[] = "http://test.com"; 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kTestImagePath[] = "files/image_decoding/droids.png"; 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kInvalidImagePath[] = "files/DOESNOTEXIST"; 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const base::FilePath::CharType kDocRoot[] = 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FILE_PATH_LITERAL("chrome/test/data"); 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing chrome::BitmapFetcher; 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using content::BrowserThread; 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing leveldb_proto::test::FakeDB; 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using suggestions::ImageData; 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using suggestions::ImageManagerImpl; 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)typedef base::hash_map<std::string, ImageData> EntryMap; 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void AddEntry(const ImageData& d, EntryMap* map) { (*map)[d.url()] = d; } 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class ImageManagerImplBrowserTest : public InProcessBrowserTest { 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ImageManagerImplBrowserTest() 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : num_callback_null_called_(0), 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch num_callback_valid_called_(0), 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_server_(net::SpawnedTestServer::TYPE_HTTP, 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch net::SpawnedTestServer::kLocalhost, 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath(kDocRoot)) {} 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(test_server_.Start()); 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InProcessBrowserTest::SetUpInProcessBrowserTestFixture(); 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_server_.Stop(); 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void SetUpOnMainThread() OVERRIDE { 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) fake_db_ = new FakeDB<ImageData>(&db_model_); 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) image_manager_.reset(CreateImageManagerImpl(fake_db_)); 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void TearDownOnMainThread() OVERRIDE { 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fake_db_ = NULL; 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch db_model_.clear(); 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) image_manager_.reset(); 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) test_image_manager_.reset(); 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void InitializeTestBitmapData() { 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FakeDB<ImageData>* test_fake_db = new FakeDB<ImageData>(&db_model_); 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) test_image_manager_.reset(CreateImageManagerImpl(test_fake_db)); 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestions::SuggestionsProfile suggestions_profile; 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestions::ChromeSuggestion* suggestion = 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestions_profile.add_suggestions(); 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestion->set_url(kTestBitmapUrl); 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestion->set_thumbnail(test_server_.GetURL(kTestImagePath).spec()); 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) test_image_manager_->Initialize(suggestions_profile); 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Initialize empty database. 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_fake_db->InitCallback(true); 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_fake_db->LoadCallback(true); 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop run_loop; 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Fetch existing URL. 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) test_image_manager_->GetImageForURL( 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kTestBitmapUrl), 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind(&ImageManagerImplBrowserTest::OnTestImageAvailable, 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(this), &run_loop)); 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop.Run(); 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void OnTestImageAvailable(base::RunLoop* loop, const GURL& url, 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const SkBitmap* bitmap) { 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(bitmap); 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Copy the resource locally. 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_bitmap_ = *bitmap; 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch loop->Quit(); 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void InitializeDefaultImageMapAndDatabase( 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ImageManagerImpl* image_manager, FakeDB<ImageData>* fake_db) { 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CHECK(image_manager); 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(fake_db); 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestions::SuggestionsProfile suggestions_profile; 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestions::ChromeSuggestion* suggestion = 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestions_profile.add_suggestions(); 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestion->set_url(kTestUrl1); 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestion->set_thumbnail(test_server_.GetURL(kTestImagePath).spec()); 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) image_manager->Initialize(suggestions_profile); 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Initialize empty database. 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fake_db->InitCallback(true); 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fake_db->LoadCallback(true); 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ImageData GetSampleImageData(const std::string& url) { 1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ImageData data; 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data.set_url(url); 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<unsigned char> encoded; 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(ImageManagerImpl::EncodeImage(test_bitmap_, &encoded)); 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch data.set_data(std::string(encoded.begin(), encoded.end())); 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return data; 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void OnImageAvailable(base::RunLoop* loop, const GURL& url, 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const SkBitmap* bitmap) { 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (bitmap) { 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_callback_valid_called_++; 1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::vector<unsigned char> actual; 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<unsigned char> expected; 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(ImageManagerImpl::EncodeImage(*bitmap, &actual)); 1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(ImageManagerImpl::EncodeImage(test_bitmap_, &expected)); 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Check first 100 bytes. 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string actual_str(actual.begin(), actual.begin() + 100); 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string expected_str(expected.begin(), expected.begin() + 100); 1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(expected_str, actual_str); 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_callback_null_called_++; 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch loop->Quit(); 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ImageManagerImpl* CreateImageManagerImpl(FakeDB<ImageData>* fake_db) { 1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return new ImageManagerImpl( 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser()->profile()->GetRequestContext(), 1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<leveldb_proto::ProtoDatabase<ImageData> >(fake_db), 1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FakeDB<ImageData>::DirectoryForTestDB()); 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EntryMap db_model_; 1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Owned by the ImageManagerImpl under test. 1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FakeDB<ImageData>* fake_db_; 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SkBitmap test_bitmap_; 1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ImageManagerImpl> test_image_manager_; 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int num_callback_null_called_; 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int num_callback_valid_called_; 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::SpawnedTestServer test_server_; 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Under test. 1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ImageManagerImpl> image_manager_; 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest, GetImageForURLNetwork) { 1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) InitializeTestBitmapData(); 1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) InitializeDefaultImageMapAndDatabase(image_manager_.get(), fake_db_); 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop run_loop; 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Fetch existing URL. 1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) image_manager_->GetImageForURL( 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL(kTestUrl1), 1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable, 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(this), &run_loop)); 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop.Run(); 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, num_callback_null_called_); 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, num_callback_valid_called_); 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop run_loop2; 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Fetch non-existing URL. 1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) image_manager_->GetImageForURL( 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL(kTestUrl2), 1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable, 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(this), &run_loop2)); 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop2.Run(); 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, num_callback_null_called_); 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, num_callback_valid_called_); 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest, 2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetImageForURLNetworkMultiple) { 2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) InitializeTestBitmapData(); 2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) InitializeDefaultImageMapAndDatabase(image_manager_.get(), fake_db_); 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Fetch non-existing URL, and add more while request is in flight. 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop run_loop; 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (int i = 0; i < 5; i++) { 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Fetch existing URL. 2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) image_manager_->GetImageForURL( 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kTestUrl1), 2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable, 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(this), &run_loop)); 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop.Run(); 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, num_callback_null_called_); 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(5, num_callback_valid_called_); 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest, 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetImageForURLNetworkInvalid) { 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SuggestionsProfile suggestions_profile; 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ChromeSuggestion* suggestion = suggestions_profile.add_suggestions(); 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) suggestion->set_url(kTestUrl1); 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) suggestion->set_thumbnail(test_server_.GetURL(kInvalidImagePath).spec()); 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) image_manager_->Initialize(suggestions_profile); 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Database will be initialized and loaded without anything in it. 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fake_db_->InitCallback(true); 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fake_db_->LoadCallback(true); 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop run_loop; 2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Fetch existing URL that has invalid image. 2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) image_manager_->GetImageForURL( 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL(kTestUrl1), 2376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable, 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(this), &run_loop)); 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop.Run(); 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, num_callback_null_called_); 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, num_callback_valid_called_); 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ImageManagerImplBrowserTest, 2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetImageForURLNetworkCacheHit) { 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InitializeTestBitmapData(); 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SuggestionsProfile suggestions_profile; 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChromeSuggestion* suggestion = suggestions_profile.add_suggestions(); 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestion->set_url(kTestUrl1); 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The URL we set is invalid, to show that it will fail from network. 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch suggestion->set_thumbnail(test_server_.GetURL(kInvalidImagePath).spec()); 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Create the ImageManagerImpl with an added entry in the database. 2566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AddEntry(GetSampleImageData(kTestUrl1), &db_model_); 2576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FakeDB<ImageData>* fake_db = new FakeDB<ImageData>(&db_model_); 2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) image_manager_.reset(CreateImageManagerImpl(fake_db)); 2596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) image_manager_->Initialize(suggestions_profile); 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fake_db->InitCallback(true); 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fake_db->LoadCallback(true); 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Expect something in the cache. 2636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SkBitmap* bitmap = image_manager_->GetBitmapFromCache(GURL(kTestUrl1)); 264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(bitmap->isNull()); 265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::RunLoop run_loop; 2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) image_manager_->GetImageForURL( 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL(kTestUrl1), 2696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind(&ImageManagerImplBrowserTest::OnImageAvailable, 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Unretained(this), &run_loop)); 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch run_loop.Run(); 272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0, num_callback_null_called_); 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(1, num_callback_valid_called_); 275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace suggestions 278