OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdarg.h> | 5 #include <stdarg.h> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/prefs/pref_service.h" | 8 #include "base/prefs/pref_service.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "base/strings/utf_string_conversions.h" | 12 #include "base/strings/utf_string_conversions.h" |
13 #include "base/time/time.h" | 13 #include "base/time/time.h" |
14 #include "chrome/browser/password_manager/native_backend_gnome_x.h" | 14 #include "chrome/browser/password_manager/native_backend_gnome_x.h" |
15 #include "chrome/test/base/testing_profile.h" | 15 #include "chrome/test/base/testing_profile.h" |
16 #include "components/autofill/core/common/password_form.h" | 16 #include "components/autofill/core/common/password_form.h" |
17 #include "components/password_manager/core/browser/psl_matching_helper.h" | 17 #include "components/password_manager/core/browser/psl_matching_helper.h" |
18 #include "components/password_manager/core/common/password_manager_pref_names.h" | 18 #include "components/password_manager/core/common/password_manager_pref_names.h" |
19 #include "content/public/test/test_browser_thread.h" | 19 #include "content/public/test/test_browser_thread.h" |
20 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
21 | 21 |
22 using autofill::PasswordForm; | 22 using autofill::PasswordForm; |
23 using base::UTF8ToUTF16; | 23 using base::UTF8ToUTF16; |
24 using base::UTF16ToUTF8; | 24 using base::UTF16ToUTF8; |
25 using content::BrowserThread; | 25 using content::BrowserThread; |
| 26 using password_manager::PasswordStoreChange; |
| 27 using password_manager::PasswordStoreChangeList; |
26 | 28 |
27 namespace { | 29 namespace { |
28 | 30 |
29 // What follows is a very simple implementation of the subset of the GNOME | 31 // What follows is a very simple implementation of the subset of the GNOME |
30 // Keyring API that we actually use. It gets substituted for the real one by | 32 // Keyring API that we actually use. It gets substituted for the real one by |
31 // MockGnomeKeyringLoader, which hooks into the facility normally used to load | 33 // MockGnomeKeyringLoader, which hooks into the facility normally used to load |
32 // the GNOME Keyring library at runtime to avoid a static dependency on it. | 34 // the GNOME Keyring library at runtime to avoid a static dependency on it. |
33 | 35 |
34 struct MockKeyringItem { | 36 struct MockKeyringItem { |
35 MockKeyringItem() {} | 37 MockKeyringItem() {} |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 GNOME_KEYRING_FOR_EACH_MOCKED_FUNC(GNOME_KEYRING_ASSIGN_POINTER) | 273 GNOME_KEYRING_FOR_EACH_MOCKED_FUNC(GNOME_KEYRING_ASSIGN_POINTER) |
272 #undef GNOME_KEYRING_ASSIGN_POINTER | 274 #undef GNOME_KEYRING_ASSIGN_POINTER |
273 keyring_loaded = true; | 275 keyring_loaded = true; |
274 // Reset the state of the mock library. | 276 // Reset the state of the mock library. |
275 mock_keyring_items.clear(); | 277 mock_keyring_items.clear(); |
276 mock_keyring_reject_local_ids = false; | 278 mock_keyring_reject_local_ids = false; |
277 return true; | 279 return true; |
278 } | 280 } |
279 }; | 281 }; |
280 | 282 |
| 283 void CheckPasswordChanges(const PasswordStoreChangeList& expected_list, |
| 284 const PasswordStoreChangeList& actual_list) { |
| 285 ASSERT_EQ(expected_list.size(), actual_list.size()); |
| 286 for (size_t i = 0; i < expected_list.size(); ++i) { |
| 287 EXPECT_EQ(expected_list[i].type(), actual_list[i].type()); |
| 288 const PasswordForm& expected = expected_list[i].form(); |
| 289 const PasswordForm& actual = actual_list[i].form(); |
| 290 |
| 291 EXPECT_EQ(expected.origin, actual.origin); |
| 292 EXPECT_EQ(expected.password_value, actual.password_value); |
| 293 EXPECT_EQ(expected.action, actual.action); |
| 294 EXPECT_EQ(expected.username_element, actual.username_element); |
| 295 EXPECT_EQ(expected.username_value, actual.username_value); |
| 296 EXPECT_EQ(expected.password_element, actual.password_element); |
| 297 EXPECT_EQ(expected.submit_element, actual.submit_element); |
| 298 EXPECT_EQ(expected.signon_realm, actual.signon_realm); |
| 299 EXPECT_EQ(expected.ssl_valid, actual.ssl_valid); |
| 300 EXPECT_EQ(expected.preferred, actual.preferred); |
| 301 // We don't check the date created. It varies due to bug in the |
| 302 // serialization. Integer seconds are saved instead of microseconds. |
| 303 EXPECT_EQ(expected.blacklisted_by_user, actual.blacklisted_by_user); |
| 304 EXPECT_EQ(expected.type, actual.type); |
| 305 EXPECT_EQ(expected.times_used, actual.times_used); |
| 306 EXPECT_EQ(expected.scheme, actual.scheme); |
| 307 } |
| 308 } |
| 309 |
281 } // anonymous namespace | 310 } // anonymous namespace |
282 | 311 |
283 class NativeBackendGnomeTest : public testing::Test { | 312 class NativeBackendGnomeTest : public testing::Test { |
284 protected: | 313 protected: |
285 enum UpdateType { // Used in CheckPSLUpdate(). | 314 enum UpdateType { // Used in CheckPSLUpdate(). |
286 UPDATE_BY_UPDATELOGIN, | 315 UPDATE_BY_UPDATELOGIN, |
287 UPDATE_BY_ADDLOGIN, | 316 UPDATE_BY_ADDLOGIN, |
288 }; | 317 }; |
289 | 318 |
290 NativeBackendGnomeTest() | 319 NativeBackendGnomeTest() |
291 : ui_thread_(BrowserThread::UI, &message_loop_), | 320 : ui_thread_(BrowserThread::UI, &message_loop_), |
292 db_thread_(BrowserThread::DB) { | 321 db_thread_(BrowserThread::DB) { |
293 } | 322 } |
294 | 323 |
295 virtual void SetUp() { | 324 virtual void SetUp() { |
296 ASSERT_TRUE(db_thread_.Start()); | 325 ASSERT_TRUE(db_thread_.Start()); |
297 | 326 |
298 ASSERT_TRUE(MockGnomeKeyringLoader::LoadMockGnomeKeyring()); | 327 ASSERT_TRUE(MockGnomeKeyringLoader::LoadMockGnomeKeyring()); |
299 | 328 |
300 form_google_.origin = GURL("http://www.google.com/"); | 329 form_google_.origin = GURL("http://www.google.com/"); |
301 form_google_.action = GURL("http://www.google.com/login"); | 330 form_google_.action = GURL("http://www.google.com/login"); |
302 form_google_.username_element = UTF8ToUTF16("user"); | 331 form_google_.username_element = UTF8ToUTF16("user"); |
303 form_google_.username_value = UTF8ToUTF16("joeschmoe"); | 332 form_google_.username_value = UTF8ToUTF16("joeschmoe"); |
304 form_google_.password_element = UTF8ToUTF16("pass"); | 333 form_google_.password_element = UTF8ToUTF16("pass"); |
305 form_google_.password_value = UTF8ToUTF16("seekrit"); | 334 form_google_.password_value = UTF8ToUTF16("seekrit"); |
306 form_google_.submit_element = UTF8ToUTF16("submit"); | 335 form_google_.submit_element = UTF8ToUTF16("submit"); |
307 form_google_.signon_realm = "http://www.google.com/"; | 336 form_google_.signon_realm = "http://www.google.com/"; |
308 form_google_.type = PasswordForm::TYPE_GENERATED; | 337 form_google_.type = PasswordForm::TYPE_GENERATED; |
| 338 form_google_.date_created = base::Time::Now(); |
309 | 339 |
310 form_facebook_.origin = GURL("http://www.facebook.com/"); | 340 form_facebook_.origin = GURL("http://www.facebook.com/"); |
311 form_facebook_.action = GURL("http://www.facebook.com/login"); | 341 form_facebook_.action = GURL("http://www.facebook.com/login"); |
312 form_facebook_.username_element = UTF8ToUTF16("user"); | 342 form_facebook_.username_element = UTF8ToUTF16("user"); |
313 form_facebook_.username_value = UTF8ToUTF16("a"); | 343 form_facebook_.username_value = UTF8ToUTF16("a"); |
314 form_facebook_.password_element = UTF8ToUTF16("password"); | 344 form_facebook_.password_element = UTF8ToUTF16("password"); |
315 form_facebook_.password_value = UTF8ToUTF16("b"); | 345 form_facebook_.password_value = UTF8ToUTF16("b"); |
316 form_facebook_.submit_element = UTF8ToUTF16("submit"); | 346 form_facebook_.submit_element = UTF8ToUTF16("submit"); |
317 form_facebook_.signon_realm = "http://www.facebook.com/"; | 347 form_facebook_.signon_realm = "http://www.facebook.com/"; |
| 348 form_facebook_.date_created = base::Time::Now(); |
318 | 349 |
319 form_isc_.origin = GURL("http://www.isc.org/"); | 350 form_isc_.origin = GURL("http://www.isc.org/"); |
320 form_isc_.action = GURL("http://www.isc.org/auth"); | 351 form_isc_.action = GURL("http://www.isc.org/auth"); |
321 form_isc_.username_element = UTF8ToUTF16("id"); | 352 form_isc_.username_element = UTF8ToUTF16("id"); |
322 form_isc_.username_value = UTF8ToUTF16("janedoe"); | 353 form_isc_.username_value = UTF8ToUTF16("janedoe"); |
323 form_isc_.password_element = UTF8ToUTF16("passwd"); | 354 form_isc_.password_element = UTF8ToUTF16("passwd"); |
324 form_isc_.password_value = UTF8ToUTF16("ihazabukkit"); | 355 form_isc_.password_value = UTF8ToUTF16("ihazabukkit"); |
325 form_isc_.submit_element = UTF8ToUTF16("login"); | 356 form_isc_.submit_element = UTF8ToUTF16("login"); |
326 form_isc_.signon_realm = "http://www.isc.org/"; | 357 form_isc_.signon_realm = "http://www.isc.org/"; |
| 358 form_isc_.date_created = base::Time::Now(); |
327 | 359 |
328 other_auth_.origin = GURL("http://www.example.com/"); | 360 other_auth_.origin = GURL("http://www.example.com/"); |
329 other_auth_.username_value = UTF8ToUTF16("username"); | 361 other_auth_.username_value = UTF8ToUTF16("username"); |
330 other_auth_.password_value = UTF8ToUTF16("pass"); | 362 other_auth_.password_value = UTF8ToUTF16("pass"); |
331 other_auth_.signon_realm = "http://www.example.com/Realm"; | 363 other_auth_.signon_realm = "http://www.example.com/Realm"; |
| 364 other_auth_.date_created = base::Time::Now(); |
332 } | 365 } |
333 | 366 |
334 virtual void TearDown() { | 367 virtual void TearDown() { |
335 base::MessageLoop::current()->PostTask(FROM_HERE, | 368 base::MessageLoop::current()->PostTask(FROM_HERE, |
336 base::MessageLoop::QuitClosure()); | 369 base::MessageLoop::QuitClosure()); |
337 base::MessageLoop::current()->Run(); | 370 base::MessageLoop::current()->Run(); |
338 db_thread_.Stop(); | 371 db_thread_.Stop(); |
339 } | 372 } |
340 | 373 |
341 void RunBothThreads() { | 374 void RunBothThreads() { |
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
795 | 828 |
796 EXPECT_EQ(1u, mock_keyring_items.size()); | 829 EXPECT_EQ(1u, mock_keyring_items.size()); |
797 if (mock_keyring_items.size() > 0) | 830 if (mock_keyring_items.size() > 0) |
798 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); | 831 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); |
799 } | 832 } |
800 | 833 |
801 TEST_F(NativeBackendGnomeTest, AddDuplicateLogin) { | 834 TEST_F(NativeBackendGnomeTest, AddDuplicateLogin) { |
802 NativeBackendGnome backend(42); | 835 NativeBackendGnome backend(42); |
803 backend.Init(); | 836 backend.Init(); |
804 | 837 |
805 BrowserThread::PostTask( | 838 PasswordStoreChangeList changes; |
| 839 changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD, |
| 840 form_google_)); |
| 841 BrowserThread::PostTaskAndReplyWithResult( |
806 BrowserThread::DB, FROM_HERE, | 842 BrowserThread::DB, FROM_HERE, |
807 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), | 843 base::Bind(&NativeBackendGnome::AddLogin, |
808 base::Unretained(&backend), form_google_)); | 844 base::Unretained(&backend), form_google_), |
809 BrowserThread::PostTask( | 845 base::Bind(&CheckPasswordChanges, changes)); |
| 846 |
| 847 changes.clear(); |
| 848 changes.push_back(PasswordStoreChange(PasswordStoreChange::REMOVE, |
| 849 form_google_)); |
| 850 form_google_.times_used++; |
| 851 changes.push_back(PasswordStoreChange(PasswordStoreChange::ADD, |
| 852 form_google_)); |
| 853 |
| 854 BrowserThread::PostTaskAndReplyWithResult( |
810 BrowserThread::DB, FROM_HERE, | 855 BrowserThread::DB, FROM_HERE, |
811 base::Bind(base::IgnoreResult(&NativeBackendGnome::AddLogin), | 856 base::Bind(&NativeBackendGnome::AddLogin, |
812 base::Unretained(&backend), form_google_)); | 857 base::Unretained(&backend), form_google_), |
| 858 base::Bind(&CheckPasswordChanges, changes)); |
813 | 859 |
814 RunBothThreads(); | 860 RunBothThreads(); |
815 | 861 |
816 EXPECT_EQ(1u, mock_keyring_items.size()); | 862 EXPECT_EQ(1u, mock_keyring_items.size()); |
817 if (mock_keyring_items.size() > 0) | 863 if (mock_keyring_items.size() > 0) |
818 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); | 864 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); |
819 } | 865 } |
820 | 866 |
821 TEST_F(NativeBackendGnomeTest, ListLoginsAppends) { | 867 TEST_F(NativeBackendGnomeTest, ListLoginsAppends) { |
822 NativeBackendGnome backend(42); | 868 NativeBackendGnome backend(42); |
(...skipping 22 matching lines...) Expand all Loading... |
845 // Quick check that we got two results back. | 891 // Quick check that we got two results back. |
846 EXPECT_EQ(2u, form_list.size()); | 892 EXPECT_EQ(2u, form_list.size()); |
847 STLDeleteElements(&form_list); | 893 STLDeleteElements(&form_list); |
848 | 894 |
849 EXPECT_EQ(1u, mock_keyring_items.size()); | 895 EXPECT_EQ(1u, mock_keyring_items.size()); |
850 if (mock_keyring_items.size() > 0) | 896 if (mock_keyring_items.size() > 0) |
851 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); | 897 CheckMockKeyringItem(&mock_keyring_items[0], form_google_, "chrome-42"); |
852 } | 898 } |
853 | 899 |
854 // TODO(mdm): add more basic tests here at some point. | 900 // TODO(mdm): add more basic tests here at some point. |
OLD | NEW |