OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/autofill/core/common/save_password_progress_logger.h" | 5 #include "components/autofill/core/common/save_password_progress_logger.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
12 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
14 #include "components/autofill/core/common/password_form.h" | 14 #include "components/autofill/core/common/password_form.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
16 #include "url/gurl.h" | 16 #include "url/gurl.h" |
17 | 17 |
18 using base::UTF8ToUTF16; | 18 using base::UTF8ToUTF16; |
19 | 19 |
20 namespace autofill { | 20 namespace autofill { |
21 | 21 |
22 namespace { | 22 namespace { |
23 | 23 |
24 const char kTestString[] = "Test"; | 24 const char kTestString[] = "Message"; // Corresponds to STRING_MESSAGE. |
25 | 25 |
26 class TestLogger : public SavePasswordProgressLogger { | 26 class TestLogger : public SavePasswordProgressLogger { |
27 public: | 27 public: |
28 bool LogsContainSubstring(const std::string& substring) { | 28 bool LogsContainSubstring(const std::string& substring) { |
29 return accumulated_log_.find(substring) != std::string::npos; | 29 return GetAccumulatedLog().find(substring) != std::string::npos; |
30 } | 30 } |
31 | 31 |
32 std::string accumulated_log() { return accumulated_log_; } | 32 std::string GetAccumulatedLog() { |
| 33 return SanitizeStructuredLogs(accumulated_logs_); |
| 34 } |
| 35 |
| 36 std::vector<SavePasswordProgressLogger::StructuredLog> accumulated_logs() { |
| 37 return accumulated_logs_; |
| 38 } |
33 | 39 |
34 private: | 40 private: |
35 virtual void SendLog(const std::string& log) OVERRIDE { | 41 virtual void SendLog(const std::vector<StructuredLog>& logs) OVERRIDE { |
36 accumulated_log_.append(log); | 42 accumulated_logs_ = logs; |
37 } | 43 } |
38 | 44 |
39 std::string accumulated_log_; | 45 std::vector<SavePasswordProgressLogger::StructuredLog> accumulated_logs_; |
40 }; | 46 }; |
41 | 47 |
42 }; // namespace | 48 }; // namespace |
43 | 49 |
44 TEST(SavePasswordProgressLoggerTest, LogPasswordForm) { | 50 TEST(SavePasswordProgressLoggerTest, LogPasswordForm) { |
45 TestLogger logger; | 51 TestLogger logger; |
46 PasswordForm form; | 52 PasswordForm form; |
47 form.action = GURL("http://example.org/verysecret?verysecret"); | 53 form.action = GURL("http://example.org/verysecret?verysecret"); |
| 54 form.password_element = UTF8ToUTF16("pwdelement"); |
48 form.password_value = UTF8ToUTF16("verysecret"); | 55 form.password_value = UTF8ToUTF16("verysecret"); |
49 form.username_value = UTF8ToUTF16("verysecret"); | 56 form.username_value = UTF8ToUTF16("verysecret"); |
50 logger.LogPasswordForm(kTestString, form); | 57 logger.LogPasswordForm(SavePasswordProgressLogger::STRING_MESSAGE, form); |
51 SCOPED_TRACE(testing::Message() << "Log string = [" | 58 SCOPED_TRACE(testing::Message() << "Log string = [" |
52 << logger.accumulated_log() << "]"); | 59 << logger.GetAccumulatedLog() << "]"); |
53 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); | 60 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); |
| 61 EXPECT_TRUE(logger.LogsContainSubstring("pwdelement")); |
54 EXPECT_TRUE(logger.LogsContainSubstring("http://example.org")); | 62 EXPECT_TRUE(logger.LogsContainSubstring("http://example.org")); |
55 EXPECT_FALSE(logger.LogsContainSubstring("verysecret")); | 63 EXPECT_FALSE(logger.LogsContainSubstring("verysecret")); |
56 } | 64 } |
57 | 65 |
58 TEST(SavePasswordProgressLoggerTest, LogHTMLForm) { | 66 TEST(SavePasswordProgressLoggerTest, LogHTMLForm) { |
59 TestLogger logger; | 67 TestLogger logger; |
60 logger.LogHTMLForm(kTestString, | 68 logger.LogHTMLForm(SavePasswordProgressLogger::STRING_MESSAGE, |
61 "form_name", | 69 "formname", |
62 "form_method", | 70 "post", |
63 GURL("http://example.org/verysecret?verysecret")); | 71 GURL("http://example.org/verysecret?verysecret")); |
64 SCOPED_TRACE(testing::Message() << "Log string = [" | 72 SCOPED_TRACE(testing::Message() << "Log string = [" |
65 << logger.accumulated_log() << "]"); | 73 << logger.GetAccumulatedLog() << "]"); |
66 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); | 74 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); |
67 EXPECT_TRUE(logger.LogsContainSubstring("form_name")); | 75 EXPECT_TRUE(logger.LogsContainSubstring("formname")); |
68 EXPECT_TRUE(logger.LogsContainSubstring("form_method")); | 76 EXPECT_TRUE(logger.LogsContainSubstring("POST")); |
69 EXPECT_TRUE(logger.LogsContainSubstring("http://example.org")); | 77 EXPECT_TRUE(logger.LogsContainSubstring("http://example.org")); |
70 EXPECT_FALSE(logger.LogsContainSubstring("verysecret")); | 78 EXPECT_FALSE(logger.LogsContainSubstring("verysecret")); |
71 } | 79 } |
72 | 80 |
73 TEST(SavePasswordProgressLoggerTest, LogURL) { | 81 TEST(SavePasswordProgressLoggerTest, LogURL) { |
74 TestLogger logger; | 82 TestLogger logger; |
75 logger.LogURL(kTestString, GURL("http://example.org/verysecret?verysecret")); | 83 logger.LogURL(SavePasswordProgressLogger::STRING_MESSAGE, |
| 84 GURL("http://example.org/verysecret?verysecret")); |
76 SCOPED_TRACE(testing::Message() << "Log string = [" | 85 SCOPED_TRACE(testing::Message() << "Log string = [" |
77 << logger.accumulated_log() << "]"); | 86 << logger.GetAccumulatedLog() << "]"); |
78 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); | 87 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); |
79 EXPECT_TRUE(logger.LogsContainSubstring("http://example.org")); | 88 EXPECT_TRUE(logger.LogsContainSubstring("http://example.org")); |
80 EXPECT_FALSE(logger.LogsContainSubstring("verysecret")); | 89 EXPECT_FALSE(logger.LogsContainSubstring("verysecret")); |
81 } | 90 } |
82 | 91 |
83 TEST(SavePasswordProgressLoggerTest, LogBooleanTrue) { | 92 TEST(SavePasswordProgressLoggerTest, LogBooleanTrue) { |
84 TestLogger logger; | 93 TestLogger logger; |
85 logger.LogBoolean(kTestString, true); | 94 logger.LogBoolean(SavePasswordProgressLogger::STRING_MESSAGE, true); |
86 SCOPED_TRACE(testing::Message() << "Log string = [" | 95 SCOPED_TRACE(testing::Message() << "Log string = [" |
87 << logger.accumulated_log() << "]"); | 96 << logger.GetAccumulatedLog() << "]"); |
88 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); | 97 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); |
89 EXPECT_TRUE(logger.LogsContainSubstring("true")); | 98 EXPECT_TRUE(logger.LogsContainSubstring("true")); |
90 } | 99 } |
91 | 100 |
92 TEST(SavePasswordProgressLoggerTest, LogBooleanFalse) { | 101 TEST(SavePasswordProgressLoggerTest, LogBooleanFalse) { |
93 TestLogger logger; | 102 TestLogger logger; |
94 logger.LogBoolean(kTestString, false); | 103 logger.LogBoolean(SavePasswordProgressLogger::STRING_MESSAGE, false); |
95 SCOPED_TRACE(testing::Message() << "Log string = [" | 104 SCOPED_TRACE(testing::Message() << "Log string = [" |
96 << logger.accumulated_log() << "]"); | 105 << logger.GetAccumulatedLog() << "]"); |
97 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); | 106 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); |
98 EXPECT_TRUE(logger.LogsContainSubstring("false")); | 107 EXPECT_TRUE(logger.LogsContainSubstring("false")); |
99 } | 108 } |
100 | 109 |
101 TEST(SavePasswordProgressLoggerTest, LogSignedNumber) { | 110 TEST(SavePasswordProgressLoggerTest, LogSignedNumber) { |
102 TestLogger logger; | 111 TestLogger logger; |
103 int signed_number = -12345; | 112 int signed_number = -12345; |
104 logger.LogNumber(kTestString, signed_number); | 113 logger.LogNumber(SavePasswordProgressLogger::STRING_MESSAGE, signed_number); |
105 SCOPED_TRACE(testing::Message() << "Log string = [" | 114 SCOPED_TRACE(testing::Message() << "Log string = [" |
106 << logger.accumulated_log() << "]"); | 115 << logger.GetAccumulatedLog() << "]"); |
107 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); | 116 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); |
108 EXPECT_TRUE(logger.LogsContainSubstring("-12345")); | 117 EXPECT_TRUE(logger.LogsContainSubstring("-12345")); |
109 } | 118 } |
110 | 119 |
111 TEST(SavePasswordProgressLoggerTest, LogUnsignedNumber) { | 120 TEST(SavePasswordProgressLoggerTest, LogUnsignedNumber) { |
112 TestLogger logger; | 121 TestLogger logger; |
113 size_t unsigned_number = 654321; | 122 size_t unsigned_number = 654321; |
114 logger.LogNumber(kTestString, unsigned_number); | 123 logger.LogNumber(SavePasswordProgressLogger::STRING_MESSAGE, unsigned_number); |
115 SCOPED_TRACE(testing::Message() << "Log string = [" | 124 SCOPED_TRACE(testing::Message() << "Log string = [" |
116 << logger.accumulated_log() << "]"); | 125 << logger.GetAccumulatedLog() << "]"); |
117 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); | 126 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); |
118 EXPECT_TRUE(logger.LogsContainSubstring("654321")); | 127 EXPECT_TRUE(logger.LogsContainSubstring("654321")); |
119 } | 128 } |
120 | 129 |
121 TEST(SavePasswordProgressLoggerTest, LogFinalDecisionSave) { | |
122 TestLogger logger; | |
123 logger.LogFinalDecision(SavePasswordProgressLogger::DECISION_SAVE); | |
124 SCOPED_TRACE(testing::Message() << "Log string = [" | |
125 << logger.accumulated_log() << "]"); | |
126 EXPECT_TRUE(logger.LogsContainSubstring("SAVE")); | |
127 } | |
128 | |
129 TEST(SavePasswordProgressLoggerTest, LogFinalDecisionAsk) { | |
130 TestLogger logger; | |
131 logger.LogFinalDecision(SavePasswordProgressLogger::DECISION_ASK); | |
132 SCOPED_TRACE(testing::Message() << "Log string = [" | |
133 << logger.accumulated_log() << "]"); | |
134 EXPECT_TRUE(logger.LogsContainSubstring("ASK")); | |
135 } | |
136 | |
137 TEST(SavePasswordProgressLoggerTest, LogFinalDecisionDrop) { | |
138 TestLogger logger; | |
139 logger.LogFinalDecision(SavePasswordProgressLogger::DECISION_DROP); | |
140 SCOPED_TRACE(testing::Message() << "Log string = [" | |
141 << logger.accumulated_log() << "]"); | |
142 EXPECT_TRUE(logger.LogsContainSubstring("DROP")); | |
143 } | |
144 | |
145 TEST(SavePasswordProgressLoggerTest, LogMessage) { | 130 TEST(SavePasswordProgressLoggerTest, LogMessage) { |
146 TestLogger logger; | 131 TestLogger logger; |
147 logger.LogMessage(kTestString); | 132 logger.LogMessage(SavePasswordProgressLogger::STRING_MESSAGE); |
148 SCOPED_TRACE(testing::Message() << "Log string = [" | 133 SCOPED_TRACE(testing::Message() << "Log string = [" |
149 << logger.accumulated_log() << "]"); | 134 << logger.GetAccumulatedLog() << "]"); |
150 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); | 135 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); |
151 } | 136 } |
152 | 137 |
| 138 TEST(SavePasswordProgressLoggerTest, SanitizeStructuredLogs) { |
| 139 // The sanitizing method actually letting safe content through is tested in |
| 140 // the rest of this file. The same goes for scrubbing URLs. Here we test that |
| 141 // element IDs, the only source of free strings, is properly filtered. |
| 142 TestLogger logger; |
| 143 PasswordForm form; |
| 144 const std::string kHTMLInside("Username <script> element"); |
| 145 const std::string kHTMLInsideExpected("username script element"); |
| 146 const std::string kIPAddressInside("y128.0.0.1Y"); |
| 147 const std::string kIPAddressInsideExpected("y128 0 0 1y"); |
| 148 const std::string kSpecialCharsInside("X@#a$%B&*c()D;:e+-x"); |
| 149 const std::string kSpecialCharsInsideExpected("x a b c d e x"); |
| 150 form.username_element = UTF8ToUTF16(kHTMLInside); |
| 151 form.password_element = UTF8ToUTF16(kIPAddressInside); |
| 152 form.old_password_element = UTF8ToUTF16(kSpecialCharsInside); |
| 153 logger.LogPasswordForm(SavePasswordProgressLogger::STRING_MESSAGE, form); |
| 154 SCOPED_TRACE(testing::Message() << "Log string = [" |
| 155 << logger.GetAccumulatedLog() << "]"); |
| 156 EXPECT_TRUE(logger.LogsContainSubstring(kTestString)); |
| 157 EXPECT_FALSE(logger.LogsContainSubstring(kHTMLInside)); |
| 158 EXPECT_TRUE(logger.LogsContainSubstring(kHTMLInsideExpected)); |
| 159 EXPECT_FALSE(logger.LogsContainSubstring(kIPAddressInside)); |
| 160 EXPECT_TRUE(logger.LogsContainSubstring(kIPAddressInsideExpected)); |
| 161 EXPECT_FALSE(logger.LogsContainSubstring(kSpecialCharsInside)); |
| 162 EXPECT_TRUE(logger.LogsContainSubstring(kSpecialCharsInsideExpected)); |
| 163 } |
153 } // namespace autofill | 164 } // namespace autofill |
OLD | NEW |