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

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

Issue 2160163002: [IndexedDB] Propogating Changes to Observer : Browser (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Browser changes Created 4 years, 5 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
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/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/run_loop.h" 13 #include "base/run_loop.h"
14 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.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"
17 #include "content/browser/indexed_db/indexed_db_observer.h"
16 #include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h" 18 #include "content/browser/indexed_db/mock_indexed_db_database_callbacks.h"
17 #include "content/browser/indexed_db/mock_indexed_db_factory.h" 19 #include "content/browser/indexed_db/mock_indexed_db_factory.h"
18 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
19 21
20 namespace content { 22 namespace content {
21 23
22 class AbortObserver { 24 class AbortObserver {
23 public: 25 public:
24 AbortObserver() : abort_task_called_(false) {} 26 AbortObserver() : abort_task_called_(false) {}
25 27
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 public: 81 public:
80 IndexedDBTransactionTestMode() {} 82 IndexedDBTransactionTestMode() {}
81 private: 83 private:
82 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTestMode); 84 DISALLOW_COPY_AND_ASSIGN(IndexedDBTransactionTestMode);
83 }; 85 };
84 86
85 TEST_F(IndexedDBTransactionTest, Timeout) { 87 TEST_F(IndexedDBTransactionTest, Timeout) {
86 const int64_t id = 0; 88 const int64_t id = 0;
87 const std::set<int64_t> scope; 89 const std::set<int64_t> scope;
88 const leveldb::Status commit_success = leveldb::Status::OK(); 90 const leveldb::Status commit_success = leveldb::Status::OK();
91 std::unique_ptr<IndexedDBConnection> connection(
92 new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks()));
89 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 93 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction(
90 id, 94 id, connection->GetWeakPtr(), scope,
91 new MockIndexedDBDatabaseCallbacks(),
92 scope,
93 blink::WebIDBTransactionModeReadWrite, 95 blink::WebIDBTransactionModeReadWrite,
94 db_.get(),
95 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 96 new IndexedDBFakeBackingStore::FakeTransaction(commit_success));
96 db_->TransactionCreated(transaction.get()); 97 db_->TransactionCreated(transaction.get());
97 98
98 // No conflicting transactions, so coordinator will start it immediately: 99 // No conflicting transactions, so coordinator will start it immediately:
99 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); 100 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state());
100 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 101 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
101 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 102 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
102 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 103 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
103 104
104 // Schedule a task - timer won't be started until it's processed. 105 // Schedule a task - timer won't be started until it's processed.
(...skipping 18 matching lines...) Expand all
123 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); 124 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state());
124 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 125 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
125 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); 126 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled);
126 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); 127 EXPECT_EQ(1, transaction->diagnostics().tasks_completed);
127 } 128 }
128 129
129 TEST_F(IndexedDBTransactionTest, NoTimeoutReadOnly) { 130 TEST_F(IndexedDBTransactionTest, NoTimeoutReadOnly) {
130 const int64_t id = 0; 131 const int64_t id = 0;
131 const std::set<int64_t> scope; 132 const std::set<int64_t> scope;
132 const leveldb::Status commit_success = leveldb::Status::OK(); 133 const leveldb::Status commit_success = leveldb::Status::OK();
134 std::unique_ptr<IndexedDBConnection> connection(
135 new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks()));
133 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 136 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction(
134 id, 137 id, connection->GetWeakPtr(), scope, blink::WebIDBTransactionModeReadOnly,
135 new MockIndexedDBDatabaseCallbacks(),
136 scope,
137 blink::WebIDBTransactionModeReadOnly,
138 db_.get(),
139 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 138 new IndexedDBFakeBackingStore::FakeTransaction(commit_success));
140 db_->TransactionCreated(transaction.get()); 139 db_->TransactionCreated(transaction.get());
141 140
142 // No conflicting transactions, so coordinator will start it immediately: 141 // No conflicting transactions, so coordinator will start it immediately:
143 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); 142 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state());
144 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 143 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
145 144
146 // Schedule a task - timer won't be started until it's processed. 145 // Schedule a task - timer won't be started until it's processed.
147 transaction->ScheduleTask(base::Bind( 146 transaction->ScheduleTask(base::Bind(
148 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this))); 147 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this)));
149 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 148 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
150 149
151 // Transaction is read-only, so no need to time it out. 150 // Transaction is read-only, so no need to time it out.
152 RunPostedTasks(); 151 RunPostedTasks();
153 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 152 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
154 153
155 // Clean up to avoid leaks. 154 // Clean up to avoid leaks.
156 transaction->Abort(); 155 transaction->Abort();
157 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); 156 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state());
158 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 157 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
159 } 158 }
160 159
161 TEST_P(IndexedDBTransactionTestMode, ScheduleNormalTask) { 160 TEST_P(IndexedDBTransactionTestMode, ScheduleNormalTask) {
162 const int64_t id = 0; 161 const int64_t id = 0;
163 const std::set<int64_t> scope; 162 const std::set<int64_t> scope;
164 const leveldb::Status commit_success = leveldb::Status::OK(); 163 const leveldb::Status commit_success = leveldb::Status::OK();
164 std::unique_ptr<IndexedDBConnection> connection(
165 new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks()));
165 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 166 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction(
166 id, 167 id, connection->GetWeakPtr(), scope, GetParam(),
167 new MockIndexedDBDatabaseCallbacks(),
168 scope,
169 GetParam(),
170 db_.get(),
171 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 168 new IndexedDBFakeBackingStore::FakeTransaction(commit_success));
172 169
173 EXPECT_FALSE(transaction->HasPendingTasks()); 170 EXPECT_FALSE(transaction->HasPendingTasks());
174 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); 171 EXPECT_TRUE(transaction->IsTaskQueueEmpty());
175 EXPECT_TRUE(transaction->task_queue_.empty()); 172 EXPECT_TRUE(transaction->task_queue_.empty());
176 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); 173 EXPECT_TRUE(transaction->preemptive_task_queue_.empty());
177 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 174 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
178 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 175 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
179 176
180 db_->TransactionCreated(transaction.get()); 177 db_->TransactionCreated(transaction.get());
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 EXPECT_TRUE(transaction->task_queue_.empty()); 214 EXPECT_TRUE(transaction->task_queue_.empty());
218 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); 215 EXPECT_TRUE(transaction->preemptive_task_queue_.empty());
219 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled); 216 EXPECT_EQ(1, transaction->diagnostics().tasks_scheduled);
220 EXPECT_EQ(1, transaction->diagnostics().tasks_completed); 217 EXPECT_EQ(1, transaction->diagnostics().tasks_completed);
221 } 218 }
222 219
223 TEST_F(IndexedDBTransactionTest, SchedulePreemptiveTask) { 220 TEST_F(IndexedDBTransactionTest, SchedulePreemptiveTask) {
224 const int64_t id = 0; 221 const int64_t id = 0;
225 const std::set<int64_t> scope; 222 const std::set<int64_t> scope;
226 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch."); 223 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch.");
224 std::unique_ptr<IndexedDBConnection> connection(
225 new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks()));
227 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 226 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction(
228 id, 227 id, connection->GetWeakPtr(), scope,
229 new MockIndexedDBDatabaseCallbacks(),
230 scope,
231 blink::WebIDBTransactionModeVersionChange, 228 blink::WebIDBTransactionModeVersionChange,
232 db_.get(),
233 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); 229 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure));
234 230
235 EXPECT_FALSE(transaction->HasPendingTasks()); 231 EXPECT_FALSE(transaction->HasPendingTasks());
236 EXPECT_TRUE(transaction->IsTaskQueueEmpty()); 232 EXPECT_TRUE(transaction->IsTaskQueueEmpty());
237 EXPECT_TRUE(transaction->task_queue_.empty()); 233 EXPECT_TRUE(transaction->task_queue_.empty());
238 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); 234 EXPECT_TRUE(transaction->preemptive_task_queue_.empty());
239 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 235 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
240 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 236 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
241 237
242 db_->TransactionCreated(transaction.get()); 238 db_->TransactionCreated(transaction.get());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 EXPECT_TRUE(transaction->task_queue_.empty()); 274 EXPECT_TRUE(transaction->task_queue_.empty());
279 EXPECT_TRUE(transaction->preemptive_task_queue_.empty()); 275 EXPECT_TRUE(transaction->preemptive_task_queue_.empty());
280 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled); 276 EXPECT_EQ(0, transaction->diagnostics().tasks_scheduled);
281 EXPECT_EQ(0, transaction->diagnostics().tasks_completed); 277 EXPECT_EQ(0, transaction->diagnostics().tasks_completed);
282 } 278 }
283 279
284 TEST_P(IndexedDBTransactionTestMode, AbortTasks) { 280 TEST_P(IndexedDBTransactionTestMode, AbortTasks) {
285 const int64_t id = 0; 281 const int64_t id = 0;
286 const std::set<int64_t> scope; 282 const std::set<int64_t> scope;
287 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch."); 283 const leveldb::Status commit_failure = leveldb::Status::Corruption("Ouch.");
284 std::unique_ptr<IndexedDBConnection> connection(
285 new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks()));
288 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 286 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction(
289 id, 287 id, connection->GetWeakPtr(), scope, GetParam(),
290 new MockIndexedDBDatabaseCallbacks(),
291 scope,
292 GetParam(),
293 db_.get(),
294 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure)); 288 new IndexedDBFakeBackingStore::FakeTransaction(commit_failure));
295 db_->TransactionCreated(transaction.get()); 289 db_->TransactionCreated(transaction.get());
296 290
297 AbortObserver observer; 291 AbortObserver observer;
298 transaction->ScheduleTask( 292 transaction->ScheduleTask(
299 base::Bind(&IndexedDBTransactionTest::AbortableOperation, 293 base::Bind(&IndexedDBTransactionTest::AbortableOperation,
300 base::Unretained(this), 294 base::Unretained(this),
301 base::Unretained(&observer))); 295 base::Unretained(&observer)));
302 296
303 // 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,
304 // otherwise it will defer the commit. 298 // otherwise it will defer the commit.
305 base::RunLoop().RunUntilIdle(); 299 base::RunLoop().RunUntilIdle();
306 300
307 EXPECT_FALSE(observer.abort_task_called()); 301 EXPECT_FALSE(observer.abort_task_called());
308 transaction->Commit(); 302 transaction->Commit();
309 EXPECT_TRUE(observer.abort_task_called()); 303 EXPECT_TRUE(observer.abort_task_called());
310 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); 304 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state());
311 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 305 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
312 } 306 }
313 307
314 TEST_P(IndexedDBTransactionTestMode, AbortPreemptive) { 308 TEST_P(IndexedDBTransactionTestMode, AbortPreemptive) {
315 const int64_t id = 0; 309 const int64_t id = 0;
316 const std::set<int64_t> scope; 310 const std::set<int64_t> scope;
317 const leveldb::Status commit_success = leveldb::Status::OK(); 311 const leveldb::Status commit_success = leveldb::Status::OK();
312 std::unique_ptr<IndexedDBConnection> connection(
313 new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks()));
318 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction( 314 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction(
319 id, 315 id, connection->GetWeakPtr(), scope, GetParam(),
320 new MockIndexedDBDatabaseCallbacks(),
321 scope,
322 GetParam(),
323 db_.get(),
324 new IndexedDBFakeBackingStore::FakeTransaction(commit_success)); 316 new IndexedDBFakeBackingStore::FakeTransaction(commit_success));
325 db_->TransactionCreated(transaction.get()); 317 db_->TransactionCreated(transaction.get());
326 318
327 // No conflicting transactions, so coordinator will start it immediately: 319 // No conflicting transactions, so coordinator will start it immediately:
328 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state()); 320 EXPECT_EQ(IndexedDBTransaction::STARTED, transaction->state());
329 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 321 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
330 322
331 transaction->ScheduleTask( 323 transaction->ScheduleTask(
332 blink::WebIDBTaskTypePreemptive, 324 blink::WebIDBTaskTypePreemptive,
333 base::Bind(&IndexedDBTransactionTest::DummyOperation, 325 base::Bind(&IndexedDBTransactionTest::DummyOperation,
(...skipping 21 matching lines...) Expand all
355 // This task will be ignored. 347 // This task will be ignored.
356 transaction->ScheduleTask(base::Bind( 348 transaction->ScheduleTask(base::Bind(
357 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this))); 349 &IndexedDBTransactionTest::DummyOperation, base::Unretained(this)));
358 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state()); 350 EXPECT_EQ(IndexedDBTransaction::FINISHED, transaction->state());
359 EXPECT_FALSE(transaction->IsTimeoutTimerRunning()); 351 EXPECT_FALSE(transaction->IsTimeoutTimerRunning());
360 EXPECT_FALSE(transaction->HasPendingTasks()); 352 EXPECT_FALSE(transaction->HasPendingTasks());
361 EXPECT_EQ(transaction->diagnostics().tasks_completed, 353 EXPECT_EQ(transaction->diagnostics().tasks_completed,
362 transaction->diagnostics().tasks_scheduled); 354 transaction->diagnostics().tasks_scheduled);
363 } 355 }
364 356
357 TEST_F(IndexedDBTransactionTest, IndexedDBObserver) {
358 const int64_t id = 0;
359 const std::set<int64_t> scope;
360 const leveldb::Status commit_success = leveldb::Status::OK();
361 std::unique_ptr<IndexedDBConnection> connection(
362 new IndexedDBConnection(db_, new MockIndexedDBDatabaseCallbacks()));
363 scoped_refptr<IndexedDBTransaction> transaction = new IndexedDBTransaction(
364 id, connection->GetWeakPtr(), scope,
365 blink::WebIDBTransactionModeReadWrite,
366 new IndexedDBFakeBackingStore::FakeTransaction(commit_success));
367 db_->TransactionCreated(transaction.get());
368
369 EXPECT_EQ(0UL, transaction->pending_observers_.size());
370 EXPECT_EQ(0UL, connection->active_observers().size());
371
372 // Add observers to pending observer list.
373 const int32_t observer_id1 = 1, observer_id2 = 2;
374 IndexedDBObserver::Options options(false, false, false, 0U);
375 transaction->AddPendingObserver(observer_id1, options);
376 transaction->AddPendingObserver(observer_id2, options);
377 EXPECT_EQ(2UL, transaction->pending_observers_.size());
378 EXPECT_EQ(0UL, connection->active_observers().size());
379
380 // Before commit, observer would be in pending list of transaction.
381 std::vector<int32_t> observer_to_remove1 = {observer_id1};
382 connection->RemoveObservers(observer_to_remove1);
383 EXPECT_EQ(1UL, transaction->pending_observers_.size());
384 EXPECT_EQ(0UL, connection->active_observers().size());
385
386 // After commit, observer moved to connection's active observer.
387 transaction->Commit();
388 EXPECT_EQ(0UL, transaction->pending_observers_.size());
389 EXPECT_EQ(1UL, connection->active_observers().size());
390
391 // Observer does not exist, so no change to active_observers.
392 connection->RemoveObservers(observer_to_remove1);
393 EXPECT_EQ(1UL, connection->active_observers().size());
394
395 // Observer removed from connection's active observer.
396 std::vector<int32_t> observer_to_remove2 = {observer_id2};
397 connection->RemoveObservers(observer_to_remove2);
398 EXPECT_EQ(0UL, connection->active_observers().size());
399 }
400
365 static const blink::WebIDBTransactionMode kTestModes[] = { 401 static const blink::WebIDBTransactionMode kTestModes[] = {
366 blink::WebIDBTransactionModeReadOnly, blink::WebIDBTransactionModeReadWrite, 402 blink::WebIDBTransactionModeReadOnly, blink::WebIDBTransactionModeReadWrite,
367 blink::WebIDBTransactionModeVersionChange}; 403 blink::WebIDBTransactionModeVersionChange};
368 404
369 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions, 405 INSTANTIATE_TEST_CASE_P(IndexedDBTransactions,
370 IndexedDBTransactionTestMode, 406 IndexedDBTransactionTestMode,
371 ::testing::ValuesIn(kTestModes)); 407 ::testing::ValuesIn(kTestModes));
372 408
373 } // namespace content 409 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698