| 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 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 request_ = new MockIndexedDBCallbacks(); | 354 request_ = new MockIndexedDBCallbacks(); |
| 355 callbacks_ = new MockIndexedDBDatabaseCallbacks(); | 355 callbacks_ = new MockIndexedDBDatabaseCallbacks(); |
| 356 const int64_t transaction_id = 1; | 356 const int64_t transaction_id = 1; |
| 357 std::unique_ptr<IndexedDBPendingConnection> connection( | 357 std::unique_ptr<IndexedDBPendingConnection> connection( |
| 358 base::MakeUnique<IndexedDBPendingConnection>( | 358 base::MakeUnique<IndexedDBPendingConnection>( |
| 359 request_, callbacks_, kFakeChildProcessId, transaction_id, | 359 request_, callbacks_, kFakeChildProcessId, transaction_id, |
| 360 IndexedDBDatabaseMetadata::DEFAULT_VERSION)); | 360 IndexedDBDatabaseMetadata::DEFAULT_VERSION)); |
| 361 db_->OpenConnection(std::move(connection)); | 361 db_->OpenConnection(std::move(connection)); |
| 362 EXPECT_EQ(IndexedDBDatabaseMetadata::NO_VERSION, db_->metadata().version); | 362 EXPECT_EQ(IndexedDBDatabaseMetadata::NO_VERSION, db_->metadata().version); |
| 363 | 363 |
| 364 connection_ = base::MakeUnique<IndexedDBConnection>(db_, callbacks_); | 364 connection_ = base::MakeUnique<IndexedDBConnection>(kFakeChildProcessId, |
| 365 transaction_ = IndexedDBClassFactory::Get()->CreateIndexedDBTransaction( | 365 db_, callbacks_); |
| 366 transaction_id, connection_->GetWeakPtr(), | 366 transaction_ = connection_->CreateTransaction( |
| 367 std::set<int64_t>() /*scope*/, | 367 transaction_id, std::set<int64_t>() /*scope*/, |
| 368 blink::WebIDBTransactionModeVersionChange, | 368 blink::WebIDBTransactionModeVersionChange, |
| 369 new IndexedDBFakeBackingStore::FakeTransaction(commit_success_)); | 369 new IndexedDBFakeBackingStore::FakeTransaction(commit_success_)); |
| 370 db_->TransactionCreated(transaction_.get()); | 370 db_->TransactionCreated(transaction_); |
| 371 | 371 |
| 372 // Add a dummy task which takes the place of the VersionChangeOperation | 372 // Add a dummy task which takes the place of the VersionChangeOperation |
| 373 // which kicks off the upgrade. This ensures that the transaction has | 373 // which kicks off the upgrade. This ensures that the transaction has |
| 374 // processed at least one task before the CreateObjectStore call. | 374 // processed at least one task before the CreateObjectStore call. |
| 375 transaction_->ScheduleTask(base::Bind(&DummyOperation)); | 375 transaction_->ScheduleTask(base::Bind(&DummyOperation)); |
| 376 } | 376 } |
| 377 | 377 |
| 378 void RunPostedTasks() { base::RunLoop().RunUntilIdle(); } | 378 void RunPostedTasks() { base::RunLoop().RunUntilIdle(); } |
| 379 | 379 |
| 380 protected: | 380 protected: |
| 381 scoped_refptr<IndexedDBFakeBackingStore> backing_store_; | 381 scoped_refptr<IndexedDBFakeBackingStore> backing_store_; |
| 382 scoped_refptr<IndexedDBDatabase> db_; | 382 scoped_refptr<IndexedDBDatabase> db_; |
| 383 scoped_refptr<MockIndexedDBCallbacks> request_; | 383 scoped_refptr<MockIndexedDBCallbacks> request_; |
| 384 scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks_; | 384 scoped_refptr<MockIndexedDBDatabaseCallbacks> callbacks_; |
| 385 scoped_refptr<IndexedDBTransaction> transaction_; | 385 IndexedDBTransaction* transaction_; |
| 386 std::unique_ptr<IndexedDBConnection> connection_; | 386 std::unique_ptr<IndexedDBConnection> connection_; |
| 387 | 387 |
| 388 leveldb::Status commit_success_; | 388 leveldb::Status commit_success_; |
| 389 | 389 |
| 390 private: | 390 private: |
| 391 scoped_refptr<MockIndexedDBFactory> factory_; | 391 scoped_refptr<MockIndexedDBFactory> factory_; |
| 392 content::TestBrowserThreadBundle thread_bundle_; | 392 content::TestBrowserThreadBundle thread_bundle_; |
| 393 | 393 |
| 394 DISALLOW_COPY_AND_ASSIGN(IndexedDBDatabaseOperationTest); | 394 DISALLOW_COPY_AND_ASSIGN(IndexedDBDatabaseOperationTest); |
| 395 }; | 395 }; |
| 396 | 396 |
| 397 TEST_F(IndexedDBDatabaseOperationTest, CreateObjectStore) { | 397 TEST_F(IndexedDBDatabaseOperationTest, CreateObjectStore) { |
| 398 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); | 398 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); |
| 399 const int64_t store_id = 1001; | 399 const int64_t store_id = 1001; |
| 400 db_->CreateObjectStore(transaction_->id(), | 400 db_->CreateObjectStore(transaction_, store_id, ASCIIToUTF16("store"), |
| 401 store_id, | 401 IndexedDBKeyPath(), false /*auto_increment*/); |
| 402 ASCIIToUTF16("store"), | |
| 403 IndexedDBKeyPath(), | |
| 404 false /*auto_increment*/); | |
| 405 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); | 402 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); |
| 406 RunPostedTasks(); | 403 RunPostedTasks(); |
| 407 transaction_->Commit(); | 404 transaction_->Commit(); |
| 408 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); | 405 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); |
| 409 } | 406 } |
| 410 | 407 |
| 411 TEST_F(IndexedDBDatabaseOperationTest, CreateIndex) { | 408 TEST_F(IndexedDBDatabaseOperationTest, CreateIndex) { |
| 412 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); | 409 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); |
| 413 const int64_t store_id = 1001; | 410 const int64_t store_id = 1001; |
| 414 db_->CreateObjectStore(transaction_->id(), | 411 db_->CreateObjectStore(transaction_, store_id, ASCIIToUTF16("store"), |
| 415 store_id, | 412 IndexedDBKeyPath(), false /*auto_increment*/); |
| 416 ASCIIToUTF16("store"), | |
| 417 IndexedDBKeyPath(), | |
| 418 false /*auto_increment*/); | |
| 419 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); | 413 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); |
| 420 const int64_t index_id = 2002; | 414 const int64_t index_id = 2002; |
| 421 db_->CreateIndex(transaction_->id(), | 415 db_->CreateIndex(transaction_, store_id, index_id, ASCIIToUTF16("index"), |
| 422 store_id, | 416 IndexedDBKeyPath(), false /*unique*/, false /*multi_entry*/); |
| 423 index_id, | |
| 424 ASCIIToUTF16("index"), | |
| 425 IndexedDBKeyPath(), | |
| 426 false /*unique*/, | |
| 427 false /*multi_entry*/); | |
| 428 EXPECT_EQ( | 417 EXPECT_EQ( |
| 429 1ULL, | 418 1ULL, |
| 430 db_->metadata().object_stores.find(store_id)->second.indexes.size()); | 419 db_->metadata().object_stores.find(store_id)->second.indexes.size()); |
| 431 RunPostedTasks(); | 420 RunPostedTasks(); |
| 432 transaction_->Commit(); | 421 transaction_->Commit(); |
| 433 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); | 422 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); |
| 434 EXPECT_EQ( | 423 EXPECT_EQ( |
| 435 1ULL, | 424 1ULL, |
| 436 db_->metadata().object_stores.find(store_id)->second.indexes.size()); | 425 db_->metadata().object_stores.find(store_id)->second.indexes.size()); |
| 437 } | 426 } |
| 438 | 427 |
| 439 class IndexedDBDatabaseOperationAbortTest | 428 class IndexedDBDatabaseOperationAbortTest |
| 440 : public IndexedDBDatabaseOperationTest { | 429 : public IndexedDBDatabaseOperationTest { |
| 441 public: | 430 public: |
| 442 IndexedDBDatabaseOperationAbortTest() { | 431 IndexedDBDatabaseOperationAbortTest() { |
| 443 commit_success_ = leveldb::Status::NotFound("Bummer."); | 432 commit_success_ = leveldb::Status::NotFound("Bummer."); |
| 444 } | 433 } |
| 445 | 434 |
| 446 private: | 435 private: |
| 447 DISALLOW_COPY_AND_ASSIGN(IndexedDBDatabaseOperationAbortTest); | 436 DISALLOW_COPY_AND_ASSIGN(IndexedDBDatabaseOperationAbortTest); |
| 448 }; | 437 }; |
| 449 | 438 |
| 450 TEST_F(IndexedDBDatabaseOperationAbortTest, CreateObjectStore) { | 439 TEST_F(IndexedDBDatabaseOperationAbortTest, CreateObjectStore) { |
| 451 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); | 440 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); |
| 452 const int64_t store_id = 1001; | 441 const int64_t store_id = 1001; |
| 453 db_->CreateObjectStore(transaction_->id(), | 442 db_->CreateObjectStore(transaction_, store_id, ASCIIToUTF16("store"), |
| 454 store_id, | 443 IndexedDBKeyPath(), false /*auto_increment*/); |
| 455 ASCIIToUTF16("store"), | |
| 456 IndexedDBKeyPath(), | |
| 457 false /*auto_increment*/); | |
| 458 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); | 444 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); |
| 459 RunPostedTasks(); | 445 RunPostedTasks(); |
| 460 transaction_->Commit(); | 446 transaction_->Commit(); |
| 461 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); | 447 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); |
| 462 } | 448 } |
| 463 | 449 |
| 464 TEST_F(IndexedDBDatabaseOperationAbortTest, CreateIndex) { | 450 TEST_F(IndexedDBDatabaseOperationAbortTest, CreateIndex) { |
| 465 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); | 451 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); |
| 466 const int64_t store_id = 1001; | 452 const int64_t store_id = 1001; |
| 467 db_->CreateObjectStore(transaction_->id(), | 453 db_->CreateObjectStore(transaction_, store_id, ASCIIToUTF16("store"), |
| 468 store_id, | 454 IndexedDBKeyPath(), false /*auto_increment*/); |
| 469 ASCIIToUTF16("store"), | |
| 470 IndexedDBKeyPath(), | |
| 471 false /*auto_increment*/); | |
| 472 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); | 455 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); |
| 473 const int64_t index_id = 2002; | 456 const int64_t index_id = 2002; |
| 474 db_->CreateIndex(transaction_->id(), | 457 db_->CreateIndex(transaction_, store_id, index_id, ASCIIToUTF16("index"), |
| 475 store_id, | 458 IndexedDBKeyPath(), false /*unique*/, false /*multi_entry*/); |
| 476 index_id, | |
| 477 ASCIIToUTF16("index"), | |
| 478 IndexedDBKeyPath(), | |
| 479 false /*unique*/, | |
| 480 false /*multi_entry*/); | |
| 481 EXPECT_EQ( | 459 EXPECT_EQ( |
| 482 1ULL, | 460 1ULL, |
| 483 db_->metadata().object_stores.find(store_id)->second.indexes.size()); | 461 db_->metadata().object_stores.find(store_id)->second.indexes.size()); |
| 484 RunPostedTasks(); | 462 RunPostedTasks(); |
| 485 transaction_->Commit(); | 463 transaction_->Commit(); |
| 486 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); | 464 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); |
| 487 } | 465 } |
| 488 | 466 |
| 489 TEST_F(IndexedDBDatabaseOperationTest, CreatePutDelete) { | 467 TEST_F(IndexedDBDatabaseOperationTest, CreatePutDelete) { |
| 490 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); | 468 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); |
| 491 const int64_t store_id = 1001; | 469 const int64_t store_id = 1001; |
| 492 | 470 |
| 493 // Creation is synchronous. | 471 // Creation is synchronous. |
| 494 db_->CreateObjectStore(transaction_->id(), | 472 db_->CreateObjectStore(transaction_, store_id, ASCIIToUTF16("store"), |
| 495 store_id, | 473 IndexedDBKeyPath(), false /*auto_increment*/); |
| 496 ASCIIToUTF16("store"), | |
| 497 IndexedDBKeyPath(), | |
| 498 false /*auto_increment*/); | |
| 499 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); | 474 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); |
| 500 | 475 |
| 501 | 476 |
| 502 // Put is asynchronous | 477 // Put is asynchronous |
| 503 IndexedDBValue value("value1", std::vector<IndexedDBBlobInfo>()); | 478 IndexedDBValue value("value1", std::vector<IndexedDBBlobInfo>()); |
| 504 std::vector<std::unique_ptr<storage::BlobDataHandle>> handles; | 479 std::vector<std::unique_ptr<storage::BlobDataHandle>> handles; |
| 505 std::unique_ptr<IndexedDBKey> key(base::MakeUnique<IndexedDBKey>("key")); | 480 std::unique_ptr<IndexedDBKey> key(base::MakeUnique<IndexedDBKey>("key")); |
| 506 std::vector<IndexedDBIndexKeys> index_keys; | 481 std::vector<IndexedDBIndexKeys> index_keys; |
| 507 scoped_refptr<MockIndexedDBCallbacks> request( | 482 scoped_refptr<MockIndexedDBCallbacks> request( |
| 508 new MockIndexedDBCallbacks(false)); | 483 new MockIndexedDBCallbacks(false)); |
| 509 db_->Put(transaction_->id(), store_id, &value, &handles, std::move(key), | 484 db_->Put(transaction_, store_id, &value, &handles, std::move(key), |
| 510 blink::WebIDBPutModeAddOnly, request, index_keys); | 485 blink::WebIDBPutModeAddOnly, request, index_keys); |
| 511 | 486 |
| 512 // Deletion is asynchronous. | 487 // Deletion is asynchronous. |
| 513 db_->DeleteObjectStore(transaction_->id(), | 488 db_->DeleteObjectStore(transaction_, store_id); |
| 514 store_id); | |
| 515 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); | 489 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); |
| 516 | 490 |
| 517 // This will execute the Put then Delete. | 491 // This will execute the Put then Delete. |
| 518 RunPostedTasks(); | 492 RunPostedTasks(); |
| 519 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); | 493 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); |
| 520 | 494 |
| 521 transaction_->Commit(); // Cleans up the object hierarchy. | 495 transaction_->Commit(); // Cleans up the object hierarchy. |
| 522 } | 496 } |
| 523 | 497 |
| 524 } // namespace content | 498 } // namespace content |
| OLD | NEW |