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

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

Powered by Google App Engine
This is Rietveld 408576698