| 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_transaction.h" | 5 #include "content/browser/indexed_db/indexed_db_transaction.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/macros.h" | 11 #include "base/macros.h" |
| 12 #include "base/run_loop.h" | 12 #include "base/run_loop.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "content/browser/indexed_db/indexed_db_connection.h" | 14 #include "content/browser/indexed_db/indexed_db_connection.h" |
| 15 #include "content/browser/indexed_db/indexed_db_fake_backing_store.h" | 15 #include "content/browser/indexed_db/indexed_db_fake_backing_store.h" |
| 16 #include "content/browser/indexed_db/indexed_db_observer.h" | 16 #include "content/browser/indexed_db/indexed_db_observer.h" |
| 17 #include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h" | 17 #include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h" |
| 18 #include "content/browser/indexed_db/mock_indexed_db_factory.h" | 18 #include "content/browser/indexed_db/mock_indexed_db_factory.h" |
| 19 #include "content/public/test/test_browser_thread_bundle.h" | 19 #include "content/public/test/test_browser_thread_bundle.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 21 |
| 22 namespace content { | 22 namespace content { |
| 23 | 23 |
| 24 class AbortObserver { | 24 class AbortObserver { |
| 25 public: | 25 public: |
| 26 AbortObserver() : abort_task_called_(false) {} | 26 AbortObserver() : abort_task_called_(false) {} |
| 27 | 27 |
| 28 void AbortTask(IndexedDBTransaction* transaction) { | 28 void AbortTask() { abort_task_called_ = true; } |
| 29 abort_task_called_ = true; | |
| 30 } | |
| 31 | 29 |
| 32 bool abort_task_called() const { return abort_task_called_; } | 30 bool abort_task_called() const { return abort_task_called_; } |
| 33 | 31 |
| 34 private: | 32 private: |
| 35 bool abort_task_called_; | 33 bool abort_task_called_; |
| 36 DISALLOW_COPY_AND_ASSIGN(AbortObserver); | 34 DISALLOW_COPY_AND_ASSIGN(AbortObserver); |
| 37 }; | 35 }; |
| 38 | 36 |
| 39 class IndexedDBTransactionTest : public testing::Test { | 37 class IndexedDBTransactionTest : public testing::Test { |
| 40 public: | 38 public: |
| 41 IndexedDBTransactionTest() : factory_(new MockIndexedDBFactory()) { | 39 IndexedDBTransactionTest() : factory_(new MockIndexedDBFactory()) { |
| 42 backing_store_ = new IndexedDBFakeBackingStore(); | 40 backing_store_ = new IndexedDBFakeBackingStore(); |
| 43 CreateDB(); | 41 CreateDB(); |
| 44 } | 42 } |
| 45 | 43 |
| 46 void CreateDB() { | 44 void CreateDB() { |
| 47 // DB is created here instead of the constructor to workaround a | 45 // DB is created here instead of the constructor to workaround a |
| 48 // "peculiarity of C++". More info at | 46 // "peculiarity of C++". More info at |
| 49 // https://github.com/google/googletest/blob/master/googletest/docs/FAQ.md#m
y-compiler-complains-that-a-constructor-or-destructor-cannot-return-a-value-what
s-going-on | 47 // https://github.com/google/googletest/blob/master/googletest/docs/FAQ.md#m
y-compiler-complains-that-a-constructor-or-destructor-cannot-return-a-value-what
s-going-on |
| 50 leveldb::Status s; | 48 leveldb::Status s; |
| 51 db_ = IndexedDBDatabase::Create(base::ASCIIToUTF16("db"), | 49 db_ = IndexedDBDatabase::Create(base::ASCIIToUTF16("db"), |
| 52 backing_store_.get(), | 50 backing_store_.get(), |
| 53 factory_.get(), | 51 factory_.get(), |
| 54 IndexedDBDatabase::Identifier(), | 52 IndexedDBDatabase::Identifier(), |
| 55 &s); | 53 &s); |
| 56 ASSERT_TRUE(s.ok()); | 54 ASSERT_TRUE(s.ok()); |
| 57 } | 55 } |
| 58 | 56 |
| 59 void RunPostedTasks() { base::RunLoop().RunUntilIdle(); } | 57 void RunPostedTasks() { base::RunLoop().RunUntilIdle(); } |
| 60 void DummyOperation(IndexedDBTransaction* transaction) {} | 58 leveldb::Status DummyOperation(leveldb::Status result, |
| 61 void AbortableOperation(AbortObserver* observer, | 59 IndexedDBTransaction* transaction) { |
| 62 IndexedDBTransaction* transaction) { | 60 return result; |
| 61 } |
| 62 leveldb::Status AbortableOperation(AbortObserver* observer, |
| 63 IndexedDBTransaction* transaction) { |
| 63 transaction->ScheduleAbortTask( | 64 transaction->ScheduleAbortTask( |
| 64 base::Bind(&AbortObserver::AbortTask, base::Unretained(observer))); | 65 base::Bind(&AbortObserver::AbortTask, base::Unretained(observer))); |
| 66 return leveldb::Status::OK(); |
| 65 } | 67 } |
| 66 | 68 |
| 67 protected: | 69 protected: |
| 68 scoped_refptr<IndexedDBFakeBackingStore> backing_store_; | 70 scoped_refptr<IndexedDBFakeBackingStore> backing_store_; |
| 69 scoped_refptr<IndexedDBDatabase> db_; | 71 scoped_refptr<IndexedDBDatabase> db_; |
| 72 scoped_refptr<MockIndexedDBFactory> factory_; |
| 70 | 73 |
| 71 private: | 74 private: |
| 72 scoped_refptr<MockIndexedDBFactory> factory_; | |
| 73 TestBrowserThreadBundle thread_bundle_; | 75 TestBrowserThreadBundle thread_bundle_; |
| 74 | 76 |
| 75 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTest); | 77 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTest); |
| 76 }; | 78 }; |
| 77 | 79 |
| 78 class IndexedDBTransactionTestMode | 80 class IndexedDBTransactionTestMode |
| 79 : public IndexedDBTransactionTest, | 81 : public IndexedDBTransactionTest, |
| 80 public testing::WithParamInterface<blink::WebIDBTransactionMode> { | 82 public testing::WithParamInterface<blink::WebIDBTransactionMode> { |
| 81 public: | 83 public: |
| 82 IndexedDBTransactionTestMode() {} | 84 IndexedDBTransactionTestMode() {} |
| (...skipping 14 matching lines...) Expand all Loading... |
| 97 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); | 99 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
| 98 db_->TransactionCreated(transaction.get()); | 100 db_->TransactionCreated(transaction.get()); |
| 99 | 101 |
| 100 // No conflicting transactions, so coordinator will start it immediately: | 102 // No conflicting transactions, so coordinator will start it immediately: |
| 101 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); | 103 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); |
| 102 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 104 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| 103 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); | 105 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); |
| 104 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); | 106 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); |
| 105 | 107 |
| 106 // Schedule a task - timer won't be started until it's processed. | 108 // Schedule a task - timer won't be started until it's processed. |
| 107 transaction->ScheduleTask(base::Bind( | 109 transaction->ScheduleTask( |
| 108 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this))); | 110 base::Bind(&IndexedDBTransactionTest::DummyOperation, |
| 111 base::Unretained(this), leveldb::Status::OK())); |
| 109 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 112 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| 110 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); | 113 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); |
| 111 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); | 114 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); |
| 112 | 115 |
| 113 RunPostedTasks(); | 116 RunPostedTasks(); |
| 114 EXPECT_TRUE(transaction->IsTimeoutTimerRunning()); | 117 EXPECT_TRUE(transaction->IsTimeoutTimerRunning()); |
| 115 | 118 |
| 116 transaction->Timeout(); | 119 transaction->Timeout(); |
| 117 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); | 120 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); |
| 118 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 121 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| 119 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); | 122 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); |
| 120 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); | 123 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); |
| 121 | 124 |
| 122 // This task will be ignored. | 125 // This task will be ignored. |
| 123 transaction->ScheduleTask(base::Bind( | 126 transaction->ScheduleTask( |
| 124 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this))); | 127 base::Bind(&IndexedDBTransactionTest::DummyOperation, |
| 128 base::Unretained(this), leveldb::Status::OK())); |
| 125 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); | 129 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); |
| 126 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 130 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| 127 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); | 131 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); |
| 128 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); | 132 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); |
| 129 } | 133 } |
| 130 | 134 |
| 131 TEST_F(IndexedDBTransactionTest, NoTimeoutReadOnly) { | 135 TEST_F(IndexedDBTransactionTest, NoTimeoutReadOnly) { |
| 132 const int64_t id = 0; | 136 const int64_t id = 0; |
| 133 const std::set<int64_t> scope; | 137 const std::set<int64_t> scope; |
| 134 const leveldb::Status commit_success = leveldb::Status::OK(); | 138 const leveldb::Status commit_success = leveldb::Status::OK(); |
| 135 std::unique_ptr<IndexedDBConnection> connection( | 139 std::unique_ptr<IndexedDBConnection> connection( |
| 136 base::MakeUnique<IndexedDBConnection>( | 140 base::MakeUnique<IndexedDBConnection>( |
| 137 db_, new MockIndexedDBDatabaseCallbacks())); | 141 db_, new MockIndexedDBDatabaseCallbacks())); |
| 138 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( | 142 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
| 139 id, connection->GetWeakPtr(), scope, blink::WebIDBTransactionModeReadOnly, | 143 id, connection->GetWeakPtr(), scope, blink::WebIDBTransactionModeReadOnly, |
| 140 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); | 144 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
| 141 db_->TransactionCreated(transaction.get()); | 145 db_->TransactionCreated(transaction.get()); |
| 142 | 146 |
| 143 // No conflicting transactions, so coordinator will start it immediately: | 147 // No conflicting transactions, so coordinator will start it immediately: |
| 144 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); | 148 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); |
| 145 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 149 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| 146 | 150 |
| 147 // Schedule a task - timer won't be started until it's processed. | 151 // Schedule a task - timer won't be started until it's processed. |
| 148 transaction->ScheduleTask(base::Bind( | 152 transaction->ScheduleTask( |
| 149 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this))); | 153 base::Bind(&IndexedDBTransactionTest::DummyOperation, |
| 154 base::Unretained(this), leveldb::Status::OK())); |
| 150 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 155 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| 151 | 156 |
| 152 // Transaction is read-only, so no need to time it out. | 157 // Transaction is read-only, so no need to time it out. |
| 153 RunPostedTasks(); | 158 RunPostedTasks(); |
| 154 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 159 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| 155 | 160 |
| 156 // Clean up to avoid leaks. | 161 // Clean up to avoid leaks. |
| 157 transaction->Abort(); | 162 transaction->Abort(); |
| 158 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); | 163 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); |
| 159 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 164 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 180 db_->TransactionCreated(transaction.get()); | 185 db_->TransactionCreated(transaction.get()); |
| 181 | 186 |
| 182 EXPECT_FALSE(transaction->HasPendingTasks()); | 187 EXPECT_FALSE(transaction->HasPendingTasks()); |
| 183 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); | 188 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); |
| 184 EXPECT_TRUE(transaction->task_queue_.empty()); | 189 EXPECT_TRUE(transaction->task_queue_.empty()); |
| 185 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); | 190 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
| 186 | 191 |
| 187 transaction->ScheduleTask( | 192 transaction->ScheduleTask( |
| 188 blink::WebIDBTaskTypeNormal, | 193 blink::WebIDBTaskTypeNormal, |
| 189 base::Bind(&IndexedDBTransactionTest::DummyOperation, | 194 base::Bind(&IndexedDBTransactionTest::DummyOperation, |
| 190 base::Unretained(this))); | 195 base::Unretained(this), leveldb::Status::OK())); |
| 191 | 196 |
| 192 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); | 197 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); |
| 193 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); | 198 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); |
| 199 |
| 200 EXPECT_TRUE(transaction->HasPendingTasks()); |
| 201 EXPECT_FALSE(transaction->IsTaskQueueEmpty()); |
| 202 EXPECT_FALSE(transaction->task_queue_.empty()); |
| 203 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
| 204 |
| 205 // Pump the message loop so that the transaction completes all pending tasks, |
| 206 // otherwise it will defer the commit. |
| 207 base::RunLoop().RunUntilIdle(); |
| 208 EXPECT_FALSE(transaction->HasPendingTasks()); |
| 209 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); |
| 210 EXPECT_TRUE(transaction->task_queue_.empty()); |
| 211 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
| 212 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); |
| 213 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); |
| 214 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); |
| 215 |
| 216 transaction->Commit(); |
| 217 |
| 218 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); |
| 219 EXPECT_FALSE(transaction->HasPendingTasks()); |
| 220 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| 221 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); |
| 222 EXPECT_TRUE(transaction->task_queue_.empty()); |
| 223 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
| 224 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); |
| 225 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); |
| 226 } |
| 227 |
| 228 TEST_P(IndexedDBTransactionTestMode, TaskFails) { |
| 229 const int64_t id = 0; |
| 230 const std::set<int64_t> scope; |
| 231 const leveldb::Status commit_success = leveldb::Status::OK(); |
| 232 std::unique_ptr<IndexedDBConnection> connection( |
| 233 base::MakeUnique<IndexedDBConnection>( |
| 234 db_, new MockIndexedDBDatabaseCallbacks())); |
| 235 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
| 236 id, connection->GetWeakPtr(), scope, GetParam(), |
| 237 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
| 238 |
| 239 EXPECT_FALSE(transaction->HasPendingTasks()); |
| 240 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); |
| 241 EXPECT_TRUE(transaction->task_queue_.empty()); |
| 242 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
| 243 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); |
| 244 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); |
| 245 |
| 246 db_->TransactionCreated(transaction.get()); |
| 247 |
| 248 EXPECT_FALSE(transaction->HasPendingTasks()); |
| 249 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); |
| 250 EXPECT_TRUE(transaction->task_queue_.empty()); |
| 251 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
| 252 |
| 253 EXPECT_CALL(*factory_, HandleBackingStoreFailure(testing::_)).Times(1); |
| 254 |
| 255 transaction->ScheduleTask( |
| 256 blink::WebIDBTaskTypeNormal, |
| 257 base::Bind(&IndexedDBTransactionTest::DummyOperation, |
| 258 base::Unretained(this), leveldb::Status::IOError("error"))); |
| 259 |
| 260 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); |
| 261 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); |
| 194 | 262 |
| 195 EXPECT_TRUE(transaction->HasPendingTasks()); | 263 EXPECT_TRUE(transaction->HasPendingTasks()); |
| 196 EXPECT_FALSE(transaction->IsTaskQueueEmpty()); | 264 EXPECT_FALSE(transaction->IsTaskQueueEmpty()); |
| 197 EXPECT_FALSE(transaction->task_queue_.empty()); | 265 EXPECT_FALSE(transaction->task_queue_.empty()); |
| 198 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); | 266 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
| 199 | 267 |
| 200 // Pump the message loop so that the transaction completes all pending tasks, | 268 // Pump the message loop so that the transaction completes all pending tasks, |
| 201 // otherwise it will defer the commit. | 269 // otherwise it will defer the commit. |
| 202 base::RunLoop().RunUntilIdle(); | 270 base::RunLoop().RunUntilIdle(); |
| 203 EXPECT_FALSE(transaction->HasPendingTasks()); | 271 EXPECT_FALSE(transaction->HasPendingTasks()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 db_->TransactionCreated(transaction.get()); | 310 db_->TransactionCreated(transaction.get()); |
| 243 | 311 |
| 244 EXPECT_FALSE(transaction->HasPendingTasks()); | 312 EXPECT_FALSE(transaction->HasPendingTasks()); |
| 245 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); | 313 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); |
| 246 EXPECT_TRUE(transaction->task_queue_.empty()); | 314 EXPECT_TRUE(transaction->task_queue_.empty()); |
| 247 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); | 315 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
| 248 | 316 |
| 249 transaction->ScheduleTask( | 317 transaction->ScheduleTask( |
| 250 blink::WebIDBTaskTypePreemptive, | 318 blink::WebIDBTaskTypePreemptive, |
| 251 base::Bind(&IndexedDBTransactionTest::DummyOperation, | 319 base::Bind(&IndexedDBTransactionTest::DummyOperation, |
| 252 base::Unretained(this))); | 320 base::Unretained(this), leveldb::Status::OK())); |
| 253 transaction->AddPreemptiveEvent(); | 321 transaction->AddPreemptiveEvent(); |
| 254 | 322 |
| 255 EXPECT_TRUE(transaction->HasPendingTasks()); | 323 EXPECT_TRUE(transaction->HasPendingTasks()); |
| 256 EXPECT_FALSE(transaction->IsTaskQueueEmpty()); | 324 EXPECT_FALSE(transaction->IsTaskQueueEmpty()); |
| 257 EXPECT_TRUE(transaction->task_queue_.empty()); | 325 EXPECT_TRUE(transaction->task_queue_.empty()); |
| 258 EXPECT_FALSE(transaction->preemptive_task_queue_.empty()); | 326 EXPECT_FALSE(transaction->preemptive_task_queue_.empty()); |
| 259 | 327 |
| 260 // Pump the message loop so that the transaction completes all pending tasks, | 328 // Pump the message loop so that the transaction completes all pending tasks, |
| 261 // otherwise it will defer the commit. | 329 // otherwise it will defer the commit. |
| 262 base::RunLoop().RunUntilIdle(); | 330 base::RunLoop().RunUntilIdle(); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); | 390 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
| 323 db_->TransactionCreated(transaction.get()); | 391 db_->TransactionCreated(transaction.get()); |
| 324 | 392 |
| 325 // No conflicting transactions, so coordinator will start it immediately: | 393 // No conflicting transactions, so coordinator will start it immediately: |
| 326 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); | 394 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); |
| 327 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 395 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| 328 | 396 |
| 329 transaction->ScheduleTask( | 397 transaction->ScheduleTask( |
| 330 blink::WebIDBTaskTypePreemptive, | 398 blink::WebIDBTaskTypePreemptive, |
| 331 base::Bind(&IndexedDBTransactionTest::DummyOperation, | 399 base::Bind(&IndexedDBTransactionTest::DummyOperation, |
| 332 base::Unretained(this))); | 400 base::Unretained(this), leveldb::Status::OK())); |
| 333 EXPECT_EQ(0, transaction->pending_preemptive_events_); | 401 EXPECT_EQ(0, transaction->pending_preemptive_events_); |
| 334 transaction->AddPreemptiveEvent(); | 402 transaction->AddPreemptiveEvent(); |
| 335 EXPECT_EQ(1, transaction->pending_preemptive_events_); | 403 EXPECT_EQ(1, transaction->pending_preemptive_events_); |
| 336 | 404 |
| 337 RunPostedTasks(); | 405 RunPostedTasks(); |
| 338 | 406 |
| 339 transaction->Abort(); | 407 transaction->Abort(); |
| 340 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); | 408 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); |
| 341 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 409 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| 342 EXPECT_EQ(0, transaction->pending_preemptive_events_); | 410 EXPECT_EQ(0, transaction->pending_preemptive_events_); |
| 343 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); | 411 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
| 344 EXPECT_TRUE(transaction->task_queue_.empty()); | 412 EXPECT_TRUE(transaction->task_queue_.empty()); |
| 345 EXPECT_FALSE(transaction->HasPendingTasks()); | 413 EXPECT_FALSE(transaction->HasPendingTasks()); |
| 346 EXPECT_EQ(transaction->diagnostics().tasks_completed, | 414 EXPECT_EQ(transaction->diagnostics().tasks_completed, |
| 347 transaction->diagnostics().tasks_scheduled); | 415 transaction->diagnostics().tasks_scheduled); |
| 348 EXPECT_FALSE(transaction->should_process_queue_); | 416 EXPECT_FALSE(transaction->should_process_queue_); |
| 349 EXPECT_TRUE(transaction->backing_store_transaction_begun_); | 417 EXPECT_TRUE(transaction->backing_store_transaction_begun_); |
| 350 EXPECT_TRUE(transaction->used_); | 418 EXPECT_TRUE(transaction->used_); |
| 351 EXPECT_FALSE(transaction->commit_pending_); | 419 EXPECT_FALSE(transaction->commit_pending_); |
| 352 | 420 |
| 353 // This task will be ignored. | 421 // This task will be ignored. |
| 354 transaction->ScheduleTask(base::Bind( | 422 transaction->ScheduleTask( |
| 355 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this))); | 423 base::Bind(&IndexedDBTransactionTest::DummyOperation, |
| 424 base::Unretained(this), leveldb::Status::OK())); |
| 356 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); | 425 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); |
| 357 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 426 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
| 358 EXPECT_FALSE(transaction->HasPendingTasks()); | 427 EXPECT_FALSE(transaction->HasPendingTasks()); |
| 359 EXPECT_EQ(transaction->diagnostics().tasks_completed, | 428 EXPECT_EQ(transaction->diagnostics().tasks_completed, |
| 360 transaction->diagnostics().tasks_scheduled); | 429 transaction->diagnostics().tasks_scheduled); |
| 361 } | 430 } |
| 362 | 431 |
| 363 TEST_F(IndexedDBTransactionTest, IndexedDBObserver) { | 432 TEST_F(IndexedDBTransactionTest, IndexedDBObserver) { |
| 364 const int64_t id = 0; | 433 const int64_t id = 0; |
| 365 const std::set<int64_t> scope; | 434 const std::set<int64_t> scope; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 407 | 476 |
| 408 static const blink::WebIDBTransactionMode kTestModes[] = { | 477 static const blink::WebIDBTransactionMode kTestModes[] = { |
| 409 blink::WebIDBTransactionModeReadOnly, blink::WebIDBTransactionModeReadWrite, | 478 blink::WebIDBTransactionModeReadOnly, blink::WebIDBTransactionModeReadWrite, |
| 410 blink::WebIDBTransactionModeVersionChange}; | 479 blink::WebIDBTransactionModeVersionChange}; |
| 411 | 480 |
| 412 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions, | 481 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions, |
| 413 IndexedDBTransactionTestMode, | 482 IndexedDBTransactionTestMode, |
| 414 ::testing::ValuesIn(kTestModes)); | 483 ::testing::ValuesIn(kTestModes)); |
| 415 | 484 |
| 416 } // namespace content | 485 } // namespace content |
| OLD | NEW |