• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
AutofillQueryXmlParserTest()20   AutofillQueryXmlParserTest(): upload_required_(USE_UPLOAD_RATES) {};
~AutofillQueryXmlParserTest()21   virtual ~AutofillQueryXmlParserTest() {};
22 
23  protected:
ParseQueryXML(const std::string & xml,bool should_succeed)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:
AutofillUploadXmlParserTest()39   AutofillUploadXmlParserTest(): positive_(0), negative_(0) {};
~AutofillUploadXmlParserTest()40   virtual ~AutofillUploadXmlParserTest() {};
41 
42  protected:
ParseUploadXML(const std::string & xml,bool should_succeed)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 
TEST_F(AutofillQueryXmlParserTest,BasicQuery)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.
TEST_F(AutofillQueryXmlParserTest,TestUploadRequired)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.
TEST_F(AutofillQueryXmlParserTest,ParseErrors)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.
TEST_F(AutofillUploadXmlParserTest,TestSuccessfulResponse)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.
TEST_F(AutofillUploadXmlParserTest,TestFailedResponse)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