| 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_database.h" | 5 #include "content/browser/indexed_db/indexed_db_database.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 request->connection(), | 143 request->connection(), |
| 144 scope, | 144 scope, |
| 145 blink::WebIDBTransactionModeReadOnly); | 145 blink::WebIDBTransactionModeReadOnly); |
| 146 | 146 |
| 147 request->connection()->ForceClose(); | 147 request->connection()->ForceClose(); |
| 148 | 148 |
| 149 EXPECT_TRUE(backing_store->HasOneRef()); // local | 149 EXPECT_TRUE(backing_store->HasOneRef()); // local |
| 150 EXPECT_TRUE(callbacks->abort_called()); | 150 EXPECT_TRUE(callbacks->abort_called()); |
| 151 } | 151 } |
| 152 | 152 |
| 153 class MockDeleteCallbacks : public IndexedDBCallbacks { | 153 class MockCallbacks : public IndexedDBCallbacks { |
| 154 public: | 154 public: |
| 155 MockDeleteCallbacks() | 155 MockCallbacks() : IndexedDBCallbacks(NULL, 0, 0) {} |
| 156 : IndexedDBCallbacks(NULL, 0, 0), | |
| 157 blocked_called_(false), | |
| 158 success_called_(false) {} | |
| 159 | 156 |
| 160 void OnBlocked(int64_t existing_version) override { blocked_called_ = true; } | 157 void OnBlocked(int64_t existing_version) override { blocked_called_ = true; } |
| 161 void OnSuccess(int64_t result) override { success_called_ = true; } | 158 void OnSuccess(int64_t result) override { success_called_ = true; } |
| 159 void OnError(const IndexedDBDatabaseError& error) override { |
| 160 error_called_ = true; |
| 161 } |
| 162 bool IsValid() const override { return valid_; } |
| 162 | 163 |
| 163 bool blocked_called() const { return blocked_called_; } | 164 bool blocked_called() const { return blocked_called_; } |
| 164 bool success_called() const { return success_called_; } | 165 bool success_called() const { return success_called_; } |
| 166 bool error_called() const { return error_called_; } |
| 167 void set_valid(bool valid) { valid_ = valid; } |
| 165 | 168 |
| 166 private: | 169 private: |
| 167 ~MockDeleteCallbacks() override {} | 170 ~MockCallbacks() override {} |
| 168 | 171 |
| 169 bool blocked_called_; | 172 bool blocked_called_ = false; |
| 170 bool success_called_; | 173 bool success_called_ = false; |
| 174 bool error_called_ = false; |
| 175 bool valid_ = true; |
| 171 | 176 |
| 172 DISALLOW_COPY_AND_ASSIGN(MockDeleteCallbacks); | 177 DISALLOW_COPY_AND_ASSIGN(MockCallbacks); |
| 173 }; | 178 }; |
| 174 | 179 |
| 175 TEST(IndexedDBDatabaseTest, PendingDelete) { | 180 TEST(IndexedDBDatabaseTest, PendingDelete) { |
| 176 scoped_refptr<IndexedDBFakeBackingStore> backing_store = | 181 scoped_refptr<IndexedDBFakeBackingStore> backing_store = |
| 177 new IndexedDBFakeBackingStore(); | 182 new IndexedDBFakeBackingStore(); |
| 178 EXPECT_TRUE(backing_store->HasOneRef()); // local | 183 EXPECT_TRUE(backing_store->HasOneRef()); // local |
| 179 | 184 |
| 180 scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory(); | 185 scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory(); |
| 181 leveldb::Status s; | 186 leveldb::Status s; |
| 182 scoped_refptr<IndexedDBDatabase> db = | 187 scoped_refptr<IndexedDBDatabase> db = |
| (...skipping 13 matching lines...) Expand all Loading... |
| 196 base::MakeUnique<IndexedDBPendingConnection>( | 201 base::MakeUnique<IndexedDBPendingConnection>( |
| 197 request1, callbacks1, kFakeChildProcessId, transaction_id1, | 202 request1, callbacks1, kFakeChildProcessId, transaction_id1, |
| 198 IndexedDBDatabaseMetadata::DEFAULT_VERSION)); | 203 IndexedDBDatabaseMetadata::DEFAULT_VERSION)); |
| 199 db->OpenConnection(std::move(connection)); | 204 db->OpenConnection(std::move(connection)); |
| 200 | 205 |
| 201 EXPECT_EQ(db->ConnectionCount(), 1UL); | 206 EXPECT_EQ(db->ConnectionCount(), 1UL); |
| 202 EXPECT_EQ(db->ActiveOpenDeleteCount(), 0UL); | 207 EXPECT_EQ(db->ActiveOpenDeleteCount(), 0UL); |
| 203 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); | 208 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); |
| 204 EXPECT_FALSE(backing_store->HasOneRef()); // local and db | 209 EXPECT_FALSE(backing_store->HasOneRef()); // local and db |
| 205 | 210 |
| 206 scoped_refptr<MockDeleteCallbacks> request2(new MockDeleteCallbacks()); | 211 scoped_refptr<MockCallbacks> request2(new MockCallbacks()); |
| 207 db->DeleteDatabase(request2); | 212 db->DeleteDatabase(request2); |
| 208 EXPECT_EQ(db->ConnectionCount(), 1UL); | 213 EXPECT_EQ(db->ConnectionCount(), 1UL); |
| 209 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); | 214 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); |
| 210 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); | 215 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); |
| 211 | 216 |
| 212 EXPECT_FALSE(request2->blocked_called()); | 217 EXPECT_FALSE(request2->blocked_called()); |
| 213 db->VersionChangeIgnored(); | 218 db->VersionChangeIgnored(); |
| 214 EXPECT_TRUE(request2->blocked_called()); | 219 EXPECT_TRUE(request2->blocked_called()); |
| 215 EXPECT_EQ(db->ConnectionCount(), 1UL); | 220 EXPECT_EQ(db->ConnectionCount(), 1UL); |
| 216 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); | 221 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); |
| 217 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); | 222 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); |
| 218 | 223 |
| 219 EXPECT_FALSE(backing_store->HasOneRef()); // local and db | 224 EXPECT_FALSE(backing_store->HasOneRef()); // local and db |
| 220 | 225 |
| 221 db->Close(request1->connection(), true /* forced */); | 226 db->Close(request1->connection(), true /* forced */); |
| 222 EXPECT_EQ(db->ConnectionCount(), 0UL); | 227 EXPECT_EQ(db->ConnectionCount(), 0UL); |
| 223 EXPECT_EQ(db->ActiveOpenDeleteCount(), 0UL); | 228 EXPECT_EQ(db->ActiveOpenDeleteCount(), 0UL); |
| 224 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); | 229 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); |
| 225 | 230 |
| 226 EXPECT_FALSE(db->backing_store()); | 231 EXPECT_FALSE(db->backing_store()); |
| 227 EXPECT_TRUE(backing_store->HasOneRef()); // local | 232 EXPECT_TRUE(backing_store->HasOneRef()); // local |
| 228 EXPECT_TRUE(request2->success_called()); | 233 EXPECT_TRUE(request2->success_called()); |
| 229 } | 234 } |
| 230 | 235 |
| 236 TEST(IndexedDBDatabaseTest, ConnectionRequestsNoLongerValid) { |
| 237 scoped_refptr<IndexedDBFakeBackingStore> backing_store = |
| 238 new IndexedDBFakeBackingStore(); |
| 239 |
| 240 const int64_t transaction_id1 = 1; |
| 241 scoped_refptr<MockIndexedDBFactory> factory = new MockIndexedDBFactory(); |
| 242 leveldb::Status s; |
| 243 scoped_refptr<IndexedDBDatabase> db = IndexedDBDatabase::Create( |
| 244 ASCIIToUTF16("db"), backing_store.get(), factory.get(), |
| 245 IndexedDBDatabase::Identifier(), &s); |
| 246 |
| 247 // Make a connection request. This will be processed immediately. |
| 248 scoped_refptr<MockIndexedDBCallbacks> request1(new MockIndexedDBCallbacks()); |
| 249 { |
| 250 std::unique_ptr<IndexedDBPendingConnection> connection( |
| 251 base::MakeUnique<IndexedDBPendingConnection>( |
| 252 request1, make_scoped_refptr(new MockIndexedDBDatabaseCallbacks()), |
| 253 kFakeChildProcessId, transaction_id1, |
| 254 IndexedDBDatabaseMetadata::DEFAULT_VERSION)); |
| 255 db->OpenConnection(std::move(connection)); |
| 256 } |
| 257 |
| 258 EXPECT_EQ(db->ConnectionCount(), 1UL); |
| 259 EXPECT_EQ(db->ActiveOpenDeleteCount(), 0UL); |
| 260 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); |
| 261 |
| 262 // Make a delete request. This will be blocked by the open. |
| 263 scoped_refptr<MockCallbacks> request2(new MockCallbacks()); |
| 264 db->DeleteDatabase(request2); |
| 265 |
| 266 EXPECT_EQ(db->ConnectionCount(), 1UL); |
| 267 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); |
| 268 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); |
| 269 |
| 270 db->VersionChangeIgnored(); |
| 271 |
| 272 EXPECT_TRUE(request2->blocked_called()); |
| 273 |
| 274 // Make another delete request. This will be waiting in the queue. |
| 275 scoped_refptr<MockCallbacks> request3(new MockCallbacks()); |
| 276 db->DeleteDatabase(request3); |
| 277 EXPECT_FALSE(request3->HasOneRef()); // local, db |
| 278 |
| 279 EXPECT_EQ(db->ConnectionCount(), 1UL); |
| 280 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); |
| 281 EXPECT_EQ(db->PendingOpenDeleteCount(), 1UL); |
| 282 |
| 283 // Make another connection request. This will also be waiting in the queue. |
| 284 scoped_refptr<MockCallbacks> request4(new MockCallbacks()); |
| 285 { |
| 286 std::unique_ptr<IndexedDBPendingConnection> connection( |
| 287 base::MakeUnique<IndexedDBPendingConnection>( |
| 288 request4, make_scoped_refptr(new MockIndexedDBDatabaseCallbacks()), |
| 289 kFakeChildProcessId, transaction_id1, |
| 290 IndexedDBDatabaseMetadata::DEFAULT_VERSION)); |
| 291 db->OpenConnection(std::move(connection)); |
| 292 } |
| 293 |
| 294 EXPECT_EQ(db->ConnectionCount(), 1UL); |
| 295 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); |
| 296 EXPECT_EQ(db->PendingOpenDeleteCount(), 2UL); |
| 297 |
| 298 // Finally yet another delete request, also waiting in the queue. |
| 299 scoped_refptr<MockCallbacks> request5(new MockCallbacks()); |
| 300 db->DeleteDatabase(request2); |
| 301 |
| 302 EXPECT_EQ(db->ConnectionCount(), 1UL); |
| 303 EXPECT_EQ(db->ActiveOpenDeleteCount(), 1UL); |
| 304 EXPECT_EQ(db->PendingOpenDeleteCount(), 3UL); |
| 305 |
| 306 // Simulate renderer going away. |
| 307 request3->set_valid(false); |
| 308 request4->set_valid(false); |
| 309 |
| 310 // Close the blocking connection. First delete request should succeed. |
| 311 EXPECT_FALSE(request2->success_called()); |
| 312 db->Close(request1->connection(), true /* forced */); |
| 313 EXPECT_TRUE(request2->success_called()); |
| 314 |
| 315 // Delete requests that have lost dispatcher should still be processed so |
| 316 // that e.g. a delete followed by a window close is not ignored. |
| 317 EXPECT_FALSE(request3->blocked_called()); |
| 318 EXPECT_TRUE(request3->success_called()); |
| 319 EXPECT_FALSE(request3->error_called()); |
| 320 EXPECT_TRUE(request3->HasOneRef()); // local |
| 321 |
| 322 // Open requests that have lost dispatcher should not be processed. |
| 323 EXPECT_FALSE(request4->blocked_called()); |
| 324 EXPECT_FALSE(request4->success_called()); |
| 325 EXPECT_FALSE(request4->error_called()); |
| 326 EXPECT_TRUE(request4->HasOneRef()); // local |
| 327 |
| 328 // Final delete request should also run. |
| 329 EXPECT_TRUE(request2->success_called()); |
| 330 |
| 331 // And everything else should be complete. |
| 332 EXPECT_EQ(db->ConnectionCount(), 0UL); |
| 333 EXPECT_EQ(db->ActiveOpenDeleteCount(), 0UL); |
| 334 EXPECT_EQ(db->PendingOpenDeleteCount(), 0UL); |
| 335 } |
| 336 |
| 231 void DummyOperation(IndexedDBTransaction* transaction) { | 337 void DummyOperation(IndexedDBTransaction* transaction) { |
| 232 } | 338 } |
| 233 | 339 |
| 234 class IndexedDBDatabaseOperationTest : public testing::Test { | 340 class IndexedDBDatabaseOperationTest : public testing::Test { |
| 235 public: | 341 public: |
| 236 IndexedDBDatabaseOperationTest() | 342 IndexedDBDatabaseOperationTest() |
| 237 : commit_success_(leveldb::Status::OK()), | 343 : commit_success_(leveldb::Status::OK()), |
| 238 factory_(new MockIndexedDBFactory()) {} | 344 factory_(new MockIndexedDBFactory()) {} |
| 239 | 345 |
| 240 void SetUp() override { | 346 void SetUp() override { |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); | 517 EXPECT_EQ(1ULL, db_->metadata().object_stores.size()); |
| 412 | 518 |
| 413 // This will execute the Put then Delete. | 519 // This will execute the Put then Delete. |
| 414 RunPostedTasks(); | 520 RunPostedTasks(); |
| 415 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); | 521 EXPECT_EQ(0ULL, db_->metadata().object_stores.size()); |
| 416 | 522 |
| 417 transaction_->Commit(); // Cleans up the object hierarchy. | 523 transaction_->Commit(); // Cleans up the object hierarchy. |
| 418 } | 524 } |
| 419 | 525 |
| 420 } // namespace content | 526 } // namespace content |
| OLD | NEW |