[email protected] | ec64212b | 2010-03-18 01:02:43 | [diff] [blame] | 1 | // 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 | |
| 13 | namespace { |
| 14 | |
| 15 | TEST(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. |
| 42 | TEST(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. |
| 89 | TEST(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] | db16347 | 2010-04-02 22:01:20 | [diff] [blame^] | 138 | // Test successfull upload response. |
| 139 | TEST(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. |
| 153 | TEST(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] | ec64212b | 2010-03-18 01:02:43 | [diff] [blame] | 193 | } // namespace |