1 // Copyright 2013 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 <string> 6 #include <vector> 7 8 #include "base/memory/scoped_ptr.h" 9 #include "base/strings/string_number_conversions.h" 10 #include "components/autofill/core/browser/autofill_xml_parser.h" 11 #include "components/autofill/core/browser/field_types.h" 12 #include "testing/gtest/include/gtest/gtest.h" 13 #include "third_party/libjingle/source/talk/xmllite/xmlparser.h" 14 15 namespace autofill { 16 namespace { 17 18 class AutofillQueryXmlParserTest : public testing::Test { 19 public: 20 AutofillQueryXmlParserTest(): upload_required_(USE_UPLOAD_RATES) {}; 21 virtual ~AutofillQueryXmlParserTest() {}; 22 23 protected: 24 void ParseQueryXML(const std::string& xml, bool should_succeed) { 25 // Create a parser. 26 AutofillQueryXmlParser parse_handler(&field_infos_, 27 &upload_required_); 28 buzz::XmlParser parser(&parse_handler); 29 parser.Parse(xml.c_str(), xml.length(), true); 30 EXPECT_EQ(should_succeed, parse_handler.succeeded()); 31 } 32 33 std::vector<AutofillServerFieldInfo> field_infos_; 34 UploadRequired upload_required_; 35 }; 36 37 class AutofillUploadXmlParserTest : public testing::Test { 38 public: 39 AutofillUploadXmlParserTest(): positive_(0), negative_(0) {}; 40 virtual ~AutofillUploadXmlParserTest() {}; 41 42 protected: 43 void ParseUploadXML(const std::string& xml, bool should_succeed) { 44 // Create a parser. 45 AutofillUploadXmlParser parse_handler(&positive_, &negative_); 46 buzz::XmlParser parser(&parse_handler); 47 parser.Parse(xml.c_str(), xml.length(), true); 48 49 EXPECT_EQ(should_succeed, parse_handler.succeeded()); 50 } 51 52 double positive_; 53 double negative_; 54 }; 55 56 TEST_F(AutofillQueryXmlParserTest, BasicQuery) { 57 // An XML string representing a basic query response. 58 std::string xml = "<autofillqueryresponse>" 59 "<field autofilltype=\"0\" />" 60 "<field autofilltype=\"1\" />" 61 "<field autofilltype=\"3\" />" 62 "<field autofilltype=\"2\" />" 63 "<field autofilltype=\"61\" defaultvalue=\"default\"/>" 64 "</autofillqueryresponse>"; 65 ParseQueryXML(xml, true); 66 67 EXPECT_EQ(USE_UPLOAD_RATES, upload_required_); 68 ASSERT_EQ(5U, field_infos_.size()); 69 EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type); 70 EXPECT_EQ(UNKNOWN_TYPE, field_infos_[1].field_type); 71 EXPECT_EQ(NAME_FIRST, field_infos_[2].field_type); 72 EXPECT_EQ(EMPTY_TYPE, field_infos_[3].field_type); 73 EXPECT_TRUE(field_infos_[3].default_value.empty()); 74 EXPECT_EQ(FIELD_WITH_DEFAULT_VALUE, field_infos_[4].field_type); 75 EXPECT_EQ("default", field_infos_[4].default_value); 76 } 77 78 // Test parsing the upload required attribute. 79 TEST_F(AutofillQueryXmlParserTest, TestUploadRequired) { 80 std::string xml = "<autofillqueryresponse uploadrequired=\"true\">" 81 "<field autofilltype=\"0\" />" 82 "</autofillqueryresponse>"; 83 84 ParseQueryXML(xml, true); 85 86 EXPECT_EQ(upload_required_, upload_required_); 87 ASSERT_EQ(1U, field_infos_.size()); 88 EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type); 89 90 field_infos_.clear(); 91 xml = "<autofillqueryresponse uploadrequired=\"false\">" 92 "<field autofilltype=\"0\" />" 93 "</autofillqueryresponse>"; 94 95 ParseQueryXML(xml, true); 96 97 EXPECT_EQ(UPLOAD_NOT_REQUIRED, upload_required_); 98 ASSERT_EQ(1U, field_infos_.size()); 99 EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type); 100 101 field_infos_.clear(); 102 xml = "<autofillqueryresponse uploadrequired=\"bad_value\">" 103 "<field autofilltype=\"0\" />" 104 "</autofillqueryresponse>"; 105 106 ParseQueryXML(xml, true); 107 108 EXPECT_EQ(USE_UPLOAD_RATES, upload_required_); 109 ASSERT_EQ(1U, field_infos_.size()); 110 EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type); 111 } 112 113 // Test badly formed XML queries. 114 TEST_F(AutofillQueryXmlParserTest, ParseErrors) { 115 // Test no Autofill type. 116 std::string xml = "<autofillqueryresponse>" 117 "<field/>" 118 "</autofillqueryresponse>"; 119 120 ParseQueryXML(xml, false); 121 122 EXPECT_EQ(USE_UPLOAD_RATES, upload_required_); 123 EXPECT_EQ(0U, field_infos_.size()); 124 125 // Test an incorrect Autofill type. 126 xml = "<autofillqueryresponse>" 127 "<field autofilltype=\"-1\"/>" 128 "</autofillqueryresponse>"; 129 130 ParseQueryXML(xml, true); 131 132 EXPECT_EQ(USE_UPLOAD_RATES, upload_required_); 133 ASSERT_EQ(1U, field_infos_.size()); 134 // AutofillType was out of range and should be set to NO_SERVER_DATA. 135 EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type); 136 137 // Test upper bound for the field type, MAX_VALID_FIELD_TYPE. 138 field_infos_.clear(); 139 xml = "<autofillqueryresponse><field autofilltype=\"" + 140 base::IntToString(MAX_VALID_FIELD_TYPE) + "\"/></autofillqueryresponse>"; 141 142 ParseQueryXML(xml, true); 143 144 EXPECT_EQ(USE_UPLOAD_RATES, upload_required_); 145 ASSERT_EQ(1U, field_infos_.size()); 146 // AutofillType was out of range and should be set to NO_SERVER_DATA. 147 EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type); 148 149 // Test an incorrect Autofill type. 150 field_infos_.clear(); 151 xml = "<autofillqueryresponse>" 152 "<field autofilltype=\"No Type\"/>" 153 "</autofillqueryresponse>"; 154 155 // Parse fails but an entry is still added to field_infos_. 156 ParseQueryXML(xml, false); 157 158 EXPECT_EQ(USE_UPLOAD_RATES, upload_required_); 159 ASSERT_EQ(1U, field_infos_.size()); 160 EXPECT_EQ(NO_SERVER_DATA, field_infos_[0].field_type); 161 } 162 163 // Test successfull upload response. 164 TEST_F(AutofillUploadXmlParserTest, TestSuccessfulResponse) { 165 ParseUploadXML("<autofilluploadresponse positiveuploadrate=\"0.5\" " 166 "negativeuploadrate=\"0.3\"/>", 167 true); 168 169 EXPECT_DOUBLE_EQ(0.5, positive_); 170 EXPECT_DOUBLE_EQ(0.3, negative_); 171 } 172 173 // Test failed upload response. 174 TEST_F(AutofillUploadXmlParserTest, TestFailedResponse) { 175 ParseUploadXML("<autofilluploadresponse positiveuploadrate=\"\" " 176 "negativeuploadrate=\"0.3\"/>", 177 false); 178 179 EXPECT_DOUBLE_EQ(0, positive_); 180 EXPECT_DOUBLE_EQ(0.3, negative_); // Partially parsed. 181 negative_ = 0; 182 183 ParseUploadXML("<autofilluploadresponse positiveuploadrate=\"0.5\" " 184 "negativeuploadrate=\"0.3\"", 185 false); 186 187 EXPECT_DOUBLE_EQ(0, positive_); 188 EXPECT_DOUBLE_EQ(0, negative_); 189 190 ParseUploadXML("bad data", false); 191 192 EXPECT_DOUBLE_EQ(0, positive_); 193 EXPECT_DOUBLE_EQ(0, negative_); 194 195 ParseUploadXML(std::string(), false); 196 197 EXPECT_DOUBLE_EQ(0, positive_); 198 EXPECT_DOUBLE_EQ(0, negative_); 199 } 200 201 } // namespace 202 } // namespace autofill 203