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