blob: a806a0fd70588347243fa32f28d14b6ea69a46fe [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/password_manager/core/browser/browser_save_password_progress_logger.h"
#include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/browser/field_types.h"
#include "components/autofill/core/browser/form_structure.h"
#include "components/autofill/core/browser/proto/server.pb.h"
#include "components/autofill/core/common/password_form.h"
#include "components/autofill/core/common/save_password_progress_logger.h"
#include "components/password_manager/core/browser/stub_log_manager.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace password_manager {
namespace {
class TestLogger : public BrowserSavePasswordProgressLogger {
public:
explicit TestLogger(LogManager* log_manager)
: BrowserSavePasswordProgressLogger(log_manager) {}
bool LogsContainSubstring(const std::string& substring) {
return accumulated_log_.find(substring) != std::string::npos;
}
std::string accumulated_log() { return accumulated_log_; }
void SendLog(const std::string& log) override {
accumulated_log_.append(log);
}
private:
std::string accumulated_log_;
};
class MockLogManager : public StubLogManager {
public:
MOCK_CONST_METHOD1(LogSavePasswordProgress, void(const std::string& text));
};
class BrowserSavePasswordProgressLoggerTest : public testing::Test {
public:
BrowserSavePasswordProgressLoggerTest() {
form_.origin = GURL("http://myform.com/form.html");
form_.action = GURL("http://m.myform.com/submit.html");
form_.name = base::UTF8ToUTF16("form_name");
// Add a password field.
autofill::FormFieldData field;
field.name = base::UTF8ToUTF16("password");
field.form_control_type = "password";
field.is_focusable = true;
field.autocomplete_attribute = "new-password";
field.unique_renderer_id = 10;
form_.fields.push_back(field);
// Add a text field.
field.name = base::UTF8ToUTF16("email");
field.form_control_type = "text";
field.is_focusable = false;
field.unique_renderer_id = 42;
field.value = base::UTF8ToUTF16("a@example.com");
field.autocomplete_attribute.clear();
form_.fields.push_back(field);
}
protected:
autofill::FormData form_;
};
} // namespace
TEST_F(BrowserSavePasswordProgressLoggerTest, LogFormSignatures) {
MockLogManager log_manager;
TestLogger logger(&log_manager);
autofill::FormStructure form_structure(form_);
// Add a vote, a generation event and a client-side classifier outcome to the
// password field.
autofill::ServerFieldTypeSet type_set;
type_set.insert(autofill::NEW_PASSWORD);
form_structure.field(0)->set_possible_types(type_set);
form_structure.field(0)->set_generation_type(
autofill::AutofillUploadContents::Field::
MANUALLY_TRIGGERED_GENERATION_ON_SIGN_UP_FORM);
// Add a server prediction for the text field.
form_structure.field(1)->set_server_type(autofill::EMAIL_ADDRESS);
logger.LogFormStructure(
autofill::SavePasswordProgressLogger::STRING_FORM_VOTES, form_structure);
SCOPED_TRACE(testing::Message() << "Log string = ["
<< logger.accumulated_log() << "]");
EXPECT_TRUE(logger.LogsContainSubstring("Form votes: {"));
EXPECT_TRUE(logger.LogsContainSubstring("Signature of form"));
EXPECT_TRUE(logger.LogsContainSubstring("Origin: http://myform.com"));
EXPECT_TRUE(logger.LogsContainSubstring("Form fields:"));
EXPECT_TRUE(logger.LogsContainSubstring(
"password: 2051817934, type=password, renderer_id = 10, "
"autocomplete=new-password, VOTE: "
"NEW_PASSWORD, GENERATION_EVENT: "
"Manual generation on sign-up"));
EXPECT_TRUE(
logger.LogsContainSubstring("email: 420638584, type=text, renderer_id = "
"42, SERVER_PREDICTION: EMAIL_ADDRESS"));
}
TEST_F(BrowserSavePasswordProgressLoggerTest, LogFormData) {
MockLogManager log_manager;
TestLogger logger(&log_manager);
logger.LogFormData(
autofill::SavePasswordProgressLogger::STRING_FORM_PARSING_INPUT, form_);
SCOPED_TRACE(testing::Message()
<< "Log string = [" << logger.accumulated_log() << "]");
EXPECT_TRUE(logger.LogsContainSubstring("Origin: http://myform.com"));
EXPECT_TRUE(logger.LogsContainSubstring("Action: http://m.myform.com"));
EXPECT_TRUE(logger.LogsContainSubstring("Form name: form_name"));
EXPECT_TRUE(logger.LogsContainSubstring("Form with form tag: true"));
EXPECT_TRUE(logger.LogsContainSubstring("Form fields:"));
EXPECT_TRUE(
logger.LogsContainSubstring("password: type=password, renderer_id = 10, "
"visible, empty, autocomplete=new-password"));
EXPECT_TRUE(logger.LogsContainSubstring(
"email: type=text, renderer_id = 42, invisible, non-empty"));
}
} // namespace password_manager