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 "components/autofill/core/common/form_data.h" 6 7#include "base/pickle.h" 8#include "base/strings/utf_string_conversions.h" 9#include "components/autofill/core/common/form_field_data.h" 10#include "testing/gtest/include/gtest/gtest.h" 11 12namespace { 13 14// This function serializes the form data into the pickle in version one format. 15// It should always be possible to deserialize it using DeserializeFormData(), 16// even when version changes. See kPickleVersion in form_data.cc. 17void SerializeInVersion1Format(const autofill::FormData& form_data, 18 Pickle* pickle) { 19 pickle->WriteInt(1); 20 pickle->WriteString16(form_data.name); 21 base::string16 method(base::ASCIIToUTF16("POST")); 22 pickle->WriteString16(method); 23 pickle->WriteString(form_data.origin.spec()); 24 pickle->WriteString(form_data.action.spec()); 25 pickle->WriteBool(form_data.user_submitted); 26 pickle->WriteInt(static_cast<int>(form_data.fields.size())); 27 for (size_t i = 0; i < form_data.fields.size(); ++i) { 28 SerializeFormFieldData(form_data.fields[i], pickle); 29 } 30} 31 32// This function serializes the form data into the pickle in incorrect format 33// (no version number). 34void SerializeIncorrectFormat(const autofill::FormData& form_data, 35 Pickle* pickle) { 36 pickle->WriteString16(form_data.name); 37 pickle->WriteString(form_data.origin.spec()); 38 pickle->WriteString(form_data.action.spec()); 39 pickle->WriteBool(form_data.user_submitted); 40 pickle->WriteInt(static_cast<int>(form_data.fields.size())); 41 for (size_t i = 0; i < form_data.fields.size(); ++i) { 42 SerializeFormFieldData(form_data.fields[i], pickle); 43 } 44} 45 46} 47 48namespace autofill { 49 50TEST(FormDataTest, SerializeAndDeserialize) { 51 FormData data; 52 data.name = base::ASCIIToUTF16("name"); 53 data.origin = GURL("origin"); 54 data.action = GURL("action"); 55 data.user_submitted = true; 56 57 FormFieldData field_data; 58 field_data.label = base::ASCIIToUTF16("label"); 59 field_data.name = base::ASCIIToUTF16("name"); 60 field_data.value = base::ASCIIToUTF16("value"); 61 field_data.form_control_type = "password"; 62 field_data.autocomplete_attribute = "off"; 63 field_data.max_length = 200; 64 field_data.is_autofilled = true; 65 field_data.is_checked = true; 66 field_data.is_checkable = true; 67 field_data.is_focusable = true; 68 field_data.should_autocomplete = false; 69 field_data.text_direction = base::i18n::RIGHT_TO_LEFT; 70 field_data.option_values.push_back(base::ASCIIToUTF16("First")); 71 field_data.option_values.push_back(base::ASCIIToUTF16("Second")); 72 field_data.option_contents.push_back(base::ASCIIToUTF16("First")); 73 field_data.option_contents.push_back(base::ASCIIToUTF16("Second")); 74 75 data.fields.push_back(field_data); 76 77 // Change a few fields. 78 field_data.max_length = 150; 79 field_data.option_values.push_back(base::ASCIIToUTF16("Third")); 80 field_data.option_contents.push_back(base::ASCIIToUTF16("Third")); 81 data.fields.push_back(field_data); 82 83 Pickle pickle; 84 SerializeFormData(data, &pickle); 85 86 PickleIterator iter(pickle); 87 FormData actual; 88 EXPECT_TRUE(DeserializeFormData(&iter, &actual)); 89 90 EXPECT_EQ(actual, data); 91} 92 93TEST(FormDataTest, Serialize_v1_Deserialize_vCurrent) { 94 FormData data; 95 data.name = base::ASCIIToUTF16("name"); 96 data.origin = GURL("origin"); 97 data.action = GURL("action"); 98 data.user_submitted = true; 99 100 FormFieldData field_data; 101 field_data.label = base::ASCIIToUTF16("label"); 102 field_data.name = base::ASCIIToUTF16("name"); 103 field_data.value = base::ASCIIToUTF16("value"); 104 field_data.form_control_type = "password"; 105 field_data.autocomplete_attribute = "off"; 106 field_data.max_length = 200; 107 field_data.is_autofilled = true; 108 field_data.is_checked = true; 109 field_data.is_checkable = true; 110 field_data.is_focusable = true; 111 field_data.should_autocomplete = false; 112 field_data.text_direction = base::i18n::RIGHT_TO_LEFT; 113 field_data.option_values.push_back(base::ASCIIToUTF16("First")); 114 field_data.option_values.push_back(base::ASCIIToUTF16("Second")); 115 field_data.option_contents.push_back(base::ASCIIToUTF16("First")); 116 field_data.option_contents.push_back(base::ASCIIToUTF16("Second")); 117 118 data.fields.push_back(field_data); 119 120 // Change a few fields. 121 field_data.max_length = 150; 122 field_data.option_values.push_back(base::ASCIIToUTF16("Third")); 123 field_data.option_contents.push_back(base::ASCIIToUTF16("Third")); 124 data.fields.push_back(field_data); 125 126 Pickle pickle; 127 SerializeInVersion1Format(data, &pickle); 128 129 PickleIterator iter(pickle); 130 FormData actual; 131 EXPECT_TRUE(DeserializeFormData(&iter, &actual)); 132 133 EXPECT_EQ(actual, data); 134} 135 136TEST(FormDataTest, SerializeIncorrectFormatAndDeserialize) { 137 FormData data; 138 data.name = base::ASCIIToUTF16("name"); 139 data.origin = GURL("origin"); 140 data.action = GURL("action"); 141 data.user_submitted = true; 142 143 FormFieldData field_data; 144 field_data.label = base::ASCIIToUTF16("label"); 145 field_data.name = base::ASCIIToUTF16("name"); 146 field_data.value = base::ASCIIToUTF16("value"); 147 field_data.form_control_type = "password"; 148 field_data.autocomplete_attribute = "off"; 149 field_data.max_length = 200; 150 field_data.is_autofilled = true; 151 field_data.is_checked = true; 152 field_data.is_checkable = true; 153 field_data.is_focusable = true; 154 field_data.should_autocomplete = false; 155 field_data.text_direction = base::i18n::RIGHT_TO_LEFT; 156 field_data.option_values.push_back(base::ASCIIToUTF16("First")); 157 field_data.option_values.push_back(base::ASCIIToUTF16("Second")); 158 field_data.option_contents.push_back(base::ASCIIToUTF16("First")); 159 field_data.option_contents.push_back(base::ASCIIToUTF16("Second")); 160 161 data.fields.push_back(field_data); 162 163 // Change a few fields. 164 field_data.max_length = 150; 165 field_data.option_values.push_back(base::ASCIIToUTF16("Third")); 166 field_data.option_contents.push_back(base::ASCIIToUTF16("Third")); 167 data.fields.push_back(field_data); 168 169 Pickle pickle; 170 SerializeIncorrectFormat(data, &pickle); 171 172 PickleIterator iter(pickle); 173 FormData actual; 174 EXPECT_FALSE(DeserializeFormData(&iter, &actual)); 175} 176 177} // namespace autofill 178