summaryrefslogtreecommitdiffstats
path: root/chrome/browser/thumbnail_store_unittest.cc
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-04 21:43:53 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-04 21:43:53 +0000
commit1984a5fb88d86ccd8289917caa3f64f4a4afc297 (patch)
tree4c86f01bfa844798b0a2579f9036b2169c3117e5 /chrome/browser/thumbnail_store_unittest.cc
parenta2068a61d67a2e90789e45a8073e631899bdeb9c (diff)
downloadchromium_src-1984a5fb88d86ccd8289917caa3f64f4a4afc297.zip
chromium_src-1984a5fb88d86ccd8289917caa3f64f4a4afc297.tar.gz
chromium_src-1984a5fb88d86ccd8289917caa3f64f4a4afc297.tar.bz2
Implement a first pass at thumbnail store storage to disk, including a unit test for the new behavior.
TEST=covered by unittest BUG=none git-svn-id: svn://svn.chromium.org/chrome/trunk/src@17670 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/thumbnail_store_unittest.cc')
-rw-r--r--chrome/browser/thumbnail_store_unittest.cc174
1 files changed, 174 insertions, 0 deletions
diff --git a/chrome/browser/thumbnail_store_unittest.cc b/chrome/browser/thumbnail_store_unittest.cc
new file mode 100644
index 0000000..53ec322
--- /dev/null
+++ b/chrome/browser/thumbnail_store_unittest.cc
@@ -0,0 +1,174 @@
+// Copyright (c) 2009 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 <string.h>
+#include <iostream>
+
+#include "chrome/browser/thumbnail_store.h"
+
+#include "base/time.h"
+#include "base/file_path.h"
+#include "base/file_util.h"
+#include "base/gfx/jpeg_codec.h"
+#include "base/path_service.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/common/thumbnail_score.h"
+#include "chrome/tools/profiles/thumbnail-inl.h"
+#include "googleurl/src/gurl.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkPixelRef.h"
+
+inline unsigned int diff(unsigned int a, unsigned int b) {
+ return a>b ? a-b : b-a;
+}
+
+class ThumbnailStoreTest : public testing::Test {
+ public:
+ ThumbnailStoreTest() : score1_(.5, true, false),
+ url1_("http://www.google.com"), url2_("http://www.elgoog.com") {
+ }
+ ~ThumbnailStoreTest() {
+ }
+
+ protected:
+ void SetUp();
+
+ void TearDown() {
+ file_util::Delete(file_path_.AppendASCII(url1_.host()), false);
+ file_util::Delete(file_path_.AppendASCII(url2_.host()), false);
+ }
+
+ // Compute the max difference over all pixels for each RGBA component.
+ void PrintPixelDiff(SkBitmap* image_a, SkBitmap* image_b);
+
+ // The directory where ThumbnailStore will store data.
+ FilePath file_path_;
+
+ SkBitmap read_image_, image_enc_dec_, image_;
+ ThumbnailScore score1_, score2_;
+ GURL url1_, url2_;
+ base::Time time_;
+};
+
+void ThumbnailStoreTest::SetUp() {
+ if (!file_util::GetTempDir(&file_path_))
+ FAIL();
+
+ // Delete any old thumbnail files if they exist.
+ file_util::Delete(file_path_.AppendASCII(url1_.host()), false);
+ file_util::Delete(file_path_.AppendASCII(url2_.host()), false);
+
+ // image is the original SkBitmap representing the thumbnail
+ image_ = *(JPEGCodec::Decode(kGoogleThumbnail, sizeof(kGoogleThumbnail)));
+
+ // The ThumbnailStore will encode the thumbnail to jpeg at 90% quality, so
+ // we do this to image. When image is stored, image_enc_dec_ is what
+ // ThumbnailStore should return.
+ std::vector<unsigned char> jpeg_data;
+ SkAutoLockPixels thumbnail_lock(image_);
+ bool encoded = JPEGCodec::Encode(
+ reinterpret_cast<unsigned char*>(image_.getAddr32(0, 0)),
+ JPEGCodec::FORMAT_BGRA, image_.width(),
+ image_.height(),
+ static_cast<int>(image_.rowBytes()), 90,
+ &jpeg_data);
+
+ image_enc_dec_ = *(JPEGCodec::Decode(
+ reinterpret_cast<const unsigned char*>(&jpeg_data[0]),
+ jpeg_data.size()));
+}
+
+void ThumbnailStoreTest::PrintPixelDiff(SkBitmap* image_a, SkBitmap* image_b) {
+ // Compute the maximum difference in each of the RGBA components across all
+ // pixels between the retrieved SkBitmap and the original. These
+ // differences should be small since encoding was done at 90% before
+ // writing to disk.
+
+ SkAutoLockPixels lock_a(*image_a);
+ SkAutoLockPixels lock_b(*image_b);
+
+ int ppr = read_image_.rowBytesAsPixels();
+ unsigned int *a, *b;
+ unsigned int maxv[4];
+ memset(maxv, 0, sizeof(maxv));
+
+ for (int nrows = read_image_.height()-1; nrows >= 0; nrows--) {
+ a = image_a->getAddr32(0, nrows);
+ b = image_b->getAddr32(0, nrows);
+ for (int i = 0; i < ppr; i += 4) {
+ for (int j = 0; j < 4; j++) {
+ maxv[j] = std::max(diff(*(a+i) >> (j<<3) & 0xff,
+ *(b+i) >> (j<<3) & 0xff),
+ maxv[j]);
+ }
+ }
+ }
+
+ std::cout << "Max diff btwn original and encoded image (b,g,r,a) = ("
+ << maxv[0] << ","
+ << maxv[1] << ","
+ << maxv[2] << ","
+ << maxv[3] << ")" << std::endl;
+}
+
+TEST_F(ThumbnailStoreTest, RetrieveFromCache) {
+ ThumbnailStore* store = new ThumbnailStore;
+ store->AddRef();
+ store->file_path_ = file_path_;
+ store->cache_.reset(new ThumbnailStore::Cache);
+ store->cache_initialized_ = true;
+
+ read_image_.reset();
+
+ // Retrieve a thumbnail/score for a nonexistent page.
+
+ EXPECT_FALSE(store->GetPageThumbnail(url2_, &read_image_, &score2_));
+
+ // Store a thumbnail into the cache and retrieve it.
+
+ EXPECT_TRUE(store->SetPageThumbnail(url1_, image_, score1_, false));
+ EXPECT_TRUE(store->GetPageThumbnail(url1_, &read_image_, &score2_));
+ EXPECT_TRUE(score1_.Equals(score2_));
+ EXPECT_TRUE(read_image_.getSize() == image_.getSize());
+ EXPECT_TRUE(read_image_.pixelRef() == image_.pixelRef());
+ EXPECT_FALSE(read_image_.isNull());
+
+ store->Release();
+}
+
+TEST_F(ThumbnailStoreTest, RetrieveFromDisk) {
+ ThumbnailStore* store = new ThumbnailStore;
+ store->AddRef();
+ store->file_path_ = file_path_;
+ store->cache_.reset(new ThumbnailStore::Cache);
+ store->cache_initialized_ = true;
+
+ read_image_.reset();
+
+ // Store a thumbnail onto the disk and retrieve it.
+
+ EXPECT_TRUE(store->SetPageThumbnail(url1_, image_, score1_, false));
+ EXPECT_TRUE(store->WriteThumbnailToDisk(url1_));
+ EXPECT_TRUE(store->GetPageThumbnailFromDisk(
+ file_path_.AppendASCII(url1_.host()), &url2_, &read_image_, &score2_));
+ EXPECT_TRUE(url1_ == url2_);
+ EXPECT_TRUE(score1_.Equals(score2_));
+ EXPECT_TRUE(read_image_.getSize() == image_enc_dec_.getSize());
+ EXPECT_FALSE(read_image_.isNull());
+
+ // The retrieved SkBitmap should be the same as the original image
+ // encoded at 90% quality to jpeg, then decoded.
+
+ {
+ SkAutoLockPixels lock_a(read_image_);
+ SkAutoLockPixels lock_b(image_enc_dec_);
+ EXPECT_TRUE(0 == memcmp(read_image_.getPixels(),
+ image_enc_dec_.getPixels(),
+ read_image_.getSize()));
+ }
+ PrintPixelDiff(&read_image_, &image_);
+
+ store->Release();
+}