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

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: updated unittests Created 4 years, 1 month 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 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 const int kFakeProcessId = 10;
23 24
24 class AbortObserver { 25 class AbortObserver {
25 public: 26 public:
26 AbortObserver() : abort_task_called_(false) {} 27 AbortObserver() : abort_task_called_(false) {}
27 28
28 void AbortTask(IndexedDBTransaction* transaction) { 29 void AbortTask(IndexedDBTransaction* transaction) {
29 abort_task_called_ = true; 30 abort_task_called_ = true;
30 } 31 }
31 32
32 bool abort_task_called() const { return abort_task_called_; } 33 bool abort_task_called() const { return abort_task_called_; }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 private: 84 private:
84 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTestMode); 85 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTestMode);
85 }; 86 };
86 87
87 TEST_F(IndexedDBTransactionTest, Timeout) { 88 TEST_F(IndexedDBTransactionTest, Timeout) {
88 const int64_t id = 0; 89 const int64_t id = 0;
89 const std::set<int64_t> scope; 90 const std::set<int64_t> scope;
90 const leveldb::Status commit_success = leveldb::Status::OK(); 91 const leveldb::Status commit_success = leveldb::Status::OK();
91 std::unique_ptr<IndexedDBConnection> connection( 92 std::unique_ptr<IndexedDBConnection> connection(
92 base::MakeUnique<IndexedDBConnection>( 93 base::MakeUnique<IndexedDBConnection>(
93 db_, new MockIndexedDBDatabaseCallbacks())); 94 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
94 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 95 std::unique_ptr<IndexedDBTransaction> transaction =
95 id, connection->GetWeakPtr(), scope, 96 base::MakeUnique<IndexedDBTransaction>(
96 blink::WebIDBTransactionModeReadWrite, 97 id, connection.get(), scope, blink::WebIDBTransactionModeReadWrite,
97 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 98 new IndexedDBFakeBackingStore::FakeTransaction(commit_success));
98 db_->TransactionCreated(transaction.get()); 99 db_->TransactionCreated(transaction.get());
99 100
100 // No conflicting transactions, so coordinator will start it immediately: 101 // No conflicting transactions, so coordinator will start it immediately:
101 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); 102 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state());
102 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 103 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
103 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 104 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
104 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 105 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
105 106
106 // Schedule a task - timer won't be started until it's processed. 107 // Schedule a task - timer won't be started until it's processed.
107 transaction->ScheduleTask(base::Bind( 108 transaction->ScheduleTask(base::Bind(
(...skipping 19 matching lines...) Expand all
127 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); 128 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled);
128 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); 129 EXPECT_EQ(1, transaction->diagnostics().tasks_completed);
129 } 130 }
130 131
131 TEST_F(IndexedDBTransactionTest, NoTimeoutReadOnly) { 132 TEST_F(IndexedDBTransactionTest, NoTimeoutReadOnly) {
132 const int64_t id = 0; 133 const int64_t id = 0;
133 const std::set<int64_t> scope; 134 const std::set<int64_t> scope;
134 const leveldb::Status commit_success = leveldb::Status::OK(); 135 const leveldb::Status commit_success = leveldb::Status::OK();
135 std::unique_ptr<IndexedDBConnection> connection( 136 std::unique_ptr<IndexedDBConnection> connection(
136 base::MakeUnique<IndexedDBConnection>( 137 base::MakeUnique<IndexedDBConnection>(
137 db_, new MockIndexedDBDatabaseCallbacks())); 138 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
138 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 139 std::unique_ptr<IndexedDBTransaction> transaction =
139 id, connection->GetWeakPtr(), scope, blink::WebIDBTransactionModeReadOnly, 140 base::MakeUnique<IndexedDBTransaction>(
140 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 141 id, connection.get(), scope, blink::WebIDBTransactionModeReadOnly,
142 new IndexedDBFakeBackingStore::FakeTransaction(commit_success));
141 db_->TransactionCreated(transaction.get()); 143 db_->TransactionCreated(transaction.get());
142 144
143 // No conflicting transactions, so coordinator will start it immediately: 145 // No conflicting transactions, so coordinator will start it immediately:
144 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); 146 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state());
145 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 147 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
146 148
147 // Schedule a task - timer won't be started until it's processed. 149 // Schedule a task - timer won't be started until it's processed.
148 transaction->ScheduleTask(base::Bind( 150 transaction->ScheduleTask(base::Bind(
149 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this))); 151 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this)));
150 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 152 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
151 153
152 // Transaction is read-only, so no need to time it out. 154 // Transaction is read-only, so no need to time it out.
153 RunPostedTasks(); 155 RunPostedTasks();
154 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 156 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
155 157
156 // Clean up to avoid leaks. 158 // Clean up to avoid leaks.
157 transaction->Abort(); 159 transaction->Abort();
158 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); 160 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state());
159 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 161 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
160 } 162 }
161 163
162 TEST_P(IndexedDBTransactionTestMode, ScheduleNormalTask) { 164 TEST_P(IndexedDBTransactionTestMode, ScheduleNormalTask) {
163 const int64_t id = 0; 165 const int64_t id = 0;
164 const std::set<int64_t> scope; 166 const std::set<int64_t> scope;
165 const leveldb::Status commit_success = leveldb::Status::OK(); 167 const leveldb::Status commit_success = leveldb::Status::OK();
166 std::unique_ptr<IndexedDBConnection> connection( 168 std::unique_ptr<IndexedDBConnection> connection(
167 base::MakeUnique<IndexedDBConnection>( 169 base::MakeUnique<IndexedDBConnection>(
168 db_, new MockIndexedDBDatabaseCallbacks())); 170 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
169 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 171 std::unique_ptr<IndexedDBTransaction> transaction =
170 id, connection->GetWeakPtr(), scope, GetParam(), 172 base::MakeUnique<IndexedDBTransaction>(
171 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 173 id, connection.get(), scope, GetParam(),
174 new IndexedDBFakeBackingStore::FakeTransaction(commit_success));
172 175
173 EXPECT_FALSE(transaction->HasPendingTasks()); 176 EXPECT_FALSE(transaction->HasPendingTasks());
174 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); 177 EXPECT_TRUE(transaction->IsTaskQueueEmpty());
175 EXPECT_TRUE(transaction->task_queue_.empty()); 178 EXPECT_TRUE(transaction->task_queue_.empty());
176 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); 179 EXPECT_TRUE(transaction->preemptive_task_queue_.empty());
177 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 180 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
178 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 181 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
179 182
180 db_->TransactionCreated(transaction.get()); 183 db_->TransactionCreated(transaction.get());
181 184
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); 222 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled);
220 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); 223 EXPECT_EQ(1, transaction->diagnostics().tasks_completed);
221 } 224 }
222 225
223 TEST_F(IndexedDBTransactionTest, SchedulePreemptiveTask) { 226 TEST_F(IndexedDBTransactionTest, SchedulePreemptiveTask) {
224 const int64_t id = 0; 227 const int64_t id = 0;
225 const std::set<int64_t> scope; 228 const std::set<int64_t> scope;
226 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch."); 229 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch.");
227 std::unique_ptr<IndexedDBConnection> connection( 230 std::unique_ptr<IndexedDBConnection> connection(
228 base::MakeUnique<IndexedDBConnection>( 231 base::MakeUnique<IndexedDBConnection>(
229 db_, new MockIndexedDBDatabaseCallbacks())); 232 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
230 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 233 std::unique_ptr<IndexedDBTransaction> transaction =
231 id, connection->GetWeakPtr(), scope, 234 base::MakeUnique<IndexedDBTransaction>(
232 blink::WebIDBTransactionModeVersionChange, 235 id, connection.get(), scope,
233 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); 236 blink::WebIDBTransactionModeVersionChange,
237 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure));
234 238
235 EXPECT_FALSE(transaction->HasPendingTasks()); 239 EXPECT_FALSE(transaction->HasPendingTasks());
236 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); 240 EXPECT_TRUE(transaction->IsTaskQueueEmpty());
237 EXPECT_TRUE(transaction->task_queue_.empty()); 241 EXPECT_TRUE(transaction->task_queue_.empty());
238 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); 242 EXPECT_TRUE(transaction->preemptive_task_queue_.empty());
239 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 243 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
240 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 244 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
241 245
242 db_->TransactionCreated(transaction.get()); 246 db_->TransactionCreated(transaction.get());
243 247
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 284 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
281 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 285 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
282 } 286 }
283 287
284 TEST_P(IndexedDBTransactionTestMode, AbortTasks) { 288 TEST_P(IndexedDBTransactionTestMode, AbortTasks) {
285 const int64_t id = 0; 289 const int64_t id = 0;
286 const std::set<int64_t> scope; 290 const std::set<int64_t> scope;
287 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch."); 291 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch.");
288 std::unique_ptr<IndexedDBConnection> connection( 292 std::unique_ptr<IndexedDBConnection> connection(
289 base::MakeUnique<IndexedDBConnection>( 293 base::MakeUnique<IndexedDBConnection>(
290 db_, new MockIndexedDBDatabaseCallbacks())); 294 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
291 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 295 std::unique_ptr<IndexedDBTransaction> transaction =
292 id, connection->GetWeakPtr(), scope, GetParam(), 296 base::MakeUnique<IndexedDBTransaction>(
293 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); 297 id, connection.get(), scope, GetParam(),
298 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure));
294 db_->TransactionCreated(transaction.get()); 299 db_->TransactionCreated(transaction.get());
295 300
296 AbortObserver observer; 301 AbortObserver observer;
297 transaction->ScheduleTask( 302 transaction->ScheduleTask(
298 base::Bind(&IndexedDBTransactionTest::AbortableOperation, 303 base::Bind(&IndexedDBTransactionTest::AbortableOperation,
299 base::Unretained(this), 304 base::Unretained(this),
300 base::Unretained(&observer))); 305 base::Unretained(&observer)));
301 306
302 // Pump the message loop so that the transaction completes all pending tasks, 307 // Pump the message loop so that the transaction completes all pending tasks,
303 // otherwise it will defer the commit. 308 // otherwise it will defer the commit.
304 base::RunLoop().RunUntilIdle(); 309 base::RunLoop().RunUntilIdle();
305 310
306 EXPECT_FALSE(observer.abort_task_called()); 311 EXPECT_FALSE(observer.abort_task_called());
307 transaction->Commit(); 312 transaction->Commit();
308 EXPECT_TRUE(observer.abort_task_called()); 313 EXPECT_TRUE(observer.abort_task_called());
309 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); 314 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state());
310 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 315 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
311 } 316 }
312 317
313 TEST_P(IndexedDBTransactionTestMode, AbortPreemptive) { 318 TEST_P(IndexedDBTransactionTestMode, AbortPreemptive) {
314 const int64_t id = 0; 319 const int64_t id = 0;
315 const std::set<int64_t> scope; 320 const std::set<int64_t> scope;
316 const leveldb::Status commit_success = leveldb::Status::OK(); 321 const leveldb::Status commit_success = leveldb::Status::OK();
317 std::unique_ptr<IndexedDBConnection> connection( 322 std::unique_ptr<IndexedDBConnection> connection(
318 base::MakeUnique<IndexedDBConnection>( 323 base::MakeUnique<IndexedDBConnection>(
319 db_, new MockIndexedDBDatabaseCallbacks())); 324 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
320 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 325 std::unique_ptr<IndexedDBTransaction> transaction =
321 id, connection->GetWeakPtr(), scope, GetParam(), 326 base::MakeUnique<IndexedDBTransaction>(
322 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 327 id, connection.get(), scope, GetParam(),
328 new IndexedDBFakeBackingStore::FakeTransaction(commit_success));
323 db_->TransactionCreated(transaction.get()); 329 db_->TransactionCreated(transaction.get());
324 330
325 // No conflicting transactions, so coordinator will start it immediately: 331 // No conflicting transactions, so coordinator will start it immediately:
326 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); 332 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state());
327 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 333 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
328 334
329 transaction->ScheduleTask( 335 transaction->ScheduleTask(
330 blink::WebIDBTaskTypePreemptive, 336 blink::WebIDBTaskTypePreemptive,
331 base::Bind(&IndexedDBTransactionTest::DummyOperation, 337 base::Bind(&IndexedDBTransactionTest::DummyOperation,
332 base::Unretained(this))); 338 base::Unretained(this)));
(...skipping 26 matching lines...) Expand all
359 EXPECT_EQ(transaction->diagnostics().tasks_completed, 365 EXPECT_EQ(transaction->diagnostics().tasks_completed,
360 transaction->diagnostics().tasks_scheduled); 366 transaction->diagnostics().tasks_scheduled);
361 } 367 }
362 368
363 TEST_F(IndexedDBTransactionTest, IndexedDBObserver) { 369 TEST_F(IndexedDBTransactionTest, IndexedDBObserver) {
364 const int64_t id = 0; 370 const int64_t id = 0;
365 const std::set<int64_t> scope; 371 const std::set<int64_t> scope;
366 const leveldb::Status commit_success = leveldb::Status::OK(); 372 const leveldb::Status commit_success = leveldb::Status::OK();
367 std::unique_ptr<IndexedDBConnection> connection( 373 std::unique_ptr<IndexedDBConnection> connection(
368 base::MakeUnique<IndexedDBConnection>( 374 base::MakeUnique<IndexedDBConnection>(
369 db_, new MockIndexedDBDatabaseCallbacks())); 375 kFakeProcessId, db_, new MockIndexedDBDatabaseCallbacks()));
370 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 376
371 id, connection->GetWeakPtr(), scope, 377 IndexedDBTransaction* transaction = connection->StoreTransactionForTesting(
372 blink::WebIDBTransactionModeReadWrite, 378 base::MakeUnique<IndexedDBTransaction>(
373 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 379 id, connection.get(), scope, blink::WebIDBTransactionModeReadWrite,
374 db_->TransactionCreated(transaction.get()); 380 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)));
381 db_->TransactionCreated(transaction);
375 382
376 EXPECT_EQ(0UL, transaction->pending_observers_.size()); 383 EXPECT_EQ(0UL, transaction->pending_observers_.size());
377 EXPECT_EQ(0UL, connection->active_observers().size()); 384 EXPECT_EQ(0UL, connection->active_observers().size());
378 385
379 // Add observers to pending observer list. 386 // Add observers to pending observer list.
380 const int32_t observer_id1 = 1, observer_id2 = 2; 387 const int32_t observer_id1 = 1, observer_id2 = 2;
381 IndexedDBObserver::Options options(false, false, false, 0U); 388 IndexedDBObserver::Options options(false, false, false, 0U);
382 transaction->AddPendingObserver(observer_id1, options); 389 transaction->AddPendingObserver(observer_id1, options);
383 transaction->AddPendingObserver(observer_id2, options); 390 transaction->AddPendingObserver(observer_id2, options);
384 EXPECT_EQ(2UL, transaction->pending_observers_.size()); 391 EXPECT_EQ(2UL, transaction->pending_observers_.size());
(...skipping 22 matching lines...) Expand all
407 414
408 static const blink::WebIDBTransactionMode kTestModes[] = { 415 static const blink::WebIDBTransactionMode kTestModes[] = {
409 blink::WebIDBTransactionModeReadOnly, blink::WebIDBTransactionModeReadWrite, 416 blink::WebIDBTransactionModeReadOnly, blink::WebIDBTransactionModeReadWrite,
410 blink::WebIDBTransactionModeVersionChange}; 417 blink::WebIDBTransactionModeVersionChange};
411 418
412 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions, 419 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions,
413 IndexedDBTransactionTestMode, 420 IndexedDBTransactionTestMode,
414 ::testing::ValuesIn(kTestModes)); 421 ::testing::ValuesIn(kTestModes));
415 422
416 } // namespace content 423 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698