Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: components/password_manager/core/browser/password_store_unittest.cc

Issue 2053913002: Remove MessageLoop::current()->RunUntilIdle() in components. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 // The passwords in the tests below are all empty because PasswordStoreDefault 5 // The passwords in the tests below are all empty because PasswordStoreDefault
6 // does not store the actual passwords on OS X (they are stored in the Keychain 6 // does not store the actual passwords on OS X (they are stored in the Keychain
7 // instead). We could special-case it, but it is easier to just have empty 7 // instead). We could special-case it, but it is easier to just have empty
8 // passwords. This will not be needed anymore if crbug.com/466638 is fixed. 8 // passwords. This will not be needed anymore if crbug.com/466638 is fixed.
9 9
10 #include <stddef.h> 10 #include <stddef.h>
11 11
12 #include <utility> 12 #include <utility>
13 13
14 #include "base/bind.h" 14 #include "base/bind.h"
15 #include "base/files/scoped_temp_dir.h" 15 #include "base/files/scoped_temp_dir.h"
16 #include "base/macros.h" 16 #include "base/macros.h"
17 #include "base/memory/ptr_util.h" 17 #include "base/memory/ptr_util.h"
18 #include "base/run_loop.h"
18 #include "base/stl_util.h" 19 #include "base/stl_util.h"
19 #include "base/strings/string_util.h" 20 #include "base/strings/string_util.h"
20 #include "base/strings/utf_string_conversions.h" 21 #include "base/strings/utf_string_conversions.h"
21 #include "base/synchronization/waitable_event.h" 22 #include "base/synchronization/waitable_event.h"
22 #include "base/threading/thread_task_runner_handle.h" 23 #include "base/threading/thread_task_runner_handle.h"
23 #include "base/time/time.h" 24 #include "base/time/time.h"
24 #include "build/build_config.h" 25 #include "build/build_config.h"
25 #include "components/password_manager/core/browser/affiliated_match_helper.h" 26 #include "components/password_manager/core/browser/affiliated_match_helper.h"
26 #include "components/password_manager/core/browser/affiliation_service.h" 27 #include "components/password_manager/core/browser/affiliation_service.h"
27 #include "components/password_manager/core/browser/mock_affiliated_match_helper. h" 28 #include "components/password_manager/core/browser/mock_affiliated_match_helper. h"
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 L"", 169 L"",
169 true, false, cutoff - 1 }, 170 true, false, cutoff - 1 },
170 }; 171 };
171 172
172 // Build the forms vector and add the forms to the store. 173 // Build the forms vector and add the forms to the store.
173 ScopedVector<PasswordForm> all_forms; 174 ScopedVector<PasswordForm> all_forms;
174 for (size_t i = 0; i < arraysize(form_data); ++i) { 175 for (size_t i = 0; i < arraysize(form_data); ++i) {
175 all_forms.push_back(CreatePasswordFormFromDataForTesting(form_data[i])); 176 all_forms.push_back(CreatePasswordFormFromDataForTesting(form_data[i]));
176 store->AddLogin(*all_forms.back()); 177 store->AddLogin(*all_forms.back());
177 } 178 }
178 base::MessageLoop::current()->RunUntilIdle(); 179 base::RunLoop().RunUntilIdle();
179 180
180 // We expect to get back only the "recent" www.google.com login. 181 // We expect to get back only the "recent" www.google.com login.
181 // Theoretically these should never actually exist since there are no longer 182 // Theoretically these should never actually exist since there are no longer
182 // any login forms on www.google.com to save, but we technically allow them. 183 // any login forms on www.google.com to save, but we technically allow them.
183 // We should not get back the older saved password though. 184 // We should not get back the older saved password though.
184 PasswordForm www_google; 185 PasswordForm www_google;
185 www_google.scheme = PasswordForm::SCHEME_HTML; 186 www_google.scheme = PasswordForm::SCHEME_HTML;
186 www_google.signon_realm = "https://www.google.com"; 187 www_google.signon_realm = "https://www.google.com";
187 std::vector<PasswordForm*> www_google_expected; 188 std::vector<PasswordForm*> www_google_expected;
188 www_google_expected.push_back(all_forms[2]); 189 www_google_expected.push_back(all_forms[2]);
(...skipping 25 matching lines...) Expand all
214 .RetiresOnSaturation(); 215 .RetiresOnSaturation();
215 EXPECT_CALL(consumer, 216 EXPECT_CALL(consumer,
216 OnGetPasswordStoreResultsConstRef( 217 OnGetPasswordStoreResultsConstRef(
217 UnorderedPasswordFormElementsAre(bar_example_expected))) 218 UnorderedPasswordFormElementsAre(bar_example_expected)))
218 .RetiresOnSaturation(); 219 .RetiresOnSaturation();
219 220
220 store->GetLogins(www_google, &consumer); 221 store->GetLogins(www_google, &consumer);
221 store->GetLogins(accounts_google, &consumer); 222 store->GetLogins(accounts_google, &consumer);
222 store->GetLogins(bar_example, &consumer); 223 store->GetLogins(bar_example, &consumer);
223 224
224 base::MessageLoop::current()->RunUntilIdle(); 225 base::RunLoop().RunUntilIdle();
225 226
226 store->ShutdownOnUIThread(); 227 store->ShutdownOnUIThread();
227 base::MessageLoop::current()->RunUntilIdle(); 228 base::RunLoop().RunUntilIdle();
228 } 229 }
229 230
230 TEST_F(PasswordStoreTest, StartSyncFlare) { 231 TEST_F(PasswordStoreTest, StartSyncFlare) {
231 scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault( 232 scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault(
232 base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get(), 233 base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get(),
233 base::WrapUnique(new LoginDatabase(test_login_db_file_path())))); 234 base::WrapUnique(new LoginDatabase(test_login_db_file_path()))));
234 StartSyncFlareMock mock; 235 StartSyncFlareMock mock;
235 store->Init( 236 store->Init(
236 base::Bind(&StartSyncFlareMock::StartSyncFlare, base::Unretained(&mock))); 237 base::Bind(&StartSyncFlareMock::StartSyncFlare, base::Unretained(&mock)));
237 { 238 {
238 PasswordForm form; 239 PasswordForm form;
239 form.origin = GURL("http://accounts.google.com/LoginAuth"); 240 form.origin = GURL("http://accounts.google.com/LoginAuth");
240 form.signon_realm = "http://accounts.google.com/"; 241 form.signon_realm = "http://accounts.google.com/";
241 EXPECT_CALL(mock, StartSyncFlare(syncer::PASSWORDS)); 242 EXPECT_CALL(mock, StartSyncFlare(syncer::PASSWORDS));
242 store->AddLogin(form); 243 store->AddLogin(form);
243 base::MessageLoop::current()->RunUntilIdle(); 244 base::RunLoop().RunUntilIdle();
244 } 245 }
245 store->ShutdownOnUIThread(); 246 store->ShutdownOnUIThread();
246 base::MessageLoop::current()->RunUntilIdle(); 247 base::RunLoop().RunUntilIdle();
247 } 248 }
248 249
249 TEST_F(PasswordStoreTest, GetLoginImpl) { 250 TEST_F(PasswordStoreTest, GetLoginImpl) {
250 /* clang-format off */ 251 /* clang-format off */
251 static const PasswordFormData kTestCredential = { 252 static const PasswordFormData kTestCredential = {
252 PasswordForm::SCHEME_HTML, 253 PasswordForm::SCHEME_HTML,
253 kTestWebRealm1, 254 kTestWebRealm1,
254 kTestWebOrigin1, 255 kTestWebOrigin1,
255 "", L"", L"username_element", L"password_element", 256 "", L"", L"username_element", L"password_element",
256 L"username_value", 257 L"username_value",
(...skipping 24 matching lines...) Expand all
281 std::unique_ptr<PasswordForm> mismatching_form_5( 282 std::unique_ptr<PasswordForm> mismatching_form_5(
282 new PasswordForm(*test_form)); 283 new PasswordForm(*test_form));
283 mismatching_form_5->username_value = 284 mismatching_form_5->username_value =
284 base::ASCIIToUTF16("other_username_value"); 285 base::ASCIIToUTF16("other_username_value");
285 286
286 store->AddLogin(*mismatching_form_1); 287 store->AddLogin(*mismatching_form_1);
287 store->AddLogin(*mismatching_form_2); 288 store->AddLogin(*mismatching_form_2);
288 store->AddLogin(*mismatching_form_3); 289 store->AddLogin(*mismatching_form_3);
289 store->AddLogin(*mismatching_form_4); 290 store->AddLogin(*mismatching_form_4);
290 store->AddLogin(*mismatching_form_5); 291 store->AddLogin(*mismatching_form_5);
291 base::MessageLoop::current()->RunUntilIdle(); 292 base::RunLoop().RunUntilIdle();
292 EXPECT_FALSE(store->GetLoginImpl(*test_form)); 293 EXPECT_FALSE(store->GetLoginImpl(*test_form));
293 294
294 store->AddLogin(*test_form); 295 store->AddLogin(*test_form);
295 base::MessageLoop::current()->RunUntilIdle(); 296 base::RunLoop().RunUntilIdle();
296 std::unique_ptr<PasswordForm> returned_form = store->GetLoginImpl(*test_form); 297 std::unique_ptr<PasswordForm> returned_form = store->GetLoginImpl(*test_form);
297 ASSERT_TRUE(returned_form); 298 ASSERT_TRUE(returned_form);
298 EXPECT_EQ(*test_form, *returned_form); 299 EXPECT_EQ(*test_form, *returned_form);
299 300
300 store->ShutdownOnUIThread(); 301 store->ShutdownOnUIThread();
301 base::MessageLoop::current()->RunUntilIdle(); 302 base::RunLoop().RunUntilIdle();
302 } 303 }
303 304
304 TEST_F(PasswordStoreTest, UpdateLoginPrimaryKeyFields) { 305 TEST_F(PasswordStoreTest, UpdateLoginPrimaryKeyFields) {
305 /* clang-format off */ 306 /* clang-format off */
306 static const PasswordFormData kTestCredentials[] = { 307 static const PasswordFormData kTestCredentials[] = {
307 // The old credential. 308 // The old credential.
308 {PasswordForm::SCHEME_HTML, 309 {PasswordForm::SCHEME_HTML,
309 kTestWebRealm1, 310 kTestWebRealm1,
310 kTestWebOrigin1, 311 kTestWebOrigin1,
311 "", L"", L"username_element_1", L"password_element_1", 312 "", L"", L"username_element_1", L"password_element_1",
312 L"username_value_1", 313 L"username_value_1",
313 L"", true, true, 1}, 314 L"", true, true, 1},
314 // The new credential with different values for all primary key fields. 315 // The new credential with different values for all primary key fields.
315 {PasswordForm::SCHEME_HTML, 316 {PasswordForm::SCHEME_HTML,
316 kTestWebRealm2, 317 kTestWebRealm2,
317 kTestWebOrigin2, 318 kTestWebOrigin2,
318 "", L"", L"username_element_2", L"password_element_2", 319 "", L"", L"username_element_2", L"password_element_2",
319 L"username_value_2", 320 L"username_value_2",
320 L"", true, true, 1}}; 321 L"", true, true, 1}};
321 /* clang-format on */ 322 /* clang-format on */
322 323
323 scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault( 324 scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault(
324 base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get(), 325 base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get(),
325 base::WrapUnique(new LoginDatabase(test_login_db_file_path())))); 326 base::WrapUnique(new LoginDatabase(test_login_db_file_path()))));
326 store->Init(syncer::SyncableService::StartSyncFlare()); 327 store->Init(syncer::SyncableService::StartSyncFlare());
327 328
328 std::unique_ptr<PasswordForm> old_form( 329 std::unique_ptr<PasswordForm> old_form(
329 CreatePasswordFormFromDataForTesting(kTestCredentials[0])); 330 CreatePasswordFormFromDataForTesting(kTestCredentials[0]));
330 store->AddLogin(*old_form); 331 store->AddLogin(*old_form);
331 base::MessageLoop::current()->RunUntilIdle(); 332 base::RunLoop().RunUntilIdle();
332 333
333 MockPasswordStoreObserver mock_observer; 334 MockPasswordStoreObserver mock_observer;
334 store->AddObserver(&mock_observer); 335 store->AddObserver(&mock_observer);
335 336
336 std::unique_ptr<PasswordForm> new_form( 337 std::unique_ptr<PasswordForm> new_form(
337 CreatePasswordFormFromDataForTesting(kTestCredentials[1])); 338 CreatePasswordFormFromDataForTesting(kTestCredentials[1]));
338 EXPECT_CALL(mock_observer, OnLoginsChanged(testing::SizeIs(2u))); 339 EXPECT_CALL(mock_observer, OnLoginsChanged(testing::SizeIs(2u)));
339 PasswordForm old_primary_key; 340 PasswordForm old_primary_key;
340 old_primary_key.signon_realm = old_form->signon_realm; 341 old_primary_key.signon_realm = old_form->signon_realm;
341 old_primary_key.origin = old_form->origin; 342 old_primary_key.origin = old_form->origin;
342 old_primary_key.username_element = old_form->username_element; 343 old_primary_key.username_element = old_form->username_element;
343 old_primary_key.username_value = old_form->username_value; 344 old_primary_key.username_value = old_form->username_value;
344 old_primary_key.password_element = old_form->password_element; 345 old_primary_key.password_element = old_form->password_element;
345 store->UpdateLoginWithPrimaryKey(*new_form, old_primary_key); 346 store->UpdateLoginWithPrimaryKey(*new_form, old_primary_key);
346 base::MessageLoop::current()->RunUntilIdle(); 347 base::RunLoop().RunUntilIdle();
347 348
348 MockPasswordStoreConsumer mock_consumer; 349 MockPasswordStoreConsumer mock_consumer;
349 ScopedVector<autofill::PasswordForm> expected_forms; 350 ScopedVector<autofill::PasswordForm> expected_forms;
350 expected_forms.push_back(std::move(new_form)); 351 expected_forms.push_back(std::move(new_form));
351 EXPECT_CALL(mock_consumer, 352 EXPECT_CALL(mock_consumer,
352 OnGetPasswordStoreResultsConstRef( 353 OnGetPasswordStoreResultsConstRef(
353 UnorderedPasswordFormElementsAre(expected_forms.get()))); 354 UnorderedPasswordFormElementsAre(expected_forms.get())));
354 store->GetAutofillableLogins(&mock_consumer); 355 store->GetAutofillableLogins(&mock_consumer);
355 base::MessageLoop::current()->RunUntilIdle(); 356 base::RunLoop().RunUntilIdle();
356 357
357 store->RemoveObserver(&mock_observer); 358 store->RemoveObserver(&mock_observer);
358 store->ShutdownOnUIThread(); 359 store->ShutdownOnUIThread();
359 base::MessageLoop::current()->RunUntilIdle(); 360 base::RunLoop().RunUntilIdle();
360 } 361 }
361 362
362 // Verify that RemoveLoginsCreatedBetween() fires the completion callback after 363 // Verify that RemoveLoginsCreatedBetween() fires the completion callback after
363 // deletions have been performed and notifications have been sent out. Whether 364 // deletions have been performed and notifications have been sent out. Whether
364 // the correct logins are removed or not is verified in detail in other tests. 365 // the correct logins are removed or not is verified in detail in other tests.
365 TEST_F(PasswordStoreTest, RemoveLoginsCreatedBetweenCallbackIsCalled) { 366 TEST_F(PasswordStoreTest, RemoveLoginsCreatedBetweenCallbackIsCalled) {
366 /* clang-format off */ 367 /* clang-format off */
367 static const PasswordFormData kTestCredential = 368 static const PasswordFormData kTestCredential =
368 {PasswordForm::SCHEME_HTML, 369 {PasswordForm::SCHEME_HTML,
369 kTestWebRealm1, 370 kTestWebRealm1,
370 kTestWebOrigin1, 371 kTestWebOrigin1,
371 "", L"", L"username_element_1", L"password_element_1", 372 "", L"", L"username_element_1", L"password_element_1",
372 L"username_value_1", 373 L"username_value_1",
373 L"", true, true, 1}; 374 L"", true, true, 1};
374 /* clang-format on */ 375 /* clang-format on */
375 376
376 scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault( 377 scoped_refptr<PasswordStoreDefault> store(new PasswordStoreDefault(
377 base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get(), 378 base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get(),
378 base::WrapUnique(new LoginDatabase(test_login_db_file_path())))); 379 base::WrapUnique(new LoginDatabase(test_login_db_file_path()))));
379 store->Init(syncer::SyncableService::StartSyncFlare()); 380 store->Init(syncer::SyncableService::StartSyncFlare());
380 381
381 std::unique_ptr<PasswordForm> test_form( 382 std::unique_ptr<PasswordForm> test_form(
382 CreatePasswordFormFromDataForTesting(kTestCredential)); 383 CreatePasswordFormFromDataForTesting(kTestCredential));
383 store->AddLogin(*test_form); 384 store->AddLogin(*test_form);
384 base::MessageLoop::current()->RunUntilIdle(); 385 base::RunLoop().RunUntilIdle();
385 386
386 MockPasswordStoreObserver mock_observer; 387 MockPasswordStoreObserver mock_observer;
387 store->AddObserver(&mock_observer); 388 store->AddObserver(&mock_observer);
388 389
389 EXPECT_CALL(mock_observer, OnLoginsChanged(testing::SizeIs(1u))); 390 EXPECT_CALL(mock_observer, OnLoginsChanged(testing::SizeIs(1u)));
390 store->RemoveLoginsCreatedBetween( 391 store->RemoveLoginsCreatedBetween(
391 base::Time::FromDoubleT(0), base::Time::FromDoubleT(2), 392 base::Time::FromDoubleT(0), base::Time::FromDoubleT(2),
392 base::MessageLoop::current()->QuitWhenIdleClosure()); 393 base::MessageLoop::current()->QuitWhenIdleClosure());
393 base::MessageLoop::current()->Run(); 394 base::MessageLoop::current()->Run();
394 testing::Mock::VerifyAndClearExpectations(&mock_observer); 395 testing::Mock::VerifyAndClearExpectations(&mock_observer);
395 396
396 store->RemoveObserver(&mock_observer); 397 store->RemoveObserver(&mock_observer);
397 store->ShutdownOnUIThread(); 398 store->ShutdownOnUIThread();
398 base::MessageLoop::current()->RunUntilIdle(); 399 base::RunLoop().RunUntilIdle();
399 } 400 }
400 401
401 // When no Android applications are actually affiliated with the realm of the 402 // When no Android applications are actually affiliated with the realm of the
402 // observed form, GetLoginsWithAffiliations() should still return the exact and 403 // observed form, GetLoginsWithAffiliations() should still return the exact and
403 // PSL matching results, but not any stored Android credentials. 404 // PSL matching results, but not any stored Android credentials.
404 TEST_F(PasswordStoreTest, GetLoginsWithoutAffiliations) { 405 TEST_F(PasswordStoreTest, GetLoginsWithoutAffiliations) {
405 /* clang-format off */ 406 /* clang-format off */
406 static const PasswordFormData kTestCredentials[] = { 407 static const PasswordFormData kTestCredentials[] = {
407 // Credential that is an exact match of the observed form. 408 // Credential that is an exact match of the observed form.
408 {PasswordForm::SCHEME_HTML, 409 {PasswordForm::SCHEME_HTML,
(...skipping 23 matching lines...) Expand all
432 store->Init(syncer::SyncableService::StartSyncFlare()); 433 store->Init(syncer::SyncableService::StartSyncFlare());
433 434
434 MockAffiliatedMatchHelper* mock_helper = new MockAffiliatedMatchHelper; 435 MockAffiliatedMatchHelper* mock_helper = new MockAffiliatedMatchHelper;
435 store->SetAffiliatedMatchHelper(base::WrapUnique(mock_helper)); 436 store->SetAffiliatedMatchHelper(base::WrapUnique(mock_helper));
436 437
437 ScopedVector<PasswordForm> all_credentials; 438 ScopedVector<PasswordForm> all_credentials;
438 for (size_t i = 0; i < arraysize(kTestCredentials); ++i) { 439 for (size_t i = 0; i < arraysize(kTestCredentials); ++i) {
439 all_credentials.push_back( 440 all_credentials.push_back(
440 CreatePasswordFormFromDataForTesting(kTestCredentials[i])); 441 CreatePasswordFormFromDataForTesting(kTestCredentials[i]));
441 store->AddLogin(*all_credentials.back()); 442 store->AddLogin(*all_credentials.back());
442 base::MessageLoop::current()->RunUntilIdle(); 443 base::RunLoop().RunUntilIdle();
443 } 444 }
444 445
445 PasswordForm observed_form; 446 PasswordForm observed_form;
446 observed_form.scheme = PasswordForm::SCHEME_HTML; 447 observed_form.scheme = PasswordForm::SCHEME_HTML;
447 observed_form.origin = GURL(kTestWebOrigin1); 448 observed_form.origin = GURL(kTestWebOrigin1);
448 observed_form.ssl_valid = true; 449 observed_form.ssl_valid = true;
449 observed_form.signon_realm = kTestWebRealm1; 450 observed_form.signon_realm = kTestWebRealm1;
450 451
451 MockPasswordStoreConsumer mock_consumer; 452 MockPasswordStoreConsumer mock_consumer;
452 ScopedVector<PasswordForm> expected_results; 453 ScopedVector<PasswordForm> expected_results;
453 expected_results.push_back(new PasswordForm(*all_credentials[0])); 454 expected_results.push_back(new PasswordForm(*all_credentials[0]));
454 expected_results.push_back(new PasswordForm(*all_credentials[1])); 455 expected_results.push_back(new PasswordForm(*all_credentials[1]));
455 for (PasswordForm* result : expected_results) { 456 for (PasswordForm* result : expected_results) {
456 if (result->signon_realm != observed_form.signon_realm) 457 if (result->signon_realm != observed_form.signon_realm)
457 result->is_public_suffix_match = true; 458 result->is_public_suffix_match = true;
458 } 459 }
459 460
460 std::vector<std::string> no_affiliated_android_realms; 461 std::vector<std::string> no_affiliated_android_realms;
461 mock_helper->ExpectCallToGetAffiliatedAndroidRealms( 462 mock_helper->ExpectCallToGetAffiliatedAndroidRealms(
462 observed_form, no_affiliated_android_realms); 463 observed_form, no_affiliated_android_realms);
463 464
464 EXPECT_CALL(mock_consumer, 465 EXPECT_CALL(mock_consumer,
465 OnGetPasswordStoreResultsConstRef( 466 OnGetPasswordStoreResultsConstRef(
466 UnorderedPasswordFormElementsAre(expected_results.get()))); 467 UnorderedPasswordFormElementsAre(expected_results.get())));
467 store->GetLogins(observed_form, &mock_consumer); 468 store->GetLogins(observed_form, &mock_consumer);
468 store->ShutdownOnUIThread(); 469 store->ShutdownOnUIThread();
469 base::MessageLoop::current()->RunUntilIdle(); 470 base::RunLoop().RunUntilIdle();
470 } 471 }
471 472
472 // There are 3 Android applications affiliated with the realm of the observed 473 // There are 3 Android applications affiliated with the realm of the observed
473 // form, with the PasswordStore having credentials for two of these (even two 474 // form, with the PasswordStore having credentials for two of these (even two
474 // credentials for one). GetLoginsWithAffiliations() should return the exact, 475 // credentials for one). GetLoginsWithAffiliations() should return the exact,
475 // and PSL matching credentials, and the credentials for these two Android 476 // and PSL matching credentials, and the credentials for these two Android
476 // applications, but not for the unaffiliated Android application. 477 // applications, but not for the unaffiliated Android application.
477 TEST_F(PasswordStoreTest, GetLoginsWithAffiliations) { 478 TEST_F(PasswordStoreTest, GetLoginsWithAffiliations) {
478 /* clang-format off */ 479 /* clang-format off */
479 static const PasswordFormData kTestCredentials[] = { 480 static const PasswordFormData kTestCredentials[] = {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 store->Init(syncer::SyncableService::StartSyncFlare()); 540 store->Init(syncer::SyncableService::StartSyncFlare());
540 541
541 MockAffiliatedMatchHelper* mock_helper = new MockAffiliatedMatchHelper; 542 MockAffiliatedMatchHelper* mock_helper = new MockAffiliatedMatchHelper;
542 store->SetAffiliatedMatchHelper(base::WrapUnique(mock_helper)); 543 store->SetAffiliatedMatchHelper(base::WrapUnique(mock_helper));
543 544
544 ScopedVector<PasswordForm> all_credentials; 545 ScopedVector<PasswordForm> all_credentials;
545 for (size_t i = 0; i < arraysize(kTestCredentials); ++i) { 546 for (size_t i = 0; i < arraysize(kTestCredentials); ++i) {
546 all_credentials.push_back( 547 all_credentials.push_back(
547 CreatePasswordFormFromDataForTesting(kTestCredentials[i])); 548 CreatePasswordFormFromDataForTesting(kTestCredentials[i]));
548 store->AddLogin(*all_credentials.back()); 549 store->AddLogin(*all_credentials.back());
549 base::MessageLoop::current()->RunUntilIdle(); 550 base::RunLoop().RunUntilIdle();
550 } 551 }
551 552
552 PasswordForm observed_form; 553 PasswordForm observed_form;
553 observed_form.scheme = PasswordForm::SCHEME_HTML; 554 observed_form.scheme = PasswordForm::SCHEME_HTML;
554 observed_form.origin = GURL(kTestWebOrigin1); 555 observed_form.origin = GURL(kTestWebOrigin1);
555 observed_form.ssl_valid = true; 556 observed_form.ssl_valid = true;
556 observed_form.signon_realm = kTestWebRealm1; 557 observed_form.signon_realm = kTestWebRealm1;
557 558
558 MockPasswordStoreConsumer mock_consumer; 559 MockPasswordStoreConsumer mock_consumer;
559 ScopedVector<PasswordForm> expected_results; 560 ScopedVector<PasswordForm> expected_results;
(...skipping 17 matching lines...) Expand all
577 affiliated_android_realms.push_back(kTestAndroidRealm3); 578 affiliated_android_realms.push_back(kTestAndroidRealm3);
578 mock_helper->ExpectCallToGetAffiliatedAndroidRealms( 579 mock_helper->ExpectCallToGetAffiliatedAndroidRealms(
579 observed_form, affiliated_android_realms); 580 observed_form, affiliated_android_realms);
580 581
581 EXPECT_CALL(mock_consumer, 582 EXPECT_CALL(mock_consumer,
582 OnGetPasswordStoreResultsConstRef( 583 OnGetPasswordStoreResultsConstRef(
583 UnorderedPasswordFormElementsAre(expected_results.get()))); 584 UnorderedPasswordFormElementsAre(expected_results.get())));
584 585
585 store->GetLogins(observed_form, &mock_consumer); 586 store->GetLogins(observed_form, &mock_consumer);
586 store->ShutdownOnUIThread(); 587 store->ShutdownOnUIThread();
587 base::MessageLoop::current()->RunUntilIdle(); 588 base::RunLoop().RunUntilIdle();
588 } 589 }
589 590
590 // This test must use passwords, which are not stored on Mac, therefore the test 591 // This test must use passwords, which are not stored on Mac, therefore the test
591 // is disabled on Mac. This should not be a huge issue as functionality in the 592 // is disabled on Mac. This should not be a huge issue as functionality in the
592 // platform-independent base class is tested. See also the file-level comment. 593 // platform-independent base class is tested. See also the file-level comment.
593 #if defined(OS_MACOSX) 594 #if defined(OS_MACOSX)
594 #define MAYBE_UpdatePasswordsStoredForAffiliatedWebsites \ 595 #define MAYBE_UpdatePasswordsStoredForAffiliatedWebsites \
595 DISABLED_UpdatePasswordsStoredForAffiliatedWebsites 596 DISABLED_UpdatePasswordsStoredForAffiliatedWebsites
596 #else 597 #else
597 #define MAYBE_UpdatePasswordsStoredForAffiliatedWebsites \ 598 #define MAYBE_UpdatePasswordsStoredForAffiliatedWebsites \
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 base::Closure()); 730 base::Closure());
730 731
731 // Set up the initial test data set. 732 // Set up the initial test data set.
732 ScopedVector<PasswordForm> all_credentials; 733 ScopedVector<PasswordForm> all_credentials;
733 for (size_t i = 0; i < arraysize(kTestCredentials); ++i) { 734 for (size_t i = 0; i < arraysize(kTestCredentials); ++i) {
734 all_credentials.push_back( 735 all_credentials.push_back(
735 CreatePasswordFormFromDataForTesting(kTestCredentials[i])); 736 CreatePasswordFormFromDataForTesting(kTestCredentials[i]));
736 all_credentials.back()->date_synced = 737 all_credentials.back()->date_synced =
737 all_credentials.back()->date_created; 738 all_credentials.back()->date_created;
738 store->AddLogin(*all_credentials.back()); 739 store->AddLogin(*all_credentials.back());
739 base::MessageLoop::current()->RunUntilIdle(); 740 base::RunLoop().RunUntilIdle();
740 } 741 }
741 742
742 // The helper must be injected after the initial test data is set up, 743 // The helper must be injected after the initial test data is set up,
743 // otherwise it will already start propagating updates as new Android 744 // otherwise it will already start propagating updates as new Android
744 // credentials are added. 745 // credentials are added.
745 MockAffiliatedMatchHelper* mock_helper = new MockAffiliatedMatchHelper; 746 MockAffiliatedMatchHelper* mock_helper = new MockAffiliatedMatchHelper;
746 store->SetAffiliatedMatchHelper(base::WrapUnique(mock_helper)); 747 store->SetAffiliatedMatchHelper(base::WrapUnique(mock_helper));
747 store->enable_propagating_password_changes_to_web_credentials( 748 store->enable_propagating_password_changes_to_web_credentials(
748 propagation_enabled); 749 propagation_enabled);
749 750
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
784 if (propagation_enabled) { 785 if (propagation_enabled) {
785 EXPECT_CALL(mock_observer, OnLoginsChanged(testing::SizeIs( 786 EXPECT_CALL(mock_observer, OnLoginsChanged(testing::SizeIs(
786 expected_number_of_propageted_updates))); 787 expected_number_of_propageted_updates)));
787 } 788 }
788 if (test_remove_and_add_login) { 789 if (test_remove_and_add_login) {
789 store->RemoveLoginSync(*all_credentials[0]); 790 store->RemoveLoginSync(*all_credentials[0]);
790 store->AddLoginSync(*expected_credentials_after_update[0]); 791 store->AddLoginSync(*expected_credentials_after_update[0]);
791 } else { 792 } else {
792 store->UpdateLoginSync(*expected_credentials_after_update[0]); 793 store->UpdateLoginSync(*expected_credentials_after_update[0]);
793 } 794 }
794 base::MessageLoop::current()->RunUntilIdle(); 795 base::RunLoop().RunUntilIdle();
795 store->RemoveObserver(&mock_observer); 796 store->RemoveObserver(&mock_observer);
796 797
797 MockPasswordStoreConsumer mock_consumer; 798 MockPasswordStoreConsumer mock_consumer;
798 EXPECT_CALL( 799 EXPECT_CALL(
799 mock_consumer, 800 mock_consumer,
800 OnGetPasswordStoreResultsConstRef(UnorderedPasswordFormElementsAre( 801 OnGetPasswordStoreResultsConstRef(UnorderedPasswordFormElementsAre(
801 expected_credentials_after_update.get()))); 802 expected_credentials_after_update.get())));
802 store->GetAutofillableLogins(&mock_consumer); 803 store->GetAutofillableLogins(&mock_consumer);
803 store->ShutdownOnUIThread(); 804 store->ShutdownOnUIThread();
804 base::MessageLoop::current()->RunUntilIdle(); 805 base::RunLoop().RunUntilIdle();
805 } 806 }
806 } 807 }
807 } 808 }
808 809
809 TEST_F(PasswordStoreTest, GetLoginsWithAffiliatedRealms) { 810 TEST_F(PasswordStoreTest, GetLoginsWithAffiliatedRealms) {
810 /* clang-format off */ 811 /* clang-format off */
811 static const PasswordFormData kTestCredentials[] = { 812 static const PasswordFormData kTestCredentials[] = {
812 {PasswordForm::SCHEME_HTML, 813 {PasswordForm::SCHEME_HTML,
813 kTestAndroidRealm1, 814 kTestAndroidRealm1,
814 "", "", L"", L"", L"", 815 "", "", L"", L"", L"",
(...skipping 22 matching lines...) Expand all
837 store->RemoveLoginsCreatedBetween(base::Time(), base::Time::Max(), 838 store->RemoveLoginsCreatedBetween(base::Time(), base::Time::Max(),
838 base::Closure()); 839 base::Closure());
839 840
840 ScopedVector<PasswordForm> all_credentials; 841 ScopedVector<PasswordForm> all_credentials;
841 for (size_t i = 0; i < arraysize(kTestCredentials); ++i) { 842 for (size_t i = 0; i < arraysize(kTestCredentials); ++i) {
842 all_credentials.push_back( 843 all_credentials.push_back(
843 CreatePasswordFormFromDataForTesting(kTestCredentials[i])); 844 CreatePasswordFormFromDataForTesting(kTestCredentials[i]));
844 if (blacklisted) 845 if (blacklisted)
845 all_credentials.back()->blacklisted_by_user = true; 846 all_credentials.back()->blacklisted_by_user = true;
846 store->AddLogin(*all_credentials.back()); 847 store->AddLogin(*all_credentials.back());
847 base::MessageLoop::current()->RunUntilIdle(); 848 base::RunLoop().RunUntilIdle();
848 } 849 }
849 850
850 MockPasswordStoreConsumer mock_consumer; 851 MockPasswordStoreConsumer mock_consumer;
851 ScopedVector<PasswordForm> expected_results; 852 ScopedVector<PasswordForm> expected_results;
852 for (size_t i = 0; i < arraysize(kTestCredentials); ++i) 853 for (size_t i = 0; i < arraysize(kTestCredentials); ++i)
853 expected_results.push_back(new PasswordForm(*all_credentials[i])); 854 expected_results.push_back(new PasswordForm(*all_credentials[i]));
854 855
855 MockAffiliatedMatchHelper* mock_helper = new MockAffiliatedMatchHelper; 856 MockAffiliatedMatchHelper* mock_helper = new MockAffiliatedMatchHelper;
856 store->SetAffiliatedMatchHelper(base::WrapUnique(mock_helper)); 857 store->SetAffiliatedMatchHelper(base::WrapUnique(mock_helper));
857 858
858 std::vector<std::string> affiliated_web_realms; 859 std::vector<std::string> affiliated_web_realms;
859 affiliated_web_realms.push_back(kTestWebRealm1); 860 affiliated_web_realms.push_back(kTestWebRealm1);
860 affiliated_web_realms.push_back(kTestWebRealm2); 861 affiliated_web_realms.push_back(kTestWebRealm2);
861 affiliated_web_realms.push_back(std::string()); 862 affiliated_web_realms.push_back(std::string());
862 mock_helper->ExpectCallToInjectAffiliatedWebRealms(affiliated_web_realms); 863 mock_helper->ExpectCallToInjectAffiliatedWebRealms(affiliated_web_realms);
863 for (size_t i = 0; i < expected_results.size(); ++i) 864 for (size_t i = 0; i < expected_results.size(); ++i)
864 expected_results[i]->affiliated_web_realm = affiliated_web_realms[i]; 865 expected_results[i]->affiliated_web_realm = affiliated_web_realms[i];
865 866
866 EXPECT_CALL(mock_consumer, 867 EXPECT_CALL(mock_consumer,
867 OnGetPasswordStoreResultsConstRef( 868 OnGetPasswordStoreResultsConstRef(
868 UnorderedPasswordFormElementsAre(expected_results.get()))); 869 UnorderedPasswordFormElementsAre(expected_results.get())));
869 if (blacklisted) 870 if (blacklisted)
870 store->GetBlacklistLoginsWithAffiliatedRealms(&mock_consumer); 871 store->GetBlacklistLoginsWithAffiliatedRealms(&mock_consumer);
871 else 872 else
872 store->GetAutofillableLoginsWithAffiliatedRealms(&mock_consumer); 873 store->GetAutofillableLoginsWithAffiliatedRealms(&mock_consumer);
873 874
874 // Since GetAutofillableLoginsWithAffiliatedRealms schedules a request for 875 // Since GetAutofillableLoginsWithAffiliatedRealms schedules a request for
875 // affiliated realms to UI thread, don't shutdown UI thread until there are 876 // affiliated realms to UI thread, don't shutdown UI thread until there are
876 // no tasks in the UI queue. 877 // no tasks in the UI queue.
877 base::MessageLoop::current()->RunUntilIdle(); 878 base::RunLoop().RunUntilIdle();
878 store->ShutdownOnUIThread(); 879 store->ShutdownOnUIThread();
879 base::MessageLoop::current()->RunUntilIdle(); 880 base::RunLoop().RunUntilIdle();
880 } 881 }
881 } 882 }
882 883
883 } // namespace password_manager 884 } // namespace password_manager
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698