blob: b97c7746ccc2c1b388fd43135d72a13dca44f565 [file] [log] [blame]
// Copyright 2013 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 <string>
#include <vector>
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_number_conversions.h"
#include "components/autofill/core/browser/autofill_xml_parser.h"
#include "components/autofill/core/browser/field_types.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/webrtc/libjingle/xmllite/xmlparser.h"
namespace autofill {
namespace {
class AutofillQueryXmlParserTest : public testing::Test {
public:
AutofillQueryXmlParserTest(): upload_required_(USE_UPLOAD_RATES) {};
~AutofillQueryXmlParserTest() override{};
protected:
void ParseQueryXML(const std::string& xml, bool should_succeed) {
// Create a parser.
AutofillQueryXmlParser parse_handler(&field_infos_,
&upload_required_);
buzz::XmlParser parser(&parse_handler);
parser.Parse(xml.c_str(), xml.length(), true);
EXPECT_EQ(should_succeed, parse_handler.succeeded());
}
std::vector<AutofillServerFieldInfo> field_infos_;
UploadRequired upload_required_;
};
class AutofillUploadXmlParserTest : public testing::Test {
public:
AutofillUploadXmlParserTest(): positive_(0), negative_(0) {};
~AutofillUploadXmlParserTest() override{};
protected:
void ParseUploadXML(const std::string& xml, bool should_succeed) {
// Create a parser.
AutofillUploadXmlParser parse_handler(&positive_, &negative_);
buzz::XmlParser parser(&parse_handler);
parser.Parse(xml.c_str(), xml.length(), true);
EXPECT_EQ(should_succeed, parse_handler.succeeded());
}
double positive_;
double negative_;
};
TEST_F(AutofillQueryXmlParserTest, BasicQuery) {
// An XML string representing a basic query response.
std::string xml = "<autofillqueryresponse>"
"<field autofilltype=\"0\" />"
"<field autofilltype=\"1\" />"
"<field autofilltype=\"3\" />"
"<field autofilltype=\"2\" />"
"<field autofilltype=\"61\" defaultvalue=\"default\"/>"
"</autofillqueryresponse>";
ParseQueryXML(xml, true);
EXPECT_EQ(USE_UPLOAD_RATES, upload_required_);
ASSERT_EQ(5U, field_infos_.size());
EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type);
EXPECT_EQ(UNKNOWN_TYPE, field_infos_[1].field_type);
EXPECT_EQ(NAME_FIRST, field_infos_[2].field_type);
EXPECT_EQ(EMPTY_TYPE, field_infos_[3].field_type);
EXPECT_TRUE(field_infos_[3].default_value.empty());
EXPECT_EQ(FIELD_WITH_DEFAULT_VALUE, field_infos_[4].field_type);
EXPECT_EQ("default", field_infos_[4].default_value);
}
// Test parsing the upload required attribute.
TEST_F(AutofillQueryXmlParserTest, TestUploadRequired) {
std::string xml = "<autofillqueryresponse uploadrequired=\"true\">"
"<field autofilltype=\"0\" />"
"</autofillqueryresponse>";
ParseQueryXML(xml, true);
EXPECT_EQ(upload_required_, upload_required_);
ASSERT_EQ(1U, field_infos_.size());
EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type);
field_infos_.clear();
xml = "<autofillqueryresponse uploadrequired=\"false\">"
"<field autofilltype=\"0\" />"
"</autofillqueryresponse>";
ParseQueryXML(xml, true);
EXPECT_EQ(UPLOAD_NOT_REQUIRED, upload_required_);
ASSERT_EQ(1U, field_infos_.size());
EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type);
field_infos_.clear();
xml = "<autofillqueryresponse uploadrequired=\"bad_value\">"
"<field autofilltype=\"0\" />"
"</autofillqueryresponse>";
ParseQueryXML(xml, true);
EXPECT_EQ(USE_UPLOAD_RATES, upload_required_);
ASSERT_EQ(1U, field_infos_.size());
EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type);
}
// Test badly formed XML queries.
TEST_F(AutofillQueryXmlParserTest, ParseErrors) {
// Test no Autofill type.
std::string xml = "<autofillqueryresponse>"
"<field/>"
"</autofillqueryresponse>";
ParseQueryXML(xml, false);
EXPECT_EQ(USE_UPLOAD_RATES, upload_required_);
EXPECT_EQ(0U, field_infos_.size());
// Test an incorrect Autofill type.
xml = "<autofillqueryresponse>"
"<field autofilltype=\"-1\"/>"
"</autofillqueryresponse>";
ParseQueryXML(xml, true);
EXPECT_EQ(USE_UPLOAD_RATES, upload_required_);
ASSERT_EQ(1U, field_infos_.size());
// AutofillType was out of range and should be set to NO_SERVER_DATA.
EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type);
// Test upper bound for the field type, MAX_VALID_FIELD_TYPE.
field_infos_.clear();
xml = "<autofillqueryresponse><field autofilltype=\"" +
base::IntToString(MAX_VALID_FIELD_TYPE) + "\"/></autofillqueryresponse>";
ParseQueryXML(xml, true);
EXPECT_EQ(USE_UPLOAD_RATES, upload_required_);
ASSERT_EQ(1U, field_infos_.size());
// AutofillType was out of range and should be set to NO_SERVER_DATA.
EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type);
// Test an incorrect Autofill type.
field_infos_.clear();
xml = "<autofillqueryresponse>"
"<field autofilltype=\"No Type\"/>"
"</autofillqueryresponse>";
// Parse fails but an entry is still added to field_infos_.
ParseQueryXML(xml, false);
EXPECT_EQ(USE_UPLOAD_RATES, upload_required_);
ASSERT_EQ(1U, field_infos_.size());
EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type);
}
// Test successfull upload response.
TEST_F(AutofillUploadXmlParserTest, TestSuccessfulResponse) {
ParseUploadXML("<autofilluploadresponse positiveuploadrate=\"0.5\" "
"negativeuploadrate=\"0.3\"/>",
true);
EXPECT_DOUBLE_EQ(0.5, positive_);
EXPECT_DOUBLE_EQ(0.3, negative_);
}
// Test failed upload response.
TEST_F(AutofillUploadXmlParserTest, TestFailedResponse) {
ParseUploadXML("<autofilluploadresponse positiveuploadrate=\"\" "
"negativeuploadrate=\"0.3\"/>",
false);
EXPECT_DOUBLE_EQ(0, positive_);
EXPECT_DOUBLE_EQ(0.3, negative_); // Partially parsed.
negative_ = 0;
ParseUploadXML("<autofilluploadresponse positiveuploadrate=\"0.5\" "
"negativeuploadrate=\"0.3\"",
false);
EXPECT_DOUBLE_EQ(0, positive_);
EXPECT_DOUBLE_EQ(0, negative_);
ParseUploadXML("bad data", false);
EXPECT_DOUBLE_EQ(0, positive_);
EXPECT_DOUBLE_EQ(0, negative_);
ParseUploadXML(std::string(), false);
EXPECT_DOUBLE_EQ(0, positive_);
EXPECT_DOUBLE_EQ(0, negative_);
}
} // namespace
} // namespace autofill