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 |