| 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/macros.h" | 5 #include "base/macros.h" |
| 6 #include "components/filesystem/public/interfaces/directory.mojom.h" | 6 #include "components/filesystem/public/interfaces/directory.mojom.h" |
| 7 #include "components/filesystem/public/interfaces/file_system.mojom.h" | 7 #include "components/filesystem/public/interfaces/file_system.mojom.h" |
| 8 #include "components/filesystem/public/interfaces/types.mojom.h" | 8 #include "components/filesystem/public/interfaces/types.mojom.h" |
| 9 #include "components/leveldb/public/interfaces/leveldb.mojom.h" | 9 #include "components/leveldb/public/interfaces/leveldb.mojom.h" |
| 10 #include "mojo/common/common_type_converters.h" | 10 #include "mojo/common/common_type_converters.h" |
| 11 #include "mojo/public/cpp/bindings/weak_binding_set.h" | 11 #include "mojo/public/cpp/bindings/weak_binding_set.h" |
| 12 #include "mojo/shell/public/cpp/application_test_base.h" | 12 #include "mojo/shell/public/cpp/application_test_base.h" |
| 13 #include "mojo/shell/public/cpp/shell_connection.h" | 13 #include "mojo/shell/public/cpp/shell_connection.h" |
| 14 #include "mojo/util/capture_util.h" | 14 #include "mojo/util/capture_util.h" |
| 15 | 15 |
| 16 using filesystem::FileError; | 16 using filesystem::FileError; |
| 17 using mojo::Capture; | 17 using mojo::Capture; |
| 18 | 18 |
| 19 namespace leveldb { | 19 namespace leveldb { |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 class LevelDBApptest : public mojo::test::ApplicationTestBase, | 22 class LevelDBApptest : public mojo::test::ApplicationTestBase { |
| 23 public filesystem::FileSystemClient { | |
| 24 public: | 23 public: |
| 25 LevelDBApptest() {} | 24 LevelDBApptest() {} |
| 26 ~LevelDBApptest() override {} | 25 ~LevelDBApptest() override {} |
| 27 | 26 |
| 28 protected: | 27 protected: |
| 29 // Overridden from mojo::test::ApplicationTestBase: | 28 // Overridden from mojo::test::ApplicationTestBase: |
| 30 void SetUp() override { | 29 void SetUp() override { |
| 31 ApplicationTestBase::SetUp(); | 30 ApplicationTestBase::SetUp(); |
| 32 shell()->ConnectToInterface("mojo:filesystem", &files_); | 31 shell()->ConnectToInterface("mojo:filesystem", &files_); |
| 33 shell()->ConnectToInterface("mojo:leveldb", &leveldb_); | 32 shell()->ConnectToInterface("mojo:leveldb", &leveldb_); |
| 34 } | 33 } |
| 35 | 34 |
| 36 // Overridden from FileSystemClient: | |
| 37 void OnFileSystemShutdown() override {} | |
| 38 | |
| 39 // Note: This has an out parameter rather than returning the |DirectoryPtr|, | 35 // Note: This has an out parameter rather than returning the |DirectoryPtr|, |
| 40 // since |ASSERT_...()| doesn't work with return values. | 36 // since |ASSERT_...()| doesn't work with return values. |
| 41 void GetOriginRoot(filesystem::DirectoryPtr* directory) { | 37 void GetUserDataDir(filesystem::DirectoryPtr* directory) { |
| 42 FileError error = FileError::FAILED; | 38 FileError error = FileError::FAILED; |
| 43 files()->OpenFileSystem("origin", GetProxy(directory), | 39 files()->OpenPersistentFileSystem(GetProxy(directory), |
| 44 bindings_.CreateInterfacePtrAndBind(this), | 40 mojo::Capture(&error)); |
| 45 mojo::Capture(&error)); | |
| 46 ASSERT_TRUE(files().WaitForIncomingResponse()); | 41 ASSERT_TRUE(files().WaitForIncomingResponse()); |
| 47 ASSERT_EQ(FileError::OK, error); | 42 ASSERT_EQ(FileError::OK, error); |
| 48 } | 43 } |
| 49 | 44 |
| 50 filesystem::FileSystemPtr& files() { return files_; } | 45 filesystem::FileSystemPtr& files() { return files_; } |
| 51 LevelDBServicePtr& leveldb() { return leveldb_; } | 46 LevelDBServicePtr& leveldb() { return leveldb_; } |
| 52 | 47 |
| 53 private: | 48 private: |
| 54 mojo::WeakBindingSet<filesystem::FileSystemClient> bindings_; | |
| 55 | |
| 56 filesystem::FileSystemPtr files_; | 49 filesystem::FileSystemPtr files_; |
| 57 LevelDBServicePtr leveldb_; | 50 LevelDBServicePtr leveldb_; |
| 58 | 51 |
| 59 DISALLOW_COPY_AND_ASSIGN(LevelDBApptest); | 52 DISALLOW_COPY_AND_ASSIGN(LevelDBApptest); |
| 60 }; | 53 }; |
| 61 | 54 |
| 62 TEST_F(LevelDBApptest, Basic) { | 55 TEST_F(LevelDBApptest, Basic) { |
| 63 filesystem::DirectoryPtr directory; | 56 filesystem::DirectoryPtr directory; |
| 64 GetOriginRoot(&directory); | 57 GetUserDataDir(&directory); |
| 65 | 58 |
| 66 DatabaseError error; | 59 DatabaseError error; |
| 67 LevelDBDatabasePtr database; | 60 LevelDBDatabasePtr database; |
| 68 leveldb()->Open(std::move(directory), "test", GetProxy(&database), | 61 leveldb()->Open(std::move(directory), "test", GetProxy(&database), |
| 69 Capture(&error)); | 62 Capture(&error)); |
| 70 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); | 63 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); |
| 71 EXPECT_EQ(DatabaseError::OK, error); | 64 EXPECT_EQ(DatabaseError::OK, error); |
| 72 | 65 |
| 73 // Write a key to the database. | 66 // Write a key to the database. |
| 74 error = DatabaseError::INVALID_ARGUMENT; | 67 error = DatabaseError::INVALID_ARGUMENT; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 99 value.SetToEmpty(); | 92 value.SetToEmpty(); |
| 100 database->Get(mojo::Array<uint8_t>::From(std::string("key")), | 93 database->Get(mojo::Array<uint8_t>::From(std::string("key")), |
| 101 Capture(&error, &value)); | 94 Capture(&error, &value)); |
| 102 ASSERT_TRUE(database.WaitForIncomingResponse()); | 95 ASSERT_TRUE(database.WaitForIncomingResponse()); |
| 103 EXPECT_EQ(DatabaseError::NOT_FOUND, error); | 96 EXPECT_EQ(DatabaseError::NOT_FOUND, error); |
| 104 EXPECT_EQ("", value.To<std::string>()); | 97 EXPECT_EQ("", value.To<std::string>()); |
| 105 } | 98 } |
| 106 | 99 |
| 107 TEST_F(LevelDBApptest, WriteBatch) { | 100 TEST_F(LevelDBApptest, WriteBatch) { |
| 108 filesystem::DirectoryPtr directory; | 101 filesystem::DirectoryPtr directory; |
| 109 GetOriginRoot(&directory); | 102 GetUserDataDir(&directory); |
| 110 | 103 |
| 111 DatabaseError error; | 104 DatabaseError error; |
| 112 LevelDBDatabasePtr database; | 105 LevelDBDatabasePtr database; |
| 113 leveldb()->Open(std::move(directory), "test", GetProxy(&database), | 106 leveldb()->Open(std::move(directory), "test", GetProxy(&database), |
| 114 Capture(&error)); | 107 Capture(&error)); |
| 115 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); | 108 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); |
| 116 EXPECT_EQ(DatabaseError::OK, error); | 109 EXPECT_EQ(DatabaseError::OK, error); |
| 117 | 110 |
| 118 // Write a key to the database. | 111 // Write a key to the database. |
| 119 database->Put(mojo::Array<uint8_t>::From(std::string("key")), | 112 database->Put(mojo::Array<uint8_t>::From(std::string("key")), |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 ASSERT_TRUE(database.WaitForIncomingResponse()); | 148 ASSERT_TRUE(database.WaitForIncomingResponse()); |
| 156 EXPECT_EQ(DatabaseError::OK, error); | 149 EXPECT_EQ(DatabaseError::OK, error); |
| 157 EXPECT_EQ("more", value.To<std::string>()); | 150 EXPECT_EQ("more", value.To<std::string>()); |
| 158 } | 151 } |
| 159 | 152 |
| 160 TEST_F(LevelDBApptest, Reconnect) { | 153 TEST_F(LevelDBApptest, Reconnect) { |
| 161 DatabaseError error; | 154 DatabaseError error; |
| 162 | 155 |
| 163 { | 156 { |
| 164 filesystem::DirectoryPtr directory; | 157 filesystem::DirectoryPtr directory; |
| 165 GetOriginRoot(&directory); | 158 GetUserDataDir(&directory); |
| 166 | 159 |
| 167 LevelDBDatabasePtr database; | 160 LevelDBDatabasePtr database; |
| 168 leveldb()->Open(std::move(directory), "test", GetProxy(&database), | 161 leveldb()->Open(std::move(directory), "test", GetProxy(&database), |
| 169 Capture(&error)); | 162 Capture(&error)); |
| 170 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); | 163 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); |
| 171 EXPECT_EQ(DatabaseError::OK, error); | 164 EXPECT_EQ(DatabaseError::OK, error); |
| 172 | 165 |
| 173 // Write a key to the database. | 166 // Write a key to the database. |
| 174 error = DatabaseError::INVALID_ARGUMENT; | 167 error = DatabaseError::INVALID_ARGUMENT; |
| 175 database->Put(mojo::Array<uint8_t>::From(std::string("key")), | 168 database->Put(mojo::Array<uint8_t>::From(std::string("key")), |
| 176 mojo::Array<uint8_t>::From(std::string("value")), | 169 mojo::Array<uint8_t>::From(std::string("value")), |
| 177 Capture(&error)); | 170 Capture(&error)); |
| 178 ASSERT_TRUE(database.WaitForIncomingResponse()); | 171 ASSERT_TRUE(database.WaitForIncomingResponse()); |
| 179 EXPECT_EQ(DatabaseError::OK, error); | 172 EXPECT_EQ(DatabaseError::OK, error); |
| 180 | 173 |
| 181 // The database should go out of scope here. | 174 // The database should go out of scope here. |
| 182 } | 175 } |
| 183 | 176 |
| 184 { | 177 { |
| 185 filesystem::DirectoryPtr directory; | 178 filesystem::DirectoryPtr directory; |
| 186 GetOriginRoot(&directory); | 179 GetUserDataDir(&directory); |
| 187 | 180 |
| 188 // Reconnect to the database. | 181 // Reconnect to the database. |
| 189 LevelDBDatabasePtr database; | 182 LevelDBDatabasePtr database; |
| 190 leveldb()->Open(std::move(directory), "test", GetProxy(&database), | 183 leveldb()->Open(std::move(directory), "test", GetProxy(&database), |
| 191 Capture(&error)); | 184 Capture(&error)); |
| 192 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); | 185 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); |
| 193 EXPECT_EQ(DatabaseError::OK, error); | 186 EXPECT_EQ(DatabaseError::OK, error); |
| 194 | 187 |
| 195 // We should still be able to read the key back from the database. | 188 // We should still be able to read the key back from the database. |
| 196 error = DatabaseError::INVALID_ARGUMENT; | 189 error = DatabaseError::INVALID_ARGUMENT; |
| 197 mojo::Array<uint8_t> value; | 190 mojo::Array<uint8_t> value; |
| 198 database->Get(mojo::Array<uint8_t>::From(std::string("key")), | 191 database->Get(mojo::Array<uint8_t>::From(std::string("key")), |
| 199 Capture(&error, &value)); | 192 Capture(&error, &value)); |
| 200 ASSERT_TRUE(database.WaitForIncomingResponse()); | 193 ASSERT_TRUE(database.WaitForIncomingResponse()); |
| 201 EXPECT_EQ(DatabaseError::OK, error); | 194 EXPECT_EQ(DatabaseError::OK, error); |
| 202 EXPECT_EQ("value", value.To<std::string>()); | 195 EXPECT_EQ("value", value.To<std::string>()); |
| 203 } | 196 } |
| 204 } | 197 } |
| 205 | 198 |
| 206 TEST_F(LevelDBApptest, GetSnapshotSimple) { | 199 TEST_F(LevelDBApptest, GetSnapshotSimple) { |
| 207 DatabaseError error; | 200 DatabaseError error; |
| 208 | 201 |
| 209 filesystem::DirectoryPtr directory; | 202 filesystem::DirectoryPtr directory; |
| 210 GetOriginRoot(&directory); | 203 GetUserDataDir(&directory); |
| 211 | 204 |
| 212 LevelDBDatabasePtr database; | 205 LevelDBDatabasePtr database; |
| 213 leveldb()->Open(std::move(directory), "test", GetProxy(&database), | 206 leveldb()->Open(std::move(directory), "test", GetProxy(&database), |
| 214 Capture(&error)); | 207 Capture(&error)); |
| 215 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); | 208 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); |
| 216 EXPECT_EQ(DatabaseError::OK, error); | 209 EXPECT_EQ(DatabaseError::OK, error); |
| 217 | 210 |
| 218 uint64_t snapshot_id = 0; | 211 uint64_t snapshot_id = 0; |
| 219 database->GetSnapshot(Capture(&snapshot_id)); | 212 database->GetSnapshot(Capture(&snapshot_id)); |
| 220 ASSERT_TRUE(database.WaitForIncomingResponse()); | 213 ASSERT_TRUE(database.WaitForIncomingResponse()); |
| 221 EXPECT_NE(static_cast<uint64_t>(0), snapshot_id); | 214 EXPECT_NE(static_cast<uint64_t>(0), snapshot_id); |
| 222 } | 215 } |
| 223 | 216 |
| 224 TEST_F(LevelDBApptest, GetFromSnapshots) { | 217 TEST_F(LevelDBApptest, GetFromSnapshots) { |
| 225 DatabaseError error; | 218 DatabaseError error; |
| 226 | 219 |
| 227 filesystem::DirectoryPtr directory; | 220 filesystem::DirectoryPtr directory; |
| 228 GetOriginRoot(&directory); | 221 GetUserDataDir(&directory); |
| 229 | 222 |
| 230 LevelDBDatabasePtr database; | 223 LevelDBDatabasePtr database; |
| 231 leveldb()->Open(std::move(directory), "test", GetProxy(&database), | 224 leveldb()->Open(std::move(directory), "test", GetProxy(&database), |
| 232 Capture(&error)); | 225 Capture(&error)); |
| 233 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); | 226 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); |
| 234 EXPECT_EQ(DatabaseError::OK, error); | 227 EXPECT_EQ(DatabaseError::OK, error); |
| 235 | 228 |
| 236 // Write a key to the database. | 229 // Write a key to the database. |
| 237 error = DatabaseError::INVALID_ARGUMENT; | 230 error = DatabaseError::INVALID_ARGUMENT; |
| 238 database->Put(mojo::Array<uint8_t>::From(std::string("key")), | 231 database->Put(mojo::Array<uint8_t>::From(std::string("key")), |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 key_value_snapshot, | 263 key_value_snapshot, |
| 271 mojo::Array<uint8_t>::From(std::string("key")), | 264 mojo::Array<uint8_t>::From(std::string("key")), |
| 272 Capture(&error, &value)); | 265 Capture(&error, &value)); |
| 273 ASSERT_TRUE(database.WaitForIncomingResponse()); | 266 ASSERT_TRUE(database.WaitForIncomingResponse()); |
| 274 EXPECT_EQ(DatabaseError::OK, error); | 267 EXPECT_EQ(DatabaseError::OK, error); |
| 275 EXPECT_EQ("value", value.To<std::string>()); | 268 EXPECT_EQ("value", value.To<std::string>()); |
| 276 } | 269 } |
| 277 | 270 |
| 278 TEST_F(LevelDBApptest, InvalidArgumentOnInvalidSnapshot) { | 271 TEST_F(LevelDBApptest, InvalidArgumentOnInvalidSnapshot) { |
| 279 filesystem::DirectoryPtr directory; | 272 filesystem::DirectoryPtr directory; |
| 280 GetOriginRoot(&directory); | 273 GetUserDataDir(&directory); |
| 281 | 274 |
| 282 LevelDBDatabasePtr database; | 275 LevelDBDatabasePtr database; |
| 283 DatabaseError error = DatabaseError::INVALID_ARGUMENT; | 276 DatabaseError error = DatabaseError::INVALID_ARGUMENT; |
| 284 leveldb()->Open(std::move(directory), "test", GetProxy(&database), | 277 leveldb()->Open(std::move(directory), "test", GetProxy(&database), |
| 285 Capture(&error)); | 278 Capture(&error)); |
| 286 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); | 279 ASSERT_TRUE(leveldb().WaitForIncomingResponse()); |
| 287 EXPECT_EQ(DatabaseError::OK, error); | 280 EXPECT_EQ(DatabaseError::OK, error); |
| 288 | 281 |
| 289 uint64_t invalid_snapshot = 8; | 282 uint64_t invalid_snapshot = 8; |
| 290 | 283 |
| 291 error = DatabaseError::OK; | 284 error = DatabaseError::OK; |
| 292 mojo::Array<uint8_t> value; | 285 mojo::Array<uint8_t> value; |
| 293 database->GetFromSnapshot( | 286 database->GetFromSnapshot( |
| 294 invalid_snapshot, | 287 invalid_snapshot, |
| 295 mojo::Array<uint8_t>::From(std::string("key")), | 288 mojo::Array<uint8_t>::From(std::string("key")), |
| 296 Capture(&error, &value)); | 289 Capture(&error, &value)); |
| 297 ASSERT_TRUE(database.WaitForIncomingResponse()); | 290 ASSERT_TRUE(database.WaitForIncomingResponse()); |
| 298 EXPECT_EQ(DatabaseError::INVALID_ARGUMENT, error); | 291 EXPECT_EQ(DatabaseError::INVALID_ARGUMENT, error); |
| 299 } | 292 } |
| 300 | 293 |
| 301 } // namespace | 294 } // namespace |
| 302 } // namespace leveldb | 295 } // namespace leveldb |
| OLD | NEW |