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

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

Issue 951883005: Clean-up NativeBackendLibsecretTest (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2015 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_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 72
73 bool IsStringAttribute(const SecretSchema* schema, const std::string& name) { 73 bool IsStringAttribute(const SecretSchema* schema, const std::string& name) {
74 for (size_t i = 0; schema->attributes[i].name; ++i) 74 for (size_t i = 0; schema->attributes[i].name; ++i)
75 if (name == schema->attributes[i].name) 75 if (name == schema->attributes[i].name)
76 return schema->attributes[i].type == SECRET_SCHEMA_ATTRIBUTE_STRING; 76 return schema->attributes[i].type == SECRET_SCHEMA_ATTRIBUTE_STRING;
77 NOTREACHED() << "Requested type of nonexistent attribute"; 77 NOTREACHED() << "Requested type of nonexistent attribute";
78 return false; 78 return false;
79 } 79 }
80 80
81 // The list of all libsecret items we have stored. 81 // The list of all libsecret items we have stored.
82 std::vector<MockSecretItem*> global_mock_libsecret_items; 82 ScopedVector<MockSecretItem>* global_mock_libsecret_items;
83 bool global_mock_libsecret_reject_local_ids = false; 83 bool global_mock_libsecret_reject_local_ids = false;
84 84
85 void ClearMockObjects() {
86 for (size_t i = 0; i < global_mock_libsecret_items.size(); ++i)
87 delete global_mock_libsecret_items[i];
88 global_mock_libsecret_items.clear();
89 }
90
91 gboolean mock_secret_password_store_sync(const SecretSchema* schema, 85 gboolean mock_secret_password_store_sync(const SecretSchema* schema,
92 const gchar* collection, 86 const gchar* collection,
93 const gchar* label, 87 const gchar* label,
94 const gchar* password, 88 const gchar* password,
95 GCancellable* cancellable, 89 GCancellable* cancellable,
96 GError** error, 90 GError** error,
97 ...) { 91 ...) {
98 GHashTable* attributes = 92 GHashTable* attributes =
99 g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); 93 g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
100 va_list ap; 94 va_list ap;
101 va_start(ap, error); 95 va_start(ap, error);
102 char* name; 96 char* name;
103 while ((name = va_arg(ap, gchar*))) { 97 while ((name = va_arg(ap, gchar*))) {
104 char* value; 98 char* value;
105 if (IsStringAttribute(schema, name)) { 99 if (IsStringAttribute(schema, name)) {
106 value = g_strdup(va_arg(ap, gchar*)); 100 value = g_strdup(va_arg(ap, gchar*));
107 VLOG(1) << "Adding item attribute " << name << ", value '" << value 101 VLOG(1) << "Adding item attribute " << name << ", value '" << value
108 << "'"; 102 << "'";
109 } else { 103 } else {
110 uint32_t intvalue = va_arg(ap, uint32_t); 104 uint32_t intvalue = va_arg(ap, uint32_t);
111 VLOG(1) << "Adding item attribute " << name << ", value " << intvalue; 105 VLOG(1) << "Adding item attribute " << name << ", value " << intvalue;
112 value = g_strdup_printf("%u", intvalue); 106 value = g_strdup_printf("%u", intvalue);
113 } 107 }
114 g_hash_table_insert(attributes, g_strdup(name), value); 108 g_hash_table_insert(attributes, g_strdup(name), value);
115 } 109 }
116 va_end(ap); 110 va_end(ap);
117 MockSecretValue* secret_value = new MockSecretValue(g_strdup(password)); 111 MockSecretValue* secret_value = new MockSecretValue(g_strdup(password));
118 MockSecretItem* item = new MockSecretItem(secret_value, attributes); 112 MockSecretItem* item = new MockSecretItem(secret_value, attributes);
119 global_mock_libsecret_items.push_back(item); 113 global_mock_libsecret_items->push_back(item);
120 return true; 114 return true;
121 } 115 }
122 116
123 GList* mock_secret_service_search_sync(SecretService* service, 117 GList* mock_secret_service_search_sync(SecretService* service,
124 const SecretSchema* schema, 118 const SecretSchema* schema,
125 GHashTable* attributes, 119 GHashTable* attributes,
126 SecretSearchFlags flags, 120 SecretSearchFlags flags,
127 GCancellable* cancellable, 121 GCancellable* cancellable,
128 GError** error) { 122 GError** error) {
129 GList* result = nullptr; 123 GList* result = nullptr;
130 for (uint32_t i = 0; i < global_mock_libsecret_items.size(); ++i) { 124 for (MockSecretItem* item : *global_mock_libsecret_items) {
131 if (Matches(global_mock_libsecret_items[i], attributes)) 125 if (Matches(item, attributes))
132 result = g_list_append(result, global_mock_libsecret_items[i]); 126 result = g_list_append(result, item);
133 } 127 }
134 return result; 128 return result;
135 } 129 }
136 130
137 gboolean mock_secret_password_clear_sync(const SecretSchema* schema, 131 gboolean mock_secret_password_clear_sync(const SecretSchema* schema,
138 GCancellable* cancellable, 132 GCancellable* cancellable,
139 GError** error, 133 GError** error,
140 ...) { 134 ...) {
141 GHashTable* attributes = 135 GHashTable* attributes =
142 g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); 136 g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
143 va_list ap; 137 va_list ap;
144 va_start(ap, error); 138 va_start(ap, error);
145 char* name; 139 char* name;
146 while ((name = va_arg(ap, gchar*))) { 140 while ((name = va_arg(ap, gchar*))) {
147 char* value; 141 char* value;
148 if (IsStringAttribute(schema, name)) { 142 if (IsStringAttribute(schema, name)) {
149 value = g_strdup(va_arg(ap, gchar*)); 143 value = g_strdup(va_arg(ap, gchar*));
150 VLOG(1) << "Adding item attribute " << name << ", value '" << value 144 VLOG(1) << "Adding item attribute " << name << ", value '" << value
151 << "'"; 145 << "'";
152 } else { 146 } else {
153 uint32_t intvalue = va_arg(ap, uint32_t); 147 uint32_t intvalue = va_arg(ap, uint32_t);
154 VLOG(1) << "Adding item attribute " << name << ", value " << intvalue; 148 VLOG(1) << "Adding item attribute " << name << ", value " << intvalue;
155 value = g_strdup_printf("%u", intvalue); 149 value = g_strdup_printf("%u", intvalue);
156 } 150 }
157 g_hash_table_insert(attributes, g_strdup(name), value); 151 g_hash_table_insert(attributes, g_strdup(name), value);
158 } 152 }
159 va_end(ap); 153 va_end(ap);
160 for (uint32_t i = 0; i < global_mock_libsecret_items.size();) 154 for (uint32_t i = 0; i < global_mock_libsecret_items->size();)
161 if (Matches(global_mock_libsecret_items[i], attributes)) { 155 if (Matches((*global_mock_libsecret_items)[i], attributes)) {
162 delete global_mock_libsecret_items[i]; 156 global_mock_libsecret_items->erase(global_mock_libsecret_items->begin() +
163 global_mock_libsecret_items.erase(global_mock_libsecret_items.begin() + 157 i);
164 i);
165 } else { 158 } else {
166 ++i; 159 ++i;
167 } 160 }
168 g_hash_table_unref(attributes); 161 g_hash_table_unref(attributes);
169 return true; 162 return true;
170 } 163 }
171 164
172 MockSecretValue* mock_secret_item_get_secret(MockSecretItem* self) { 165 MockSecretValue* mock_secret_item_get_secret(MockSecretItem* self) {
173 return self->value; 166 return self->value;
174 } 167 }
(...skipping 30 matching lines...) Expand all
205 secret_value_get_text = 198 secret_value_get_text =
206 (decltype(&::secret_value_get_text)) & mock_secret_value_get_text; 199 (decltype(&::secret_value_get_text)) & mock_secret_value_get_text;
207 secret_item_get_attributes = (decltype(&::secret_item_get_attributes)) & 200 secret_item_get_attributes = (decltype(&::secret_item_get_attributes)) &
208 mock_secret_item_get_attributes; 201 mock_secret_item_get_attributes;
209 secret_item_load_secret_sync = (decltype(&::secret_item_load_secret_sync)) & 202 secret_item_load_secret_sync = (decltype(&::secret_item_load_secret_sync)) &
210 mock_secret_item_load_secret_sync; 203 mock_secret_item_load_secret_sync;
211 secret_value_unref = 204 secret_value_unref =
212 (decltype(&::secret_value_unref)) & mock_secret_value_unref; 205 (decltype(&::secret_value_unref)) & mock_secret_value_unref;
213 libsecret_loaded = true; 206 libsecret_loaded = true;
214 // Reset the state of the mock library. 207 // Reset the state of the mock library.
215 ClearMockObjects(); 208 global_mock_libsecret_items->clear();
216 global_mock_libsecret_reject_local_ids = false; 209 global_mock_libsecret_reject_local_ids = false;
217 return true; 210 return true;
218 } 211 }
219 }; 212 };
220 213
221 void CheckPasswordChanges(const PasswordStoreChangeList& expected_list, 214 void CheckPasswordChanges(const PasswordStoreChangeList& expected_list,
222 const PasswordStoreChangeList& actual_list) { 215 const PasswordStoreChangeList& actual_list) {
223 ASSERT_EQ(expected_list.size(), actual_list.size()); 216 ASSERT_EQ(expected_list.size(), actual_list.size());
224 for (size_t i = 0; i < expected_list.size(); ++i) { 217 for (size_t i = 0; i < expected_list.size(); ++i) {
225 EXPECT_EQ(expected_list[i].type(), actual_list[i].type()); 218 EXPECT_EQ(expected_list[i].type(), actual_list[i].type());
(...skipping 18 matching lines...) Expand all
244 EXPECT_EQ(expected.date_synced, actual.date_synced); 237 EXPECT_EQ(expected.date_synced, actual.date_synced);
245 EXPECT_EQ(expected.display_name, actual.display_name); 238 EXPECT_EQ(expected.display_name, actual.display_name);
246 EXPECT_EQ(expected.avatar_url, actual.avatar_url); 239 EXPECT_EQ(expected.avatar_url, actual.avatar_url);
247 EXPECT_EQ(expected.federation_url, actual.federation_url); 240 EXPECT_EQ(expected.federation_url, actual.federation_url);
248 EXPECT_EQ(expected.skip_zero_click, actual.skip_zero_click); 241 EXPECT_EQ(expected.skip_zero_click, actual.skip_zero_click);
249 EXPECT_EQ(expected.generation_upload_status, 242 EXPECT_EQ(expected.generation_upload_status,
250 actual.generation_upload_status); 243 actual.generation_upload_status);
251 } 244 }
252 } 245 }
253 246
254 void CheckPasswordChangesWithResult(const PasswordStoreChangeList* expected,
255 const PasswordStoreChangeList* actual,
256 bool result) {
257 EXPECT_TRUE(result);
258 CheckPasswordChanges(*expected, *actual);
259 }
260
261 } // anonymous namespace 247 } // anonymous namespace
262 248
263 class NativeBackendLibsecretTest : public testing::Test { 249 class NativeBackendLibsecretTest : public testing::Test {
264 protected: 250 protected:
265 enum UpdateType { // Used in CheckPSLUpdate(). 251 enum UpdateType { // Used in CheckPSLUpdate().
266 UPDATE_BY_UPDATELOGIN, 252 UPDATE_BY_UPDATELOGIN,
267 UPDATE_BY_ADDLOGIN, 253 UPDATE_BY_ADDLOGIN,
268 }; 254 };
269 enum RemoveBetweenMethod { // Used in CheckRemoveLoginsBetween(). 255 enum RemoveBetweenMethod { // Used in CheckRemoveLoginsBetween().
270 CREATED, 256 CREATED,
271 SYNCED, 257 SYNCED,
272 }; 258 };
273 259
274 NativeBackendLibsecretTest() {} 260 NativeBackendLibsecretTest() {}
275 261
276 void SetUp() override { 262 void SetUp() override {
263 ASSERT_FALSE(global_mock_libsecret_items);
264 global_mock_libsecret_items = &mock_libsecret_items_;
265
277 ASSERT_TRUE(MockLibsecretLoader::LoadMockLibsecret()); 266 ASSERT_TRUE(MockLibsecretLoader::LoadMockLibsecret());
278 267
279 form_google_.origin = GURL("http://www.google.com/"); 268 form_google_.origin = GURL("http://www.google.com/");
280 form_google_.action = GURL("http://www.google.com/login"); 269 form_google_.action = GURL("http://www.google.com/login");
281 form_google_.username_element = UTF8ToUTF16("user"); 270 form_google_.username_element = UTF8ToUTF16("user");
282 form_google_.username_value = UTF8ToUTF16("joeschmoe"); 271 form_google_.username_value = UTF8ToUTF16("joeschmoe");
283 form_google_.password_element = UTF8ToUTF16("pass"); 272 form_google_.password_element = UTF8ToUTF16("pass");
284 form_google_.password_value = UTF8ToUTF16("seekrit"); 273 form_google_.password_value = UTF8ToUTF16("seekrit");
285 form_google_.submit_element = UTF8ToUTF16("submit"); 274 form_google_.submit_element = UTF8ToUTF16("submit");
286 form_google_.signon_realm = "http://www.google.com/"; 275 form_google_.signon_realm = "http://www.google.com/";
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 other_auth_.password_value = UTF8ToUTF16("pass"); 314 other_auth_.password_value = UTF8ToUTF16("pass");
326 other_auth_.signon_realm = "http://www.example.com/Realm"; 315 other_auth_.signon_realm = "http://www.example.com/Realm";
327 other_auth_.date_created = base::Time::Now(); 316 other_auth_.date_created = base::Time::Now();
328 other_auth_.date_synced = base::Time::Now(); 317 other_auth_.date_synced = base::Time::Now();
329 } 318 }
330 319
331 void TearDown() override { 320 void TearDown() override {
332 base::MessageLoop::current()->PostTask(FROM_HERE, 321 base::MessageLoop::current()->PostTask(FROM_HERE,
333 base::MessageLoop::QuitClosure()); 322 base::MessageLoop::QuitClosure());
334 base::MessageLoop::current()->Run(); 323 base::MessageLoop::current()->Run();
335 ClearMockObjects(); 324 ASSERT_TRUE(global_mock_libsecret_items);
325 global_mock_libsecret_items = nullptr;
336 } 326 }
337 327
338 void RunUIThread() { base::MessageLoop::current()->Run(); } 328 void RunUIThread() { base::MessageLoop::current()->Run(); }
339 329
340 void CheckUint32Attribute(const MockSecretItem* item, 330 void CheckUint32Attribute(const MockSecretItem* item,
341 const std::string& attribute, 331 const std::string& attribute,
342 uint32_t value) { 332 uint32_t value) {
343 gpointer item_value = 333 gpointer item_value =
344 g_hash_table_lookup(item->attributes, attribute.c_str()); 334 g_hash_table_lookup(item->attributes, attribute.c_str());
345 EXPECT_TRUE(item_value) << " in attribute " << attribute; 335 EXPECT_TRUE(item_value) << " in attribute " << attribute;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
415 if (scheme != PasswordForm::SCHEME_HTML) { 405 if (scheme != PasswordForm::SCHEME_HTML) {
416 // For non-HTML forms, the realm used for authentication 406 // For non-HTML forms, the realm used for authentication
417 // (http://tools.ietf.org/html/rfc1945#section-10.2) is appended to the 407 // (http://tools.ietf.org/html/rfc1945#section-10.2) is appended to the
418 // signon_realm. Just use a default value for now. 408 // signon_realm. Just use a default value for now.
419 target_form.signon_realm.append("Realm"); 409 target_form.signon_realm.append("Realm");
420 target_form.scheme = scheme; 410 target_form.scheme = scheme;
421 } 411 }
422 ScopedVector<autofill::PasswordForm> form_list; 412 ScopedVector<autofill::PasswordForm> form_list;
423 backend.GetLogins(target_form, &form_list); 413 backend.GetLogins(target_form, &form_list);
424 414
425 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 415 EXPECT_EQ(1u, global_mock_libsecret_items->size());
426 if (global_mock_libsecret_items.size() > 0) 416 if (!global_mock_libsecret_items->empty())
427 CheckMockSecretItem(global_mock_libsecret_items[0], credentials, 417 CheckMockSecretItem((*global_mock_libsecret_items)[0], credentials,
428 "chrome-321"); 418 "chrome-321");
429 ClearMockObjects(); 419 global_mock_libsecret_items->clear();
430 420
431 if (form_list.empty()) 421 if (form_list.empty())
432 return false; 422 return false;
433 EXPECT_EQ(1u, form_list.size()); 423 EXPECT_EQ(1u, form_list.size());
434 if (result) 424 if (result)
435 *result = *form_list[0]; 425 *result = *form_list[0];
436 return true; 426 return true;
437 } 427 }
438 428
439 // Test that updating does not use PSL matching: Add a www.facebook.com 429 // Test that updating does not use PSL matching: Add a www.facebook.com
440 // password, then use PSL matching to get a copy of it for m.facebook.com, and 430 // password, then use PSL matching to get a copy of it for m.facebook.com, and
441 // add that copy as well. Now update the www.facebook.com password -- the 431 // add that copy as well. Now update the www.facebook.com password -- the
442 // m.facebook.com password should not get updated. Depending on the argument, 432 // m.facebook.com password should not get updated. Depending on the argument,
443 // the credential update is done via UpdateLogin or AddLogin. 433 // the credential update is done via UpdateLogin or AddLogin.
444 void CheckPSLUpdate(UpdateType update_type) { 434 void CheckPSLUpdate(UpdateType update_type) {
445 NativeBackendLibsecret backend(321); 435 NativeBackendLibsecret backend(321);
446 436
447 backend.AddLogin(form_facebook_); 437 backend.AddLogin(form_facebook_);
448 438
449 // Get the PSL-matched copy of the saved login for m.facebook. 439 // Get the PSL-matched copy of the saved login for m.facebook.
450 const GURL kMobileURL("http://m.facebook.com/"); 440 const GURL kMobileURL("http://m.facebook.com/");
451 PasswordForm m_facebook_lookup; 441 PasswordForm m_facebook_lookup;
452 m_facebook_lookup.origin = kMobileURL; 442 m_facebook_lookup.origin = kMobileURL;
453 m_facebook_lookup.signon_realm = kMobileURL.spec(); 443 m_facebook_lookup.signon_realm = kMobileURL.spec();
454 ScopedVector<autofill::PasswordForm> form_list; 444 ScopedVector<autofill::PasswordForm> form_list;
455 backend.GetLogins(m_facebook_lookup, &form_list); 445 backend.GetLogins(m_facebook_lookup, &form_list);
456 446
457 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 447 EXPECT_EQ(1u, global_mock_libsecret_items->size());
458 EXPECT_EQ(1u, form_list.size()); 448 EXPECT_EQ(1u, form_list.size());
459 PasswordForm m_facebook = *form_list[0]; 449 PasswordForm m_facebook = *form_list[0];
460 form_list.clear(); 450 form_list.clear();
461 EXPECT_EQ(kMobileURL, m_facebook.origin); 451 EXPECT_EQ(kMobileURL, m_facebook.origin);
462 EXPECT_EQ(kMobileURL.spec(), m_facebook.signon_realm); 452 EXPECT_EQ(kMobileURL.spec(), m_facebook.signon_realm);
463 453
464 // Add the PSL-matched copy to saved logins. 454 // Add the PSL-matched copy to saved logins.
465 backend.AddLogin(m_facebook); 455 backend.AddLogin(m_facebook);
466 EXPECT_EQ(2u, global_mock_libsecret_items.size()); 456 EXPECT_EQ(2u, global_mock_libsecret_items->size());
467 457
468 // Update www.facebook.com login. 458 // Update www.facebook.com login.
469 PasswordForm new_facebook(form_facebook_); 459 PasswordForm new_facebook(form_facebook_);
470 const base::string16 kOldPassword(form_facebook_.password_value); 460 const base::string16 kOldPassword(form_facebook_.password_value);
471 const base::string16 kNewPassword(UTF8ToUTF16("new_b")); 461 const base::string16 kNewPassword(UTF8ToUTF16("new_b"));
472 EXPECT_NE(kOldPassword, kNewPassword); 462 EXPECT_NE(kOldPassword, kNewPassword);
473 new_facebook.password_value = kNewPassword; 463 new_facebook.password_value = kNewPassword;
474 scoped_ptr<PasswordStoreChangeList> not_used(new PasswordStoreChangeList()); 464 scoped_ptr<PasswordStoreChangeList> not_used(new PasswordStoreChangeList());
475 switch (update_type) { 465 switch (update_type) {
476 case UPDATE_BY_UPDATELOGIN: 466 case UPDATE_BY_UPDATELOGIN:
477 backend.UpdateLogin(new_facebook, not_used.get()); 467 backend.UpdateLogin(new_facebook, not_used.get());
478 break; 468 break;
479 case UPDATE_BY_ADDLOGIN: 469 case UPDATE_BY_ADDLOGIN:
480 backend.AddLogin(new_facebook); 470 backend.AddLogin(new_facebook);
481 break; 471 break;
482 } 472 }
483 473
484 EXPECT_EQ(2u, global_mock_libsecret_items.size()); 474 EXPECT_EQ(2u, global_mock_libsecret_items->size());
485 475
486 // Check that m.facebook.com login was not modified by the update. 476 // Check that m.facebook.com login was not modified by the update.
487 backend.GetLogins(m_facebook_lookup, &form_list); 477 backend.GetLogins(m_facebook_lookup, &form_list);
488 478
489 // There should be two results -- the exact one, and the PSL-matched one. 479 // There should be two results -- the exact one, and the PSL-matched one.
490 EXPECT_EQ(2u, form_list.size()); 480 EXPECT_EQ(2u, form_list.size());
491 size_t index_non_psl = 0; 481 size_t index_non_psl = 0;
492 if (!form_list[index_non_psl]->original_signon_realm.empty()) 482 if (!form_list[index_non_psl]->original_signon_realm.empty())
493 index_non_psl = 1; 483 index_non_psl = 1;
494 EXPECT_EQ(kMobileURL, form_list[index_non_psl]->origin); 484 EXPECT_EQ(kMobileURL, form_list[index_non_psl]->origin);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 PasswordStoreChangeList expected_changes; 543 PasswordStoreChangeList expected_changes;
554 expected_changes.push_back( 544 expected_changes.push_back(
555 PasswordStoreChange(PasswordStoreChange::REMOVE, form_google_)); 545 PasswordStoreChange(PasswordStoreChange::REMOVE, form_google_));
556 PasswordStoreChangeList changes; 546 PasswordStoreChangeList changes;
557 bool (NativeBackendLibsecret::*method)( 547 bool (NativeBackendLibsecret::*method)(
558 base::Time, base::Time, password_manager::PasswordStoreChangeList*) = 548 base::Time, base::Time, password_manager::PasswordStoreChangeList*) =
559 date_to_test == CREATED 549 date_to_test == CREATED
560 ? &NativeBackendLibsecret::RemoveLoginsCreatedBetween 550 ? &NativeBackendLibsecret::RemoveLoginsCreatedBetween
561 : &NativeBackendLibsecret::RemoveLoginsSyncedBetween; 551 : &NativeBackendLibsecret::RemoveLoginsSyncedBetween;
562 552
563 bool result = base::Bind(method, base::Unretained(&backend), base::Time(), 553 EXPECT_TRUE(base::Bind(method, base::Unretained(&backend), base::Time(),
564 next_day, &changes).Run(); 554 next_day, &changes).Run());
565 CheckPasswordChangesWithResult(&expected_changes, &changes, result); 555 CheckPasswordChanges(expected_changes, changes);
566 556
567 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 557 EXPECT_EQ(1u, global_mock_libsecret_items->size());
568 if (global_mock_libsecret_items.size() > 0) 558 if (!global_mock_libsecret_items->empty() > 0)
569 CheckMockSecretItem(global_mock_libsecret_items[0], form_isc_, 559 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_isc_,
570 "chrome-42"); 560 "chrome-42");
571 561
572 // Remove form_isc_. 562 // Remove form_isc_.
573 expected_changes.clear(); 563 expected_changes.clear();
574 expected_changes.push_back( 564 expected_changes.push_back(
575 PasswordStoreChange(PasswordStoreChange::REMOVE, form_isc_)); 565 PasswordStoreChange(PasswordStoreChange::REMOVE, form_isc_));
576 566
577 result = base::Bind(method, base::Unretained(&backend), next_day, 567 EXPECT_TRUE(base::Bind(method, base::Unretained(&backend), next_day,
578 base::Time(), &changes).Run(); 568 base::Time(), &changes).Run());
579 CheckPasswordChangesWithResult(&expected_changes, &changes, result); 569 CheckPasswordChanges(expected_changes, changes);
580 570
581 EXPECT_EQ(0u, global_mock_libsecret_items.size()); 571 EXPECT_TRUE(global_mock_libsecret_items->empty());
582 } 572 }
583 573
584 base::MessageLoopForUI message_loop_; 574 base::MessageLoopForUI message_loop_;
585 575
586 // Provide some test forms to avoid having to set them up in each test. 576 // Provide some test forms to avoid having to set them up in each test.
587 PasswordForm form_google_; 577 PasswordForm form_google_;
588 PasswordForm form_facebook_; 578 PasswordForm form_facebook_;
589 PasswordForm form_isc_; 579 PasswordForm form_isc_;
590 PasswordForm other_auth_; 580 PasswordForm other_auth_;
581
582 ScopedVector<MockSecretItem> mock_libsecret_items_;
591 }; 583 };
592 584
593 TEST_F(NativeBackendLibsecretTest, BasicAddLogin) { 585 TEST_F(NativeBackendLibsecretTest, BasicAddLogin) {
594 NativeBackendLibsecret backend(42); 586 NativeBackendLibsecret backend(42);
595 587
596 backend.AddLogin(form_google_); 588 backend.AddLogin(form_google_);
597 589
598 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 590 EXPECT_EQ(1u, global_mock_libsecret_items->size());
599 if (global_mock_libsecret_items.size() > 0) 591 if (!global_mock_libsecret_items->empty())
600 CheckMockSecretItem(global_mock_libsecret_items[0], form_google_, 592 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_google_,
601 "chrome-42"); 593 "chrome-42");
602 } 594 }
603 595
604 TEST_F(NativeBackendLibsecretTest, BasicListLogins) { 596 TEST_F(NativeBackendLibsecretTest, BasicListLogins) {
605 NativeBackendLibsecret backend(42); 597 NativeBackendLibsecret backend(42);
606 598
607 backend.AddLogin(form_google_); 599 backend.AddLogin(form_google_);
608 600
609 ScopedVector<autofill::PasswordForm> form_list; 601 ScopedVector<autofill::PasswordForm> form_list;
610 backend.GetAutofillableLogins(&form_list); 602 backend.GetAutofillableLogins(&form_list);
611 603
612 // Quick check that we got something back. 604 // Quick check that we got something back.
613 EXPECT_EQ(1u, form_list.size()); 605 EXPECT_EQ(1u, form_list.size());
614 form_list.clear(); 606 form_list.clear();
615 607
616 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 608 EXPECT_EQ(1u, global_mock_libsecret_items->size());
617 if (global_mock_libsecret_items.size() > 0) 609 if (!global_mock_libsecret_items->empty())
618 CheckMockSecretItem(global_mock_libsecret_items[0], form_google_, 610 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_google_,
619 "chrome-42"); 611 "chrome-42");
620 } 612 }
621 613
622 // Save a password for www.facebook.com and see it suggested for m.facebook.com. 614 // Save a password for www.facebook.com and see it suggested for m.facebook.com.
623 TEST_F(NativeBackendLibsecretTest, PSLMatchingPositive) { 615 TEST_F(NativeBackendLibsecretTest, PSLMatchingPositive) {
624 PasswordForm result; 616 PasswordForm result;
625 const GURL kMobileURL("http://m.facebook.com/"); 617 const GURL kMobileURL("http://m.facebook.com/");
626 EXPECT_TRUE(CheckCredentialAvailability(form_facebook_, kMobileURL, 618 EXPECT_TRUE(CheckCredentialAvailability(form_facebook_, kMobileURL,
627 PasswordForm::SCHEME_HTML, &result)); 619 PasswordForm::SCHEME_HTML, &result));
628 EXPECT_EQ(kMobileURL, result.origin); 620 EXPECT_EQ(kMobileURL, result.origin);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 655
664 TEST_F(NativeBackendLibsecretTest, BasicUpdateLogin) { 656 TEST_F(NativeBackendLibsecretTest, BasicUpdateLogin) {
665 NativeBackendLibsecret backend(42); 657 NativeBackendLibsecret backend(42);
666 658
667 backend.AddLogin(form_google_); 659 backend.AddLogin(form_google_);
668 660
669 PasswordForm new_form_google(form_google_); 661 PasswordForm new_form_google(form_google_);
670 new_form_google.times_used = 1; 662 new_form_google.times_used = 1;
671 new_form_google.action = GURL("http://www.google.com/different/login"); 663 new_form_google.action = GURL("http://www.google.com/different/login");
672 664
673 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 665 EXPECT_EQ(1u, global_mock_libsecret_items->size());
674 if (global_mock_libsecret_items.size() > 0) 666 if (!global_mock_libsecret_items->empty())
675 CheckMockSecretItem(global_mock_libsecret_items[0], form_google_, 667 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_google_,
676 "chrome-42"); 668 "chrome-42");
677 669
678 // Update login 670 // Update login
679 PasswordStoreChangeList changes; 671 PasswordStoreChangeList changes;
680 backend.UpdateLogin(new_form_google, &changes); 672 backend.UpdateLogin(new_form_google, &changes);
681 673
682 ASSERT_EQ(1u, changes.size()); 674 ASSERT_EQ(1u, changes.size());
683 EXPECT_EQ(PasswordStoreChange::UPDATE, changes.front().type()); 675 EXPECT_EQ(PasswordStoreChange::UPDATE, changes.front().type());
684 EXPECT_EQ(new_form_google, changes.front().form()); 676 EXPECT_EQ(new_form_google, changes.front().form());
685 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 677 EXPECT_EQ(1u, global_mock_libsecret_items->size());
686 if (global_mock_libsecret_items.size() > 0) 678 if (!global_mock_libsecret_items->empty())
687 CheckMockSecretItem(global_mock_libsecret_items[0], new_form_google, 679 CheckMockSecretItem((*global_mock_libsecret_items)[0], new_form_google,
688 "chrome-42"); 680 "chrome-42");
689 } 681 }
690 682
691 TEST_F(NativeBackendLibsecretTest, BasicRemoveLogin) { 683 TEST_F(NativeBackendLibsecretTest, BasicRemoveLogin) {
692 NativeBackendLibsecret backend(42); 684 NativeBackendLibsecret backend(42);
693 685
694 backend.AddLogin(form_google_); 686 backend.AddLogin(form_google_);
695 687
696 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 688 EXPECT_EQ(1u, global_mock_libsecret_items->size());
697 if (global_mock_libsecret_items.size() > 0) 689 if (!global_mock_libsecret_items->empty())
698 CheckMockSecretItem(global_mock_libsecret_items[0], form_google_, 690 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_google_,
699 "chrome-42"); 691 "chrome-42");
700 692
701 backend.RemoveLogin(form_google_); 693 backend.RemoveLogin(form_google_);
702 694
703 EXPECT_EQ(0u, global_mock_libsecret_items.size()); 695 EXPECT_TRUE(global_mock_libsecret_items->empty());
704 } 696 }
705 697
706 // Verify fix for http://crbug.com/408783. 698 // Verify fix for http://crbug.com/408783.
707 TEST_F(NativeBackendLibsecretTest, RemoveLoginActionMismatch) { 699 TEST_F(NativeBackendLibsecretTest, RemoveLoginActionMismatch) {
708 NativeBackendLibsecret backend(42); 700 NativeBackendLibsecret backend(42);
709 701
710 backend.AddLogin(form_google_); 702 backend.AddLogin(form_google_);
711 703
712 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 704 EXPECT_EQ(1u, global_mock_libsecret_items->size());
713 if (global_mock_libsecret_items.size() > 0) 705 if (!global_mock_libsecret_items->empty())
714 CheckMockSecretItem(global_mock_libsecret_items[0], form_google_, 706 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_google_,
715 "chrome-42"); 707 "chrome-42");
716 708
717 // Action url match not required for removal. 709 // Action url match not required for removal.
718 form_google_.action = GURL("https://some.other.url.com/path"); 710 form_google_.action = GURL("https://some.other.url.com/path");
719 711
720 backend.RemoveLogin(form_google_); 712 backend.RemoveLogin(form_google_);
721 713
722 EXPECT_EQ(0u, global_mock_libsecret_items.size()); 714 EXPECT_TRUE(global_mock_libsecret_items->empty());
723 } 715 }
724 716
725 TEST_F(NativeBackendLibsecretTest, RemoveNonexistentLogin) { 717 TEST_F(NativeBackendLibsecretTest, RemoveNonexistentLogin) {
726 NativeBackendLibsecret backend(42); 718 NativeBackendLibsecret backend(42);
727 719
728 // First add an unrelated login. 720 // First add an unrelated login.
729 backend.AddLogin(form_google_); 721 backend.AddLogin(form_google_);
730 722
731 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 723 EXPECT_EQ(1u, global_mock_libsecret_items->size());
732 if (global_mock_libsecret_items.size() > 0) 724 if (!global_mock_libsecret_items->empty())
733 CheckMockSecretItem(global_mock_libsecret_items[0], form_google_, 725 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_google_,
734 "chrome-42"); 726 "chrome-42");
735 727
736 // Attempt to remove a login that doesn't exist. 728 // Attempt to remove a login that doesn't exist.
737 backend.RemoveLogin(form_isc_); 729 backend.RemoveLogin(form_isc_);
738 730
739 // Make sure we can still get the first form back. 731 // Make sure we can still get the first form back.
740 ScopedVector<autofill::PasswordForm> form_list; 732 ScopedVector<autofill::PasswordForm> form_list;
741 backend.GetAutofillableLogins(&form_list); 733 backend.GetAutofillableLogins(&form_list);
742 734
743 // Quick check that we got something back. 735 // Quick check that we got something back.
744 EXPECT_EQ(1u, form_list.size()); 736 EXPECT_EQ(1u, form_list.size());
745 form_list.clear(); 737 form_list.clear();
746 738
747 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 739 EXPECT_EQ(1u, global_mock_libsecret_items->size());
748 if (global_mock_libsecret_items.size() > 0) 740 if (!global_mock_libsecret_items->empty())
749 CheckMockSecretItem(global_mock_libsecret_items[0], form_google_, 741 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_google_,
750 "chrome-42"); 742 "chrome-42");
751 } 743 }
752 744
753 TEST_F(NativeBackendLibsecretTest, UpdateNonexistentLogin) { 745 TEST_F(NativeBackendLibsecretTest, UpdateNonexistentLogin) {
754 NativeBackendLibsecret backend(42); 746 NativeBackendLibsecret backend(42);
755 747
756 // First add an unrelated login. 748 // First add an unrelated login.
757 backend.AddLogin(form_google_); 749 backend.AddLogin(form_google_);
758 750
759 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 751 EXPECT_EQ(1u, global_mock_libsecret_items->size());
760 if (global_mock_libsecret_items.size() > 0) 752 if (!global_mock_libsecret_items->empty())
761 CheckMockSecretItem(global_mock_libsecret_items[0], form_google_, 753 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_google_,
762 "chrome-42"); 754 "chrome-42");
763 755
764 // Attempt to update a login that doesn't exist. 756 // Attempt to update a login that doesn't exist.
765 PasswordStoreChangeList changes; 757 PasswordStoreChangeList changes;
766 backend.UpdateLogin(form_isc_, &changes); 758 backend.UpdateLogin(form_isc_, &changes);
767 759
768 EXPECT_EQ(PasswordStoreChangeList(), changes); 760 EXPECT_EQ(PasswordStoreChangeList(), changes);
769 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 761 EXPECT_EQ(1u, global_mock_libsecret_items->size());
770 if (global_mock_libsecret_items.size() > 0) 762 if (!global_mock_libsecret_items->empty())
771 CheckMockSecretItem(global_mock_libsecret_items[0], form_google_, 763 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_google_,
772 "chrome-42"); 764 "chrome-42");
773 } 765 }
774 766
775 TEST_F(NativeBackendLibsecretTest, AddDuplicateLogin) { 767 TEST_F(NativeBackendLibsecretTest, AddDuplicateLogin) {
776 NativeBackendLibsecret backend(42); 768 NativeBackendLibsecret backend(42);
777 769
778 PasswordStoreChangeList expected_changes, actual_changes; 770 PasswordStoreChangeList expected_changes, actual_changes;
779 expected_changes.push_back( 771 expected_changes.push_back(
780 PasswordStoreChange(PasswordStoreChange::ADD, form_google_)); 772 PasswordStoreChange(PasswordStoreChange::ADD, form_google_));
781 actual_changes = backend.AddLogin(form_google_); 773 actual_changes = backend.AddLogin(form_google_);
782 CheckPasswordChanges(expected_changes, actual_changes); 774 CheckPasswordChanges(expected_changes, actual_changes);
783 775
784 expected_changes.clear(); 776 expected_changes.clear();
785 expected_changes.push_back( 777 expected_changes.push_back(
786 PasswordStoreChange(PasswordStoreChange::REMOVE, form_google_)); 778 PasswordStoreChange(PasswordStoreChange::REMOVE, form_google_));
787 form_google_.times_used++; 779 form_google_.times_used++;
788 expected_changes.push_back( 780 expected_changes.push_back(
789 PasswordStoreChange(PasswordStoreChange::ADD, form_google_)); 781 PasswordStoreChange(PasswordStoreChange::ADD, form_google_));
790 782
791 actual_changes = backend.AddLogin(form_google_); 783 actual_changes = backend.AddLogin(form_google_);
792 CheckPasswordChanges(expected_changes, actual_changes); 784 CheckPasswordChanges(expected_changes, actual_changes);
793 785
794 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 786 EXPECT_EQ(1u, global_mock_libsecret_items->size());
795 if (global_mock_libsecret_items.size() > 0) 787 if (!global_mock_libsecret_items->empty())
796 CheckMockSecretItem(global_mock_libsecret_items[0], form_google_, 788 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_google_,
797 "chrome-42"); 789 "chrome-42");
798 } 790 }
799 791
800 TEST_F(NativeBackendLibsecretTest, ListLoginsAppends) { 792 TEST_F(NativeBackendLibsecretTest, ListLoginsAppends) {
801 NativeBackendLibsecret backend(42); 793 NativeBackendLibsecret backend(42);
802 794
803 backend.AddLogin(form_google_); 795 backend.AddLogin(form_google_);
804 796
805 // Send the same request twice with the same list both times. 797 // Send the same request twice with the same list both times.
806 ScopedVector<autofill::PasswordForm> form_list; 798 ScopedVector<autofill::PasswordForm> form_list;
807 backend.GetAutofillableLogins(&form_list); 799 backend.GetAutofillableLogins(&form_list);
808 backend.GetAutofillableLogins(&form_list); 800 backend.GetAutofillableLogins(&form_list);
809 801
810 // Quick check that we got two results back. 802 // Quick check that we got two results back.
811 EXPECT_EQ(2u, form_list.size()); 803 EXPECT_EQ(2u, form_list.size());
812 form_list.clear(); 804 form_list.clear();
813 805
814 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 806 EXPECT_EQ(1u, global_mock_libsecret_items->size());
815 if (global_mock_libsecret_items.size() > 0) 807 if (!global_mock_libsecret_items->empty())
816 CheckMockSecretItem(global_mock_libsecret_items[0], form_google_, 808 CheckMockSecretItem((*global_mock_libsecret_items)[0], form_google_,
817 "chrome-42"); 809 "chrome-42");
818 } 810 }
819 811
820 TEST_F(NativeBackendLibsecretTest, AndroidCredentials) { 812 TEST_F(NativeBackendLibsecretTest, AndroidCredentials) {
821 NativeBackendLibsecret backend(42); 813 NativeBackendLibsecret backend(42);
822 backend.Init(); 814 backend.Init();
823 815
824 PasswordForm observed_android_form; 816 PasswordForm observed_android_form;
825 observed_android_form.scheme = PasswordForm::SCHEME_HTML; 817 observed_android_form.scheme = PasswordForm::SCHEME_HTML;
826 observed_android_form.signon_realm = 818 observed_android_form.signon_realm =
(...skipping 20 matching lines...) Expand all
847 TEST_F(NativeBackendLibsecretTest, RemoveLoginsSyncedBetween) { 839 TEST_F(NativeBackendLibsecretTest, RemoveLoginsSyncedBetween) {
848 CheckRemoveLoginsBetween(SYNCED); 840 CheckRemoveLoginsBetween(SYNCED);
849 } 841 }
850 842
851 TEST_F(NativeBackendLibsecretTest, SomeKeyringAttributesAreMissing) { 843 TEST_F(NativeBackendLibsecretTest, SomeKeyringAttributesAreMissing) {
852 // Absent attributes should be filled with default values. 844 // Absent attributes should be filled with default values.
853 NativeBackendLibsecret backend(42); 845 NativeBackendLibsecret backend(42);
854 846
855 backend.AddLogin(form_google_); 847 backend.AddLogin(form_google_);
856 848
857 EXPECT_EQ(1u, global_mock_libsecret_items.size()); 849 EXPECT_EQ(1u, global_mock_libsecret_items->size());
858 // Remove a string attribute. 850 // Remove a string attribute.
859 global_mock_libsecret_items[0]->RemoveAttribute("avatar_url"); 851 (*global_mock_libsecret_items)[0]->RemoveAttribute("avatar_url");
860 // Remove an integer attribute. 852 // Remove an integer attribute.
861 global_mock_libsecret_items[0]->RemoveAttribute("ssl_valid"); 853 (*global_mock_libsecret_items)[0]->RemoveAttribute("ssl_valid");
862 854
863 ScopedVector<autofill::PasswordForm> form_list; 855 ScopedVector<autofill::PasswordForm> form_list;
864 backend.GetAutofillableLogins(&form_list); 856 backend.GetAutofillableLogins(&form_list);
865 857
866 EXPECT_EQ(1u, form_list.size()); 858 EXPECT_EQ(1u, form_list.size());
867 EXPECT_EQ(GURL(""), form_list[0]->avatar_url); 859 EXPECT_EQ(GURL(""), form_list[0]->avatar_url);
868 EXPECT_FALSE(form_list[0]->ssl_valid); 860 EXPECT_FALSE(form_list[0]->ssl_valid);
869 } 861 }
870 862
871 // TODO(mdm): add more basic tests here at some point. 863 // TODO(mdm): add more basic tests here at some point.
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698