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 <vector> | 5 #include <vector> |
6 | 6 |
7 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
8 | 8 |
9 #include "base/synchronization/waitable_event.h" | 9 #include "base/synchronization/waitable_event.h" |
10 #include "base/task.h" | 10 #include "base/task.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 ACTION_P3(MakePasswordSyncComponents, service, ps, dtc) { | 76 ACTION_P3(MakePasswordSyncComponents, service, ps, dtc) { |
77 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); | 77 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); |
78 PasswordModelAssociator* model_associator = | 78 PasswordModelAssociator* model_associator = |
79 new PasswordModelAssociator(service, ps); | 79 new PasswordModelAssociator(service, ps); |
80 PasswordChangeProcessor* change_processor = | 80 PasswordChangeProcessor* change_processor = |
81 new PasswordChangeProcessor(model_associator, ps, dtc); | 81 new PasswordChangeProcessor(model_associator, ps, dtc); |
82 return ProfileSyncFactory::SyncComponents(model_associator, | 82 return ProfileSyncFactory::SyncComponents(model_associator, |
83 change_processor); | 83 change_processor); |
84 } | 84 } |
85 | 85 |
| 86 ACTION_P(AcquireSyncTransaction, password_test_service) { |
| 87 // Check to make sure we can aquire a transaction (will crash if a transaction |
| 88 // is already held by this thread, deadlock if held by another thread). |
| 89 sync_api::WriteTransaction trans(password_test_service->GetUserShare()); |
| 90 VLOG(1) << "Sync transaction acquired."; |
| 91 } |
| 92 |
86 static void QuitMessageLoop() { | 93 static void QuitMessageLoop() { |
87 MessageLoop::current()->Quit(); | 94 MessageLoop::current()->Quit(); |
88 } | 95 } |
89 | 96 |
90 class MockPasswordStore : public PasswordStore { | 97 class MockPasswordStore : public PasswordStore { |
91 public: | 98 public: |
92 MOCK_METHOD1(RemoveLogin, void(const PasswordForm&)); | 99 MOCK_METHOD1(RemoveLogin, void(const PasswordForm&)); |
93 MOCK_METHOD2(GetLogins, int(const PasswordForm&, PasswordStoreConsumer*)); | 100 MOCK_METHOD2(GetLogins, int(const PasswordForm&, PasswordStoreConsumer*)); |
94 MOCK_METHOD1(AddLogin, void(const PasswordForm&)); | 101 MOCK_METHOD1(AddLogin, void(const PasswordForm&)); |
95 MOCK_METHOD1(UpdateLogin, void(const PasswordForm&)); | 102 MOCK_METHOD1(UpdateLogin, void(const PasswordForm&)); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 } | 137 } |
131 | 138 |
132 TestProfileSyncService::OnPassphraseAccepted(); | 139 TestProfileSyncService::OnPassphraseAccepted(); |
133 } | 140 } |
134 | 141 |
135 private: | 142 private: |
136 Task* passphrase_accept_task_; | 143 Task* passphrase_accept_task_; |
137 }; | 144 }; |
138 | 145 |
139 class ProfileSyncServicePasswordTest : public AbstractProfileSyncServiceTest { | 146 class ProfileSyncServicePasswordTest : public AbstractProfileSyncServiceTest { |
| 147 public: |
| 148 sync_api::UserShare* GetUserShare() { |
| 149 return service_->GetUserShare(); |
| 150 } |
140 protected: | 151 protected: |
141 ProfileSyncServicePasswordTest() | 152 ProfileSyncServicePasswordTest() |
142 : db_thread_(BrowserThread::DB) { | 153 : db_thread_(BrowserThread::DB) { |
143 } | 154 } |
144 | 155 |
145 virtual void SetUp() { | 156 virtual void SetUp() { |
146 profile_.CreateRequestContext(); | 157 profile_.CreateRequestContext(); |
147 password_store_ = new MockPasswordStore(); | 158 password_store_ = new MockPasswordStore(); |
148 db_thread_.Start(); | 159 db_thread_.Start(); |
149 | 160 |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 StartSyncService(&root_task, &node_task); | 481 StartSyncService(&root_task, &node_task); |
471 | 482 |
472 std::vector<PasswordForm> new_sync_forms; | 483 std::vector<PasswordForm> new_sync_forms; |
473 GetPasswordEntriesFromSyncDB(&new_sync_forms); | 484 GetPasswordEntriesFromSyncDB(&new_sync_forms); |
474 | 485 |
475 EXPECT_EQ(2U, new_sync_forms.size()); | 486 EXPECT_EQ(2U, new_sync_forms.size()); |
476 EXPECT_TRUE(ComparePasswords(expected_forms[0], new_sync_forms[0])); | 487 EXPECT_TRUE(ComparePasswords(expected_forms[0], new_sync_forms[0])); |
477 EXPECT_TRUE(ComparePasswords(expected_forms[1], new_sync_forms[1])); | 488 EXPECT_TRUE(ComparePasswords(expected_forms[1], new_sync_forms[1])); |
478 } | 489 } |
479 | 490 |
| 491 // Same as HasNativeHasEmptyNoMerge, but we attempt to aquire a sync transaction |
| 492 // every time the password store is accessed. |
| 493 TEST_F(ProfileSyncServicePasswordTest, EnsureNoTransactions) { |
| 494 std::vector<PasswordForm*> native_forms; |
| 495 std::vector<PasswordForm> sync_forms; |
| 496 std::vector<PasswordForm> expected_forms; |
| 497 { |
| 498 PasswordForm* new_form = new PasswordForm; |
| 499 new_form->scheme = PasswordForm::SCHEME_HTML; |
| 500 new_form->signon_realm = "pie"; |
| 501 new_form->origin = GURL("http://pie.com"); |
| 502 new_form->action = GURL("http://pie.com/submit"); |
| 503 new_form->username_element = UTF8ToUTF16("name"); |
| 504 new_form->username_value = UTF8ToUTF16("tom"); |
| 505 new_form->password_element = UTF8ToUTF16("cork"); |
| 506 new_form->password_value = UTF8ToUTF16("password1"); |
| 507 new_form->ssl_valid = true; |
| 508 new_form->preferred = false; |
| 509 new_form->date_created = base::Time::FromInternalValue(1234); |
| 510 new_form->blacklisted_by_user = false; |
| 511 |
| 512 native_forms.push_back(new_form); |
| 513 expected_forms.push_back(*new_form); |
| 514 } |
| 515 |
| 516 { |
| 517 PasswordForm new_form; |
| 518 new_form.scheme = PasswordForm::SCHEME_HTML; |
| 519 new_form.signon_realm = "pie2"; |
| 520 new_form.origin = GURL("http://pie2.com"); |
| 521 new_form.action = GURL("http://pie2.com/submit"); |
| 522 new_form.username_element = UTF8ToUTF16("name2"); |
| 523 new_form.username_value = UTF8ToUTF16("tom2"); |
| 524 new_form.password_element = UTF8ToUTF16("cork2"); |
| 525 new_form.password_value = UTF8ToUTF16("password12"); |
| 526 new_form.ssl_valid = false; |
| 527 new_form.preferred = true; |
| 528 new_form.date_created = base::Time::FromInternalValue(12345); |
| 529 new_form.blacklisted_by_user = false; |
| 530 sync_forms.push_back(new_form); |
| 531 expected_forms.push_back(new_form); |
| 532 } |
| 533 |
| 534 EXPECT_CALL(*password_store_, FillAutofillableLogins(_)) |
| 535 .WillOnce(DoAll(SetArgumentPointee<0>(native_forms), |
| 536 AcquireSyncTransaction(this), |
| 537 Return(true))); |
| 538 EXPECT_CALL(*password_store_, FillBlacklistLogins(_)) |
| 539 .WillOnce(DoAll(AcquireSyncTransaction(this), |
| 540 Return(true))); |
| 541 EXPECT_CALL(*password_store_, AddLoginImpl(_)) |
| 542 .WillOnce(AcquireSyncTransaction(this)); |
| 543 |
| 544 CreateRootTask root_task(this, syncable::PASSWORDS); |
| 545 AddPasswordEntriesTask node_task(this, sync_forms); |
| 546 StartSyncService(&root_task, &node_task); |
| 547 |
| 548 std::vector<PasswordForm> new_sync_forms; |
| 549 GetPasswordEntriesFromSyncDB(&new_sync_forms); |
| 550 |
| 551 EXPECT_EQ(2U, new_sync_forms.size()); |
| 552 EXPECT_TRUE(ComparePasswords(expected_forms[0], new_sync_forms[0])); |
| 553 EXPECT_TRUE(ComparePasswords(expected_forms[1], new_sync_forms[1])); |
| 554 } |
| 555 |
480 TEST_F(ProfileSyncServicePasswordTest, HasNativeHasSyncMergeEntry) { | 556 TEST_F(ProfileSyncServicePasswordTest, HasNativeHasSyncMergeEntry) { |
481 std::vector<PasswordForm*> native_forms; | 557 std::vector<PasswordForm*> native_forms; |
482 std::vector<PasswordForm> sync_forms; | 558 std::vector<PasswordForm> sync_forms; |
483 std::vector<PasswordForm> expected_forms; | 559 std::vector<PasswordForm> expected_forms; |
484 { | 560 { |
485 PasswordForm* new_form = new PasswordForm; | 561 PasswordForm* new_form = new PasswordForm; |
486 new_form->scheme = PasswordForm::SCHEME_HTML; | 562 new_form->scheme = PasswordForm::SCHEME_HTML; |
487 new_form->signon_realm = "pie"; | 563 new_form->signon_realm = "pie"; |
488 new_form->origin = GURL("http://pie.com"); | 564 new_form->origin = GURL("http://pie.com"); |
489 new_form->action = GURL("http://pie.com/submit"); | 565 new_form->action = GURL("http://pie.com/submit"); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 AddPasswordEntriesTask node_task(this, sync_forms); | 618 AddPasswordEntriesTask node_task(this, sync_forms); |
543 | 619 |
544 StartSyncService(&root_task, &node_task); | 620 StartSyncService(&root_task, &node_task); |
545 | 621 |
546 std::vector<PasswordForm> new_sync_forms; | 622 std::vector<PasswordForm> new_sync_forms; |
547 GetPasswordEntriesFromSyncDB(&new_sync_forms); | 623 GetPasswordEntriesFromSyncDB(&new_sync_forms); |
548 | 624 |
549 EXPECT_EQ(1U, new_sync_forms.size()); | 625 EXPECT_EQ(1U, new_sync_forms.size()); |
550 EXPECT_TRUE(ComparePasswords(expected_forms[0], new_sync_forms[0])); | 626 EXPECT_TRUE(ComparePasswords(expected_forms[0], new_sync_forms[0])); |
551 } | 627 } |
OLD | NEW |