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