| 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" |
| 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_glue::PasswordForm; | 25 using webkit_glue::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 Loading... |
| 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, new MessageLoop::QuitTask); | 366 MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask); |
| 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 Loading... |
| 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(BrowserThread::DB, FROM_HERE, | 481 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 400 base::IgnoreReturn<bool>(base::Bind( | 482 base::IgnoreReturn<bool>(base::Bind( |
| 401 &NativeBackendGnome::AddLogin, | 483 &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(BrowserThread::DB, FROM_HERE, | 500 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 419 base::IgnoreReturn<bool>(base::Bind( | 501 base::IgnoreReturn<bool>(base::Bind( |
| 420 &NativeBackendGnome::AddLogin, | 502 &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(BrowserThread::DB, FROM_HERE, | 506 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 425 base::IgnoreReturn<bool>(base::Bind( | 507 base::IgnoreReturn<bool>(base::Bind( |
| 426 &NativeBackendGnome::GetAutofillableLogins, | 508 &NativeBackendGnome::GetAutofillableLogins, |
| 427 base::Unretained(&backend), &form_list))); | 509 base::Unretained(&backend), &form_list))); |
| 428 | 510 |
| 429 RunBothThreads(); | 511 RunAllThreads(); |
| 430 | 512 |
| 431 // Quick check that we got something back. | 513 // Quick check that we got something back. |
| 432 EXPECT_EQ(1u, form_list.size()); | 514 EXPECT_EQ(1u, form_list.size()); |
| 433 STLDeleteElements(&form_list); | 515 STLDeleteElements(&form_list); |
| 434 | 516 |
| 435 EXPECT_EQ(1u, mock_keyring_items.size()); | 517 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 436 if (mock_keyring_items.size() > 0) | 518 if (mock_keyring_items.size() > 0) |
| 437 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); | 519 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); |
| 438 } | 520 } |
| 439 | 521 |
| 440 TEST_F(NativeBackendGnomeTest, BasicRemoveLogin) { | 522 TEST_F(NativeBackendGnomeTest, BasicRemoveLogin) { |
| 441 // Pretend that the migration has already taken place. | 523 // Pretend that the migration has already taken place. |
| 442 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); | 524 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); |
| 443 | 525 |
| 444 NativeBackendGnome backend(42, profile_.GetPrefs()); | 526 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 445 backend.Init(); | 527 InitNativeBackend(&backend); |
| 446 | 528 |
| 447 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 529 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 448 base::IgnoreReturn<bool>(base::Bind( | 530 base::IgnoreReturn<bool>(base::Bind( |
| 449 &NativeBackendGnome::AddLogin, | 531 &NativeBackendGnome::AddLogin, |
| 450 base::Unretained(&backend), form_google_))); | 532 base::Unretained(&backend), form_google_))); |
| 451 | 533 |
| 452 RunBothThreads(); | 534 RunAllThreads(); |
| 453 | 535 |
| 454 EXPECT_EQ(1u, mock_keyring_items.size()); | 536 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 455 if (mock_keyring_items.size() > 0) | 537 if (mock_keyring_items.size() > 0) |
| 456 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); | 538 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); |
| 457 | 539 |
| 458 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 540 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 459 base::IgnoreReturn<bool>(base::Bind( | 541 base::IgnoreReturn<bool>(base::Bind( |
| 460 &NativeBackendGnome::RemoveLogin, | 542 &NativeBackendGnome::RemoveLogin, |
| 461 base::Unretained(&backend), form_google_))); | 543 base::Unretained(&backend), form_google_))); |
| 462 | 544 |
| 463 RunBothThreads(); | 545 RunAllThreads(); |
| 464 | 546 |
| 465 EXPECT_EQ(0u, mock_keyring_items.size()); | 547 EXPECT_EQ(0u, mock_keyring_items.size()); |
| 466 } | 548 } |
| 467 | 549 |
| 468 TEST_F(NativeBackendGnomeTest, RemoveNonexistentLogin) { | 550 TEST_F(NativeBackendGnomeTest, RemoveNonexistentLogin) { |
| 469 // Pretend that the migration has already taken place. | 551 // Pretend that the migration has already taken place. |
| 470 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); | 552 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); |
| 471 | 553 |
| 472 NativeBackendGnome backend(42, profile_.GetPrefs()); | 554 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 473 backend.Init(); | 555 InitNativeBackend(&backend); |
| 474 | 556 |
| 475 // First add an unrelated login. | 557 // First add an unrelated login. |
| 476 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 558 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 477 base::IgnoreReturn<bool>(base::Bind( | 559 base::IgnoreReturn<bool>(base::Bind( |
| 478 &NativeBackendGnome::AddLogin, | 560 &NativeBackendGnome::AddLogin, |
| 479 base::Unretained(&backend), form_google_))); | 561 base::Unretained(&backend), form_google_))); |
| 480 | 562 |
| 481 RunBothThreads(); | 563 RunAllThreads(); |
| 482 | 564 |
| 483 EXPECT_EQ(1u, mock_keyring_items.size()); | 565 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 484 if (mock_keyring_items.size() > 0) | 566 if (mock_keyring_items.size() > 0) |
| 485 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); | 567 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); |
| 486 | 568 |
| 487 // Attempt to remove a login that doesn't exist. | 569 // Attempt to remove a login that doesn't exist. |
| 488 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 570 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 489 base::IgnoreReturn<bool>(base::Bind( | 571 base::IgnoreReturn<bool>(base::Bind( |
| 490 &NativeBackendGnome::RemoveLogin, | 572 &NativeBackendGnome::RemoveLogin, |
| 491 base::Unretained(&backend), form_isc_))); | 573 base::Unretained(&backend), form_isc_))); |
| 492 | 574 |
| 493 // Make sure we can still get the first form back. | 575 // Make sure we can still get the first form back. |
| 494 std::vector<PasswordForm*> form_list; | 576 std::vector<PasswordForm*> form_list; |
| 495 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 577 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 496 base::IgnoreReturn<bool>(base::Bind( | 578 base::IgnoreReturn<bool>(base::Bind( |
| 497 &NativeBackendGnome::GetAutofillableLogins, | 579 &NativeBackendGnome::GetAutofillableLogins, |
| 498 base::Unretained(&backend), &form_list))); | 580 base::Unretained(&backend), &form_list))); |
| 499 | 581 |
| 500 RunBothThreads(); | 582 RunAllThreads(); |
| 501 | 583 |
| 502 // Quick check that we got something back. | 584 // Quick check that we got something back. |
| 503 EXPECT_EQ(1u, form_list.size()); | 585 EXPECT_EQ(1u, form_list.size()); |
| 504 STLDeleteElements(&form_list); | 586 STLDeleteElements(&form_list); |
| 505 | 587 |
| 506 EXPECT_EQ(1u, mock_keyring_items.size()); | 588 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 507 if (mock_keyring_items.size() > 0) | 589 if (mock_keyring_items.size() > 0) |
| 508 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); | 590 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); |
| 509 } | 591 } |
| 510 | 592 |
| 511 TEST_F(NativeBackendGnomeTest, AddDuplicateLogin) { | 593 TEST_F(NativeBackendGnomeTest, AddDuplicateLogin) { |
| 512 // Pretend that the migration has already taken place. | 594 // Pretend that the migration has already taken place. |
| 513 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); | 595 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); |
| 514 | 596 |
| 515 NativeBackendGnome backend(42, profile_.GetPrefs()); | 597 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 516 backend.Init(); | 598 InitNativeBackend(&backend); |
| 517 | 599 |
| 518 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 600 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 519 base::IgnoreReturn<bool>(base::Bind( | 601 base::IgnoreReturn<bool>(base::Bind( |
| 520 &NativeBackendGnome::AddLogin, | 602 &NativeBackendGnome::AddLogin, |
| 521 base::Unretained(&backend), form_google_))); | 603 base::Unretained(&backend), form_google_))); |
| 522 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 604 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 523 base::IgnoreReturn<bool>(base::Bind( | 605 base::IgnoreReturn<bool>(base::Bind( |
| 524 &NativeBackendGnome::AddLogin, | 606 &NativeBackendGnome::AddLogin, |
| 525 base::Unretained(&backend), form_google_))); | 607 base::Unretained(&backend), form_google_))); |
| 526 | 608 |
| 527 RunBothThreads(); | 609 RunAllThreads(); |
| 528 | 610 |
| 529 EXPECT_EQ(1u, mock_keyring_items.size()); | 611 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 530 if (mock_keyring_items.size() > 0) | 612 if (mock_keyring_items.size() > 0) |
| 531 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); | 613 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); |
| 532 } | 614 } |
| 533 | 615 |
| 534 TEST_F(NativeBackendGnomeTest, ListLoginsAppends) { | 616 TEST_F(NativeBackendGnomeTest, ListLoginsAppends) { |
| 535 // Pretend that the migration has already taken place. | 617 // Pretend that the migration has already taken place. |
| 536 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); | 618 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); |
| 537 | 619 |
| 538 NativeBackendGnome backend(42, profile_.GetPrefs()); | 620 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 539 backend.Init(); | 621 InitNativeBackend(&backend); |
| 540 | 622 |
| 541 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 623 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 542 base::IgnoreReturn<bool>(base::Bind( | 624 base::IgnoreReturn<bool>(base::Bind( |
| 543 &NativeBackendGnome::AddLogin, | 625 &NativeBackendGnome::AddLogin, |
| 544 base::Unretained(&backend), form_google_))); | 626 base::Unretained(&backend), form_google_))); |
| 545 | 627 |
| 546 // Send the same request twice with the same list both times. | 628 // Send the same request twice with the same list both times. |
| 547 std::vector<PasswordForm*> form_list; | 629 std::vector<PasswordForm*> form_list; |
| 548 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 630 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 549 base::IgnoreReturn<bool>(base::Bind( | 631 base::IgnoreReturn<bool>(base::Bind( |
| 550 &NativeBackendGnome::GetAutofillableLogins, | 632 &NativeBackendGnome::GetAutofillableLogins, |
| 551 base::Unretained(&backend), &form_list))); | 633 base::Unretained(&backend), &form_list))); |
| 552 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 634 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 553 base::IgnoreReturn<bool>(base::Bind( | 635 base::IgnoreReturn<bool>(base::Bind( |
| 554 &NativeBackendGnome::GetAutofillableLogins, | 636 &NativeBackendGnome::GetAutofillableLogins, |
| 555 base::Unretained(&backend), &form_list))); | 637 base::Unretained(&backend), &form_list))); |
| 556 | 638 |
| 557 RunBothThreads(); | 639 RunAllThreads(); |
| 558 | 640 |
| 559 // Quick check that we got two results back. | 641 // Quick check that we got two results back. |
| 560 EXPECT_EQ(2u, form_list.size()); | 642 EXPECT_EQ(2u, form_list.size()); |
| 561 STLDeleteElements(&form_list); | 643 STLDeleteElements(&form_list); |
| 562 | 644 |
| 563 EXPECT_EQ(1u, mock_keyring_items.size()); | 645 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 564 if (mock_keyring_items.size() > 0) | 646 if (mock_keyring_items.size() > 0) |
| 565 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); | 647 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); |
| 566 } | 648 } |
| 567 | 649 |
| 568 // TODO(mdm): add more basic (i.e. non-migration) tests here at some point. | 650 // TODO(mdm): add more basic (i.e. non-migration) tests here at some point. |
| 569 | 651 |
| 570 TEST_F(NativeBackendGnomeTest, MigrateOneLogin) { | 652 TEST_F(NativeBackendGnomeTest, MigrateOneLogin) { |
| 571 // Reject attempts to migrate so we can populate the store. | 653 // Reject attempts to migrate so we can populate the store. |
| 572 mock_keyring_reject_local_ids = true; | 654 mock_keyring_reject_local_ids = true; |
| 573 | 655 |
| 574 { | 656 { |
| 575 NativeBackendGnome backend(42, profile_.GetPrefs()); | 657 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 576 backend.Init(); | 658 InitNativeBackend(&backend); |
| 577 | 659 |
| 578 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 660 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 579 base::IgnoreReturn<bool>(base::Bind( | 661 base::IgnoreReturn<bool>(base::Bind( |
| 580 &NativeBackendGnome::AddLogin, | 662 &NativeBackendGnome::AddLogin, |
| 581 base::Unretained(&backend), form_google_))); | 663 base::Unretained(&backend), form_google_))); |
| 582 | 664 |
| 583 // Make sure we can get the form back even when migration is failing. | 665 // Make sure we can get the form back even when migration is failing. |
| 584 std::vector<PasswordForm*> form_list; | 666 std::vector<PasswordForm*> form_list; |
| 585 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 667 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 586 base::IgnoreReturn<bool>(base::Bind( | 668 base::IgnoreReturn<bool>(base::Bind( |
| 587 &NativeBackendGnome::GetAutofillableLogins, | 669 &NativeBackendGnome::GetAutofillableLogins, |
| 588 base::Unretained(&backend), &form_list))); | 670 base::Unretained(&backend), &form_list))); |
| 589 | 671 |
| 590 RunBothThreads(); | 672 RunAllThreads(); |
| 591 | 673 |
| 592 // Quick check that we got something back. | 674 // Quick check that we got something back. |
| 593 EXPECT_EQ(1u, form_list.size()); | 675 EXPECT_EQ(1u, form_list.size()); |
| 594 STLDeleteElements(&form_list); | 676 STLDeleteElements(&form_list); |
| 595 } | 677 } |
| 596 | 678 |
| 597 EXPECT_EQ(1u, mock_keyring_items.size()); | 679 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 598 if (mock_keyring_items.size() > 0) | 680 if (mock_keyring_items.size() > 0) |
| 599 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 681 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 600 | 682 |
| 601 // Now allow the migration. | 683 // Now allow the migration. |
| 602 mock_keyring_reject_local_ids = false; | 684 mock_keyring_reject_local_ids = false; |
| 603 | 685 |
| 604 { | 686 { |
| 605 NativeBackendGnome backend(42, profile_.GetPrefs()); | 687 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 606 backend.Init(); | 688 InitNativeBackend(&backend); |
| 607 | 689 |
| 608 // This should not trigger migration because there will be no results. | 690 // This should not trigger migration because there will be no results. |
| 609 std::vector<PasswordForm*> form_list; | 691 std::vector<PasswordForm*> form_list; |
| 610 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 692 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 611 base::IgnoreReturn<bool>(base::Bind( | 693 base::IgnoreReturn<bool>(base::Bind( |
| 612 &NativeBackendGnome::GetBlacklistLogins, | 694 &NativeBackendGnome::GetBlacklistLogins, |
| 613 base::Unretained(&backend), &form_list))); | 695 base::Unretained(&backend), &form_list))); |
| 614 | 696 |
| 615 RunBothThreads(); | 697 RunAllThreads(); |
| 616 | 698 |
| 617 // Check that we got nothing back. | 699 // Check that we got nothing back. |
| 618 EXPECT_EQ(0u, form_list.size()); | 700 EXPECT_EQ(0u, form_list.size()); |
| 619 STLDeleteElements(&form_list); | 701 STLDeleteElements(&form_list); |
| 620 } | 702 } |
| 621 | 703 |
| 622 // Check that the keyring is unmodified. | 704 // Check that the keyring is unmodified. |
| 623 EXPECT_EQ(1u, mock_keyring_items.size()); | 705 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 624 if (mock_keyring_items.size() > 0) | 706 if (mock_keyring_items.size() > 0) |
| 625 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 707 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 626 | 708 |
| 627 // Check that we haven't set the persistent preference. | 709 // Check that we haven't set the persistent preference. |
| 628 EXPECT_FALSE( | 710 EXPECT_FALSE( |
| 629 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); | 711 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); |
| 630 | 712 |
| 631 { | 713 { |
| 632 NativeBackendGnome backend(42, profile_.GetPrefs()); | 714 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 633 backend.Init(); | 715 InitNativeBackend(&backend); |
| 634 | 716 |
| 635 // Trigger the migration by looking something up. | 717 // Trigger the migration by looking something up. |
| 636 std::vector<PasswordForm*> form_list; | 718 std::vector<PasswordForm*> form_list; |
| 637 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 719 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 638 base::IgnoreReturn<bool>(base::Bind( | 720 base::IgnoreReturn<bool>(base::Bind( |
| 639 &NativeBackendGnome::GetAutofillableLogins, | 721 &NativeBackendGnome::GetAutofillableLogins, |
| 640 base::Unretained(&backend), &form_list))); | 722 base::Unretained(&backend), &form_list))); |
| 641 | 723 |
| 642 RunBothThreads(); | 724 RunAllThreads(); |
| 643 | 725 |
| 644 // Quick check that we got something back. | 726 // Quick check that we got something back. |
| 645 EXPECT_EQ(1u, form_list.size()); | 727 EXPECT_EQ(1u, form_list.size()); |
| 646 STLDeleteElements(&form_list); | 728 STLDeleteElements(&form_list); |
| 647 } | 729 } |
| 648 | 730 |
| 649 EXPECT_EQ(2u, mock_keyring_items.size()); | 731 EXPECT_EQ(2u, mock_keyring_items.size()); |
| 650 if (mock_keyring_items.size() > 0) | 732 if (mock_keyring_items.size() > 0) |
| 651 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 733 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 652 if (mock_keyring_items.size() > 1) | 734 if (mock_keyring_items.size() > 1) |
| 653 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); | 735 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); |
| 654 | 736 |
| 655 // Check that we have set the persistent preference. | 737 // Check that we have set the persistent preference. |
| 656 EXPECT_TRUE( | 738 EXPECT_TRUE( |
| 657 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); | 739 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); |
| 658 } | 740 } |
| 659 | 741 |
| 660 TEST_F(NativeBackendGnomeTest, MigrateToMultipleProfiles) { | 742 TEST_F(NativeBackendGnomeTest, MigrateToMultipleProfiles) { |
| 661 // Reject attempts to migrate so we can populate the store. | 743 // Reject attempts to migrate so we can populate the store. |
| 662 mock_keyring_reject_local_ids = true; | 744 mock_keyring_reject_local_ids = true; |
| 663 | 745 |
| 664 { | 746 { |
| 665 NativeBackendGnome backend(42, profile_.GetPrefs()); | 747 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 666 backend.Init(); | 748 InitNativeBackend(&backend); |
| 667 | 749 |
| 668 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 750 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 669 base::IgnoreReturn<bool>(base::Bind( | 751 base::IgnoreReturn<bool>(base::Bind( |
| 670 &NativeBackendGnome::AddLogin, | 752 &NativeBackendGnome::AddLogin, |
| 671 base::Unretained(&backend), form_google_))); | 753 base::Unretained(&backend), form_google_))); |
| 672 | 754 |
| 673 RunBothThreads(); | 755 RunAllThreads(); |
| 674 } | 756 } |
| 675 | 757 |
| 676 EXPECT_EQ(1u, mock_keyring_items.size()); | 758 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 677 if (mock_keyring_items.size() > 0) | 759 if (mock_keyring_items.size() > 0) |
| 678 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 760 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 679 | 761 |
| 680 // Now allow the migration. | 762 // Now allow the migration. |
| 681 mock_keyring_reject_local_ids = false; | 763 mock_keyring_reject_local_ids = false; |
| 682 | 764 |
| 683 { | 765 { |
| 684 NativeBackendGnome backend(42, profile_.GetPrefs()); | 766 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 685 backend.Init(); | 767 InitNativeBackend(&backend); |
| 686 | 768 |
| 687 // Trigger the migration by looking something up. | 769 // Trigger the migration by looking something up. |
| 688 std::vector<PasswordForm*> form_list; | 770 std::vector<PasswordForm*> form_list; |
| 689 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 771 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 690 base::IgnoreReturn<bool>(base::Bind( | 772 base::IgnoreReturn<bool>(base::Bind( |
| 691 &NativeBackendGnome::GetAutofillableLogins, | 773 &NativeBackendGnome::GetAutofillableLogins, |
| 692 base::Unretained(&backend), &form_list))); | 774 base::Unretained(&backend), &form_list))); |
| 693 | 775 |
| 694 RunBothThreads(); | 776 RunAllThreads(); |
| 695 | 777 |
| 696 // Quick check that we got something back. | 778 // Quick check that we got something back. |
| 697 EXPECT_EQ(1u, form_list.size()); | 779 EXPECT_EQ(1u, form_list.size()); |
| 698 STLDeleteElements(&form_list); | 780 STLDeleteElements(&form_list); |
| 699 } | 781 } |
| 700 | 782 |
| 701 EXPECT_EQ(2u, mock_keyring_items.size()); | 783 EXPECT_EQ(2u, mock_keyring_items.size()); |
| 702 if (mock_keyring_items.size() > 0) | 784 if (mock_keyring_items.size() > 0) |
| 703 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 785 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 704 if (mock_keyring_items.size() > 1) | 786 if (mock_keyring_items.size() > 1) |
| 705 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); | 787 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); |
| 706 | 788 |
| 707 // Check that we have set the persistent preference. | 789 // Check that we have set the persistent preference. |
| 708 EXPECT_TRUE( | 790 EXPECT_TRUE( |
| 709 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); | 791 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); |
| 710 | 792 |
| 711 // Normally we'd actually have a different profile. But in the test just reset | 793 // Normally we'd actually have a different profile. But in the test just reset |
| 712 // the profile's persistent pref; we pass in the local profile id anyway. | 794 // the profile's persistent pref; we pass in the local profile id anyway. |
| 713 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, false); | 795 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, false); |
| 714 | 796 |
| 715 { | 797 { |
| 716 NativeBackendGnome backend(24, profile_.GetPrefs()); | 798 NativeBackendGnome backend(24, profile_.GetPrefs()); |
| 717 backend.Init(); | 799 InitNativeBackend(&backend); |
| 718 | 800 |
| 719 // Trigger the migration by looking something up. | 801 // Trigger the migration by looking something up. |
| 720 std::vector<PasswordForm*> form_list; | 802 std::vector<PasswordForm*> form_list; |
| 721 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 803 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 722 base::IgnoreReturn<bool>(base::Bind( | 804 base::IgnoreReturn<bool>(base::Bind( |
| 723 &NativeBackendGnome::GetAutofillableLogins, | 805 &NativeBackendGnome::GetAutofillableLogins, |
| 724 base::Unretained(&backend), &form_list))); | 806 base::Unretained(&backend), &form_list))); |
| 725 | 807 |
| 726 RunBothThreads(); | 808 RunAllThreads(); |
| 727 | 809 |
| 728 // Quick check that we got something back. | 810 // Quick check that we got something back. |
| 729 EXPECT_EQ(1u, form_list.size()); | 811 EXPECT_EQ(1u, form_list.size()); |
| 730 STLDeleteElements(&form_list); | 812 STLDeleteElements(&form_list); |
| 731 } | 813 } |
| 732 | 814 |
| 733 EXPECT_EQ(3u, mock_keyring_items.size()); | 815 EXPECT_EQ(3u, mock_keyring_items.size()); |
| 734 if (mock_keyring_items.size() > 0) | 816 if (mock_keyring_items.size() > 0) |
| 735 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 817 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 736 if (mock_keyring_items.size() > 1) | 818 if (mock_keyring_items.size() > 1) |
| 737 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); | 819 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); |
| 738 if (mock_keyring_items.size() > 2) | 820 if (mock_keyring_items.size() > 2) |
| 739 CheckMockKeyringItem(&mock_keyring_items[2], form_google_, "chrome-24"); | 821 CheckMockKeyringItem(&mock_keyring_items[2], form_google_, "chrome-24"); |
| 740 } | 822 } |
| 741 | 823 |
| 742 TEST_F(NativeBackendGnomeTest, NoMigrationWithPrefSet) { | 824 TEST_F(NativeBackendGnomeTest, NoMigrationWithPrefSet) { |
| 743 // Reject attempts to migrate so we can populate the store. | 825 // Reject attempts to migrate so we can populate the store. |
| 744 mock_keyring_reject_local_ids = true; | 826 mock_keyring_reject_local_ids = true; |
| 745 | 827 |
| 746 { | 828 { |
| 747 NativeBackendGnome backend(42, profile_.GetPrefs()); | 829 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 748 backend.Init(); | 830 InitNativeBackend(&backend); |
| 749 | 831 |
| 750 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 832 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 751 base::IgnoreReturn<bool>(base::Bind( | 833 base::IgnoreReturn<bool>(base::Bind( |
| 752 &NativeBackendGnome::AddLogin, | 834 &NativeBackendGnome::AddLogin, |
| 753 base::Unretained(&backend), form_google_))); | 835 base::Unretained(&backend), form_google_))); |
| 754 | 836 |
| 755 RunBothThreads(); | 837 RunAllThreads(); |
| 756 } | 838 } |
| 757 | 839 |
| 758 EXPECT_EQ(1u, mock_keyring_items.size()); | 840 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 759 if (mock_keyring_items.size() > 0) | 841 if (mock_keyring_items.size() > 0) |
| 760 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 842 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 761 | 843 |
| 762 // Now allow migration, but also pretend that the it has already taken place. | 844 // Now allow migration, but also pretend that the it has already taken place. |
| 763 mock_keyring_reject_local_ids = false; | 845 mock_keyring_reject_local_ids = false; |
| 764 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); | 846 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, true); |
| 765 | 847 |
| 766 { | 848 { |
| 767 NativeBackendGnome backend(42, profile_.GetPrefs()); | 849 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 768 backend.Init(); | 850 InitNativeBackend(&backend); |
| 769 | 851 |
| 770 // Trigger the migration by adding a new login. | 852 // Trigger the migration by adding a new login. |
| 771 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 853 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 772 base::IgnoreReturn<bool>(base::Bind( | 854 base::IgnoreReturn<bool>(base::Bind( |
| 773 &NativeBackendGnome::AddLogin, | 855 &NativeBackendGnome::AddLogin, |
| 774 base::Unretained(&backend), form_isc_))); | 856 base::Unretained(&backend), form_isc_))); |
| 775 | 857 |
| 776 // Look up all logins; we expect only the one we added. | 858 // Look up all logins; we expect only the one we added. |
| 777 std::vector<PasswordForm*> form_list; | 859 std::vector<PasswordForm*> form_list; |
| 778 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 860 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 779 base::IgnoreReturn<bool>(base::Bind( | 861 base::IgnoreReturn<bool>(base::Bind( |
| 780 &NativeBackendGnome::GetAutofillableLogins, | 862 &NativeBackendGnome::GetAutofillableLogins, |
| 781 base::Unretained(&backend), &form_list))); | 863 base::Unretained(&backend), &form_list))); |
| 782 | 864 |
| 783 RunBothThreads(); | 865 RunAllThreads(); |
| 784 | 866 |
| 785 // Quick check that we got the right thing back. | 867 // Quick check that we got the right thing back. |
| 786 EXPECT_EQ(1u, form_list.size()); | 868 EXPECT_EQ(1u, form_list.size()); |
| 787 if (form_list.size() > 0) | 869 if (form_list.size() > 0) |
| 788 EXPECT_EQ(form_isc_.signon_realm, form_list[0]->signon_realm); | 870 EXPECT_EQ(form_isc_.signon_realm, form_list[0]->signon_realm); |
| 789 STLDeleteElements(&form_list); | 871 STLDeleteElements(&form_list); |
| 790 } | 872 } |
| 791 | 873 |
| 792 EXPECT_EQ(2u, mock_keyring_items.size()); | 874 EXPECT_EQ(2u, mock_keyring_items.size()); |
| 793 if (mock_keyring_items.size() > 0) | 875 if (mock_keyring_items.size() > 0) |
| 794 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 876 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 795 if (mock_keyring_items.size() > 1) | 877 if (mock_keyring_items.size() > 1) |
| 796 CheckMockKeyringItem(&mock_keyring_items[1], form_isc_, "chrome-42"); | 878 CheckMockKeyringItem(&mock_keyring_items[1], form_isc_, "chrome-42"); |
| 797 } | 879 } |
| 798 | 880 |
| 799 TEST_F(NativeBackendGnomeTest, DeleteMigratedPasswordIsIsolated) { | 881 TEST_F(NativeBackendGnomeTest, DeleteMigratedPasswordIsIsolated) { |
| 800 // Reject attempts to migrate so we can populate the store. | 882 // Reject attempts to migrate so we can populate the store. |
| 801 mock_keyring_reject_local_ids = true; | 883 mock_keyring_reject_local_ids = true; |
| 802 | 884 |
| 803 { | 885 { |
| 804 NativeBackendGnome backend(42, profile_.GetPrefs()); | 886 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 805 backend.Init(); | 887 InitNativeBackend(&backend); |
| 806 | 888 |
| 807 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 889 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 808 base::IgnoreReturn<bool>(base::Bind( | 890 base::IgnoreReturn<bool>(base::Bind( |
| 809 &NativeBackendGnome::AddLogin, | 891 &NativeBackendGnome::AddLogin, |
| 810 base::Unretained(&backend), form_google_))); | 892 base::Unretained(&backend), form_google_))); |
| 811 | 893 |
| 812 RunBothThreads(); | 894 RunAllThreads(); |
| 813 } | 895 } |
| 814 | 896 |
| 815 EXPECT_EQ(1u, mock_keyring_items.size()); | 897 EXPECT_EQ(1u, mock_keyring_items.size()); |
| 816 if (mock_keyring_items.size() > 0) | 898 if (mock_keyring_items.size() > 0) |
| 817 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 899 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 818 | 900 |
| 819 // Now allow the migration. | 901 // Now allow the migration. |
| 820 mock_keyring_reject_local_ids = false; | 902 mock_keyring_reject_local_ids = false; |
| 821 | 903 |
| 822 { | 904 { |
| 823 NativeBackendGnome backend(42, profile_.GetPrefs()); | 905 NativeBackendGnome backend(42, profile_.GetPrefs()); |
| 824 backend.Init(); | 906 InitNativeBackend(&backend); |
| 825 | 907 |
| 826 // Trigger the migration by looking something up. | 908 // Trigger the migration by looking something up. |
| 827 std::vector<PasswordForm*> form_list; | 909 std::vector<PasswordForm*> form_list; |
| 828 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 910 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 829 base::IgnoreReturn<bool>(base::Bind( | 911 base::IgnoreReturn<bool>(base::Bind( |
| 830 &NativeBackendGnome::GetAutofillableLogins, | 912 &NativeBackendGnome::GetAutofillableLogins, |
| 831 base::Unretained(&backend), &form_list))); | 913 base::Unretained(&backend), &form_list))); |
| 832 | 914 |
| 833 RunBothThreads(); | 915 RunAllThreads(); |
| 834 | 916 |
| 835 // Quick check that we got something back. | 917 // Quick check that we got something back. |
| 836 EXPECT_EQ(1u, form_list.size()); | 918 EXPECT_EQ(1u, form_list.size()); |
| 837 STLDeleteElements(&form_list); | 919 STLDeleteElements(&form_list); |
| 838 } | 920 } |
| 839 | 921 |
| 840 EXPECT_EQ(2u, mock_keyring_items.size()); | 922 EXPECT_EQ(2u, mock_keyring_items.size()); |
| 841 if (mock_keyring_items.size() > 0) | 923 if (mock_keyring_items.size() > 0) |
| 842 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 924 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 843 if (mock_keyring_items.size() > 1) | 925 if (mock_keyring_items.size() > 1) |
| 844 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); | 926 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); |
| 845 | 927 |
| 846 // Check that we have set the persistent preference. | 928 // Check that we have set the persistent preference. |
| 847 EXPECT_TRUE( | 929 EXPECT_TRUE( |
| 848 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); | 930 profile_.GetPrefs()->GetBoolean(prefs::kPasswordsUseLocalProfileId)); |
| 849 | 931 |
| 850 // Normally we'd actually have a different profile. But in the test just reset | 932 // Normally we'd actually have a different profile. But in the test just reset |
| 851 // the profile's persistent pref; we pass in the local profile id anyway. | 933 // the profile's persistent pref; we pass in the local profile id anyway. |
| 852 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, false); | 934 profile_.GetPrefs()->SetBoolean(prefs::kPasswordsUseLocalProfileId, false); |
| 853 | 935 |
| 854 { | 936 { |
| 855 NativeBackendGnome backend(24, profile_.GetPrefs()); | 937 NativeBackendGnome backend(24, profile_.GetPrefs()); |
| 856 backend.Init(); | 938 InitNativeBackend(&backend); |
| 857 | 939 |
| 858 // Trigger the migration by looking something up. | 940 // Trigger the migration by looking something up. |
| 859 std::vector<PasswordForm*> form_list; | 941 std::vector<PasswordForm*> form_list; |
| 860 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 942 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 861 base::IgnoreReturn<bool>(base::Bind( | 943 base::IgnoreReturn<bool>(base::Bind( |
| 862 &NativeBackendGnome::GetAutofillableLogins, | 944 &NativeBackendGnome::GetAutofillableLogins, |
| 863 base::Unretained(&backend), &form_list))); | 945 base::Unretained(&backend), &form_list))); |
| 864 | 946 |
| 865 RunBothThreads(); | 947 RunAllThreads(); |
| 866 | 948 |
| 867 // Quick check that we got something back. | 949 // Quick check that we got something back. |
| 868 EXPECT_EQ(1u, form_list.size()); | 950 EXPECT_EQ(1u, form_list.size()); |
| 869 STLDeleteElements(&form_list); | 951 STLDeleteElements(&form_list); |
| 870 | 952 |
| 871 // There should be three passwords now. | 953 // There should be three passwords now. |
| 872 EXPECT_EQ(3u, mock_keyring_items.size()); | 954 EXPECT_EQ(3u, mock_keyring_items.size()); |
| 873 if (mock_keyring_items.size() > 0) | 955 if (mock_keyring_items.size() > 0) |
| 874 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 956 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 875 if (mock_keyring_items.size() > 1) | 957 if (mock_keyring_items.size() > 1) |
| 876 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); | 958 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); |
| 877 if (mock_keyring_items.size() > 2) | 959 if (mock_keyring_items.size() > 2) |
| 878 CheckMockKeyringItem(&mock_keyring_items[2], form_google_, "chrome-24"); | 960 CheckMockKeyringItem(&mock_keyring_items[2], form_google_, "chrome-24"); |
| 879 | 961 |
| 880 // Now delete the password from this second profile. | 962 // Now delete the password from this second profile. |
| 881 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, | 963 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, |
| 882 base::IgnoreReturn<bool>(base::Bind( | 964 base::IgnoreReturn<bool>(base::Bind( |
| 883 &NativeBackendGnome::RemoveLogin, | 965 &NativeBackendGnome::RemoveLogin, |
| 884 base::Unretained(&backend), form_google_))); | 966 base::Unretained(&backend), form_google_))); |
| 885 | 967 |
| 886 RunBothThreads(); | 968 RunAllThreads(); |
| 887 | 969 |
| 888 // The other two copies of the password in different profiles should remain. | 970 // The other two copies of the password in different profiles should remain. |
| 889 EXPECT_EQ(2u, mock_keyring_items.size()); | 971 EXPECT_EQ(2u, mock_keyring_items.size()); |
| 890 if (mock_keyring_items.size() > 0) | 972 if (mock_keyring_items.size() > 0) |
| 891 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); | 973 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome"); |
| 892 if (mock_keyring_items.size() > 1) | 974 if (mock_keyring_items.size() > 1) |
| 893 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); | 975 CheckMockKeyringItem(&mock_keyring_items[1], form_google_, "chrome-42"); |
| 894 } | 976 } |
| 895 } | 977 } |
| OLD | NEW |