| OLD | NEW |
| 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 Loading... |
| 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 |
| OLD | NEW |