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