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

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

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

Powered by Google App Engine
This is Rietveld 408576698