| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/file_util.h" |
| 7 #include "base/platform_file.h" |
| 6 #include "base/scoped_temp_dir.h" | 8 #include "base/scoped_temp_dir.h" |
| 7 #include "base/stl_util-inl.h" | 9 #include "base/stl_util-inl.h" |
| 8 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| 9 #include "base/synchronization/waitable_event.h" | 11 #include "base/synchronization/waitable_event.h" |
| 10 #include "base/time.h" | 12 #include "base/time.h" |
| 13 #include "base/utf_string_conversions.h" |
| 11 #include "chrome/browser/password_manager/password_form_data.h" | 14 #include "chrome/browser/password_manager/password_form_data.h" |
| 12 #include "chrome/browser/password_manager/password_store_change.h" | 15 #include "chrome/browser/password_manager/password_store_change.h" |
| 16 #include "chrome/browser/password_manager/password_store_consumer.h" |
| 13 #include "chrome/browser/password_manager/password_store_x.h" | 17 #include "chrome/browser/password_manager/password_store_x.h" |
| 18 #include "chrome/browser/prefs/pref_service.h" |
| 14 #include "chrome/browser/webdata/web_data_service.h" | 19 #include "chrome/browser/webdata/web_data_service.h" |
| 20 #include "chrome/common/chrome_notification_types.h" |
| 15 #include "chrome/common/pref_names.h" | 21 #include "chrome/common/pref_names.h" |
| 16 #include "chrome/test/signaling_task.h" | 22 #include "chrome/test/signaling_task.h" |
| 17 #include "chrome/test/testing_profile.h" | 23 #include "chrome/test/testing_profile.h" |
| 24 #include "content/common/notification_details.h" |
| 18 #include "content/common/notification_observer_mock.h" | 25 #include "content/common/notification_observer_mock.h" |
| 19 #include "content/common/notification_service.h" | 26 #include "content/common/notification_registrar.h" |
| 27 #include "content/common/notification_source.h" |
| 20 #include "testing/gmock/include/gmock/gmock.h" | 28 #include "testing/gmock/include/gmock/gmock.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 30 |
| 23 using base::WaitableEvent; | 31 using base::WaitableEvent; |
| 24 using testing::_; | 32 using testing::_; |
| 25 using testing::DoAll; | 33 using testing::DoAll; |
| 26 using testing::ElementsAreArray; | 34 using testing::ElementsAreArray; |
| 27 using testing::Pointee; | 35 using testing::Pointee; |
| 28 using testing::Property; | 36 using testing::Property; |
| 29 using testing::WithArg; | 37 using testing::WithArg; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 47 }; | 55 }; |
| 48 | 56 |
| 49 // This class will add and remove a mock notification observer from | 57 // This class will add and remove a mock notification observer from |
| 50 // the DB thread. | 58 // the DB thread. |
| 51 class DBThreadObserverHelper | 59 class DBThreadObserverHelper |
| 52 : public base::RefCountedThreadSafe<DBThreadObserverHelper, | 60 : public base::RefCountedThreadSafe<DBThreadObserverHelper, |
| 53 BrowserThread::DeleteOnDBThread> { | 61 BrowserThread::DeleteOnDBThread> { |
| 54 public: | 62 public: |
| 55 DBThreadObserverHelper() : done_event_(true, false) {} | 63 DBThreadObserverHelper() : done_event_(true, false) {} |
| 56 | 64 |
| 57 void Init() { | 65 void Init(PasswordStore* password_store) { |
| 58 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 66 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 59 BrowserThread::PostTask( | 67 BrowserThread::PostTask( |
| 60 BrowserThread::DB, | 68 BrowserThread::DB, |
| 61 FROM_HERE, | 69 FROM_HERE, |
| 62 NewRunnableMethod(this, &DBThreadObserverHelper::AddObserverTask)); | 70 NewRunnableMethod(this, |
| 71 &DBThreadObserverHelper::AddObserverTask, |
| 72 make_scoped_refptr(password_store))); |
| 63 done_event_.Wait(); | 73 done_event_.Wait(); |
| 64 } | 74 } |
| 65 | 75 |
| 66 virtual ~DBThreadObserverHelper() { | 76 virtual ~DBThreadObserverHelper() { |
| 67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 77 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 68 registrar_.RemoveAll(); | 78 registrar_.RemoveAll(); |
| 69 } | 79 } |
| 70 | 80 |
| 71 NotificationObserverMock& observer() { | 81 NotificationObserverMock& observer() { |
| 72 return observer_; | 82 return observer_; |
| 73 } | 83 } |
| 74 | 84 |
| 75 protected: | 85 protected: |
| 76 friend class base::RefCountedThreadSafe<DBThreadObserverHelper>; | 86 friend class base::RefCountedThreadSafe<DBThreadObserverHelper>; |
| 77 | 87 |
| 78 void AddObserverTask() { | 88 void AddObserverTask(PasswordStore* password_store) { |
| 79 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 89 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
| 80 registrar_.Add(&observer_, | 90 registrar_.Add(&observer_, |
| 81 chrome::LOGINS_CHANGED, | 91 chrome::NOTIFICATION_LOGINS_CHANGED, |
| 82 NotificationService::AllSources()); | 92 Source<PasswordStore>(password_store)); |
| 83 done_event_.Signal(); | 93 done_event_.Signal(); |
| 84 } | 94 } |
| 85 | 95 |
| 86 WaitableEvent done_event_; | 96 WaitableEvent done_event_; |
| 87 NotificationRegistrar registrar_; | 97 NotificationRegistrar registrar_; |
| 88 NotificationObserverMock observer_; | 98 NotificationObserverMock observer_; |
| 89 }; | 99 }; |
| 90 | 100 |
| 91 class FailingBackend : public PasswordStoreX::NativeBackend { | 101 class FailingBackend : public PasswordStoreX::NativeBackend { |
| 92 public: | 102 public: |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 // The WDS schedules tasks to run on the DB thread so we schedule yet another | 360 // The WDS schedules tasks to run on the DB thread so we schedule yet another |
| 351 // task to notify us that it's safe to carry on with the test. | 361 // task to notify us that it's safe to carry on with the test. |
| 352 WaitableEvent done(false, false); | 362 WaitableEvent done(false, false); |
| 353 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 363 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 354 new SignalingTask(&done)); | 364 new SignalingTask(&done)); |
| 355 done.Wait(); | 365 done.Wait(); |
| 356 | 366 |
| 357 // Initializing the PasswordStore should trigger a migration. | 367 // Initializing the PasswordStore should trigger a migration. |
| 358 scoped_refptr<PasswordStoreX> store( | 368 scoped_refptr<PasswordStoreX> store( |
| 359 new PasswordStoreX(login_db_.release(), | 369 new PasswordStoreX(login_db_.release(), |
| 360 profile_.get(), | 370 profile_.get(), |
| 361 wds_.get(), | 371 wds_.get(), |
| 362 GetBackend())); | 372 GetBackend())); |
| 363 store->Init(); | 373 store->Init(); |
| 364 | 374 |
| 365 // Check that the migration preference has not been initialized. | 375 // Check that the migration preference has not been initialized. |
| 366 ASSERT_TRUE(NULL == profile_->GetPrefs()->FindPreference( | 376 ASSERT_TRUE(NULL == profile_->GetPrefs()->FindPreference( |
| 367 prefs::kLoginDatabaseMigrated)); | 377 prefs::kLoginDatabaseMigrated)); |
| 368 | 378 |
| 369 // Again, the WDS schedules tasks to run on the DB thread, so schedule a task | 379 // Again, the WDS schedules tasks to run on the DB thread, so schedule a task |
| 370 // to signal us when it is safe to continue. | 380 // to signal us when it is safe to continue. |
| 371 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 381 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 372 new SignalingTask(&done)); | 382 new SignalingTask(&done)); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 440 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 431 new SignalingTask(&done)); | 441 new SignalingTask(&done)); |
| 432 done.Wait(); | 442 done.Wait(); |
| 433 | 443 |
| 434 // Handle the callback from the WDS. | 444 // Handle the callback from the WDS. |
| 435 MessageLoop::current()->RunAllPending(); | 445 MessageLoop::current()->RunAllPending(); |
| 436 | 446 |
| 437 STLDeleteElements(&expected_autofillable); | 447 STLDeleteElements(&expected_autofillable); |
| 438 STLDeleteElements(&expected_blacklisted); | 448 STLDeleteElements(&expected_blacklisted); |
| 439 | 449 |
| 440 store->Shutdown(); | 450 // Public in PasswordStore, protected in PasswordStoreX. |
| 451 static_cast<PasswordStore*>(store)->Shutdown(); |
| 441 } | 452 } |
| 442 | 453 |
| 443 TEST_P(PasswordStoreXTest, WDSMigrationAlreadyDone) { | 454 TEST_P(PasswordStoreXTest, WDSMigrationAlreadyDone) { |
| 444 PasswordFormData wds_data[] = { | 455 PasswordFormData wds_data[] = { |
| 445 { PasswordForm::SCHEME_HTML, | 456 { PasswordForm::SCHEME_HTML, |
| 446 "http://bar.example.com", | 457 "http://bar.example.com", |
| 447 "http://bar.example.com/origin", | 458 "http://bar.example.com/origin", |
| 448 "http://bar.example.com/action", | 459 "http://bar.example.com/action", |
| 449 L"submit_element", | 460 L"submit_element", |
| 450 L"username_element", | 461 L"username_element", |
| (...skipping 15 matching lines...) Expand all Loading... |
| 466 wds_->AddLogin(**it); | 477 wds_->AddLogin(**it); |
| 467 } | 478 } |
| 468 | 479 |
| 469 // The WDS schedules tasks to run on the DB thread so we schedule yet another | 480 // The WDS schedules tasks to run on the DB thread so we schedule yet another |
| 470 // task to notify us that it's safe to carry on with the test. | 481 // task to notify us that it's safe to carry on with the test. |
| 471 WaitableEvent done(false, false); | 482 WaitableEvent done(false, false); |
| 472 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 483 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 473 new SignalingTask(&done)); | 484 new SignalingTask(&done)); |
| 474 done.Wait(); | 485 done.Wait(); |
| 475 | 486 |
| 476 // Prentend that the migration has already taken place. | 487 // Pretend that the migration has already taken place. |
| 477 profile_->GetPrefs()->RegisterBooleanPref(prefs::kLoginDatabaseMigrated, | 488 profile_->GetPrefs()->RegisterBooleanPref(prefs::kLoginDatabaseMigrated, |
| 478 true, | 489 true, |
| 479 PrefService::UNSYNCABLE_PREF); | 490 PrefService::UNSYNCABLE_PREF); |
| 480 | 491 |
| 481 // Initializing the PasswordStore shouldn't trigger a migration. | 492 // Initializing the PasswordStore shouldn't trigger a migration. |
| 482 scoped_refptr<PasswordStoreX> store( | 493 scoped_refptr<PasswordStoreX> store( |
| 483 new PasswordStoreX(login_db_.release(), | 494 new PasswordStoreX(login_db_.release(), |
| 484 profile_.get(), | 495 profile_.get(), |
| 485 wds_.get(), | 496 wds_.get(), |
| 486 GetBackend())); | 497 GetBackend())); |
| 487 store->Init(); | 498 store->Init(); |
| 488 | 499 |
| 489 MockPasswordStoreConsumer consumer; | 500 MockPasswordStoreConsumer consumer; |
| 490 // Make sure we quit the MessageLoop even if the test fails. | 501 // Make sure we quit the MessageLoop even if the test fails. |
| 491 ON_CALL(consumer, OnPasswordStoreRequestDone(_, _)) | 502 ON_CALL(consumer, OnPasswordStoreRequestDone(_, _)) |
| 492 .WillByDefault(QuitUIMessageLoop()); | 503 .WillByDefault(QuitUIMessageLoop()); |
| 493 | 504 |
| 494 // No forms should be migrated. | 505 // No forms should be migrated. |
| 495 VectorOfForms empty; | 506 VectorOfForms empty; |
| 496 EXPECT_CALL(consumer, | 507 EXPECT_CALL(consumer, |
| 497 OnPasswordStoreRequestDone(_, | 508 OnPasswordStoreRequestDone(_, |
| 498 ContainsAllPasswordForms(empty))) | 509 ContainsAllPasswordForms(empty))) |
| 499 .WillOnce(QuitUIMessageLoop()); | 510 .WillOnce(QuitUIMessageLoop()); |
| 500 | 511 |
| 501 store->GetAutofillableLogins(&consumer); | 512 store->GetAutofillableLogins(&consumer); |
| 502 MessageLoop::current()->Run(); | 513 MessageLoop::current()->Run(); |
| 503 | 514 |
| 504 STLDeleteElements(&unexpected_autofillable); | 515 STLDeleteElements(&unexpected_autofillable); |
| 505 | 516 |
| 506 store->Shutdown(); | 517 // Public in PasswordStore, protected in PasswordStoreX. |
| 518 static_cast<PasswordStore*>(store)->Shutdown(); |
| 507 } | 519 } |
| 508 | 520 |
| 509 TEST_P(PasswordStoreXTest, Notifications) { | 521 TEST_P(PasswordStoreXTest, Notifications) { |
| 510 // Pretend that the migration has already taken place. | 522 // Pretend that the migration has already taken place. |
| 511 profile_->GetPrefs()->RegisterBooleanPref(prefs::kLoginDatabaseMigrated, | 523 profile_->GetPrefs()->RegisterBooleanPref(prefs::kLoginDatabaseMigrated, |
| 512 true, | 524 true, |
| 513 PrefService::UNSYNCABLE_PREF); | 525 PrefService::UNSYNCABLE_PREF); |
| 514 | 526 |
| 515 // Initializing the PasswordStore shouldn't trigger a migration. | 527 // Initializing the PasswordStore shouldn't trigger a migration. |
| 516 scoped_refptr<PasswordStoreX> store( | 528 scoped_refptr<PasswordStoreX> store( |
| 517 new PasswordStoreX(login_db_.release(), | 529 new PasswordStoreX(login_db_.release(), |
| 518 profile_.get(), | 530 profile_.get(), |
| 519 wds_.get(), | 531 wds_.get(), |
| 520 GetBackend())); | 532 GetBackend())); |
| 521 store->Init(); | 533 store->Init(); |
| 522 | 534 |
| 523 PasswordFormData form_data = | 535 PasswordFormData form_data = |
| 524 { PasswordForm::SCHEME_HTML, | 536 { PasswordForm::SCHEME_HTML, |
| 525 "http://bar.example.com", | 537 "http://bar.example.com", |
| 526 "http://bar.example.com/origin", | 538 "http://bar.example.com/origin", |
| 527 "http://bar.example.com/action", | 539 "http://bar.example.com/action", |
| 528 L"submit_element", | 540 L"submit_element", |
| 529 L"username_element", | 541 L"username_element", |
| 530 L"password_element", | 542 L"password_element", |
| 531 L"username_value", | 543 L"username_value", |
| 532 L"password_value", | 544 L"password_value", |
| 533 true, false, 1 }; | 545 true, false, 1 }; |
| 534 scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data)); | 546 scoped_ptr<PasswordForm> form(CreatePasswordFormFromData(form_data)); |
| 535 | 547 |
| 536 scoped_refptr<DBThreadObserverHelper> helper = new DBThreadObserverHelper; | 548 scoped_refptr<DBThreadObserverHelper> helper = new DBThreadObserverHelper; |
| 537 helper->Init(); | 549 helper->Init(store); |
| 538 | 550 |
| 539 const PasswordStoreChange expected_add_changes[] = { | 551 const PasswordStoreChange expected_add_changes[] = { |
| 540 PasswordStoreChange(PasswordStoreChange::ADD, *form), | 552 PasswordStoreChange(PasswordStoreChange::ADD, *form), |
| 541 }; | 553 }; |
| 542 | 554 |
| 543 EXPECT_CALL(helper->observer(), | 555 EXPECT_CALL(helper->observer(), |
| 544 Observe(int(chrome::LOGINS_CHANGED), | 556 Observe(int(chrome::NOTIFICATION_LOGINS_CHANGED), |
| 545 NotificationService::AllSources(), | 557 Source<PasswordStore>(store), |
| 546 Property(&Details<const PasswordStoreChangeList>::ptr, | 558 Property(&Details<const PasswordStoreChangeList>::ptr, |
| 547 Pointee(ElementsAreArray( | 559 Pointee(ElementsAreArray( |
| 548 expected_add_changes))))); | 560 expected_add_changes))))); |
| 549 | 561 |
| 550 // Adding a login should trigger a notification. | 562 // Adding a login should trigger a notification. |
| 551 store->AddLogin(*form); | 563 store->AddLogin(*form); |
| 552 | 564 |
| 553 // The PasswordStore schedules tasks to run on the DB thread so we schedule | 565 // The PasswordStore schedules tasks to run on the DB thread so we schedule |
| 554 // yet another task to notify us that it's safe to carry on with the test. | 566 // yet another task to notify us that it's safe to carry on with the test. |
| 555 WaitableEvent done(false, false); | 567 WaitableEvent done(false, false); |
| 556 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 568 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 557 new SignalingTask(&done)); | 569 new SignalingTask(&done)); |
| 558 done.Wait(); | 570 done.Wait(); |
| 559 | 571 |
| 560 // Change the password. | 572 // Change the password. |
| 561 form->password_value = WideToUTF16(L"a different password"); | 573 form->password_value = WideToUTF16(L"a different password"); |
| 562 | 574 |
| 563 const PasswordStoreChange expected_update_changes[] = { | 575 const PasswordStoreChange expected_update_changes[] = { |
| 564 PasswordStoreChange(PasswordStoreChange::UPDATE, *form), | 576 PasswordStoreChange(PasswordStoreChange::UPDATE, *form), |
| 565 }; | 577 }; |
| 566 | 578 |
| 567 EXPECT_CALL(helper->observer(), | 579 EXPECT_CALL(helper->observer(), |
| 568 Observe(int(chrome::LOGINS_CHANGED), | 580 Observe(int(chrome::NOTIFICATION_LOGINS_CHANGED), |
| 569 NotificationService::AllSources(), | 581 Source<PasswordStore>(store), |
| 570 Property(&Details<const PasswordStoreChangeList>::ptr, | 582 Property(&Details<const PasswordStoreChangeList>::ptr, |
| 571 Pointee(ElementsAreArray( | 583 Pointee(ElementsAreArray( |
| 572 expected_update_changes))))); | 584 expected_update_changes))))); |
| 573 | 585 |
| 574 // Updating the login with the new password should trigger a notification. | 586 // Updating the login with the new password should trigger a notification. |
| 575 store->UpdateLogin(*form); | 587 store->UpdateLogin(*form); |
| 576 | 588 |
| 577 // Wait for PasswordStore to send the notification. | 589 // Wait for PasswordStore to send the notification. |
| 578 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 590 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 579 new SignalingTask(&done)); | 591 new SignalingTask(&done)); |
| 580 done.Wait(); | 592 done.Wait(); |
| 581 | 593 |
| 582 const PasswordStoreChange expected_delete_changes[] = { | 594 const PasswordStoreChange expected_delete_changes[] = { |
| 583 PasswordStoreChange(PasswordStoreChange::REMOVE, *form), | 595 PasswordStoreChange(PasswordStoreChange::REMOVE, *form), |
| 584 }; | 596 }; |
| 585 | 597 |
| 586 EXPECT_CALL(helper->observer(), | 598 EXPECT_CALL(helper->observer(), |
| 587 Observe(int(chrome::LOGINS_CHANGED), | 599 Observe(int(chrome::NOTIFICATION_LOGINS_CHANGED), |
| 588 NotificationService::AllSources(), | 600 Source<PasswordStore>(store), |
| 589 Property(&Details<const PasswordStoreChangeList>::ptr, | 601 Property(&Details<const PasswordStoreChangeList>::ptr, |
| 590 Pointee(ElementsAreArray( | 602 Pointee(ElementsAreArray( |
| 591 expected_delete_changes))))); | 603 expected_delete_changes))))); |
| 592 | 604 |
| 593 // Deleting the login should trigger a notification. | 605 // Deleting the login should trigger a notification. |
| 594 store->RemoveLogin(*form); | 606 store->RemoveLogin(*form); |
| 595 | 607 |
| 596 // Wait for PasswordStore to send the notification. | 608 // Wait for PasswordStore to send the notification. |
| 597 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 609 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 598 new SignalingTask(&done)); | 610 new SignalingTask(&done)); |
| 599 done.Wait(); | 611 done.Wait(); |
| 600 | 612 |
| 601 store->Shutdown(); | 613 // Public in PasswordStore, protected in PasswordStoreX. |
| 614 static_cast<PasswordStore*>(store)->Shutdown(); |
| 602 } | 615 } |
| 603 | 616 |
| 604 TEST_P(PasswordStoreXTest, NativeMigration) { | 617 TEST_P(PasswordStoreXTest, NativeMigration) { |
| 605 VectorOfForms expected_autofillable; | 618 VectorOfForms expected_autofillable; |
| 606 InitExpectedForms(true, 50, &expected_autofillable); | 619 InitExpectedForms(true, 50, &expected_autofillable); |
| 607 | 620 |
| 608 VectorOfForms expected_blacklisted; | 621 VectorOfForms expected_blacklisted; |
| 609 InitExpectedForms(false, 50, &expected_blacklisted); | 622 InitExpectedForms(false, 50, &expected_blacklisted); |
| 610 | 623 |
| 611 // Get the initial size of the login DB file, before we populate it. | 624 // Get the initial size of the login DB file, before we populate it. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 647 EXPECT_GT(db_file_full_info.size, db_file_start_info.size); | 660 EXPECT_GT(db_file_full_info.size, db_file_start_info.size); |
| 648 | 661 |
| 649 // Pretend that the WDS migration has already taken place. | 662 // Pretend that the WDS migration has already taken place. |
| 650 profile_->GetPrefs()->RegisterBooleanPref(prefs::kLoginDatabaseMigrated, | 663 profile_->GetPrefs()->RegisterBooleanPref(prefs::kLoginDatabaseMigrated, |
| 651 true, | 664 true, |
| 652 PrefService::UNSYNCABLE_PREF); | 665 PrefService::UNSYNCABLE_PREF); |
| 653 | 666 |
| 654 // Initializing the PasswordStore shouldn't trigger a native migration (yet). | 667 // Initializing the PasswordStore shouldn't trigger a native migration (yet). |
| 655 scoped_refptr<PasswordStoreX> store( | 668 scoped_refptr<PasswordStoreX> store( |
| 656 new PasswordStoreX(login_db_.release(), | 669 new PasswordStoreX(login_db_.release(), |
| 657 profile_.get(), | 670 profile_.get(), |
| 658 wds_.get(), | 671 wds_.get(), |
| 659 GetBackend())); | 672 GetBackend())); |
| 660 store->Init(); | 673 store->Init(); |
| 661 | 674 |
| 662 MockPasswordStoreConsumer consumer; | 675 MockPasswordStoreConsumer consumer; |
| 663 | 676 |
| 664 // Make sure we quit the MessageLoop even if the test fails. | 677 // Make sure we quit the MessageLoop even if the test fails. |
| 665 ON_CALL(consumer, OnPasswordStoreRequestDone(_, _)) | 678 ON_CALL(consumer, OnPasswordStoreRequestDone(_, _)) |
| 666 .WillByDefault(QuitUIMessageLoop()); | 679 .WillByDefault(QuitUIMessageLoop()); |
| 667 | 680 |
| 668 // The autofillable forms should have been migrated to the native backend. | 681 // The autofillable forms should have been migrated to the native backend. |
| 669 EXPECT_CALL(consumer, | 682 EXPECT_CALL(consumer, |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 733 // size is equal to the size before we populated it, even though it was | 746 // size is equal to the size before we populated it, even though it was |
| 734 // larger after populating it. | 747 // larger after populating it. |
| 735 base::PlatformFileInfo db_file_end_info; | 748 base::PlatformFileInfo db_file_end_info; |
| 736 ASSERT_TRUE(file_util::GetFileInfo(login_db_file, &db_file_end_info)); | 749 ASSERT_TRUE(file_util::GetFileInfo(login_db_file, &db_file_end_info)); |
| 737 EXPECT_EQ(db_file_start_info.size, db_file_end_info.size); | 750 EXPECT_EQ(db_file_start_info.size, db_file_end_info.size); |
| 738 } | 751 } |
| 739 | 752 |
| 740 STLDeleteElements(&expected_autofillable); | 753 STLDeleteElements(&expected_autofillable); |
| 741 STLDeleteElements(&expected_blacklisted); | 754 STLDeleteElements(&expected_blacklisted); |
| 742 | 755 |
| 743 store->Shutdown(); | 756 // Public in PasswordStore, protected in PasswordStoreX. |
| 757 static_cast<PasswordStore*>(store)->Shutdown(); |
| 744 } | 758 } |
| 745 | 759 |
| 746 INSTANTIATE_TEST_CASE_P(NoBackend, | 760 INSTANTIATE_TEST_CASE_P(NoBackend, |
| 747 PasswordStoreXTest, | 761 PasswordStoreXTest, |
| 748 testing::Values(NO_BACKEND)); | 762 testing::Values(NO_BACKEND)); |
| 749 INSTANTIATE_TEST_CASE_P(FailingBackend, | 763 INSTANTIATE_TEST_CASE_P(FailingBackend, |
| 750 PasswordStoreXTest, | 764 PasswordStoreXTest, |
| 751 testing::Values(FAILING_BACKEND)); | 765 testing::Values(FAILING_BACKEND)); |
| 752 INSTANTIATE_TEST_CASE_P(WorkingBackend, | 766 INSTANTIATE_TEST_CASE_P(WorkingBackend, |
| 753 PasswordStoreXTest, | 767 PasswordStoreXTest, |
| 754 testing::Values(WORKING_BACKEND)); | 768 testing::Values(WORKING_BACKEND)); |
| OLD | NEW |