1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/guid.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_profile.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_type.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/credit_card.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_change.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_entry.h"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_table.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/os_crypt/os_crypt.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/statement.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using base::ASCIIToUTF16;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// So we can compare AutofillKeys with EXPECT_EQ().
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::ostream& operator<<(std::ostream& os, const AutofillKey& key) {
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return os << base::UTF16ToASCII(key.name()) << ", "
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            << base::UTF16ToASCII(key.value());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// So we can compare AutofillChanges with EXPECT_EQ().
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::ostream& operator<<(std::ostream& os, const AutofillChange& change) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (change.type()) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case AutofillChange::ADD: {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      os << "ADD";
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case AutofillChange::UPDATE: {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      os << "UPDATE";
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case AutofillChange::REMOVE: {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      os << "REMOVE";
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return os << " " << change.key();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)typedef std::set<AutofillEntry,
618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    bool (*)(const AutofillEntry&, const AutofillEntry&)> AutofillEntrySet;
628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)typedef AutofillEntrySet::iterator AutofillEntrySetIterator;
638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CompareAutofillEntries(const AutofillEntry& a, const AutofillEntry& b) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int compVal = a.key().name().compare(b.key().name());
668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (compVal != 0)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return compVal < 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compVal = a.key().value().compare(b.key().value());
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (compVal != 0)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return compVal < 0;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (a.date_created() != b.date_created())
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return a.date_created() < b.date_created();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return a.date_last_used() < b.date_last_used();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)AutofillEntry MakeAutofillEntry(const char* name,
808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                const char* value,
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                time_t date_created,
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                time_t date_last_used) {
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (date_last_used < 0)
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    date_last_used = date_created;
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return AutofillEntry(AutofillKey(ASCIIToUTF16(name), ASCIIToUTF16(value)),
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       Time::FromTimeT(date_created),
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       Time::FromTimeT(date_last_used));
888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Checks |actual| and |expected| contain the same elements.
918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void CompareAutofillEntrySets(const AutofillEntrySet& actual,
928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                              const AutofillEntrySet& expected) {
938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_EQ(expected.size(), actual.size());
948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  size_t count = 0;
958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  for (AutofillEntrySet::const_iterator it = actual.begin();
968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)       it != actual.end(); ++it) {
978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    count += expected.count(*it);
988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(actual.size(), count);
1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int GetAutofillEntryCount(const base::string16& name,
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          const base::string16& value,
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          WebDatabase* db) {
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  sql::Statement s(db->GetSQLConnection()->GetUniqueStatement(
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "SELECT count FROM autofill WHERE name = ? AND value = ?"));
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  s.BindString16(0, name);
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  s.BindString16(1, value);
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  s.Step();
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s.ColumnInt(0);
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}  // namespace
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillTableTest : public testing::Test {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillTableTest() {}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AutofillTableTest() {}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    OSCrypt::UseMockKeychain(true);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file_ = temp_dir_.path().AppendASCII("TestWebDatabase");
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    table_.reset(new AutofillTable("en-US"));
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db_.reset(new WebDatabase);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    db_->AddTable(table_.get());
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(sql::INIT_OK, db_->Init(file_));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath file_;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<AutofillTable> table_;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<WebDatabase> db_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AutofillTableTest);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time t1 = Time::Now();
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the submission of a handful of entries in a field called "Name",
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // some more often than others.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Superman");
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time now = base::Time::Now();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta two_seconds = base::TimeDelta::FromSeconds(2);
154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_FALSE(table_->HasFormElements());
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(table_->HasFormElements());
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> v;
1588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  for (int i = 0; i < 5; ++i) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.value = ASCIIToUTF16("Clark Kent");
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              now + i * two_seconds));
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  for (int i = 0; i < 3; ++i) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.value = ASCIIToUTF16("Clark Sutter");
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              now + i * two_seconds));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  for (int i = 0; i < 2; ++i) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.name = ASCIIToUTF16("Favorite Color");
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.value = ASCIIToUTF16("Green");
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              now + i * two_seconds));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // We have added the name Clark Kent 5 times, so count should be 5.
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(5, GetAutofillEntryCount(ASCIIToUTF16("Name"),
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ASCIIToUTF16("Clark Kent"), db_.get()));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Storing in the data base should be case sensitive, so there should be no
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database entry for clark kent lowercase.
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, GetAutofillEntryCount(ASCIIToUTF16("Name"),
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ASCIIToUTF16("clark kent"), db_.get()));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(2, GetAutofillEntryCount(ASCIIToUTF16("Favorite Color"),
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ASCIIToUTF16("Green"), db_.get()));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is meant to get a list of suggestions for Name.  The empty prefix
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the second argument means it should return all suggestions for a name
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no matter what they start with.  The order that the names occur in the list
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be decreasing order by count.
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->GetFormValuesForElementName(
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ASCIIToUTF16("Name"), base::string16(), &v, 6));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, v.size());
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v.size() == 3) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Clark Kent"), v[0]);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Clark Sutter"), v[1]);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Superman"), v[2]);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we query again limiting the list size to 1, we should only get the most
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // frequent entry.
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->GetFormValuesForElementName(
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ASCIIToUTF16("Name"), base::string16(), &v, 1));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, v.size());
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v.size() == 1) {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Clark Kent"), v[0]);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Querying for suggestions given a prefix is case-insensitive, so the prefix
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "cLa" shoud get suggestions for both Clarks.
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->GetFormValuesForElementName(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("Name"), ASCIIToUTF16("cLa"), &v, 6));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, v.size());
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (v.size() == 2) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Clark Kent"), v[0]);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Clark Sutter"), v[1]);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removing all elements since the beginning of this function should remove
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // everything from the database.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.clear();
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(t1, Time(), &changes));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const AutofillChange kExpectedChanges[] = {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillChange(AutofillChange::REMOVE,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   AutofillKey(ASCIIToUTF16("Name"),
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ASCIIToUTF16("Superman"))),
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillChange(AutofillChange::REMOVE,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   AutofillKey(ASCIIToUTF16("Name"),
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ASCIIToUTF16("Clark Kent"))),
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillChange(AutofillChange::REMOVE,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   AutofillKey(ASCIIToUTF16("Name"),
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ASCIIToUTF16("Clark Sutter"))),
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillChange(AutofillChange::REMOVE,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   AutofillKey(ASCIIToUTF16("Favorite Color"),
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ASCIIToUTF16("Green"))),
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(arraysize(kExpectedChanges), changes.size());
2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kExpectedChanges); ++i) {
2408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    EXPECT_EQ(kExpectedChanges[i], changes[i]);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, GetAutofillEntryCount(ASCIIToUTF16("Name"),
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ASCIIToUTF16("Clark Kent"), db_.get()));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->GetFormValuesForElementName(
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ASCIIToUTF16("Name"), base::string16(), &v, 6));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, v.size());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now add some values with empty strings.
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kValue = ASCIIToUTF16("  toto   ");
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("blank");
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  field.value = base::string16();
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("blank");
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16(" ");
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("blank");
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("      ");
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("blank");
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = kValue;
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // They should be stored normally as the DB layer does not check for empty
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // values.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v.clear();
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->GetFormValuesForElementName(
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ASCIIToUTF16("blank"), base::string16(), &v, 10));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, v.size());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_RemoveBetweenChanges) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta one_day(TimeDelta::FromDays(1));
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time t1 = Time::Now();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time t2 = t1 + one_day;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Superman");
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes, t1));
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes, t2));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.clear();
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(t1, t2, &changes));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, changes.size());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutofillChange(AutofillChange::UPDATE,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           AutofillKey(ASCIIToUTF16("Name"),
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ASCIIToUTF16("Superman"))),
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            changes[0]);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.clear();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      table_->RemoveFormElementsAddedBetween(t2, t2 + one_day, &changes));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, changes.size());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutofillChange(AutofillChange::REMOVE,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           AutofillKey(ASCIIToUTF16("Name"),
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ASCIIToUTF16("Superman"))),
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            changes[0]);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_AddChanges) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TimeDelta one_day(TimeDelta::FromDays(1));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time t1 = Time::Now();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time t2 = t1 + one_day;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Superman");
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes, t1));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, changes.size());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutofillChange(AutofillChange::ADD,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           AutofillKey(ASCIIToUTF16("Name"),
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ASCIIToUTF16("Superman"))),
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            changes[0]);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.clear();
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      table_->AddFormFieldValueTime(field, &changes, t2));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, changes.size());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(AutofillChange(AutofillChange::UPDATE,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           AutofillKey(ASCIIToUTF16("Name"),
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ASCIIToUTF16("Superman"))),
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            changes[0]);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_UpdateOneWithOneTimestamp) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry entry(MakeAutofillEntry("foo", "bar", 1, -1));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(entry);
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, GetAutofillEntryCount(ASCIIToUTF16("foo"), ASCIIToUTF16("bar"),
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     db_.get()));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> all_entries;
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAllAutofillEntries(&all_entries));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, all_entries.size());
3418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(entry, all_entries[0]);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_UpdateOneWithTwoTimestamps) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry entry(MakeAutofillEntry("foo", "bar", 1, 2));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(entry);
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(2, GetAutofillEntryCount(ASCIIToUTF16("foo"), ASCIIToUTF16("bar"),
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     db_.get()));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> all_entries;
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAllAutofillEntries(&all_entries));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, all_entries.size());
3568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(entry, all_entries[0]);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_GetAutofillTimestamps) {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry entry(MakeAutofillEntry("foo", "bar", 1, 2));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(entry);
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Time date_created, date_last_used;
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillTimestamps(ASCIIToUTF16("foo"),
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            ASCIIToUTF16("bar"),
368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            &date_created,
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            &date_last_used));
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(Time::FromTimeT(1), date_created);
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(Time::FromTimeT(2), date_last_used);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_UpdateTwo) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry entry0(MakeAutofillEntry("foo", "bar0", 1, -1));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry entry1(MakeAutofillEntry("foo", "bar1", 2, 3));
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(entry0);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(entry1);
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1, GetAutofillEntryCount(ASCIIToUTF16("foo"), ASCIIToUTF16("bar0"),
383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     db_.get()));
384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(2, GetAutofillEntryCount(ASCIIToUTF16("foo"), ASCIIToUTF16("bar1"),
385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     db_.get()));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_UpdateReplace) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a form field.  This will be replaced.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Superman");
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry entry(MakeAutofillEntry("Name", "Superman", 1, 2));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(entry);
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> all_entries;
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAllAutofillEntries(&all_entries));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, all_entries.size());
4048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(entry, all_entries[0]);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_UpdateDontReplace) {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time t = Time::Now();
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry existing(
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeAutofillEntry("Name", "Superman", t.ToTimeT(), -1));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a form field.  This will NOT be replaced.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = existing.key().name();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = existing.key().value();
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes, t));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry entry(MakeAutofillEntry("Name", "Clark Kent", 1, 2));
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(entry);
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> all_entries;
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAllAutofillEntries(&all_entries));
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, all_entries.size());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntrySet expected_entries(all_entries.begin(),
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    all_entries.end(),
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    CompareAutofillEntries);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, expected_entries.count(existing));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, expected_entries.count(entry));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_AddFormFieldValues) {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time t = Time::Now();
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add multiple values for "firstname" and "lastname" names.  Test that only
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first value of each gets added. Related to security issue:
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/51727.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<FormFieldData> elements;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("firstname");
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Joe");
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elements.push_back(field);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("firstname");
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Jane");
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elements.push_back(field);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("lastname");
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Smith");
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elements.push_back(field);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("lastname");
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Jones");
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elements.push_back(field);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillChange> changes;
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  table_->AddFormFieldValuesTime(elements, &changes, t);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, changes.size());
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(changes[0], AutofillChange(AutofillChange::ADD,
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       AutofillKey(ASCIIToUTF16("firstname"),
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ASCIIToUTF16("Joe"))));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(changes[1], AutofillChange(AutofillChange::ADD,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       AutofillKey(ASCIIToUTF16("lastname"),
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ASCIIToUTF16("Smith"))));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> all_entries;
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAllAutofillEntries(&all_entries));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, all_entries.size());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AutofillTableTest,
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       Autofill_RemoveFormElementsAddedBetween_UsedOnlyBefore) {
475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Add an entry used only before the targetted range.
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AutofillChangeList changes;
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FormFieldData field;
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.value = ASCIIToUTF16("Superman");
480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(10)));
482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(20)));
484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(30)));
486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(40)));
488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(50)));
490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  changes.clear();
494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(base::Time::FromTimeT(51),
495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     base::Time::FromTimeT(60),
496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     &changes));
497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(changes.empty());
498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AutofillTableTest,
502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       Autofill_RemoveFormElementsAddedBetween_UsedOnlyAfter) {
503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Add an entry used only after the targetted range.
504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AutofillChangeList changes;
505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FormFieldData field;
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.value = ASCIIToUTF16("Superman");
508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(50)));
510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(60)));
512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(70)));
514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(80)));
516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(90)));
518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  changes.clear();
522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(base::Time::FromTimeT(40),
523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     base::Time::FromTimeT(50),
524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     &changes));
525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(changes.empty());
526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
528a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AutofillTableTest,
530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       Autofill_RemoveFormElementsAddedBetween_UsedOnlyDuring) {
531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Add an entry used entirely during the targetted range.
532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AutofillChangeList changes;
533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FormFieldData field;
534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.value = ASCIIToUTF16("Superman");
536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(10)));
538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(20)));
540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(30)));
542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(40)));
544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(50)));
546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  changes.clear();
550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(base::Time::FromTimeT(10),
551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     base::Time::FromTimeT(51),
552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     &changes));
553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1U, changes.size());
554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(AutofillChange(AutofillChange::REMOVE,
555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           AutofillKey(field.name, field.value)),
556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            changes[0]);
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(0, GetAutofillEntryCount(field.name, field.value, db_.get()));
558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AutofillTableTest,
561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       Autofill_RemoveFormElementsAddedBetween_UsedBeforeAndDuring) {
562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Add an entry used both before and during the targetted range.
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AutofillChangeList changes;
564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FormFieldData field;
565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.value = ASCIIToUTF16("Superman");
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(10)));
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(20)));
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(30)));
573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(40)));
575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(50)));
577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  changes.clear();
581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(base::Time::FromTimeT(40),
582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     base::Time::FromTimeT(60),
583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     &changes));
584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1U, changes.size());
585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(AutofillChange(AutofillChange::UPDATE,
586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           AutofillKey(field.name, field.value)),
587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            changes[0]);
588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(4, GetAutofillEntryCount(field.name, field.value, db_.get()));
589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::Time date_created, date_last_used;
590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(
591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      table_->GetAutofillTimestamps(field.name, field.value,
592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    &date_created, &date_last_used));
593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(base::Time::FromTimeT(10), date_created);
594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(base::Time::FromTimeT(39), date_last_used);
595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(AutofillTableTest,
598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       Autofill_RemoveFormElementsAddedBetween_UsedDuringAndAfter) {
599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Add an entry used both during and after the targetted range.
600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AutofillChangeList changes;
601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FormFieldData field;
602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  field.value = ASCIIToUTF16("Superman");
604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(50)));
606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(60)));
608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(70)));
610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(80)));
612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                            base::Time::FromTimeT(90)));
614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  changes.clear();
618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(base::Time::FromTimeT(40),
619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     base::Time::FromTimeT(80),
620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     &changes));
621a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(1U, changes.size());
622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(AutofillChange(AutofillChange::UPDATE,
623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           AutofillKey(field.name, field.value)),
624a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            changes[0]);
625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(2, GetAutofillEntryCount(field.name, field.value, db_.get()));
626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::Time date_created, date_last_used;
627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(
628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      table_->GetAutofillTimestamps(field.name, field.value,
629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                    &date_created, &date_last_used));
630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(base::Time::FromTimeT(80), date_created);
631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(base::Time::FromTimeT(90), date_last_used);
632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, AutofillProfile) {
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a 'Home' profile.
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile home_profile;
63790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  home_profile.set_origin(std::string());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John"));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Q."));
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("js@smith.xyz"));
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Google"));
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1234 Apple Way"));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("unit 5"));
645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  home_profile.SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY,
646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                          ASCIIToUTF16("Beverly Hills"));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("Los Angeles"));
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90025"));
650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  home_profile.SetRawInfo(ADDRESS_HOME_SORTING_CODE, ASCIIToUTF16("MAGIC ###"));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  home_profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("18181234567"));
653a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  home_profile.set_language_code("en");
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time pre_creation_time = Time::Now();
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddAutofillProfile(home_profile));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time post_creation_time = Time::Now();
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the 'Home' profile.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* db_profile;
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(home_profile.guid(), &db_profile));
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(home_profile, *db_profile);
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_home(db_->GetSQLConnection()->GetUniqueStatement(
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT date_modified "
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "FROM autofill_profiles WHERE guid=?"));
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s_home.BindString(0, home_profile.guid());
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_home.is_valid());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_home.Step());
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(s_home.ColumnInt64(0), pre_creation_time.ToTimeT());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(s_home.ColumnInt64(0), post_creation_time.ToTimeT());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_home.Step());
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a 'Billing' profile.
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile billing_profile = home_profile;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.set_guid(base::GenerateGUID());
67790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  billing_profile.set_origin("https://www.example.com/");
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(ADDRESS_HOME_LINE1,
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ASCIIToUTF16("5678 Bottom Street"));
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("suite 3"));
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pre_creation_time = Time::Now();
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddAutofillProfile(billing_profile));
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  post_creation_time = Time::Now();
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the 'Billing' profile.
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(billing_profile.guid(), &db_profile));
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(billing_profile, *db_profile);
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_billing(db_->GetSQLConnection()->GetUniqueStatement(
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT date_modified FROM autofill_profiles WHERE guid=?"));
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s_billing.BindString(0, billing_profile.guid());
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_billing.is_valid());
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_billing.Step());
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(s_billing.ColumnInt64(0), pre_creation_time.ToTimeT());
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(s_billing.ColumnInt64(0), post_creation_time.ToTimeT());
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_billing.Step());
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the 'Billing' profile, name only.
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Jane"));
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time pre_modification_time = Time::Now();
70290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(table_->UpdateAutofillProfile(billing_profile));
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time post_modification_time = Time::Now();
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(billing_profile.guid(), &db_profile));
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(billing_profile, *db_profile);
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_billing_updated(db_->GetSQLConnection()->GetUniqueStatement(
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT date_modified FROM autofill_profiles WHERE guid=?"));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s_billing_updated.BindString(0, billing_profile.guid());
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_billing_updated.is_valid());
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_billing_updated.Step());
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(s_billing_updated.ColumnInt64(0),
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pre_modification_time.ToTimeT());
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(s_billing_updated.ColumnInt64(0),
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            post_modification_time.ToTimeT());
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_billing_updated.Step());
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the 'Billing' profile.
71990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  billing_profile.set_origin("Chrome settings");
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Janice"));
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("C."));
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Joplin"));
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("jane@singer.com"));
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Indy"));
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("Open Road"));
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Route 66"));
727a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  billing_profile.SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY,
728a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             ASCIIToUTF16("District 9"));
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("NFA"));
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("NY"));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("10011"));
732a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  billing_profile.SetRawInfo(ADDRESS_HOME_SORTING_CODE, ASCIIToUTF16("123456"));
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  billing_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  billing_profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER,
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ASCIIToUTF16("18181230000"));
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time pre_modification_time_2 = Time::Now();
73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(table_->UpdateAutofillProfile(billing_profile));
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time post_modification_time_2 = Time::Now();
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(billing_profile.guid(), &db_profile));
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(billing_profile, *db_profile);
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_billing_updated_2(
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "SELECT date_modified FROM autofill_profiles WHERE guid=?"));
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s_billing_updated_2.BindString(0, billing_profile.guid());
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_billing_updated_2.is_valid());
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_billing_updated_2.Step());
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(s_billing_updated_2.ColumnInt64(0),
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pre_modification_time_2.ToTimeT());
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(s_billing_updated_2.ColumnInt64(0),
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            post_modification_time_2.ToTimeT());
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_billing_updated_2.Step());
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the 'Billing' profile.
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->RemoveAutofillProfile(billing_profile.guid()));
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(table_->GetAutofillProfile(billing_profile.guid(), &db_profile));
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, AutofillProfileMultiValueNames) {
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile p;
761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kJohnDoe(ASCIIToUTF16("John Doe"));
762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kJohnPDoe(ASCIIToUTF16("John P. Doe"));
763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> set_values;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values.push_back(kJohnDoe);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values.push_back(kJohnPDoe);
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.SetRawMultiInfo(NAME_FULL, set_values);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddAutofillProfile(p));
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* db_profile;
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p, *db_profile);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, p.Compare(*db_profile));
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the values.
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kNoOne(ASCIIToUTF16("No One"));
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values[1] = kNoOne;
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.SetRawMultiInfo(NAME_FULL, set_values);
78090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(table_->UpdateAutofillProfile(p));
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p, *db_profile);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, p.Compare(*db_profile));
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete values.
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values.clear();
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.SetRawMultiInfo(NAME_FULL, set_values);
78990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(table_->UpdateAutofillProfile(p));
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p, *db_profile);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, p.Compare(*db_profile));
793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), db_profile->GetRawInfo(NAME_FULL));
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, AutofillProfileMultiValueEmails) {
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile p;
799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kJohnDoe(ASCIIToUTF16("john@doe.com"));
800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kJohnPDoe(ASCIIToUTF16("john_p@doe.com"));
801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> set_values;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values.push_back(kJohnDoe);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values.push_back(kJohnPDoe);
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.SetRawMultiInfo(EMAIL_ADDRESS, set_values);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddAutofillProfile(p));
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* db_profile;
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p, *db_profile);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, p.Compare(*db_profile));
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the values.
815c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kNoOne(ASCIIToUTF16("no@one.com"));
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values[1] = kNoOne;
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.SetRawMultiInfo(EMAIL_ADDRESS, set_values);
81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(table_->UpdateAutofillProfile(p));
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p, *db_profile);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, p.Compare(*db_profile));
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete values.
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values.clear();
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.SetRawMultiInfo(EMAIL_ADDRESS, set_values);
82790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(table_->UpdateAutofillProfile(p));
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p, *db_profile);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, p.Compare(*db_profile));
831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), db_profile->GetRawInfo(EMAIL_ADDRESS));
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, AutofillProfileMultiValuePhone) {
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile p;
837c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kJohnDoe(ASCIIToUTF16("4151112222"));
838c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kJohnPDoe(ASCIIToUTF16("4151113333"));
839c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<base::string16> set_values;
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values.push_back(kJohnDoe);
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values.push_back(kJohnPDoe);
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values);
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddAutofillProfile(p));
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* db_profile;
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p, *db_profile);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, p.Compare(*db_profile));
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the values.
853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::string16 kNoOne(ASCIIToUTF16("4151110000"));
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values[1] = kNoOne;
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values);
85690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(table_->UpdateAutofillProfile(p));
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p, *db_profile);
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, p.Compare(*db_profile));
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete values.
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_values.clear();
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values);
86590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(table_->UpdateAutofillProfile(p));
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p, *db_profile);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, p.Compare(*db_profile));
869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(base::string16(), db_profile->GetRawInfo(EMAIL_ADDRESS));
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_profile;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, AutofillProfileTrash) {
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> guids;
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  table_->GetAutofillProfilesInTrash(&guids);
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(guids.empty());
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->AddAutofillGUIDToTrash(
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "00000000-0000-0000-0000-000000000000"));
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->AddAutofillGUIDToTrash(
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "00000000-0000-0000-0000-000000000001"));
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfilesInTrash(&guids));
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2UL, guids.size());
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000000", guids[0]);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000001", guids[1]);
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->EmptyAutofillProfilesTrash());
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfilesInTrash(&guids));
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(guids.empty());
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, AutofillProfileTrashInteraction) {
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> guids;
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  table_->GetAutofillProfilesInTrash(&guids);
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(guids.empty());
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile profile;
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John"));
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Q."));
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
9018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("js@smith.xyz"));
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1 Main St"));
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("Los Angeles"));
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90025"));
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark this profile as in the trash.  This stops |AddAutofillProfile| from
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // adding it.
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddAutofillGUIDToTrash(profile.guid()));
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddAutofillProfile(profile));
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* added_profile = NULL;
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(table_->GetAutofillProfile(profile.guid(), &added_profile));
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<AutofillProfile*>(NULL), added_profile);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add the profile for real this time.
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->EmptyAutofillProfilesTrash());
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->GetAutofillProfilesInTrash(&guids));
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(guids.empty());
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddAutofillProfile(profile));
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->GetAutofillProfile(profile.guid(),
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                        &added_profile));
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<AutofillProfile*>(NULL), added_profile);
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete added_profile;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mark this profile as in the trash.  This stops |UpdateAutofillProfileMulti|
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from updating it.  In normal operation a profile should not be both in the
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // trash and in the profiles table simultaneously.
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddAutofillGUIDToTrash(profile.guid()));
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Jane"));
93190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(table_->UpdateAutofillProfile(profile));
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* updated_profile = NULL;
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->GetAutofillProfile(profile.guid(), &updated_profile));
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<AutofillProfile*>(NULL), added_profile);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("John"), updated_profile->GetRawInfo(NAME_FIRST));
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete updated_profile;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to delete the trashed profile.  This stops |RemoveAutofillProfile| from
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deleting it.  In normal operation deletion is done by migration step, and
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // removal from trash is done by |WebDataService|.  |RemoveAutofillProfile|
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // does remove the item from the trash if it is found however, so that if
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // other clients remove it (via Sync say) then it is gone and doesn't need to
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be processed further by |WebDataService|.
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->RemoveAutofillProfile(profile.guid()));
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* removed_profile = NULL;
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->GetAutofillProfile(profile.guid(), &removed_profile));
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(table_->IsAutofillGUIDInTrash(profile.guid()));
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(static_cast<AutofillProfile*>(NULL), removed_profile);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete removed_profile;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that emptying the trash now allows removal to occur.
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->EmptyAutofillProfilesTrash());
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->RemoveAutofillProfile(profile.guid()));
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  removed_profile = NULL;
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(table_->GetAutofillProfile(profile.guid(), &removed_profile));
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<AutofillProfile*>(NULL), removed_profile);
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, CreditCard) {
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a 'Work' credit card.
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard work_creditcard;
96290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  work_creditcard.set_origin("https://www.example.com/");
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_creditcard.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Jack Torrance"));
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_creditcard.SetRawInfo(CREDIT_CARD_NUMBER,
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ASCIIToUTF16("1234567890123456"));
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_creditcard.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("04"));
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  work_creditcard.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR,
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ASCIIToUTF16("2013"));
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time pre_creation_time = Time::Now();
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddCreditCard(work_creditcard));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time post_creation_time = Time::Now();
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the 'Work' credit card.
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard* db_creditcard;
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetCreditCard(work_creditcard.guid(), &db_creditcard));
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(work_creditcard, *db_creditcard);
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_work(db_->GetSQLConnection()->GetUniqueStatement(
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT guid, name_on_card, expiration_month, expiration_year, "
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "card_number_encrypted, date_modified "
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "FROM credit_cards WHERE guid=?"));
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s_work.BindString(0, work_creditcard.guid());
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_work.is_valid());
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_work.Step());
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(s_work.ColumnInt64(5), pre_creation_time.ToTimeT());
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(s_work.ColumnInt64(5), post_creation_time.ToTimeT());
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_work.Step());
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_creditcard;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a 'Target' credit card.
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard target_creditcard;
99290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  target_creditcard.set_origin(std::string());
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_creditcard.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Jack Torrance"));
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_creditcard.SetRawInfo(CREDIT_CARD_NUMBER,
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ASCIIToUTF16("1111222233334444"));
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_creditcard.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("06"));
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_creditcard.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR,
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ASCIIToUTF16("2012"));
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pre_creation_time = Time::Now();
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddCreditCard(target_creditcard));
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  post_creation_time = Time::Now();
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetCreditCard(target_creditcard.guid(), &db_creditcard));
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(target_creditcard, *db_creditcard);
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_target(db_->GetSQLConnection()->GetUniqueStatement(
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT guid, name_on_card, expiration_month, expiration_year, "
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "card_number_encrypted, date_modified "
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "FROM credit_cards WHERE guid=?"));
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s_target.BindString(0, target_creditcard.guid());
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_target.is_valid());
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_target.Step());
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(s_target.ColumnInt64(5), pre_creation_time.ToTimeT());
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(s_target.ColumnInt64(5), post_creation_time.ToTimeT());
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_target.Step());
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_creditcard;
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the 'Target' credit card.
101890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  target_creditcard.set_origin("Interactive Autofill dialog");
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_creditcard.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Charles Grady"));
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time pre_modification_time = Time::Now();
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->UpdateCreditCard(target_creditcard));
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time post_modification_time = Time::Now();
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetCreditCard(target_creditcard.guid(), &db_creditcard));
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(target_creditcard, *db_creditcard);
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_target_updated(db_->GetSQLConnection()->GetUniqueStatement(
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT guid, name_on_card, expiration_month, expiration_year, "
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "card_number_encrypted, date_modified "
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "FROM credit_cards WHERE guid=?"));
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s_target_updated.BindString(0, target_creditcard.guid());
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_target_updated.is_valid());
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_target_updated.Step());
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(s_target_updated.ColumnInt64(5), pre_modification_time.ToTimeT());
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(s_target_updated.ColumnInt64(5), post_modification_time.ToTimeT());
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_target_updated.Step());
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete db_creditcard;
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the 'Target' credit card.
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->RemoveCreditCard(target_creditcard.guid()));
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(table_->GetCreditCard(target_creditcard.guid(), &db_creditcard));
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, UpdateAutofillProfile) {
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a profile to the db.
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile profile;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John"));
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Q."));
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("js@example.com"));
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Google"));
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1234 Apple Way"));
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("unit 5"));
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("Los Angeles"));
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90025"));
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("18181234567"));
1057a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  profile.set_language_code("en");
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  table_->AddAutofillProfile(profile);
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a mocked value for the profile's creation time.
10618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const time_t kMockCreationDate = Time::Now().ToTimeT() - 13;
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_mock_creation_date(
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "UPDATE autofill_profiles SET date_modified = ?"));
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_mock_creation_date.is_valid());
10668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  s_mock_creation_date.BindInt64(0, kMockCreationDate);
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_mock_creation_date.Run());
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the profile.
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* tmp_profile;
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(profile.guid(), &tmp_profile));
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<AutofillProfile> db_profile(tmp_profile);
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile, *db_profile);
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_original(db_->GetSQLConnection()->GetUniqueStatement(
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT date_modified FROM autofill_profiles"));
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_original.is_valid());
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_original.Step());
10788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(kMockCreationDate, s_original.ColumnInt64(0));
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_original.Step());
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, update the profile and save the update to the database.
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The modification date should change to reflect the update.
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("js@smith.xyz"));
108490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  table_->UpdateAutofillProfile(profile);
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the profile.
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(profile.guid(), &tmp_profile));
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_profile.reset(tmp_profile);
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile, *db_profile);
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_updated(db_->GetSQLConnection()->GetUniqueStatement(
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT date_modified FROM autofill_profiles"));
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_updated.is_valid());
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_updated.Step());
10948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_LT(kMockCreationDate, s_updated.ColumnInt64(0));
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_updated.Step());
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a mocked value for the profile's modification time.
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const time_t mock_modification_date = Time::Now().ToTimeT() - 7;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Statement s_mock_modification_date(
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "UPDATE autofill_profiles SET date_modified = ?"));
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_mock_modification_date.is_valid());
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s_mock_modification_date.BindInt64(0, mock_modification_date);
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_mock_modification_date.Run());
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Finally, call into |UpdateAutofillProfile()| without changing the
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile.  The modification date should not change.
110890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  table_->UpdateAutofillProfile(profile);
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the profile.
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(profile.guid(), &tmp_profile));
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_profile.reset(tmp_profile);
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(profile, *db_profile);
11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_unchanged(db_->GetSQLConnection()->GetUniqueStatement(
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT date_modified FROM autofill_profiles"));
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_unchanged.is_valid());
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_unchanged.Step());
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(mock_modification_date, s_unchanged.ColumnInt64(0));
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_unchanged.Step());
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, UpdateCreditCard) {
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a credit card to the db.
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard credit_card;
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Jack Torrance"));
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("1234567890123456"));
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("04"));
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2013"));
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  table_->AddCreditCard(credit_card);
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a mocked value for the credit card's creation time.
11328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const time_t kMockCreationDate = Time::Now().ToTimeT() - 13;
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_mock_creation_date(
11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "UPDATE credit_cards SET date_modified = ?"));
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_mock_creation_date.is_valid());
11378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  s_mock_creation_date.BindInt64(0, kMockCreationDate);
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_mock_creation_date.Run());
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the credit card.
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreditCard* tmp_credit_card;
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetCreditCard(credit_card.guid(), &tmp_credit_card));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<CreditCard> db_credit_card(tmp_credit_card);
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(credit_card, *db_credit_card);
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_original(db_->GetSQLConnection()->GetUniqueStatement(
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT date_modified FROM credit_cards"));
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_original.is_valid());
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_original.Step());
11498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(kMockCreationDate, s_original.ColumnInt64(0));
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_original.Step());
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now, update the credit card and save the update to the database.
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The modification date should change to reflect the update.
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  table_->UpdateCreditCard(credit_card);
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the credit card.
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetCreditCard(credit_card.guid(), &tmp_credit_card));
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_credit_card.reset(tmp_credit_card);
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(credit_card, *db_credit_card);
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_updated(db_->GetSQLConnection()->GetUniqueStatement(
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT date_modified FROM credit_cards"));
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_updated.is_valid());
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_updated.Step());
11658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_LT(kMockCreationDate, s_updated.ColumnInt64(0));
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_updated.Step());
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set a mocked value for the credit card's modification time.
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const time_t mock_modification_date = Time::Now().ToTimeT() - 7;
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Statement s_mock_modification_date(
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "UPDATE credit_cards SET date_modified = ?"));
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_mock_modification_date.is_valid());
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  s_mock_modification_date.BindInt64(0, mock_modification_date);
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_mock_modification_date.Run());
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finally, call into |UpdateCreditCard()| without changing the credit card.
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The modification date should not change.
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  table_->UpdateCreditCard(credit_card);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Get the credit card.
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetCreditCard(credit_card.guid(), &tmp_credit_card));
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_credit_card.reset(tmp_credit_card);
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(credit_card, *db_credit_card);
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::Statement s_unchanged(db_->GetSQLConnection()->GetUniqueStatement(
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SELECT date_modified FROM credit_cards"));
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_unchanged.is_valid());
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_unchanged.Step());
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(mock_modification_date, s_unchanged.ColumnInt64(0));
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_unchanged.Step());
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
119390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(AutofillTableTest, UpdateProfileOriginOnly) {
119490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add a profile to the db.
119590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AutofillProfile profile;
119690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John"));
119790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Q."));
119890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
119990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("js@example.com"));
120090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Google"));
120190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1234 Apple Way"));
120290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("unit 5"));
120390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("Los Angeles"));
120490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
120590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90025"));
120690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
120790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("18181234567"));
120890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  table_->AddAutofillProfile(profile);
120990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
121090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Set a mocked value for the profile's creation time.
12118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const time_t kMockCreationDate = Time::Now().ToTimeT() - 13;
121290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  sql::Statement s_mock_creation_date(
121390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
121490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          "UPDATE autofill_profiles SET date_modified = ?"));
121590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_mock_creation_date.is_valid());
12168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  s_mock_creation_date.BindInt64(0, kMockCreationDate);
121790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_mock_creation_date.Run());
121890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
121990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Get the profile.
122090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AutofillProfile* tmp_profile;
122190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(profile.guid(), &tmp_profile));
122290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<AutofillProfile> db_profile(tmp_profile);
122390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(profile, *db_profile);
122490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  sql::Statement s_original(db_->GetSQLConnection()->GetUniqueStatement(
122590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "SELECT date_modified FROM autofill_profiles"));
122690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_original.is_valid());
122790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_original.Step());
12288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(kMockCreationDate, s_original.ColumnInt64(0));
122990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(s_original.Step());
123090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
123190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Now, update just the profile's origin and save the update to the database.
123290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The modification date should change to reflect the update.
123390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profile.set_origin("https://www.example.com/");
123490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  table_->UpdateAutofillProfile(profile);
123590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
123690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Get the profile.
123790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(table_->GetAutofillProfile(profile.guid(), &tmp_profile));
123890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  db_profile.reset(tmp_profile);
123990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(profile, *db_profile);
124090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  sql::Statement s_updated(db_->GetSQLConnection()->GetUniqueStatement(
124190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "SELECT date_modified FROM autofill_profiles"));
124290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_updated.is_valid());
124390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_updated.Step());
12448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_LT(kMockCreationDate, s_updated.ColumnInt64(0));
124590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(s_updated.Step());
124690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
124790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
124890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(AutofillTableTest, UpdateCreditCardOriginOnly) {
124990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Add a credit card to the db.
125090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard credit_card;
125190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Jack Torrance"));
125290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("1234567890123456"));
125390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("04"));
125490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  credit_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2013"));
125590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  table_->AddCreditCard(credit_card);
125690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
125790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Set a mocked value for the credit card's creation time.
12588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const time_t kMockCreationDate = Time::Now().ToTimeT() - 13;
125990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  sql::Statement s_mock_creation_date(
126090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
126190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          "UPDATE credit_cards SET date_modified = ?"));
126290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_mock_creation_date.is_valid());
12638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  s_mock_creation_date.BindInt64(0, kMockCreationDate);
126490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_mock_creation_date.Run());
126590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
126690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Get the credit card.
126790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CreditCard* tmp_credit_card;
126890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(table_->GetCreditCard(credit_card.guid(), &tmp_credit_card));
126990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<CreditCard> db_credit_card(tmp_credit_card);
127090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(credit_card, *db_credit_card);
127190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  sql::Statement s_original(db_->GetSQLConnection()->GetUniqueStatement(
127290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "SELECT date_modified FROM credit_cards"));
127390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_original.is_valid());
127490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_original.Step());
12758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(kMockCreationDate, s_original.ColumnInt64(0));
127690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(s_original.Step());
127790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
127890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Now, update just the credit card's origin and save the update to the
127990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // database.  The modification date should change to reflect the update.
128090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  credit_card.set_origin("https://www.example.com/");
128190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  table_->UpdateCreditCard(credit_card);
128290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
128390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Get the credit card.
128490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(table_->GetCreditCard(credit_card.guid(), &tmp_credit_card));
128590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  db_credit_card.reset(tmp_credit_card);
128690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(credit_card, *db_credit_card);
128790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  sql::Statement s_updated(db_->GetSQLConnection()->GetUniqueStatement(
128890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "SELECT date_modified FROM credit_cards"));
128990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_updated.is_valid());
129090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_updated.Step());
12918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_LT(kMockCreationDate, s_updated.ColumnInt64(0));
129290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_FALSE(s_updated.Step());
129390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
129490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(AutofillTableTest, RemoveAutofillDataModifiedBetween) {
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Populate the autofill_profiles and credit_cards tables.
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(db_->GetSQLConnection()->Execute(
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO autofill_profiles (guid, date_modified) "
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000000', 11);"
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO autofill_profiles (guid, date_modified) "
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000001', 21);"
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO autofill_profiles (guid, date_modified) "
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000002', 31);"
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO autofill_profiles (guid, date_modified) "
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000003', 41);"
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO autofill_profiles (guid, date_modified) "
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000004', 51);"
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO autofill_profiles (guid, date_modified) "
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000005', 61);"
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO credit_cards (guid, date_modified) "
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000006', 17);"
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO credit_cards (guid, date_modified) "
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000007', 27);"
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO credit_cards (guid, date_modified) "
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000008', 37);"
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO credit_cards (guid, date_modified) "
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000009', 47);"
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO credit_cards (guid, date_modified) "
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000010', 57);"
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "INSERT INTO credit_cards (guid, date_modified) "
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000011', 67);"));
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove all entries modified in the bounded time range [17,41).
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> profile_guids;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> credit_card_guids;
1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  table_->RemoveAutofillDataModifiedBetween(
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Time::FromTimeT(17), Time::FromTimeT(41),
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_guids, &credit_card_guids);
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2UL, profile_guids.size());
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000001", profile_guids[0]);
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000002", profile_guids[1]);
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Statement s_autofill_profiles_bounded(
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "SELECT date_modified FROM autofill_profiles"));
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_bounded.is_valid());
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_bounded.Step());
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(11, s_autofill_profiles_bounded.ColumnInt64(0));
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_bounded.Step());
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(41, s_autofill_profiles_bounded.ColumnInt64(0));
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_bounded.Step());
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(51, s_autofill_profiles_bounded.ColumnInt64(0));
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_bounded.Step());
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(61, s_autofill_profiles_bounded.ColumnInt64(0));
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_autofill_profiles_bounded.Step());
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3UL, credit_card_guids.size());
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000006", credit_card_guids[0]);
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000007", credit_card_guids[1]);
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000008", credit_card_guids[2]);
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Statement s_credit_cards_bounded(
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "SELECT date_modified FROM credit_cards"));
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_credit_cards_bounded.is_valid());
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_credit_cards_bounded.Step());
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(47, s_credit_cards_bounded.ColumnInt64(0));
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_credit_cards_bounded.Step());
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(57, s_credit_cards_bounded.ColumnInt64(0));
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_credit_cards_bounded.Step());
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(67, s_credit_cards_bounded.ColumnInt64(0));
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_credit_cards_bounded.Step());
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove all entries modified on or after time 51 (unbounded range).
1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  table_->RemoveAutofillDataModifiedBetween(
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Time::FromTimeT(51), Time(),
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_guids, &credit_card_guids);
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2UL, profile_guids.size());
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000004", profile_guids[0]);
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000005", profile_guids[1]);
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Statement s_autofill_profiles_unbounded(
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "SELECT date_modified FROM autofill_profiles"));
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_unbounded.is_valid());
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_unbounded.Step());
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(11, s_autofill_profiles_unbounded.ColumnInt64(0));
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_unbounded.Step());
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(41, s_autofill_profiles_unbounded.ColumnInt64(0));
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_autofill_profiles_unbounded.Step());
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2UL, credit_card_guids.size());
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000010", credit_card_guids[0]);
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000011", credit_card_guids[1]);
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Statement s_credit_cards_unbounded(
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "SELECT date_modified FROM credit_cards"));
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_credit_cards_unbounded.is_valid());
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_credit_cards_unbounded.Step());
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(47, s_credit_cards_unbounded.ColumnInt64(0));
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_credit_cards_unbounded.Step());
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove all remaining entries.
1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  table_->RemoveAutofillDataModifiedBetween(
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Time(), Time(),
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &profile_guids, &credit_card_guids);
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2UL, profile_guids.size());
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000000", profile_guids[0]);
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000003", profile_guids[1]);
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Statement s_autofill_profiles_empty(
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "SELECT date_modified FROM autofill_profiles"));
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_empty.is_valid());
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_autofill_profiles_empty.Step());
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1UL, credit_card_guids.size());
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000009", credit_card_guids[0]);
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Statement s_credit_cards_empty(
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "SELECT date_modified FROM credit_cards"));
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(s_credit_cards_empty.is_valid());
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(s_credit_cards_empty.Step());
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
140990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(AutofillTableTest, RemoveOriginURLsModifiedBetween) {
141090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Populate the autofill_profiles and credit_cards tables.
141190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(db_->GetSQLConnection()->Execute(
141290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "INSERT INTO autofill_profiles (guid, origin, date_modified) "
141390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000000', '', 11);"
141490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "INSERT INTO autofill_profiles (guid, origin, date_modified) "
141590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000001', "
141690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "       'https://www.example.com/', 21);"
141790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "INSERT INTO autofill_profiles (guid, origin, date_modified) "
141890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000002', 'Chrome settings', 31);"
141990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "INSERT INTO credit_cards (guid, origin, date_modified) "
142090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000003', '', 17);"
142190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "INSERT INTO credit_cards (guid, origin, date_modified) "
142290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000004', "
142390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "       'https://www.example.com/', 27);"
142490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "INSERT INTO credit_cards (guid, origin, date_modified) "
142590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "VALUES('00000000-0000-0000-0000-000000000005', 'Chrome settings', "
142690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "       37);"));
142790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
142890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Remove all origin URLs set in the bounded time range [21,27).
142990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ScopedVector<AutofillProfile> profiles;
143090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  table_->RemoveOriginURLsModifiedBetween(
143190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      Time::FromTimeT(21), Time::FromTimeT(27), &profiles);
143290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_EQ(1UL, profiles.size());
143390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("00000000-0000-0000-0000-000000000001", profiles[0]->guid());
143490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  sql::Statement s_autofill_profiles_bounded(
143590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
143690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          "SELECT date_modified, origin FROM autofill_profiles"));
143790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_bounded.is_valid());
143890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_bounded.Step());
143990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(11, s_autofill_profiles_bounded.ColumnInt64(0));
144090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(std::string(), s_autofill_profiles_bounded.ColumnString(1));
144190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_bounded.Step());
144290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(21, s_autofill_profiles_bounded.ColumnInt64(0));
144390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(std::string(), s_autofill_profiles_bounded.ColumnString(1));
144490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_bounded.Step());
144590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(31, s_autofill_profiles_bounded.ColumnInt64(0));
144690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("Chrome settings", s_autofill_profiles_bounded.ColumnString(1));
144790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  sql::Statement s_credit_cards_bounded(
144890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
144990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          "SELECT date_modified, origin FROM credit_cards"));
145090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_credit_cards_bounded.is_valid());
145190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_credit_cards_bounded.Step());
145290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(17, s_credit_cards_bounded.ColumnInt64(0));
145390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(std::string(), s_credit_cards_bounded.ColumnString(1));
145490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_credit_cards_bounded.Step());
145590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(27, s_credit_cards_bounded.ColumnInt64(0));
145690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("https://www.example.com/",
145790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            s_credit_cards_bounded.ColumnString(1));
145890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_credit_cards_bounded.Step());
145990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(37, s_credit_cards_bounded.ColumnInt64(0));
146090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("Chrome settings", s_credit_cards_bounded.ColumnString(1));
146190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
146290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Remove all origin URLS.
146390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  profiles.clear();
146490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  table_->RemoveOriginURLsModifiedBetween(Time(), Time(), &profiles);
146590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(0UL, profiles.size());
146690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  sql::Statement s_autofill_profiles_all(
146790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
146890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          "SELECT date_modified, origin FROM autofill_profiles"));
146990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_all.is_valid());
147090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_all.Step());
147190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(11, s_autofill_profiles_all.ColumnInt64(0));
147290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(std::string(), s_autofill_profiles_all.ColumnString(1));
147390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_all.Step());
147490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(21, s_autofill_profiles_all.ColumnInt64(0));
147590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(std::string(), s_autofill_profiles_all.ColumnString(1));
147690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_autofill_profiles_all.Step());
147790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(31, s_autofill_profiles_all.ColumnInt64(0));
147890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("Chrome settings", s_autofill_profiles_all.ColumnString(1));
147990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  sql::Statement s_credit_cards_all(
148090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      db_->GetSQLConnection()->GetUniqueStatement(
148190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          "SELECT date_modified, origin FROM credit_cards"));
148290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_credit_cards_all.is_valid());
148390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_credit_cards_all.Step());
148490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(17, s_credit_cards_all.ColumnInt64(0));
148590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(std::string(), s_credit_cards_all.ColumnString(1));
148690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_credit_cards_all.Step());
148790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(27, s_credit_cards_all.ColumnInt64(0));
148890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(std::string(), s_credit_cards_all.ColumnString(1));
148990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(s_credit_cards_all.Step());
149090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(37, s_credit_cards_all.ColumnInt64(0));
149190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("Chrome settings", s_credit_cards_all.ColumnString(1));
149290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
149390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_GetAllAutofillEntries_NoResults) {
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAllAutofillEntries(&entries));
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, entries.size());
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_GetAllAutofillEntries_OneResult) {
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, std::vector<Time> > name_value_times_map;
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  time_t start = 0;
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Time> timestamps1;
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Superman");
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            Time::FromTimeT(start)));
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestamps1.push_back(Time::FromTimeT(start));
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key1("NameSuperman");
15148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  name_value_times_map.insert(
15158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      std::pair<std::string, std::vector<Time> >(key1, timestamps1));
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntrySet expected_entries(CompareAutofillEntries);
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillKey ak1(ASCIIToUTF16("Name"), ASCIIToUTF16("Superman"));
1519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AutofillEntry ae1(ak1, timestamps1.front(), timestamps1.back());
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_entries.insert(ae1);
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAllAutofillEntries(&entries));
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntrySet entry_set(entries.begin(), entries.end(),
15268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                             CompareAutofillEntries);
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  CompareAutofillEntrySets(entry_set, expected_entries);
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_GetAllAutofillEntries_TwoDistinct) {
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, std::vector<Time> > name_value_times_map;
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  time_t start = 0;
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Time> timestamps1;
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FormFieldData field;
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Superman");
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            Time::FromTimeT(start)));
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestamps1.push_back(Time::FromTimeT(start));
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key1("NameSuperman");
15448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  name_value_times_map.insert(
15458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      std::pair<std::string, std::vector<Time> >(key1, timestamps1));
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ++start;
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Time> timestamps2;
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.name = ASCIIToUTF16("Name");
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  field.value = ASCIIToUTF16("Clark Kent");
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            Time::FromTimeT(start)));
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  timestamps2.push_back(Time::FromTimeT(start));
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key2("NameClark Kent");
15558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  name_value_times_map.insert(
15568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      std::pair<std::string, std::vector<Time> >(key2, timestamps2));
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntrySet expected_entries(CompareAutofillEntries);
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillKey ak1(ASCIIToUTF16("Name"), ASCIIToUTF16("Superman"));
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillKey ak2(ASCIIToUTF16("Name"), ASCIIToUTF16("Clark Kent"));
1561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AutofillEntry ae1(ak1, timestamps1.front(), timestamps1.back());
1562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AutofillEntry ae2(ak2, timestamps2.front(), timestamps2.back());
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_entries.insert(ae1);
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_entries.insert(ae2);
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAllAutofillEntries(&entries));
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntrySet entry_set(entries.begin(), entries.end(),
15708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                             CompareAutofillEntries);
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  CompareAutofillEntrySets(entry_set, expected_entries);
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AutofillTableTest, Autofill_GetAllAutofillEntries_TwoSame) {
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<std::string, std::vector<Time> > name_value_times_map;
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Time> timestamps;
15808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  time_t start = 0;
15818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  for (int i = 0; i < 2; ++i, ++start) {
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FormFieldData field;
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.name = ASCIIToUTF16("Name");
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    field.value = ASCIIToUTF16("Superman");
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                              Time::FromTimeT(start)));
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    timestamps.push_back(Time::FromTimeT(start));
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key("NameSuperman");
15918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  name_value_times_map.insert(
15928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      std::pair<std::string, std::vector<Time> >(key, timestamps));
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntrySet expected_entries(CompareAutofillEntries);
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillKey ak1(ASCIIToUTF16("Name"), ASCIIToUTF16("Superman"));
1596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AutofillEntry ae1(ak1, timestamps.front(), timestamps.back());
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_entries.insert(ae1);
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(table_->GetAllAutofillEntries(&entries));
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntrySet entry_set(entries.begin(), entries.end(),
16038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                             CompareAutofillEntries);
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  CompareAutofillEntrySets(entry_set, expected_entries);
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace autofill
1609