| 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 |