Index: content/browser/indexed_db/leveldb/leveldb_unittest.cc |
diff --git a/content/browser/indexed_db/leveldb/leveldb_unittest.cc b/content/browser/indexed_db/leveldb/leveldb_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0740a81b4058d0631b4e696f905f58e4b28e9504 |
--- /dev/null |
+++ b/content/browser/indexed_db/leveldb/leveldb_unittest.cc |
@@ -0,0 +1,191 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <algorithm> |
+#include <cstring> |
+#include <vector> |
+ |
+#include "base/files/file_path.h" |
+#include "base/files/scoped_temp_dir.h" |
+#include "base/platform_file.h" |
+#include "base/string16.h" |
+#include "content/browser/indexed_db/leveldb/leveldb_comparator.h" |
+#include "content/browser/indexed_db/leveldb/leveldb_database.h" |
+#include "content/browser/indexed_db/leveldb/leveldb_iterator.h" |
+#include "content/browser/indexed_db/leveldb/leveldb_slice.h" |
+#include "content/browser/indexed_db/leveldb/leveldb_transaction.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+using namespace content; |
jamesr
2013/05/21 23:56:06
using declarations are banned in chromium style.
jsbell
2013/05/22 17:54:44
Done.
|
+ |
+namespace { |
+ |
+class SimpleComparator : public LevelDBComparator { |
+ public: |
+ virtual int Compare(const LevelDBSlice& a, const LevelDBSlice& b) const |
+ OVERRIDE { |
+ size_t len = std::min(a.end() - a.begin(), b.end() - b.begin()); |
+ return memcmp(a.begin(), b.begin(), len); |
+ } |
+ virtual const char* Name() const OVERRIDE { return "temp_comparator"; } |
+}; |
+ |
+std::vector<char> EncodeString(const std::string& s) { |
+ std::vector<char> ret(s.size()); |
+ for (size_t i = 0; i < s.size(); ++i) |
+ ret[i] = s[i]; |
+ return ret; |
+} |
+ |
+TEST(LevelDBDatabaseTest, CorruptionTest) { |
+ base::ScopedTempDir temp_directory; |
+ ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); |
+ |
+ const std::vector<char> key = EncodeString("key"); |
+ const std::vector<char> put_value = EncodeString("value"); |
+ std::vector<char> got_value; |
+ SimpleComparator comparator; |
+ |
+ scoped_ptr<LevelDBDatabase> leveldb = |
+ LevelDBDatabase::Open(temp_directory.path(), &comparator); |
+ EXPECT_TRUE(leveldb); |
+ bool success = leveldb->Put(LevelDBSlice(key), put_value); |
+ EXPECT_TRUE(success); |
+ leveldb.Pass(); |
+ EXPECT_FALSE(leveldb); |
+ |
+ leveldb = LevelDBDatabase::Open(temp_directory.path(), &comparator); |
+ EXPECT_TRUE(leveldb); |
+ bool found = false; |
+ success = leveldb->Get(LevelDBSlice(key), got_value, found); |
+ EXPECT_TRUE(success); |
+ EXPECT_TRUE(found); |
+ EXPECT_EQ(put_value, got_value); |
+ leveldb.Pass(); |
+ EXPECT_FALSE(leveldb); |
+ |
+ base::FilePath file_path = temp_directory.path().AppendASCII("CURRENT"); |
+ base::PlatformFile handle = base::CreatePlatformFile( |
+ file_path, |
+ base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_WRITE, |
+ NULL, |
+ NULL); |
+ base::TruncatePlatformFile(handle, 0); |
+ base::ClosePlatformFile(handle); |
+ |
+ leveldb = LevelDBDatabase::Open(temp_directory.path(), &comparator); |
+ EXPECT_FALSE(leveldb); |
+ |
+ bool destroyed = LevelDBDatabase::Destroy(temp_directory.path()); |
+ EXPECT_TRUE(destroyed); |
+ |
+ leveldb = LevelDBDatabase::Open(temp_directory.path(), &comparator); |
+ EXPECT_TRUE(leveldb); |
+ success = leveldb->Get(LevelDBSlice(key), got_value, found); |
+ EXPECT_TRUE(success); |
+ EXPECT_FALSE(found); |
+} |
+ |
+TEST(LevelDBDatabaseTest, Transaction) { |
+ base::ScopedTempDir temp_directory; |
+ ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); |
+ |
+ const std::vector<char> key = EncodeString("key"); |
+ std::vector<char> got_value; |
+ SimpleComparator comparator; |
+ |
+ scoped_ptr<LevelDBDatabase> leveldb = |
+ LevelDBDatabase::Open(temp_directory.path(), &comparator); |
+ EXPECT_TRUE(leveldb); |
+ |
+ const std::vector<char> old_value = EncodeString("value"); |
+ bool success = leveldb->Put(LevelDBSlice(key), old_value); |
+ EXPECT_TRUE(success); |
+ |
+ scoped_refptr<LevelDBTransaction> transaction = |
+ LevelDBTransaction::Create(leveldb.get()); |
+ |
+ const std::vector<char> new_value = EncodeString("new value"); |
+ success = leveldb->Put(LevelDBSlice(key), new_value); |
+ EXPECT_TRUE(success); |
+ |
+ bool found = false; |
+ success = transaction->Get(LevelDBSlice(key), got_value, found); |
+ EXPECT_TRUE(success); |
+ EXPECT_TRUE(found); |
+ EXPECT_EQ( |
+ comparator.Compare(LevelDBSlice(got_value), LevelDBSlice(old_value)), 0); |
+ |
+ found = false; |
+ success = leveldb->Get(LevelDBSlice(key), got_value, found); |
+ EXPECT_TRUE(success); |
+ EXPECT_TRUE(found); |
+ EXPECT_EQ( |
+ comparator.Compare(LevelDBSlice(got_value), LevelDBSlice(new_value)), 0); |
+ |
+ const std::vector<char> added_key = EncodeString("added key"); |
+ const std::vector<char> added_value = EncodeString("added value"); |
+ success = leveldb->Put(LevelDBSlice(added_key), added_value); |
+ EXPECT_TRUE(success); |
+ |
+ success = leveldb->Get(LevelDBSlice(added_key), got_value, found); |
+ EXPECT_TRUE(success); |
+ EXPECT_TRUE(found); |
+ EXPECT_EQ( |
+ comparator.Compare(LevelDBSlice(got_value), LevelDBSlice(added_value)), |
+ 0); |
+ |
+ success = transaction->Get(LevelDBSlice(added_key), got_value, found); |
+ EXPECT_TRUE(success); |
+ EXPECT_FALSE(found); |
+} |
+ |
+TEST(LevelDBDatabaseTest, TransactionIterator) { |
+ base::ScopedTempDir temp_directory; |
+ ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); |
+ |
+ const std::vector<char> start = EncodeString(""); |
+ const std::vector<char> key1 = EncodeString("key1"); |
+ const std::vector<char> value1 = EncodeString("value1"); |
+ const std::vector<char> key2 = EncodeString("key2"); |
+ const std::vector<char> value2 = EncodeString("value2"); |
+ |
+ SimpleComparator comparator; |
+ bool success; |
+ |
+ scoped_ptr<LevelDBDatabase> leveldb = |
+ LevelDBDatabase::Open(temp_directory.path(), &comparator); |
+ EXPECT_TRUE(leveldb); |
+ |
+ success = leveldb->Put(LevelDBSlice(key1), value1); |
+ EXPECT_TRUE(success); |
+ success = leveldb->Put(LevelDBSlice(key2), value2); |
+ EXPECT_TRUE(success); |
+ |
+ scoped_refptr<LevelDBTransaction> transaction = |
+ LevelDBTransaction::Create(leveldb.get()); |
+ |
+ success = leveldb->Remove(LevelDBSlice(key2)); |
+ EXPECT_TRUE(success); |
+ |
+ scoped_ptr<LevelDBIterator> it = transaction->CreateIterator(); |
+ |
+ it->Seek(LevelDBSlice(start)); |
+ |
+ EXPECT_TRUE(it->IsValid()); |
+ EXPECT_EQ(comparator.Compare(LevelDBSlice(it->Key()), LevelDBSlice(key1)), 0); |
+ EXPECT_EQ(comparator.Compare(it->Value(), LevelDBSlice(value1)), 0); |
+ |
+ it->Next(); |
+ |
+ EXPECT_TRUE(it->IsValid()); |
+ EXPECT_EQ(comparator.Compare(it->Key(), LevelDBSlice(key2)), 0); |
+ EXPECT_EQ(comparator.Compare(it->Value(), LevelDBSlice(value2)), 0); |
+ |
+ it->Next(); |
+ |
+ EXPECT_FALSE(it->IsValid()); |
+} |
+ |
+} // namespace |