1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <algorithm> 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <cstring> 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <string> 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/file.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_path.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/scoped_temp_dir.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/strings/string_piece.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/leveldb/leveldb_comparator.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/leveldb/leveldb_database.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/leveldb/leveldb_iterator.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/indexed_db/leveldb/leveldb_transaction.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/leveldatabase/env_chromium.h" 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/leveldatabase/env_idb.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content { 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace { 25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class SimpleComparator : public LevelDBComparator { 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public: 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual int Compare(const base::StringPiece& a, 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::StringPiece& b) const OVERRIDE { 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch size_t len = std::min(a.size(), b.size()); 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return memcmp(a.begin(), b.begin(), len); 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual const char* Name() const OVERRIDE { return "temp_comparator"; } 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(LevelDBDatabaseTest, CorruptionTest) { 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::ScopedTempDir temp_directory; 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string key("key"); 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string value("value"); 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string put_value; 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string got_value; 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SimpleComparator comparator; 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<LevelDBDatabase> leveldb; 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LevelDBDatabase::Open(temp_directory.path(), &comparator, &leveldb); 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(leveldb); 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) put_value = value; 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status status = leveldb->Put(key, &put_value); 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) leveldb.Pass(); 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(leveldb); 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LevelDBDatabase::Open(temp_directory.path(), &comparator, &leveldb); 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(leveldb); 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool found = false; 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = leveldb->Get(key, &got_value, &found); 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(found); 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(value, got_value); 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) leveldb.Pass(); 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(leveldb); 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath file_path = temp_directory.path().AppendASCII("CURRENT"); 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_WRITE); 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) file.SetLength(0); 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) file.Close(); 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = LevelDBDatabase::Open(temp_directory.path(), &comparator, &leveldb); 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(leveldb); 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(status.ok()); 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = LevelDBDatabase::Destroy(temp_directory.path()); 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch status = LevelDBDatabase::Open(temp_directory.path(), &comparator, &leveldb); 80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(status.ok()); 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(leveldb); 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = leveldb->Get(key, &got_value, &found); 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(found); 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(LevelDBDatabaseTest, Transaction) { 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::ScopedTempDir temp_directory; 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string key("key"); 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::string got_value; 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string put_value; 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SimpleComparator comparator; 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<LevelDBDatabase> leveldb; 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LevelDBDatabase::Open(temp_directory.path(), &comparator, &leveldb); 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(leveldb); 99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string old_value("value"); 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) put_value = old_value; 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status status = leveldb->Put(key, &put_value); 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<LevelDBTransaction> transaction = 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new LevelDBTransaction(leveldb.get()); 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string new_value("new value"); 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) put_value = new_value; 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = leveldb->Put(key, &put_value); 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool found = false; 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = transaction->Get(key, &got_value, &found); 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(found); 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(comparator.Compare(got_value, old_value), 0); 118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) found = false; 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = leveldb->Get(key, &got_value, &found); 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(found); 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(comparator.Compare(got_value, new_value), 0); 124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string added_key("added key"); 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string added_value("added value"); 127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) put_value = added_value; 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = leveldb->Put(added_key, &put_value); 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = leveldb->Get(added_key, &got_value, &found); 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(found); 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(comparator.Compare(got_value, added_value), 0); 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = transaction->Get(added_key, &got_value, &found); 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(found); 139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string another_key("another key"); 1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string another_value("another value"); 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) put_value = another_value; 1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch transaction->Put(another_key, &put_value); 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = transaction->Get(another_key, &got_value, &found); 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(found); 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(comparator.Compare(got_value, another_value), 0); 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(LevelDBDatabaseTest, TransactionIterator) { 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::ScopedTempDir temp_directory; 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string key1("key1"); 1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string value1("value1"); 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string key2("key2"); 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::string value2("value2"); 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string put_value; 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SimpleComparator comparator; 161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 162ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<LevelDBDatabase> leveldb; 163ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch LevelDBDatabase::Open(temp_directory.path(), &comparator, &leveldb); 164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(leveldb); 165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) put_value = value1; 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status s = leveldb->Put(key1, &put_value); 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(s.ok()); 169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) put_value = value2; 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) s = leveldb->Put(key2, &put_value); 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(s.ok()); 172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_refptr<LevelDBTransaction> transaction = 1747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch new LevelDBTransaction(leveldb.get()); 175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) s = leveldb->Remove(key2); 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(s.ok()); 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<LevelDBIterator> it = transaction->CreateIterator(); 180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch it->Seek(std::string()); 182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(it->IsValid()); 1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(comparator.Compare(it->Key(), key1), 0); 1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(comparator.Compare(it->Value(), value1), 0); 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it->Next(); 188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_TRUE(it->IsValid()); 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(comparator.Compare(it->Key(), key2), 0); 1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(comparator.Compare(it->Value(), value2), 0); 192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) it->Next(); 194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_FALSE(it->IsValid()); 196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST(LevelDBDatabaseTest, TransactionCommitTest) { 199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::ScopedTempDir temp_directory; 200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); 201d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 202d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string key1("key1"); 203d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string key2("key2"); 204d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string value1("value1"); 205d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string value2("value2"); 206d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const std::string value3("value3"); 207d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 208d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string put_value; 209d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::string got_value; 210d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) SimpleComparator comparator; 211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool found; 212d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 213d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<LevelDBDatabase> leveldb; 214d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LevelDBDatabase::Open(temp_directory.path(), &comparator, &leveldb); 215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(leveldb); 216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<LevelDBTransaction> transaction = 218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new LevelDBTransaction(leveldb.get()); 219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) put_value = value1; 221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) transaction->Put(key1, &put_value); 222d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 223d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) put_value = value2; 224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) transaction->Put(key2, &put_value); 225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) put_value = value3; 227d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) transaction->Put(key2, &put_value); 228d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) leveldb::Status status = transaction->Commit(); 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = leveldb->Get(key1, &got_value, &found); 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(found); 235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(value1, got_value); 236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) status = leveldb->Get(key2, &got_value, &found); 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(status.ok()); 239d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(found); 240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(value3, got_value); 241d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 242d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(LevelDB, Locking) { 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::ScopedTempDir temp_directory; 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_TRUE(temp_directory.CreateUniqueTempDir()); 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leveldb::Env* env = leveldb::IDBEnv(); 2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::FilePath file = temp_directory.path().AppendASCII("LOCK"); 2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leveldb::FileLock* lock; 2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leveldb::Status status = env->LockFile(file.AsUTF8Unsafe(), &lock); 2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(status.ok()); 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) status = env->UnlockFile(lock); 2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(status.ok()); 2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) status = env->LockFile(file.AsUTF8Unsafe(), &lock); 2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(status.ok()); 2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) leveldb::FileLock* lock2; 2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) status = env->LockFile(file.AsUTF8Unsafe(), &lock2); 2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FALSE(status.ok()); 2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) status = env->UnlockFile(lock); 2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(status.ok()); 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace content 268