1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/file_util.h" 6#include "base/path_service.h" 7#include "base/string_number_conversions.h" 8#include "base/time.h" 9#include "chrome/browser/webdata/web_database.h" 10#include "chrome/common/chrome_paths.h" 11#include "googleurl/src/gurl.h" 12#include "testing/gtest/include/gtest/gtest.h" 13#include "third_party/skia/include/core/SkBitmap.h" 14 15using base::Time; 16 17class WebAppsTableTest : public testing::Test { 18 public: 19 WebAppsTableTest() {} 20 virtual ~WebAppsTableTest() {} 21 22 protected: 23 virtual void SetUp() { 24 PathService::Get(chrome::DIR_TEST_DATA, &file_); 25 const std::string test_db = "TestWebDatabase" + 26 base::Int64ToString(Time::Now().ToTimeT()) + 27 ".db"; 28 file_ = file_.AppendASCII(test_db); 29 file_util::Delete(file_, false); 30 } 31 32 virtual void TearDown() { 33 file_util::Delete(file_, false); 34 } 35 36 FilePath file_; 37 38 private: 39 DISALLOW_COPY_AND_ASSIGN(WebAppsTableTest); 40}; 41 42 43TEST_F(WebAppsTableTest, WebAppHasAllImages) { 44 WebDatabase db; 45 46 ASSERT_EQ(sql::INIT_OK, db.Init(file_)); 47 GURL url("http://google.com/"); 48 49 // Initial value for unknown web app should be false. 50 EXPECT_FALSE(db.GetWebAppsTable()->GetWebAppHasAllImages(url)); 51 52 // Set the value and make sure it took. 53 EXPECT_TRUE(db.GetWebAppsTable()->SetWebAppHasAllImages(url, true)); 54 EXPECT_TRUE(db.GetWebAppsTable()->GetWebAppHasAllImages(url)); 55 56 // Remove the app and make sure value reverts to default. 57 EXPECT_TRUE(db.GetWebAppsTable()->RemoveWebApp(url)); 58 EXPECT_FALSE(db.GetWebAppsTable()->GetWebAppHasAllImages(url)); 59} 60 61TEST_F(WebAppsTableTest, WebAppImages) { 62 WebDatabase db; 63 64 ASSERT_EQ(sql::INIT_OK, db.Init(file_)); 65 GURL url("http://google.com/"); 66 67 // Web app should initially have no images. 68 std::vector<SkBitmap> images; 69 ASSERT_TRUE(db.GetWebAppsTable()->GetWebAppImages(url, &images)); 70 ASSERT_EQ(0U, images.size()); 71 72 // Add an image. 73 SkBitmap image; 74 image.setConfig(SkBitmap::kARGB_8888_Config, 16, 16); 75 image.allocPixels(); 76 image.eraseColor(SK_ColorBLACK); 77 ASSERT_TRUE(db.GetWebAppsTable()->SetWebAppImage(url, image)); 78 79 // Make sure we get the image back. 80 ASSERT_TRUE(db.GetWebAppsTable()->GetWebAppImages(url, &images)); 81 ASSERT_EQ(1U, images.size()); 82 ASSERT_EQ(16, images[0].width()); 83 ASSERT_EQ(16, images[0].height()); 84 85 // Add another 16x16 image and make sure it replaces the original. 86 image.setConfig(SkBitmap::kARGB_8888_Config, 16, 16); 87 image.allocPixels(); 88 image.eraseColor(SK_ColorBLACK); 89 90 // Set some random pixels so that we can identify the image. We don't use 91 // transparent images because of pre-multiplication rounding errors. 92 SkColor test_pixel_1 = 0xffccbbaa; 93 SkColor test_pixel_2 = 0xffaabbaa; 94 SkColor test_pixel_3 = 0xff339966; 95 image.getAddr32(0, 1)[0] = test_pixel_1; 96 image.getAddr32(0, 1)[1] = test_pixel_2; 97 image.getAddr32(0, 1)[2] = test_pixel_3; 98 99 ASSERT_TRUE(db.GetWebAppsTable()->SetWebAppImage(url, image)); 100 images.clear(); 101 ASSERT_TRUE(db.GetWebAppsTable()->GetWebAppImages(url, &images)); 102 ASSERT_EQ(1U, images.size()); 103 ASSERT_EQ(16, images[0].width()); 104 ASSERT_EQ(16, images[0].height()); 105 images[0].lockPixels(); 106 ASSERT_TRUE(images[0].getPixels() != NULL); 107 ASSERT_EQ(test_pixel_1, images[0].getAddr32(0, 1)[0]); 108 ASSERT_EQ(test_pixel_2, images[0].getAddr32(0, 1)[1]); 109 ASSERT_EQ(test_pixel_3, images[0].getAddr32(0, 1)[2]); 110 images[0].unlockPixels(); 111 112 // Add another image at a bigger size. 113 image.setConfig(SkBitmap::kARGB_8888_Config, 32, 32); 114 image.allocPixels(); 115 image.eraseColor(SK_ColorBLACK); 116 ASSERT_TRUE(db.GetWebAppsTable()->SetWebAppImage(url, image)); 117 118 // Make sure we get both images back. 119 images.clear(); 120 ASSERT_TRUE(db.GetWebAppsTable()->GetWebAppImages(url, &images)); 121 ASSERT_EQ(2U, images.size()); 122 if (images[0].width() == 16) { 123 ASSERT_EQ(16, images[0].width()); 124 ASSERT_EQ(16, images[0].height()); 125 ASSERT_EQ(32, images[1].width()); 126 ASSERT_EQ(32, images[1].height()); 127 } else { 128 ASSERT_EQ(32, images[0].width()); 129 ASSERT_EQ(32, images[0].height()); 130 ASSERT_EQ(16, images[1].width()); 131 ASSERT_EQ(16, images[1].height()); 132 } 133} 134