| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "components/password_manager/core/browser/password_store_default.h" | 5 #include "components/password_manager/core/browser/password_store_default.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 116 std::unique_ptr<LoginDatabase> database) { | 116 std::unique_ptr<LoginDatabase> database) { |
| 117 SetupTempDir(); | 117 SetupTempDir(); |
| 118 store_ = CreateInitializedStore(std::move(database)); | 118 store_ = CreateInitializedStore(std::move(database)); |
| 119 } | 119 } |
| 120 | 120 |
| 121 PasswordStoreDefaultTestDelegate::~PasswordStoreDefaultTestDelegate() { | 121 PasswordStoreDefaultTestDelegate::~PasswordStoreDefaultTestDelegate() { |
| 122 ClosePasswordStore(); | 122 ClosePasswordStore(); |
| 123 } | 123 } |
| 124 | 124 |
| 125 void PasswordStoreDefaultTestDelegate::FinishAsyncProcessing() { | 125 void PasswordStoreDefaultTestDelegate::FinishAsyncProcessing() { |
| 126 base::MessageLoop::current()->RunUntilIdle(); | 126 base::RunLoop().RunUntilIdle(); |
| 127 } | 127 } |
| 128 | 128 |
| 129 void PasswordStoreDefaultTestDelegate::SetupTempDir() { | 129 void PasswordStoreDefaultTestDelegate::SetupTempDir() { |
| 130 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 130 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 131 } | 131 } |
| 132 | 132 |
| 133 void PasswordStoreDefaultTestDelegate::ClosePasswordStore() { | 133 void PasswordStoreDefaultTestDelegate::ClosePasswordStore() { |
| 134 store_->ShutdownOnUIThread(); | 134 store_->ShutdownOnUIThread(); |
| 135 base::MessageLoop::current()->RunUntilIdle(); | 135 base::RunLoop().RunUntilIdle(); |
| 136 ASSERT_TRUE(temp_dir_.Delete()); | 136 ASSERT_TRUE(temp_dir_.Delete()); |
| 137 } | 137 } |
| 138 | 138 |
| 139 scoped_refptr<PasswordStoreDefault> | 139 scoped_refptr<PasswordStoreDefault> |
| 140 PasswordStoreDefaultTestDelegate::CreateInitializedStore( | 140 PasswordStoreDefaultTestDelegate::CreateInitializedStore( |
| 141 std::unique_ptr<LoginDatabase> database) { | 141 std::unique_ptr<LoginDatabase> database) { |
| 142 scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault( | 142 scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault( |
| 143 base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get(), | 143 base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get(), |
| 144 std::move(database))); | 144 std::move(database))); |
| 145 store->Init(syncer::SyncableService::StartSyncFlare()); | 145 store->Init(syncer::SyncableService::StartSyncFlare()); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 }; | 181 }; |
| 182 | 182 |
| 183 // Build the expected forms vector and add the forms to the store. | 183 // Build the expected forms vector and add the forms to the store. |
| 184 ScopedVector<PasswordForm> expected_forms; | 184 ScopedVector<PasswordForm> expected_forms; |
| 185 for (unsigned int i = 0; i < arraysize(form_data); ++i) { | 185 for (unsigned int i = 0; i < arraysize(form_data); ++i) { |
| 186 expected_forms.push_back( | 186 expected_forms.push_back( |
| 187 CreatePasswordFormFromDataForTesting(form_data[i])); | 187 CreatePasswordFormFromDataForTesting(form_data[i])); |
| 188 store->AddLogin(*expected_forms.back()); | 188 store->AddLogin(*expected_forms.back()); |
| 189 } | 189 } |
| 190 | 190 |
| 191 base::MessageLoop::current()->RunUntilIdle(); | 191 base::RunLoop().RunUntilIdle(); |
| 192 | 192 |
| 193 MockPasswordStoreConsumer consumer; | 193 MockPasswordStoreConsumer consumer; |
| 194 | 194 |
| 195 // We expect to get the same data back, even though it's not all ASCII. | 195 // We expect to get the same data back, even though it's not all ASCII. |
| 196 EXPECT_CALL(consumer, OnGetPasswordStoreResultsConstRef( | 196 EXPECT_CALL(consumer, OnGetPasswordStoreResultsConstRef( |
| 197 password_manager::UnorderedPasswordFormElementsAre( | 197 password_manager::UnorderedPasswordFormElementsAre( |
| 198 expected_forms.get()))); | 198 expected_forms.get()))); |
| 199 store->GetAutofillableLogins(&consumer); | 199 store->GetAutofillableLogins(&consumer); |
| 200 | 200 |
| 201 base::MessageLoop::current()->RunUntilIdle(); | 201 base::RunLoop().RunUntilIdle(); |
| 202 } | 202 } |
| 203 | 203 |
| 204 TEST(PasswordStoreDefaultTest, Notifications) { | 204 TEST(PasswordStoreDefaultTest, Notifications) { |
| 205 PasswordStoreDefaultTestDelegate delegate; | 205 PasswordStoreDefaultTestDelegate delegate; |
| 206 PasswordStoreDefault* store = delegate.store(); | 206 PasswordStoreDefault* store = delegate.store(); |
| 207 | 207 |
| 208 std::unique_ptr<PasswordForm> form = | 208 std::unique_ptr<PasswordForm> form = |
| 209 CreatePasswordFormFromDataForTesting(CreateTestPasswordFormData()); | 209 CreatePasswordFormFromDataForTesting(CreateTestPasswordFormData()); |
| 210 | 210 |
| 211 MockPasswordStoreObserver observer; | 211 MockPasswordStoreObserver observer; |
| 212 store->AddObserver(&observer); | 212 store->AddObserver(&observer); |
| 213 | 213 |
| 214 const PasswordStoreChange expected_add_changes[] = { | 214 const PasswordStoreChange expected_add_changes[] = { |
| 215 PasswordStoreChange(PasswordStoreChange::ADD, *form), | 215 PasswordStoreChange(PasswordStoreChange::ADD, *form), |
| 216 }; | 216 }; |
| 217 | 217 |
| 218 EXPECT_CALL(observer, | 218 EXPECT_CALL(observer, |
| 219 OnLoginsChanged(ElementsAreArray(expected_add_changes))); | 219 OnLoginsChanged(ElementsAreArray(expected_add_changes))); |
| 220 | 220 |
| 221 // Adding a login should trigger a notification. | 221 // Adding a login should trigger a notification. |
| 222 store->AddLogin(*form); | 222 store->AddLogin(*form); |
| 223 base::MessageLoop::current()->RunUntilIdle(); | 223 base::RunLoop().RunUntilIdle(); |
| 224 | 224 |
| 225 // Change the password. | 225 // Change the password. |
| 226 form->password_value = base::ASCIIToUTF16("a different password"); | 226 form->password_value = base::ASCIIToUTF16("a different password"); |
| 227 | 227 |
| 228 const PasswordStoreChange expected_update_changes[] = { | 228 const PasswordStoreChange expected_update_changes[] = { |
| 229 PasswordStoreChange(PasswordStoreChange::UPDATE, *form), | 229 PasswordStoreChange(PasswordStoreChange::UPDATE, *form), |
| 230 }; | 230 }; |
| 231 | 231 |
| 232 EXPECT_CALL(observer, | 232 EXPECT_CALL(observer, |
| 233 OnLoginsChanged(ElementsAreArray(expected_update_changes))); | 233 OnLoginsChanged(ElementsAreArray(expected_update_changes))); |
| 234 | 234 |
| 235 // Updating the login with the new password should trigger a notification. | 235 // Updating the login with the new password should trigger a notification. |
| 236 store->UpdateLogin(*form); | 236 store->UpdateLogin(*form); |
| 237 base::MessageLoop::current()->RunUntilIdle(); | 237 base::RunLoop().RunUntilIdle(); |
| 238 | 238 |
| 239 const PasswordStoreChange expected_delete_changes[] = { | 239 const PasswordStoreChange expected_delete_changes[] = { |
| 240 PasswordStoreChange(PasswordStoreChange::REMOVE, *form), | 240 PasswordStoreChange(PasswordStoreChange::REMOVE, *form), |
| 241 }; | 241 }; |
| 242 | 242 |
| 243 EXPECT_CALL(observer, | 243 EXPECT_CALL(observer, |
| 244 OnLoginsChanged(ElementsAreArray(expected_delete_changes))); | 244 OnLoginsChanged(ElementsAreArray(expected_delete_changes))); |
| 245 | 245 |
| 246 // Deleting the login should trigger a notification. | 246 // Deleting the login should trigger a notification. |
| 247 store->RemoveLogin(*form); | 247 store->RemoveLogin(*form); |
| 248 base::MessageLoop::current()->RunUntilIdle(); | 248 base::RunLoop().RunUntilIdle(); |
| 249 | 249 |
| 250 store->RemoveObserver(&observer); | 250 store->RemoveObserver(&observer); |
| 251 } | 251 } |
| 252 | 252 |
| 253 // Verify that operations on a PasswordStore with a bad database cause no | 253 // Verify that operations on a PasswordStore with a bad database cause no |
| 254 // explosions, but fail without side effect, return no data and trigger no | 254 // explosions, but fail without side effect, return no data and trigger no |
| 255 // notifications. | 255 // notifications. |
| 256 TEST(PasswordStoreDefaultTest, OperationsOnABadDatabaseSilentlyFail) { | 256 TEST(PasswordStoreDefaultTest, OperationsOnABadDatabaseSilentlyFail) { |
| 257 PasswordStoreDefaultTestDelegate delegate( | 257 PasswordStoreDefaultTestDelegate delegate( |
| 258 base::WrapUnique(new BadLoginDatabase)); | 258 base::WrapUnique(new BadLoginDatabase)); |
| 259 PasswordStoreDefault* bad_store = delegate.store(); | 259 PasswordStoreDefault* bad_store = delegate.store(); |
| 260 base::MessageLoop::current()->RunUntilIdle(); | 260 base::RunLoop().RunUntilIdle(); |
| 261 ASSERT_EQ(nullptr, bad_store->login_db()); | 261 ASSERT_EQ(nullptr, bad_store->login_db()); |
| 262 | 262 |
| 263 testing::StrictMock<MockPasswordStoreObserver> mock_observer; | 263 testing::StrictMock<MockPasswordStoreObserver> mock_observer; |
| 264 bad_store->AddObserver(&mock_observer); | 264 bad_store->AddObserver(&mock_observer); |
| 265 | 265 |
| 266 // Add a new autofillable login + a blacklisted login. | 266 // Add a new autofillable login + a blacklisted login. |
| 267 std::unique_ptr<PasswordForm> form = | 267 std::unique_ptr<PasswordForm> form = |
| 268 CreatePasswordFormFromDataForTesting(CreateTestPasswordFormData()); | 268 CreatePasswordFormFromDataForTesting(CreateTestPasswordFormData()); |
| 269 std::unique_ptr<PasswordForm> blacklisted_form(new PasswordForm(*form)); | 269 std::unique_ptr<PasswordForm> blacklisted_form(new PasswordForm(*form)); |
| 270 blacklisted_form->signon_realm = "http://foo.example.com"; | 270 blacklisted_form->signon_realm = "http://foo.example.com"; |
| 271 blacklisted_form->origin = GURL("http://foo.example.com/origin"); | 271 blacklisted_form->origin = GURL("http://foo.example.com/origin"); |
| 272 blacklisted_form->action = GURL("http://foo.example.com/action"); | 272 blacklisted_form->action = GURL("http://foo.example.com/action"); |
| 273 blacklisted_form->blacklisted_by_user = true; | 273 blacklisted_form->blacklisted_by_user = true; |
| 274 bad_store->AddLogin(*form); | 274 bad_store->AddLogin(*form); |
| 275 bad_store->AddLogin(*blacklisted_form); | 275 bad_store->AddLogin(*blacklisted_form); |
| 276 base::MessageLoop::current()->RunUntilIdle(); | 276 base::RunLoop().RunUntilIdle(); |
| 277 | 277 |
| 278 // Get all logins; autofillable logins; blacklisted logins. | 278 // Get all logins; autofillable logins; blacklisted logins. |
| 279 testing::StrictMock<MockPasswordStoreConsumer> mock_consumer; | 279 testing::StrictMock<MockPasswordStoreConsumer> mock_consumer; |
| 280 EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(IsEmpty())); | 280 EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(IsEmpty())); |
| 281 bad_store->GetLogins(*form, &mock_consumer); | 281 bad_store->GetLogins(*form, &mock_consumer); |
| 282 base::MessageLoop::current()->RunUntilIdle(); | 282 base::RunLoop().RunUntilIdle(); |
| 283 testing::Mock::VerifyAndClearExpectations(&mock_consumer); | 283 testing::Mock::VerifyAndClearExpectations(&mock_consumer); |
| 284 EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(IsEmpty())); | 284 EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(IsEmpty())); |
| 285 bad_store->GetAutofillableLogins(&mock_consumer); | 285 bad_store->GetAutofillableLogins(&mock_consumer); |
| 286 base::MessageLoop::current()->RunUntilIdle(); | 286 base::RunLoop().RunUntilIdle(); |
| 287 testing::Mock::VerifyAndClearExpectations(&mock_consumer); | 287 testing::Mock::VerifyAndClearExpectations(&mock_consumer); |
| 288 EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(IsEmpty())); | 288 EXPECT_CALL(mock_consumer, OnGetPasswordStoreResultsConstRef(IsEmpty())); |
| 289 bad_store->GetBlacklistLogins(&mock_consumer); | 289 bad_store->GetBlacklistLogins(&mock_consumer); |
| 290 base::MessageLoop::current()->RunUntilIdle(); | 290 base::RunLoop().RunUntilIdle(); |
| 291 | 291 |
| 292 // Report metrics. | 292 // Report metrics. |
| 293 bad_store->ReportMetrics("Test Username", true); | 293 bad_store->ReportMetrics("Test Username", true); |
| 294 base::MessageLoop::current()->RunUntilIdle(); | 294 base::RunLoop().RunUntilIdle(); |
| 295 | 295 |
| 296 // Change the login. | 296 // Change the login. |
| 297 form->password_value = base::ASCIIToUTF16("a different password"); | 297 form->password_value = base::ASCIIToUTF16("a different password"); |
| 298 bad_store->UpdateLogin(*form); | 298 bad_store->UpdateLogin(*form); |
| 299 base::MessageLoop::current()->RunUntilIdle(); | 299 base::RunLoop().RunUntilIdle(); |
| 300 | 300 |
| 301 // Delete one login; a range of logins. | 301 // Delete one login; a range of logins. |
| 302 bad_store->RemoveLogin(*form); | 302 bad_store->RemoveLogin(*form); |
| 303 base::MessageLoop::current()->RunUntilIdle(); | 303 base::RunLoop().RunUntilIdle(); |
| 304 base::RunLoop run_loop; | 304 base::RunLoop run_loop; |
| 305 bad_store->RemoveLoginsCreatedBetween(base::Time(), base::Time::Max(), | 305 bad_store->RemoveLoginsCreatedBetween(base::Time(), base::Time::Max(), |
| 306 run_loop.QuitClosure()); | 306 run_loop.QuitClosure()); |
| 307 run_loop.Run(); | 307 run_loop.Run(); |
| 308 | 308 |
| 309 bad_store->RemoveLoginsSyncedBetween(base::Time(), base::Time::Max()); | 309 bad_store->RemoveLoginsSyncedBetween(base::Time(), base::Time::Max()); |
| 310 base::MessageLoop::current()->RunUntilIdle(); | 310 base::RunLoop().RunUntilIdle(); |
| 311 | 311 |
| 312 // Ensure no notifications and no explosions during shutdown either. | 312 // Ensure no notifications and no explosions during shutdown either. |
| 313 bad_store->RemoveObserver(&mock_observer); | 313 bad_store->RemoveObserver(&mock_observer); |
| 314 } | 314 } |
| 315 | 315 |
| 316 } // namespace password_manager | 316 } // namespace password_manager |
| OLD | NEW |