OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "content/browser/leveldb_wrapper_impl.h" | 5 #include "content/browser/leveldb_wrapper_impl.h" |
6 | 6 |
7 #include "base/debug/stack_trace.h" | 7 #include "base/run_loop.h" |
8 | |
9 #include "components/leveldb/public/cpp/util.h" | 8 #include "components/leveldb/public/cpp/util.h" |
10 #include "content/public/test/test_browser_thread_bundle.h" | 9 #include "content/public/test/test_browser_thread_bundle.h" |
| 10 #include "mojo/public/cpp/bindings/associated_binding.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
12 | 12 |
13 using leveldb::StdStringToUint8Vector; | 13 using leveldb::StdStringToUint8Vector; |
14 using leveldb::Uint8VectorToStdString; | 14 using leveldb::Uint8VectorToStdString; |
15 | 15 |
16 namespace content { | 16 namespace content { |
17 | 17 |
18 namespace { | 18 namespace { |
19 | 19 |
20 const char* kTestPrefix = "abc"; | 20 const char* kTestPrefix = "abc"; |
(...skipping 12 matching lines...) Expand all Loading... |
33 return base::StringPiece(reinterpret_cast<const char*>(data.data()), | 33 return base::StringPiece(reinterpret_cast<const char*>(data.data()), |
34 data.size()); | 34 data.size()); |
35 } | 35 } |
36 | 36 |
37 bool StartsWith(const std::vector<uint8_t>& key, | 37 bool StartsWith(const std::vector<uint8_t>& key, |
38 const std::vector<uint8_t>& prefix) { | 38 const std::vector<uint8_t>& prefix) { |
39 return base::StartsWith(AsStringPiece(key), AsStringPiece(prefix), | 39 return base::StartsWith(AsStringPiece(key), AsStringPiece(prefix), |
40 base::CompareCase::SENSITIVE); | 40 base::CompareCase::SENSITIVE); |
41 } | 41 } |
42 | 42 |
| 43 std::vector<uint8_t> successor(std::vector<uint8_t> data) { |
| 44 for (unsigned i = data.size(); i > 0; --i) { |
| 45 if (data[i - 1] < 255) { |
| 46 data[i - 1]++; |
| 47 return data; |
| 48 } |
| 49 } |
| 50 NOTREACHED(); |
| 51 return data; |
| 52 } |
| 53 |
43 class MockLevelDBDatabase : public leveldb::mojom::LevelDBDatabase { | 54 class MockLevelDBDatabase : public leveldb::mojom::LevelDBDatabase { |
44 public: | 55 public: |
45 explicit MockLevelDBDatabase( | 56 explicit MockLevelDBDatabase( |
46 std::map<std::vector<uint8_t>, std::vector<uint8_t>>* mock_data) | 57 std::map<std::vector<uint8_t>, std::vector<uint8_t>>* mock_data) |
47 : mock_data_(*mock_data) {} | 58 : mock_data_(*mock_data) {} |
48 | 59 |
49 void Put(const std::vector<uint8_t>& key, | 60 void Put(const std::vector<uint8_t>& key, |
50 const std::vector<uint8_t>& value, | 61 const std::vector<uint8_t>& value, |
51 const PutCallback& callback) override { | 62 const PutCallback& callback) override { |
52 FAIL(); | 63 FAIL(); |
(...skipping 13 matching lines...) Expand all Loading... |
66 const WriteCallback& callback) override { | 77 const WriteCallback& callback) override { |
67 for (const auto& op : operations) { | 78 for (const auto& op : operations) { |
68 switch (op->type) { | 79 switch (op->type) { |
69 case leveldb::mojom::BatchOperationType::PUT_KEY: | 80 case leveldb::mojom::BatchOperationType::PUT_KEY: |
70 mock_data_[op->key] = *op->value; | 81 mock_data_[op->key] = *op->value; |
71 break; | 82 break; |
72 case leveldb::mojom::BatchOperationType::DELETE_KEY: | 83 case leveldb::mojom::BatchOperationType::DELETE_KEY: |
73 mock_data_.erase(op->key); | 84 mock_data_.erase(op->key); |
74 break; | 85 break; |
75 case leveldb::mojom::BatchOperationType::DELETE_PREFIXED_KEY: | 86 case leveldb::mojom::BatchOperationType::DELETE_PREFIXED_KEY: |
76 FAIL(); | 87 mock_data_.erase(mock_data_.lower_bound(op->key), |
| 88 mock_data_.lower_bound(successor(op->key))); |
77 break; | 89 break; |
78 } | 90 } |
79 } | 91 } |
80 callback.Run(leveldb::mojom::DatabaseError::OK); | 92 callback.Run(leveldb::mojom::DatabaseError::OK); |
81 } | 93 } |
82 | 94 |
83 void Get(const std::vector<uint8_t>& key, | 95 void Get(const std::vector<uint8_t>& key, |
84 const GetCallback& callback) override { | 96 const GetCallback& callback) override { |
85 FAIL(); | 97 FAIL(); |
86 } | 98 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 const IteratorPrevCallback& callback) override { | 158 const IteratorPrevCallback& callback) override { |
147 FAIL(); | 159 FAIL(); |
148 } | 160 } |
149 | 161 |
150 private: | 162 private: |
151 std::map<std::vector<uint8_t>, std::vector<uint8_t>>& mock_data_; | 163 std::map<std::vector<uint8_t>, std::vector<uint8_t>>& mock_data_; |
152 }; | 164 }; |
153 | 165 |
154 void NoOp() {} | 166 void NoOp() {} |
155 | 167 |
156 void GetCallback(bool* called, | 168 void GetCallback(const base::Closure& callback, |
157 bool* success_out, | 169 bool* success_out, |
158 std::vector<uint8_t>* value_out, | 170 std::vector<uint8_t>* value_out, |
159 bool success, | 171 bool success, |
160 const std::vector<uint8_t>& value) { | 172 const std::vector<uint8_t>& value) { |
161 *called = true; | |
162 *success_out = success; | 173 *success_out = success; |
163 *value_out = value; | 174 *value_out = value; |
| 175 callback.Run(); |
164 } | 176 } |
165 | 177 |
166 void GetAllCallback(bool* called, | 178 void SuccessCallback(const base::Closure& callback, |
167 leveldb::mojom::DatabaseError* status_out, | 179 bool* success_out, |
168 std::vector<mojom::KeyValuePtr>* data_out, | 180 bool success) { |
169 leveldb::mojom::DatabaseError status, | 181 *success_out = success; |
170 std::vector<mojom::KeyValuePtr> data) { | 182 callback.Run(); |
171 *called = true; | |
172 *status_out = status; | |
173 *data_out = std::move(data); | |
174 } | 183 } |
175 | 184 |
176 void SuccessCallback(bool* called, bool* success_out, bool success) { | |
177 *called = true; | |
178 *success_out = success; | |
179 } | |
180 | |
181 void NoOpSuccess(bool success) {} | |
182 | |
183 } // namespace | 185 } // namespace |
184 | 186 |
185 class LevelDBWrapperImplTest : public testing::Test { | 187 class LevelDBWrapperImplTest : public testing::Test, |
| 188 public mojom::LevelDBObserver { |
186 public: | 189 public: |
| 190 struct Observation { |
| 191 enum { kAdd, kChange, kDelete, kDeleteAll } type; |
| 192 std::string key; |
| 193 std::string old_value; |
| 194 std::string new_value; |
| 195 std::string source; |
| 196 }; |
| 197 |
187 LevelDBWrapperImplTest() | 198 LevelDBWrapperImplTest() |
188 : db_(&mock_data_), | 199 : db_(&mock_data_), |
189 level_db_wrapper_(&db_, | 200 level_db_wrapper_(&db_, |
190 kTestPrefix, | 201 kTestPrefix, |
191 kTestSizeLimit, | 202 kTestSizeLimit, |
192 base::TimeDelta::FromSeconds(5), | 203 base::TimeDelta::FromSeconds(5), |
193 10 * 1024 * 1024 /* max_bytes_per_hour */, | 204 10 * 1024 * 1024 /* max_bytes_per_hour */, |
194 60 /* max_commits_per_hour */, | 205 60 /* max_commits_per_hour */, |
195 base::Bind(&NoOp)) { | 206 base::Bind(&NoOp)), |
| 207 observer_binding_(this) { |
196 set_mock_data(std::string(kTestPrefix) + "def", "defdata"); | 208 set_mock_data(std::string(kTestPrefix) + "def", "defdata"); |
197 set_mock_data(std::string(kTestPrefix) + "123", "123data"); | 209 set_mock_data(std::string(kTestPrefix) + "123", "123data"); |
198 set_mock_data("123", "baddata"); | 210 set_mock_data("123", "baddata"); |
| 211 |
| 212 level_db_wrapper_.Bind(mojo::MakeRequest(&level_db_wrapper_ptr_)); |
| 213 mojom::LevelDBObserverAssociatedPtrInfo ptr_info; |
| 214 observer_binding_.Bind(&ptr_info, level_db_wrapper_ptr_.associated_group()); |
| 215 level_db_wrapper_ptr_->AddObserver(std::move(ptr_info)); |
199 } | 216 } |
200 | 217 |
201 void set_mock_data(const std::string& key, const std::string& value) { | 218 void set_mock_data(const std::string& key, const std::string& value) { |
202 mock_data_[StdStringToUint8Vector(key)] = StdStringToUint8Vector(value); | 219 mock_data_[StdStringToUint8Vector(key)] = StdStringToUint8Vector(value); |
203 } | 220 } |
204 | 221 |
| 222 void set_mock_data(const std::vector<uint8_t>& key, |
| 223 const std::vector<uint8_t>& value) { |
| 224 mock_data_[key] = value; |
| 225 } |
| 226 |
205 bool has_mock_data(const std::string& key) { | 227 bool has_mock_data(const std::string& key) { |
206 return mock_data_.find(StdStringToUint8Vector(key)) != mock_data_.end(); | 228 return mock_data_.find(StdStringToUint8Vector(key)) != mock_data_.end(); |
207 } | 229 } |
208 | 230 |
209 std::string get_mock_data(const std::string& key) { | 231 std::string get_mock_data(const std::string& key) { |
210 return has_mock_data(key) | 232 return has_mock_data(key) |
211 ? Uint8VectorToStdString(mock_data_[StdStringToUint8Vector(key)]) | 233 ? Uint8VectorToStdString(mock_data_[StdStringToUint8Vector(key)]) |
212 : ""; | 234 : ""; |
213 } | 235 } |
214 | 236 |
215 mojom::LevelDBWrapper* wrapper() { return &level_db_wrapper_; } | 237 mojom::LevelDBWrapper* wrapper() { return level_db_wrapper_ptr_.get(); } |
| 238 |
| 239 bool GetSync(const std::vector<uint8_t>& key, std::vector<uint8_t>* result) { |
| 240 base::RunLoop run_loop; |
| 241 bool success = false; |
| 242 wrapper()->Get(key, base::Bind(&GetCallback, run_loop.QuitClosure(), |
| 243 &success, result)); |
| 244 run_loop.Run(); |
| 245 return success; |
| 246 } |
| 247 |
| 248 bool PutSync(const std::vector<uint8_t>& key, |
| 249 const std::vector<uint8_t>& value, |
| 250 std::string source = kTestSource) { |
| 251 base::RunLoop run_loop; |
| 252 bool success = false; |
| 253 wrapper()->Put( |
| 254 key, value, source, |
| 255 base::Bind(&SuccessCallback, run_loop.QuitClosure(), &success)); |
| 256 run_loop.Run(); |
| 257 return success; |
| 258 } |
| 259 |
| 260 bool DeleteSync(const std::vector<uint8_t>& key) { |
| 261 base::RunLoop run_loop; |
| 262 bool success = false; |
| 263 wrapper()->Delete( |
| 264 key, kTestSource, |
| 265 base::Bind(&SuccessCallback, run_loop.QuitClosure(), &success)); |
| 266 run_loop.Run(); |
| 267 return success; |
| 268 } |
| 269 |
| 270 bool DeleteAllSync() { |
| 271 base::RunLoop run_loop; |
| 272 bool success = false; |
| 273 wrapper()->DeleteAll( |
| 274 kTestSource, |
| 275 base::Bind(&SuccessCallback, run_loop.QuitClosure(), &success)); |
| 276 run_loop.Run(); |
| 277 return success; |
| 278 } |
216 | 279 |
217 void CommitChanges() { | 280 void CommitChanges() { |
218 ASSERT_TRUE(level_db_wrapper_.commit_batch_); | 281 ASSERT_TRUE(level_db_wrapper_.commit_batch_); |
219 level_db_wrapper_.CommitChanges(); | 282 level_db_wrapper_.CommitChanges(); |
220 } | 283 } |
221 | 284 |
| 285 const std::vector<Observation>& observations() { return observations_; } |
| 286 |
222 private: | 287 private: |
| 288 // LevelDBObserver: |
| 289 void KeyAdded(const std::vector<uint8_t>& key, |
| 290 const std::vector<uint8_t>& value, |
| 291 const std::string& source) override { |
| 292 observations_.push_back({Observation::kAdd, Uint8VectorToStdString(key), "", |
| 293 Uint8VectorToStdString(value), source}); |
| 294 } |
| 295 void KeyChanged(const std::vector<uint8_t>& key, |
| 296 const std::vector<uint8_t>& new_value, |
| 297 const std::vector<uint8_t>& old_value, |
| 298 const std::string& source) override { |
| 299 observations_.push_back({Observation::kChange, Uint8VectorToStdString(key), |
| 300 Uint8VectorToStdString(old_value), |
| 301 Uint8VectorToStdString(new_value), source}); |
| 302 } |
| 303 void KeyDeleted(const std::vector<uint8_t>& key, |
| 304 const std::vector<uint8_t>& old_value, |
| 305 const std::string& source) override { |
| 306 observations_.push_back({Observation::kDelete, Uint8VectorToStdString(key), |
| 307 Uint8VectorToStdString(old_value), "", source}); |
| 308 } |
| 309 void AllDeleted(const std::string& source) override { |
| 310 observations_.push_back({Observation::kDeleteAll, "", "", "", source}); |
| 311 } |
| 312 void GetAllComplete(const std::string& source) override {} |
| 313 |
223 TestBrowserThreadBundle thread_bundle_; | 314 TestBrowserThreadBundle thread_bundle_; |
224 std::map<std::vector<uint8_t>, std::vector<uint8_t>> mock_data_; | 315 std::map<std::vector<uint8_t>, std::vector<uint8_t>> mock_data_; |
225 MockLevelDBDatabase db_; | 316 MockLevelDBDatabase db_; |
226 LevelDBWrapperImpl level_db_wrapper_; | 317 LevelDBWrapperImpl level_db_wrapper_; |
| 318 mojom::LevelDBWrapperPtr level_db_wrapper_ptr_; |
| 319 mojo::AssociatedBinding<mojom::LevelDBObserver> observer_binding_; |
| 320 std::vector<Observation> observations_; |
227 }; | 321 }; |
228 | 322 |
229 TEST_F(LevelDBWrapperImplTest, GetLoadedFromMap) { | 323 TEST_F(LevelDBWrapperImplTest, GetLoadedFromMap) { |
230 bool called = false; | |
231 bool success; | |
232 std::vector<uint8_t> result; | 324 std::vector<uint8_t> result; |
233 wrapper()->Get(StdStringToUint8Vector("123"), | 325 EXPECT_TRUE(GetSync(StdStringToUint8Vector("123"), &result)); |
234 base::Bind(&GetCallback, &called, &success, &result)); | |
235 ASSERT_TRUE(called); | |
236 EXPECT_TRUE(success); | |
237 EXPECT_EQ(StdStringToUint8Vector("123data"), result); | 326 EXPECT_EQ(StdStringToUint8Vector("123data"), result); |
238 | 327 |
239 called = false; | 328 EXPECT_FALSE(GetSync(StdStringToUint8Vector("x"), &result)); |
240 wrapper()->Get(StdStringToUint8Vector("x"), | |
241 base::Bind(&GetCallback, &called, &success, &result)); | |
242 ASSERT_TRUE(called); | |
243 EXPECT_FALSE(success); | |
244 } | 329 } |
245 | 330 |
246 TEST_F(LevelDBWrapperImplTest, GetFromPutOverwrite) { | 331 TEST_F(LevelDBWrapperImplTest, GetFromPutOverwrite) { |
247 std::vector<uint8_t> key = StdStringToUint8Vector("123"); | 332 std::vector<uint8_t> key = StdStringToUint8Vector("123"); |
248 std::vector<uint8_t> value = StdStringToUint8Vector("foo"); | 333 std::vector<uint8_t> value = StdStringToUint8Vector("foo"); |
249 | 334 |
250 bool called = false; | 335 EXPECT_TRUE(PutSync(key, value)); |
251 bool success; | |
252 wrapper()->Put(key, value, kTestSource, | |
253 base::Bind(&SuccessCallback, &called, &success)); | |
254 ASSERT_TRUE(called); | |
255 EXPECT_TRUE(success); | |
256 | 336 |
257 called = false; | |
258 std::vector<uint8_t> result; | 337 std::vector<uint8_t> result; |
259 wrapper()->Get(key, base::Bind(&GetCallback, &called, &success, &result)); | 338 EXPECT_TRUE(GetSync(key, &result)); |
260 ASSERT_TRUE(called); | |
261 EXPECT_TRUE(success); | |
262 EXPECT_EQ(value, result); | 339 EXPECT_EQ(value, result); |
263 } | 340 } |
264 | 341 |
265 TEST_F(LevelDBWrapperImplTest, GetFromPutNewKey) { | 342 TEST_F(LevelDBWrapperImplTest, GetFromPutNewKey) { |
266 std::vector<uint8_t> key = StdStringToUint8Vector("newkey"); | 343 std::vector<uint8_t> key = StdStringToUint8Vector("newkey"); |
267 std::vector<uint8_t> value = StdStringToUint8Vector("foo"); | 344 std::vector<uint8_t> value = StdStringToUint8Vector("foo"); |
268 | 345 |
269 bool called = false; | 346 EXPECT_TRUE(PutSync(key, value)); |
270 bool success; | |
271 wrapper()->Put(key, value, kTestSource, | |
272 base::Bind(&SuccessCallback, &called, &success)); | |
273 ASSERT_TRUE(called); | |
274 EXPECT_TRUE(success); | |
275 | 347 |
276 called = false; | |
277 std::vector<uint8_t> result; | 348 std::vector<uint8_t> result; |
278 wrapper()->Get(key, base::Bind(&GetCallback, &called, &success, &result)); | 349 EXPECT_TRUE(GetSync(key, &result)); |
279 ASSERT_TRUE(called); | |
280 EXPECT_TRUE(success); | |
281 EXPECT_EQ(value, result); | 350 EXPECT_EQ(value, result); |
282 } | 351 } |
283 | 352 |
284 TEST_F(LevelDBWrapperImplTest, GetAll) { | 353 TEST_F(LevelDBWrapperImplTest, GetAll) { |
285 bool called = false; | |
286 leveldb::mojom::DatabaseError status; | 354 leveldb::mojom::DatabaseError status; |
287 std::vector<mojom::KeyValuePtr> data; | 355 std::vector<mojom::KeyValuePtr> data; |
288 wrapper()->GetAll(kTestSource, | 356 EXPECT_TRUE(wrapper()->GetAll(kTestSource, &status, &data)); |
289 base::Bind(&GetAllCallback, &called, &status, &data)); | |
290 ASSERT_TRUE(called); | |
291 EXPECT_EQ(leveldb::mojom::DatabaseError::OK, status); | 357 EXPECT_EQ(leveldb::mojom::DatabaseError::OK, status); |
292 EXPECT_EQ(2u, data.size()); | 358 EXPECT_EQ(2u, data.size()); |
293 } | 359 } |
294 | 360 |
295 TEST_F(LevelDBWrapperImplTest, CommitPutToDB) { | 361 TEST_F(LevelDBWrapperImplTest, CommitPutToDB) { |
296 std::string key1 = "123"; | 362 std::string key1 = "123"; |
297 std::string value1 = "foo"; | 363 std::string value1 = "foo"; |
298 std::string key2 = "abc"; | 364 std::string key2 = "abc"; |
299 std::string value2 = "data abc"; | 365 std::string value2 = "data abc"; |
300 | 366 |
301 wrapper()->Put(StdStringToUint8Vector(key1), StdStringToUint8Vector(value1), | 367 EXPECT_TRUE( |
302 kTestSource, base::Bind(&NoOpSuccess)); | 368 PutSync(StdStringToUint8Vector(key1), StdStringToUint8Vector(value1))); |
303 wrapper()->Put(StdStringToUint8Vector(key2), | 369 EXPECT_TRUE(PutSync(StdStringToUint8Vector(key2), |
304 StdStringToUint8Vector("old value"), kTestSource, | 370 StdStringToUint8Vector("old value"))); |
305 base::Bind(&NoOpSuccess)); | 371 EXPECT_TRUE( |
306 wrapper()->Put(StdStringToUint8Vector(key2), StdStringToUint8Vector(value2), | 372 PutSync(StdStringToUint8Vector(key2), StdStringToUint8Vector(value2))); |
307 kTestSource, base::Bind(&NoOpSuccess)); | 373 |
| 374 EXPECT_FALSE(has_mock_data(kTestPrefix + key2)); |
308 | 375 |
309 CommitChanges(); | 376 CommitChanges(); |
310 | |
311 EXPECT_TRUE(has_mock_data(kTestPrefix + key1)); | 377 EXPECT_TRUE(has_mock_data(kTestPrefix + key1)); |
312 EXPECT_EQ(value1, get_mock_data(kTestPrefix + key1)); | 378 EXPECT_EQ(value1, get_mock_data(kTestPrefix + key1)); |
313 EXPECT_TRUE(has_mock_data(kTestPrefix + key2)); | 379 EXPECT_TRUE(has_mock_data(kTestPrefix + key2)); |
314 EXPECT_EQ(value2, get_mock_data(kTestPrefix + key2)); | 380 EXPECT_EQ(value2, get_mock_data(kTestPrefix + key2)); |
315 } | 381 } |
316 | 382 |
| 383 TEST_F(LevelDBWrapperImplTest, PutObservations) { |
| 384 std::string key = "new_key"; |
| 385 std::string value1 = "foo"; |
| 386 std::string value2 = "data abc"; |
| 387 std::string source1 = "source1"; |
| 388 std::string source2 = "source2"; |
| 389 |
| 390 EXPECT_TRUE(PutSync(StdStringToUint8Vector(key), |
| 391 StdStringToUint8Vector(value1), source1)); |
| 392 ASSERT_EQ(1u, observations().size()); |
| 393 EXPECT_EQ(Observation::kAdd, observations()[0].type); |
| 394 EXPECT_EQ(key, observations()[0].key); |
| 395 EXPECT_EQ(value1, observations()[0].new_value); |
| 396 EXPECT_EQ(source1, observations()[0].source); |
| 397 |
| 398 EXPECT_TRUE(PutSync(StdStringToUint8Vector(key), |
| 399 StdStringToUint8Vector(value2), source2)); |
| 400 ASSERT_EQ(2u, observations().size()); |
| 401 EXPECT_EQ(Observation::kChange, observations()[1].type); |
| 402 EXPECT_EQ(key, observations()[1].key); |
| 403 EXPECT_EQ(value1, observations()[1].old_value); |
| 404 EXPECT_EQ(value2, observations()[1].new_value); |
| 405 EXPECT_EQ(source2, observations()[1].source); |
| 406 } |
| 407 |
| 408 TEST_F(LevelDBWrapperImplTest, DeleteNonExistingKey) { |
| 409 EXPECT_TRUE(DeleteSync(StdStringToUint8Vector("doesn't exist"))); |
| 410 EXPECT_EQ(0u, observations().size()); |
| 411 } |
| 412 |
| 413 TEST_F(LevelDBWrapperImplTest, DeleteExistingKey) { |
| 414 std::string key = "newkey"; |
| 415 std::string value = "foo"; |
| 416 set_mock_data(kTestPrefix + key, value); |
| 417 |
| 418 EXPECT_TRUE(DeleteSync(StdStringToUint8Vector(key))); |
| 419 ASSERT_EQ(1u, observations().size()); |
| 420 EXPECT_EQ(Observation::kDelete, observations()[0].type); |
| 421 EXPECT_EQ(key, observations()[0].key); |
| 422 EXPECT_EQ(value, observations()[0].old_value); |
| 423 EXPECT_EQ(kTestSource, observations()[0].source); |
| 424 |
| 425 EXPECT_TRUE(has_mock_data(kTestPrefix + key)); |
| 426 |
| 427 CommitChanges(); |
| 428 EXPECT_FALSE(has_mock_data(kTestPrefix + key)); |
| 429 } |
| 430 |
| 431 TEST_F(LevelDBWrapperImplTest, DeleteAll) { |
| 432 std::string key = "newkey"; |
| 433 std::string value = "foo"; |
| 434 std::string dummy_key = "foobar"; |
| 435 set_mock_data(dummy_key, value); |
| 436 set_mock_data(kTestPrefix + key, value); |
| 437 |
| 438 EXPECT_TRUE(DeleteAllSync()); |
| 439 ASSERT_EQ(1u, observations().size()); |
| 440 EXPECT_EQ(Observation::kDeleteAll, observations()[0].type); |
| 441 EXPECT_EQ(kTestSource, observations()[0].source); |
| 442 |
| 443 EXPECT_TRUE(has_mock_data(kTestPrefix + key)); |
| 444 EXPECT_TRUE(has_mock_data(dummy_key)); |
| 445 |
| 446 CommitChanges(); |
| 447 EXPECT_FALSE(has_mock_data(kTestPrefix + key)); |
| 448 EXPECT_TRUE(has_mock_data(dummy_key)); |
| 449 |
| 450 // Deleting all again should still work, an cause an observation. |
| 451 EXPECT_TRUE(DeleteAllSync()); |
| 452 ASSERT_EQ(2u, observations().size()); |
| 453 EXPECT_EQ(Observation::kDeleteAll, observations()[1].type); |
| 454 EXPECT_EQ(kTestSource, observations()[1].source); |
| 455 |
| 456 // And now we've deleted all, writing something the quota size should work. |
| 457 EXPECT_TRUE(PutSync(std::vector<uint8_t>(kTestSizeLimit, 'b'), |
| 458 std::vector<uint8_t>())); |
| 459 } |
| 460 |
317 TEST_F(LevelDBWrapperImplTest, PutOverQuotaLargeValue) { | 461 TEST_F(LevelDBWrapperImplTest, PutOverQuotaLargeValue) { |
318 std::vector<uint8_t> key = StdStringToUint8Vector("newkey"); | 462 std::vector<uint8_t> key = StdStringToUint8Vector("newkey"); |
319 std::vector<uint8_t> value(kTestSizeLimit, 4); | 463 std::vector<uint8_t> value(kTestSizeLimit, 4); |
320 | 464 |
321 bool called = false; | 465 EXPECT_FALSE(PutSync(key, value)); |
322 bool success; | |
323 wrapper()->Put(key, value, kTestSource, | |
324 base::Bind(&SuccessCallback, &called, &success)); | |
325 ASSERT_TRUE(called); | |
326 EXPECT_FALSE(success); | |
327 | 466 |
328 value.resize(kTestSizeLimit / 2); | 467 value.resize(kTestSizeLimit / 2); |
329 called = false; | 468 EXPECT_TRUE(PutSync(key, value)); |
330 wrapper()->Put(key, value, kTestSource, | |
331 base::Bind(&SuccessCallback, &called, &success)); | |
332 ASSERT_TRUE(called); | |
333 EXPECT_TRUE(success); | |
334 } | 469 } |
335 | 470 |
336 TEST_F(LevelDBWrapperImplTest, PutOverQuotaLargeKey) { | 471 TEST_F(LevelDBWrapperImplTest, PutOverQuotaLargeKey) { |
337 std::vector<uint8_t> key(kTestSizeLimit, 'a'); | 472 std::vector<uint8_t> key(kTestSizeLimit, 'a'); |
338 std::vector<uint8_t> value = StdStringToUint8Vector("newvalue"); | 473 std::vector<uint8_t> value = StdStringToUint8Vector("newvalue"); |
339 | 474 |
340 bool called = false; | 475 EXPECT_FALSE(PutSync(key, value)); |
341 bool success; | |
342 wrapper()->Put(key, value, kTestSource, | |
343 base::Bind(&SuccessCallback, &called, &success)); | |
344 ASSERT_TRUE(called); | |
345 EXPECT_FALSE(success); | |
346 | 476 |
347 key.resize(kTestSizeLimit / 2); | 477 key.resize(kTestSizeLimit / 2); |
348 called = false; | 478 EXPECT_TRUE(PutSync(key, value)); |
349 wrapper()->Put(key, value, kTestSource, | |
350 base::Bind(&SuccessCallback, &called, &success)); | |
351 ASSERT_TRUE(called); | |
352 EXPECT_TRUE(success); | |
353 } | 479 } |
354 | 480 |
355 TEST_F(LevelDBWrapperImplTest, PutWhenAlreadyOverQuota) { | 481 TEST_F(LevelDBWrapperImplTest, PutWhenAlreadyOverQuota) { |
356 std::string key = "largedata"; | 482 std::string key = "largedata"; |
357 std::vector<uint8_t> value(kTestSizeLimit, 4); | 483 std::vector<uint8_t> value(kTestSizeLimit, 4); |
358 | 484 |
359 set_mock_data(kTestPrefix + key, Uint8VectorToStdString(value)); | 485 set_mock_data(kTestPrefix + key, Uint8VectorToStdString(value)); |
360 | 486 |
361 // Put with same data should succeed. | 487 // Put with same data should succeed. |
362 bool called = false; | 488 EXPECT_TRUE(PutSync(StdStringToUint8Vector(key), value)); |
363 bool success; | |
364 wrapper()->Put(StdStringToUint8Vector(key), value, kTestSource, | |
365 base::Bind(&SuccessCallback, &called, &success)); | |
366 ASSERT_TRUE(called); | |
367 EXPECT_TRUE(success); | |
368 | 489 |
369 // Put with same data size should succeed. | 490 // Put with same data size should succeed. |
370 called = false; | |
371 value[1] = 13; | 491 value[1] = 13; |
372 wrapper()->Put(StdStringToUint8Vector(key), value, kTestSource, | 492 EXPECT_TRUE(PutSync(StdStringToUint8Vector(key), value)); |
373 base::Bind(&SuccessCallback, &called, &success)); | |
374 ASSERT_TRUE(called); | |
375 EXPECT_TRUE(success); | |
376 | 493 |
377 // Adding a new key when already over quota should not succeed. | 494 // Adding a new key when already over quota should not succeed. |
378 called = false; | 495 EXPECT_FALSE(PutSync(StdStringToUint8Vector("newkey"), {1, 2, 3})); |
379 wrapper()->Put(StdStringToUint8Vector("newkey"), {1, 2, 3}, kTestSource, | |
380 base::Bind(&SuccessCallback, &called, &success)); | |
381 ASSERT_TRUE(called); | |
382 EXPECT_FALSE(success); | |
383 | 496 |
384 // Reducing size should also succeed. | 497 // Reducing size should also succeed. |
385 value.resize(kTestSizeLimit / 2); | 498 value.resize(kTestSizeLimit / 2); |
386 called = false; | 499 EXPECT_TRUE(PutSync(StdStringToUint8Vector(key), value)); |
387 wrapper()->Put(StdStringToUint8Vector(key), value, kTestSource, | |
388 base::Bind(&SuccessCallback, &called, &success)); | |
389 ASSERT_TRUE(called); | |
390 EXPECT_TRUE(success); | |
391 | 500 |
392 // Increasing size again should succeed, as still under the limit. | 501 // Increasing size again should succeed, as still under the limit. |
393 value.resize(value.size() + 1); | 502 value.resize(value.size() + 1); |
394 called = false; | 503 EXPECT_TRUE(PutSync(StdStringToUint8Vector(key), value)); |
395 wrapper()->Put(StdStringToUint8Vector(key), value, kTestSource, | |
396 base::Bind(&SuccessCallback, &called, &success)); | |
397 ASSERT_TRUE(called); | |
398 EXPECT_TRUE(success); | |
399 | 504 |
400 // But increasing back to original size should fail. | 505 // But increasing back to original size should fail. |
401 value.resize(kTestSizeLimit); | 506 value.resize(kTestSizeLimit); |
402 called = false; | 507 EXPECT_FALSE(PutSync(StdStringToUint8Vector(key), value)); |
403 wrapper()->Put(StdStringToUint8Vector(key), value, kTestSource, | |
404 base::Bind(&SuccessCallback, &called, &success)); | |
405 ASSERT_TRUE(called); | |
406 EXPECT_FALSE(success); | |
407 } | 508 } |
408 | 509 |
409 TEST_F(LevelDBWrapperImplTest, PutWhenAlreadyOverQuotaBecauseOfLargeKey) { | 510 TEST_F(LevelDBWrapperImplTest, PutWhenAlreadyOverQuotaBecauseOfLargeKey) { |
410 std::vector<uint8_t> key(kTestSizeLimit, 'x'); | 511 std::vector<uint8_t> key(kTestSizeLimit, 'x'); |
411 std::vector<uint8_t> value = StdStringToUint8Vector("value"); | 512 std::vector<uint8_t> value = StdStringToUint8Vector("value"); |
412 | 513 |
413 set_mock_data(kTestPrefix + Uint8VectorToStdString(key), | 514 set_mock_data(kTestPrefix + Uint8VectorToStdString(key), |
414 Uint8VectorToStdString(value)); | 515 Uint8VectorToStdString(value)); |
415 | 516 |
416 // Put with same data size should succeed. | 517 // Put with same data size should succeed. |
417 bool called = false; | |
418 bool success; | |
419 value[0] = 'X'; | 518 value[0] = 'X'; |
420 wrapper()->Put(key, value, kTestSource, | 519 EXPECT_TRUE(PutSync(key, value)); |
421 base::Bind(&SuccessCallback, &called, &success)); | |
422 ASSERT_TRUE(called); | |
423 EXPECT_TRUE(success); | |
424 | 520 |
425 // Reducing size should also succeed. | 521 // Reducing size should also succeed. |
426 value.clear(); | 522 value.clear(); |
427 called = false; | 523 EXPECT_TRUE(PutSync(key, value)); |
428 wrapper()->Put(key, value, kTestSource, | |
429 base::Bind(&SuccessCallback, &called, &success)); | |
430 ASSERT_TRUE(called); | |
431 EXPECT_TRUE(success); | |
432 | 524 |
433 // Increasing size should fail. | 525 // Increasing size should fail. |
434 value.resize(1, 'a'); | 526 value.resize(1, 'a'); |
435 called = false; | 527 EXPECT_FALSE(PutSync(key, value)); |
436 wrapper()->Put(key, value, kTestSource, | |
437 base::Bind(&SuccessCallback, &called, &success)); | |
438 ASSERT_TRUE(called); | |
439 EXPECT_FALSE(success); | |
440 } | 528 } |
441 | 529 |
442 } // namespace content | 530 } // namespace content |
OLD | NEW |