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
18 using base::UTF8ToUTF16;
19
20 namespace autofill {
21
22 namespace {
23
24 const char kTestString[] = "Message"; // Corresponds to STRING_MESSAGE.
25
26 class TestLogger : public SavePasswordProgressLogger {
27 public:
LogsContainSubstring(const std::string & substring)28 bool LogsContainSubstring(const std::string& substring) {
29 return accumulated_log_.find(substring) != std::string::npos;
30 }
31
accumulated_log()32 std::string accumulated_log() { return accumulated_log_; }
33
34 private:
SendLog(const std::string & log)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
TEST(SavePasswordProgressLoggerTest,LogPasswordForm)44 TEST(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
TEST(SavePasswordProgressLoggerTest,LogPasswordFormElementID)60 TEST(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.old_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
TEST(SavePasswordProgressLoggerTest,LogHTMLForm)85 TEST(SavePasswordProgressLoggerTest, LogHTMLForm) {
86 TestLogger logger;
87 logger.LogHTMLForm(SavePasswordProgressLogger::STRING_MESSAGE,
88 "form_name",
89 "post",
90 GURL("http://example.org/verysecret?verysecret"));
91 SCOPED_TRACE(testing::Message() << "Log string = ["
92 << logger.accumulated_log() << "]");
93 EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
94 EXPECT_TRUE(logger.LogsContainSubstring("form_name"));
95 EXPECT_TRUE(logger.LogsContainSubstring("POST"));
96 EXPECT_TRUE(logger.LogsContainSubstring("http://example.org"));
97 EXPECT_FALSE(logger.LogsContainSubstring("verysecret"));
98 }
99
TEST(SavePasswordProgressLoggerTest,LogURL)100 TEST(SavePasswordProgressLoggerTest, LogURL) {
101 TestLogger logger;
102 logger.LogURL(SavePasswordProgressLogger::STRING_MESSAGE,
103 GURL("http://example.org/verysecret?verysecret"));
104 SCOPED_TRACE(testing::Message() << "Log string = ["
105 << logger.accumulated_log() << "]");
106 EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
107 EXPECT_TRUE(logger.LogsContainSubstring("http://example.org"));
108 EXPECT_FALSE(logger.LogsContainSubstring("verysecret"));
109 }
110
TEST(SavePasswordProgressLoggerTest,LogBooleanTrue)111 TEST(SavePasswordProgressLoggerTest, LogBooleanTrue) {
112 TestLogger logger;
113 logger.LogBoolean(SavePasswordProgressLogger::STRING_MESSAGE, true);
114 SCOPED_TRACE(testing::Message() << "Log string = ["
115 << logger.accumulated_log() << "]");
116 EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
117 EXPECT_TRUE(logger.LogsContainSubstring("true"));
118 }
119
TEST(SavePasswordProgressLoggerTest,LogBooleanFalse)120 TEST(SavePasswordProgressLoggerTest, LogBooleanFalse) {
121 TestLogger logger;
122 logger.LogBoolean(SavePasswordProgressLogger::STRING_MESSAGE, false);
123 SCOPED_TRACE(testing::Message() << "Log string = ["
124 << logger.accumulated_log() << "]");
125 EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
126 EXPECT_TRUE(logger.LogsContainSubstring("false"));
127 }
128
TEST(SavePasswordProgressLoggerTest,LogSignedNumber)129 TEST(SavePasswordProgressLoggerTest, LogSignedNumber) {
130 TestLogger logger;
131 int signed_number = -12345;
132 logger.LogNumber(SavePasswordProgressLogger::STRING_MESSAGE, signed_number);
133 SCOPED_TRACE(testing::Message() << "Log string = ["
134 << logger.accumulated_log() << "]");
135 EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
136 EXPECT_TRUE(logger.LogsContainSubstring("-12345"));
137 }
138
TEST(SavePasswordProgressLoggerTest,LogUnsignedNumber)139 TEST(SavePasswordProgressLoggerTest, LogUnsignedNumber) {
140 TestLogger logger;
141 size_t unsigned_number = 654321;
142 logger.LogNumber(SavePasswordProgressLogger::STRING_MESSAGE, unsigned_number);
143 SCOPED_TRACE(testing::Message() << "Log string = ["
144 << logger.accumulated_log() << "]");
145 EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
146 EXPECT_TRUE(logger.LogsContainSubstring("654321"));
147 }
148
TEST(SavePasswordProgressLoggerTest,LogMessage)149 TEST(SavePasswordProgressLoggerTest, LogMessage) {
150 TestLogger logger;
151 logger.LogMessage(SavePasswordProgressLogger::STRING_MESSAGE);
152 SCOPED_TRACE(testing::Message() << "Log string = ["
153 << logger.accumulated_log() << "]");
154 EXPECT_TRUE(logger.LogsContainSubstring(kTestString));
155 }
156
157 } // namespace autofill
158