Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: content/browser/indexed_db/indexed_db_transaction_unittest.cc

Issue 2472213003: [IndexedDB] Refactoring to remove ref ptrs and host transaction ids. (Closed)
Patch Set: rebase Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include <memory>
8 9
9 #include "base/bind.h" 10 #include "base/bind.h"
10 #include "base/logging.h" 11 #include "base/logging.h"
11 #include "base/macros.h" 12 #include "base/macros.h"
12 #include "base/run_loop.h" 13 #include "base/run_loop.h"
13 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
14 #include "content/browser/indexed_db/indexed_db_connection.h" 15 #include "content/browser/indexed_db/indexed_db_connection.h"
15 #include "content/browser/indexed_db/indexed_db_fake_backing_store.h" 16 #include "content/browser/indexed_db/indexed_db_fake_backing_store.h"
16 #include "content/browser/indexed_db/indexed_db_observer.h" 17 #include "content/browser/indexed_db/indexed_db_observer.h"
17 #include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h" 18 #include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h"
18 #include "content/browser/indexed_db/mock_indexed_db_factory.h" 19 #include "content/browser/indexed_db/mock_indexed_db_factory.h"
19 #include "content/public/test/test_browser_thread_bundle.h" 20 #include "content/public/test/test_browser_thread_bundle.h"
20 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
21 22
22 namespace content { 23 namespace content {
24 const int kFakeProcessId = 10;
23 25
24 class AbortObserver { 26 class AbortObserver {
25 public: 27 public:
26 AbortObserver() : abort_task_called_(false) {} 28 AbortObserver() : abort_task_called_(false) {}
27 29
28 void AbortTask() { abort_task_called_ = true; } 30 void AbortTask() { abort_task_called_ = true; }
29 31
30 bool abort_task_called() const { return abort_task_called_; } 32 bool abort_task_called() const { return abort_task_called_; }
31 33
32 private: 34 private:
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 private: 85 private:
84 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTestMode); 86 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTestMode);
85 }; 87 };
86 88
87 TEST_F(IndexedDBTransactionTest, Timeout) { 89 TEST_F(IndexedDBTransactionTest, Timeout) {
88 const int64_t id = 0; 90 const int64_t id = 0;
89 const std::set<int64_t> scope; 91 const std::set<int64_t> scope;
90 const leveldb::Status commit_success = leveldb::Status::OK(); 92 const leveldb::Status commit_success = leveldb::Status::OK();
91 std::unique_ptr<IndexedDBConnection> connection( 93 std::unique_ptr<IndexedDBConnection> connection(
92 base::MakeUnique<IndexedDBConnection>( 94 base::MakeUnique<IndexedDBConnection>(
93 db_, new MockIndexedDBDatabaseCallbacks())); 95 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
94 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 96 std::unique_ptr<IndexedDBTransaction> transaction =
95 id, connection->GetWeakPtr(), scope, 97 std::unique_ptr<IndexedDBTransaction>(new IndexedDBTransaction(
96 blink::WebIDBTransactionModeReadWrite, 98 id, connection.get(), scope, blink::WebIDBTransactionModeReadWrite,
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( 109 transaction->ScheduleTask(
(...skipping 21 matching lines...) Expand all
129 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); 131 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled);
130 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); 132 EXPECT_EQ(1, transaction->diagnostics().tasks_completed);
131 } 133 }
132 134
133 TEST_F(IndexedDBTransactionTest, NoTimeoutReadOnly) { 135 TEST_F(IndexedDBTransactionTest, NoTimeoutReadOnly) {
134 const int64_t id = 0; 136 const int64_t id = 0;
135 const std::set<int64_t> scope; 137 const std::set<int64_t> scope;
136 const leveldb::Status commit_success = leveldb::Status::OK(); 138 const leveldb::Status commit_success = leveldb::Status::OK();
137 std::unique_ptr<IndexedDBConnection> connection( 139 std::unique_ptr<IndexedDBConnection> connection(
138 base::MakeUnique<IndexedDBConnection>( 140 base::MakeUnique<IndexedDBConnection>(
139 db_, new MockIndexedDBDatabaseCallbacks())); 141 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
140 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 142 std::unique_ptr<IndexedDBTransaction> transaction =
141 id, connection->GetWeakPtr(), scope, blink::WebIDBTransactionModeReadOnly, 143 std::unique_ptr<IndexedDBTransaction>(new IndexedDBTransaction(
142 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 144 id, connection.get(), scope, blink::WebIDBTransactionModeReadOnly,
145 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)));
143 db_->TransactionCreated(transaction.get()); 146 db_->TransactionCreated(transaction.get());
144 147
145 // No conflicting transactions, so coordinator will start it immediately: 148 // No conflicting transactions, so coordinator will start it immediately:
146 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); 149 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state());
147 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 150 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
148 151
149 // Schedule a task - timer won't be started until it's processed. 152 // Schedule a task - timer won't be started until it's processed.
150 transaction->ScheduleTask( 153 transaction->ScheduleTask(
151 base::Bind(&IndexedDBTransactionTest::DummyOperation, 154 base::Bind(&IndexedDBTransactionTest::DummyOperation,
152 base::Unretained(this), leveldb::Status::OK())); 155 base::Unretained(this), leveldb::Status::OK()));
153 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 156 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
154 157
155 // Transaction is read-only, so no need to time it out. 158 // Transaction is read-only, so no need to time it out.
156 RunPostedTasks(); 159 RunPostedTasks();
157 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 160 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
158 161
159 // Clean up to avoid leaks. 162 // Clean up to avoid leaks.
160 transaction->Abort(); 163 transaction->Abort();
161 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); 164 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state());
162 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 165 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
163 } 166 }
164 167
165 TEST_P(IndexedDBTransactionTestMode, ScheduleNormalTask) { 168 TEST_P(IndexedDBTransactionTestMode, ScheduleNormalTask) {
166 const int64_t id = 0; 169 const int64_t id = 0;
167 const std::set<int64_t> scope; 170 const std::set<int64_t> scope;
168 const leveldb::Status commit_success = leveldb::Status::OK(); 171 const leveldb::Status commit_success = leveldb::Status::OK();
169 std::unique_ptr<IndexedDBConnection> connection( 172 std::unique_ptr<IndexedDBConnection> connection(
170 base::MakeUnique<IndexedDBConnection>( 173 base::MakeUnique<IndexedDBConnection>(
171 db_, new MockIndexedDBDatabaseCallbacks())); 174 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
172 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 175 std::unique_ptr<IndexedDBTransaction> transaction =
173 id, connection->GetWeakPtr(), scope, GetParam(), 176 std::unique_ptr<IndexedDBTransaction>(new IndexedDBTransaction(
174 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 177 id, connection.get(), scope, GetParam(),
178 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)));
175 179
176 EXPECT_FALSE(transaction->HasPendingTasks()); 180 EXPECT_FALSE(transaction->HasPendingTasks());
177 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); 181 EXPECT_TRUE(transaction->IsTaskQueueEmpty());
178 EXPECT_TRUE(transaction->task_queue_.empty()); 182 EXPECT_TRUE(transaction->task_queue_.empty());
179 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); 183 EXPECT_TRUE(transaction->preemptive_task_queue_.empty());
180 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 184 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
181 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 185 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
182 186
183 db_->TransactionCreated(transaction.get()); 187 db_->TransactionCreated(transaction.get());
184 188
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); 226 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled);
223 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); 227 EXPECT_EQ(1, transaction->diagnostics().tasks_completed);
224 } 228 }
225 229
226 TEST_P(IndexedDBTransactionTestMode, TaskFails) { 230 TEST_P(IndexedDBTransactionTestMode, TaskFails) {
227 const int64_t id = 0; 231 const int64_t id = 0;
228 const std::set<int64_t> scope; 232 const std::set<int64_t> scope;
229 const leveldb::Status commit_success = leveldb::Status::OK(); 233 const leveldb::Status commit_success = leveldb::Status::OK();
230 std::unique_ptr<IndexedDBConnection> connection( 234 std::unique_ptr<IndexedDBConnection> connection(
231 base::MakeUnique<IndexedDBConnection>( 235 base::MakeUnique<IndexedDBConnection>(
232 db_, new MockIndexedDBDatabaseCallbacks())); 236 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
233 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 237 std::unique_ptr<IndexedDBTransaction> transaction =
234 id, connection->GetWeakPtr(), scope, GetParam(), 238 std::unique_ptr<IndexedDBTransaction>(new IndexedDBTransaction(
235 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 239 id, connection.get(), scope, GetParam(),
240 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)));
236 241
237 EXPECT_FALSE(transaction->HasPendingTasks()); 242 EXPECT_FALSE(transaction->HasPendingTasks());
238 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); 243 EXPECT_TRUE(transaction->IsTaskQueueEmpty());
239 EXPECT_TRUE(transaction->task_queue_.empty()); 244 EXPECT_TRUE(transaction->task_queue_.empty());
240 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); 245 EXPECT_TRUE(transaction->preemptive_task_queue_.empty());
241 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 246 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
242 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 247 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
243 248
244 db_->TransactionCreated(transaction.get()); 249 db_->TransactionCreated(transaction.get());
245 250
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); 290 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled);
286 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); 291 EXPECT_EQ(1, transaction->diagnostics().tasks_completed);
287 } 292 }
288 293
289 TEST_F(IndexedDBTransactionTest, SchedulePreemptiveTask) { 294 TEST_F(IndexedDBTransactionTest, SchedulePreemptiveTask) {
290 const int64_t id = 0; 295 const int64_t id = 0;
291 const std::set<int64_t> scope; 296 const std::set<int64_t> scope;
292 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch."); 297 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch.");
293 std::unique_ptr<IndexedDBConnection> connection( 298 std::unique_ptr<IndexedDBConnection> connection(
294 base::MakeUnique<IndexedDBConnection>( 299 base::MakeUnique<IndexedDBConnection>(
295 db_, new MockIndexedDBDatabaseCallbacks())); 300 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
296 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 301 std::unique_ptr<IndexedDBTransaction> transaction =
297 id, connection->GetWeakPtr(), scope, 302 std::unique_ptr<IndexedDBTransaction>(new IndexedDBTransaction(
298 blink::WebIDBTransactionModeVersionChange, 303 id, connection.get(), scope,
299 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); 304 blink::WebIDBTransactionModeVersionChange,
305 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)));
300 306
301 EXPECT_FALSE(transaction->HasPendingTasks()); 307 EXPECT_FALSE(transaction->HasPendingTasks());
302 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); 308 EXPECT_TRUE(transaction->IsTaskQueueEmpty());
303 EXPECT_TRUE(transaction->task_queue_.empty()); 309 EXPECT_TRUE(transaction->task_queue_.empty());
304 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); 310 EXPECT_TRUE(transaction->preemptive_task_queue_.empty());
305 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 311 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
306 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 312 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
307 313
308 db_->TransactionCreated(transaction.get()); 314 db_->TransactionCreated(transaction.get());
309 315
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 352 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
347 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 353 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
348 } 354 }
349 355
350 TEST_P(IndexedDBTransactionTestMode, AbortTasks) { 356 TEST_P(IndexedDBTransactionTestMode, AbortTasks) {
351 const int64_t id = 0; 357 const int64_t id = 0;
352 const std::set<int64_t> scope; 358 const std::set<int64_t> scope;
353 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch."); 359 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch.");
354 std::unique_ptr<IndexedDBConnection> connection( 360 std::unique_ptr<IndexedDBConnection> connection(
355 base::MakeUnique<IndexedDBConnection>( 361 base::MakeUnique<IndexedDBConnection>(
356 db_, new MockIndexedDBDatabaseCallbacks())); 362 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
357 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 363 std::unique_ptr<IndexedDBTransaction> transaction =
358 id, connection->GetWeakPtr(), scope, GetParam(), 364 std::unique_ptr<IndexedDBTransaction>(new IndexedDBTransaction(
359 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); 365 id, connection.get(), scope, GetParam(),
366 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)));
360 db_->TransactionCreated(transaction.get()); 367 db_->TransactionCreated(transaction.get());
361 368
362 AbortObserver observer; 369 AbortObserver observer;
363 transaction->ScheduleTask( 370 transaction->ScheduleTask(
364 base::Bind(&IndexedDBTransactionTest::AbortableOperation, 371 base::Bind(&IndexedDBTransactionTest::AbortableOperation,
365 base::Unretained(this), 372 base::Unretained(this),
366 base::Unretained(&observer))); 373 base::Unretained(&observer)));
367 374
368 // Pump the message loop so that the transaction completes all pending tasks, 375 // Pump the message loop so that the transaction completes all pending tasks,
369 // otherwise it will defer the commit. 376 // otherwise it will defer the commit.
370 base::RunLoop().RunUntilIdle(); 377 base::RunLoop().RunUntilIdle();
371 378
372 EXPECT_FALSE(observer.abort_task_called()); 379 EXPECT_FALSE(observer.abort_task_called());
373 transaction->Commit(); 380 transaction->Commit();
374 EXPECT_TRUE(observer.abort_task_called()); 381 EXPECT_TRUE(observer.abort_task_called());
375 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); 382 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state());
376 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 383 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
377 } 384 }
378 385
379 TEST_P(IndexedDBTransactionTestMode, AbortPreemptive) { 386 TEST_P(IndexedDBTransactionTestMode, AbortPreemptive) {
380 const int64_t id = 0; 387 const int64_t id = 0;
381 const std::set<int64_t> scope; 388 const std::set<int64_t> scope;
382 const leveldb::Status commit_success = leveldb::Status::OK(); 389 const leveldb::Status commit_success = leveldb::Status::OK();
383 std::unique_ptr<IndexedDBConnection> connection( 390 std::unique_ptr<IndexedDBConnection> connection(
384 base::MakeUnique<IndexedDBConnection>( 391 base::MakeUnique<IndexedDBConnection>(
385 db_, new MockIndexedDBDatabaseCallbacks())); 392 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
386 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 393 std::unique_ptr<IndexedDBTransaction> transaction =
387 id, connection->GetWeakPtr(), scope, GetParam(), 394 std::unique_ptr<IndexedDBTransaction>(new IndexedDBTransaction(
388 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 395 id, connection.get(), scope, GetParam(),
396 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)));
389 db_->TransactionCreated(transaction.get()); 397 db_->TransactionCreated(transaction.get());
390 398
391 // No conflicting transactions, so coordinator will start it immediately: 399 // No conflicting transactions, so coordinator will start it immediately:
392 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); 400 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state());
393 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 401 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
394 402
395 transaction->ScheduleTask( 403 transaction->ScheduleTask(
396 blink::WebIDBTaskTypePreemptive, 404 blink::WebIDBTaskTypePreemptive,
397 base::Bind(&IndexedDBTransactionTest::DummyOperation, 405 base::Bind(&IndexedDBTransactionTest::DummyOperation,
398 base::Unretained(this), leveldb::Status::OK())); 406 base::Unretained(this), leveldb::Status::OK()));
(...skipping 27 matching lines...) Expand all
426 EXPECT_EQ(transaction->diagnostics().tasks_completed, 434 EXPECT_EQ(transaction->diagnostics().tasks_completed,
427 transaction->diagnostics().tasks_scheduled); 435 transaction->diagnostics().tasks_scheduled);
428 } 436 }
429 437
430 TEST_F(IndexedDBTransactionTest, IndexedDBObserver) { 438 TEST_F(IndexedDBTransactionTest, IndexedDBObserver) {
431 const int64_t id = 0; 439 const int64_t id = 0;
432 const std::set<int64_t> scope; 440 const std::set<int64_t> scope;
433 const leveldb::Status commit_success = leveldb::Status::OK(); 441 const leveldb::Status commit_success = leveldb::Status::OK();
434 std::unique_ptr<IndexedDBConnection> connection( 442 std::unique_ptr<IndexedDBConnection> connection(
435 base::MakeUnique<IndexedDBConnection>( 443 base::MakeUnique<IndexedDBConnection>(
436 db_, new MockIndexedDBDatabaseCallbacks())); 444 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
437 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 445
438 id, connection->GetWeakPtr(), scope, 446 base::WeakPtr<IndexedDBTransaction> transaction =
439 blink::WebIDBTransactionModeReadWrite, 447 connection->AddTransactionForTesting(
440 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 448 std::unique_ptr<IndexedDBTransaction>(new IndexedDBTransaction(
449 id, connection.get(), scope,
450 blink::WebIDBTransactionModeReadWrite,
451 new IndexedDBFakeBackingStore::FakeTransaction(commit_success))));
452 EXPECT_TRUE(transaction);
cmumford 2016/12/01 19:14:51 ASSERT_TRUE to avoid test crash if transaction is
dmurph 2016/12/01 21:12:23 Done.
441 db_->TransactionCreated(transaction.get()); 453 db_->TransactionCreated(transaction.get());
442 454
443 EXPECT_EQ(0UL, transaction->pending_observers_.size()); 455 EXPECT_EQ(0UL, transaction->pending_observers_.size());
444 EXPECT_EQ(0UL, connection->active_observers().size()); 456 EXPECT_EQ(0UL, connection->active_observers().size());
445 457
446 // Add observers to pending observer list. 458 // Add observers to pending observer list.
447 const int32_t observer_id1 = 1, observer_id2 = 2; 459 const int32_t observer_id1 = 1, observer_id2 = 2;
448 IndexedDBObserver::Options options(false, false, false, 0U); 460 IndexedDBObserver::Options options(false, false, false, 0U);
449 transaction->AddPendingObserver(observer_id1, options); 461 transaction->AddPendingObserver(observer_id1, options);
450 transaction->AddPendingObserver(observer_id2, options); 462 transaction->AddPendingObserver(observer_id2, options);
451 EXPECT_EQ(2UL, transaction->pending_observers_.size()); 463 EXPECT_EQ(2UL, transaction->pending_observers_.size());
452 EXPECT_EQ(0UL, connection->active_observers().size()); 464 EXPECT_EQ(0UL, connection->active_observers().size());
453 465
454 // Before commit, observer would be in pending list of transaction. 466 // Before commit, observer would be in pending list of transaction.
455 std::vector<int32_t> observer_to_remove1 = {observer_id1}; 467 std::vector<int32_t> observer_to_remove1 = {observer_id1};
456 connection->RemoveObservers(observer_to_remove1); 468 connection->RemoveObservers(observer_to_remove1);
457 EXPECT_EQ(1UL, transaction->pending_observers_.size()); 469 EXPECT_EQ(1UL, transaction->pending_observers_.size());
458 EXPECT_EQ(0UL, connection->active_observers().size()); 470 EXPECT_EQ(0UL, connection->active_observers().size());
459 471
460 // After commit, observer moved to connection's active observer. 472 // After commit, observer moved to connection's active observer.
461 transaction->Commit(); 473 transaction->Commit();
462 EXPECT_EQ(0UL, transaction->pending_observers_.size()); 474 EXPECT_FALSE(transaction);
463 EXPECT_EQ(1UL, connection->active_observers().size()); 475 EXPECT_EQ(1UL, connection->active_observers().size());
464 476
465 // Observer does not exist, so no change to active_observers. 477 // Observer does not exist, so no change to active_observers.
466 connection->RemoveObservers(observer_to_remove1); 478 connection->RemoveObservers(observer_to_remove1);
467 EXPECT_EQ(1UL, connection->active_observers().size()); 479 EXPECT_EQ(1UL, connection->active_observers().size());
468 480
469 // Observer removed from connection's active observer. 481 // Observer removed from connection's active observer.
470 std::vector<int32_t> observer_to_remove2 = {observer_id2}; 482 std::vector<int32_t> observer_to_remove2 = {observer_id2};
471 connection->RemoveObservers(observer_to_remove2); 483 connection->RemoveObservers(observer_to_remove2);
472 EXPECT_EQ(0UL, connection->active_observers().size()); 484 EXPECT_EQ(0UL, connection->active_observers().size());
473 } 485 }
474 486
475 static const blink::WebIDBTransactionMode kTestModes[] = { 487 static const blink::WebIDBTransactionMode kTestModes[] = {
476 blink::WebIDBTransactionModeReadOnly, blink::WebIDBTransactionModeReadWrite, 488 blink::WebIDBTransactionModeReadOnly, blink::WebIDBTransactionModeReadWrite,
477 blink::WebIDBTransactionModeVersionChange}; 489 blink::WebIDBTransactionModeVersionChange};
478 490
479 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions, 491 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions,
480 IndexedDBTransactionTestMode, 492 IndexedDBTransactionTestMode,
481 ::testing::ValuesIn(kTestModes)); 493 ::testing::ValuesIn(kTestModes));
482 494
483 } // namespace content 495 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698