blob: c06df83481f2b7fff2f9c84ea7e87feaa9a51ae9 [file] [log] [blame]
[email protected]ec64212b2010-03-18 01:02:431// Copyright (c) 2010 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 "chrome/browser/autofill/autofill_xml_parser.h"
9#include "chrome/browser/autofill/field_types.h"
10#include "testing/gtest/include/gtest/gtest.h"
11#include "third_party/libjingle/files/talk/xmllite/xmlparser.h"
12
13namespace {
14
15TEST(AutoFillQueryXmlParserTest, BasicQuery) {
16 // An XML string representing a basic query response.
17 std::string xml = "<autofillqueryresponse>"
18 "<field autofilltype=\"0\" />"
19 "<field autofilltype=\"1\" />"
20 "<field autofilltype=\"3\" />"
21 "<field autofilltype=\"2\" />"
22 "</autofillqueryresponse>";
23
24 // Create a vector of AutoFillFieldTypes, to assign the parsed field types to.
25 std::vector<AutoFillFieldType> field_types;
26 UploadRequired upload_required = USE_UPLOAD_RATES;
27
28 // Create a parser.
29 AutoFillQueryXmlParser parse_handler(&field_types, &upload_required);
30 buzz::XmlParser parser(&parse_handler);
31 parser.Parse(xml.c_str(), xml.length(), true);
32 EXPECT_TRUE(parse_handler.succeeded());
33 EXPECT_EQ(upload_required, USE_UPLOAD_RATES);
34 ASSERT_EQ(4U, field_types.size());
35 EXPECT_EQ(NO_SERVER_DATA, field_types[0]);
36 EXPECT_EQ(UNKNOWN_TYPE, field_types[1]);
37 EXPECT_EQ(NAME_FIRST, field_types[2]);
38 EXPECT_EQ(EMPTY_TYPE, field_types[3]);
39}
40
41// Test parsing the upload required attribute.
42TEST(AutoFillQueryXmlParserTest, TestUploadRequired) {
43 std::vector<AutoFillFieldType> field_types;
44 UploadRequired upload_required = USE_UPLOAD_RATES;
45
46 std::string xml = "<autofillqueryresponse uploadrequired=\"true\">"
47 "<field autofilltype=\"0\" />"
48 "</autofillqueryresponse>";
49
50 scoped_ptr<AutoFillQueryXmlParser> parse_handler(
51 new AutoFillQueryXmlParser(&field_types, &upload_required));
52 scoped_ptr<buzz::XmlParser> parser(new buzz::XmlParser(parse_handler.get()));
53 parser->Parse(xml.c_str(), xml.length(), true);
54 EXPECT_TRUE(parse_handler->succeeded());
55 EXPECT_EQ(UPLOAD_REQUIRED, upload_required);
56 ASSERT_EQ(1U, field_types.size());
57 EXPECT_EQ(NO_SERVER_DATA, field_types[0]);
58
59 field_types.clear();
60 xml = "<autofillqueryresponse uploadrequired=\"false\">"
61 "<field autofilltype=\"0\" />"
62 "</autofillqueryresponse>";
63
64 parse_handler.reset(
65 new AutoFillQueryXmlParser(&field_types, &upload_required));
66 parser.reset(new buzz::XmlParser(parse_handler.get()));
67 parser->Parse(xml.c_str(), xml.length(), true);
68 EXPECT_TRUE(parse_handler->succeeded());
69 EXPECT_EQ(upload_required, UPLOAD_NOT_REQUIRED);
70 ASSERT_EQ(1U, field_types.size());
71 EXPECT_EQ(NO_SERVER_DATA, field_types[0]);
72
73 field_types.clear();
74 xml = "<autofillqueryresponse uploadrequired=\"bad_value\">"
75 "<field autofilltype=\"0\" />"
76 "</autofillqueryresponse>";
77
78 parse_handler.reset(
79 new AutoFillQueryXmlParser(&field_types, &upload_required));
80 parser.reset(new buzz::XmlParser(parse_handler.get()));
81 parser->Parse(xml.c_str(), xml.length(), true);
82 EXPECT_TRUE(parse_handler->succeeded());
83 EXPECT_EQ(upload_required, USE_UPLOAD_RATES);
84 ASSERT_EQ(1U, field_types.size());
85 EXPECT_EQ(NO_SERVER_DATA, field_types[0]);
86}
87
88// Test badly formed XML queries.
89TEST(AutoFillQueryXmlParserTest, ParseErrors) {
90 std::vector<AutoFillFieldType> field_types;
91 UploadRequired upload_required = USE_UPLOAD_RATES;
92
93 // Test no AutoFill type.
94 std::string xml = "<autofillqueryresponse>"
95 "<field/>"
96 "</autofillqueryresponse>";
97
98 scoped_ptr<AutoFillQueryXmlParser> parse_handler(
99 new AutoFillQueryXmlParser(&field_types, &upload_required));
100 scoped_ptr<buzz::XmlParser> parser(new buzz::XmlParser(parse_handler.get()));
101 parser->Parse(xml.c_str(), xml.length(), true);
102 EXPECT_FALSE(parse_handler->succeeded());
103 EXPECT_EQ(upload_required, USE_UPLOAD_RATES);
104 ASSERT_EQ(0U, field_types.size());
105
106 // Test an incorrect AutoFill type.
107 xml = "<autofillqueryresponse>"
108 "<field autofilltype=\"307\"/>"
109 "</autofillqueryresponse>";
110
111 parse_handler.reset(
112 new AutoFillQueryXmlParser(&field_types, &upload_required));
113 parser.reset(new buzz::XmlParser(parse_handler.get()));
114 parser->Parse(xml.c_str(), xml.length(), true);
115 EXPECT_TRUE(parse_handler->succeeded());
116 EXPECT_EQ(upload_required, USE_UPLOAD_RATES);
117 ASSERT_EQ(1U, field_types.size());
118 // AutoFillType was out of range and should be set to NO_SERVER_DATA.
119 EXPECT_EQ(NO_SERVER_DATA, field_types[0]);
120
121 // Test an incorrect AutoFill type.
122 field_types.clear();
123 xml = "<autofillqueryresponse>"
124 "<field autofilltype=\"No Type\"/>"
125 "</autofillqueryresponse>";
126
127 // Parse fails but an entry is still added to field_types.
128 parse_handler.reset(
129 new AutoFillQueryXmlParser(&field_types, &upload_required));
130 parser.reset(new buzz::XmlParser(parse_handler.get()));
131 parser->Parse(xml.c_str(), xml.length(), true);
132 EXPECT_FALSE(parse_handler->succeeded());
133 EXPECT_EQ(upload_required, USE_UPLOAD_RATES);
134 ASSERT_EQ(1U, field_types.size());
135 EXPECT_EQ(NO_SERVER_DATA, field_types[0]);
136}
137
[email protected]db163472010-04-02 22:01:20138// Test successfull upload response.
139TEST(AutoFillUploadXmlParser, TestSuccessfulResponse) {
140 std::string xml = "<autofilluploadresponse positiveuploadrate=\"0.5\" "
141 "negativeuploadrate=\"0.3\"/>";
142 double positive = 0;
143 double negative = 0;
144 AutoFillUploadXmlParser parse_handler(&positive, &negative);
145 buzz::XmlParser parser(&parse_handler);
146 parser.Parse(xml.c_str(), xml.length(), true);
147 EXPECT_TRUE(parse_handler.succeeded());
148 EXPECT_DOUBLE_EQ(0.5, positive);
149 EXPECT_DOUBLE_EQ(0.3, negative);
150}
151
152// Test failed upload response.
153TEST(AutoFillUploadXmlParser, TestFailedResponse) {
154 std::string xml = "<autofilluploadresponse positiveuploadrate=\"\" "
155 "negativeuploadrate=\"0.3\"/>";
156 double positive = 0;
157 double negative = 0;
158 scoped_ptr<AutoFillUploadXmlParser> parse_handler(
159 new AutoFillUploadXmlParser(&positive, &negative));
160 scoped_ptr<buzz::XmlParser> parser(new buzz::XmlParser(parse_handler.get()));
161 parser->Parse(xml.c_str(), xml.length(), true);
162 EXPECT_TRUE(!parse_handler->succeeded());
163 EXPECT_DOUBLE_EQ(0, positive);
164 EXPECT_DOUBLE_EQ(0.3, negative); // Partially parsed.
165 negative = 0;
166
167 xml = "<autofilluploadresponse positiveuploadrate=\"0.5\" "
168 "negativeuploadrate=\"0.3\"";
169 parse_handler.reset(new AutoFillUploadXmlParser(&positive, &negative));
170 parser.reset(new buzz::XmlParser(parse_handler.get()));
171 parser->Parse(xml.c_str(), xml.length(), true);
172 EXPECT_TRUE(!parse_handler->succeeded());
173 EXPECT_DOUBLE_EQ(0, positive);
174 EXPECT_DOUBLE_EQ(0, negative);
175
176 xml = "bad data";
177 parse_handler.reset(new AutoFillUploadXmlParser(&positive, &negative));
178 parser.reset(new buzz::XmlParser(parse_handler.get()));
179 parser->Parse(xml.c_str(), xml.length(), true);
180 EXPECT_TRUE(!parse_handler->succeeded());
181 EXPECT_DOUBLE_EQ(0, positive);
182 EXPECT_DOUBLE_EQ(0, negative);
183
184 xml = "";
185 parse_handler.reset(new AutoFillUploadXmlParser(&positive, &negative));
186 parser.reset(new buzz::XmlParser(parse_handler.get()));
187 parser->Parse(xml.c_str(), xml.length(), true);
188 EXPECT_TRUE(!parse_handler->succeeded());
189 EXPECT_DOUBLE_EQ(0, positive);
190 EXPECT_DOUBLE_EQ(0, negative);
191}
192
[email protected]ec64212b2010-03-18 01:02:43193} // namespace