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

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

Powered by Google App Engine
This is Rietveld 408576698