OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <string> | 5 #include <string> |
6 #include <vector> | 6 #include <vector> |
7 | 7 |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "components/autofill/content/browser/autocheckout_page_meta_data.h" | |
11 #include "components/autofill/core/browser/autofill_xml_parser.h" | 10 #include "components/autofill/core/browser/autofill_xml_parser.h" |
12 #include "components/autofill/core/browser/field_types.h" | 11 #include "components/autofill/core/browser/field_types.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
14 #include "third_party/libjingle/source/talk/xmllite/xmlparser.h" | 13 #include "third_party/libjingle/source/talk/xmllite/xmlparser.h" |
15 | 14 |
16 namespace autofill { | 15 namespace autofill { |
17 namespace { | 16 namespace { |
18 | 17 |
19 class AutofillQueryXmlParserTest : public testing::Test { | 18 class AutofillQueryXmlParserTest : public testing::Test { |
20 public: | 19 public: |
21 AutofillQueryXmlParserTest(): upload_required_(USE_UPLOAD_RATES) {}; | 20 AutofillQueryXmlParserTest(): upload_required_(USE_UPLOAD_RATES) {}; |
22 virtual ~AutofillQueryXmlParserTest() {}; | 21 virtual ~AutofillQueryXmlParserTest() {}; |
23 | 22 |
24 protected: | 23 protected: |
25 void ParseQueryXML(const std::string& xml, bool should_succeed) { | 24 void ParseQueryXML(const std::string& xml, bool should_succeed) { |
26 // Create a parser. | 25 // Create a parser. |
27 AutofillQueryXmlParser parse_handler(&field_infos_, | 26 AutofillQueryXmlParser parse_handler(&field_infos_, |
28 &upload_required_, | 27 &upload_required_, |
29 &experiment_id_, | 28 &experiment_id_); |
30 &page_meta_data_); | |
31 buzz::XmlParser parser(&parse_handler); | 29 buzz::XmlParser parser(&parse_handler); |
32 parser.Parse(xml.c_str(), xml.length(), true); | 30 parser.Parse(xml.c_str(), xml.length(), true); |
33 EXPECT_EQ(should_succeed, parse_handler.succeeded()); | 31 EXPECT_EQ(should_succeed, parse_handler.succeeded()); |
34 } | 32 } |
35 | 33 |
36 std::vector<AutofillServerFieldInfo> field_infos_; | 34 std::vector<AutofillServerFieldInfo> field_infos_; |
37 UploadRequired upload_required_; | 35 UploadRequired upload_required_; |
38 std::string experiment_id_; | 36 std::string experiment_id_; |
39 autofill::AutocheckoutPageMetaData page_meta_data_; | |
40 }; | 37 }; |
41 | 38 |
42 class AutofillUploadXmlParserTest : public testing::Test { | 39 class AutofillUploadXmlParserTest : public testing::Test { |
43 public: | 40 public: |
44 AutofillUploadXmlParserTest(): positive_(0), negative_(0) {}; | 41 AutofillUploadXmlParserTest(): positive_(0), negative_(0) {}; |
45 virtual ~AutofillUploadXmlParserTest() {}; | 42 virtual ~AutofillUploadXmlParserTest() {}; |
46 | 43 |
47 protected: | 44 protected: |
48 void ParseUploadXML(const std::string& xml, bool should_succeed) { | 45 void ParseUploadXML(const std::string& xml, bool should_succeed) { |
49 // Create a parser. | 46 // Create a parser. |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 EXPECT_EQ("ServerSmartyPants", experiment_id_); | 162 EXPECT_EQ("ServerSmartyPants", experiment_id_); |
166 } | 163 } |
167 | 164 |
168 // Fails on ASAN bot. http://crbug.com/253797 | 165 // Fails on ASAN bot. http://crbug.com/253797 |
169 #if defined(ADDRESS_SANITIZER) | 166 #if defined(ADDRESS_SANITIZER) |
170 #define MAYBE_ParseAutofillFlow DISABLED_ParseAutofillFlow | 167 #define MAYBE_ParseAutofillFlow DISABLED_ParseAutofillFlow |
171 #else | 168 #else |
172 #define MAYBE_ParseAutofillFlow ParseAutofillFlow | 169 #define MAYBE_ParseAutofillFlow ParseAutofillFlow |
173 #endif | 170 #endif |
174 | 171 |
175 // Test XML response with autofill_flow information. | |
176 TEST_F(AutofillQueryXmlParserTest, MAYBE_ParseAutofillFlow) { | |
177 std::string xml = "<autofillqueryresponse>" | |
178 "<field autofilltype=\"55\"/>" | |
179 "<autofill_flow page_no=\"1\" total_pages=\"10\">" | |
180 "<page_advance_button id=\"foo\"/>" | |
181 "<flow_page page_no=\"0\">" | |
182 "<type>1</type>" | |
183 "<type>2</type>" | |
184 "</flow_page>" | |
185 "<flow_page page_no=\"1\">" | |
186 "<type>3</type>" | |
187 "</flow_page>" | |
188 "</autofill_flow>" | |
189 "</autofillqueryresponse>"; | |
190 | |
191 ParseQueryXML(xml, true); | |
192 | |
193 EXPECT_EQ(1U, field_infos_.size()); | |
194 EXPECT_EQ(1, page_meta_data_.current_page_number); | |
195 EXPECT_EQ(10, page_meta_data_.total_pages); | |
196 EXPECT_TRUE(page_meta_data_.ignore_ajax); | |
197 EXPECT_EQ("foo", page_meta_data_.proceed_element_descriptor.descriptor); | |
198 EXPECT_EQ(autofill::WebElementDescriptor::ID, | |
199 page_meta_data_.proceed_element_descriptor.retrieval_method); | |
200 EXPECT_EQ(2U, page_meta_data_.page_types.size()); | |
201 EXPECT_EQ(2U, page_meta_data_.page_types[0].size()); | |
202 EXPECT_EQ(1U, page_meta_data_.page_types[1].size()); | |
203 EXPECT_EQ(AUTOCHECKOUT_STEP_SHIPPING, page_meta_data_.page_types[0][0]); | |
204 EXPECT_EQ(AUTOCHECKOUT_STEP_DELIVERY, page_meta_data_.page_types[0][1]); | |
205 EXPECT_EQ(AUTOCHECKOUT_STEP_BILLING, page_meta_data_.page_types[1][0]); | |
206 | |
207 // Clear |field_infos_| for the next test; | |
208 field_infos_.clear(); | |
209 | |
210 // Test css_selector as page_advance_button. | |
211 xml = "<autofillqueryresponse>" | |
212 "<field autofilltype=\"55\"/>" | |
213 "<autofill_flow page_no=\"1\" total_pages=\"10\">" | |
214 "<page_advance_button css_selector=\"[name="foo"]\"/>" | |
215 "</autofill_flow>" | |
216 "</autofillqueryresponse>"; | |
217 | |
218 ParseQueryXML(xml, true); | |
219 | |
220 EXPECT_EQ(1U, field_infos_.size()); | |
221 EXPECT_EQ(1, page_meta_data_.current_page_number); | |
222 EXPECT_EQ(10, page_meta_data_.total_pages); | |
223 EXPECT_EQ("[name=\"foo\"]", | |
224 page_meta_data_.proceed_element_descriptor.descriptor); | |
225 EXPECT_EQ(autofill::WebElementDescriptor::CSS_SELECTOR, | |
226 page_meta_data_.proceed_element_descriptor.retrieval_method); | |
227 | |
228 // Clear |field_infos_| for the next test; | |
229 field_infos_.clear(); | |
230 | |
231 // Test first attribute is always the one set. | |
232 xml = "<autofillqueryresponse>" | |
233 "<field autofilltype=\"55\"/>" | |
234 "<autofill_flow page_no=\"1\" total_pages=\"10\">" | |
235 "<page_advance_button css_selector=\"[name="foo"]\"" | |
236 " id=\"foo\"/>" | |
237 "</autofill_flow>" | |
238 "</autofillqueryresponse>"; | |
239 | |
240 ParseQueryXML(xml, true); | |
241 | |
242 EXPECT_EQ(1U, field_infos_.size()); | |
243 EXPECT_EQ(1, page_meta_data_.current_page_number); | |
244 EXPECT_EQ(10, page_meta_data_.total_pages); | |
245 EXPECT_EQ("[name=\"foo\"]", | |
246 page_meta_data_.proceed_element_descriptor.descriptor); | |
247 EXPECT_EQ(autofill::WebElementDescriptor::CSS_SELECTOR, | |
248 page_meta_data_.proceed_element_descriptor.retrieval_method); | |
249 | |
250 // Clear |field_infos_| for the next test; | |
251 field_infos_.clear(); | |
252 | |
253 // Test parsing click_elements_before_formfill correctly. | |
254 xml = "<autofillqueryresponse>" | |
255 "<field autofilltype=\"55\"/>" | |
256 "<autofill_flow page_no=\"1\" total_pages=\"10\">" | |
257 "<click_elements_before_formfill>" | |
258 "<web_element id=\"btn1\" /></click_elements_before_formfill>" | |
259 "<click_elements_before_formfill>" | |
260 "<web_element css_selector=\"[name="btn2"]\"/>" | |
261 "</click_elements_before_formfill>" | |
262 "</autofill_flow>" | |
263 "</autofillqueryresponse>"; | |
264 | |
265 ParseQueryXML(xml, true); | |
266 | |
267 EXPECT_EQ(1U, field_infos_.size()); | |
268 EXPECT_EQ(1, page_meta_data_.current_page_number); | |
269 EXPECT_EQ(10, page_meta_data_.total_pages); | |
270 ASSERT_EQ(2U, page_meta_data_.click_elements_before_form_fill.size()); | |
271 autofill::WebElementDescriptor& click_elment = | |
272 page_meta_data_.click_elements_before_form_fill[0]; | |
273 EXPECT_EQ("btn1", click_elment.descriptor); | |
274 EXPECT_EQ(autofill::WebElementDescriptor::ID, click_elment.retrieval_method); | |
275 click_elment = page_meta_data_.click_elements_before_form_fill[1]; | |
276 EXPECT_EQ("[name=\"btn2\"]", click_elment.descriptor); | |
277 EXPECT_EQ(autofill::WebElementDescriptor::CSS_SELECTOR, | |
278 click_elment.retrieval_method); | |
279 | |
280 // Clear |field_infos_| for the next test; | |
281 field_infos_.clear(); | |
282 | |
283 // Test parsing click_elements_after_formfill correctly. | |
284 xml = "<autofillqueryresponse>" | |
285 "<field autofilltype=\"55\"/>" | |
286 "<autofill_flow page_no=\"1\" total_pages=\"10\">" | |
287 "<click_elements_after_formfill>" | |
288 "<web_element id=\"btn1\" /></click_elements_after_formfill>" | |
289 "</autofill_flow>" | |
290 "</autofillqueryresponse>"; | |
291 | |
292 ParseQueryXML(xml, true); | |
293 | |
294 EXPECT_EQ(1U, field_infos_.size()); | |
295 EXPECT_EQ(1, page_meta_data_.current_page_number); | |
296 EXPECT_EQ(10, page_meta_data_.total_pages); | |
297 ASSERT_EQ(1U, page_meta_data_.click_elements_after_form_fill.size()); | |
298 click_elment = page_meta_data_.click_elements_after_form_fill[0]; | |
299 EXPECT_EQ("btn1", click_elment.descriptor); | |
300 EXPECT_EQ(autofill::WebElementDescriptor::ID, click_elment.retrieval_method); | |
301 | |
302 // Clear |field_infos_| for the next test. | |
303 field_infos_.clear(); | |
304 | |
305 // Test setting of ignore_ajax attribute. | |
306 xml = "<autofillqueryresponse>" | |
307 "<field autofilltype=\"55\"/>" | |
308 "<autofill_flow page_no=\"1\" total_pages=\"10\" ignore_ajax=\"true\">" | |
309 "<page_advance_button css_selector=\"[name="foo"]\"" | |
310 " id=\"foo\"/>" | |
311 "</autofill_flow>" | |
312 "</autofillqueryresponse>"; | |
313 | |
314 ParseQueryXML(xml, true); | |
315 | |
316 EXPECT_EQ(1U, field_infos_.size()); | |
317 EXPECT_EQ(1, page_meta_data_.current_page_number); | |
318 EXPECT_EQ(10, page_meta_data_.total_pages); | |
319 EXPECT_TRUE(page_meta_data_.ignore_ajax); | |
320 EXPECT_EQ("[name=\"foo\"]", | |
321 page_meta_data_.proceed_element_descriptor.descriptor); | |
322 EXPECT_EQ(autofill::WebElementDescriptor::CSS_SELECTOR, | |
323 page_meta_data_.proceed_element_descriptor.retrieval_method); | |
324 | |
325 // Clear |field_infos_| for the next test. | |
326 field_infos_.clear(); | |
327 | |
328 // Test redundant setting to false of ignore_ajax attribute. | |
329 xml = "<autofillqueryresponse>" | |
330 "<field autofilltype=\"55\"/>" | |
331 "<autofill_flow page_no=\"1\" total_pages=\"10\" ignore_ajax=\"false\">" | |
332 "<page_advance_button css_selector=\"[name="foo"]\"" | |
333 " id=\"foo\"/>" | |
334 "</autofill_flow>" | |
335 "</autofillqueryresponse>"; | |
336 | |
337 ParseQueryXML(xml, true); | |
338 | |
339 EXPECT_EQ(1U, field_infos_.size()); | |
340 EXPECT_EQ(1, page_meta_data_.current_page_number); | |
341 EXPECT_EQ(10, page_meta_data_.total_pages); | |
342 EXPECT_FALSE(page_meta_data_.ignore_ajax); | |
343 EXPECT_EQ("[name=\"foo\"]", | |
344 page_meta_data_.proceed_element_descriptor.descriptor); | |
345 EXPECT_EQ(autofill::WebElementDescriptor::CSS_SELECTOR, | |
346 page_meta_data_.proceed_element_descriptor.retrieval_method); | |
347 } | |
348 | |
349 // Test badly formed XML queries. | 172 // Test badly formed XML queries. |
350 TEST_F(AutofillQueryXmlParserTest, ParseErrors) { | 173 TEST_F(AutofillQueryXmlParserTest, ParseErrors) { |
351 // Test no Autofill type. | 174 // Test no Autofill type. |
352 std::string xml = "<autofillqueryresponse>" | 175 std::string xml = "<autofillqueryresponse>" |
353 "<field/>" | 176 "<field/>" |
354 "</autofillqueryresponse>"; | 177 "</autofillqueryresponse>"; |
355 | 178 |
356 ParseQueryXML(xml, false); | 179 ParseQueryXML(xml, false); |
357 | 180 |
358 EXPECT_EQ(USE_UPLOAD_RATES, upload_required_); | 181 EXPECT_EQ(USE_UPLOAD_RATES, upload_required_); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 EXPECT_DOUBLE_EQ(0, negative_); | 256 EXPECT_DOUBLE_EQ(0, negative_); |
434 | 257 |
435 ParseUploadXML(std::string(), false); | 258 ParseUploadXML(std::string(), false); |
436 | 259 |
437 EXPECT_DOUBLE_EQ(0, positive_); | 260 EXPECT_DOUBLE_EQ(0, positive_); |
438 EXPECT_DOUBLE_EQ(0, negative_); | 261 EXPECT_DOUBLE_EQ(0, negative_); |
439 } | 262 } |
440 | 263 |
441 } // namespace | 264 } // namespace |
442 } // namespace autofill | 265 } // namespace autofill |
OLD | NEW |