| Index: components/bookmarks_enhanced/image_store_unittest.cc
|
| diff --git a/components/bookmarks_enhanced/image_store_unittest.cc b/components/bookmarks_enhanced/image_store_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2a1173b448b2f0a4a9d7643ecd6647fe0f0a6809
|
| --- /dev/null
|
| +++ b/components/bookmarks_enhanced/image_store_unittest.cc
|
| @@ -0,0 +1,207 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "components/bookmarks_enhanced/image_store.h"
|
| +
|
| +#include "base/files/scoped_temp_dir.h"
|
| +#include "components/bookmarks_enhanced/image_store_util.h"
|
| +#include "components/bookmarks_enhanced/memory_image_store.h"
|
| +#include "components/bookmarks_enhanced/persistent_image_store.h"
|
| +#include "testing/platform_test.h"
|
| +#include "third_party/skia/include/core/SkBitmap.h"
|
| +#include "url/gurl.h"
|
| +
|
| +namespace {
|
| +
|
| +const SkBitmap CreateBitmap(int width, int height, int a, int r, int g, int b) {
|
| + SkBitmap bitmap;
|
| + bitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
|
| + bitmap.allocPixels();
|
| + bitmap.eraseARGB(a, r, g, b);
|
| + return bitmap;
|
| +}
|
| +
|
| +gfx::Image GenerateWhiteImage() {
|
| + return gfx::Image::CreateFrom1xBitmap(
|
| + CreateBitmap(42, 24, 255, 255, 255, 255));
|
| +}
|
| +
|
| +gfx::Image GenerateBlackImage(int width, int height) {
|
| + return gfx::Image::CreateFrom1xBitmap(
|
| + CreateBitmap(width, height, 255, 0, 0, 0));
|
| +}
|
| +
|
| +gfx::Image GenerateBlackImage() {
|
| + return GenerateBlackImage(42, 24);
|
| +}
|
| +
|
| +// Returns true if the two images are identical.
|
| +bool CompareImages(const gfx::Image& image_1, const gfx::Image& image_2) {
|
| + if (image_1.IsEmpty() && image_2.IsEmpty())
|
| + return true;
|
| +
|
| + if (image_1.IsEmpty() || image_2.IsEmpty())
|
| + return false;
|
| +
|
| + scoped_refptr<base::RefCountedMemory> image_1_png =
|
| + bookmarks_enhanced::BytesForImage(image_1);
|
| + scoped_refptr<base::RefCountedMemory> image_2_png =
|
| + bookmarks_enhanced::BytesForImage(image_2);
|
| +
|
| + if (image_1_png->size() != image_2_png->size())
|
| + return false;
|
| +
|
| + return !memcmp(image_1_png->front(),
|
| + image_2_png->front(),
|
| + image_1_png->size());
|
| +}
|
| +
|
| +// Factory functions for creating instances of the implementations.
|
| +template <class T>
|
| +scoped_refptr<ImageStore> createStore(base::ScopedTempDir& folder);
|
| +
|
| +template <>
|
| +scoped_refptr<ImageStore> createStore<MemoryImageStore>(
|
| + base::ScopedTempDir& folder) {
|
| + return scoped_refptr<ImageStore>(new MemoryImageStore());
|
| +}
|
| +
|
| +template <>
|
| +scoped_refptr<ImageStore> createStore<PersistentImageStore>(
|
| + base::ScopedTempDir& folder) {
|
| + return scoped_refptr<ImageStore>(new PersistentImageStore(folder.path()));
|
| +}
|
| +
|
| +// Methods to check if persistence is on or not.
|
| +template <class T> bool shouldPersist();
|
| +template <> bool shouldPersist<MemoryImageStore>() { return false; }
|
| +template <> bool shouldPersist<PersistentImageStore>() { return true; }
|
| +
|
| +// Test fixture class template for the abstract API.
|
| +template <class T>
|
| +class ImageStoreUnitTest : public PlatformTest {
|
| + protected:
|
| + ImageStoreUnitTest() {}
|
| + virtual ~ImageStoreUnitTest() {}
|
| +
|
| + virtual void SetUp() {
|
| + bool success = tempDir_.CreateUniqueTempDir();
|
| + ASSERT_TRUE(success);
|
| + store_ = createStore<T>(tempDir_);
|
| + }
|
| +
|
| + void TearDown() OVERRIDE {
|
| + if (store_ && usePersistentStore())
|
| + store_->ClearAll();
|
| + }
|
| +
|
| + bool usePersistentStore() { return shouldPersist<T>(); }
|
| + void resetStore() { store_ = createStore<T>(tempDir_); }
|
| +
|
| + // The directory the database is saved into.
|
| + base::ScopedTempDir tempDir_;
|
| + // The object the fixture is testing, via its base interface.
|
| + scoped_refptr<ImageStore> store_;
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(ImageStoreUnitTest);
|
| +};
|
| +
|
| +// The list of implementations of the abstract API that are going to be tested.
|
| +typedef testing::Types<MemoryImageStore,
|
| + PersistentImageStore> Implementations;
|
| +
|
| +TYPED_TEST_CASE(ImageStoreUnitTest, Implementations);
|
| +
|
| +// All those tests are run on all the implementations.
|
| +TYPED_TEST(ImageStoreUnitTest, startsEmpty) {
|
| + std::set<GURL> all_urls;
|
| + this->store_->GetAllPageUrls(&all_urls);
|
| + EXPECT_EQ(0u, all_urls.size());
|
| +}
|
| +
|
| +TYPED_TEST(ImageStoreUnitTest, storeOne) {
|
| + this->store_->Insert(GURL("foo://bar"), GURL("a.jpg"), GenerateBlackImage());
|
| +
|
| + std::set<GURL> all_urls;
|
| + this->store_->GetAllPageUrls(&all_urls);
|
| + EXPECT_EQ(1u, all_urls.size());
|
| + EXPECT_EQ(GURL("foo://bar"), *all_urls.begin());
|
| + EXPECT_TRUE(this->store_->HasKey(GURL("foo://bar")));
|
| +}
|
| +
|
| +TYPED_TEST(ImageStoreUnitTest, retrieve) {
|
| + gfx::Image src_image = GenerateBlackImage(42, 24);
|
| + const GURL url("foo://bar");
|
| + const GURL image_url("a.jpg");
|
| + this->store_->Insert(url, image_url, src_image);
|
| +
|
| + std::pair<gfx::Image, GURL> image_info = this->store_->Get(url);
|
| + gfx::Size size = this->store_->GetSize(url);
|
| +
|
| + EXPECT_EQ(size.width(), 42);
|
| + EXPECT_EQ(size.height(), 24);
|
| + EXPECT_EQ(image_url, image_info.second);
|
| + EXPECT_TRUE(CompareImages(src_image, image_info.first));
|
| +}
|
| +
|
| +TYPED_TEST(ImageStoreUnitTest, erase) {
|
| + gfx::Image src_image = GenerateBlackImage();
|
| + const GURL url("foo://bar");
|
| + const GURL image_url("a.jpg");
|
| + this->store_->Insert(url, image_url, src_image);
|
| + this->store_->Erase(url);
|
| +
|
| + EXPECT_FALSE(this->store_->HasKey(url));
|
| + std::set<GURL> all_urls;
|
| + this->store_->GetAllPageUrls(&all_urls);
|
| + EXPECT_EQ(0u, all_urls.size());
|
| +}
|
| +
|
| +TYPED_TEST(ImageStoreUnitTest, update) {
|
| + gfx::Image src_image1 = GenerateWhiteImage();
|
| + gfx::Image src_image2 = GenerateBlackImage();
|
| + const GURL url("foo://bar");
|
| + const GURL image_url1("1.jpg");
|
| + this->store_->Insert(url, image_url1, src_image1);
|
| +
|
| + const GURL image_url2("2.jpg");
|
| + this->store_->Insert(url, image_url2, src_image2);
|
| +
|
| + std::pair<gfx::Image, GURL> image_info = this->store_->Get(url);
|
| +
|
| + EXPECT_TRUE(this->store_->HasKey(url));
|
| + std::set<GURL> all_urls;
|
| + this->store_->GetAllPageUrls(&all_urls);
|
| + EXPECT_EQ(1u, all_urls.size());
|
| + EXPECT_EQ(image_url2, image_info.second);
|
| + EXPECT_TRUE(CompareImages(src_image2, image_info.first));
|
| +}
|
| +
|
| +TYPED_TEST(ImageStoreUnitTest, persistence) {
|
| + gfx::Image src_image = GenerateBlackImage();
|
| + const GURL url("foo://bar");
|
| + const GURL image_url("a.jpg");
|
| + this->store_->Insert(url, image_url, src_image);
|
| +
|
| + this->resetStore();
|
| + if (this->usePersistentStore()) {
|
| + std::set<GURL> all_urls;
|
| + this->store_->GetAllPageUrls(&all_urls);
|
| + EXPECT_EQ(1u, all_urls.size());
|
| + EXPECT_EQ(GURL("foo://bar"), *all_urls.begin());
|
| + EXPECT_TRUE(this->store_->HasKey(GURL("foo://bar")));
|
| + std::pair<gfx::Image, GURL> image_info = this->store_->Get(url);
|
| +
|
| + EXPECT_EQ(image_url, image_info.second);
|
| + EXPECT_TRUE(CompareImages(src_image, image_info.first));
|
| + } else {
|
| + std::set<GURL> all_urls;
|
| + this->store_->GetAllPageUrls(&all_urls);
|
| + EXPECT_EQ(0u, all_urls.size());
|
| + EXPECT_FALSE(this->store_->HasKey(GURL("foo://bar")));
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
|
|