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

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

Issue 277583002: IndexedDB: Prevent store/index deletion from racing ahead of use (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: base::Closure copies const-refs, so this is better Created 6 years, 7 months 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 | Annotate | Revision Log
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 "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"
11 #include "content/browser/indexed_db/indexed_db_fake_backing_store.h" 11 #include "content/browser/indexed_db/indexed_db_fake_backing_store.h"
12 #include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h" 12 #include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h"
13 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
14 14
15 namespace content { 15 namespace content {
16 16
17 class AbortObserver {
18 public:
19 AbortObserver() : abort_task_called_(false) {}
20
21 void AbortTask(IndexedDBTransaction* transaction) {
22 abort_task_called_ = true;
23 }
24
25 bool abort_task_called() const { return abort_task_called_; }
26
27 private:
28 bool abort_task_called_;
29 DISALLOW_COPY_AND_ASSIGN(AbortObserver);
30 };
31
17 class IndexedDBTransactionTest : public testing::Test { 32 class IndexedDBTransactionTest : public testing::Test {
18 public: 33 public:
19 IndexedDBTransactionTest() { 34 IndexedDBTransactionTest() {
20 backing_store_ = new IndexedDBFakeBackingStore(); 35 backing_store_ = new IndexedDBFakeBackingStore();
21 CreateDB(); 36 CreateDB();
22 } 37 }
23 38
24 void CreateDB() { 39 void CreateDB() {
25 // DB is created here instead of the constructor to workaround a 40 // DB is created here instead of the constructor to workaround a
26 // "peculiarity of C++". More info at 41 // "peculiarity of C++". More info at
27 // https://code.google.com/p/googletest/wiki/FAQ#My_compiler_complains_that_ a_constructor_(or_destructor)_cannot 42 // https://code.google.com/p/googletest/wiki/FAQ#My_compiler_complains_that_ a_constructor_(or_destructor)_cannot
28 IndexedDBFactory* factory = NULL; 43 IndexedDBFactory* factory = NULL;
29 leveldb::Status s; 44 leveldb::Status s;
30 db_ = IndexedDBDatabase::Create(base::ASCIIToUTF16("db"), 45 db_ = IndexedDBDatabase::Create(base::ASCIIToUTF16("db"),
31 backing_store_, 46 backing_store_,
32 factory, 47 factory,
33 IndexedDBDatabase::Identifier(), 48 IndexedDBDatabase::Identifier(),
34 &s); 49 &s);
35 ASSERT_TRUE(s.ok()); 50 ASSERT_TRUE(s.ok());
36 } 51 }
37 52
38 void RunPostedTasks() { message_loop_.RunUntilIdle(); } 53 void RunPostedTasks() { message_loop_.RunUntilIdle(); }
39 void DummyOperation(IndexedDBTransaction* transaction) {} 54 void DummyOperation(IndexedDBTransaction* transaction) {}
55 void AbortableOperation(AbortObserver* observer,
56 IndexedDBTransaction* transaction) {
57 transaction->ScheduleAbortTask(
58 base::Bind(&AbortObserver::AbortTask, base::Unretained(observer)));
59 }
40 60
41 protected: 61 protected:
42 scoped_refptr<IndexedDBFakeBackingStore> backing_store_; 62 scoped_refptr<IndexedDBFakeBackingStore> backing_store_;
43 scoped_refptr<IndexedDBDatabase> db_; 63 scoped_refptr<IndexedDBDatabase> db_;
44 64
45 private: 65 private:
46 base::MessageLoop message_loop_; 66 base::MessageLoop message_loop_;
47 67
48 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTest); 68 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTest);
49 }; 69 };
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 // Transaction is read-only, so no need to time it out. 145 // Transaction is read-only, so no need to time it out.
126 RunPostedTasks(); 146 RunPostedTasks();
127 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 147 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
128 148
129 // Clean up to avoid leaks. 149 // Clean up to avoid leaks.
130 transaction->Abort(); 150 transaction->Abort();
131 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); 151 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state());
132 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 152 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
133 } 153 }
134 154
135 class AbortObserver {
136 public:
137 AbortObserver() : abort_task_called_(false) {}
138
139 void AbortTask(IndexedDBTransaction* transaction) {
140 abort_task_called_ = true;
141 }
142
143 bool abort_task_called() const { return abort_task_called_; }
144
145 private:
146 bool abort_task_called_;
147 DISALLOW_COPY_AND_ASSIGN(AbortObserver);
148 };
149
150 TEST_P(IndexedDBTransactionTestMode, ScheduleNormalTask) { 155 TEST_P(IndexedDBTransactionTestMode, ScheduleNormalTask) {
151 const int64 id = 0; 156 const int64 id = 0;
152 const std::set<int64> scope; 157 const std::set<int64> scope;
153 const bool commit_failure = false; 158 const bool commit_failure = false;
154 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 159 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction(
155 id, 160 id,
156 new MockIndexedDBDatabaseCallbacks(), 161 new MockIndexedDBDatabaseCallbacks(),
157 scope, 162 scope,
158 GetParam(), 163 GetParam(),
159 db_, 164 db_,
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 id, 283 id,
279 new MockIndexedDBDatabaseCallbacks(), 284 new MockIndexedDBDatabaseCallbacks(),
280 scope, 285 scope,
281 GetParam(), 286 GetParam(),
282 db_, 287 db_,
283 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); 288 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure));
284 db_->TransactionCreated(transaction); 289 db_->TransactionCreated(transaction);
285 290
286 AbortObserver observer; 291 AbortObserver observer;
287 transaction->ScheduleTask( 292 transaction->ScheduleTask(
288 base::Bind(&IndexedDBTransactionTest::DummyOperation, 293 base::Bind(&IndexedDBTransactionTest::AbortableOperation,
289 base::Unretained(this)), 294 base::Unretained(this),
290 base::Bind(&AbortObserver::AbortTask, base::Unretained(&observer))); 295 base::Unretained(&observer)));
291 296
292 // Pump the message loop so that the transaction completes all pending tasks, 297 // Pump the message loop so that the transaction completes all pending tasks,
293 // otherwise it will defer the commit. 298 // otherwise it will defer the commit.
294 base::MessageLoop::current()->RunUntilIdle(); 299 base::MessageLoop::current()->RunUntilIdle();
295 300
296 EXPECT_FALSE(observer.abort_task_called()); 301 EXPECT_FALSE(observer.abort_task_called());
297 transaction->Commit(); 302 transaction->Commit();
298 EXPECT_TRUE(observer.abort_task_called()); 303 EXPECT_TRUE(observer.abort_task_called());
299 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); 304 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state());
300 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 305 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 indexed_db::TRANSACTION_READ_ONLY, 360 indexed_db::TRANSACTION_READ_ONLY,
356 indexed_db::TRANSACTION_READ_WRITE, 361 indexed_db::TRANSACTION_READ_WRITE,
357 indexed_db::TRANSACTION_VERSION_CHANGE 362 indexed_db::TRANSACTION_VERSION_CHANGE
358 }; 363 };
359 364
360 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions, 365 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions,
361 IndexedDBTransactionTestMode, 366 IndexedDBTransactionTestMode,
362 ::testing::ValuesIn(kTestModes)); 367 ::testing::ValuesIn(kTestModes));
363 368
364 } // namespace content 369 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698