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