Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <map> | 5 #include <map> |
| 6 | 6 |
| 7 #include "base/file_path.h" | 7 #include "base/file_path.h" |
| 8 #include "base/memory/scoped_callback_factory.h" | 8 #include "base/memory/scoped_callback_factory.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/message_loop_proxy.h" | 10 #include "base/message_loop_proxy.h" |
| 11 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
| 12 #include "net/base/net_errors.h" | |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 13 #include "webkit/database/database_quota_client.h" | 14 #include "webkit/database/database_quota_client.h" |
| 14 #include "webkit/database/database_tracker.h" | 15 #include "webkit/database/database_tracker.h" |
| 15 #include "webkit/database/database_util.h" | 16 #include "webkit/database/database_util.h" |
| 16 | 17 |
| 17 namespace webkit_database { | 18 namespace webkit_database { |
| 18 | 19 |
| 19 // Declared to shorten the line lengths. | 20 // Declared to shorten the line lengths. |
| 20 static const quota::StorageType kTemp = quota::kStorageTypeTemporary; | 21 static const quota::StorageType kTemp = quota::kStorageTypeTemporary; |
| 21 static const quota::StorageType kPerm = quota::kStorageTypePersistent; | 22 static const quota::StorageType kPerm = quota::kStorageTypePersistent; |
| 22 | 23 |
| 23 // Mock tracker class the mocks up those methods of the tracker | 24 // Mock tracker class the mocks up those methods of the tracker |
| 24 // that are used by the QuotaClient. | 25 // that are used by the QuotaClient. |
| 25 class MockDatabaseTracker : public DatabaseTracker { | 26 class MockDatabaseTracker : public DatabaseTracker { |
| 26 public: | 27 public: |
| 27 MockDatabaseTracker() | 28 MockDatabaseTracker() |
| 28 : DatabaseTracker(FilePath(), false, NULL, NULL, NULL) {} | 29 : DatabaseTracker(FilePath(), false, NULL, NULL, NULL), |
| 30 delete_called_count_(0), | |
| 31 async_delete_(false) {} | |
| 29 | 32 |
| 30 virtual ~MockDatabaseTracker() {} | 33 virtual ~MockDatabaseTracker() {} |
| 31 | 34 |
| 32 virtual bool GetOriginInfo( | 35 virtual bool GetOriginInfo( |
| 33 const string16& origin_identifier, | 36 const string16& origin_identifier, |
| 34 OriginInfo* info) OVERRIDE { | 37 OriginInfo* info) OVERRIDE { |
| 35 std::map<GURL, MockOriginInfo>::const_iterator found = | 38 std::map<GURL, MockOriginInfo>::const_iterator found = |
| 36 mock_origin_infos_.find( | 39 mock_origin_infos_.find( |
| 37 DatabaseUtil::GetOriginFromIdentifier(origin_identifier)); | 40 DatabaseUtil::GetOriginFromIdentifier(origin_identifier)); |
| 38 if (found == mock_origin_infos_.end()) | 41 if (found == mock_origin_infos_.end()) |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 56 std::vector<OriginInfo>* origins_info) OVERRIDE { | 59 std::vector<OriginInfo>* origins_info) OVERRIDE { |
| 57 std::map<GURL, MockOriginInfo>::const_iterator iter; | 60 std::map<GURL, MockOriginInfo>::const_iterator iter; |
| 58 for (iter = mock_origin_infos_.begin(); | 61 for (iter = mock_origin_infos_.begin(); |
| 59 iter != mock_origin_infos_.end(); | 62 iter != mock_origin_infos_.end(); |
| 60 ++iter) { | 63 ++iter) { |
| 61 origins_info->push_back(OriginInfo(iter->second)); | 64 origins_info->push_back(OriginInfo(iter->second)); |
| 62 } | 65 } |
| 63 return true; | 66 return true; |
| 64 } | 67 } |
| 65 | 68 |
| 69 virtual int DeleteDataForOrigin( | |
|
michaeln
2011/05/21 03:27:25
oh... i need to include a change in database_track
| |
| 70 const string16& origin_id, | |
| 71 net::CompletionCallback* callback) { | |
| 72 ++delete_called_count_; | |
| 73 if (async_delete()) { | |
| 74 base::MessageLoopProxy::CreateForCurrentThread()->PostTask(FROM_HERE, | |
| 75 NewRunnableMethod(this, | |
| 76 &MockDatabaseTracker::AsyncDeleteDataForOrigin, callback)); | |
| 77 return net::ERR_IO_PENDING; | |
| 78 } | |
| 79 return net::OK; | |
| 80 } | |
| 81 | |
| 82 void AsyncDeleteDataForOrigin(net::CompletionCallback* callback) { | |
| 83 callback->Run(net::OK); | |
| 84 } | |
| 85 | |
| 66 void AddMockDatabase(const GURL& origin, const char* name, int size) { | 86 void AddMockDatabase(const GURL& origin, const char* name, int size) { |
| 67 MockOriginInfo& info = mock_origin_infos_[origin]; | 87 MockOriginInfo& info = mock_origin_infos_[origin]; |
| 68 info.set_origin(DatabaseUtil::GetOriginIdentifier(origin)); | 88 info.set_origin(DatabaseUtil::GetOriginIdentifier(origin)); |
| 69 info.AddMockDatabase(ASCIIToUTF16(name), size); | 89 info.AddMockDatabase(ASCIIToUTF16(name), size); |
| 70 } | 90 } |
| 71 | 91 |
| 92 int delete_called_count() { return delete_called_count_; } | |
| 93 bool async_delete() { return async_delete_; } | |
| 94 void set_async_delete(bool async) { async_delete_ = async; } | |
| 95 | |
| 72 private: | 96 private: |
| 73 class MockOriginInfo : public OriginInfo { | 97 class MockOriginInfo : public OriginInfo { |
| 74 public: | 98 public: |
| 75 void set_origin(const string16& origin_id) { | 99 void set_origin(const string16& origin_id) { |
| 76 origin_ = origin_id; | 100 origin_ = origin_id; |
| 77 } | 101 } |
| 78 | 102 |
| 79 void AddMockDatabase(const string16& name, int size) { | 103 void AddMockDatabase(const string16& name, int size) { |
| 80 EXPECT_TRUE(database_info_.find(name) == database_info_.end()); | 104 EXPECT_TRUE(database_info_.find(name) == database_info_.end()); |
| 81 database_info_[name].first = size; | 105 database_info_[name].first = size; |
| 82 total_size_ += size; | 106 total_size_ += size; |
| 83 } | 107 } |
| 84 }; | 108 }; |
| 85 | 109 |
| 110 int delete_called_count_; | |
| 111 bool async_delete_; | |
| 86 std::map<GURL, MockOriginInfo> mock_origin_infos_; | 112 std::map<GURL, MockOriginInfo> mock_origin_infos_; |
| 87 }; | 113 }; |
| 88 | 114 |
| 89 | 115 |
| 90 // Base class for our test fixtures. | 116 // Base class for our test fixtures. |
| 91 class DatabaseQuotaClientTest : public testing::Test { | 117 class DatabaseQuotaClientTest : public testing::Test { |
| 92 public: | 118 public: |
| 93 const GURL kOriginA; | 119 const GURL kOriginA; |
| 94 const GURL kOriginB; | 120 const GURL kOriginB; |
| 95 const GURL kOriginOther; | 121 const GURL kOriginOther; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 114 MessageLoop::current()->RunAllPending(); | 140 MessageLoop::current()->RunAllPending(); |
| 115 return usage_; | 141 return usage_; |
| 116 } | 142 } |
| 117 | 143 |
| 118 const std::set<GURL>& GetOriginsForType( | 144 const std::set<GURL>& GetOriginsForType( |
| 119 quota::QuotaClient* client, | 145 quota::QuotaClient* client, |
| 120 quota::StorageType type) { | 146 quota::StorageType type) { |
| 121 origins_.clear(); | 147 origins_.clear(); |
| 122 client->GetOriginsForType(type, | 148 client->GetOriginsForType(type, |
| 123 callback_factory_.NewCallback( | 149 callback_factory_.NewCallback( |
| 124 &DatabaseQuotaClientTest::OnGetOriginsComplete)); | 150 &DatabaseQuotaClientTest::OnGetOriginsComplete)); |
| 125 MessageLoop::current()->RunAllPending(); | 151 MessageLoop::current()->RunAllPending(); |
| 126 return origins_; | 152 return origins_; |
| 127 } | 153 } |
| 128 | 154 |
| 129 const std::set<GURL>& GetOriginsForHost( | 155 const std::set<GURL>& GetOriginsForHost( |
| 130 quota::QuotaClient* client, | 156 quota::QuotaClient* client, |
| 131 quota::StorageType type, | 157 quota::StorageType type, |
| 132 const std::string& host) { | 158 const std::string& host) { |
| 133 origins_.clear(); | 159 origins_.clear(); |
| 134 client->GetOriginsForHost(type, host, | 160 client->GetOriginsForHost(type, host, |
| 135 callback_factory_.NewCallback( | 161 callback_factory_.NewCallback( |
| 136 &DatabaseQuotaClientTest::OnGetOriginsComplete)); | 162 &DatabaseQuotaClientTest::OnGetOriginsComplete)); |
| 137 MessageLoop::current()->RunAllPending(); | 163 MessageLoop::current()->RunAllPending(); |
| 138 return origins_; | 164 return origins_; |
| 139 } | 165 } |
| 140 | 166 |
| 167 bool DeleteOriginData( | |
| 168 quota::QuotaClient* client, | |
| 169 quota::StorageType type, | |
| 170 const GURL& origin) { | |
| 171 delete_status_ = quota::kQuotaStatusUnknown; | |
| 172 client->DeleteOriginData(origin, type, | |
| 173 callback_factory_.NewCallback( | |
| 174 &DatabaseQuotaClientTest::OnDeleteOriginDataComplete)); | |
| 175 MessageLoop::current()->RunAllPending(); | |
| 176 return delete_status_ == quota::kQuotaStatusOk; | |
| 177 } | |
| 178 | |
| 141 MockDatabaseTracker* mock_tracker() { return mock_tracker_.get(); } | 179 MockDatabaseTracker* mock_tracker() { return mock_tracker_.get(); } |
| 142 | 180 |
| 143 | 181 |
| 144 private: | 182 private: |
| 145 void OnGetOriginUsageComplete(int64 usage) { | 183 void OnGetOriginUsageComplete(int64 usage) { |
| 146 usage_ = usage; | 184 usage_ = usage; |
| 147 } | 185 } |
| 148 | 186 |
| 149 void OnGetOriginsComplete(const std::set<GURL>& origins) { | 187 void OnGetOriginsComplete(const std::set<GURL>& origins) { |
| 150 origins_ = origins; | 188 origins_ = origins; |
| 151 } | 189 } |
| 152 | 190 |
| 191 void OnDeleteOriginDataComplete(quota::QuotaStatusCode status) { | |
| 192 delete_status_ = status; | |
| 193 } | |
| 194 | |
| 153 int64 usage_; | 195 int64 usage_; |
| 154 std::set<GURL> origins_; | 196 std::set<GURL> origins_; |
| 197 quota::QuotaStatusCode delete_status_; | |
| 155 scoped_refptr<MockDatabaseTracker> mock_tracker_; | 198 scoped_refptr<MockDatabaseTracker> mock_tracker_; |
| 156 base::ScopedCallbackFactory<DatabaseQuotaClientTest> callback_factory_; | 199 base::ScopedCallbackFactory<DatabaseQuotaClientTest> callback_factory_; |
| 157 }; | 200 }; |
| 158 | 201 |
| 159 | 202 |
| 160 TEST_F(DatabaseQuotaClientTest, GetOriginUsage) { | 203 TEST_F(DatabaseQuotaClientTest, GetOriginUsage) { |
| 161 DatabaseQuotaClient client( | 204 DatabaseQuotaClient client( |
| 162 base::MessageLoopProxy::CreateForCurrentThread(), | 205 base::MessageLoopProxy::CreateForCurrentThread(), |
| 163 mock_tracker()); | 206 mock_tracker()); |
| 164 | 207 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 208 EXPECT_TRUE(GetOriginsForType(&client, kPerm).empty()); | 251 EXPECT_TRUE(GetOriginsForType(&client, kPerm).empty()); |
| 209 | 252 |
| 210 mock_tracker()->AddMockDatabase(kOriginA, "fooDB", 1000); | 253 mock_tracker()->AddMockDatabase(kOriginA, "fooDB", 1000); |
| 211 std::set<GURL> origins = GetOriginsForType(&client, kTemp); | 254 std::set<GURL> origins = GetOriginsForType(&client, kTemp); |
| 212 EXPECT_EQ(origins.size(), 1ul); | 255 EXPECT_EQ(origins.size(), 1ul); |
| 213 EXPECT_TRUE(origins.find(kOriginA) != origins.end()); | 256 EXPECT_TRUE(origins.find(kOriginA) != origins.end()); |
| 214 | 257 |
| 215 EXPECT_TRUE(GetOriginsForType(&client, kPerm).empty()); | 258 EXPECT_TRUE(GetOriginsForType(&client, kPerm).empty()); |
| 216 } | 259 } |
| 217 | 260 |
| 261 TEST_F(DatabaseQuotaClientTest, DeleteOriginData) { | |
| 262 DatabaseQuotaClient client( | |
| 263 base::MessageLoopProxy::CreateForCurrentThread(), | |
| 264 mock_tracker()); | |
| 265 | |
| 266 // Perm deletions are short circuited in the Client and | |
| 267 // should not reach the DatabaseTracker. | |
| 268 EXPECT_TRUE(DeleteOriginData(&client, kPerm, kOriginA)); | |
| 269 EXPECT_EQ(0, mock_tracker()->delete_called_count()); | |
| 270 | |
| 271 mock_tracker()->set_async_delete(false); | |
| 272 EXPECT_TRUE(DeleteOriginData(&client, kTemp, kOriginA)); | |
| 273 EXPECT_EQ(1, mock_tracker()->delete_called_count()); | |
| 274 | |
| 275 mock_tracker()->set_async_delete(true); | |
| 276 EXPECT_TRUE(DeleteOriginData(&client, kTemp, kOriginA)); | |
| 277 EXPECT_EQ(2, mock_tracker()->delete_called_count()); | |
| 278 } | |
| 279 | |
| 218 } // namespace webkit_database | 280 } // namespace webkit_database |
| OLD | NEW |