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