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