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

Side by Side Diff: ios/chrome/browser/passwords/password_controller_js_unittest.mm

Issue 2152593002: Upstream password manager unit tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix GN Created 4 years, 5 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
OLDNEW
(Empty)
1 // Copyright 2013 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 #import <Foundation/Foundation.h>
6
7 #import "ios/chrome/browser/passwords/js_password_manager.h"
8 #import "ios/web/public/test/web_js_test.h"
9 #import "ios/web/public/test/web_test_with_web_state.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "testing/gtest_mac.h"
12
13 // Unit tests for ios/chrome/browser/web/resources/password_controller.js
14 namespace {
15
16 // Text fixture to test password controller.
17 class PasswordControllerJsTest
18 : public web::WebJsTest<web::WebTestWithWebState> {
19 public:
20 PasswordControllerJsTest()
21 : web::WebJsTest<web::WebTestWithWebState>(@[ @"password_controller" ]) {}
22 };
23
24 // IDs used in the Username and Password <input> elements.
25 NSString* const kEmailInputID = @"Email";
26 NSString* const kPasswordInputID = @"Passwd";
27
28 // Returns an autoreleased string of an HTML form that is similar to the
29 // Google Accounts sign in form. |email| may be nil if the form does not
30 // need to be pre-filled with the username. Use |isReadOnly| flag to indicate
31 // if the email field should be read-only.
32 NSString* GAIASignInForm(NSString* formAction,
33 NSString* email,
34 BOOL isReadOnly) {
35 return [NSString
36 stringWithFormat:
37 @"<html><body>"
38 "<form novalidate method=\"post\" action=\"%@\" "
39 "id=\"gaia_loginform\">"
40 " <input name=\"GALX\" type=\"hidden\" value=\"abcdefghij\">"
41 " <input name=\"service\" type=\"hidden\" value=\"mail\">"
42 " <input id=\"%@\" name=\"Email\" type=\"email\" value=\"%@\" %@>"
43 " <input id=\"%@\" name=\"Passwd\" type=\"password\" "
44 " placeholder=\"Password\">"
45 "</form></body></html>",
46 formAction, kEmailInputID, email ? email : @"",
47 isReadOnly ? @"readonly" : @"", kPasswordInputID];
48 }
49
50 // Returns an autoreleased string of JSON for a parsed form.
51 NSString* GAIASignInFormData(NSString* formAction) {
52 return [NSString stringWithFormat:@"{"
53 " \"action\":\"%@\","
54 " \"origin\":\"%@\","
55 " \"fields\":["
56 " {\"name\":\"%@\", \"value\":\"\"},"
57 " {\"name\":\"%@\",\"value\":\"\"}"
58 " ]"
59 "}",
60 formAction, formAction, kEmailInputID,
61 kPasswordInputID];
62 }
63
64 TEST_F(PasswordControllerJsTest,
Eugene But (OOO till 7-30) 2016/07/13 22:30:31 If you understand the purpose if these tests, coul
vabr (Chromium) 2016/07/14 07:36:31 Done, this was a good exercise. :)
65 FillPasswordFormWithPrefilledUsername_SucceedsWhenUsernameMatches) {
66 NSString* const formAction = @"https://accounts.google.com/ServiceLoginAuth";
67 NSString* const username = @"john.doe@gmail.com";
68 NSString* const password = @"super!secret";
69 LoadHtmlAndInject(GAIASignInForm(formAction, username, YES));
70 EXPECT_NSEQ(@"true", EvaluateJavaScriptWithFormat(
71 @"__gCrWeb.fillPasswordForm(%@, '%@', '%@', '%@')",
72 GAIASignInFormData(formAction), username, password,
73 formAction));
74 // Verifies that the sign-in form has been filled with username/password.
75 EvaluateJavaScriptOnElementsAndCheck(@"document.getElementById('%@').value",
76 @[ kEmailInputID, kPasswordInputID ],
77 @[ username, password ]);
78 }
79
80 TEST_F(PasswordControllerJsTest,
81 FillPasswordFormWithPrefilledUsername_FailsWhenUsernameMismatched) {
82 NSString* const formAction = @"https://accounts.google.com/ServiceLoginAuth";
83 NSString* const username1 = @"john.doe@gmail.com";
84 NSString* const username2 = @"jean.dubois@gmail.com";
85 NSString* const password = @"super!secret";
86 LoadHtmlAndInject(GAIASignInForm(formAction, username1, YES));
87 EXPECT_NSEQ(@"false", EvaluateJavaScriptWithFormat(
88 @"__gCrWeb.fillPasswordForm(%@, '%@', '%@', '%@')",
89 GAIASignInFormData(formAction), username2, password,
90 formAction));
91 // Verifies that the sign-in form has not been filled.
92 EvaluateJavaScriptOnElementsAndCheck(@"document.getElementById('%@').value",
93 @[ kEmailInputID, kPasswordInputID ],
94 @[ username1, @"" ]);
95 }
96
97 TEST_F(PasswordControllerJsTest,
98 FillPasswordFormWithPrefilledUsername_SucceedsByOverridingUsername) {
99 NSString* const formAction = @"https://accounts.google.com/ServiceLoginAuth";
100 NSString* const username1 = @"john.doe@gmail.com";
101 NSString* const username2 = @"jane.doe@gmail.com";
102 NSString* const password = @"super!secret";
103 LoadHtmlAndInject(GAIASignInForm(formAction, username1, NO));
104 EXPECT_NSEQ(@"true", EvaluateJavaScriptWithFormat(
105 @"__gCrWeb.fillPasswordForm(%@, '%@', '%@', '%@')",
106 GAIASignInFormData(formAction), username2, password,
107 formAction));
108 // Verifies that the sign-in form has been filled with the new username
109 // and password.
110 EvaluateJavaScriptOnElementsAndCheck(@"document.getElementById('%@').value",
111 @[ kEmailInputID, kPasswordInputID ],
112 @[ username2, password ]);
113 }
114
115 TEST_F(PasswordControllerJsTest,
116 FillPasswordFormWithGeneratedPassword_FailsWhenFormNotFound) {
117 LoadHtmlAndInject(@"<html>"
118 " <body>"
119 " <form name=\"foo\">"
120 " <input type=\"password\" name=\"ps\">"
121 " </form>"
122 " </body"
123 "</html>");
124 NSString* const formName = @"bar";
125 NSString* const password = @"abc";
126 EXPECT_NSEQ(@"false",
127 EvaluateJavaScriptWithFormat(
128 @"__gCrWeb.fillPasswordFormWithGeneratedPassword('%@', '%@')",
129 formName, password));
130 }
131
132 TEST_F(PasswordControllerJsTest,
133 FillPasswordFormWithGeneratedPassword_FailsWhenNoFieldsFilled) {
134 LoadHtmlAndInject(@"<html>"
135 " <body>"
136 " <form name=\"foo\">"
137 " <input type=\"text\" name=\"user\">"
138 " <input type=\"submit\" name=\"go\">"
139 " </form>"
140 " </body"
141 "</html>");
142 NSString* const formName = @"foo";
143 NSString* const password = @"abc";
144 EXPECT_NSEQ(@"false",
145 EvaluateJavaScriptWithFormat(
146 @"__gCrWeb.fillPasswordFormWithGeneratedPassword('%@', '%@')",
147 formName, password));
148 }
149
150 TEST_F(PasswordControllerJsTest,
151 FillPasswordFormWithGeneratedPassword_SucceedsWhenFieldsFilled) {
152 LoadHtmlAndInject(@"<html>"
153 " <body>"
154 " <form name=\"foo\">"
155 " <input type=\"text\" id=\"user\" name=\"user\">"
156 " <input type=\"password\" id=\"ps1\" name=\"ps1\">"
157 " <input type=\"password\" id=\"ps2\" name=\"ps2\">"
158 " <input type=\"submit\" name=\"go\">"
159 " </form>"
160 " </body"
161 "</html>");
162 NSString* const formName = @"foo";
163 NSString* const password = @"abc";
164 EXPECT_NSEQ(@"true",
165 EvaluateJavaScriptWithFormat(
166 @"__gCrWeb.fillPasswordFormWithGeneratedPassword('%@', '%@')",
167 formName, password));
168 EXPECT_NSEQ(@"true",
169 EvaluateJavaScriptWithFormat(
170 @"document.getElementById('ps1').value == '%@'", password));
171 EXPECT_NSEQ(@"true",
172 EvaluateJavaScriptWithFormat(
173 @"document.getElementById('ps2').value == '%@'", password));
174 EXPECT_NSEQ(@"false",
175 EvaluateJavaScriptWithFormat(
176 @"document.getElementById('user').value == '%@'", password));
177 }
178
179 TEST_F(PasswordControllerJsTest,
180 FindAndPreparePasswordFormsSingleFrameSingleForm) {
181 LoadHtmlAndInject(
182 @"<html><body>"
183 "<form action='/generic_submit' method='post' name='login_form'>"
184 " Name: <input type='text' name='name'>"
185 " Password: <input type='password' name='password'>"
186 " <input type='submit' value='Submit'>"
187 "</form>"
188 "</body></html>");
189
190 const std::string base_url = BaseUrl();
191 NSString* result = [NSString
192 stringWithFormat:
193 @"[{\"action\":\"/generic_submit\","
194 "\"method\":\"post\","
195 "\"name\":\"login_form\","
196 "\"origin\":\"%s\","
197 "\"fields\":[{\"element\":\"name\",\"type\":\"text\"},"
198 "{\"element\":\"password\",\"type\":\"password\"},"
199 "{\"element\":\"\",\"type\":\"submit\"}],"
200 "\"usernameElement\":\"name\","
201 "\"usernameValue\":\"\","
202 "\"passwords\":[{\"element\":\"password\",\"value\":\"\"}]}]",
203 base_url.c_str()];
204 EXPECT_NSEQ(result,
205 EvaluateJavaScriptWithFormat(@"__gCrWeb.findPasswordForms()"));
206 };
207
208 TEST_F(PasswordControllerJsTest,
209 FindAndPreparePasswordFormsSingleFrameMultipleForms) {
210 LoadHtmlAndInject(
211 @"<html><body>"
212 "<form action='/generic_submit' method='post' id='login_form1'>"
213 " Name: <input type='text' name='name'>"
214 " Password: <input type='password' name='password'>"
215 " <input type='submit' value='Submit'>"
216 "</form>"
217 "<form action='/generic_s2' method='post' name='login_form2'>"
218 " Name: <input type='text' name='name2'>"
219 " Password: <input type='password' name='password2'>"
220 " <input type='submit' value='Submit'>"
221 "</form>"
222 "</body></html>");
223
224 const std::string base_url = BaseUrl();
225 NSString* result = [NSString
226 stringWithFormat:
227 @"[{\"action\":\"/generic_submit\","
228 "\"method\":\"post\","
229 "\"name\":\"login_form1\","
230 "\"origin\":\"%s\","
231 "\"fields\":[{\"element\":\"name\",\"type\":\"text\"},"
232 "{\"element\":\"password\",\"type\":\"password\"},"
233 "{\"element\":\"\",\"type\":\"submit\"}],"
234 "\"usernameElement\":\"name\","
235 "\"usernameValue\":\"\","
236 "\"passwords\":[{\"element\":\"password\",\"value\":\"\"}]},"
237 "{\"action\":\"/generic_s2\","
238 "\"method\":\"post\","
239 "\"name\":\"login_form2\","
240 "\"origin\":\"%s\","
241 "\"fields\":[{\"element\":\"name2\",\"type\":\"text\"},"
242 "{\"element\":\"password2\",\"type\":\"password\"},"
243 "{\"element\":\"\",\"type\":\"submit\"}],"
244 "\"usernameElement\":\"name2\","
245 "\"usernameValue\":\"\","
246 "\"passwords\":[{\"element\":\"password2\",\"value\":\"\"}]}]",
247 base_url.c_str(), base_url.c_str()];
248 EXPECT_NSEQ(result,
249 EvaluateJavaScriptWithFormat(@"__gCrWeb.findPasswordForms()"));
250 };
251
252 TEST_F(PasswordControllerJsTest, GetPasswordFormData) {
253 LoadHtmlAndInject(
254 @"<html><body>"
255 "<form name='np' id='np1' action='/generic_submit' method='post'>"
256 " Name: <input type='text' name='name'>"
257 " Password: <input type='password' name='password'>"
258 " <input type='submit' value='Submit'>"
259 "</form>"
260 "</body></html>");
261
262 const std::string base_url = BaseUrl();
263 NSString* parameter = @"window.document.getElementsByTagName('form')[0]";
264 NSString* result = [NSString
265 stringWithFormat:
266 @"{\"action\":\"/generic_submit\","
267 "\"method\":\"post\","
268 "\"name\":\"np\","
269 "\"origin\":\"%s\","
270 "\"fields\":[{\"element\":\"name\",\"type\":\"text\"},"
271 "{\"element\":\"password\",\"type\":\"password\"},"
272 "{\"element\":\"\",\"type\":\"submit\"}],"
273 "\"usernameElement\":\"name\","
274 "\"usernameValue\":\"\","
275 "\"passwords\":[{\"element\":\"password\",\"value\":\"\"}]}",
276 base_url.c_str()];
277 EXPECT_NSEQ(
278 result,
279 EvaluateJavaScriptWithFormat(
280 @"__gCrWeb.stringify(__gCrWeb.getPasswordFormData(%@))", parameter));
281 };
282
283 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698