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.
5 #include "components/autofill/core/common/password_form_fill_data.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "components/autofill/core/common/password_form.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
14 // Tests that the when there is a single preferred match, and no extra
15 // matches, the PasswordFormFillData is filled in correctly.
16 TEST(PasswordFormFillDataTest, TestSinglePreferredMatch) {
17 // Create the current form on the page.
18 PasswordForm form_on_page;
19 form_on_page.origin = GURL("https://foo.com/");
20 form_on_page.action = GURL("https://foo.com/login");
21 form_on_page.username_element = ASCIIToUTF16("username");
22 form_on_page.username_value = ASCIIToUTF16("test@gmail.com");
23 form_on_page.password_element = ASCIIToUTF16("password");
24 form_on_page.password_value = ASCIIToUTF16("test");
25 form_on_page.submit_element = ASCIIToUTF16("");
26 form_on_page.signon_realm = "https://foo.com/";
27 form_on_page.ssl_valid = true;
28 form_on_page.preferred = false;
29 form_on_page.scheme = PasswordForm::SCHEME_HTML;
31 // Create an exact match in the database.
32 PasswordForm preferred_match;
33 preferred_match.origin = GURL("https://foo.com/");
34 preferred_match.action = GURL("https://foo.com/login");
35 preferred_match.username_element = ASCIIToUTF16("username");
36 preferred_match.username_value = ASCIIToUTF16("test@gmail.com");
37 preferred_match.password_element = ASCIIToUTF16("password");
38 preferred_match.password_value = ASCIIToUTF16("test");
39 preferred_match.submit_element = ASCIIToUTF16("");
40 preferred_match.signon_realm = "https://foo.com/";
41 preferred_match.ssl_valid = true;
42 preferred_match.preferred = true;
43 preferred_match.scheme = PasswordForm::SCHEME_HTML;
45 PasswordFormMap matches;
47 PasswordFormFillData result;
48 InitPasswordFormFillData(form_on_page,
55 // |wait_for_username| should reflect the |wait_for_username_before_autofill|
56 // argument of InitPasswordFormFillData which in this case is true.
57 EXPECT_TRUE(result.wait_for_username);
58 // The preferred realm should be empty since it's the same as the realm of
60 EXPECT_EQ(result.preferred_realm, "");
62 PasswordFormFillData result2;
63 InitPasswordFormFillData(form_on_page,
70 // |wait_for_username| should reflect the |wait_for_username_before_autofill|
71 // argument of InitPasswordFormFillData which in this case is false.
72 EXPECT_FALSE(result2.wait_for_username);
75 // Tests that the InitPasswordFormFillData behaves correctly when there is a
76 // preferred match that was found using public suffix matching, an additional
77 // result that also used public suffix matching, and a third result that was
78 // found without using public suffix matching.
79 TEST(PasswordFormFillDataTest, TestPublicSuffixDomainMatching) {
80 // Create the current form on the page.
81 PasswordForm form_on_page;
82 form_on_page.origin = GURL("https://foo.com/");
83 form_on_page.action = GURL("https://foo.com/login");
84 form_on_page.username_element = ASCIIToUTF16("username");
85 form_on_page.username_value = ASCIIToUTF16("test@gmail.com");
86 form_on_page.password_element = ASCIIToUTF16("password");
87 form_on_page.password_value = ASCIIToUTF16("test");
88 form_on_page.submit_element = ASCIIToUTF16("");
89 form_on_page.signon_realm = "https://foo.com/";
90 form_on_page.ssl_valid = true;
91 form_on_page.preferred = false;
92 form_on_page.scheme = PasswordForm::SCHEME_HTML;
94 // Create a match from the database that matches using public suffix.
95 PasswordForm preferred_match;
96 preferred_match.origin = GURL("https://mobile.foo.com/");
97 preferred_match.action = GURL("https://mobile.foo.com/login");
98 preferred_match.username_element = ASCIIToUTF16("username");
99 preferred_match.username_value = ASCIIToUTF16("test@gmail.com");
100 preferred_match.password_element = ASCIIToUTF16("password");
101 preferred_match.password_value = ASCIIToUTF16("test");
102 preferred_match.submit_element = ASCIIToUTF16("");
103 preferred_match.signon_realm = "https://mobile.foo.com/";
104 preferred_match.original_signon_realm = "https://foo.com/";
105 preferred_match.ssl_valid = true;
106 preferred_match.preferred = true;
107 preferred_match.scheme = PasswordForm::SCHEME_HTML;
109 // Create a match that matches exactly, so |original_signon_realm| is not set.
110 PasswordForm exact_match;
111 exact_match.origin = GURL("https://foo.com/");
112 exact_match.action = GURL("https://foo.com/login");
113 exact_match.username_element = ASCIIToUTF16("username");
114 exact_match.username_value = ASCIIToUTF16("test1@gmail.com");
115 exact_match.password_element = ASCIIToUTF16("password");
116 exact_match.password_value = ASCIIToUTF16("test");
117 exact_match.submit_element = ASCIIToUTF16("");
118 exact_match.signon_realm = "https://foo.com/";
119 exact_match.ssl_valid = true;
120 exact_match.preferred = false;
121 exact_match.scheme = PasswordForm::SCHEME_HTML;
123 // Create a match that was matched using public suffix, so
124 // |original_signon_realm| is set to where the result came from.
125 PasswordForm public_suffix_match;
126 public_suffix_match.origin = GURL("https://foo.com/");
127 public_suffix_match.action = GURL("https://foo.com/login");
128 public_suffix_match.username_element = ASCIIToUTF16("username");
129 public_suffix_match.username_value = ASCIIToUTF16("test2@gmail.com");
130 public_suffix_match.password_element = ASCIIToUTF16("password");
131 public_suffix_match.password_value = ASCIIToUTF16("test");
132 public_suffix_match.submit_element = ASCIIToUTF16("");
133 public_suffix_match.original_signon_realm = "https://subdomain.foo.com/";
134 public_suffix_match.signon_realm = "https://foo.com/";
135 public_suffix_match.ssl_valid = true;
136 public_suffix_match.preferred = false;
137 public_suffix_match.scheme = PasswordForm::SCHEME_HTML;
139 // Add one exact match and one public suffix match.
140 PasswordFormMap matches;
141 matches[exact_match.username_value] = &exact_match;
142 matches[public_suffix_match.username_value] = &public_suffix_match;
144 PasswordFormFillData result;
145 InitPasswordFormFillData(form_on_page,
151 EXPECT_TRUE(result.wait_for_username);
152 // The preferred realm should match the original signon realm from the
153 // preferred match so the user can see where the result came from.
154 EXPECT_EQ(result.preferred_realm,
155 preferred_match.original_signon_realm);
157 // The realm of the exact match should be empty.
158 PasswordFormFillData::LoginCollection::const_iterator iter =
159 result.additional_logins.find(exact_match.username_value);
160 EXPECT_EQ(iter->second.realm, "");
162 // The realm of the public suffix match should be set to the original signon
163 // realm so the user can see where the result came from.
164 iter = result.additional_logins.find(public_suffix_match.username_value);
165 EXPECT_EQ(iter->second.realm, public_suffix_match.original_signon_realm);
168 } // namespace autofill