1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file.
4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "components/autofill/core/common/form_data.h"
6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/pickle.h"
8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h"
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace {
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This function serializes the form data into the pickle in version one format.
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// It should always be possible to deserialize it using DeserializeFormData(),
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// even when version changes. See kPickleVersion in form_data.cc.
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SerializeInVersion1Format(const autofill::FormData& form_data,
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                               Pickle* pickle) {
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteInt(1);
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteString16(form_data.name);
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::string16 method(base::ASCIIToUTF16("POST"));
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteString16(method);
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteString(form_data.origin.spec());
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteString(form_data.action.spec());
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteBool(form_data.user_submitted);
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteInt(static_cast<int>(form_data.fields.size()));
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (size_t i = 0; i < form_data.fields.size(); ++i) {
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    SerializeFormFieldData(form_data.fields[i], pickle);
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This function serializes the form data into the pickle in incorrect format
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// (no version number).
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SerializeIncorrectFormat(const autofill::FormData& form_data,
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                               Pickle* pickle) {
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteString16(form_data.name);
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteString(form_data.origin.spec());
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteString(form_data.action.spec());
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteBool(form_data.user_submitted);
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  pickle->WriteInt(static_cast<int>(form_data.fields.size()));
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (size_t i = 0; i < form_data.fields.size(); ++i) {
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    SerializeFormFieldData(form_data.fields[i], pickle);
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace autofill {
49424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST(FormDataTest, SerializeAndDeserialize) {
51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  FormData data;
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  data.name = base::ASCIIToUTF16("name");
53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  data.origin = GURL("origin");
54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  data.action = GURL("action");
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  data.user_submitted = true;
56424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
57424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  FormFieldData field_data;
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  field_data.label = base::ASCIIToUTF16("label");
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  field_data.name = base::ASCIIToUTF16("name");
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  field_data.value = base::ASCIIToUTF16("value");
61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  field_data.form_control_type = "password";
62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  field_data.autocomplete_attribute = "off";
63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  field_data.max_length = 200;
64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  field_data.is_autofilled = true;
65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  field_data.is_checked = true;
66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  field_data.is_checkable = true;
67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  field_data.is_focusable = true;
68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  field_data.should_autocomplete = false;
69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  field_data.text_direction = base::i18n::RIGHT_TO_LEFT;
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  field_data.option_values.push_back(base::ASCIIToUTF16("First"));
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  field_data.option_values.push_back(base::ASCIIToUTF16("Second"));
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  field_data.option_contents.push_back(base::ASCIIToUTF16("First"));
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  field_data.option_contents.push_back(base::ASCIIToUTF16("Second"));
74424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
75424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  data.fields.push_back(field_data);
76424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
77424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Change a few fields.
78424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  field_data.max_length = 150;
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  field_data.option_values.push_back(base::ASCIIToUTF16("Third"));
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  field_data.option_contents.push_back(base::ASCIIToUTF16("Third"));
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  data.fields.push_back(field_data);
82424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  Pickle pickle;
84424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  SerializeFormData(data, &pickle);
85424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PickleIterator iter(pickle);
87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  FormData actual;
88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(DeserializeFormData(&iter, &actual));
89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(actual, data);
91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(FormDataTest, Serialize_v1_Deserialize_vCurrent) {
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FormData data;
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.name = base::ASCIIToUTF16("name");
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.origin = GURL("origin");
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.action = GURL("action");
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.user_submitted = true;
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FormFieldData field_data;
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.label = base::ASCIIToUTF16("label");
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.name = base::ASCIIToUTF16("name");
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.value = base::ASCIIToUTF16("value");
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.form_control_type = "password";
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.autocomplete_attribute = "off";
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.max_length = 200;
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.is_autofilled = true;
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.is_checked = true;
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.is_checkable = true;
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.is_focusable = true;
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.should_autocomplete = false;
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.text_direction = base::i18n::RIGHT_TO_LEFT;
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_values.push_back(base::ASCIIToUTF16("First"));
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_values.push_back(base::ASCIIToUTF16("Second"));
11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_contents.push_back(base::ASCIIToUTF16("First"));
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_contents.push_back(base::ASCIIToUTF16("Second"));
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.fields.push_back(field_data);
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Change a few fields.
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.max_length = 150;
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_values.push_back(base::ASCIIToUTF16("Third"));
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_contents.push_back(base::ASCIIToUTF16("Third"));
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.fields.push_back(field_data);
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Pickle pickle;
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SerializeInVersion1Format(data, &pickle);
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  PickleIterator iter(pickle);
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FormData actual;
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_TRUE(DeserializeFormData(&iter, &actual));
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(actual, data);
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST(FormDataTest, SerializeIncorrectFormatAndDeserialize) {
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FormData data;
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.name = base::ASCIIToUTF16("name");
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.origin = GURL("origin");
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.action = GURL("action");
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.user_submitted = true;
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FormFieldData field_data;
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.label = base::ASCIIToUTF16("label");
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.name = base::ASCIIToUTF16("name");
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.value = base::ASCIIToUTF16("value");
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.form_control_type = "password";
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.autocomplete_attribute = "off";
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.max_length = 200;
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.is_autofilled = true;
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.is_checked = true;
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.is_checkable = true;
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.is_focusable = true;
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.should_autocomplete = false;
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.text_direction = base::i18n::RIGHT_TO_LEFT;
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_values.push_back(base::ASCIIToUTF16("First"));
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_values.push_back(base::ASCIIToUTF16("Second"));
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_contents.push_back(base::ASCIIToUTF16("First"));
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_contents.push_back(base::ASCIIToUTF16("Second"));
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.fields.push_back(field_data);
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Change a few fields.
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.max_length = 150;
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_values.push_back(base::ASCIIToUTF16("Third"));
16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  field_data.option_contents.push_back(base::ASCIIToUTF16("Third"));
16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data.fields.push_back(field_data);
16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Pickle pickle;
17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  SerializeIncorrectFormat(data, &pickle);
17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  PickleIterator iter(pickle);
17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  FormData actual;
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_FALSE(DeserializeFormData(&iter, &actual));
17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}  // namespace autofill
178