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