Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: components/leveldb/leveldb_service_unittest.cc

Issue 2096293002: Eliminate usage of InterfacePtr::WaitForIncomingResponse. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase only Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/macros.h" 6 #include "base/macros.h"
7 #include "base/run_loop.h"
7 #include "components/filesystem/public/interfaces/directory.mojom.h" 8 #include "components/filesystem/public/interfaces/directory.mojom.h"
8 #include "components/filesystem/public/interfaces/file_system.mojom.h" 9 #include "components/filesystem/public/interfaces/file_system.mojom.h"
9 #include "components/filesystem/public/interfaces/types.mojom.h" 10 #include "components/filesystem/public/interfaces/types.mojom.h"
10 #include "components/leveldb/public/interfaces/leveldb.mojom.h" 11 #include "components/leveldb/public/interfaces/leveldb.mojom.h"
11 #include "mojo/common/common_type_converters.h" 12 #include "mojo/common/common_type_converters.h"
12 #include "mojo/public/cpp/bindings/binding_set.h" 13 #include "mojo/public/cpp/bindings/binding_set.h"
13 #include "services/shell/public/cpp/shell_connection.h" 14 #include "services/shell/public/cpp/shell_connection.h"
14 #include "services/shell/public/cpp/shell_test.h" 15 #include "services/shell/public/cpp/shell_test.h"
15 16
16 using filesystem::mojom::FileError; 17 using filesystem::mojom::FileError;
17 18
18 namespace leveldb { 19 namespace leveldb {
19 namespace { 20 namespace {
20 21
21 template <typename... Args> void IgnoreAllArgs(Args&&...) {} 22 template <typename... Args> void IgnoreAllArgs(Args&&...) {}
22 23
23 template <typename... Args> 24 template <typename... Args>
24 void DoCaptures(Args*... out_args, Args... in_args) { 25 void DoCaptures(Args*... out_args,
26 const base::Closure& quit_closure,
27 Args... in_args) {
25 IgnoreAllArgs((*out_args = std::move(in_args))...); 28 IgnoreAllArgs((*out_args = std::move(in_args))...);
29 if (!quit_closure.is_null())
Elliot Glaysher 2016/07/06 16:44:30 Is this ever actually null?
leonhsl(Using Gerrit) 2016/07/07 07:43:12 Removed the null check. I was assuming that some c
30 quit_closure.Run();
26 } 31 }
27 32
28 template <typename T1> 33 template <typename T1>
29 base::Callback<void(T1)> Capture(T1* t1) { 34 base::Callback<void(T1)> Capture(
30 return base::Bind(&DoCaptures<T1>, t1); 35 T1* t1,
36 const base::Closure& quit_closure = base::Closure()) {
37 return base::Bind(&DoCaptures<T1>, t1, quit_closure);
31 } 38 }
32 39
33 template <typename T1, typename T2> 40 template <typename T1, typename T2>
34 base::Callback<void(T1, T2)> Capture(T1* t1, T2* t2) { 41 base::Callback<void(T1, T2)>
35 return base::Bind(&DoCaptures<T1, T2>, t1, t2); 42 Capture(T1* t1, T2* t2, const base::Closure& quit_closure = base::Closure()) {
Elliot Glaysher 2016/07/06 16:44:30 Don't use default parameters.
leonhsl(Using Gerrit) 2016/07/07 07:43:12 Done.
43 return base::Bind(&DoCaptures<T1, T2>, t1, t2, quit_closure);
44 }
45
46 void DatabaseSyncPut(mojom::LevelDBDatabasePtr& database,
yzshen1 2016/07/06 16:50:26 nit: |database| could be "mojom::LevelDBDatabase*"
leonhsl(Using Gerrit) 2016/07/07 07:43:12 Done.
47 mojo::Array<uint8_t> key,
48 mojo::Array<uint8_t> value,
49 mojom::DatabaseError* out_error) {
50 base::RunLoop run_loop;
51 database->Put(std::move(key), std::move(value),
52 Capture(out_error, run_loop.QuitClosure()));
53 run_loop.Run();
54 }
55
56 void DatabaseSyncGet(mojom::LevelDBDatabasePtr& database,
57 mojo::Array<uint8_t> key,
58 mojom::DatabaseError* out_error,
59 mojo::Array<uint8_t>* out_value) {
60 base::RunLoop run_loop;
61 database->Get(std::move(key),
62 Capture(out_error, out_value, run_loop.QuitClosure()));
63 run_loop.Run();
64 }
65
66 void DatabaseSyncGetPrefixed(mojom::LevelDBDatabasePtr& database,
67 mojo::Array<uint8_t> key_prefix,
68 mojom::DatabaseError* out_error,
69 mojo::Array<mojom::KeyValuePtr>* out_key_values) {
70 base::RunLoop run_loop;
71 database->GetPrefixed(
72 std::move(key_prefix),
73 Capture(out_error, out_key_values, run_loop.QuitClosure()));
74 run_loop.Run();
75 }
76
77 void DatabaseSyncDeletePrefixed(mojom::LevelDBDatabasePtr& database,
78 mojo::Array<uint8_t> key_prefix,
79 mojom::DatabaseError* out_error) {
80 base::RunLoop run_loop;
81 database->DeletePrefixed(std::move(key_prefix),
82 Capture(out_error, run_loop.QuitClosure()));
83 run_loop.Run();
84 }
85
86 void LevelDBSyncOpenInMemory(mojom::LevelDBServicePtr& leveldb,
87 mojom::LevelDBDatabaseRequest database,
88 mojom::DatabaseError* out_error) {
89 base::RunLoop run_loop;
90 leveldb->OpenInMemory(std::move(database),
91 Capture(out_error, run_loop.QuitClosure()));
92 run_loop.Run();
36 } 93 }
37 94
38 class LevelDBServiceTest : public shell::test::ShellTest { 95 class LevelDBServiceTest : public shell::test::ShellTest {
39 public: 96 public:
40 LevelDBServiceTest() : ShellTest("exe:leveldb_service_unittests") {} 97 LevelDBServiceTest() : ShellTest("exe:leveldb_service_unittests") {}
41 ~LevelDBServiceTest() override {} 98 ~LevelDBServiceTest() override {}
42 99
43 protected: 100 protected:
44 // Overridden from mojo::test::ApplicationTestBase: 101 // Overridden from mojo::test::ApplicationTestBase:
45 void SetUp() override { 102 void SetUp() override {
46 ShellTest::SetUp(); 103 ShellTest::SetUp();
47 connector()->ConnectToInterface("mojo:filesystem", &files_); 104 connector()->ConnectToInterface("mojo:filesystem", &files_);
48 connector()->ConnectToInterface("mojo:leveldb", &leveldb_); 105 connector()->ConnectToInterface("mojo:leveldb", &leveldb_);
49 } 106 }
50 107
51 void TearDown() override { 108 void TearDown() override {
52 leveldb_.reset(); 109 leveldb_.reset();
53 files_.reset(); 110 files_.reset();
54 ShellTest::TearDown(); 111 ShellTest::TearDown();
55 } 112 }
56 113
57 // Note: This has an out parameter rather than returning the |DirectoryPtr|, 114 // Note: This has an out parameter rather than returning the |DirectoryPtr|,
58 // since |ASSERT_...()| doesn't work with return values. 115 // since |ASSERT_...()| doesn't work with return values.
59 void GetTempDirectory(filesystem::mojom::DirectoryPtr* directory) { 116 void GetTempDirectory(filesystem::mojom::DirectoryPtr* directory) {
60 FileError error = FileError::FAILED; 117 FileError error = FileError::FAILED;
61 files()->OpenTempDirectory(GetProxy(directory), Capture(&error)); 118 bool handled = files()->OpenTempDirectory(GetProxy(directory), &error);
62 ASSERT_TRUE(files().WaitForIncomingResponse()); 119 ASSERT_TRUE(handled);
63 ASSERT_EQ(FileError::OK, error); 120 ASSERT_EQ(FileError::OK, error);
64 } 121 }
65 122
66 filesystem::mojom::FileSystemPtr& files() { return files_; } 123 filesystem::mojom::FileSystemPtr& files() { return files_; }
67 mojom::LevelDBServicePtr& leveldb() { return leveldb_; } 124 mojom::LevelDBServicePtr& leveldb() { return leveldb_; }
68 125
69 private: 126 private:
70 filesystem::mojom::FileSystemPtr files_; 127 filesystem::mojom::FileSystemPtr files_;
71 mojom::LevelDBServicePtr leveldb_; 128 mojom::LevelDBServicePtr leveldb_;
72 129
73 DISALLOW_COPY_AND_ASSIGN(LevelDBServiceTest); 130 DISALLOW_COPY_AND_ASSIGN(LevelDBServiceTest);
74 }; 131 };
75 132
76 TEST_F(LevelDBServiceTest, Basic) { 133 TEST_F(LevelDBServiceTest, Basic) {
77 mojom::DatabaseError error; 134 mojom::DatabaseError error;
78 mojom::LevelDBDatabasePtr database; 135 mojom::LevelDBDatabasePtr database;
79 leveldb()->OpenInMemory(GetProxy(&database), Capture(&error)); 136 LevelDBSyncOpenInMemory(leveldb(), GetProxy(&database), &error);
80 ASSERT_TRUE(leveldb().WaitForIncomingResponse());
81 EXPECT_EQ(mojom::DatabaseError::OK, error); 137 EXPECT_EQ(mojom::DatabaseError::OK, error);
82 138
83 // Write a key to the database. 139 // Write a key to the database.
84 error = mojom::DatabaseError::INVALID_ARGUMENT; 140 error = mojom::DatabaseError::INVALID_ARGUMENT;
85 database->Put(mojo::Array<uint8_t>::From(std::string("key")), 141 DatabaseSyncPut(database, mojo::Array<uint8_t>::From(std::string("key")),
86 mojo::Array<uint8_t>::From(std::string("value")), 142 mojo::Array<uint8_t>::From(std::string("value")), &error);
87 Capture(&error));
88 ASSERT_TRUE(database.WaitForIncomingResponse());
89 EXPECT_EQ(mojom::DatabaseError::OK, error); 143 EXPECT_EQ(mojom::DatabaseError::OK, error);
90 144
91 // Read the key back from the database. 145 // Read the key back from the database.
92 error = mojom::DatabaseError::INVALID_ARGUMENT; 146 error = mojom::DatabaseError::INVALID_ARGUMENT;
93 mojo::Array<uint8_t> value; 147 mojo::Array<uint8_t> value;
94 database->Get(mojo::Array<uint8_t>::From(std::string("key")), 148 DatabaseSyncGet(database, mojo::Array<uint8_t>::From(std::string("key")),
95 Capture(&error, &value)); 149 &error, &value);
96 ASSERT_TRUE(database.WaitForIncomingResponse());
97 EXPECT_EQ(mojom::DatabaseError::OK, error); 150 EXPECT_EQ(mojom::DatabaseError::OK, error);
98 EXPECT_EQ("value", value.To<std::string>()); 151 EXPECT_EQ("value", value.To<std::string>());
99 152
100 // Delete the key from the database. 153 // Delete the key from the database.
101 error = mojom::DatabaseError::INVALID_ARGUMENT; 154 error = mojom::DatabaseError::INVALID_ARGUMENT;
155 base::RunLoop run_loop;
102 database->Delete(mojo::Array<uint8_t>::From(std::string("key")), 156 database->Delete(mojo::Array<uint8_t>::From(std::string("key")),
103 Capture(&error)); 157 Capture(&error, run_loop.QuitClosure()));
104 ASSERT_TRUE(database.WaitForIncomingResponse()); 158 run_loop.Run();
105 EXPECT_EQ(mojom::DatabaseError::OK, error); 159 EXPECT_EQ(mojom::DatabaseError::OK, error);
106 160
107 // Read the key back from the database. 161 // Read the key back from the database.
108 error = mojom::DatabaseError::INVALID_ARGUMENT; 162 error = mojom::DatabaseError::INVALID_ARGUMENT;
109 value.SetToEmpty(); 163 value.SetToEmpty();
110 database->Get(mojo::Array<uint8_t>::From(std::string("key")), 164 DatabaseSyncGet(database, mojo::Array<uint8_t>::From(std::string("key")),
111 Capture(&error, &value)); 165 &error, &value);
112 ASSERT_TRUE(database.WaitForIncomingResponse());
113 EXPECT_EQ(mojom::DatabaseError::NOT_FOUND, error); 166 EXPECT_EQ(mojom::DatabaseError::NOT_FOUND, error);
114 EXPECT_EQ("", value.To<std::string>()); 167 EXPECT_EQ("", value.To<std::string>());
115 } 168 }
116 169
117 TEST_F(LevelDBServiceTest, WriteBatch) { 170 TEST_F(LevelDBServiceTest, WriteBatch) {
118 mojom::DatabaseError error; 171 mojom::DatabaseError error;
119 mojom::LevelDBDatabasePtr database; 172 mojom::LevelDBDatabasePtr database;
120 leveldb()->OpenInMemory(GetProxy(&database), Capture(&error)); 173 LevelDBSyncOpenInMemory(leveldb(), GetProxy(&database), &error);
121 ASSERT_TRUE(leveldb().WaitForIncomingResponse());
122 EXPECT_EQ(mojom::DatabaseError::OK, error); 174 EXPECT_EQ(mojom::DatabaseError::OK, error);
123 175
124 // Write a key to the database. 176 // Write a key to the database.
125 database->Put(mojo::Array<uint8_t>::From(std::string("key")), 177 DatabaseSyncPut(database, mojo::Array<uint8_t>::From(std::string("key")),
126 mojo::Array<uint8_t>::From(std::string("value")), 178 mojo::Array<uint8_t>::From(std::string("value")), &error);
127 Capture(&error));
128 ASSERT_TRUE(database.WaitForIncomingResponse());
129 EXPECT_EQ(mojom::DatabaseError::OK, error); 179 EXPECT_EQ(mojom::DatabaseError::OK, error);
130 180
131 // Create a batched operation which both deletes "key" and adds another write. 181 // Create a batched operation which both deletes "key" and adds another write.
132 mojo::Array<mojom::BatchedOperationPtr> operations; 182 mojo::Array<mojom::BatchedOperationPtr> operations;
133 mojom::BatchedOperationPtr item = mojom::BatchedOperation::New(); 183 mojom::BatchedOperationPtr item = mojom::BatchedOperation::New();
134 item->type = mojom::BatchOperationType::DELETE_KEY; 184 item->type = mojom::BatchOperationType::DELETE_KEY;
135 item->key = mojo::Array<uint8_t>::From(std::string("key")); 185 item->key = mojo::Array<uint8_t>::From(std::string("key"));
136 operations.push_back(std::move(item)); 186 operations.push_back(std::move(item));
137 187
138 item = mojom::BatchedOperation::New(); 188 item = mojom::BatchedOperation::New();
139 item->type = mojom::BatchOperationType::PUT_KEY; 189 item->type = mojom::BatchOperationType::PUT_KEY;
140 item->key = mojo::Array<uint8_t>::From(std::string("other")); 190 item->key = mojo::Array<uint8_t>::From(std::string("other"));
141 item->value = mojo::Array<uint8_t>::From(std::string("more")); 191 item->value = mojo::Array<uint8_t>::From(std::string("more"));
142 operations.push_back(std::move(item)); 192 operations.push_back(std::move(item));
143 193
144 database->Write(std::move(operations), Capture(&error)); 194 base::RunLoop run_loop;
145 ASSERT_TRUE(database.WaitForIncomingResponse()); 195 database->Write(std::move(operations),
196 Capture(&error, run_loop.QuitClosure()));
197 run_loop.Run();
146 EXPECT_EQ(mojom::DatabaseError::OK, error); 198 EXPECT_EQ(mojom::DatabaseError::OK, error);
147 199
148 // Reading "key" should be invalid now. 200 // Reading "key" should be invalid now.
149 error = mojom::DatabaseError::INVALID_ARGUMENT; 201 error = mojom::DatabaseError::INVALID_ARGUMENT;
150 mojo::Array<uint8_t> value; 202 mojo::Array<uint8_t> value;
151 database->Get(mojo::Array<uint8_t>::From(std::string("key")), 203 DatabaseSyncGet(database, mojo::Array<uint8_t>::From(std::string("key")),
152 Capture(&error, &value)); 204 &error, &value);
153 ASSERT_TRUE(database.WaitForIncomingResponse());
154 EXPECT_EQ(mojom::DatabaseError::NOT_FOUND, error); 205 EXPECT_EQ(mojom::DatabaseError::NOT_FOUND, error);
155 EXPECT_EQ("", value.To<std::string>()); 206 EXPECT_EQ("", value.To<std::string>());
156 207
157 // Reading "other" should return "more" 208 // Reading "other" should return "more"
158 error = mojom::DatabaseError::INVALID_ARGUMENT; 209 error = mojom::DatabaseError::INVALID_ARGUMENT;
159 database->Get(mojo::Array<uint8_t>::From(std::string("other")), 210 DatabaseSyncGet(database, mojo::Array<uint8_t>::From(std::string("other")),
160 Capture(&error, &value)); 211 &error, &value);
161 ASSERT_TRUE(database.WaitForIncomingResponse());
162 EXPECT_EQ(mojom::DatabaseError::OK, error); 212 EXPECT_EQ(mojom::DatabaseError::OK, error);
163 EXPECT_EQ("more", value.To<std::string>()); 213 EXPECT_EQ("more", value.To<std::string>());
164 214
165 // Write a some prefixed keys to the database. 215 // Write a some prefixed keys to the database.
166 database->Put(mojo::Array<uint8_t>::From(std::string("prefix-key1")), 216 DatabaseSyncPut(database,
167 mojo::Array<uint8_t>::From(std::string("value")), 217 mojo::Array<uint8_t>::From(std::string("prefix-key1")),
168 Capture(&error)); 218 mojo::Array<uint8_t>::From(std::string("value")), &error);
169 ASSERT_TRUE(database.WaitForIncomingResponse());
170 EXPECT_EQ(mojom::DatabaseError::OK, error); 219 EXPECT_EQ(mojom::DatabaseError::OK, error);
171 database->Put(mojo::Array<uint8_t>::From(std::string("prefix-key2")), 220 DatabaseSyncPut(database,
172 mojo::Array<uint8_t>::From(std::string("value")), 221 mojo::Array<uint8_t>::From(std::string("prefix-key2")),
173 Capture(&error)); 222 mojo::Array<uint8_t>::From(std::string("value")), &error);
174 ASSERT_TRUE(database.WaitForIncomingResponse());
175 EXPECT_EQ(mojom::DatabaseError::OK, error); 223 EXPECT_EQ(mojom::DatabaseError::OK, error);
176 224
177 // Create a batched operation to delete them. 225 // Create a batched operation to delete them.
178 operations.SetToEmpty(); 226 operations.SetToEmpty();
179 item = mojom::BatchedOperation::New(); 227 item = mojom::BatchedOperation::New();
180 item->type = mojom::BatchOperationType::DELETE_PREFIXED_KEY; 228 item->type = mojom::BatchOperationType::DELETE_PREFIXED_KEY;
181 item->key = mojo::Array<uint8_t>::From(std::string("prefix")); 229 item->key = mojo::Array<uint8_t>::From(std::string("prefix"));
182 operations.push_back(std::move(item)); 230 operations.push_back(std::move(item));
183 database->Write(std::move(operations), Capture(&error)); 231 base::RunLoop run_loop2;
184 ASSERT_TRUE(database.WaitForIncomingResponse()); 232 database->Write(std::move(operations),
233 Capture(&error, run_loop2.QuitClosure()));
234 run_loop2.Run();
185 EXPECT_EQ(mojom::DatabaseError::OK, error); 235 EXPECT_EQ(mojom::DatabaseError::OK, error);
186 236
187 // Reading all "prefix" keys should be invalid now. 237 // Reading all "prefix" keys should be invalid now.
188 error = mojom::DatabaseError::INVALID_ARGUMENT; 238 error = mojom::DatabaseError::INVALID_ARGUMENT;
189 value = nullptr; 239 value = nullptr;
190 database->Get(mojo::Array<uint8_t>::From(std::string("prefix-key1")), 240 DatabaseSyncGet(database,
191 Capture(&error, &value)); 241 mojo::Array<uint8_t>::From(std::string("prefix-key1")),
192 ASSERT_TRUE(database.WaitForIncomingResponse()); 242 &error, &value);
193 EXPECT_EQ(mojom::DatabaseError::NOT_FOUND, error); 243 EXPECT_EQ(mojom::DatabaseError::NOT_FOUND, error);
194 EXPECT_EQ("", value.To<std::string>()); 244 EXPECT_EQ("", value.To<std::string>());
195 // Reading "key" should be invalid now. 245 // Reading "key" should be invalid now.
196 error = mojom::DatabaseError::INVALID_ARGUMENT; 246 error = mojom::DatabaseError::INVALID_ARGUMENT;
197 value = nullptr; 247 value = nullptr;
198 database->Get(mojo::Array<uint8_t>::From(std::string("prefix-key2")), 248 DatabaseSyncGet(database,
199 Capture(&error, &value)); 249 mojo::Array<uint8_t>::From(std::string("prefix-key2")),
200 ASSERT_TRUE(database.WaitForIncomingResponse()); 250 &error, &value);
201 EXPECT_EQ(mojom::DatabaseError::NOT_FOUND, error); 251 EXPECT_EQ(mojom::DatabaseError::NOT_FOUND, error);
202 EXPECT_EQ("", value.To<std::string>()); 252 EXPECT_EQ("", value.To<std::string>());
203 } 253 }
204 254
205 TEST_F(LevelDBServiceTest, Reconnect) { 255 TEST_F(LevelDBServiceTest, Reconnect) {
206 mojom::DatabaseError error; 256 mojom::DatabaseError error;
207 257
208 filesystem::mojom::DirectoryPtr temp_directory; 258 filesystem::mojom::DirectoryPtr temp_directory;
209 GetTempDirectory(&temp_directory); 259 GetTempDirectory(&temp_directory);
210 260
211 { 261 {
212 filesystem::mojom::DirectoryPtr directory; 262 filesystem::mojom::DirectoryPtr directory;
213 temp_directory->Clone(GetProxy(&directory)); 263 temp_directory->Clone(GetProxy(&directory));
214 264
215 mojom::LevelDBDatabasePtr database; 265 mojom::LevelDBDatabasePtr database;
216 leveldb::mojom::OpenOptionsPtr options = leveldb::mojom::OpenOptions::New(); 266 leveldb::mojom::OpenOptionsPtr options = leveldb::mojom::OpenOptions::New();
217 options->error_if_exists = true; 267 options->error_if_exists = true;
218 options->create_if_missing = true; 268 options->create_if_missing = true;
219 leveldb()->OpenWithOptions(std::move(options), 269 base::RunLoop run_loop;
220 std::move(directory), "test", 270 leveldb()->OpenWithOptions(std::move(options), std::move(directory), "test",
221 GetProxy(&database), 271 GetProxy(&database),
222 Capture(&error)); 272 Capture(&error, run_loop.QuitClosure()));
223 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); 273 run_loop.Run();
224 EXPECT_EQ(mojom::DatabaseError::OK, error); 274 EXPECT_EQ(mojom::DatabaseError::OK, error);
225 275
226 // Write a key to the database. 276 // Write a key to the database.
227 error = mojom::DatabaseError::INVALID_ARGUMENT; 277 error = mojom::DatabaseError::INVALID_ARGUMENT;
228 database->Put(mojo::Array<uint8_t>::From(std::string("key")), 278 DatabaseSyncPut(database, mojo::Array<uint8_t>::From(std::string("key")),
229 mojo::Array<uint8_t>::From(std::string("value")), 279 mojo::Array<uint8_t>::From(std::string("value")), &error);
230 Capture(&error));
231 ASSERT_TRUE(database.WaitForIncomingResponse());
232 EXPECT_EQ(mojom::DatabaseError::OK, error); 280 EXPECT_EQ(mojom::DatabaseError::OK, error);
233 281
234 // The database should go out of scope here. 282 // The database should go out of scope here.
235 } 283 }
236 284
237 { 285 {
238 filesystem::mojom::DirectoryPtr directory; 286 filesystem::mojom::DirectoryPtr directory;
239 temp_directory->Clone(GetProxy(&directory)); 287 temp_directory->Clone(GetProxy(&directory));
240 288
241 // Reconnect to the database. 289 // Reconnect to the database.
242 mojom::LevelDBDatabasePtr database; 290 mojom::LevelDBDatabasePtr database;
291 base::RunLoop run_loop;
243 leveldb()->Open(std::move(directory), "test", GetProxy(&database), 292 leveldb()->Open(std::move(directory), "test", GetProxy(&database),
244 Capture(&error)); 293 Capture(&error, run_loop.QuitClosure()));
245 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); 294 run_loop.Run();
246 EXPECT_EQ(mojom::DatabaseError::OK, error); 295 EXPECT_EQ(mojom::DatabaseError::OK, error);
247 296
248 // We should still be able to read the key back from the database. 297 // We should still be able to read the key back from the database.
249 error = mojom::DatabaseError::INVALID_ARGUMENT; 298 error = mojom::DatabaseError::INVALID_ARGUMENT;
250 mojo::Array<uint8_t> value; 299 mojo::Array<uint8_t> value;
251 database->Get(mojo::Array<uint8_t>::From(std::string("key")), 300 DatabaseSyncGet(database, mojo::Array<uint8_t>::From(std::string("key")),
252 Capture(&error, &value)); 301 &error, &value);
253 ASSERT_TRUE(database.WaitForIncomingResponse());
254 EXPECT_EQ(mojom::DatabaseError::OK, error); 302 EXPECT_EQ(mojom::DatabaseError::OK, error);
255 EXPECT_EQ("value", value.To<std::string>()); 303 EXPECT_EQ("value", value.To<std::string>());
256 } 304 }
257 } 305 }
258 306
259 TEST_F(LevelDBServiceTest, GetSnapshotSimple) { 307 TEST_F(LevelDBServiceTest, GetSnapshotSimple) {
260 mojom::DatabaseError error; 308 mojom::DatabaseError error;
261 mojom::LevelDBDatabasePtr database; 309 mojom::LevelDBDatabasePtr database;
262 leveldb()->OpenInMemory(GetProxy(&database), Capture(&error)); 310 LevelDBSyncOpenInMemory(leveldb(), GetProxy(&database), &error);
263 ASSERT_TRUE(leveldb().WaitForIncomingResponse());
264 EXPECT_EQ(mojom::DatabaseError::OK, error); 311 EXPECT_EQ(mojom::DatabaseError::OK, error);
265 312
266 uint64_t snapshot_id = 0; 313 uint64_t snapshot_id = 0;
267 database->GetSnapshot(Capture(&snapshot_id)); 314 base::RunLoop run_loop;
268 ASSERT_TRUE(database.WaitForIncomingResponse()); 315 database->GetSnapshot(Capture(&snapshot_id, run_loop.QuitClosure()));
316 run_loop.Run();
269 EXPECT_NE(static_cast<uint64_t>(0), snapshot_id); 317 EXPECT_NE(static_cast<uint64_t>(0), snapshot_id);
270 } 318 }
271 319
272 TEST_F(LevelDBServiceTest, GetFromSnapshots) { 320 TEST_F(LevelDBServiceTest, GetFromSnapshots) {
273 mojom::DatabaseError error; 321 mojom::DatabaseError error;
274 mojom::LevelDBDatabasePtr database; 322 mojom::LevelDBDatabasePtr database;
275 leveldb()->OpenInMemory(GetProxy(&database), Capture(&error)); 323 LevelDBSyncOpenInMemory(leveldb(), GetProxy(&database), &error);
276 ASSERT_TRUE(leveldb().WaitForIncomingResponse());
277 EXPECT_EQ(mojom::DatabaseError::OK, error); 324 EXPECT_EQ(mojom::DatabaseError::OK, error);
278 325
279 // Write a key to the database. 326 // Write a key to the database.
280 error = mojom::DatabaseError::INVALID_ARGUMENT; 327 error = mojom::DatabaseError::INVALID_ARGUMENT;
281 database->Put(mojo::Array<uint8_t>::From(std::string("key")), 328 DatabaseSyncPut(database, mojo::Array<uint8_t>::From(std::string("key")),
282 mojo::Array<uint8_t>::From(std::string("value")), 329 mojo::Array<uint8_t>::From(std::string("value")), &error);
283 Capture(&error));
284 ASSERT_TRUE(database.WaitForIncomingResponse());
285 EXPECT_EQ(mojom::DatabaseError::OK, error); 330 EXPECT_EQ(mojom::DatabaseError::OK, error);
286 331
287 // Take a snapshot where key=value. 332 // Take a snapshot where key=value.
288 uint64_t key_value_snapshot = 0; 333 uint64_t key_value_snapshot = 0;
289 database->GetSnapshot(Capture(&key_value_snapshot)); 334 base::RunLoop run_loop;
290 ASSERT_TRUE(database.WaitForIncomingResponse()); 335 database->GetSnapshot(Capture(&key_value_snapshot, run_loop.QuitClosure()));
336 run_loop.Run();
291 337
292 // Change key to "yek". 338 // Change key to "yek".
293 error = mojom::DatabaseError::INVALID_ARGUMENT; 339 error = mojom::DatabaseError::INVALID_ARGUMENT;
294 database->Put(mojo::Array<uint8_t>::From(std::string("key")), 340 DatabaseSyncPut(database, mojo::Array<uint8_t>::From(std::string("key")),
295 mojo::Array<uint8_t>::From(std::string("yek")), 341 mojo::Array<uint8_t>::From(std::string("yek")), &error);
296 Capture(&error));
297 ASSERT_TRUE(database.WaitForIncomingResponse());
298 EXPECT_EQ(mojom::DatabaseError::OK, error); 342 EXPECT_EQ(mojom::DatabaseError::OK, error);
299 343
300 // (Ensure this change is live on the database.) 344 // (Ensure this change is live on the database.)
301 error = mojom::DatabaseError::INVALID_ARGUMENT; 345 error = mojom::DatabaseError::INVALID_ARGUMENT;
302 mojo::Array<uint8_t> value; 346 mojo::Array<uint8_t> value;
303 database->Get(mojo::Array<uint8_t>::From(std::string("key")), 347 DatabaseSyncGet(database, mojo::Array<uint8_t>::From(std::string("key")),
304 Capture(&error, &value)); 348 &error, &value);
305 ASSERT_TRUE(database.WaitForIncomingResponse());
306 EXPECT_EQ(mojom::DatabaseError::OK, error); 349 EXPECT_EQ(mojom::DatabaseError::OK, error);
307 EXPECT_EQ("yek", value.To<std::string>()); 350 EXPECT_EQ("yek", value.To<std::string>());
308 351
309 // But if we were to read from the snapshot, we'd still get value. 352 // But if we were to read from the snapshot, we'd still get value.
310 error = mojom::DatabaseError::INVALID_ARGUMENT; 353 error = mojom::DatabaseError::INVALID_ARGUMENT;
311 value.SetToEmpty(); 354 value.SetToEmpty();
312 database->GetFromSnapshot( 355 base::RunLoop run_loop2;
313 key_value_snapshot, 356 database->GetFromSnapshot(key_value_snapshot,
314 mojo::Array<uint8_t>::From(std::string("key")), 357 mojo::Array<uint8_t>::From(std::string("key")),
315 Capture(&error, &value)); 358 Capture(&error, &value, run_loop2.QuitClosure()));
316 ASSERT_TRUE(database.WaitForIncomingResponse()); 359 run_loop2.Run();
317 EXPECT_EQ(mojom::DatabaseError::OK, error); 360 EXPECT_EQ(mojom::DatabaseError::OK, error);
318 EXPECT_EQ("value", value.To<std::string>()); 361 EXPECT_EQ("value", value.To<std::string>());
319 } 362 }
320 363
321 TEST_F(LevelDBServiceTest, InvalidArgumentOnInvalidSnapshot) { 364 TEST_F(LevelDBServiceTest, InvalidArgumentOnInvalidSnapshot) {
322 mojom::LevelDBDatabasePtr database; 365 mojom::LevelDBDatabasePtr database;
323 mojom::DatabaseError error = mojom::DatabaseError::INVALID_ARGUMENT; 366 mojom::DatabaseError error = mojom::DatabaseError::INVALID_ARGUMENT;
324 leveldb()->OpenInMemory(GetProxy(&database), Capture(&error)); 367 LevelDBSyncOpenInMemory(leveldb(), GetProxy(&database), &error);
325 ASSERT_TRUE(leveldb().WaitForIncomingResponse());
326 EXPECT_EQ(mojom::DatabaseError::OK, error); 368 EXPECT_EQ(mojom::DatabaseError::OK, error);
327 369
328 uint64_t invalid_snapshot = 8; 370 uint64_t invalid_snapshot = 8;
329 371
330 error = mojom::DatabaseError::OK; 372 error = mojom::DatabaseError::OK;
331 mojo::Array<uint8_t> value; 373 mojo::Array<uint8_t> value;
332 database->GetFromSnapshot( 374 base::RunLoop run_loop;
333 invalid_snapshot, 375 database->GetFromSnapshot(invalid_snapshot,
334 mojo::Array<uint8_t>::From(std::string("key")), 376 mojo::Array<uint8_t>::From(std::string("key")),
335 Capture(&error, &value)); 377 Capture(&error, &value, run_loop.QuitClosure()));
336 ASSERT_TRUE(database.WaitForIncomingResponse()); 378 run_loop.Run();
337 EXPECT_EQ(mojom::DatabaseError::INVALID_ARGUMENT, error); 379 EXPECT_EQ(mojom::DatabaseError::INVALID_ARGUMENT, error);
338 } 380 }
339 381
340 TEST_F(LevelDBServiceTest, MemoryDBReadWrite) { 382 TEST_F(LevelDBServiceTest, MemoryDBReadWrite) {
341 mojom::LevelDBDatabasePtr database; 383 mojom::LevelDBDatabasePtr database;
342 mojom::DatabaseError error = mojom::DatabaseError::INVALID_ARGUMENT; 384 mojom::DatabaseError error = mojom::DatabaseError::INVALID_ARGUMENT;
343 leveldb()->OpenInMemory(GetProxy(&database), Capture(&error)); 385 LevelDBSyncOpenInMemory(leveldb(), GetProxy(&database), &error);
344 ASSERT_TRUE(leveldb().WaitForIncomingResponse());
345 EXPECT_EQ(mojom::DatabaseError::OK, error); 386 EXPECT_EQ(mojom::DatabaseError::OK, error);
346 387
347 // Write a key to the database. 388 // Write a key to the database.
348 error = mojom::DatabaseError::INVALID_ARGUMENT; 389 error = mojom::DatabaseError::INVALID_ARGUMENT;
349 database->Put(mojo::Array<uint8_t>::From(std::string("key")), 390 DatabaseSyncPut(database, mojo::Array<uint8_t>::From(std::string("key")),
350 mojo::Array<uint8_t>::From(std::string("value")), 391 mojo::Array<uint8_t>::From(std::string("value")), &error);
351 Capture(&error));
352 ASSERT_TRUE(database.WaitForIncomingResponse());
353 EXPECT_EQ(mojom::DatabaseError::OK, error); 392 EXPECT_EQ(mojom::DatabaseError::OK, error);
354 393
355 // Read the key back from the database. 394 // Read the key back from the database.
356 error = mojom::DatabaseError::INVALID_ARGUMENT; 395 error = mojom::DatabaseError::INVALID_ARGUMENT;
357 mojo::Array<uint8_t> value; 396 mojo::Array<uint8_t> value;
358 database->Get(mojo::Array<uint8_t>::From(std::string("key")), 397 DatabaseSyncGet(database, mojo::Array<uint8_t>::From(std::string("key")),
359 Capture(&error, &value)); 398 &error, &value);
360 ASSERT_TRUE(database.WaitForIncomingResponse());
361 EXPECT_EQ(mojom::DatabaseError::OK, error); 399 EXPECT_EQ(mojom::DatabaseError::OK, error);
362 EXPECT_EQ("value", value.To<std::string>()); 400 EXPECT_EQ("value", value.To<std::string>());
363 401
364 // Delete the key from the database. 402 // Delete the key from the database.
365 error = mojom::DatabaseError::INVALID_ARGUMENT; 403 error = mojom::DatabaseError::INVALID_ARGUMENT;
404 base::RunLoop run_loop;
366 database->Delete(mojo::Array<uint8_t>::From(std::string("key")), 405 database->Delete(mojo::Array<uint8_t>::From(std::string("key")),
367 Capture(&error)); 406 Capture(&error, run_loop.QuitClosure()));
368 ASSERT_TRUE(database.WaitForIncomingResponse()); 407 run_loop.Run();
369 EXPECT_EQ(mojom::DatabaseError::OK, error); 408 EXPECT_EQ(mojom::DatabaseError::OK, error);
370 409
371 // Read the key back from the database. 410 // Read the key back from the database.
372 error = mojom::DatabaseError::INVALID_ARGUMENT; 411 error = mojom::DatabaseError::INVALID_ARGUMENT;
373 value.SetToEmpty(); 412 value.SetToEmpty();
374 database->Get(mojo::Array<uint8_t>::From(std::string("key")), 413 DatabaseSyncGet(database, mojo::Array<uint8_t>::From(std::string("key")),
375 Capture(&error, &value)); 414 &error, &value);
376 ASSERT_TRUE(database.WaitForIncomingResponse());
377 EXPECT_EQ(mojom::DatabaseError::NOT_FOUND, error); 415 EXPECT_EQ(mojom::DatabaseError::NOT_FOUND, error);
378 EXPECT_EQ("", value.To<std::string>()); 416 EXPECT_EQ("", value.To<std::string>());
379 } 417 }
380 418
381 TEST_F(LevelDBServiceTest, Prefixed) { 419 TEST_F(LevelDBServiceTest, Prefixed) {
382 // Open an in memory database for speed. 420 // Open an in memory database for speed.
383 mojom::DatabaseError error = mojom::DatabaseError::INVALID_ARGUMENT; 421 mojom::DatabaseError error = mojom::DatabaseError::INVALID_ARGUMENT;
384 mojom::LevelDBDatabasePtr database; 422 mojom::LevelDBDatabasePtr database;
385 leveldb()->OpenInMemory(GetProxy(&database), Capture(&error)); 423 LevelDBSyncOpenInMemory(leveldb(), GetProxy(&database), &error);
386 ASSERT_TRUE(leveldb().WaitForIncomingResponse());
387 EXPECT_EQ(mojom::DatabaseError::OK, error); 424 EXPECT_EQ(mojom::DatabaseError::OK, error);
388 425
389 const std::string prefix("prefix"); 426 const std::string prefix("prefix");
390 mojo::Array<mojom::KeyValuePtr> key_values; 427 mojo::Array<mojom::KeyValuePtr> key_values;
391 428
392 // Completely empty database. 429 // Completely empty database.
393 error = mojom::DatabaseError::INVALID_ARGUMENT; 430 error = mojom::DatabaseError::INVALID_ARGUMENT;
394 database->GetPrefixed(mojo::Array<uint8_t>::From(prefix), 431 DatabaseSyncGetPrefixed(database, mojo::Array<uint8_t>::From(prefix), &error,
395 Capture(&error, &key_values)); 432 &key_values);
396 ASSERT_TRUE(database.WaitForIncomingResponse());
397 EXPECT_EQ(mojom::DatabaseError::OK, error); 433 EXPECT_EQ(mojom::DatabaseError::OK, error);
398 EXPECT_TRUE(key_values.empty()); 434 EXPECT_TRUE(key_values.empty());
399 435
400 // No values with our prefix, but values before and after. 436 // No values with our prefix, but values before and after.
401 error = mojom::DatabaseError::INVALID_ARGUMENT; 437 error = mojom::DatabaseError::INVALID_ARGUMENT;
402 database->Put(mojo::Array<uint8_t>::From(std::string("a-before-prefix")), 438 DatabaseSyncPut(database,
403 mojo::Array<uint8_t>::From(std::string("value")), 439 mojo::Array<uint8_t>::From(std::string("a-before-prefix")),
404 Capture(&error)); 440 mojo::Array<uint8_t>::From(std::string("value")), &error);
405 ASSERT_TRUE(database.WaitForIncomingResponse());
406 EXPECT_EQ(mojom::DatabaseError::OK, error); 441 EXPECT_EQ(mojom::DatabaseError::OK, error);
407 error = mojom::DatabaseError::INVALID_ARGUMENT; 442 error = mojom::DatabaseError::INVALID_ARGUMENT;
408 database->Put(mojo::Array<uint8_t>::From(std::string("z-after-prefix")), 443 DatabaseSyncPut(database,
409 mojo::Array<uint8_t>::From(std::string("value")), 444 mojo::Array<uint8_t>::From(std::string("z-after-prefix")),
410 Capture(&error)); 445 mojo::Array<uint8_t>::From(std::string("value")), &error);
411 ASSERT_TRUE(database.WaitForIncomingResponse());
412 EXPECT_EQ(mojom::DatabaseError::OK, error); 446 EXPECT_EQ(mojom::DatabaseError::OK, error);
413 key_values.SetToEmpty(); 447 key_values.SetToEmpty();
414 error = mojom::DatabaseError::INVALID_ARGUMENT; 448 error = mojom::DatabaseError::INVALID_ARGUMENT;
415 database->GetPrefixed(mojo::Array<uint8_t>::From(prefix), 449 DatabaseSyncGetPrefixed(database, mojo::Array<uint8_t>::From(prefix), &error,
416 Capture(&error, &key_values)); 450 &key_values);
417 ASSERT_TRUE(database.WaitForIncomingResponse());
418 EXPECT_EQ(mojom::DatabaseError::OK, error); 451 EXPECT_EQ(mojom::DatabaseError::OK, error);
419 EXPECT_TRUE(key_values.empty()); 452 EXPECT_TRUE(key_values.empty());
420 453
421 // One value with the exact prefix. 454 // One value with the exact prefix.
422 database->Put(mojo::Array<uint8_t>::From(prefix), 455 DatabaseSyncPut(database, mojo::Array<uint8_t>::From(prefix),
423 mojo::Array<uint8_t>::From(std::string("value")), 456 mojo::Array<uint8_t>::From(std::string("value")), &error);
424 Capture(&error));
425 ASSERT_TRUE(database.WaitForIncomingResponse());
426 EXPECT_EQ(mojom::DatabaseError::OK, error); 457 EXPECT_EQ(mojom::DatabaseError::OK, error);
427 error = mojom::DatabaseError::INVALID_ARGUMENT; 458 error = mojom::DatabaseError::INVALID_ARGUMENT;
428 key_values.SetToEmpty(); 459 key_values.SetToEmpty();
429 database->GetPrefixed(mojo::Array<uint8_t>::From(prefix), 460 DatabaseSyncGetPrefixed(database, mojo::Array<uint8_t>::From(prefix), &error,
430 Capture(&error, &key_values)); 461 &key_values);
431 ASSERT_TRUE(database.WaitForIncomingResponse());
432 EXPECT_EQ(mojom::DatabaseError::OK, error); 462 EXPECT_EQ(mojom::DatabaseError::OK, error);
433 EXPECT_EQ(1u, key_values.size()); 463 EXPECT_EQ(1u, key_values.size());
434 EXPECT_EQ("prefix", key_values[0]->key.To<std::string>()); 464 EXPECT_EQ("prefix", key_values[0]->key.To<std::string>());
435 EXPECT_EQ("value", key_values[0]->value.To<std::string>()); 465 EXPECT_EQ("value", key_values[0]->value.To<std::string>());
436 466
437 // Multiple values with starting with the prefix. 467 // Multiple values with starting with the prefix.
438 database->Put(mojo::Array<uint8_t>::From(prefix + "2"), 468 DatabaseSyncPut(database, mojo::Array<uint8_t>::From(prefix + "2"),
439 mojo::Array<uint8_t>::From(std::string("value2")), 469 mojo::Array<uint8_t>::From(std::string("value2")), &error);
440 Capture(&error));
441 ASSERT_TRUE(database.WaitForIncomingResponse());
442 EXPECT_EQ(mojom::DatabaseError::OK, error); 470 EXPECT_EQ(mojom::DatabaseError::OK, error);
443 error = mojom::DatabaseError::INVALID_ARGUMENT; 471 error = mojom::DatabaseError::INVALID_ARGUMENT;
444 key_values.SetToEmpty(); 472 key_values.SetToEmpty();
445 database->GetPrefixed(mojo::Array<uint8_t>::From(prefix), 473 DatabaseSyncGetPrefixed(database, mojo::Array<uint8_t>::From(prefix), &error,
446 Capture(&error, &key_values)); 474 &key_values);
447 ASSERT_TRUE(database.WaitForIncomingResponse());
448 EXPECT_EQ(mojom::DatabaseError::OK, error); 475 EXPECT_EQ(mojom::DatabaseError::OK, error);
449 EXPECT_EQ(2u, key_values.size()); 476 EXPECT_EQ(2u, key_values.size());
450 EXPECT_EQ("prefix", key_values[0]->key.To<std::string>()); 477 EXPECT_EQ("prefix", key_values[0]->key.To<std::string>());
451 EXPECT_EQ("value", key_values[0]->value.To<std::string>()); 478 EXPECT_EQ("value", key_values[0]->value.To<std::string>());
452 EXPECT_EQ("prefix2", key_values[1]->key.To<std::string>()); 479 EXPECT_EQ("prefix2", key_values[1]->key.To<std::string>());
453 EXPECT_EQ("value2", key_values[1]->value.To<std::string>()); 480 EXPECT_EQ("value2", key_values[1]->value.To<std::string>());
454 481
455 // Delete the prefixed values. 482 // Delete the prefixed values.
456 error = mojom::DatabaseError::INVALID_ARGUMENT; 483 error = mojom::DatabaseError::INVALID_ARGUMENT;
457 database->DeletePrefixed(mojo::Array<uint8_t>::From(prefix), 484 DatabaseSyncDeletePrefixed(database, mojo::Array<uint8_t>::From(prefix),
458 Capture(&error)); 485 &error);
459 ASSERT_TRUE(database.WaitForIncomingResponse());
460 EXPECT_EQ(mojom::DatabaseError::OK, error); 486 EXPECT_EQ(mojom::DatabaseError::OK, error);
461 error = mojom::DatabaseError::INVALID_ARGUMENT; 487 error = mojom::DatabaseError::INVALID_ARGUMENT;
462 key_values.SetToEmpty(); 488 key_values.SetToEmpty();
463 database->GetPrefixed(mojo::Array<uint8_t>::From(prefix), 489 DatabaseSyncGetPrefixed(database, mojo::Array<uint8_t>::From(prefix), &error,
464 Capture(&error, &key_values)); 490 &key_values);
465 ASSERT_TRUE(database.WaitForIncomingResponse());
466 EXPECT_EQ(mojom::DatabaseError::OK, error); 491 EXPECT_EQ(mojom::DatabaseError::OK, error);
467 EXPECT_TRUE(key_values.empty()); 492 EXPECT_TRUE(key_values.empty());
468 493
469 // Make sure the others are not deleted. 494 // Make sure the others are not deleted.
470 mojo::Array<uint8_t> value; 495 mojo::Array<uint8_t> value;
471 database->Get(mojo::Array<uint8_t>::From(std::string("a-before-prefix")), 496 DatabaseSyncGet(database,
472 Capture(&error, &value)); 497 mojo::Array<uint8_t>::From(std::string("a-before-prefix")),
473 ASSERT_TRUE(database.WaitForIncomingResponse()); 498 &error, &value);
474 EXPECT_EQ(mojom::DatabaseError::OK, error); 499 EXPECT_EQ(mojom::DatabaseError::OK, error);
475 EXPECT_EQ("value", value.To<std::string>()); 500 EXPECT_EQ("value", value.To<std::string>());
476 value.SetToEmpty(); 501 value.SetToEmpty();
477 database->Get(mojo::Array<uint8_t>::From(std::string("z-after-prefix")), 502 DatabaseSyncGet(database,
478 Capture(&error, &value)); 503 mojo::Array<uint8_t>::From(std::string("z-after-prefix")),
479 ASSERT_TRUE(database.WaitForIncomingResponse()); 504 &error, &value);
480 EXPECT_EQ(mojom::DatabaseError::OK, error); 505 EXPECT_EQ(mojom::DatabaseError::OK, error);
481 EXPECT_EQ("value", value.To<std::string>()); 506 EXPECT_EQ("value", value.To<std::string>());
482 507
483 // A key having our prefix, but no key matching it exactly. 508 // A key having our prefix, but no key matching it exactly.
484 // Even thought there is no exact matching key, GetPrefixed 509 // Even thought there is no exact matching key, GetPrefixed
485 // and DeletePrefixed still operate on the values. 510 // and DeletePrefixed still operate on the values.
486 error = mojom::DatabaseError::INVALID_ARGUMENT; 511 error = mojom::DatabaseError::INVALID_ARGUMENT;
487 database->Put(mojo::Array<uint8_t>::From(prefix + "2"), 512 DatabaseSyncPut(database, mojo::Array<uint8_t>::From(prefix + "2"),
488 mojo::Array<uint8_t>::From(std::string("value2")), 513 mojo::Array<uint8_t>::From(std::string("value2")), &error);
489 Capture(&error));
490 ASSERT_TRUE(database.WaitForIncomingResponse());
491 EXPECT_EQ(mojom::DatabaseError::OK, error); 514 EXPECT_EQ(mojom::DatabaseError::OK, error);
492 error = mojom::DatabaseError::INVALID_ARGUMENT; 515 error = mojom::DatabaseError::INVALID_ARGUMENT;
493 key_values.SetToEmpty(); 516 key_values.SetToEmpty();
494 database->GetPrefixed(mojo::Array<uint8_t>::From(prefix), 517 DatabaseSyncGetPrefixed(database, mojo::Array<uint8_t>::From(prefix), &error,
495 Capture(&error, &key_values)); 518 &key_values);
496 ASSERT_TRUE(database.WaitForIncomingResponse());
497 EXPECT_EQ(mojom::DatabaseError::OK, error); 519 EXPECT_EQ(mojom::DatabaseError::OK, error);
498 EXPECT_EQ(1u, key_values.size()); 520 EXPECT_EQ(1u, key_values.size());
499 EXPECT_EQ("prefix2", key_values[0]->key.To<std::string>()); 521 EXPECT_EQ("prefix2", key_values[0]->key.To<std::string>());
500 EXPECT_EQ("value2", key_values[0]->value.To<std::string>()); 522 EXPECT_EQ("value2", key_values[0]->value.To<std::string>());
501 error = mojom::DatabaseError::INVALID_ARGUMENT; 523 error = mojom::DatabaseError::INVALID_ARGUMENT;
502 database->DeletePrefixed(mojo::Array<uint8_t>::From(prefix), 524 DatabaseSyncDeletePrefixed(database, mojo::Array<uint8_t>::From(prefix),
503 Capture(&error)); 525 &error);
504 ASSERT_TRUE(database.WaitForIncomingResponse());
505 EXPECT_EQ(mojom::DatabaseError::OK, error); 526 EXPECT_EQ(mojom::DatabaseError::OK, error);
506 error = mojom::DatabaseError::INVALID_ARGUMENT; 527 error = mojom::DatabaseError::INVALID_ARGUMENT;
507 key_values.SetToEmpty(); 528 key_values.SetToEmpty();
508 database->GetPrefixed(mojo::Array<uint8_t>::From(prefix), 529 DatabaseSyncGetPrefixed(database, mojo::Array<uint8_t>::From(prefix), &error,
509 Capture(&error, &key_values)); 530 &key_values);
510 ASSERT_TRUE(database.WaitForIncomingResponse());
511 EXPECT_EQ(mojom::DatabaseError::OK, error); 531 EXPECT_EQ(mojom::DatabaseError::OK, error);
512 EXPECT_TRUE(key_values.empty()); 532 EXPECT_TRUE(key_values.empty());
513 } 533 }
514 534
515 } // namespace 535 } // namespace
516 } // namespace leveldb 536 } // namespace leveldb
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698