Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/ui/passwords/manage_passwords_state.h" | |
| 6 | |
| 7 #include "base/strings/utf_string_conversions.h" | |
| 8 #include "components/password_manager/content/common/credential_manager_types.h" | |
| 9 #include "components/password_manager/core/browser/password_form_manager.h" | |
| 10 #include "components/password_manager/core/browser/stub_password_manager_client. h" | |
| 11 #include "testing/gmock/include/gmock/gmock.h" | |
| 12 #include "testing/gtest/include/gtest/gtest.h" | |
| 13 | |
| 14 using ::testing::_; | |
| 15 using ::testing::Contains; | |
| 16 using ::testing::ElementsAre; | |
| 17 using ::testing::IsEmpty; | |
| 18 using ::testing::Not; | |
| 19 using ::testing::Pointee; | |
| 20 using ::testing::UnorderedElementsAre; | |
| 21 | |
| 22 namespace { | |
| 23 | |
| 24 class ManagePasswordsStateTest : public testing::Test { | |
| 25 public: | |
| 26 ManagePasswordsStateTest() = default; | |
| 27 | |
| 28 void SetUp() override { | |
| 29 test_local_form_.origin = GURL("http://example.com"); | |
| 30 test_local_form_.username_value = base::ASCIIToUTF16("username"); | |
| 31 test_local_form_.password_value = base::ASCIIToUTF16("12345"); | |
| 32 | |
| 33 test_submitted_form_ = test_local_form_; | |
| 34 test_submitted_form_.username_value = base::ASCIIToUTF16("new one"); | |
| 35 test_submitted_form_.password_value = base::ASCIIToUTF16("asdfjkl;"); | |
| 36 | |
| 37 test_federated_form_.origin = GURL("https://idp.com"); | |
| 38 test_federated_form_.username_value = base::ASCIIToUTF16("username"); | |
| 39 } | |
| 40 | |
| 41 autofill::PasswordForm& test_local_form() { return test_local_form_; } | |
| 42 autofill::PasswordForm& test_submitted_form() { return test_submitted_form_; } | |
| 43 autofill::PasswordForm& test_federated_form() { return test_federated_form_; } | |
| 44 ManagePasswordsState& passwords_data() { return passwords_data_; } | |
| 45 | |
| 46 scoped_ptr<password_manager::PasswordFormManager> CreateFormManager(); | |
| 47 | |
| 48 MOCK_METHOD1(OnChooseCredential, | |
| 49 void(const password_manager::CredentialInfo&)); | |
| 50 | |
| 51 private: | |
| 52 password_manager::StubPasswordManagerClient client_; | |
| 53 | |
| 54 ManagePasswordsState passwords_data_; | |
| 55 autofill::PasswordForm test_local_form_; | |
| 56 autofill::PasswordForm test_submitted_form_; | |
| 57 autofill::PasswordForm test_federated_form_; | |
| 58 | |
| 59 DISALLOW_COPY_AND_ASSIGN(ManagePasswordsStateTest); | |
| 60 }; | |
| 61 | |
| 62 scoped_ptr<password_manager::PasswordFormManager> | |
| 63 ManagePasswordsStateTest::CreateFormManager() { | |
| 64 scoped_ptr<password_manager::PasswordFormManager> test_form_manager( | |
| 65 new password_manager::PasswordFormManager( | |
| 66 nullptr, &client_, | |
| 67 base::WeakPtr<password_manager::PasswordManagerDriver>(), | |
| 68 test_local_form(), false)); | |
| 69 test_form_manager->SimulateFetchMatchingLoginsFromPasswordStore(); | |
| 70 ScopedVector<autofill::PasswordForm> stored_forms; | |
| 71 stored_forms.push_back(new autofill::PasswordForm(test_local_form())); | |
| 72 test_form_manager->OnGetPasswordStoreResults(stored_forms.Pass()); | |
| 73 EXPECT_EQ(1u, test_form_manager->best_matches().size()); | |
| 74 EXPECT_EQ(test_local_form(), | |
| 75 *test_form_manager->best_matches().begin()->second); | |
| 76 return test_form_manager.Pass(); | |
| 77 } | |
| 78 | |
| 79 TEST_F(ManagePasswordsStateTest, DefaultState) { | |
| 80 EXPECT_THAT(passwords_data().GetCurrentForms(), IsEmpty()); | |
| 81 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 82 EXPECT_EQ(password_manager::ui::INACTIVE_STATE, passwords_data().state()); | |
| 83 EXPECT_EQ(GURL::EmptyGURL(), passwords_data().origin()); | |
| 84 EXPECT_FALSE(passwords_data().form_manager()); | |
| 85 } | |
| 86 | |
| 87 TEST_F(ManagePasswordsStateTest, PasswordSubmitted) { | |
| 88 scoped_ptr<password_manager::PasswordFormManager> test_form_manager( | |
| 89 CreateFormManager()); | |
| 90 test_form_manager->ProvisionallySave( | |
| 91 test_submitted_form(), | |
| 92 password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | |
| 93 passwords_data().OnPendingPassword(test_form_manager.Pass()); | |
| 94 | |
| 95 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 96 ElementsAre(Pointee(test_local_form()))); | |
| 97 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 98 EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, | |
| 99 passwords_data().state()); | |
| 100 EXPECT_EQ(test_submitted_form().origin, passwords_data().origin()); | |
| 101 ASSERT_TRUE(passwords_data().form_manager()); | |
| 102 EXPECT_EQ(test_submitted_form(), | |
| 103 passwords_data().form_manager()->pending_credentials()); | |
| 104 } | |
| 105 | |
| 106 TEST_F(ManagePasswordsStateTest, PasswordSaved) { | |
| 107 scoped_ptr<password_manager::PasswordFormManager> test_form_manager( | |
| 108 CreateFormManager()); | |
| 109 test_form_manager->ProvisionallySave( | |
| 110 test_submitted_form(), | |
| 111 password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | |
| 112 passwords_data().OnPendingPassword(test_form_manager.Pass()); | |
| 113 EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, | |
| 114 passwords_data().state()); | |
| 115 | |
| 116 passwords_data().TransitionToState(password_manager::ui::MANAGE_STATE); | |
| 117 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 118 ElementsAre(Pointee(test_local_form()))); | |
| 119 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 120 EXPECT_EQ(password_manager::ui::MANAGE_STATE, | |
| 121 passwords_data().state()); | |
| 122 EXPECT_EQ(test_submitted_form().origin, passwords_data().origin()); | |
| 123 } | |
| 124 | |
| 125 TEST_F(ManagePasswordsStateTest, OnRequestCredentials) { | |
| 126 ScopedVector<autofill::PasswordForm> local_credentials; | |
| 127 local_credentials.push_back(new autofill::PasswordForm(test_local_form())); | |
| 128 ScopedVector<autofill::PasswordForm> federated_credentials; | |
| 129 federated_credentials.push_back( | |
| 130 new autofill::PasswordForm(test_federated_form())); | |
| 131 const GURL origin = test_local_form().origin; | |
| 132 passwords_data().OnRequestCredentials(local_credentials.Pass(), | |
| 133 federated_credentials.Pass(), origin); | |
| 134 passwords_data().set_credentials_callback( | |
| 135 base::Bind(&ManagePasswordsStateTest::OnChooseCredential, | |
| 136 base::Unretained(this))); | |
| 137 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 138 ElementsAre(Pointee(test_local_form()))); | |
| 139 EXPECT_THAT(passwords_data().federated_credentials_forms(), | |
| 140 ElementsAre(Pointee(test_federated_form()))); | |
| 141 EXPECT_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, | |
| 142 passwords_data().state()); | |
| 143 EXPECT_EQ(origin, passwords_data().origin()); | |
| 144 | |
| 145 password_manager::CredentialInfo credential_info( | |
| 146 test_local_form(), | |
| 147 password_manager::CredentialType::CREDENTIAL_TYPE_LOCAL); | |
| 148 EXPECT_CALL(*this, OnChooseCredential(_)) | |
| 149 .WillOnce(testing::SaveArg<0>(&credential_info)); | |
| 150 passwords_data().TransitionToState(password_manager::ui::MANAGE_STATE); | |
| 151 EXPECT_EQ(password_manager::CredentialType::CREDENTIAL_TYPE_EMPTY, | |
| 152 credential_info.type); | |
| 153 EXPECT_TRUE(passwords_data().credentials_callback().is_null()); | |
| 154 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 155 ElementsAre(Pointee(test_local_form()))); | |
| 156 EXPECT_THAT(passwords_data().federated_credentials_forms(), | |
| 157 ElementsAre(Pointee(test_federated_form()))); | |
| 158 EXPECT_EQ(password_manager::ui::MANAGE_STATE, passwords_data().state()); | |
| 159 EXPECT_EQ(origin, passwords_data().origin()); | |
| 160 } | |
| 161 | |
| 162 TEST_F(ManagePasswordsStateTest, AutoSignin) { | |
| 163 ScopedVector<autofill::PasswordForm> local_credentials; | |
| 164 local_credentials.push_back(new autofill::PasswordForm(test_local_form())); | |
| 165 passwords_data().OnAutoSignin(local_credentials.Pass()); | |
| 166 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 167 ElementsAre(Pointee(test_local_form()))); | |
| 168 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 169 EXPECT_EQ(password_manager::ui::AUTO_SIGNIN_STATE, passwords_data().state()); | |
| 170 EXPECT_EQ(test_local_form().origin, passwords_data().origin()); | |
| 171 | |
| 172 passwords_data().TransitionToState(password_manager::ui::MANAGE_STATE); | |
| 173 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 174 ElementsAre(Pointee(test_local_form()))); | |
| 175 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 176 EXPECT_EQ(password_manager::ui::MANAGE_STATE, passwords_data().state()); | |
| 177 EXPECT_EQ(test_local_form().origin, passwords_data().origin()); | |
| 178 } | |
| 179 | |
| 180 TEST_F(ManagePasswordsStateTest, AutomaticPasswordSave) { | |
| 181 scoped_ptr<password_manager::PasswordFormManager> test_form_manager( | |
| 182 CreateFormManager()); | |
| 183 test_form_manager->ProvisionallySave( | |
| 184 test_submitted_form(), | |
| 185 password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | |
| 186 | |
| 187 passwords_data().OnAutomaticPasswordSave(test_form_manager.Pass()); | |
| 188 EXPECT_EQ(password_manager::ui::CONFIRMATION_STATE, passwords_data().state()); | |
| 189 EXPECT_EQ(test_submitted_form().origin, passwords_data().origin()); | |
| 190 ASSERT_TRUE(passwords_data().form_manager()); | |
| 191 EXPECT_EQ(test_submitted_form(), | |
| 192 passwords_data().form_manager()->pending_credentials()); | |
| 193 | |
| 194 passwords_data().TransitionToState(password_manager::ui::MANAGE_STATE); | |
| 195 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 196 UnorderedElementsAre(Pointee(test_local_form()), | |
| 197 Pointee(test_submitted_form()))); | |
| 198 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 199 EXPECT_EQ(password_manager::ui::MANAGE_STATE, passwords_data().state()); | |
| 200 EXPECT_EQ(test_submitted_form().origin, passwords_data().origin()); | |
| 201 } | |
| 202 | |
| 203 TEST_F(ManagePasswordsStateTest, PasswordBlacklisted) { | |
| 204 scoped_ptr<password_manager::PasswordFormManager> test_form_manager( | |
| 205 CreateFormManager()); | |
| 206 test_form_manager->ProvisionallySave( | |
| 207 test_submitted_form(), | |
| 208 password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | |
| 209 passwords_data().OnPendingPassword(test_form_manager.Pass()); | |
| 210 passwords_data().TransitionToState(password_manager::ui::BLACKLIST_STATE); | |
| 211 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 212 ElementsAre(Pointee(test_local_form()))); | |
| 213 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 214 EXPECT_EQ(password_manager::ui::BLACKLIST_STATE, passwords_data().state()); | |
| 215 EXPECT_EQ(test_submitted_form().origin, passwords_data().origin()); | |
| 216 } | |
| 217 | |
| 218 TEST_F(ManagePasswordsStateTest, PasswordAutofilled) { | |
| 219 autofill::PasswordFormMap password_form_map; | |
| 220 password_form_map[test_local_form().username_value] = &test_local_form(); | |
| 221 passwords_data().OnPasswordAutofilled(password_form_map); | |
| 222 | |
| 223 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 224 ElementsAre(Pointee(test_local_form()))); | |
| 225 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 226 EXPECT_EQ(password_manager::ui::MANAGE_STATE, passwords_data().state()); | |
| 227 EXPECT_EQ(test_local_form().origin, passwords_data().origin()); | |
| 228 | |
| 229 // |passwords_data| should hold a separate copy of test_local_form(). | |
| 230 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 231 Not(Contains(&test_local_form()))); | |
| 232 } | |
| 233 | |
| 234 TEST_F(ManagePasswordsStateTest, InactiveOnPSLMatched) { | |
| 235 autofill::PasswordForm psl_matched_test_form = test_local_form(); | |
| 236 psl_matched_test_form.original_signon_realm = "http://pslmatched.example.com"; | |
| 237 autofill::PasswordFormMap password_form_map; | |
| 238 password_form_map[psl_matched_test_form.username_value] = | |
| 239 &psl_matched_test_form; | |
| 240 passwords_data().OnPasswordAutofilled(password_form_map); | |
| 241 | |
| 242 EXPECT_THAT(passwords_data().GetCurrentForms(), IsEmpty()); | |
| 243 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 244 EXPECT_EQ(password_manager::ui::INACTIVE_STATE, passwords_data().state()); | |
| 245 EXPECT_EQ(GURL::EmptyGURL(), passwords_data().origin()); | |
| 246 EXPECT_FALSE(passwords_data().form_manager()); | |
| 247 } | |
| 248 | |
| 249 TEST_F(ManagePasswordsStateTest, BlacklistBlockedAutofill) { | |
| 250 test_local_form().blacklisted_by_user = true; | |
| 251 autofill::PasswordFormMap password_form_map; | |
| 252 password_form_map[test_local_form().username_value] = &test_local_form(); | |
| 253 passwords_data().OnBlacklistBlockedAutofill(password_form_map); | |
| 254 | |
| 255 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 256 ElementsAre(Pointee(test_local_form()))); | |
| 257 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 258 EXPECT_EQ(password_manager::ui::BLACKLIST_STATE, passwords_data().state()); | |
| 259 EXPECT_EQ(test_local_form().origin, passwords_data().origin()); | |
| 260 | |
| 261 // |passwords_data| should hold a separate copy of test_local_form(). | |
| 262 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 263 Not(Contains(&test_local_form()))); | |
| 264 } | |
| 265 | |
| 266 TEST_F(ManagePasswordsStateTest, Unblacklist) { | |
| 267 autofill::PasswordFormMap password_form_map; | |
| 268 password_form_map[test_local_form().username_value] = &test_local_form(); | |
| 269 passwords_data().OnBlacklistBlockedAutofill(password_form_map); | |
| 270 EXPECT_EQ(password_manager::ui::BLACKLIST_STATE, passwords_data().state()); | |
| 271 passwords_data().TransitionToState(password_manager::ui::MANAGE_STATE); | |
| 272 | |
| 273 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 274 ElementsAre(Pointee(test_local_form()))); | |
| 275 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 276 EXPECT_EQ(password_manager::ui::MANAGE_STATE, passwords_data().state()); | |
| 277 EXPECT_EQ(test_local_form().origin, passwords_data().origin()); | |
| 278 } | |
| 279 | |
| 280 TEST_F(ManagePasswordsStateTest, OnInactive) { | |
| 281 scoped_ptr<password_manager::PasswordFormManager> test_form_manager( | |
| 282 CreateFormManager()); | |
| 283 test_form_manager->ProvisionallySave( | |
| 284 test_submitted_form(), | |
| 285 password_manager::PasswordFormManager::IGNORE_OTHER_POSSIBLE_USERNAMES); | |
| 286 passwords_data().OnPendingPassword(test_form_manager.Pass()); | |
| 287 EXPECT_EQ(password_manager::ui::PENDING_PASSWORD_STATE, | |
| 288 passwords_data().state()); | |
| 289 passwords_data().OnInactive(); | |
| 290 EXPECT_THAT(passwords_data().GetCurrentForms(), IsEmpty()); | |
| 291 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 292 EXPECT_EQ(password_manager::ui::INACTIVE_STATE, passwords_data().state()); | |
| 293 EXPECT_EQ(GURL::EmptyGURL(), passwords_data().origin()); | |
| 294 EXPECT_FALSE(passwords_data().form_manager()); | |
| 295 } | |
| 296 | |
| 297 TEST_F(ManagePasswordsStateTest, BackgroundAutofilledToBlacklisted) { | |
| 298 autofill::PasswordFormMap password_form_map; | |
| 299 password_form_map[test_local_form().username_value] = &test_local_form(); | |
| 300 passwords_data().OnPasswordAutofilled(password_form_map); | |
| 301 EXPECT_EQ(password_manager::ui::MANAGE_STATE, passwords_data().state()); | |
| 302 | |
| 303 autofill::PasswordForm blacklisted = test_local_form(); | |
| 304 blacklisted.blacklisted_by_user = true; | |
| 305 blacklisted.username_value = base::string16(); | |
|
vabr (Chromium)
2015/03/10 12:26:22
optional nit: Calling clear() is shorter and might
| |
| 306 password_manager::PasswordStoreChange change( | |
| 307 password_manager::PasswordStoreChange::ADD, blacklisted); | |
| 308 password_manager::PasswordStoreChangeList list(1, change); | |
| 309 passwords_data().ProcessLoginsChanged(list); | |
| 310 EXPECT_THAT(passwords_data().GetCurrentForms(), | |
| 311 UnorderedElementsAre(Pointee(test_local_form()), | |
| 312 Pointee(blacklisted))); | |
| 313 EXPECT_THAT(passwords_data().federated_credentials_forms(), IsEmpty()); | |
| 314 EXPECT_EQ(password_manager::ui::BLACKLIST_STATE, passwords_data().state()); | |
| 315 EXPECT_EQ(test_local_form().origin, passwords_data().origin()); | |
| 316 } | |
| 317 | |
| 318 } // namespace | |
| OLD | NEW |