1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/common/password_form_fill_data.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/utf_string_conversions.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/autofill/core/common/password_form.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace autofill {
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that the when there is a single preferred match, and no extra
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// matches, the PasswordFormFillData is filled in correctly.
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(PasswordFormFillDataTest, TestSinglePreferredMatch) {
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Create the current form on the page.
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordForm form_on_page;
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.origin = GURL("https://foo.com/");
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.action = GURL("https://foo.com/login");
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.username_element = ASCIIToUTF16("username");
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.username_value = ASCIIToUTF16("test@gmail.com");
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.password_element = ASCIIToUTF16("password");
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.password_value = ASCIIToUTF16("test");
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.submit_element = ASCIIToUTF16("");
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.signon_realm = "https://foo.com/";
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.ssl_valid = true;
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.preferred = false;
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.scheme = PasswordForm::SCHEME_HTML;
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Create an exact match in the database.
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordForm preferred_match;
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.origin = GURL("https://foo.com/");
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.action = GURL("https://foo.com/login");
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.username_element = ASCIIToUTF16("username");
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.username_value = ASCIIToUTF16("test@gmail.com");
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.password_element = ASCIIToUTF16("password");
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.password_value = ASCIIToUTF16("test");
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.submit_element = ASCIIToUTF16("");
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.signon_realm = "https://foo.com/";
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.ssl_valid = true;
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.preferred = true;
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.scheme = PasswordForm::SCHEME_HTML;
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordFormMap matches;
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordFormFillData result;
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  InitPasswordFormFillData(form_on_page,
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           matches,
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           &preferred_match,
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           true,
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           false,
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           &result);
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |wait_for_username| should reflect the |wait_for_username_before_autofill|
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // argument of InitPasswordFormFillData which in this case is true.
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(result.wait_for_username);
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // The preferred realm should be empty since it's the same as the realm of
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // the form.
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(result.preferred_realm, "");
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordFormFillData result2;
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  InitPasswordFormFillData(form_on_page,
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           matches,
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           &preferred_match,
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           false,
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           false,
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           &result2);
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |wait_for_username| should reflect the |wait_for_username_before_autofill|
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // argument of InitPasswordFormFillData which in this case is false.
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(result2.wait_for_username);
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that the InitPasswordFormFillData behaves correctly when there is a
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// preferred match that was found using public suffix matching, an additional
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// result that also used public suffix matching, and a third result that was
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found without using public suffix matching.
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(PasswordFormFillDataTest, TestPublicSuffixDomainMatching) {
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Create the current form on the page.
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordForm form_on_page;
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.origin = GURL("https://foo.com/");
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.action = GURL("https://foo.com/login");
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.username_element = ASCIIToUTF16("username");
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.username_value = ASCIIToUTF16("test@gmail.com");
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.password_element = ASCIIToUTF16("password");
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.password_value = ASCIIToUTF16("test");
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.submit_element = ASCIIToUTF16("");
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.signon_realm = "https://foo.com/";
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.ssl_valid = true;
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.preferred = false;
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  form_on_page.scheme = PasswordForm::SCHEME_HTML;
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Create a match from the database that matches using public suffix.
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordForm preferred_match;
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.origin = GURL("https://mobile.foo.com/");
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.action = GURL("https://mobile.foo.com/login");
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.username_element = ASCIIToUTF16("username");
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.username_value = ASCIIToUTF16("test@gmail.com");
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.password_element = ASCIIToUTF16("password");
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.password_value = ASCIIToUTF16("test");
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.submit_element = ASCIIToUTF16("");
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.signon_realm = "https://mobile.foo.com/";
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.original_signon_realm = "https://foo.com/";
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.ssl_valid = true;
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.preferred = true;
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  preferred_match.scheme = PasswordForm::SCHEME_HTML;
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Create a match that matches exactly, so |original_signon_realm| is not set.
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordForm exact_match;
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exact_match.origin = GURL("https://foo.com/");
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exact_match.action = GURL("https://foo.com/login");
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exact_match.username_element = ASCIIToUTF16("username");
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exact_match.username_value = ASCIIToUTF16("test1@gmail.com");
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exact_match.password_element = ASCIIToUTF16("password");
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exact_match.password_value = ASCIIToUTF16("test");
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exact_match.submit_element = ASCIIToUTF16("");
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exact_match.signon_realm = "https://foo.com/";
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exact_match.ssl_valid = true;
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exact_match.preferred = false;
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  exact_match.scheme = PasswordForm::SCHEME_HTML;
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Create a match that was matched using public suffix, so
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |original_signon_realm| is set to where the result came from.
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordForm public_suffix_match;
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public_suffix_match.origin = GURL("https://foo.com/");
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public_suffix_match.action = GURL("https://foo.com/login");
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public_suffix_match.username_element = ASCIIToUTF16("username");
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public_suffix_match.username_value = ASCIIToUTF16("test2@gmail.com");
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public_suffix_match.password_element = ASCIIToUTF16("password");
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public_suffix_match.password_value = ASCIIToUTF16("test");
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public_suffix_match.submit_element = ASCIIToUTF16("");
135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  public_suffix_match.original_signon_realm = "https://subdomain.foo.com/";
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public_suffix_match.signon_realm = "https://foo.com/";
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public_suffix_match.ssl_valid = true;
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public_suffix_match.preferred = false;
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  public_suffix_match.scheme = PasswordForm::SCHEME_HTML;
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Add one exact match and one public suffix match.
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordFormMap matches;
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  matches[exact_match.username_value] = &exact_match;
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  matches[public_suffix_match.username_value] = &public_suffix_match;
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordFormFillData result;
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  InitPasswordFormFillData(form_on_page,
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           matches,
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           &preferred_match,
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           true,
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           false,
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           &result);
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(result.wait_for_username);
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The preferred realm should match the original signon realm from the
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // preferred match so the user can see where the result came from.
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(result.preferred_realm,
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            preferred_match.original_signon_realm);
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // The realm of the exact match should be empty.
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PasswordFormFillData::LoginCollection::const_iterator iter =
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      result.additional_logins.find(exact_match.username_value);
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(iter->second.realm, "");
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The realm of the public suffix match should be set to the original signon
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // realm so the user can see where the result came from.
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  iter = result.additional_logins.find(public_suffix_match.username_value);
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(iter->second.realm, public_suffix_match.original_signon_realm);
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace autofill
171