15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <string> 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/logging.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/leveldatabase/src/helpers/memenv/memenv.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/db.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/env.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace sync_file_system { 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace drive_backend { 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)struct TestData { 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string key; 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string value; 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class LevelDBWrapperTest : public testing::Test { 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~LevelDBWrapperTest() {} 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetUp() OVERRIDE { 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(database_dir_.CreateUniqueTempDir()); 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default())); 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) InitializeLevelDB(); 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void TearDown() OVERRIDE { 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) db_.reset(); 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) in_memory_env_.reset(); 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void CreateDefaultDatabase() { 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) leveldb::DB* db = db_->GetLevelDB(); 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Expected contents are 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // {"a": "1", "ab": "0", "bb": "3", "d": "4"} 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const char* keys[] = {"ab", "a", "d", "bb", "d"}; 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (size_t i = 0; i < arraysize(keys); ++i) { 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) leveldb::Status status = 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) db->Put(leveldb::WriteOptions(), keys[i], base::Int64ToString(i)); 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(status.ok()); 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LevelDBWrapper* GetDB() { 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return db_.get(); 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void CheckDBContents(const TestData expects[], size_t size) { 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(db_); 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<LevelDBWrapper::Iterator> itr = db_->NewIterator(); 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) itr->SeekToFirst(); 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (size_t i = 0; i < size; ++i) { 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(itr->Valid()); 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(expects[i].key, itr->key().ToString()); 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(expects[i].value, itr->value().ToString()); 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) itr->Next(); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(itr->Valid()); 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void InitializeLevelDB() { 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) leveldb::DB* db = NULL; 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) leveldb::Options options; 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options.create_if_missing = true; 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options.max_open_files = 0; // Use minimum. 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) options.env = in_memory_env_.get(); 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) leveldb::Status status = 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) leveldb::DB::Open(options, database_dir_.path().AsUTF8Unsafe(), &db); 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(status.ok()); 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) db_.reset(new LevelDBWrapper(make_scoped_ptr(db))); 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ScopedTempDir database_dir_; 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<leveldb::Env> in_memory_env_; 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<LevelDBWrapper> db_; 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(LevelDBWrapperTest, IteratorTest) { 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateDefaultDatabase(); 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<LevelDBWrapper::Iterator> itr = GetDB()->NewIterator(); 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) itr->Seek("a"); 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(itr->Valid()); 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("a", itr->key().ToString()); 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("1", itr->value().ToString()); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) itr->Next(); 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(itr->Valid()); 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("ab", itr->key().ToString()); 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("0", itr->value().ToString()); 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) itr->Seek("b"); 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(itr->Valid()); 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("bb", itr->key().ToString()); 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("3", itr->value().ToString()); 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) itr->Next(); 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(itr->Valid()); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("d", itr->key().ToString()); 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("4", itr->value().ToString()); 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) itr->Next(); 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(itr->Valid()); 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) itr->SeekToFirst(); 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(itr->Valid()); 1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ("a", itr->key().ToString()); 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ("1", itr->value().ToString()); 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) itr->Delete(); 1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(itr->Valid()); 1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ("ab", itr->key().ToString()); 1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ("0", itr->value().ToString()); 1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) itr->SeekToFirst(); 1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(itr->Valid()); 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ("ab", itr->key().ToString()); 1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ("0", itr->value().ToString()); 1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0, GetDB()->num_puts()); 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(1, GetDB()->num_deletes()); 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(LevelDBWrapperTest, Iterator2Test) { 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("a", "1"); 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("b", "2"); 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("c", "3"); 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Keep pending transanctions on memory. 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<LevelDBWrapper::Iterator> itr = GetDB()->NewIterator(); 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string prev_key; 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string prev_value; 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int loop_counter = 0; 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (itr->SeekToFirst(); itr->Valid(); itr->Next()) { 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_NE(prev_key, itr->key().ToString()); 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_NE(prev_value, itr->value().ToString()); 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) prev_key = itr->key().ToString(); 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) prev_value = itr->value().ToString(); 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ++loop_counter; 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(3, loop_counter); 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("c", prev_key); 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("3", prev_value); 1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(3, GetDB()->num_puts()); 1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0, GetDB()->num_deletes()); 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(LevelDBWrapperTest, PutTest) { 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestData merged_data[] = {{"a", "1"}, {"aa", "new0"}, {"ab", "0"}, 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {"bb", "new2"}, {"c", "new1"}, {"d", "4"}}; 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestData orig_data[] = {{"a", "1"}, {"ab", "0"}, {"bb", "3"}, {"d", "4"}}; 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateDefaultDatabase(); 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Add pending transactions. 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("aa", "new0"); 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("c", "new1"); 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("bb", "new2"); // Overwrite an entry. 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SCOPED_TRACE("PutTest_Pending"); 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckDBContents(merged_data, arraysize(merged_data)); 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(3, GetDB()->num_puts()); 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Remove all pending transactions. 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Clear(); 1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0, GetDB()->num_puts()); 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SCOPED_TRACE("PutTest_Clear"); 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckDBContents(orig_data, arraysize(orig_data)); 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Add pending transactions again, with commiting. 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("aa", "new0"); 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("c", "new1"); 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("bb", "new2"); 1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(3, GetDB()->num_puts()); 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Commit(); 1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0, GetDB()->num_puts()); 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Clear(); // Clear just in case. 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SCOPED_TRACE("PutTest_Commit"); 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckDBContents(merged_data, arraysize(merged_data)); 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(LevelDBWrapperTest, DeleteTest) { 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestData merged_data[] = {{"a", "1"}, {"aa", "new0"}, {"bb", "new2"}, 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) {"d", "4"}}; 2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestData orig_data[] = {{"a", "1"}, {"ab", "0"}, {"bb", "3"}, {"d", "4"}}; 2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateDefaultDatabase(); 2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Add pending transactions. 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("aa", "new0"); 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("c", "new1"); 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("bb", "new2"); // Overwrite an entry. 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Delete("c"); // Remove a pending entry. 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Delete("ab"); // Remove a committed entry. 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(3, GetDB()->num_puts()); 2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(2, GetDB()->num_deletes()); 2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SCOPED_TRACE("DeleteTest_Pending"); 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckDBContents(merged_data, arraysize(merged_data)); 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Remove all pending transactions. 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Clear(); 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SCOPED_TRACE("DeleteTest_Clear"); 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckDBContents(orig_data, arraysize(orig_data)); 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Add pending transactions again, with commiting. 2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("aa", "new0"); 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("c", "new1"); 2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Put("bb", "new2"); 2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Delete("c"); 2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Delete("ab"); 2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Commit(); 2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetDB()->Clear(); 2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0, GetDB()->num_puts()); 2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0, GetDB()->num_deletes()); 2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SCOPED_TRACE("DeleteTest_Commit"); 2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CheckDBContents(merged_data, arraysize(merged_data)); 2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace drive_backend 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace sync_file_system 242