1// Copyright 2014 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 "components/autofill/core/common/save_password_progress_logger.h"
6
7#include <limits>
8
9#include "base/bind.h"
10#include "base/logging.h"
11#include "base/memory/scoped_ptr.h"
12#include "base/strings/stringprintf.h"
13#include "base/strings/utf_string_conversions.h"
14#include "components/autofill/core/common/password_form.h"
15#include "testing/gtest/include/gtest/gtest.h"
16#include "url/gurl.h"
17
18using base::UTF8ToUTF16;
19
20namespace autofill {
21
22namespace {
23
24const char kTestString[] = "Message";  // Corresponds to STRING_MESSAGE.
25
26class TestLogger : public SavePasswordProgressLogger {
27 public:
28  bool LogsContainSubstring(const std::string& substring) {
29    return accumulated_log_.find(substring) != std::string::npos;
30  }
31
32  std::string accumulated_log() { return accumulated_log_; }
33
34 private:
35  virtual void SendLog(const std::string& log) OVERRIDE {
36    accumulated_log_.append(log);
37  }
38
39  std::string accumulated_log_;
40};
41
42};  // namespace
43
44TEST(SavePasswordProgressLoggerTest, LogPasswordForm) {
45  TestLogger logger;
46  PasswordForm form;
47  form.action = GURL("http://example.org/verysecret?verysecret");
48  form.password_element = UTF8ToUTF16("pwdelement");
49  form.password_value = UTF8ToUTF16("verysecret");
50  form.username_value = UTF8ToUTF16("verysecret");
51  logger.LogPasswordForm(SavePasswordProgressLogger::STRING_MESSAGE, form);
52  SCOPED_TRACE(testing::Message() << "Log string = ["
53                                  << logger.accumulated_log() << "]");
54  EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
55  EXPECT_TRUE(logger.LogsContainSubstring("pwdelement"));
56  EXPECT_TRUE(logger.LogsContainSubstring("http://example.org"));
57  EXPECT_FALSE(logger.LogsContainSubstring("verysecret"));
58}
59
60TEST(SavePasswordProgressLoggerTest, LogPasswordFormElementID) {
61  // Test filtering element IDs.
62  TestLogger logger;
63  PasswordForm form;
64  const std::string kHTMLInside("Username <script> element");
65  const std::string kHTMLInsideExpected("username  script  element");
66  const std::string kIPAddressInside("y128.0.0.1Y");
67  const std::string kIPAddressInsideExpected("y128 0 0 1y");
68  const std::string kSpecialCharsInside("X@#a$%B&*c()D;:e+!x");
69  const std::string kSpecialCharsInsideExpected("x  a  b  c  d  e  x");
70  form.username_element = UTF8ToUTF16(kHTMLInside);
71  form.password_element = UTF8ToUTF16(kIPAddressInside);
72  form.new_password_element = UTF8ToUTF16(kSpecialCharsInside);
73  logger.LogPasswordForm(SavePasswordProgressLogger::STRING_MESSAGE, form);
74  SCOPED_TRACE(testing::Message() << "Log string = ["
75                                  << logger.accumulated_log() << "]");
76  EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
77  EXPECT_FALSE(logger.LogsContainSubstring(kHTMLInside));
78  EXPECT_TRUE(logger.LogsContainSubstring(kHTMLInsideExpected));
79  EXPECT_FALSE(logger.LogsContainSubstring(kIPAddressInside));
80  EXPECT_TRUE(logger.LogsContainSubstring(kIPAddressInsideExpected));
81  EXPECT_FALSE(logger.LogsContainSubstring(kSpecialCharsInside));
82  EXPECT_TRUE(logger.LogsContainSubstring(kSpecialCharsInsideExpected));
83}
84
85TEST(SavePasswordProgressLoggerTest, LogHTMLForm) {
86  TestLogger logger;
87  logger.LogHTMLForm(SavePasswordProgressLogger::STRING_MESSAGE,
88                     "form_name",
89                     GURL("http://example.org/verysecret?verysecret"));
90  SCOPED_TRACE(testing::Message() << "Log string = ["
91                                  << logger.accumulated_log() << "]");
92  EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
93  EXPECT_TRUE(logger.LogsContainSubstring("form_name"));
94  EXPECT_TRUE(logger.LogsContainSubstring("http://example.org"));
95  EXPECT_FALSE(logger.LogsContainSubstring("verysecret"));
96}
97
98TEST(SavePasswordProgressLoggerTest, LogURL) {
99  TestLogger logger;
100  logger.LogURL(SavePasswordProgressLogger::STRING_MESSAGE,
101                GURL("http://example.org/verysecret?verysecret"));
102  SCOPED_TRACE(testing::Message() << "Log string = ["
103                                  << logger.accumulated_log() << "]");
104  EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
105  EXPECT_TRUE(logger.LogsContainSubstring("http://example.org"));
106  EXPECT_FALSE(logger.LogsContainSubstring("verysecret"));
107}
108
109TEST(SavePasswordProgressLoggerTest, LogBooleanTrue) {
110  TestLogger logger;
111  logger.LogBoolean(SavePasswordProgressLogger::STRING_MESSAGE, true);
112  SCOPED_TRACE(testing::Message() << "Log string = ["
113                                  << logger.accumulated_log() << "]");
114  EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
115  EXPECT_TRUE(logger.LogsContainSubstring("true"));
116}
117
118TEST(SavePasswordProgressLoggerTest, LogBooleanFalse) {
119  TestLogger logger;
120  logger.LogBoolean(SavePasswordProgressLogger::STRING_MESSAGE, false);
121  SCOPED_TRACE(testing::Message() << "Log string = ["
122                                  << logger.accumulated_log() << "]");
123  EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
124  EXPECT_TRUE(logger.LogsContainSubstring("false"));
125}
126
127TEST(SavePasswordProgressLoggerTest, LogSignedNumber) {
128  TestLogger logger;
129  int signed_number = -12345;
130  logger.LogNumber(SavePasswordProgressLogger::STRING_MESSAGE, signed_number);
131  SCOPED_TRACE(testing::Message() << "Log string = ["
132                                  << logger.accumulated_log() << "]");
133  EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
134  EXPECT_TRUE(logger.LogsContainSubstring("-12345"));
135}
136
137TEST(SavePasswordProgressLoggerTest, LogUnsignedNumber) {
138  TestLogger logger;
139  size_t unsigned_number = 654321;
140  logger.LogNumber(SavePasswordProgressLogger::STRING_MESSAGE, unsigned_number);
141  SCOPED_TRACE(testing::Message() << "Log string = ["
142                                  << logger.accumulated_log() << "]");
143  EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
144  EXPECT_TRUE(logger.LogsContainSubstring("654321"));
145}
146
147TEST(SavePasswordProgressLoggerTest, LogMessage) {
148  TestLogger logger;
149  logger.LogMessage(SavePasswordProgressLogger::STRING_MESSAGE);
150  SCOPED_TRACE(testing::Message() << "Log string = ["
151                                  << logger.accumulated_log() << "]");
152  EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
153}
154
155}  // namespace autofill
156