| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "content/browser/indexed_db/indexed_db_database.h" | 5 #include "content/browser/indexed_db/indexed_db_database.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 | 152 |
| 153 class MockCallbacks : public IndexedDBCallbacks { | 153 class MockCallbacks : public IndexedDBCallbacks { |
| 154 public: | 154 public: |
| 155 MockCallbacks() : IndexedDBCallbacks(nullptr, url::Origin(), nullptr) {} | 155 MockCallbacks() : IndexedDBCallbacks(nullptr, url::Origin(), nullptr) {} |
| 156 | 156 |
| 157 void OnBlocked(int64_t existing_version) override { blocked_called_ = true; } | 157 void OnBlocked(int64_t existing_version) override { blocked_called_ = true; } |
| 158 void OnSuccess(int64_t result) override { success_called_ = true; } | 158 void OnSuccess(int64_t result) override { success_called_ = true; } |
| 159 void OnError(const IndexedDBDatabaseError& error) override { | 159 void OnError(const IndexedDBDatabaseError& error) override { |
| 160 error_called_ = true; | 160 error_called_ = true; |
| 161 } | 161 } |
| 162 bool IsValid() const override { return valid_; } | |
| 163 | 162 |
| 164 bool blocked_called() const { return blocked_called_; } | 163 bool blocked_called() const { return blocked_called_; } |
| 165 bool success_called() const { return success_called_; } | 164 bool success_called() const { return success_called_; } |
| 166 bool error_called() const { return error_called_; } | 165 bool error_called() const { return error_called_; } |
| 167 void set_valid(bool valid) { valid_ = valid; } | |
| 168 | 166 |
| 169 private: | 167 private: |
| 170 ~MockCallbacks() override {} | 168 ~MockCallbacks() override {} |
| 171 | 169 |
| 172 bool blocked_called_ = false; | 170 bool blocked_called_ = false; |
| 173 bool success_called_ = false; | 171 bool success_called_ = false; |
| 174 bool error_called_ = false; | 172 bool error_called_ = false; |
| 175 bool valid_ = true; | |
| 176 | 173 |
| 177 DISALLOW_COPY_AND_ASSIGN(MockCallbacks); | 174 DISALLOW_COPY_AND_ASSIGN(MockCallbacks); |
| 178 }; | 175 }; |
| 179 | 176 |
| 180 TEST_F(IndexedDBDatabaseTest, PendingDelete) { | 177 TEST_F(IndexedDBDatabaseTest, PendingDelete) { |
| 181 scoped_refptr<IndexedDBFakeBackingStore> backing_store = | 178 scoped_refptr<IndexedDBFakeBackingStore> backing_store = |
| 182 new IndexedDBFakeBackingStore(); | 179 new IndexedDBFakeBackingStore(); |
| 183 EXPECT_TRUE(backing_store->HasOneRef()); // local | 180 EXPECT_TRUE(backing_store->HasOneRef()); // local |
| 184 | 181 |
| 185 scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory(); | 182 scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory(); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 db->Close(request1->connection(), true /* forced */); | 221 db->Close(request1->connection(), true /* forced */); |
| 225 EXPECT_EQ(db->ConnectionCount(), 0UL); | 222 EXPECT_EQ(db->ConnectionCount(), 0UL); |
| 226 EXPECT_EQ(db->ActiveOpenDeleteCount(), 0UL); | 223 EXPECT_EQ(db->ActiveOpenDeleteCount(), 0UL); |
| 227 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); | 224 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); |
| 228 | 225 |
| 229 EXPECT_FALSE(db->backing_store()); | 226 EXPECT_FALSE(db->backing_store()); |
| 230 EXPECT_TRUE(backing_store->HasOneRef()); // local | 227 EXPECT_TRUE(backing_store->HasOneRef()); // local |
| 231 EXPECT_TRUE(request2->success_called()); | 228 EXPECT_TRUE(request2->success_called()); |
| 232 } | 229 } |
| 233 | 230 |
| 234 TEST_F(IndexedDBDatabaseTest, ConnectionRequestsNoLongerValid) { | |
| 235 scoped_refptr<IndexedDBFakeBackingStore> backing_store = | |
| 236 new IndexedDBFakeBackingStore(); | |
| 237 | |
| 238 const int64_t transaction_id1 = 1; | |
| 239 scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory(); | |
| 240 scoped_refptr<IndexedDBDatabase> db; | |
| 241 leveldb::Status s; | |
| 242 std::tie(db, s) = | |
| 243 IndexedDBDatabase::Create(ASCIIToUTF16("db"), backing_store.get(), | |
| 244 factory.get(), IndexedDBDatabase::Identifier()); | |
| 245 | |
| 246 // Make a connection request. This will be processed immediately. | |
| 247 scoped_refptr<MockIndexedDBCallbacks> request1(new MockIndexedDBCallbacks()); | |
| 248 { | |
| 249 std::unique_ptr<IndexedDBPendingConnection> connection( | |
| 250 base::MakeUnique<IndexedDBPendingConnection>( | |
| 251 request1, make_scoped_refptr(new MockIndexedDBDatabaseCallbacks()), | |
| 252 kFakeChildProcessId, transaction_id1, | |
| 253 IndexedDBDatabaseMetadata::DEFAULT_VERSION)); | |
| 254 db->OpenConnection(std::move(connection)); | |
| 255 } | |
| 256 | |
| 257 EXPECT_EQ(db->ConnectionCount(), 1UL); | |
| 258 EXPECT_EQ(db->ActiveOpenDeleteCount(), 0UL); | |
| 259 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); | |
| 260 | |
| 261 // Make a delete request. This will be blocked by the open. | |
| 262 scoped_refptr<MockCallbacks> request2(new MockCallbacks()); | |
| 263 db->DeleteDatabase(request2); | |
| 264 | |
| 265 EXPECT_EQ(db->ConnectionCount(), 1UL); | |
| 266 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); | |
| 267 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); | |
| 268 | |
| 269 db->VersionChangeIgnored(); | |
| 270 | |
| 271 EXPECT_TRUE(request2->blocked_called()); | |
| 272 | |
| 273 // Make another delete request. This will be waiting in the queue. | |
| 274 scoped_refptr<MockCallbacks> request3(new MockCallbacks()); | |
| 275 db->DeleteDatabase(request3); | |
| 276 EXPECT_FALSE(request3->HasOneRef()); // local, db | |
| 277 | |
| 278 EXPECT_EQ(db->ConnectionCount(), 1UL); | |
| 279 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); | |
| 280 EXPECT_EQ(db->PendingOpenDeleteCount(), 1UL); | |
| 281 | |
| 282 // Make another connection request. This will also be waiting in the queue. | |
| 283 scoped_refptr<MockCallbacks> request4(new MockCallbacks()); | |
| 284 { | |
| 285 std::unique_ptr<IndexedDBPendingConnection> connection( | |
| 286 base::MakeUnique<IndexedDBPendingConnection>( | |
| 287 request4, make_scoped_refptr(new MockIndexedDBDatabaseCallbacks()), | |
| 288 kFakeChildProcessId, transaction_id1, | |
| 289 IndexedDBDatabaseMetadata::DEFAULT_VERSION)); | |
| 290 db->OpenConnection(std::move(connection)); | |
| 291 } | |
| 292 | |
| 293 EXPECT_EQ(db->ConnectionCount(), 1UL); | |
| 294 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); | |
| 295 EXPECT_EQ(db->PendingOpenDeleteCount(), 2UL); | |
| 296 | |
| 297 // Finally yet another delete request, also waiting in the queue. | |
| 298 scoped_refptr<MockCallbacks> request5(new MockCallbacks()); | |
| 299 db->DeleteDatabase(request2); | |
| 300 | |
| 301 EXPECT_EQ(db->ConnectionCount(), 1UL); | |
| 302 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); | |
| 303 EXPECT_EQ(db->PendingOpenDeleteCount(), 3UL); | |
| 304 | |
| 305 // Simulate renderer going away. | |
| 306 request3->set_valid(false); | |
| 307 request4->set_valid(false); | |
| 308 | |
| 309 // Close the blocking connection. First delete request should succeed. | |
| 310 EXPECT_FALSE(request2->success_called()); | |
| 311 db->Close(request1->connection(), true /* forced */); | |
| 312 EXPECT_TRUE(request2->success_called()); | |
| 313 | |
| 314 // Delete requests that have lost dispatcher should still be processed so | |
| 315 // that e.g. a delete followed by a window close is not ignored. | |
| 316 EXPECT_FALSE(request3->blocked_called()); | |
| 317 EXPECT_TRUE(request3->success_called()); | |
| 318 EXPECT_FALSE(request3->error_called()); | |
| 319 EXPECT_TRUE(request3->HasOneRef()); // local | |
| 320 | |
| 321 // Open requests that have lost dispatcher should not be processed. | |
| 322 EXPECT_FALSE(request4->blocked_called()); | |
| 323 EXPECT_FALSE(request4->success_called()); | |
| 324 EXPECT_FALSE(request4->error_called()); | |
| 325 EXPECT_TRUE(request4->HasOneRef()); // local | |
| 326 | |
| 327 // Final delete request should also run. | |
| 328 EXPECT_TRUE(request2->success_called()); | |
| 329 | |
| 330 // And everything else should be complete. | |
| 331 EXPECT_EQ(db->ConnectionCount(), 0UL); | |
| 332 EXPECT_EQ(db->ActiveOpenDeleteCount(), 0UL); | |
| 333 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); | |
| 334 } | |
| 335 | |
| 336 leveldb::Status DummyOperation(IndexedDBTransaction* transaction) { | 231 leveldb::Status DummyOperation(IndexedDBTransaction* transaction) { |
| 337 return leveldb::Status::OK(); | 232 return leveldb::Status::OK(); |
| 338 } | 233 } |
| 339 | 234 |
| 340 class IndexedDBDatabaseOperationTest : public testing::Test { | 235 class IndexedDBDatabaseOperationTest : public testing::Test { |
| 341 public: | 236 public: |
| 342 IndexedDBDatabaseOperationTest() | 237 IndexedDBDatabaseOperationTest() |
| 343 : commit_success_(leveldb::Status::OK()), | 238 : commit_success_(leveldb::Status::OK()), |
| 344 factory_(new MockIndexedDBFactory()) {} | 239 factory_(new MockIndexedDBFactory()) {} |
| 345 | 240 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); | 387 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); |
| 493 | 388 |
| 494 // This will execute the Put then Delete. | 389 // This will execute the Put then Delete. |
| 495 RunPostedTasks(); | 390 RunPostedTasks(); |
| 496 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); | 391 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); |
| 497 | 392 |
| 498 transaction_->Commit(); // Cleans up the object hierarchy. | 393 transaction_->Commit(); // Cleans up the object hierarchy. |
| 499 } | 394 } |
| 500 | 395 |
| 501 } // namespace content | 396 } // namespace content |
| OLD | NEW |