| 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 |