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 "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 public testing::WithParamInterface<indexed_db::TransactionMode> { | 52 public testing::WithParamInterface<indexed_db::TransactionMode> { |
53 public: | 53 public: |
54 IndexedDBTransactionTestMode() {} | 54 IndexedDBTransactionTestMode() {} |
55 private: | 55 private: |
56 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTestMode); | 56 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTestMode); |
57 }; | 57 }; |
58 | 58 |
59 TEST_F(IndexedDBTransactionTest, Timeout) { | 59 TEST_F(IndexedDBTransactionTest, Timeout) { |
60 const int64 id = 0; | 60 const int64 id = 0; |
61 const std::set<int64> scope; | 61 const std::set<int64> scope; |
62 const bool commit_success = true; | 62 const leveldb::Status commit_success = leveldb::Status::OK(); |
63 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( | 63 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
64 id, | 64 id, |
65 new MockIndexedDBDatabaseCallbacks(), | 65 new MockIndexedDBDatabaseCallbacks(), |
66 scope, | 66 scope, |
67 indexed_db::TRANSACTION_READ_WRITE, | 67 indexed_db::TRANSACTION_READ_WRITE, |
68 db_, | 68 db_, |
69 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); | 69 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
70 db_->TransactionCreated(transaction); | 70 db_->TransactionCreated(transaction); |
71 | 71 |
72 // No conflicting transactions, so coordinator will start it immediately: | 72 // No conflicting transactions, so coordinator will start it immediately: |
(...skipping 23 matching lines...) Expand all Loading... |
96 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this))); | 96 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this))); |
97 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); | 97 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); |
98 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 98 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
99 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); | 99 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); |
100 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); | 100 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); |
101 } | 101 } |
102 | 102 |
103 TEST_F(IndexedDBTransactionTest, NoTimeoutReadOnly) { | 103 TEST_F(IndexedDBTransactionTest, NoTimeoutReadOnly) { |
104 const int64 id = 0; | 104 const int64 id = 0; |
105 const std::set<int64> scope; | 105 const std::set<int64> scope; |
106 const bool commit_success = true; | 106 const leveldb::Status commit_success = leveldb::Status::OK(); |
107 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( | 107 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
108 id, | 108 id, |
109 new MockIndexedDBDatabaseCallbacks(), | 109 new MockIndexedDBDatabaseCallbacks(), |
110 scope, | 110 scope, |
111 indexed_db::TRANSACTION_READ_ONLY, | 111 indexed_db::TRANSACTION_READ_ONLY, |
112 db_, | 112 db_, |
113 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); | 113 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
114 db_->TransactionCreated(transaction); | 114 db_->TransactionCreated(transaction); |
115 | 115 |
116 // No conflicting transactions, so coordinator will start it immediately: | 116 // No conflicting transactions, so coordinator will start it immediately: |
(...skipping 26 matching lines...) Expand all Loading... |
143 bool abort_task_called() const { return abort_task_called_; } | 143 bool abort_task_called() const { return abort_task_called_; } |
144 | 144 |
145 private: | 145 private: |
146 bool abort_task_called_; | 146 bool abort_task_called_; |
147 DISALLOW_COPY_AND_ASSIGN(AbortObserver); | 147 DISALLOW_COPY_AND_ASSIGN(AbortObserver); |
148 }; | 148 }; |
149 | 149 |
150 TEST_P(IndexedDBTransactionTestMode, ScheduleNormalTask) { | 150 TEST_P(IndexedDBTransactionTestMode, ScheduleNormalTask) { |
151 const int64 id = 0; | 151 const int64 id = 0; |
152 const std::set<int64> scope; | 152 const std::set<int64> scope; |
153 const bool commit_failure = false; | 153 const leveldb::Status commit_success = leveldb::Status::OK(); |
154 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( | 154 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
155 id, | 155 id, |
156 new MockIndexedDBDatabaseCallbacks(), | 156 new MockIndexedDBDatabaseCallbacks(), |
157 scope, | 157 scope, |
158 GetParam(), | 158 GetParam(), |
159 db_, | 159 db_, |
160 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); | 160 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
161 | 161 |
162 EXPECT_FALSE(transaction->HasPendingTasks()); | 162 EXPECT_FALSE(transaction->HasPendingTasks()); |
163 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); | 163 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); |
164 EXPECT_TRUE(transaction->task_queue_.empty()); | 164 EXPECT_TRUE(transaction->task_queue_.empty()); |
165 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); | 165 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
166 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); | 166 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); |
167 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); | 167 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); |
168 | 168 |
169 db_->TransactionCreated(transaction); | 169 db_->TransactionCreated(transaction); |
170 | 170 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); | 205 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); |
206 EXPECT_TRUE(transaction->task_queue_.empty()); | 206 EXPECT_TRUE(transaction->task_queue_.empty()); |
207 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); | 207 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
208 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); | 208 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); |
209 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); | 209 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); |
210 } | 210 } |
211 | 211 |
212 TEST_F(IndexedDBTransactionTest, SchedulePreemptiveTask) { | 212 TEST_F(IndexedDBTransactionTest, SchedulePreemptiveTask) { |
213 const int64 id = 0; | 213 const int64 id = 0; |
214 const std::set<int64> scope; | 214 const std::set<int64> scope; |
215 const bool commit_failure = false; | 215 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch."); |
216 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( | 216 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
217 id, | 217 id, |
218 new MockIndexedDBDatabaseCallbacks(), | 218 new MockIndexedDBDatabaseCallbacks(), |
219 scope, | 219 scope, |
220 indexed_db::TRANSACTION_VERSION_CHANGE, | 220 indexed_db::TRANSACTION_VERSION_CHANGE, |
221 db_, | 221 db_, |
222 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); | 222 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); |
223 | 223 |
224 EXPECT_FALSE(transaction->HasPendingTasks()); | 224 EXPECT_FALSE(transaction->HasPendingTasks()); |
225 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); | 225 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); | 266 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); |
267 EXPECT_TRUE(transaction->task_queue_.empty()); | 267 EXPECT_TRUE(transaction->task_queue_.empty()); |
268 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); | 268 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); |
269 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); | 269 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); |
270 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); | 270 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); |
271 } | 271 } |
272 | 272 |
273 TEST_P(IndexedDBTransactionTestMode, AbortTasks) { | 273 TEST_P(IndexedDBTransactionTestMode, AbortTasks) { |
274 const int64 id = 0; | 274 const int64 id = 0; |
275 const std::set<int64> scope; | 275 const std::set<int64> scope; |
276 const bool commit_failure = false; | 276 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch."); |
277 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( | 277 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
278 id, | 278 id, |
279 new MockIndexedDBDatabaseCallbacks(), | 279 new MockIndexedDBDatabaseCallbacks(), |
280 scope, | 280 scope, |
281 GetParam(), | 281 GetParam(), |
282 db_, | 282 db_, |
283 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); | 283 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); |
284 db_->TransactionCreated(transaction); | 284 db_->TransactionCreated(transaction); |
285 | 285 |
286 AbortObserver observer; | 286 AbortObserver observer; |
287 transaction->ScheduleTask( | 287 transaction->ScheduleTask( |
288 base::Bind(&IndexedDBTransactionTest::DummyOperation, | 288 base::Bind(&IndexedDBTransactionTest::DummyOperation, |
289 base::Unretained(this)), | 289 base::Unretained(this)), |
290 base::Bind(&AbortObserver::AbortTask, base::Unretained(&observer))); | 290 base::Bind(&AbortObserver::AbortTask, base::Unretained(&observer))); |
291 | 291 |
292 // Pump the message loop so that the transaction completes all pending tasks, | 292 // Pump the message loop so that the transaction completes all pending tasks, |
293 // otherwise it will defer the commit. | 293 // otherwise it will defer the commit. |
294 base::MessageLoop::current()->RunUntilIdle(); | 294 base::MessageLoop::current()->RunUntilIdle(); |
295 | 295 |
296 EXPECT_FALSE(observer.abort_task_called()); | 296 EXPECT_FALSE(observer.abort_task_called()); |
297 transaction->Commit(); | 297 transaction->Commit(); |
298 EXPECT_TRUE(observer.abort_task_called()); | 298 EXPECT_TRUE(observer.abort_task_called()); |
299 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); | 299 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); |
300 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); | 300 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); |
301 } | 301 } |
302 | 302 |
303 TEST_P(IndexedDBTransactionTestMode, AbortPreemptive) { | 303 TEST_P(IndexedDBTransactionTestMode, AbortPreemptive) { |
304 const int64 id = 0; | 304 const int64 id = 0; |
305 const std::set<int64> scope; | 305 const std::set<int64> scope; |
306 const bool commit_success = true; | 306 const leveldb::Status commit_success = leveldb::Status::OK(); |
307 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( | 307 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( |
308 id, | 308 id, |
309 new MockIndexedDBDatabaseCallbacks(), | 309 new MockIndexedDBDatabaseCallbacks(), |
310 scope, | 310 scope, |
311 GetParam(), | 311 GetParam(), |
312 db_, | 312 db_, |
313 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); | 313 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); |
314 db_->TransactionCreated(transaction); | 314 db_->TransactionCreated(transaction); |
315 | 315 |
316 // No conflicting transactions, so coordinator will start it immediately: | 316 // No conflicting transactions, so coordinator will start it immediately: |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 indexed_db::TRANSACTION_READ_ONLY, | 355 indexed_db::TRANSACTION_READ_ONLY, |
356 indexed_db::TRANSACTION_READ_WRITE, | 356 indexed_db::TRANSACTION_READ_WRITE, |
357 indexed_db::TRANSACTION_VERSION_CHANGE | 357 indexed_db::TRANSACTION_VERSION_CHANGE |
358 }; | 358 }; |
359 | 359 |
360 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions, | 360 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions, |
361 IndexedDBTransactionTestMode, | 361 IndexedDBTransactionTestMode, |
362 ::testing::ValuesIn(kTestModes)); | 362 ::testing::ValuesIn(kTestModes)); |
363 | 363 |
364 } // namespace content | 364 } // namespace content |
OLD | NEW |