Index: content/browser/indexed_db/indexed_db_backing_store_unittest.cc |
diff --git a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc |
index 0b8ecef0e27c2e9dd1792a37e3b7760b5be42296..a32bbc9e6bd900928033574235202e70731755b3 100644 |
--- a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc |
+++ b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc |
@@ -136,7 +136,7 @@ class TestableIndexedDBBackingStore : public IndexedDBBackingStore { |
return true; |
} |
- bool RemoveBlobFile(int64 database_id, int64 key) override { |
+ bool RemoveBlobFile(int64 database_id, int64 key) const override { |
if (database_id_ != database_id || |
!KeyPrefix::IsValidDatabaseId(database_id)) { |
return false; |
@@ -169,7 +169,10 @@ class TestableIndexedDBBackingStore : public IndexedDBBackingStore { |
int64 database_id_; |
std::vector<Transaction::WriteDescriptor> writes_; |
- std::vector<int64> removals_; |
+ |
+ // This is modified in an overridden virtual function that is properly const |
+ // in the real implementation, therefore must be mutable here. |
+ mutable std::vector<int64> removals_; |
DISALLOW_COPY_AND_ASSIGN(TestableIndexedDBBackingStore); |
}; |
@@ -644,6 +647,42 @@ TEST_F(IndexedDBBackingStoreTest, DeleteRangeEmptyRange) { |
} |
} |
+TEST_F(IndexedDBBackingStoreTest, BlobJournalInterleavedTransactions) { |
+ IndexedDBBackingStore::Transaction transaction1(backing_store_.get()); |
+ transaction1.Begin(); |
+ ScopedVector<storage::BlobDataHandle> handles1; |
+ IndexedDBBackingStore::RecordIdentifier record1; |
+ EXPECT_TRUE(backing_store_->PutRecord(&transaction1, 1, 1, m_key3, &m_value3, |
+ &handles1, &record1).ok()); |
+ scoped_refptr<TestCallback> callback1(new TestCallback()); |
+ EXPECT_TRUE(transaction1.CommitPhaseOne(callback1).ok()); |
+ task_runner_->RunUntilIdle(); |
+ EXPECT_TRUE(CheckBlobWrites()); |
+ EXPECT_TRUE(callback1->called); |
+ EXPECT_TRUE(callback1->succeeded); |
+ EXPECT_EQ(0U, backing_store_->removals().size()); |
+ |
+ IndexedDBBackingStore::Transaction transaction2(backing_store_.get()); |
+ transaction2.Begin(); |
+ ScopedVector<storage::BlobDataHandle> handles2; |
+ IndexedDBBackingStore::RecordIdentifier record2; |
+ EXPECT_TRUE(backing_store_->PutRecord(&transaction2, 1, 1, m_key1, &m_value1, |
+ &handles2, &record2).ok()); |
+ scoped_refptr<TestCallback> callback2(new TestCallback()); |
+ EXPECT_TRUE(transaction2.CommitPhaseOne(callback2).ok()); |
+ task_runner_->RunUntilIdle(); |
+ EXPECT_TRUE(CheckBlobWrites()); |
+ EXPECT_TRUE(callback2->called); |
+ EXPECT_TRUE(callback2->succeeded); |
+ EXPECT_EQ(0U, backing_store_->removals().size()); |
+ |
+ EXPECT_TRUE(transaction1.CommitPhaseTwo().ok()); |
+ EXPECT_EQ(0U, backing_store_->removals().size()); |
+ |
+ EXPECT_TRUE(transaction2.CommitPhaseTwo().ok()); |
+ EXPECT_EQ(0U, backing_store_->removals().size()); |
+} |
+ |
TEST_F(IndexedDBBackingStoreTest, LiveBlobJournal) { |
{ |
IndexedDBBackingStore::Transaction transaction1(backing_store_.get()); |