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

Side by Side Diff: chrome/browser/password_manager/native_backend_gnome_x_unittest.cc

Issue 8509038: Linux: split GNOME Keyring integration into a separate process. Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: merge Created 8 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/password_manager/native_backend_gnome_x.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include <stdarg.h> 5 #include <stdarg.h>
6 #include <sys/socket.h>
6 7
7 #include "base/basictypes.h" 8 #include "base/basictypes.h"
8 #include "base/stl_util.h" 9 #include "base/stl_util.h"
9 #include "base/string_util.h" 10 #include "base/string_util.h"
10 #include "base/stringprintf.h" 11 #include "base/stringprintf.h"
11 #include "base/time.h" 12 #include "base/time.h"
12 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
14 #include "chrome/browser/password_manager/keyring_proxy/gnome_keyring_loader.h"
15 #include "chrome/browser/password_manager/keyring_proxy/keyring_proxy.h"
16 #include "chrome/browser/password_manager/keyring_proxy/keyring_proxy_client.h"
13 #include "chrome/browser/password_manager/native_backend_gnome_x.h" 17 #include "chrome/browser/password_manager/native_backend_gnome_x.h"
14 #include "chrome/browser/prefs/pref_service.h" 18 #include "chrome/browser/prefs/pref_service.h"
15 #include "chrome/common/pref_names.h" 19 #include "chrome/common/pref_names.h"
16 #include "chrome/test/base/testing_profile.h" 20 #include "chrome/test/base/testing_profile.h"
17 #include "content/test/test_browser_thread.h" 21 #include "content/test/test_browser_thread.h"
18 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
19 23
20 using content::BrowserThread; 24 using content::BrowserThread;
21 using webkit::forms::PasswordForm; 25 using webkit::forms::PasswordForm;
22 26
23 namespace { 27 namespace {
24 28
25 // What follows is a very simple implementation of the subset of the GNOME 29 // What follows is a very simple implementation of the subset of the GNOME
26 // Keyring API that we actually use. It gets substituted for the real one by 30 // Keyring API that we actually use. It gets substituted for the real one by
27 // MockGnomeKeyringLoader, which hooks into the facility normally used to load 31 // MockGnomeKeyringLoader, which hooks into the facility normally used to load
28 // the GNOME Keyring library at runtime to avoid a static dependency on it. 32 // the GNOME Keyring library at runtime to avoid a static dependency on it.
33 // We also use some special glue code to link directly with the main keyring
34 // proxy code and thus call into the mock implementation in this process,
35 // rather than in a separate proxy process. (See below.)
29 36
30 struct MockKeyringItem { 37 struct MockKeyringItem {
31 MockKeyringItem() {} 38 MockKeyringItem() {}
32 MockKeyringItem(const char* keyring, 39 MockKeyringItem(const char* keyring,
33 const std::string& display_name, 40 const std::string& display_name,
34 const std::string& password) 41 const std::string& password)
35 : keyring(keyring ? keyring : "login"), 42 : keyring(keyring ? keyring : "login"),
36 display_name(display_name), 43 display_name(display_name),
37 password(password) {} 44 password(password) {}
38 45
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 } 258 }
252 g_list_free(results); 259 g_list_free(results);
253 return NULL; 260 return NULL;
254 } 261 }
255 262
256 const gchar* mock_gnome_keyring_result_to_message(GnomeKeyringResult res) { 263 const gchar* mock_gnome_keyring_result_to_message(GnomeKeyringResult res) {
257 return "mock keyring simulating failure"; 264 return "mock keyring simulating failure";
258 } 265 }
259 266
260 // Inherit to get access to protected fields. 267 // Inherit to get access to protected fields.
261 class MockGnomeKeyringLoader : public GnomeKeyringLoader { 268 class MockGnomeKeyringLoader : public keyring_proxy::GnomeKeyringLoader {
262 public: 269 public:
263 static bool LoadMockGnomeKeyring() { 270 static bool LoadMockGnomeKeyring() {
264 #define GNOME_KEYRING_ASSIGN_POINTER(name) \ 271 #define GNOME_KEYRING_ASSIGN_POINTER(name) \
265 gnome_keyring_##name = &mock_gnome_keyring_##name; 272 gnome_keyring_##name = &mock_gnome_keyring_##name;
266 GNOME_KEYRING_FOR_EACH_FUNC(GNOME_KEYRING_ASSIGN_POINTER) 273 GNOME_KEYRING_FOR_EACH_FUNC(GNOME_KEYRING_ASSIGN_POINTER)
267 #undef GNOME_KEYRING_ASSIGN_POINTER 274 #undef GNOME_KEYRING_ASSIGN_POINTER
268 keyring_loaded = true; 275 keyring_loaded = true;
269 // Reset the state of the mock library. 276 // Reset the state of the mock library.
270 mock_keyring_items.clear(); 277 mock_keyring_items.clear();
271 mock_keyring_reject_local_ids = false; 278 mock_keyring_reject_local_ids = false;
272 return true; 279 return true;
273 } 280 }
281
282 static void ResetGnomeKeyring() { keyring_loaded = false; }
283 };
284
285 // Now that we can inject a mock GNOME Keyring API, we need to glue the keyring
286 // proxy client directly to the proxy code, which is linked into the unit test
287 // directly. We do this by creating a socket and giving one end to each, but we
288 // need some slightly adapted proxy and proxy client classes to make that work.
289
290 class TestKeyringProxy : public keyring_proxy::KeyringProxy {
291 public:
292 explicit TestKeyringProxy(int fd) : KeyringProxy(fd, CreateOutput(fd)) {}
293 ~TestKeyringProxy() { fclose(output_); }
294
295 private:
296 // This is a bit of a hack. We need to do this before calling the constructor
297 // for KeyringProxy, since it needs a FILE*. So we have a member method that
298 // fills in output_ for us before the body of our constructor even runs. It's
299 // safe since there's nothing virtual involved.
300 FILE* CreateOutput(int fd) {
301 int dup_fd = dup(fd);
302 CHECK_GE(dup_fd, 0);
303 output_ = fdopen(dup_fd, "r+");
304 CHECK(output_);
305 return output_;
306 }
307
308 FILE* output_;
309 };
310
311 class TestKeyringProxyClient : public keyring_proxy::KeyringProxyClient {
312 public:
313 using KeyringProxyClient::ConnectForTesting;
314 };
315
316 class TestNativeBackendGnome : public NativeBackendGnome {
317 public:
318 using NativeBackendGnome::InitForTesting;
274 }; 319 };
275 320
276 } // anonymous namespace 321 } // anonymous namespace
277 322
278 class NativeBackendGnomeTest : public testing::Test { 323 class NativeBackendGnomeTest : public testing::Test {
279 protected: 324 protected:
280 NativeBackendGnomeTest() 325 NativeBackendGnomeTest()
281 : ui_thread_(BrowserThread::UI, &message_loop_), 326 : ui_thread_(BrowserThread::UI, &message_loop_),
282 db_thread_(BrowserThread::DB) { 327 db_thread_(BrowserThread::DB),
328 file_thread_(BrowserThread::FILE) {
283 } 329 }
284 330
285 virtual void SetUp() { 331 virtual void SetUp() {
286 ASSERT_TRUE(db_thread_.Start()); 332 ASSERT_TRUE(db_thread_.Start());
333 ASSERT_TRUE(file_thread_.StartIOThread());
287 334
288 MockGnomeKeyringLoader::LoadMockGnomeKeyring(); 335 MockGnomeKeyringLoader::LoadMockGnomeKeyring();
289 336
337 int fds[2];
338 ASSERT_TRUE(socketpair(AF_LOCAL, SOCK_STREAM, 0, fds) >= 0);
339 // Give one side to the proxy itself, which is linked into the unit test.
340 // We won't call its Run() method, but its events will run from the UI
341 // thread's GMainContext automatically. Its Stop() method won't work.
342 proxy_.reset(new TestKeyringProxy(fds[0]));
343 // Save the other side for test proxy clients.
344 proxy_fd_ = fds[1];
345
290 form_google_.origin = GURL("http://www.google.com/"); 346 form_google_.origin = GURL("http://www.google.com/");
291 form_google_.action = GURL("http://www.google.com/login"); 347 form_google_.action = GURL("http://www.google.com/login");
292 form_google_.username_element = UTF8ToUTF16("user"); 348 form_google_.username_element = UTF8ToUTF16("user");
293 form_google_.username_value = UTF8ToUTF16("joeschmoe"); 349 form_google_.username_value = UTF8ToUTF16("joeschmoe");
294 form_google_.password_element = UTF8ToUTF16("pass"); 350 form_google_.password_element = UTF8ToUTF16("pass");
295 form_google_.password_value = UTF8ToUTF16("seekrit"); 351 form_google_.password_value = UTF8ToUTF16("seekrit");
296 form_google_.submit_element = UTF8ToUTF16("submit"); 352 form_google_.submit_element = UTF8ToUTF16("submit");
297 form_google_.signon_realm = "Google"; 353 form_google_.signon_realm = "Google";
298 354
299 form_isc_.origin = GURL("http://www.isc.org/"); 355 form_isc_.origin = GURL("http://www.isc.org/");
300 form_isc_.action = GURL("http://www.isc.org/auth"); 356 form_isc_.action = GURL("http://www.isc.org/auth");
301 form_isc_.username_element = UTF8ToUTF16("id"); 357 form_isc_.username_element = UTF8ToUTF16("id");
302 form_isc_.username_value = UTF8ToUTF16("janedoe"); 358 form_isc_.username_value = UTF8ToUTF16("janedoe");
303 form_isc_.password_element = UTF8ToUTF16("passwd"); 359 form_isc_.password_element = UTF8ToUTF16("passwd");
304 form_isc_.password_value = UTF8ToUTF16("ihazabukkit"); 360 form_isc_.password_value = UTF8ToUTF16("ihazabukkit");
305 form_isc_.submit_element = UTF8ToUTF16("login"); 361 form_isc_.submit_element = UTF8ToUTF16("login");
306 form_isc_.signon_realm = "ISC"; 362 form_isc_.signon_realm = "ISC";
307 } 363 }
308 364
309 virtual void TearDown() { 365 virtual void TearDown() {
310 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); 366 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
311 MessageLoop::current()->Run(); 367 MessageLoop::current()->Run();
368 // It is important to close this file descriptor only after finishing
369 // running the UI thread's message loop, or else it will get into an
370 // infinite loop due to the proxy's Stop() method not working with the
371 // way we've linked it directly with the unit test.
372 close(proxy_fd_);
373 file_thread_.Stop();
312 db_thread_.Stop(); 374 db_thread_.Stop();
375 // Reset keyring_loaded to false in case other tests use it. We don't want
376 // them to use our mock library accidentally.
377 MockGnomeKeyringLoader::ResetGnomeKeyring();
313 } 378 }
314 379
315 void RunBothThreads() { 380 void InitNativeBackend(NativeBackendGnome* backend) {
381 int fd = dup(proxy_fd_);
382 ASSERT_GE(fd, 0);
383 TestKeyringProxyClient* client = new TestKeyringProxyClient;
384 client->ConnectForTesting(fd, true);
385 // The cast is safe because all it does is change protection.
386 static_cast<TestNativeBackendGnome*>(backend)->InitForTesting(client);
387 }
388
389 void RunAllThreads() {
316 // First we post a message to the DB thread that will run after all other 390 // First we post a message to the DB thread that will run after all other
317 // messages that have been posted to the DB thread (we don't expect more 391 // messages that have been posted to the DB thread (we don't expect more
318 // to be posted), which posts a message to the UI thread to quit the loop. 392 // to be posted), which posts a message to the UI thread to quit the loop.
319 // That way we can run both loops and be sure that the UI thread loop will 393 // That way we can run both loops and be sure that the UI thread loop will
320 // quit so we can get on with the rest of the test. 394 // quit so we can get on with the rest of the test.
321 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, 395 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
322 base::Bind(&PostQuitTask, &message_loop_)); 396 base::Bind(&PostQuitTask, &message_loop_));
323 MessageLoop::current()->Run(); 397 MessageLoop::current()->Run();
324 } 398 }
325 399
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 CheckUint32Attribute(item, "preferred", form.preferred); 448 CheckUint32Attribute(item, "preferred", form.preferred);
375 // We don't check the date created. It varies. 449 // We don't check the date created. It varies.
376 CheckUint32Attribute(item, "blacklisted_by_user", form.blacklisted_by_user); 450 CheckUint32Attribute(item, "blacklisted_by_user", form.blacklisted_by_user);
377 CheckUint32Attribute(item, "scheme", form.scheme); 451 CheckUint32Attribute(item, "scheme", form.scheme);
378 CheckStringAttribute(item, "application", app_string); 452 CheckStringAttribute(item, "application", app_string);
379 } 453 }
380 454
381 MessageLoopForUI message_loop_; 455 MessageLoopForUI message_loop_;
382 content::TestBrowserThread ui_thread_; 456 content::TestBrowserThread ui_thread_;
383 content::TestBrowserThread db_thread_; 457 content::TestBrowserThread db_thread_;
458 content::TestBrowserThread file_thread_;
384 459
385 TestingProfile profile_; 460 TestingProfile profile_;
386 461
462 // By its very existence, the test proxy integrates with the UI thread's
463 // message loop (via GMainContext). We don't need to access it explicitly.
464 scoped_ptr<TestKeyringProxy> proxy_;
465 // This is the file descriptor connected to the proxy, suitable for dup()ing
466 // and using to construct TestKeyringProxyClients.
467 int proxy_fd_;
468
387 // Provide some test forms to avoid having to set them up in each test. 469 // Provide some test forms to avoid having to set them up in each test.
388 PasswordForm form_google_; 470 PasswordForm form_google_;
389 PasswordForm form_isc_; 471 PasswordForm form_isc_;
390 }; 472 };
391 473
392 TEST_F(NativeBackendGnomeTest, BasicAddLogin) { 474 TEST_F(NativeBackendGnomeTest, BasicAddLogin) {
393 // Pretend that the migration has already taken place. 475 // Pretend that the migration has already taken place.
394 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); 476 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
395 477
396 NativeBackendGnome backend(42, profile_.GetPrefs()); 478 NativeBackendGnome backend(42, profile_.GetPrefs());
397 backend.Init(); 479 InitNativeBackend(&backend);
398 480
399 BrowserThread::PostTask( 481 BrowserThread::PostTask(
400 BrowserThread::DB, FROM_HERE, 482 BrowserThread::DB, FROM_HERE,
401 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), 483 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
402 base::Unretained(&backend), form_google_)); 484 base::Unretained(&backend), form_google_));
403 485
404 RunBothThreads(); 486 RunAllThreads();
405 487
406 EXPECT_EQ(1u, mock_keyring_items.size()); 488 EXPECT_EQ(1u, mock_keyring_items.size());
407 if (mock_keyring_items.size() > 0) 489 if (mock_keyring_items.size() > 0)
408 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); 490 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
409 } 491 }
410 492
411 TEST_F(NativeBackendGnomeTest, BasicListLogins) { 493 TEST_F(NativeBackendGnomeTest, BasicListLogins) {
412 // Pretend that the migration has already taken place. 494 // Pretend that the migration has already taken place.
413 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); 495 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
414 496
415 NativeBackendGnome backend(42, profile_.GetPrefs()); 497 NativeBackendGnome backend(42, profile_.GetPrefs());
416 backend.Init(); 498 InitNativeBackend(&backend);
417 499
418 BrowserThread::PostTask( 500 BrowserThread::PostTask(
419 BrowserThread::DB, FROM_HERE, 501 BrowserThread::DB, FROM_HERE,
420 base::Bind(base::IgnoreResult( &NativeBackendGnome::AddLogin), 502 base::Bind(base::IgnoreResult( &NativeBackendGnome::AddLogin),
421 base::Unretained(&backend), form_google_)); 503 base::Unretained(&backend), form_google_));
422 504
423 std::vector<PasswordForm*> form_list; 505 std::vector<PasswordForm*> form_list;
424 BrowserThread::PostTask( 506 BrowserThread::PostTask(
425 BrowserThread::DB, FROM_HERE, 507 BrowserThread::DB, FROM_HERE,
426 base::Bind( 508 base::Bind(
427 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins), 509 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
428 base::Unretained(&backend), &form_list)); 510 base::Unretained(&backend), &form_list));
429 511
430 RunBothThreads(); 512 RunAllThreads();
431 513
432 // Quick check that we got something back. 514 // Quick check that we got something back.
433 EXPECT_EQ(1u, form_list.size()); 515 EXPECT_EQ(1u, form_list.size());
434 STLDeleteElements(&form_list); 516 STLDeleteElements(&form_list);
435 517
436 EXPECT_EQ(1u, mock_keyring_items.size()); 518 EXPECT_EQ(1u, mock_keyring_items.size());
437 if (mock_keyring_items.size() > 0) 519 if (mock_keyring_items.size() > 0)
438 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); 520 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
439 } 521 }
440 522
441 TEST_F(NativeBackendGnomeTest, BasicRemoveLogin) { 523 TEST_F(NativeBackendGnomeTest, BasicRemoveLogin) {
442 // Pretend that the migration has already taken place. 524 // Pretend that the migration has already taken place.
443 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); 525 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
444 526
445 NativeBackendGnome backend(42, profile_.GetPrefs()); 527 NativeBackendGnome backend(42, profile_.GetPrefs());
446 backend.Init(); 528 InitNativeBackend(&backend);
447 529
448 BrowserThread::PostTask( 530 BrowserThread::PostTask(
449 BrowserThread::DB, FROM_HERE, 531 BrowserThread::DB, FROM_HERE,
450 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), 532 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
451 base::Unretained(&backend), form_google_)); 533 base::Unretained(&backend), form_google_));
452 534
453 RunBothThreads(); 535 RunAllThreads();
454 536
455 EXPECT_EQ(1u, mock_keyring_items.size()); 537 EXPECT_EQ(1u, mock_keyring_items.size());
456 if (mock_keyring_items.size() > 0) 538 if (mock_keyring_items.size() > 0)
457 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); 539 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
458 540
459 BrowserThread::PostTask( 541 BrowserThread::PostTask(
460 BrowserThread::DB, FROM_HERE, 542 BrowserThread::DB, FROM_HERE,
461 base::Bind(base::IgnoreResult(&NativeBackendGnome::RemoveLogin), 543 base::Bind(base::IgnoreResult(&NativeBackendGnome::RemoveLogin),
462 base::Unretained(&backend), form_google_)); 544 base::Unretained(&backend), form_google_));
463 545
464 RunBothThreads(); 546 RunAllThreads();
465 547
466 EXPECT_EQ(0u, mock_keyring_items.size()); 548 EXPECT_EQ(0u, mock_keyring_items.size());
467 } 549 }
468 550
469 TEST_F(NativeBackendGnomeTest, RemoveNonexistentLogin) { 551 TEST_F(NativeBackendGnomeTest, RemoveNonexistentLogin) {
470 // Pretend that the migration has already taken place. 552 // Pretend that the migration has already taken place.
471 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); 553 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
472 554
473 NativeBackendGnome backend(42, profile_.GetPrefs()); 555 NativeBackendGnome backend(42, profile_.GetPrefs());
474 backend.Init(); 556 InitNativeBackend(&backend);
475 557
476 // First add an unrelated login. 558 // First add an unrelated login.
477 BrowserThread::PostTask( 559 BrowserThread::PostTask(
478 BrowserThread::DB, FROM_HERE, 560 BrowserThread::DB, FROM_HERE,
479 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), 561 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
480 base::Unretained(&backend), form_google_)); 562 base::Unretained(&backend), form_google_));
481 563
482 RunBothThreads(); 564 RunAllThreads();
483 565
484 EXPECT_EQ(1u, mock_keyring_items.size()); 566 EXPECT_EQ(1u, mock_keyring_items.size());
485 if (mock_keyring_items.size() > 0) 567 if (mock_keyring_items.size() > 0)
486 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); 568 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
487 569
488 // Attempt to remove a login that doesn't exist. 570 // Attempt to remove a login that doesn't exist.
489 BrowserThread::PostTask( 571 BrowserThread::PostTask(
490 BrowserThread::DB, FROM_HERE, 572 BrowserThread::DB, FROM_HERE,
491 base::Bind(base::IgnoreResult(&NativeBackendGnome::RemoveLogin), 573 base::Bind(base::IgnoreResult(&NativeBackendGnome::RemoveLogin),
492 base::Unretained(&backend), form_isc_)); 574 base::Unretained(&backend), form_isc_));
493 575
494 // Make sure we can still get the first form back. 576 // Make sure we can still get the first form back.
495 std::vector<PasswordForm*> form_list; 577 std::vector<PasswordForm*> form_list;
496 BrowserThread::PostTask( 578 BrowserThread::PostTask(
497 BrowserThread::DB, FROM_HERE, 579 BrowserThread::DB, FROM_HERE,
498 base::Bind( 580 base::Bind(
499 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins), 581 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
500 base::Unretained(&backend), &form_list)); 582 base::Unretained(&backend), &form_list));
501 583
502 RunBothThreads(); 584 RunAllThreads();
503 585
504 // Quick check that we got something back. 586 // Quick check that we got something back.
505 EXPECT_EQ(1u, form_list.size()); 587 EXPECT_EQ(1u, form_list.size());
506 STLDeleteElements(&form_list); 588 STLDeleteElements(&form_list);
507 589
508 EXPECT_EQ(1u, mock_keyring_items.size()); 590 EXPECT_EQ(1u, mock_keyring_items.size());
509 if (mock_keyring_items.size() > 0) 591 if (mock_keyring_items.size() > 0)
510 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); 592 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
511 } 593 }
512 594
513 TEST_F(NativeBackendGnomeTest, AddDuplicateLogin) { 595 TEST_F(NativeBackendGnomeTest, AddDuplicateLogin) {
514 // Pretend that the migration has already taken place. 596 // Pretend that the migration has already taken place.
515 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); 597 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
516 598
517 NativeBackendGnome backend(42, profile_.GetPrefs()); 599 NativeBackendGnome backend(42, profile_.GetPrefs());
518 backend.Init(); 600 InitNativeBackend(&backend);
519 601
520 BrowserThread::PostTask( 602 BrowserThread::PostTask(
521 BrowserThread::DB, FROM_HERE, 603 BrowserThread::DB, FROM_HERE,
522 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), 604 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
523 base::Unretained(&backend), form_google_)); 605 base::Unretained(&backend), form_google_));
524 BrowserThread::PostTask( 606 BrowserThread::PostTask(
525 BrowserThread::DB, FROM_HERE, 607 BrowserThread::DB, FROM_HERE,
526 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), 608 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
527 base::Unretained(&backend), form_google_)); 609 base::Unretained(&backend), form_google_));
528 610
529 RunBothThreads(); 611 RunAllThreads();
530 612
531 EXPECT_EQ(1u, mock_keyring_items.size()); 613 EXPECT_EQ(1u, mock_keyring_items.size());
532 if (mock_keyring_items.size() > 0) 614 if (mock_keyring_items.size() > 0)
533 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); 615 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
534 } 616 }
535 617
536 TEST_F(NativeBackendGnomeTest, ListLoginsAppends) { 618 TEST_F(NativeBackendGnomeTest, ListLoginsAppends) {
537 // Pretend that the migration has already taken place. 619 // Pretend that the migration has already taken place.
538 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); 620 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
539 621
540 NativeBackendGnome backend(42, profile_.GetPrefs()); 622 NativeBackendGnome backend(42, profile_.GetPrefs());
541 backend.Init(); 623 InitNativeBackend(&backend);
542 624
543 BrowserThread::PostTask( 625 BrowserThread::PostTask(
544 BrowserThread::DB, FROM_HERE, 626 BrowserThread::DB, FROM_HERE,
545 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), 627 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
546 base::Unretained(&backend), form_google_)); 628 base::Unretained(&backend), form_google_));
547 629
548 // Send the same request twice with the same list both times. 630 // Send the same request twice with the same list both times.
549 std::vector<PasswordForm*> form_list; 631 std::vector<PasswordForm*> form_list;
550 BrowserThread::PostTask( 632 BrowserThread::PostTask(
551 BrowserThread::DB, FROM_HERE, 633 BrowserThread::DB, FROM_HERE,
552 base::Bind( 634 base::Bind(
553 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins), 635 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
554 base::Unretained(&backend), &form_list)); 636 base::Unretained(&backend), &form_list));
555 BrowserThread::PostTask( 637 BrowserThread::PostTask(
556 BrowserThread::DB, FROM_HERE, 638 BrowserThread::DB, FROM_HERE,
557 base::Bind( 639 base::Bind(
558 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins), 640 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
559 base::Unretained(&backend), &form_list)); 641 base::Unretained(&backend), &form_list));
560 642
561 RunBothThreads(); 643 RunAllThreads();
562 644
563 // Quick check that we got two results back. 645 // Quick check that we got two results back.
564 EXPECT_EQ(2u, form_list.size()); 646 EXPECT_EQ(2u, form_list.size());
565 STLDeleteElements(&form_list); 647 STLDeleteElements(&form_list);
566 648
567 EXPECT_EQ(1u, mock_keyring_items.size()); 649 EXPECT_EQ(1u, mock_keyring_items.size());
568 if (mock_keyring_items.size() > 0) 650 if (mock_keyring_items.size() > 0)
569 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); 651 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42");
570 } 652 }
571 653
572 // TODO(mdm): add more basic (i.e. non-migration) tests here at some point. 654 // TODO(mdm): add more basic (i.e. non-migration) tests here at some point.
573 655
574 TEST_F(NativeBackendGnomeTest, DISABLED_MigrateOneLogin) { 656 TEST_F(NativeBackendGnomeTest, DISABLED_MigrateOneLogin) {
575 // Reject attempts to migrate so we can populate the store. 657 // Reject attempts to migrate so we can populate the store.
576 mock_keyring_reject_local_ids = true; 658 mock_keyring_reject_local_ids = true;
577 659
578 { 660 {
579 NativeBackendGnome backend(42, profile_.GetPrefs()); 661 NativeBackendGnome backend(42, profile_.GetPrefs());
580 backend.Init(); 662 InitNativeBackend(&backend);
581 663
582 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, 664 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
583 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), 665 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
584 base::Unretained(&backend), form_google_)); 666 base::Unretained(&backend), form_google_));
585 667
586 // Make sure we can get the form back even when migration is failing. 668 // Make sure we can get the form back even when migration is failing.
587 std::vector<PasswordForm*> form_list; 669 std::vector<PasswordForm*> form_list;
588 BrowserThread::PostTask( 670 BrowserThread::PostTask(
589 BrowserThread::DB, FROM_HERE, 671 BrowserThread::DB, FROM_HERE,
590 base::Bind( 672 base::Bind(
591 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins), 673 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
592 base::Unretained(&backend), &form_list)); 674 base::Unretained(&backend), &form_list));
593 675
594 RunBothThreads(); 676 RunAllThreads();
595 677
596 // Quick check that we got something back. 678 // Quick check that we got something back.
597 EXPECT_EQ(1u, form_list.size()); 679 EXPECT_EQ(1u, form_list.size());
598 STLDeleteElements(&form_list); 680 STLDeleteElements(&form_list);
599 } 681 }
600 682
601 EXPECT_EQ(1u, mock_keyring_items.size()); 683 EXPECT_EQ(1u, mock_keyring_items.size());
602 if (mock_keyring_items.size() > 0) 684 if (mock_keyring_items.size() > 0)
603 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 685 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
604 686
605 // Now allow the migration. 687 // Now allow the migration.
606 mock_keyring_reject_local_ids = false; 688 mock_keyring_reject_local_ids = false;
607 689
608 { 690 {
609 NativeBackendGnome backend(42, profile_.GetPrefs()); 691 NativeBackendGnome backend(42, profile_.GetPrefs());
610 backend.Init(); 692 InitNativeBackend(&backend);
611 693
612 // This should not trigger migration because there will be no results. 694 // This should not trigger migration because there will be no results.
613 std::vector<PasswordForm*> form_list; 695 std::vector<PasswordForm*> form_list;
614 BrowserThread::PostTask( 696 BrowserThread::PostTask(
615 BrowserThread::DB, FROM_HERE, 697 BrowserThread::DB, FROM_HERE,
616 base::Bind(base::IgnoreResult(&NativeBackendGnome::GetBlacklistLogins), 698 base::Bind(base::IgnoreResult(&NativeBackendGnome::GetBlacklistLogins),
617 base::Unretained(&backend), &form_list)); 699 base::Unretained(&backend), &form_list));
618 700
619 RunBothThreads(); 701 RunAllThreads();
620 702
621 // Check that we got nothing back. 703 // Check that we got nothing back.
622 EXPECT_EQ(0u, form_list.size()); 704 EXPECT_EQ(0u, form_list.size());
623 STLDeleteElements(&form_list); 705 STLDeleteElements(&form_list);
624 } 706 }
625 707
626 // Check that the keyring is unmodified. 708 // Check that the keyring is unmodified.
627 EXPECT_EQ(1u, mock_keyring_items.size()); 709 EXPECT_EQ(1u, mock_keyring_items.size());
628 if (mock_keyring_items.size() > 0) 710 if (mock_keyring_items.size() > 0)
629 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 711 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
630 712
631 // Check that we haven't set the persistent preference. 713 // Check that we haven't set the persistent preference.
632 EXPECT_FALSE( 714 EXPECT_FALSE(
633 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); 715 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId));
634 716
635 { 717 {
636 NativeBackendGnome backend(42, profile_.GetPrefs()); 718 NativeBackendGnome backend(42, profile_.GetPrefs());
637 backend.Init(); 719 InitNativeBackend(&backend);
638 720
639 // Trigger the migration by looking something up. 721 // Trigger the migration by looking something up.
640 std::vector<PasswordForm*> form_list; 722 std::vector<PasswordForm*> form_list;
641 BrowserThread::PostTask( 723 BrowserThread::PostTask(
642 BrowserThread::DB, FROM_HERE, 724 BrowserThread::DB, FROM_HERE,
643 base::Bind( 725 base::Bind(
644 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins), 726 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
645 base::Unretained(&backend), &form_list)); 727 base::Unretained(&backend), &form_list));
646 728
647 RunBothThreads(); 729 RunAllThreads();
648 730
649 // Quick check that we got something back. 731 // Quick check that we got something back.
650 EXPECT_EQ(1u, form_list.size()); 732 EXPECT_EQ(1u, form_list.size());
651 STLDeleteElements(&form_list); 733 STLDeleteElements(&form_list);
652 } 734 }
653 735
654 EXPECT_EQ(2u, mock_keyring_items.size()); 736 EXPECT_EQ(2u, mock_keyring_items.size());
655 if (mock_keyring_items.size() > 0) 737 if (mock_keyring_items.size() > 0)
656 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 738 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
657 if (mock_keyring_items.size() > 1) 739 if (mock_keyring_items.size() > 1)
658 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); 740 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
659 741
660 // Check that we have set the persistent preference. 742 // Check that we have set the persistent preference.
661 EXPECT_TRUE( 743 EXPECT_TRUE(
662 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); 744 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId));
663 } 745 }
664 746
665 TEST_F(NativeBackendGnomeTest, DISABLED_MigrateToMultipleProfiles) { 747 TEST_F(NativeBackendGnomeTest, DISABLED_MigrateToMultipleProfiles) {
666 // Reject attempts to migrate so we can populate the store. 748 // Reject attempts to migrate so we can populate the store.
667 mock_keyring_reject_local_ids = true; 749 mock_keyring_reject_local_ids = true;
668 750
669 { 751 {
670 NativeBackendGnome backend(42, profile_.GetPrefs()); 752 NativeBackendGnome backend(42, profile_.GetPrefs());
671 backend.Init(); 753 InitNativeBackend(&backend);
672 754
673 BrowserThread::PostTask( 755 BrowserThread::PostTask(
674 BrowserThread::DB, FROM_HERE, 756 BrowserThread::DB, FROM_HERE,
675 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), 757 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
676 base::Unretained(&backend), form_google_)); 758 base::Unretained(&backend), form_google_));
677 759
678 RunBothThreads(); 760 RunAllThreads();
679 } 761 }
680 762
681 EXPECT_EQ(1u, mock_keyring_items.size()); 763 EXPECT_EQ(1u, mock_keyring_items.size());
682 if (mock_keyring_items.size() > 0) 764 if (mock_keyring_items.size() > 0)
683 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 765 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
684 766
685 // Now allow the migration. 767 // Now allow the migration.
686 mock_keyring_reject_local_ids = false; 768 mock_keyring_reject_local_ids = false;
687 769
688 { 770 {
689 NativeBackendGnome backend(42, profile_.GetPrefs()); 771 NativeBackendGnome backend(42, profile_.GetPrefs());
690 backend.Init(); 772 InitNativeBackend(&backend);
691 773
692 // Trigger the migration by looking something up. 774 // Trigger the migration by looking something up.
693 std::vector<PasswordForm*> form_list; 775 std::vector<PasswordForm*> form_list;
694 BrowserThread::PostTask( 776 BrowserThread::PostTask(
695 BrowserThread::DB, FROM_HERE, 777 BrowserThread::DB, FROM_HERE,
696 base::Bind( 778 base::Bind(
697 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins), 779 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
698 base::Unretained(&backend), &form_list)); 780 base::Unretained(&backend), &form_list));
699 781
700 RunBothThreads(); 782 RunAllThreads();
701 783
702 // Quick check that we got something back. 784 // Quick check that we got something back.
703 EXPECT_EQ(1u, form_list.size()); 785 EXPECT_EQ(1u, form_list.size());
704 STLDeleteElements(&form_list); 786 STLDeleteElements(&form_list);
705 } 787 }
706 788
707 EXPECT_EQ(2u, mock_keyring_items.size()); 789 EXPECT_EQ(2u, mock_keyring_items.size());
708 if (mock_keyring_items.size() > 0) 790 if (mock_keyring_items.size() > 0)
709 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 791 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
710 if (mock_keyring_items.size() > 1) 792 if (mock_keyring_items.size() > 1)
711 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); 793 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
712 794
713 // Check that we have set the persistent preference. 795 // Check that we have set the persistent preference.
714 EXPECT_TRUE( 796 EXPECT_TRUE(
715 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); 797 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId));
716 798
717 // Normally we'd actually have a different profile. But in the test just reset 799 // Normally we'd actually have a different profile. But in the test just reset
718 // the profile's persistent pref; we pass in the local profile id anyway. 800 // the profile's persistent pref; we pass in the local profile id anyway.
719 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, false); 801 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, false);
720 802
721 { 803 {
722 NativeBackendGnome backend(24, profile_.GetPrefs()); 804 NativeBackendGnome backend(24, profile_.GetPrefs());
723 backend.Init(); 805 InitNativeBackend(&backend);
724 806
725 // Trigger the migration by looking something up. 807 // Trigger the migration by looking something up.
726 std::vector<PasswordForm*> form_list; 808 std::vector<PasswordForm*> form_list;
727 BrowserThread::PostTask( 809 BrowserThread::PostTask(
728 BrowserThread::DB, FROM_HERE, 810 BrowserThread::DB, FROM_HERE,
729 base::Bind( 811 base::Bind(
730 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins), 812 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
731 base::Unretained(&backend), &form_list)); 813 base::Unretained(&backend), &form_list));
732 814
733 RunBothThreads(); 815 RunAllThreads();
734 816
735 // Quick check that we got something back. 817 // Quick check that we got something back.
736 EXPECT_EQ(1u, form_list.size()); 818 EXPECT_EQ(1u, form_list.size());
737 STLDeleteElements(&form_list); 819 STLDeleteElements(&form_list);
738 } 820 }
739 821
740 EXPECT_EQ(3u, mock_keyring_items.size()); 822 EXPECT_EQ(3u, mock_keyring_items.size());
741 if (mock_keyring_items.size() > 0) 823 if (mock_keyring_items.size() > 0)
742 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 824 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
743 if (mock_keyring_items.size() > 1) 825 if (mock_keyring_items.size() > 1)
744 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); 826 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
745 if (mock_keyring_items.size() > 2) 827 if (mock_keyring_items.size() > 2)
746 CheckMockKeyringItem(&mock_keyring_items[2], form_google_, "chrome-24"); 828 CheckMockKeyringItem(&mock_keyring_items[2], form_google_, "chrome-24");
747 } 829 }
748 830
749 TEST_F(NativeBackendGnomeTest, DISABLED_NoMigrationWithPrefSet) { 831 TEST_F(NativeBackendGnomeTest, DISABLED_NoMigrationWithPrefSet) {
750 // Reject attempts to migrate so we can populate the store. 832 // Reject attempts to migrate so we can populate the store.
751 mock_keyring_reject_local_ids = true; 833 mock_keyring_reject_local_ids = true;
752 834
753 { 835 {
754 NativeBackendGnome backend(42, profile_.GetPrefs()); 836 NativeBackendGnome backend(42, profile_.GetPrefs());
755 backend.Init(); 837 InitNativeBackend(&backend);
756 838
757 BrowserThread::PostTask( 839 BrowserThread::PostTask(
758 BrowserThread::DB, FROM_HERE, 840 BrowserThread::DB, FROM_HERE,
759 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), 841 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
760 base::Unretained(&backend), form_google_)); 842 base::Unretained(&backend), form_google_));
761 843
762 RunBothThreads(); 844 RunAllThreads();
763 } 845 }
764 846
765 EXPECT_EQ(1u, mock_keyring_items.size()); 847 EXPECT_EQ(1u, mock_keyring_items.size());
766 if (mock_keyring_items.size() > 0) 848 if (mock_keyring_items.size() > 0)
767 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 849 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
768 850
769 // Now allow migration, but also pretend that the it has already taken place. 851 // Now allow migration, but also pretend that the it has already taken place.
770 mock_keyring_reject_local_ids = false; 852 mock_keyring_reject_local_ids = false;
771 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); 853 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true);
772 854
773 { 855 {
774 NativeBackendGnome backend(42, profile_.GetPrefs()); 856 NativeBackendGnome backend(42, profile_.GetPrefs());
775 backend.Init(); 857 InitNativeBackend(&backend);
776 858
777 // Trigger the migration by adding a new login. 859 // Trigger the migration by adding a new login.
778 BrowserThread::PostTask( 860 BrowserThread::PostTask(
779 BrowserThread::DB, FROM_HERE, 861 BrowserThread::DB, FROM_HERE,
780 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), 862 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
781 base::Unretained(&backend), form_isc_)); 863 base::Unretained(&backend), form_isc_));
782 864
783 // Look up all logins; we expect only the one we added. 865 // Look up all logins; we expect only the one we added.
784 std::vector<PasswordForm*> form_list; 866 std::vector<PasswordForm*> form_list;
785 BrowserThread::PostTask( 867 BrowserThread::PostTask(
786 BrowserThread::DB, FROM_HERE, 868 BrowserThread::DB, FROM_HERE,
787 base::Bind( 869 base::Bind(
788 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins), 870 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
789 base::Unretained(&backend), &form_list)); 871 base::Unretained(&backend), &form_list));
790 872
791 RunBothThreads(); 873 RunAllThreads();
792 874
793 // Quick check that we got the right thing back. 875 // Quick check that we got the right thing back.
794 EXPECT_EQ(1u, form_list.size()); 876 EXPECT_EQ(1u, form_list.size());
795 if (form_list.size() > 0) 877 if (form_list.size() > 0)
796 EXPECT_EQ(form_isc_.signon_realm, form_list[0]->signon_realm); 878 EXPECT_EQ(form_isc_.signon_realm, form_list[0]->signon_realm);
797 STLDeleteElements(&form_list); 879 STLDeleteElements(&form_list);
798 } 880 }
799 881
800 EXPECT_EQ(2u, mock_keyring_items.size()); 882 EXPECT_EQ(2u, mock_keyring_items.size());
801 if (mock_keyring_items.size() > 0) 883 if (mock_keyring_items.size() > 0)
802 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 884 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
803 if (mock_keyring_items.size() > 1) 885 if (mock_keyring_items.size() > 1)
804 CheckMockKeyringItem(&mock_keyring_items[1], form_isc_, "chrome-42"); 886 CheckMockKeyringItem(&mock_keyring_items[1], form_isc_, "chrome-42");
805 } 887 }
806 888
807 TEST_F(NativeBackendGnomeTest, DISABLED_DeleteMigratedPasswordIsIsolated) { 889 TEST_F(NativeBackendGnomeTest, DISABLED_DeleteMigratedPasswordIsIsolated) {
808 // Reject attempts to migrate so we can populate the store. 890 // Reject attempts to migrate so we can populate the store.
809 mock_keyring_reject_local_ids = true; 891 mock_keyring_reject_local_ids = true;
810 892
811 { 893 {
812 NativeBackendGnome backend(42, profile_.GetPrefs()); 894 NativeBackendGnome backend(42, profile_.GetPrefs());
813 backend.Init(); 895 InitNativeBackend(&backend);
814 896
815 BrowserThread::PostTask( 897 BrowserThread::PostTask(
816 BrowserThread::DB, FROM_HERE, 898 BrowserThread::DB, FROM_HERE,
817 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), 899 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin),
818 base::Unretained(&backend), form_google_)); 900 base::Unretained(&backend), form_google_));
819 901
820 RunBothThreads(); 902 RunAllThreads();
821 } 903 }
822 904
823 EXPECT_EQ(1u, mock_keyring_items.size()); 905 EXPECT_EQ(1u, mock_keyring_items.size());
824 if (mock_keyring_items.size() > 0) 906 if (mock_keyring_items.size() > 0)
825 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 907 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
826 908
827 // Now allow the migration. 909 // Now allow the migration.
828 mock_keyring_reject_local_ids = false; 910 mock_keyring_reject_local_ids = false;
829 911
830 { 912 {
831 NativeBackendGnome backend(42, profile_.GetPrefs()); 913 NativeBackendGnome backend(42, profile_.GetPrefs());
832 backend.Init(); 914 InitNativeBackend(&backend);
833 915
834 // Trigger the migration by looking something up. 916 // Trigger the migration by looking something up.
835 std::vector<PasswordForm*> form_list; 917 std::vector<PasswordForm*> form_list;
836 BrowserThread::PostTask( 918 BrowserThread::PostTask(
837 BrowserThread::DB, FROM_HERE, 919 BrowserThread::DB, FROM_HERE,
838 base::Bind( 920 base::Bind(
839 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins), 921 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
840 base::Unretained(&backend), &form_list)); 922 base::Unretained(&backend), &form_list));
841 923
842 RunBothThreads(); 924 RunAllThreads();
843 925
844 // Quick check that we got something back. 926 // Quick check that we got something back.
845 EXPECT_EQ(1u, form_list.size()); 927 EXPECT_EQ(1u, form_list.size());
846 STLDeleteElements(&form_list); 928 STLDeleteElements(&form_list);
847 } 929 }
848 930
849 EXPECT_EQ(2u, mock_keyring_items.size()); 931 EXPECT_EQ(2u, mock_keyring_items.size());
850 if (mock_keyring_items.size() > 0) 932 if (mock_keyring_items.size() > 0)
851 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 933 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
852 if (mock_keyring_items.size() > 1) 934 if (mock_keyring_items.size() > 1)
853 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); 935 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
854 936
855 // Check that we have set the persistent preference. 937 // Check that we have set the persistent preference.
856 EXPECT_TRUE( 938 EXPECT_TRUE(
857 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); 939 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId));
858 940
859 // Normally we'd actually have a different profile. But in the test just reset 941 // Normally we'd actually have a different profile. But in the test just reset
860 // the profile's persistent pref; we pass in the local profile id anyway. 942 // the profile's persistent pref; we pass in the local profile id anyway.
861 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, false); 943 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, false);
862 944
863 { 945 {
864 NativeBackendGnome backend(24, profile_.GetPrefs()); 946 NativeBackendGnome backend(24, profile_.GetPrefs());
865 backend.Init(); 947 InitNativeBackend(&backend);
866 948
867 // Trigger the migration by looking something up. 949 // Trigger the migration by looking something up.
868 std::vector<PasswordForm*> form_list; 950 std::vector<PasswordForm*> form_list;
869 BrowserThread::PostTask( 951 BrowserThread::PostTask(
870 BrowserThread::DB, FROM_HERE, 952 BrowserThread::DB, FROM_HERE,
871 base::Bind( 953 base::Bind(
872 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins), 954 base::IgnoreResult(&NativeBackendGnome::GetAutofillableLogins),
873 base::Unretained(&backend), &form_list)); 955 base::Unretained(&backend), &form_list));
874 956
875 RunBothThreads(); 957 RunAllThreads();
876 958
877 // Quick check that we got something back. 959 // Quick check that we got something back.
878 EXPECT_EQ(1u, form_list.size()); 960 EXPECT_EQ(1u, form_list.size());
879 STLDeleteElements(&form_list); 961 STLDeleteElements(&form_list);
880 962
881 // There should be three passwords now. 963 // There should be three passwords now.
882 EXPECT_EQ(3u, mock_keyring_items.size()); 964 EXPECT_EQ(3u, mock_keyring_items.size());
883 if (mock_keyring_items.size() > 0) 965 if (mock_keyring_items.size() > 0)
884 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 966 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
885 if (mock_keyring_items.size() > 1) 967 if (mock_keyring_items.size() > 1)
886 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); 968 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
887 if (mock_keyring_items.size() > 2) 969 if (mock_keyring_items.size() > 2)
888 CheckMockKeyringItem(&mock_keyring_items[2], form_google_, "chrome-24"); 970 CheckMockKeyringItem(&mock_keyring_items[2], form_google_, "chrome-24");
889 971
890 // Now delete the password from this second profile. 972 // Now delete the password from this second profile.
891 BrowserThread::PostTask( 973 BrowserThread::PostTask(
892 BrowserThread::DB, FROM_HERE, 974 BrowserThread::DB, FROM_HERE,
893 base::Bind(base::IgnoreResult(&NativeBackendGnome::RemoveLogin), 975 base::Bind(base::IgnoreResult(&NativeBackendGnome::RemoveLogin),
894 base::Unretained(&backend), form_google_)); 976 base::Unretained(&backend), form_google_));
895 977
896 RunBothThreads(); 978 RunAllThreads();
897 979
898 // The other two copies of the password in different profiles should remain. 980 // The other two copies of the password in different profiles should remain.
899 EXPECT_EQ(2u, mock_keyring_items.size()); 981 EXPECT_EQ(2u, mock_keyring_items.size());
900 if (mock_keyring_items.size() > 0) 982 if (mock_keyring_items.size() > 0)
901 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); 983 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome");
902 if (mock_keyring_items.size() > 1) 984 if (mock_keyring_items.size() > 1)
903 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); 985 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42");
904 } 986 }
905 } 987 }
OLDNEW
« no previous file with comments | « chrome/browser/password_manager/native_backend_gnome_x.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698