Home | History | Annotate | Download | only in webdata
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <vector>
      6 
      7 #include "base/files/file_util.h"
      8 #include "base/files/scoped_temp_dir.h"
      9 #include "base/guid.h"
     10 #include "base/path_service.h"
     11 #include "base/strings/string_number_conversions.h"
     12 #include "base/strings/string_util.h"
     13 #include "base/strings/utf_string_conversions.h"
     14 #include "base/time/time.h"
     15 #include "components/autofill/core/browser/autofill_profile.h"
     16 #include "components/autofill/core/browser/autofill_type.h"
     17 #include "components/autofill/core/browser/credit_card.h"
     18 #include "components/autofill/core/browser/webdata/autofill_change.h"
     19 #include "components/autofill/core/browser/webdata/autofill_entry.h"
     20 #include "components/autofill/core/browser/webdata/autofill_table.h"
     21 #include "components/autofill/core/common/form_field_data.h"
     22 #include "components/os_crypt/os_crypt.h"
     23 #include "components/webdata/common/web_database.h"
     24 #include "sql/statement.h"
     25 #include "testing/gtest/include/gtest/gtest.h"
     26 
     27 using base::ASCIIToUTF16;
     28 using base::Time;
     29 using base::TimeDelta;
     30 
     31 namespace autofill {
     32 
     33 // So we can compare AutofillKeys with EXPECT_EQ().
     34 std::ostream& operator<<(std::ostream& os, const AutofillKey& key) {
     35   return os << base::UTF16ToASCII(key.name()) << ", "
     36             << base::UTF16ToASCII(key.value());
     37 }
     38 
     39 // So we can compare AutofillChanges with EXPECT_EQ().
     40 std::ostream& operator<<(std::ostream& os, const AutofillChange& change) {
     41   switch (change.type()) {
     42     case AutofillChange::ADD: {
     43       os << "ADD";
     44       break;
     45     }
     46     case AutofillChange::UPDATE: {
     47       os << "UPDATE";
     48       break;
     49     }
     50     case AutofillChange::REMOVE: {
     51       os << "REMOVE";
     52       break;
     53     }
     54   }
     55   return os << " " << change.key();
     56 }
     57 
     58 namespace {
     59 
     60 typedef std::set<AutofillEntry,
     61     bool (*)(const AutofillEntry&, const AutofillEntry&)> AutofillEntrySet;
     62 typedef AutofillEntrySet::iterator AutofillEntrySetIterator;
     63 
     64 bool CompareAutofillEntries(const AutofillEntry& a, const AutofillEntry& b) {
     65   int compVal = a.key().name().compare(b.key().name());
     66   if (compVal != 0)
     67     return compVal < 0;
     68 
     69   compVal = a.key().value().compare(b.key().value());
     70   if (compVal != 0)
     71     return compVal < 0;
     72 
     73   if (a.date_created() != b.date_created())
     74     return a.date_created() < b.date_created();
     75 
     76   return a.date_last_used() < b.date_last_used();
     77 }
     78 
     79 AutofillEntry MakeAutofillEntry(const char* name,
     80                                 const char* value,
     81                                 time_t date_created,
     82                                 time_t date_last_used) {
     83   if (date_last_used < 0)
     84     date_last_used = date_created;
     85   return AutofillEntry(AutofillKey(ASCIIToUTF16(name), ASCIIToUTF16(value)),
     86                        Time::FromTimeT(date_created),
     87                        Time::FromTimeT(date_last_used));
     88 }
     89 
     90 // Checks |actual| and |expected| contain the same elements.
     91 void CompareAutofillEntrySets(const AutofillEntrySet& actual,
     92                               const AutofillEntrySet& expected) {
     93   ASSERT_EQ(expected.size(), actual.size());
     94   size_t count = 0;
     95   for (AutofillEntrySet::const_iterator it = actual.begin();
     96        it != actual.end(); ++it) {
     97     count += expected.count(*it);
     98   }
     99   EXPECT_EQ(actual.size(), count);
    100 }
    101 
    102 int GetAutofillEntryCount(const base::string16& name,
    103                           const base::string16& value,
    104                           WebDatabase* db) {
    105   sql::Statement s(db->GetSQLConnection()->GetUniqueStatement(
    106       "SELECT count FROM autofill WHERE name = ? AND value = ?"));
    107   s.BindString16(0, name);
    108   s.BindString16(1, value);
    109   s.Step();
    110   return s.ColumnInt(0);
    111 }
    112 
    113 }  // namespace
    114 
    115 class AutofillTableTest : public testing::Test {
    116  public:
    117   AutofillTableTest() {}
    118   virtual ~AutofillTableTest() {}
    119 
    120  protected:
    121   virtual void SetUp() {
    122 #if defined(OS_MACOSX)
    123     OSCrypt::UseMockKeychain(true);
    124 #endif
    125     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
    126     file_ = temp_dir_.path().AppendASCII("TestWebDatabase");
    127 
    128     table_.reset(new AutofillTable("en-US"));
    129     db_.reset(new WebDatabase);
    130     db_->AddTable(table_.get());
    131     ASSERT_EQ(sql::INIT_OK, db_->Init(file_));
    132   }
    133 
    134   base::FilePath file_;
    135   base::ScopedTempDir temp_dir_;
    136   scoped_ptr<AutofillTable> table_;
    137   scoped_ptr<WebDatabase> db_;
    138 
    139  private:
    140   DISALLOW_COPY_AND_ASSIGN(AutofillTableTest);
    141 };
    142 
    143 TEST_F(AutofillTableTest, Autofill) {
    144   Time t1 = Time::Now();
    145 
    146   // Simulate the submission of a handful of entries in a field called "Name",
    147   // some more often than others.
    148   AutofillChangeList changes;
    149   FormFieldData field;
    150   field.name = ASCIIToUTF16("Name");
    151   field.value = ASCIIToUTF16("Superman");
    152   base::Time now = base::Time::Now();
    153   base::TimeDelta two_seconds = base::TimeDelta::FromSeconds(2);
    154   EXPECT_FALSE(table_->HasFormElements());
    155   EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
    156   EXPECT_TRUE(table_->HasFormElements());
    157   std::vector<base::string16> v;
    158   for (int i = 0; i < 5; ++i) {
    159     field.value = ASCIIToUTF16("Clark Kent");
    160     EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    161                                               now + i * two_seconds));
    162   }
    163   for (int i = 0; i < 3; ++i) {
    164     field.value = ASCIIToUTF16("Clark Sutter");
    165     EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    166                                               now + i * two_seconds));
    167   }
    168   for (int i = 0; i < 2; ++i) {
    169     field.name = ASCIIToUTF16("Favorite Color");
    170     field.value = ASCIIToUTF16("Green");
    171     EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    172                                               now + i * two_seconds));
    173   }
    174 
    175   // We have added the name Clark Kent 5 times, so count should be 5.
    176   EXPECT_EQ(5, GetAutofillEntryCount(ASCIIToUTF16("Name"),
    177                                      ASCIIToUTF16("Clark Kent"), db_.get()));
    178 
    179   // Storing in the data base should be case sensitive, so there should be no
    180   // database entry for clark kent lowercase.
    181   EXPECT_EQ(0, GetAutofillEntryCount(ASCIIToUTF16("Name"),
    182                                      ASCIIToUTF16("clark kent"), db_.get()));
    183 
    184   EXPECT_EQ(2, GetAutofillEntryCount(ASCIIToUTF16("Favorite Color"),
    185                                      ASCIIToUTF16("Green"), db_.get()));
    186 
    187   // This is meant to get a list of suggestions for Name.  The empty prefix
    188   // in the second argument means it should return all suggestions for a name
    189   // no matter what they start with.  The order that the names occur in the list
    190   // should be decreasing order by count.
    191   EXPECT_TRUE(table_->GetFormValuesForElementName(
    192       ASCIIToUTF16("Name"), base::string16(), &v, 6));
    193   EXPECT_EQ(3U, v.size());
    194   if (v.size() == 3) {
    195     EXPECT_EQ(ASCIIToUTF16("Clark Kent"), v[0]);
    196     EXPECT_EQ(ASCIIToUTF16("Clark Sutter"), v[1]);
    197     EXPECT_EQ(ASCIIToUTF16("Superman"), v[2]);
    198   }
    199 
    200   // If we query again limiting the list size to 1, we should only get the most
    201   // frequent entry.
    202   EXPECT_TRUE(table_->GetFormValuesForElementName(
    203       ASCIIToUTF16("Name"), base::string16(), &v, 1));
    204   EXPECT_EQ(1U, v.size());
    205   if (v.size() == 1) {
    206     EXPECT_EQ(ASCIIToUTF16("Clark Kent"), v[0]);
    207   }
    208 
    209   // Querying for suggestions given a prefix is case-insensitive, so the prefix
    210   // "cLa" shoud get suggestions for both Clarks.
    211   EXPECT_TRUE(table_->GetFormValuesForElementName(
    212       ASCIIToUTF16("Name"), ASCIIToUTF16("cLa"), &v, 6));
    213   EXPECT_EQ(2U, v.size());
    214   if (v.size() == 2) {
    215     EXPECT_EQ(ASCIIToUTF16("Clark Kent"), v[0]);
    216     EXPECT_EQ(ASCIIToUTF16("Clark Sutter"), v[1]);
    217   }
    218 
    219   // Removing all elements since the beginning of this function should remove
    220   // everything from the database.
    221   changes.clear();
    222   EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(t1, Time(), &changes));
    223 
    224   const AutofillChange kExpectedChanges[] = {
    225     AutofillChange(AutofillChange::REMOVE,
    226                    AutofillKey(ASCIIToUTF16("Name"),
    227                                ASCIIToUTF16("Superman"))),
    228     AutofillChange(AutofillChange::REMOVE,
    229                    AutofillKey(ASCIIToUTF16("Name"),
    230                                ASCIIToUTF16("Clark Kent"))),
    231     AutofillChange(AutofillChange::REMOVE,
    232                    AutofillKey(ASCIIToUTF16("Name"),
    233                                ASCIIToUTF16("Clark Sutter"))),
    234     AutofillChange(AutofillChange::REMOVE,
    235                    AutofillKey(ASCIIToUTF16("Favorite Color"),
    236                                ASCIIToUTF16("Green"))),
    237   };
    238   EXPECT_EQ(arraysize(kExpectedChanges), changes.size());
    239   for (size_t i = 0; i < arraysize(kExpectedChanges); ++i) {
    240     EXPECT_EQ(kExpectedChanges[i], changes[i]);
    241   }
    242 
    243   EXPECT_EQ(0, GetAutofillEntryCount(ASCIIToUTF16("Name"),
    244                                      ASCIIToUTF16("Clark Kent"), db_.get()));
    245 
    246   EXPECT_TRUE(table_->GetFormValuesForElementName(
    247       ASCIIToUTF16("Name"), base::string16(), &v, 6));
    248   EXPECT_EQ(0U, v.size());
    249 
    250   // Now add some values with empty strings.
    251   const base::string16 kValue = ASCIIToUTF16("  toto   ");
    252   field.name = ASCIIToUTF16("blank");
    253   field.value = base::string16();
    254   EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
    255   field.name = ASCIIToUTF16("blank");
    256   field.value = ASCIIToUTF16(" ");
    257   EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
    258   field.name = ASCIIToUTF16("blank");
    259   field.value = ASCIIToUTF16("      ");
    260   EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
    261   field.name = ASCIIToUTF16("blank");
    262   field.value = kValue;
    263   EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
    264 
    265   // They should be stored normally as the DB layer does not check for empty
    266   // values.
    267   v.clear();
    268   EXPECT_TRUE(table_->GetFormValuesForElementName(
    269       ASCIIToUTF16("blank"), base::string16(), &v, 10));
    270   EXPECT_EQ(4U, v.size());
    271 }
    272 
    273 TEST_F(AutofillTableTest, Autofill_RemoveBetweenChanges) {
    274   TimeDelta one_day(TimeDelta::FromDays(1));
    275   Time t1 = Time::Now();
    276   Time t2 = t1 + one_day;
    277 
    278   AutofillChangeList changes;
    279   FormFieldData field;
    280   field.name = ASCIIToUTF16("Name");
    281   field.value = ASCIIToUTF16("Superman");
    282   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes, t1));
    283   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes, t2));
    284 
    285   changes.clear();
    286   EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(t1, t2, &changes));
    287   ASSERT_EQ(1U, changes.size());
    288   EXPECT_EQ(AutofillChange(AutofillChange::UPDATE,
    289                            AutofillKey(ASCIIToUTF16("Name"),
    290                                        ASCIIToUTF16("Superman"))),
    291             changes[0]);
    292   changes.clear();
    293 
    294   EXPECT_TRUE(
    295       table_->RemoveFormElementsAddedBetween(t2, t2 + one_day, &changes));
    296   ASSERT_EQ(1U, changes.size());
    297   EXPECT_EQ(AutofillChange(AutofillChange::REMOVE,
    298                            AutofillKey(ASCIIToUTF16("Name"),
    299                                        ASCIIToUTF16("Superman"))),
    300             changes[0]);
    301 }
    302 
    303 TEST_F(AutofillTableTest, Autofill_AddChanges) {
    304   TimeDelta one_day(TimeDelta::FromDays(1));
    305   Time t1 = Time::Now();
    306   Time t2 = t1 + one_day;
    307 
    308   AutofillChangeList changes;
    309   FormFieldData field;
    310   field.name = ASCIIToUTF16("Name");
    311   field.value = ASCIIToUTF16("Superman");
    312   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes, t1));
    313   ASSERT_EQ(1U, changes.size());
    314   EXPECT_EQ(AutofillChange(AutofillChange::ADD,
    315                            AutofillKey(ASCIIToUTF16("Name"),
    316                                        ASCIIToUTF16("Superman"))),
    317             changes[0]);
    318 
    319   changes.clear();
    320   EXPECT_TRUE(
    321       table_->AddFormFieldValueTime(field, &changes, t2));
    322   ASSERT_EQ(1U, changes.size());
    323   EXPECT_EQ(AutofillChange(AutofillChange::UPDATE,
    324                            AutofillKey(ASCIIToUTF16("Name"),
    325                                        ASCIIToUTF16("Superman"))),
    326             changes[0]);
    327 }
    328 
    329 TEST_F(AutofillTableTest, Autofill_UpdateOneWithOneTimestamp) {
    330   AutofillEntry entry(MakeAutofillEntry("foo", "bar", 1, -1));
    331   std::vector<AutofillEntry> entries;
    332   entries.push_back(entry);
    333   ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
    334 
    335   EXPECT_EQ(1, GetAutofillEntryCount(ASCIIToUTF16("foo"), ASCIIToUTF16("bar"),
    336                                      db_.get()));
    337 
    338   std::vector<AutofillEntry> all_entries;
    339   ASSERT_TRUE(table_->GetAllAutofillEntries(&all_entries));
    340   ASSERT_EQ(1U, all_entries.size());
    341   EXPECT_EQ(entry, all_entries[0]);
    342 }
    343 
    344 TEST_F(AutofillTableTest, Autofill_UpdateOneWithTwoTimestamps) {
    345   AutofillEntry entry(MakeAutofillEntry("foo", "bar", 1, 2));
    346   std::vector<AutofillEntry> entries;
    347   entries.push_back(entry);
    348   ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
    349 
    350   EXPECT_EQ(2, GetAutofillEntryCount(ASCIIToUTF16("foo"), ASCIIToUTF16("bar"),
    351                                      db_.get()));
    352 
    353   std::vector<AutofillEntry> all_entries;
    354   ASSERT_TRUE(table_->GetAllAutofillEntries(&all_entries));
    355   ASSERT_EQ(1U, all_entries.size());
    356   EXPECT_EQ(entry, all_entries[0]);
    357 }
    358 
    359 TEST_F(AutofillTableTest, Autofill_GetAutofillTimestamps) {
    360   AutofillEntry entry(MakeAutofillEntry("foo", "bar", 1, 2));
    361   std::vector<AutofillEntry> entries;
    362   entries.push_back(entry);
    363   ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
    364 
    365   Time date_created, date_last_used;
    366   ASSERT_TRUE(table_->GetAutofillTimestamps(ASCIIToUTF16("foo"),
    367                                             ASCIIToUTF16("bar"),
    368                                             &date_created,
    369                                             &date_last_used));
    370   EXPECT_EQ(Time::FromTimeT(1), date_created);
    371   EXPECT_EQ(Time::FromTimeT(2), date_last_used);
    372 }
    373 
    374 TEST_F(AutofillTableTest, Autofill_UpdateTwo) {
    375   AutofillEntry entry0(MakeAutofillEntry("foo", "bar0", 1, -1));
    376   AutofillEntry entry1(MakeAutofillEntry("foo", "bar1", 2, 3));
    377   std::vector<AutofillEntry> entries;
    378   entries.push_back(entry0);
    379   entries.push_back(entry1);
    380   ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
    381 
    382   EXPECT_EQ(1, GetAutofillEntryCount(ASCIIToUTF16("foo"), ASCIIToUTF16("bar0"),
    383                                      db_.get()));
    384   EXPECT_EQ(2, GetAutofillEntryCount(ASCIIToUTF16("foo"), ASCIIToUTF16("bar1"),
    385                                      db_.get()));
    386 }
    387 
    388 TEST_F(AutofillTableTest, Autofill_UpdateReplace) {
    389   AutofillChangeList changes;
    390   // Add a form field.  This will be replaced.
    391   FormFieldData field;
    392   field.name = ASCIIToUTF16("Name");
    393   field.value = ASCIIToUTF16("Superman");
    394   EXPECT_TRUE(table_->AddFormFieldValue(field, &changes));
    395 
    396   AutofillEntry entry(MakeAutofillEntry("Name", "Superman", 1, 2));
    397   std::vector<AutofillEntry> entries;
    398   entries.push_back(entry);
    399   ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
    400 
    401   std::vector<AutofillEntry> all_entries;
    402   ASSERT_TRUE(table_->GetAllAutofillEntries(&all_entries));
    403   ASSERT_EQ(1U, all_entries.size());
    404   EXPECT_EQ(entry, all_entries[0]);
    405 }
    406 
    407 TEST_F(AutofillTableTest, Autofill_UpdateDontReplace) {
    408   Time t = Time::Now();
    409   AutofillEntry existing(
    410       MakeAutofillEntry("Name", "Superman", t.ToTimeT(), -1));
    411 
    412   AutofillChangeList changes;
    413   // Add a form field.  This will NOT be replaced.
    414   FormFieldData field;
    415   field.name = existing.key().name();
    416   field.value = existing.key().value();
    417   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes, t));
    418   AutofillEntry entry(MakeAutofillEntry("Name", "Clark Kent", 1, 2));
    419   std::vector<AutofillEntry> entries;
    420   entries.push_back(entry);
    421   ASSERT_TRUE(table_->UpdateAutofillEntries(entries));
    422 
    423   std::vector<AutofillEntry> all_entries;
    424   ASSERT_TRUE(table_->GetAllAutofillEntries(&all_entries));
    425   ASSERT_EQ(2U, all_entries.size());
    426   AutofillEntrySet expected_entries(all_entries.begin(),
    427                                     all_entries.end(),
    428                                     CompareAutofillEntries);
    429   EXPECT_EQ(1U, expected_entries.count(existing));
    430   EXPECT_EQ(1U, expected_entries.count(entry));
    431 }
    432 
    433 TEST_F(AutofillTableTest, Autofill_AddFormFieldValues) {
    434   Time t = Time::Now();
    435 
    436   // Add multiple values for "firstname" and "lastname" names.  Test that only
    437   // first value of each gets added. Related to security issue:
    438   // http://crbug.com/51727.
    439   std::vector<FormFieldData> elements;
    440   FormFieldData field;
    441   field.name = ASCIIToUTF16("firstname");
    442   field.value = ASCIIToUTF16("Joe");
    443   elements.push_back(field);
    444 
    445   field.name = ASCIIToUTF16("firstname");
    446   field.value = ASCIIToUTF16("Jane");
    447   elements.push_back(field);
    448 
    449   field.name = ASCIIToUTF16("lastname");
    450   field.value = ASCIIToUTF16("Smith");
    451   elements.push_back(field);
    452 
    453   field.name = ASCIIToUTF16("lastname");
    454   field.value = ASCIIToUTF16("Jones");
    455   elements.push_back(field);
    456 
    457   std::vector<AutofillChange> changes;
    458   table_->AddFormFieldValuesTime(elements, &changes, t);
    459 
    460   ASSERT_EQ(2U, changes.size());
    461   EXPECT_EQ(changes[0], AutofillChange(AutofillChange::ADD,
    462                                        AutofillKey(ASCIIToUTF16("firstname"),
    463                                        ASCIIToUTF16("Joe"))));
    464   EXPECT_EQ(changes[1], AutofillChange(AutofillChange::ADD,
    465                                        AutofillKey(ASCIIToUTF16("lastname"),
    466                                        ASCIIToUTF16("Smith"))));
    467 
    468   std::vector<AutofillEntry> all_entries;
    469   ASSERT_TRUE(table_->GetAllAutofillEntries(&all_entries));
    470   ASSERT_EQ(2U, all_entries.size());
    471 }
    472 
    473 TEST_F(AutofillTableTest,
    474        Autofill_RemoveFormElementsAddedBetween_UsedOnlyBefore) {
    475   // Add an entry used only before the targetted range.
    476   AutofillChangeList changes;
    477   FormFieldData field;
    478   field.name = ASCIIToUTF16("Name");
    479   field.value = ASCIIToUTF16("Superman");
    480   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    481                                             base::Time::FromTimeT(10)));
    482   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    483                                             base::Time::FromTimeT(20)));
    484   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    485                                             base::Time::FromTimeT(30)));
    486   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    487                                             base::Time::FromTimeT(40)));
    488   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    489                                             base::Time::FromTimeT(50)));
    490 
    491   EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
    492 
    493   changes.clear();
    494   EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(base::Time::FromTimeT(51),
    495                                                      base::Time::FromTimeT(60),
    496                                                      &changes));
    497   EXPECT_TRUE(changes.empty());
    498   EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
    499 }
    500 
    501 TEST_F(AutofillTableTest,
    502        Autofill_RemoveFormElementsAddedBetween_UsedOnlyAfter) {
    503   // Add an entry used only after the targetted range.
    504   AutofillChangeList changes;
    505   FormFieldData field;
    506   field.name = ASCIIToUTF16("Name");
    507   field.value = ASCIIToUTF16("Superman");
    508   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    509                                             base::Time::FromTimeT(50)));
    510   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    511                                             base::Time::FromTimeT(60)));
    512   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    513                                             base::Time::FromTimeT(70)));
    514   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    515                                             base::Time::FromTimeT(80)));
    516   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    517                                             base::Time::FromTimeT(90)));
    518 
    519   EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
    520 
    521   changes.clear();
    522   EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(base::Time::FromTimeT(40),
    523                                                      base::Time::FromTimeT(50),
    524                                                      &changes));
    525   EXPECT_TRUE(changes.empty());
    526   EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
    527 }
    528 
    529 TEST_F(AutofillTableTest,
    530        Autofill_RemoveFormElementsAddedBetween_UsedOnlyDuring) {
    531   // Add an entry used entirely during the targetted range.
    532   AutofillChangeList changes;
    533   FormFieldData field;
    534   field.name = ASCIIToUTF16("Name");
    535   field.value = ASCIIToUTF16("Superman");
    536   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    537                                             base::Time::FromTimeT(10)));
    538   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    539                                             base::Time::FromTimeT(20)));
    540   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    541                                             base::Time::FromTimeT(30)));
    542   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    543                                             base::Time::FromTimeT(40)));
    544   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    545                                             base::Time::FromTimeT(50)));
    546 
    547   EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
    548 
    549   changes.clear();
    550   EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(base::Time::FromTimeT(10),
    551                                                      base::Time::FromTimeT(51),
    552                                                      &changes));
    553   ASSERT_EQ(1U, changes.size());
    554   EXPECT_EQ(AutofillChange(AutofillChange::REMOVE,
    555                            AutofillKey(field.name, field.value)),
    556             changes[0]);
    557   EXPECT_EQ(0, GetAutofillEntryCount(field.name, field.value, db_.get()));
    558 }
    559 
    560 TEST_F(AutofillTableTest,
    561        Autofill_RemoveFormElementsAddedBetween_UsedBeforeAndDuring) {
    562   // Add an entry used both before and during the targetted range.
    563   AutofillChangeList changes;
    564   FormFieldData field;
    565   field.name = ASCIIToUTF16("Name");
    566   field.value = ASCIIToUTF16("Superman");
    567   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    568                                             base::Time::FromTimeT(10)));
    569   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    570                                             base::Time::FromTimeT(20)));
    571   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    572                                             base::Time::FromTimeT(30)));
    573   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    574                                             base::Time::FromTimeT(40)));
    575   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    576                                             base::Time::FromTimeT(50)));
    577 
    578   EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
    579 
    580   changes.clear();
    581   EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(base::Time::FromTimeT(40),
    582                                                      base::Time::FromTimeT(60),
    583                                                      &changes));
    584   ASSERT_EQ(1U, changes.size());
    585   EXPECT_EQ(AutofillChange(AutofillChange::UPDATE,
    586                            AutofillKey(field.name, field.value)),
    587             changes[0]);
    588   EXPECT_EQ(4, GetAutofillEntryCount(field.name, field.value, db_.get()));
    589   base::Time date_created, date_last_used;
    590   EXPECT_TRUE(
    591       table_->GetAutofillTimestamps(field.name, field.value,
    592                                     &date_created, &date_last_used));
    593   EXPECT_EQ(base::Time::FromTimeT(10), date_created);
    594   EXPECT_EQ(base::Time::FromTimeT(39), date_last_used);
    595 }
    596 
    597 TEST_F(AutofillTableTest,
    598        Autofill_RemoveFormElementsAddedBetween_UsedDuringAndAfter) {
    599   // Add an entry used both during and after the targetted range.
    600   AutofillChangeList changes;
    601   FormFieldData field;
    602   field.name = ASCIIToUTF16("Name");
    603   field.value = ASCIIToUTF16("Superman");
    604   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    605                                             base::Time::FromTimeT(50)));
    606   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    607                                             base::Time::FromTimeT(60)));
    608   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    609                                             base::Time::FromTimeT(70)));
    610   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    611                                             base::Time::FromTimeT(80)));
    612   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
    613                                             base::Time::FromTimeT(90)));
    614 
    615   EXPECT_EQ(5, GetAutofillEntryCount(field.name, field.value, db_.get()));
    616 
    617   changes.clear();
    618   EXPECT_TRUE(table_->RemoveFormElementsAddedBetween(base::Time::FromTimeT(40),
    619                                                      base::Time::FromTimeT(80),
    620                                                      &changes));
    621   ASSERT_EQ(1U, changes.size());
    622   EXPECT_EQ(AutofillChange(AutofillChange::UPDATE,
    623                            AutofillKey(field.name, field.value)),
    624             changes[0]);
    625   EXPECT_EQ(2, GetAutofillEntryCount(field.name, field.value, db_.get()));
    626   base::Time date_created, date_last_used;
    627   EXPECT_TRUE(
    628       table_->GetAutofillTimestamps(field.name, field.value,
    629                                     &date_created, &date_last_used));
    630   EXPECT_EQ(base::Time::FromTimeT(80), date_created);
    631   EXPECT_EQ(base::Time::FromTimeT(90), date_last_used);
    632 }
    633 
    634 TEST_F(AutofillTableTest, AutofillProfile) {
    635   // Add a 'Home' profile.
    636   AutofillProfile home_profile;
    637   home_profile.set_origin(std::string());
    638   home_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John"));
    639   home_profile.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Q."));
    640   home_profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
    641   home_profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("js (at) smith.xyz"));
    642   home_profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Google"));
    643   home_profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1234 Apple Way"));
    644   home_profile.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("unit 5"));
    645   home_profile.SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY,
    646                           ASCIIToUTF16("Beverly Hills"));
    647   home_profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("Los Angeles"));
    648   home_profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
    649   home_profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90025"));
    650   home_profile.SetRawInfo(ADDRESS_HOME_SORTING_CODE, ASCIIToUTF16("MAGIC ###"));
    651   home_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
    652   home_profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("18181234567"));
    653   home_profile.set_language_code("en");
    654 
    655   Time pre_creation_time = Time::Now();
    656   EXPECT_TRUE(table_->AddAutofillProfile(home_profile));
    657   Time post_creation_time = Time::Now();
    658 
    659   // Get the 'Home' profile.
    660   AutofillProfile* db_profile;
    661   ASSERT_TRUE(table_->GetAutofillProfile(home_profile.guid(), &db_profile));
    662   EXPECT_EQ(home_profile, *db_profile);
    663   sql::Statement s_home(db_->GetSQLConnection()->GetUniqueStatement(
    664       "SELECT date_modified "
    665       "FROM autofill_profiles WHERE guid=?"));
    666   s_home.BindString(0, home_profile.guid());
    667   ASSERT_TRUE(s_home.is_valid());
    668   ASSERT_TRUE(s_home.Step());
    669   EXPECT_GE(s_home.ColumnInt64(0), pre_creation_time.ToTimeT());
    670   EXPECT_LE(s_home.ColumnInt64(0), post_creation_time.ToTimeT());
    671   EXPECT_FALSE(s_home.Step());
    672   delete db_profile;
    673 
    674   // Add a 'Billing' profile.
    675   AutofillProfile billing_profile = home_profile;
    676   billing_profile.set_guid(base::GenerateGUID());
    677   billing_profile.set_origin("https://www.example.com/");
    678   billing_profile.SetRawInfo(ADDRESS_HOME_LINE1,
    679                              ASCIIToUTF16("5678 Bottom Street"));
    680   billing_profile.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("suite 3"));
    681 
    682   pre_creation_time = Time::Now();
    683   EXPECT_TRUE(table_->AddAutofillProfile(billing_profile));
    684   post_creation_time = Time::Now();
    685 
    686   // Get the 'Billing' profile.
    687   ASSERT_TRUE(table_->GetAutofillProfile(billing_profile.guid(), &db_profile));
    688   EXPECT_EQ(billing_profile, *db_profile);
    689   sql::Statement s_billing(db_->GetSQLConnection()->GetUniqueStatement(
    690       "SELECT date_modified FROM autofill_profiles WHERE guid=?"));
    691   s_billing.BindString(0, billing_profile.guid());
    692   ASSERT_TRUE(s_billing.is_valid());
    693   ASSERT_TRUE(s_billing.Step());
    694   EXPECT_GE(s_billing.ColumnInt64(0), pre_creation_time.ToTimeT());
    695   EXPECT_LE(s_billing.ColumnInt64(0), post_creation_time.ToTimeT());
    696   EXPECT_FALSE(s_billing.Step());
    697   delete db_profile;
    698 
    699   // Update the 'Billing' profile, name only.
    700   billing_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Jane"));
    701   Time pre_modification_time = Time::Now();
    702   EXPECT_TRUE(table_->UpdateAutofillProfile(billing_profile));
    703   Time post_modification_time = Time::Now();
    704   ASSERT_TRUE(table_->GetAutofillProfile(billing_profile.guid(), &db_profile));
    705   EXPECT_EQ(billing_profile, *db_profile);
    706   sql::Statement s_billing_updated(db_->GetSQLConnection()->GetUniqueStatement(
    707       "SELECT date_modified FROM autofill_profiles WHERE guid=?"));
    708   s_billing_updated.BindString(0, billing_profile.guid());
    709   ASSERT_TRUE(s_billing_updated.is_valid());
    710   ASSERT_TRUE(s_billing_updated.Step());
    711   EXPECT_GE(s_billing_updated.ColumnInt64(0),
    712             pre_modification_time.ToTimeT());
    713   EXPECT_LE(s_billing_updated.ColumnInt64(0),
    714             post_modification_time.ToTimeT());
    715   EXPECT_FALSE(s_billing_updated.Step());
    716   delete db_profile;
    717 
    718   // Update the 'Billing' profile.
    719   billing_profile.set_origin("Chrome settings");
    720   billing_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Janice"));
    721   billing_profile.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("C."));
    722   billing_profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Joplin"));
    723   billing_profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("jane (at) singer.com"));
    724   billing_profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Indy"));
    725   billing_profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("Open Road"));
    726   billing_profile.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("Route 66"));
    727   billing_profile.SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY,
    728                              ASCIIToUTF16("District 9"));
    729   billing_profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("NFA"));
    730   billing_profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("NY"));
    731   billing_profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("10011"));
    732   billing_profile.SetRawInfo(ADDRESS_HOME_SORTING_CODE, ASCIIToUTF16("123456"));
    733   billing_profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
    734   billing_profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER,
    735                              ASCIIToUTF16("18181230000"));
    736   Time pre_modification_time_2 = Time::Now();
    737   EXPECT_TRUE(table_->UpdateAutofillProfile(billing_profile));
    738   Time post_modification_time_2 = Time::Now();
    739   ASSERT_TRUE(table_->GetAutofillProfile(billing_profile.guid(), &db_profile));
    740   EXPECT_EQ(billing_profile, *db_profile);
    741   sql::Statement s_billing_updated_2(
    742       db_->GetSQLConnection()->GetUniqueStatement(
    743           "SELECT date_modified FROM autofill_profiles WHERE guid=?"));
    744   s_billing_updated_2.BindString(0, billing_profile.guid());
    745   ASSERT_TRUE(s_billing_updated_2.is_valid());
    746   ASSERT_TRUE(s_billing_updated_2.Step());
    747   EXPECT_GE(s_billing_updated_2.ColumnInt64(0),
    748             pre_modification_time_2.ToTimeT());
    749   EXPECT_LE(s_billing_updated_2.ColumnInt64(0),
    750             post_modification_time_2.ToTimeT());
    751   EXPECT_FALSE(s_billing_updated_2.Step());
    752   delete db_profile;
    753 
    754   // Remove the 'Billing' profile.
    755   EXPECT_TRUE(table_->RemoveAutofillProfile(billing_profile.guid()));
    756   EXPECT_FALSE(table_->GetAutofillProfile(billing_profile.guid(), &db_profile));
    757 }
    758 
    759 TEST_F(AutofillTableTest, AutofillProfileMultiValueNames) {
    760   AutofillProfile p;
    761   const base::string16 kJohnDoe(ASCIIToUTF16("John Doe"));
    762   const base::string16 kJohnPDoe(ASCIIToUTF16("John P. Doe"));
    763   std::vector<base::string16> set_values;
    764   set_values.push_back(kJohnDoe);
    765   set_values.push_back(kJohnPDoe);
    766   p.SetRawMultiInfo(NAME_FULL, set_values);
    767 
    768   EXPECT_TRUE(table_->AddAutofillProfile(p));
    769 
    770   AutofillProfile* db_profile;
    771   ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
    772   EXPECT_EQ(p, *db_profile);
    773   EXPECT_EQ(0, p.Compare(*db_profile));
    774   delete db_profile;
    775 
    776   // Update the values.
    777   const base::string16 kNoOne(ASCIIToUTF16("No One"));
    778   set_values[1] = kNoOne;
    779   p.SetRawMultiInfo(NAME_FULL, set_values);
    780   EXPECT_TRUE(table_->UpdateAutofillProfile(p));
    781   ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
    782   EXPECT_EQ(p, *db_profile);
    783   EXPECT_EQ(0, p.Compare(*db_profile));
    784   delete db_profile;
    785 
    786   // Delete values.
    787   set_values.clear();
    788   p.SetRawMultiInfo(NAME_FULL, set_values);
    789   EXPECT_TRUE(table_->UpdateAutofillProfile(p));
    790   ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
    791   EXPECT_EQ(p, *db_profile);
    792   EXPECT_EQ(0, p.Compare(*db_profile));
    793   EXPECT_EQ(base::string16(), db_profile->GetRawInfo(NAME_FULL));
    794   delete db_profile;
    795 }
    796 
    797 TEST_F(AutofillTableTest, AutofillProfileMultiValueEmails) {
    798   AutofillProfile p;
    799   const base::string16 kJohnDoe(ASCIIToUTF16("john (at) doe.com"));
    800   const base::string16 kJohnPDoe(ASCIIToUTF16("john_p (at) doe.com"));
    801   std::vector<base::string16> set_values;
    802   set_values.push_back(kJohnDoe);
    803   set_values.push_back(kJohnPDoe);
    804   p.SetRawMultiInfo(EMAIL_ADDRESS, set_values);
    805 
    806   EXPECT_TRUE(table_->AddAutofillProfile(p));
    807 
    808   AutofillProfile* db_profile;
    809   ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
    810   EXPECT_EQ(p, *db_profile);
    811   EXPECT_EQ(0, p.Compare(*db_profile));
    812   delete db_profile;
    813 
    814   // Update the values.
    815   const base::string16 kNoOne(ASCIIToUTF16("no (at) one.com"));
    816   set_values[1] = kNoOne;
    817   p.SetRawMultiInfo(EMAIL_ADDRESS, set_values);
    818   EXPECT_TRUE(table_->UpdateAutofillProfile(p));
    819   ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
    820   EXPECT_EQ(p, *db_profile);
    821   EXPECT_EQ(0, p.Compare(*db_profile));
    822   delete db_profile;
    823 
    824   // Delete values.
    825   set_values.clear();
    826   p.SetRawMultiInfo(EMAIL_ADDRESS, set_values);
    827   EXPECT_TRUE(table_->UpdateAutofillProfile(p));
    828   ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
    829   EXPECT_EQ(p, *db_profile);
    830   EXPECT_EQ(0, p.Compare(*db_profile));
    831   EXPECT_EQ(base::string16(), db_profile->GetRawInfo(EMAIL_ADDRESS));
    832   delete db_profile;
    833 }
    834 
    835 TEST_F(AutofillTableTest, AutofillProfileMultiValuePhone) {
    836   AutofillProfile p;
    837   const base::string16 kJohnDoe(ASCIIToUTF16("4151112222"));
    838   const base::string16 kJohnPDoe(ASCIIToUTF16("4151113333"));
    839   std::vector<base::string16> set_values;
    840   set_values.push_back(kJohnDoe);
    841   set_values.push_back(kJohnPDoe);
    842   p.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values);
    843 
    844   EXPECT_TRUE(table_->AddAutofillProfile(p));
    845 
    846   AutofillProfile* db_profile;
    847   ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
    848   EXPECT_EQ(p, *db_profile);
    849   EXPECT_EQ(0, p.Compare(*db_profile));
    850   delete db_profile;
    851 
    852   // Update the values.
    853   const base::string16 kNoOne(ASCIIToUTF16("4151110000"));
    854   set_values[1] = kNoOne;
    855   p.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values);
    856   EXPECT_TRUE(table_->UpdateAutofillProfile(p));
    857   ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
    858   EXPECT_EQ(p, *db_profile);
    859   EXPECT_EQ(0, p.Compare(*db_profile));
    860   delete db_profile;
    861 
    862   // Delete values.
    863   set_values.clear();
    864   p.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values);
    865   EXPECT_TRUE(table_->UpdateAutofillProfile(p));
    866   ASSERT_TRUE(table_->GetAutofillProfile(p.guid(), &db_profile));
    867   EXPECT_EQ(p, *db_profile);
    868   EXPECT_EQ(0, p.Compare(*db_profile));
    869   EXPECT_EQ(base::string16(), db_profile->GetRawInfo(EMAIL_ADDRESS));
    870   delete db_profile;
    871 }
    872 
    873 TEST_F(AutofillTableTest, AutofillProfileTrash) {
    874   std::vector<std::string> guids;
    875   table_->GetAutofillProfilesInTrash(&guids);
    876   EXPECT_TRUE(guids.empty());
    877 
    878   ASSERT_TRUE(table_->AddAutofillGUIDToTrash(
    879       "00000000-0000-0000-0000-000000000000"));
    880   ASSERT_TRUE(table_->AddAutofillGUIDToTrash(
    881       "00000000-0000-0000-0000-000000000001"));
    882   ASSERT_TRUE(table_->GetAutofillProfilesInTrash(&guids));
    883   EXPECT_EQ(2UL, guids.size());
    884   EXPECT_EQ("00000000-0000-0000-0000-000000000000", guids[0]);
    885   EXPECT_EQ("00000000-0000-0000-0000-000000000001", guids[1]);
    886 
    887   ASSERT_TRUE(table_->EmptyAutofillProfilesTrash());
    888   ASSERT_TRUE(table_->GetAutofillProfilesInTrash(&guids));
    889   EXPECT_TRUE(guids.empty());
    890 }
    891 
    892 TEST_F(AutofillTableTest, AutofillProfileTrashInteraction) {
    893   std::vector<std::string> guids;
    894   table_->GetAutofillProfilesInTrash(&guids);
    895   EXPECT_TRUE(guids.empty());
    896 
    897   AutofillProfile profile;
    898   profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John"));
    899   profile.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Q."));
    900   profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
    901   profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("js (at) smith.xyz"));
    902   profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1 Main St"));
    903   profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("Los Angeles"));
    904   profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
    905   profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90025"));
    906   profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
    907 
    908   // Mark this profile as in the trash.  This stops |AddAutofillProfile| from
    909   // adding it.
    910   EXPECT_TRUE(table_->AddAutofillGUIDToTrash(profile.guid()));
    911   EXPECT_TRUE(table_->AddAutofillProfile(profile));
    912   AutofillProfile* added_profile = NULL;
    913   EXPECT_FALSE(table_->GetAutofillProfile(profile.guid(), &added_profile));
    914   EXPECT_EQ(static_cast<AutofillProfile*>(NULL), added_profile);
    915 
    916   // Add the profile for real this time.
    917   EXPECT_TRUE(table_->EmptyAutofillProfilesTrash());
    918   EXPECT_TRUE(table_->GetAutofillProfilesInTrash(&guids));
    919   EXPECT_TRUE(guids.empty());
    920   EXPECT_TRUE(table_->AddAutofillProfile(profile));
    921   EXPECT_TRUE(table_->GetAutofillProfile(profile.guid(),
    922                                                         &added_profile));
    923   ASSERT_NE(static_cast<AutofillProfile*>(NULL), added_profile);
    924   delete added_profile;
    925 
    926   // Mark this profile as in the trash.  This stops |UpdateAutofillProfileMulti|
    927   // from updating it.  In normal operation a profile should not be both in the
    928   // trash and in the profiles table simultaneously.
    929   EXPECT_TRUE(table_->AddAutofillGUIDToTrash(profile.guid()));
    930   profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Jane"));
    931   EXPECT_TRUE(table_->UpdateAutofillProfile(profile));
    932   AutofillProfile* updated_profile = NULL;
    933   EXPECT_TRUE(table_->GetAutofillProfile(profile.guid(), &updated_profile));
    934   ASSERT_NE(static_cast<AutofillProfile*>(NULL), added_profile);
    935   EXPECT_EQ(ASCIIToUTF16("John"), updated_profile->GetRawInfo(NAME_FIRST));
    936   delete updated_profile;
    937 
    938   // Try to delete the trashed profile.  This stops |RemoveAutofillProfile| from
    939   // deleting it.  In normal operation deletion is done by migration step, and
    940   // removal from trash is done by |WebDataService|.  |RemoveAutofillProfile|
    941   // does remove the item from the trash if it is found however, so that if
    942   // other clients remove it (via Sync say) then it is gone and doesn't need to
    943   // be processed further by |WebDataService|.
    944   EXPECT_TRUE(table_->RemoveAutofillProfile(profile.guid()));
    945   AutofillProfile* removed_profile = NULL;
    946   EXPECT_TRUE(table_->GetAutofillProfile(profile.guid(), &removed_profile));
    947   EXPECT_FALSE(table_->IsAutofillGUIDInTrash(profile.guid()));
    948   ASSERT_NE(static_cast<AutofillProfile*>(NULL), removed_profile);
    949   delete removed_profile;
    950 
    951   // Check that emptying the trash now allows removal to occur.
    952   EXPECT_TRUE(table_->EmptyAutofillProfilesTrash());
    953   EXPECT_TRUE(table_->RemoveAutofillProfile(profile.guid()));
    954   removed_profile = NULL;
    955   EXPECT_FALSE(table_->GetAutofillProfile(profile.guid(), &removed_profile));
    956   EXPECT_EQ(static_cast<AutofillProfile*>(NULL), removed_profile);
    957 }
    958 
    959 TEST_F(AutofillTableTest, CreditCard) {
    960   // Add a 'Work' credit card.
    961   CreditCard work_creditcard;
    962   work_creditcard.set_origin("https://www.example.com/");
    963   work_creditcard.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Jack Torrance"));
    964   work_creditcard.SetRawInfo(CREDIT_CARD_NUMBER,
    965                              ASCIIToUTF16("1234567890123456"));
    966   work_creditcard.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("04"));
    967   work_creditcard.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR,
    968                              ASCIIToUTF16("2013"));
    969 
    970   Time pre_creation_time = Time::Now();
    971   EXPECT_TRUE(table_->AddCreditCard(work_creditcard));
    972   Time post_creation_time = Time::Now();
    973 
    974   // Get the 'Work' credit card.
    975   CreditCard* db_creditcard;
    976   ASSERT_TRUE(table_->GetCreditCard(work_creditcard.guid(), &db_creditcard));
    977   EXPECT_EQ(work_creditcard, *db_creditcard);
    978   sql::Statement s_work(db_->GetSQLConnection()->GetUniqueStatement(
    979       "SELECT guid, name_on_card, expiration_month, expiration_year, "
    980       "card_number_encrypted, date_modified "
    981       "FROM credit_cards WHERE guid=?"));
    982   s_work.BindString(0, work_creditcard.guid());
    983   ASSERT_TRUE(s_work.is_valid());
    984   ASSERT_TRUE(s_work.Step());
    985   EXPECT_GE(s_work.ColumnInt64(5), pre_creation_time.ToTimeT());
    986   EXPECT_LE(s_work.ColumnInt64(5), post_creation_time.ToTimeT());
    987   EXPECT_FALSE(s_work.Step());
    988   delete db_creditcard;
    989 
    990   // Add a 'Target' credit card.
    991   CreditCard target_creditcard;
    992   target_creditcard.set_origin(std::string());
    993   target_creditcard.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Jack Torrance"));
    994   target_creditcard.SetRawInfo(CREDIT_CARD_NUMBER,
    995                                ASCIIToUTF16("1111222233334444"));
    996   target_creditcard.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("06"));
    997   target_creditcard.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR,
    998                                ASCIIToUTF16("2012"));
    999 
   1000   pre_creation_time = Time::Now();
   1001   EXPECT_TRUE(table_->AddCreditCard(target_creditcard));
   1002   post_creation_time = Time::Now();
   1003   ASSERT_TRUE(table_->GetCreditCard(target_creditcard.guid(), &db_creditcard));
   1004   EXPECT_EQ(target_creditcard, *db_creditcard);
   1005   sql::Statement s_target(db_->GetSQLConnection()->GetUniqueStatement(
   1006       "SELECT guid, name_on_card, expiration_month, expiration_year, "
   1007       "card_number_encrypted, date_modified "
   1008       "FROM credit_cards WHERE guid=?"));
   1009   s_target.BindString(0, target_creditcard.guid());
   1010   ASSERT_TRUE(s_target.is_valid());
   1011   ASSERT_TRUE(s_target.Step());
   1012   EXPECT_GE(s_target.ColumnInt64(5), pre_creation_time.ToTimeT());
   1013   EXPECT_LE(s_target.ColumnInt64(5), post_creation_time.ToTimeT());
   1014   EXPECT_FALSE(s_target.Step());
   1015   delete db_creditcard;
   1016 
   1017   // Update the 'Target' credit card.
   1018   target_creditcard.set_origin("Interactive Autofill dialog");
   1019   target_creditcard.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Charles Grady"));
   1020   Time pre_modification_time = Time::Now();
   1021   EXPECT_TRUE(table_->UpdateCreditCard(target_creditcard));
   1022   Time post_modification_time = Time::Now();
   1023   ASSERT_TRUE(table_->GetCreditCard(target_creditcard.guid(), &db_creditcard));
   1024   EXPECT_EQ(target_creditcard, *db_creditcard);
   1025   sql::Statement s_target_updated(db_->GetSQLConnection()->GetUniqueStatement(
   1026       "SELECT guid, name_on_card, expiration_month, expiration_year, "
   1027       "card_number_encrypted, date_modified "
   1028       "FROM credit_cards WHERE guid=?"));
   1029   s_target_updated.BindString(0, target_creditcard.guid());
   1030   ASSERT_TRUE(s_target_updated.is_valid());
   1031   ASSERT_TRUE(s_target_updated.Step());
   1032   EXPECT_GE(s_target_updated.ColumnInt64(5), pre_modification_time.ToTimeT());
   1033   EXPECT_LE(s_target_updated.ColumnInt64(5), post_modification_time.ToTimeT());
   1034   EXPECT_FALSE(s_target_updated.Step());
   1035   delete db_creditcard;
   1036 
   1037   // Remove the 'Target' credit card.
   1038   EXPECT_TRUE(table_->RemoveCreditCard(target_creditcard.guid()));
   1039   EXPECT_FALSE(table_->GetCreditCard(target_creditcard.guid(), &db_creditcard));
   1040 }
   1041 
   1042 TEST_F(AutofillTableTest, UpdateAutofillProfile) {
   1043   // Add a profile to the db.
   1044   AutofillProfile profile;
   1045   profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John"));
   1046   profile.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Q."));
   1047   profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
   1048   profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("js (at) example.com"));
   1049   profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Google"));
   1050   profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1234 Apple Way"));
   1051   profile.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("unit 5"));
   1052   profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("Los Angeles"));
   1053   profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
   1054   profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90025"));
   1055   profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
   1056   profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("18181234567"));
   1057   profile.set_language_code("en");
   1058   table_->AddAutofillProfile(profile);
   1059 
   1060   // Set a mocked value for the profile's creation time.
   1061   const time_t kMockCreationDate = Time::Now().ToTimeT() - 13;
   1062   sql::Statement s_mock_creation_date(
   1063       db_->GetSQLConnection()->GetUniqueStatement(
   1064           "UPDATE autofill_profiles SET date_modified = ?"));
   1065   ASSERT_TRUE(s_mock_creation_date.is_valid());
   1066   s_mock_creation_date.BindInt64(0, kMockCreationDate);
   1067   ASSERT_TRUE(s_mock_creation_date.Run());
   1068 
   1069   // Get the profile.
   1070   AutofillProfile* tmp_profile;
   1071   ASSERT_TRUE(table_->GetAutofillProfile(profile.guid(), &tmp_profile));
   1072   scoped_ptr<AutofillProfile> db_profile(tmp_profile);
   1073   EXPECT_EQ(profile, *db_profile);
   1074   sql::Statement s_original(db_->GetSQLConnection()->GetUniqueStatement(
   1075       "SELECT date_modified FROM autofill_profiles"));
   1076   ASSERT_TRUE(s_original.is_valid());
   1077   ASSERT_TRUE(s_original.Step());
   1078   EXPECT_EQ(kMockCreationDate, s_original.ColumnInt64(0));
   1079   EXPECT_FALSE(s_original.Step());
   1080 
   1081   // Now, update the profile and save the update to the database.
   1082   // The modification date should change to reflect the update.
   1083   profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("js (at) smith.xyz"));
   1084   table_->UpdateAutofillProfile(profile);
   1085 
   1086   // Get the profile.
   1087   ASSERT_TRUE(table_->GetAutofillProfile(profile.guid(), &tmp_profile));
   1088   db_profile.reset(tmp_profile);
   1089   EXPECT_EQ(profile, *db_profile);
   1090   sql::Statement s_updated(db_->GetSQLConnection()->GetUniqueStatement(
   1091       "SELECT date_modified FROM autofill_profiles"));
   1092   ASSERT_TRUE(s_updated.is_valid());
   1093   ASSERT_TRUE(s_updated.Step());
   1094   EXPECT_LT(kMockCreationDate, s_updated.ColumnInt64(0));
   1095   EXPECT_FALSE(s_updated.Step());
   1096 
   1097   // Set a mocked value for the profile's modification time.
   1098   const time_t mock_modification_date = Time::Now().ToTimeT() - 7;
   1099   sql::Statement s_mock_modification_date(
   1100       db_->GetSQLConnection()->GetUniqueStatement(
   1101           "UPDATE autofill_profiles SET date_modified = ?"));
   1102   ASSERT_TRUE(s_mock_modification_date.is_valid());
   1103   s_mock_modification_date.BindInt64(0, mock_modification_date);
   1104   ASSERT_TRUE(s_mock_modification_date.Run());
   1105 
   1106   // Finally, call into |UpdateAutofillProfile()| without changing the
   1107   // profile.  The modification date should not change.
   1108   table_->UpdateAutofillProfile(profile);
   1109 
   1110   // Get the profile.
   1111   ASSERT_TRUE(table_->GetAutofillProfile(profile.guid(), &tmp_profile));
   1112   db_profile.reset(tmp_profile);
   1113   EXPECT_EQ(profile, *db_profile);
   1114   sql::Statement s_unchanged(db_->GetSQLConnection()->GetUniqueStatement(
   1115       "SELECT date_modified FROM autofill_profiles"));
   1116   ASSERT_TRUE(s_unchanged.is_valid());
   1117   ASSERT_TRUE(s_unchanged.Step());
   1118   EXPECT_EQ(mock_modification_date, s_unchanged.ColumnInt64(0));
   1119   EXPECT_FALSE(s_unchanged.Step());
   1120 }
   1121 
   1122 TEST_F(AutofillTableTest, UpdateCreditCard) {
   1123   // Add a credit card to the db.
   1124   CreditCard credit_card;
   1125   credit_card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Jack Torrance"));
   1126   credit_card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("1234567890123456"));
   1127   credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("04"));
   1128   credit_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2013"));
   1129   table_->AddCreditCard(credit_card);
   1130 
   1131   // Set a mocked value for the credit card's creation time.
   1132   const time_t kMockCreationDate = Time::Now().ToTimeT() - 13;
   1133   sql::Statement s_mock_creation_date(
   1134       db_->GetSQLConnection()->GetUniqueStatement(
   1135           "UPDATE credit_cards SET date_modified = ?"));
   1136   ASSERT_TRUE(s_mock_creation_date.is_valid());
   1137   s_mock_creation_date.BindInt64(0, kMockCreationDate);
   1138   ASSERT_TRUE(s_mock_creation_date.Run());
   1139 
   1140   // Get the credit card.
   1141   CreditCard* tmp_credit_card;
   1142   ASSERT_TRUE(table_->GetCreditCard(credit_card.guid(), &tmp_credit_card));
   1143   scoped_ptr<CreditCard> db_credit_card(tmp_credit_card);
   1144   EXPECT_EQ(credit_card, *db_credit_card);
   1145   sql::Statement s_original(db_->GetSQLConnection()->GetUniqueStatement(
   1146       "SELECT date_modified FROM credit_cards"));
   1147   ASSERT_TRUE(s_original.is_valid());
   1148   ASSERT_TRUE(s_original.Step());
   1149   EXPECT_EQ(kMockCreationDate, s_original.ColumnInt64(0));
   1150   EXPECT_FALSE(s_original.Step());
   1151 
   1152   // Now, update the credit card and save the update to the database.
   1153   // The modification date should change to reflect the update.
   1154   credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("01"));
   1155   table_->UpdateCreditCard(credit_card);
   1156 
   1157   // Get the credit card.
   1158   ASSERT_TRUE(table_->GetCreditCard(credit_card.guid(), &tmp_credit_card));
   1159   db_credit_card.reset(tmp_credit_card);
   1160   EXPECT_EQ(credit_card, *db_credit_card);
   1161   sql::Statement s_updated(db_->GetSQLConnection()->GetUniqueStatement(
   1162       "SELECT date_modified FROM credit_cards"));
   1163   ASSERT_TRUE(s_updated.is_valid());
   1164   ASSERT_TRUE(s_updated.Step());
   1165   EXPECT_LT(kMockCreationDate, s_updated.ColumnInt64(0));
   1166   EXPECT_FALSE(s_updated.Step());
   1167 
   1168   // Set a mocked value for the credit card's modification time.
   1169   const time_t mock_modification_date = Time::Now().ToTimeT() - 7;
   1170   sql::Statement s_mock_modification_date(
   1171       db_->GetSQLConnection()->GetUniqueStatement(
   1172           "UPDATE credit_cards SET date_modified = ?"));
   1173   ASSERT_TRUE(s_mock_modification_date.is_valid());
   1174   s_mock_modification_date.BindInt64(0, mock_modification_date);
   1175   ASSERT_TRUE(s_mock_modification_date.Run());
   1176 
   1177   // Finally, call into |UpdateCreditCard()| without changing the credit card.
   1178   // The modification date should not change.
   1179   table_->UpdateCreditCard(credit_card);
   1180 
   1181   // Get the credit card.
   1182   ASSERT_TRUE(table_->GetCreditCard(credit_card.guid(), &tmp_credit_card));
   1183   db_credit_card.reset(tmp_credit_card);
   1184   EXPECT_EQ(credit_card, *db_credit_card);
   1185   sql::Statement s_unchanged(db_->GetSQLConnection()->GetUniqueStatement(
   1186       "SELECT date_modified FROM credit_cards"));
   1187   ASSERT_TRUE(s_unchanged.is_valid());
   1188   ASSERT_TRUE(s_unchanged.Step());
   1189   EXPECT_EQ(mock_modification_date, s_unchanged.ColumnInt64(0));
   1190   EXPECT_FALSE(s_unchanged.Step());
   1191 }
   1192 
   1193 TEST_F(AutofillTableTest, UpdateProfileOriginOnly) {
   1194   // Add a profile to the db.
   1195   AutofillProfile profile;
   1196   profile.SetRawInfo(NAME_FIRST, ASCIIToUTF16("John"));
   1197   profile.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Q."));
   1198   profile.SetRawInfo(NAME_LAST, ASCIIToUTF16("Smith"));
   1199   profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("js (at) example.com"));
   1200   profile.SetRawInfo(COMPANY_NAME, ASCIIToUTF16("Google"));
   1201   profile.SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("1234 Apple Way"));
   1202   profile.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("unit 5"));
   1203   profile.SetRawInfo(ADDRESS_HOME_CITY, ASCIIToUTF16("Los Angeles"));
   1204   profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA"));
   1205   profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90025"));
   1206   profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
   1207   profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("18181234567"));
   1208   table_->AddAutofillProfile(profile);
   1209 
   1210   // Set a mocked value for the profile's creation time.
   1211   const time_t kMockCreationDate = Time::Now().ToTimeT() - 13;
   1212   sql::Statement s_mock_creation_date(
   1213       db_->GetSQLConnection()->GetUniqueStatement(
   1214           "UPDATE autofill_profiles SET date_modified = ?"));
   1215   ASSERT_TRUE(s_mock_creation_date.is_valid());
   1216   s_mock_creation_date.BindInt64(0, kMockCreationDate);
   1217   ASSERT_TRUE(s_mock_creation_date.Run());
   1218 
   1219   // Get the profile.
   1220   AutofillProfile* tmp_profile;
   1221   ASSERT_TRUE(table_->GetAutofillProfile(profile.guid(), &tmp_profile));
   1222   scoped_ptr<AutofillProfile> db_profile(tmp_profile);
   1223   EXPECT_EQ(profile, *db_profile);
   1224   sql::Statement s_original(db_->GetSQLConnection()->GetUniqueStatement(
   1225       "SELECT date_modified FROM autofill_profiles"));
   1226   ASSERT_TRUE(s_original.is_valid());
   1227   ASSERT_TRUE(s_original.Step());
   1228   EXPECT_EQ(kMockCreationDate, s_original.ColumnInt64(0));
   1229   EXPECT_FALSE(s_original.Step());
   1230 
   1231   // Now, update just the profile's origin and save the update to the database.
   1232   // The modification date should change to reflect the update.
   1233   profile.set_origin("https://www.example.com/");
   1234   table_->UpdateAutofillProfile(profile);
   1235 
   1236   // Get the profile.
   1237   ASSERT_TRUE(table_->GetAutofillProfile(profile.guid(), &tmp_profile));
   1238   db_profile.reset(tmp_profile);
   1239   EXPECT_EQ(profile, *db_profile);
   1240   sql::Statement s_updated(db_->GetSQLConnection()->GetUniqueStatement(
   1241       "SELECT date_modified FROM autofill_profiles"));
   1242   ASSERT_TRUE(s_updated.is_valid());
   1243   ASSERT_TRUE(s_updated.Step());
   1244   EXPECT_LT(kMockCreationDate, s_updated.ColumnInt64(0));
   1245   EXPECT_FALSE(s_updated.Step());
   1246 }
   1247 
   1248 TEST_F(AutofillTableTest, UpdateCreditCardOriginOnly) {
   1249   // Add a credit card to the db.
   1250   CreditCard credit_card;
   1251   credit_card.SetRawInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Jack Torrance"));
   1252   credit_card.SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("1234567890123456"));
   1253   credit_card.SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("04"));
   1254   credit_card.SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2013"));
   1255   table_->AddCreditCard(credit_card);
   1256 
   1257   // Set a mocked value for the credit card's creation time.
   1258   const time_t kMockCreationDate = Time::Now().ToTimeT() - 13;
   1259   sql::Statement s_mock_creation_date(
   1260       db_->GetSQLConnection()->GetUniqueStatement(
   1261           "UPDATE credit_cards SET date_modified = ?"));
   1262   ASSERT_TRUE(s_mock_creation_date.is_valid());
   1263   s_mock_creation_date.BindInt64(0, kMockCreationDate);
   1264   ASSERT_TRUE(s_mock_creation_date.Run());
   1265 
   1266   // Get the credit card.
   1267   CreditCard* tmp_credit_card;
   1268   ASSERT_TRUE(table_->GetCreditCard(credit_card.guid(), &tmp_credit_card));
   1269   scoped_ptr<CreditCard> db_credit_card(tmp_credit_card);
   1270   EXPECT_EQ(credit_card, *db_credit_card);
   1271   sql::Statement s_original(db_->GetSQLConnection()->GetUniqueStatement(
   1272       "SELECT date_modified FROM credit_cards"));
   1273   ASSERT_TRUE(s_original.is_valid());
   1274   ASSERT_TRUE(s_original.Step());
   1275   EXPECT_EQ(kMockCreationDate, s_original.ColumnInt64(0));
   1276   EXPECT_FALSE(s_original.Step());
   1277 
   1278   // Now, update just the credit card's origin and save the update to the
   1279   // database.  The modification date should change to reflect the update.
   1280   credit_card.set_origin("https://www.example.com/");
   1281   table_->UpdateCreditCard(credit_card);
   1282 
   1283   // Get the credit card.
   1284   ASSERT_TRUE(table_->GetCreditCard(credit_card.guid(), &tmp_credit_card));
   1285   db_credit_card.reset(tmp_credit_card);
   1286   EXPECT_EQ(credit_card, *db_credit_card);
   1287   sql::Statement s_updated(db_->GetSQLConnection()->GetUniqueStatement(
   1288       "SELECT date_modified FROM credit_cards"));
   1289   ASSERT_TRUE(s_updated.is_valid());
   1290   ASSERT_TRUE(s_updated.Step());
   1291   EXPECT_LT(kMockCreationDate, s_updated.ColumnInt64(0));
   1292   EXPECT_FALSE(s_updated.Step());
   1293 }
   1294 
   1295 TEST_F(AutofillTableTest, RemoveAutofillDataModifiedBetween) {
   1296   // Populate the autofill_profiles and credit_cards tables.
   1297   ASSERT_TRUE(db_->GetSQLConnection()->Execute(
   1298       "INSERT INTO autofill_profiles (guid, date_modified) "
   1299       "VALUES('00000000-0000-0000-0000-000000000000', 11);"
   1300       "INSERT INTO autofill_profiles (guid, date_modified) "
   1301       "VALUES('00000000-0000-0000-0000-000000000001', 21);"
   1302       "INSERT INTO autofill_profiles (guid, date_modified) "
   1303       "VALUES('00000000-0000-0000-0000-000000000002', 31);"
   1304       "INSERT INTO autofill_profiles (guid, date_modified) "
   1305       "VALUES('00000000-0000-0000-0000-000000000003', 41);"
   1306       "INSERT INTO autofill_profiles (guid, date_modified) "
   1307       "VALUES('00000000-0000-0000-0000-000000000004', 51);"
   1308       "INSERT INTO autofill_profiles (guid, date_modified) "
   1309       "VALUES('00000000-0000-0000-0000-000000000005', 61);"
   1310       "INSERT INTO credit_cards (guid, date_modified) "
   1311       "VALUES('00000000-0000-0000-0000-000000000006', 17);"
   1312       "INSERT INTO credit_cards (guid, date_modified) "
   1313       "VALUES('00000000-0000-0000-0000-000000000007', 27);"
   1314       "INSERT INTO credit_cards (guid, date_modified) "
   1315       "VALUES('00000000-0000-0000-0000-000000000008', 37);"
   1316       "INSERT INTO credit_cards (guid, date_modified) "
   1317       "VALUES('00000000-0000-0000-0000-000000000009', 47);"
   1318       "INSERT INTO credit_cards (guid, date_modified) "
   1319       "VALUES('00000000-0000-0000-0000-000000000010', 57);"
   1320       "INSERT INTO credit_cards (guid, date_modified) "
   1321       "VALUES('00000000-0000-0000-0000-000000000011', 67);"));
   1322 
   1323   // Remove all entries modified in the bounded time range [17,41).
   1324   std::vector<std::string> profile_guids;
   1325   std::vector<std::string> credit_card_guids;
   1326   table_->RemoveAutofillDataModifiedBetween(
   1327       Time::FromTimeT(17), Time::FromTimeT(41),
   1328       &profile_guids, &credit_card_guids);
   1329   ASSERT_EQ(2UL, profile_guids.size());
   1330   EXPECT_EQ("00000000-0000-0000-0000-000000000001", profile_guids[0]);
   1331   EXPECT_EQ("00000000-0000-0000-0000-000000000002", profile_guids[1]);
   1332   sql::Statement s_autofill_profiles_bounded(
   1333       db_->GetSQLConnection()->GetUniqueStatement(
   1334           "SELECT date_modified FROM autofill_profiles"));
   1335   ASSERT_TRUE(s_autofill_profiles_bounded.is_valid());
   1336   ASSERT_TRUE(s_autofill_profiles_bounded.Step());
   1337   EXPECT_EQ(11, s_autofill_profiles_bounded.ColumnInt64(0));
   1338   ASSERT_TRUE(s_autofill_profiles_bounded.Step());
   1339   EXPECT_EQ(41, s_autofill_profiles_bounded.ColumnInt64(0));
   1340   ASSERT_TRUE(s_autofill_profiles_bounded.Step());
   1341   EXPECT_EQ(51, s_autofill_profiles_bounded.ColumnInt64(0));
   1342   ASSERT_TRUE(s_autofill_profiles_bounded.Step());
   1343   EXPECT_EQ(61, s_autofill_profiles_bounded.ColumnInt64(0));
   1344   EXPECT_FALSE(s_autofill_profiles_bounded.Step());
   1345   ASSERT_EQ(3UL, credit_card_guids.size());
   1346   EXPECT_EQ("00000000-0000-0000-0000-000000000006", credit_card_guids[0]);
   1347   EXPECT_EQ("00000000-0000-0000-0000-000000000007", credit_card_guids[1]);
   1348   EXPECT_EQ("00000000-0000-0000-0000-000000000008", credit_card_guids[2]);
   1349   sql::Statement s_credit_cards_bounded(
   1350       db_->GetSQLConnection()->GetUniqueStatement(
   1351           "SELECT date_modified FROM credit_cards"));
   1352   ASSERT_TRUE(s_credit_cards_bounded.is_valid());
   1353   ASSERT_TRUE(s_credit_cards_bounded.Step());
   1354   EXPECT_EQ(47, s_credit_cards_bounded.ColumnInt64(0));
   1355   ASSERT_TRUE(s_credit_cards_bounded.Step());
   1356   EXPECT_EQ(57, s_credit_cards_bounded.ColumnInt64(0));
   1357   ASSERT_TRUE(s_credit_cards_bounded.Step());
   1358   EXPECT_EQ(67, s_credit_cards_bounded.ColumnInt64(0));
   1359   EXPECT_FALSE(s_credit_cards_bounded.Step());
   1360 
   1361   // Remove all entries modified on or after time 51 (unbounded range).
   1362   table_->RemoveAutofillDataModifiedBetween(
   1363       Time::FromTimeT(51), Time(),
   1364       &profile_guids, &credit_card_guids);
   1365   ASSERT_EQ(2UL, profile_guids.size());
   1366   EXPECT_EQ("00000000-0000-0000-0000-000000000004", profile_guids[0]);
   1367   EXPECT_EQ("00000000-0000-0000-0000-000000000005", profile_guids[1]);
   1368   sql::Statement s_autofill_profiles_unbounded(
   1369       db_->GetSQLConnection()->GetUniqueStatement(
   1370           "SELECT date_modified FROM autofill_profiles"));
   1371   ASSERT_TRUE(s_autofill_profiles_unbounded.is_valid());
   1372   ASSERT_TRUE(s_autofill_profiles_unbounded.Step());
   1373   EXPECT_EQ(11, s_autofill_profiles_unbounded.ColumnInt64(0));
   1374   ASSERT_TRUE(s_autofill_profiles_unbounded.Step());
   1375   EXPECT_EQ(41, s_autofill_profiles_unbounded.ColumnInt64(0));
   1376   EXPECT_FALSE(s_autofill_profiles_unbounded.Step());
   1377   ASSERT_EQ(2UL, credit_card_guids.size());
   1378   EXPECT_EQ("00000000-0000-0000-0000-000000000010", credit_card_guids[0]);
   1379   EXPECT_EQ("00000000-0000-0000-0000-000000000011", credit_card_guids[1]);
   1380   sql::Statement s_credit_cards_unbounded(
   1381       db_->GetSQLConnection()->GetUniqueStatement(
   1382           "SELECT date_modified FROM credit_cards"));
   1383   ASSERT_TRUE(s_credit_cards_unbounded.is_valid());
   1384   ASSERT_TRUE(s_credit_cards_unbounded.Step());
   1385   EXPECT_EQ(47, s_credit_cards_unbounded.ColumnInt64(0));
   1386   EXPECT_FALSE(s_credit_cards_unbounded.Step());
   1387 
   1388   // Remove all remaining entries.
   1389   table_->RemoveAutofillDataModifiedBetween(
   1390       Time(), Time(),
   1391       &profile_guids, &credit_card_guids);
   1392   ASSERT_EQ(2UL, profile_guids.size());
   1393   EXPECT_EQ("00000000-0000-0000-0000-000000000000", profile_guids[0]);
   1394   EXPECT_EQ("00000000-0000-0000-0000-000000000003", profile_guids[1]);
   1395   sql::Statement s_autofill_profiles_empty(
   1396       db_->GetSQLConnection()->GetUniqueStatement(
   1397           "SELECT date_modified FROM autofill_profiles"));
   1398   ASSERT_TRUE(s_autofill_profiles_empty.is_valid());
   1399   EXPECT_FALSE(s_autofill_profiles_empty.Step());
   1400   ASSERT_EQ(1UL, credit_card_guids.size());
   1401   EXPECT_EQ("00000000-0000-0000-0000-000000000009", credit_card_guids[0]);
   1402   sql::Statement s_credit_cards_empty(
   1403       db_->GetSQLConnection()->GetUniqueStatement(
   1404           "SELECT date_modified FROM credit_cards"));
   1405   ASSERT_TRUE(s_credit_cards_empty.is_valid());
   1406   EXPECT_FALSE(s_credit_cards_empty.Step());
   1407 }
   1408 
   1409 TEST_F(AutofillTableTest, RemoveOriginURLsModifiedBetween) {
   1410   // Populate the autofill_profiles and credit_cards tables.
   1411   ASSERT_TRUE(db_->GetSQLConnection()->Execute(
   1412       "INSERT INTO autofill_profiles (guid, origin, date_modified) "
   1413       "VALUES('00000000-0000-0000-0000-000000000000', '', 11);"
   1414       "INSERT INTO autofill_profiles (guid, origin, date_modified) "
   1415       "VALUES('00000000-0000-0000-0000-000000000001', "
   1416       "       'https://www.example.com/', 21);"
   1417       "INSERT INTO autofill_profiles (guid, origin, date_modified) "
   1418       "VALUES('00000000-0000-0000-0000-000000000002', 'Chrome settings', 31);"
   1419       "INSERT INTO credit_cards (guid, origin, date_modified) "
   1420       "VALUES('00000000-0000-0000-0000-000000000003', '', 17);"
   1421       "INSERT INTO credit_cards (guid, origin, date_modified) "
   1422       "VALUES('00000000-0000-0000-0000-000000000004', "
   1423       "       'https://www.example.com/', 27);"
   1424       "INSERT INTO credit_cards (guid, origin, date_modified) "
   1425       "VALUES('00000000-0000-0000-0000-000000000005', 'Chrome settings', "
   1426       "       37);"));
   1427 
   1428   // Remove all origin URLs set in the bounded time range [21,27).
   1429   ScopedVector<AutofillProfile> profiles;
   1430   table_->RemoveOriginURLsModifiedBetween(
   1431       Time::FromTimeT(21), Time::FromTimeT(27), &profiles);
   1432   ASSERT_EQ(1UL, profiles.size());
   1433   EXPECT_EQ("00000000-0000-0000-0000-000000000001", profiles[0]->guid());
   1434   sql::Statement s_autofill_profiles_bounded(
   1435       db_->GetSQLConnection()->GetUniqueStatement(
   1436           "SELECT date_modified, origin FROM autofill_profiles"));
   1437   ASSERT_TRUE(s_autofill_profiles_bounded.is_valid());
   1438   ASSERT_TRUE(s_autofill_profiles_bounded.Step());
   1439   EXPECT_EQ(11, s_autofill_profiles_bounded.ColumnInt64(0));
   1440   EXPECT_EQ(std::string(), s_autofill_profiles_bounded.ColumnString(1));
   1441   ASSERT_TRUE(s_autofill_profiles_bounded.Step());
   1442   EXPECT_EQ(21, s_autofill_profiles_bounded.ColumnInt64(0));
   1443   EXPECT_EQ(std::string(), s_autofill_profiles_bounded.ColumnString(1));
   1444   ASSERT_TRUE(s_autofill_profiles_bounded.Step());
   1445   EXPECT_EQ(31, s_autofill_profiles_bounded.ColumnInt64(0));
   1446   EXPECT_EQ("Chrome settings", s_autofill_profiles_bounded.ColumnString(1));
   1447   sql::Statement s_credit_cards_bounded(
   1448       db_->GetSQLConnection()->GetUniqueStatement(
   1449           "SELECT date_modified, origin FROM credit_cards"));
   1450   ASSERT_TRUE(s_credit_cards_bounded.is_valid());
   1451   ASSERT_TRUE(s_credit_cards_bounded.Step());
   1452   EXPECT_EQ(17, s_credit_cards_bounded.ColumnInt64(0));
   1453   EXPECT_EQ(std::string(), s_credit_cards_bounded.ColumnString(1));
   1454   ASSERT_TRUE(s_credit_cards_bounded.Step());
   1455   EXPECT_EQ(27, s_credit_cards_bounded.ColumnInt64(0));
   1456   EXPECT_EQ("https://www.example.com/",
   1457             s_credit_cards_bounded.ColumnString(1));
   1458   ASSERT_TRUE(s_credit_cards_bounded.Step());
   1459   EXPECT_EQ(37, s_credit_cards_bounded.ColumnInt64(0));
   1460   EXPECT_EQ("Chrome settings", s_credit_cards_bounded.ColumnString(1));
   1461 
   1462   // Remove all origin URLS.
   1463   profiles.clear();
   1464   table_->RemoveOriginURLsModifiedBetween(Time(), Time(), &profiles);
   1465   EXPECT_EQ(0UL, profiles.size());
   1466   sql::Statement s_autofill_profiles_all(
   1467       db_->GetSQLConnection()->GetUniqueStatement(
   1468           "SELECT date_modified, origin FROM autofill_profiles"));
   1469   ASSERT_TRUE(s_autofill_profiles_all.is_valid());
   1470   ASSERT_TRUE(s_autofill_profiles_all.Step());
   1471   EXPECT_EQ(11, s_autofill_profiles_all.ColumnInt64(0));
   1472   EXPECT_EQ(std::string(), s_autofill_profiles_all.ColumnString(1));
   1473   ASSERT_TRUE(s_autofill_profiles_all.Step());
   1474   EXPECT_EQ(21, s_autofill_profiles_all.ColumnInt64(0));
   1475   EXPECT_EQ(std::string(), s_autofill_profiles_all.ColumnString(1));
   1476   ASSERT_TRUE(s_autofill_profiles_all.Step());
   1477   EXPECT_EQ(31, s_autofill_profiles_all.ColumnInt64(0));
   1478   EXPECT_EQ("Chrome settings", s_autofill_profiles_all.ColumnString(1));
   1479   sql::Statement s_credit_cards_all(
   1480       db_->GetSQLConnection()->GetUniqueStatement(
   1481           "SELECT date_modified, origin FROM credit_cards"));
   1482   ASSERT_TRUE(s_credit_cards_all.is_valid());
   1483   ASSERT_TRUE(s_credit_cards_all.Step());
   1484   EXPECT_EQ(17, s_credit_cards_all.ColumnInt64(0));
   1485   EXPECT_EQ(std::string(), s_credit_cards_all.ColumnString(1));
   1486   ASSERT_TRUE(s_credit_cards_all.Step());
   1487   EXPECT_EQ(27, s_credit_cards_all.ColumnInt64(0));
   1488   EXPECT_EQ(std::string(), s_credit_cards_all.ColumnString(1));
   1489   ASSERT_TRUE(s_credit_cards_all.Step());
   1490   EXPECT_EQ(37, s_credit_cards_all.ColumnInt64(0));
   1491   EXPECT_EQ("Chrome settings", s_credit_cards_all.ColumnString(1));
   1492 }
   1493 
   1494 TEST_F(AutofillTableTest, Autofill_GetAllAutofillEntries_NoResults) {
   1495   std::vector<AutofillEntry> entries;
   1496   ASSERT_TRUE(table_->GetAllAutofillEntries(&entries));
   1497 
   1498   EXPECT_EQ(0U, entries.size());
   1499 }
   1500 
   1501 TEST_F(AutofillTableTest, Autofill_GetAllAutofillEntries_OneResult) {
   1502   AutofillChangeList changes;
   1503   std::map<std::string, std::vector<Time> > name_value_times_map;
   1504 
   1505   time_t start = 0;
   1506   std::vector<Time> timestamps1;
   1507   FormFieldData field;
   1508   field.name = ASCIIToUTF16("Name");
   1509   field.value = ASCIIToUTF16("Superman");
   1510   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
   1511                                             Time::FromTimeT(start)));
   1512   timestamps1.push_back(Time::FromTimeT(start));
   1513   std::string key1("NameSuperman");
   1514   name_value_times_map.insert(
   1515       std::pair<std::string, std::vector<Time> >(key1, timestamps1));
   1516 
   1517   AutofillEntrySet expected_entries(CompareAutofillEntries);
   1518   AutofillKey ak1(ASCIIToUTF16("Name"), ASCIIToUTF16("Superman"));
   1519   AutofillEntry ae1(ak1, timestamps1.front(), timestamps1.back());
   1520 
   1521   expected_entries.insert(ae1);
   1522 
   1523   std::vector<AutofillEntry> entries;
   1524   ASSERT_TRUE(table_->GetAllAutofillEntries(&entries));
   1525   AutofillEntrySet entry_set(entries.begin(), entries.end(),
   1526                              CompareAutofillEntries);
   1527 
   1528   CompareAutofillEntrySets(entry_set, expected_entries);
   1529 }
   1530 
   1531 TEST_F(AutofillTableTest, Autofill_GetAllAutofillEntries_TwoDistinct) {
   1532   AutofillChangeList changes;
   1533   std::map<std::string, std::vector<Time> > name_value_times_map;
   1534   time_t start = 0;
   1535 
   1536   std::vector<Time> timestamps1;
   1537   FormFieldData field;
   1538   field.name = ASCIIToUTF16("Name");
   1539   field.value = ASCIIToUTF16("Superman");
   1540   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
   1541                                             Time::FromTimeT(start)));
   1542   timestamps1.push_back(Time::FromTimeT(start));
   1543   std::string key1("NameSuperman");
   1544   name_value_times_map.insert(
   1545       std::pair<std::string, std::vector<Time> >(key1, timestamps1));
   1546 
   1547   ++start;
   1548   std::vector<Time> timestamps2;
   1549   field.name = ASCIIToUTF16("Name");
   1550   field.value = ASCIIToUTF16("Clark Kent");
   1551   EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
   1552                                             Time::FromTimeT(start)));
   1553   timestamps2.push_back(Time::FromTimeT(start));
   1554   std::string key2("NameClark Kent");
   1555   name_value_times_map.insert(
   1556       std::pair<std::string, std::vector<Time> >(key2, timestamps2));
   1557 
   1558   AutofillEntrySet expected_entries(CompareAutofillEntries);
   1559   AutofillKey ak1(ASCIIToUTF16("Name"), ASCIIToUTF16("Superman"));
   1560   AutofillKey ak2(ASCIIToUTF16("Name"), ASCIIToUTF16("Clark Kent"));
   1561   AutofillEntry ae1(ak1, timestamps1.front(), timestamps1.back());
   1562   AutofillEntry ae2(ak2, timestamps2.front(), timestamps2.back());
   1563 
   1564   expected_entries.insert(ae1);
   1565   expected_entries.insert(ae2);
   1566 
   1567   std::vector<AutofillEntry> entries;
   1568   ASSERT_TRUE(table_->GetAllAutofillEntries(&entries));
   1569   AutofillEntrySet entry_set(entries.begin(), entries.end(),
   1570                              CompareAutofillEntries);
   1571 
   1572   CompareAutofillEntrySets(entry_set, expected_entries);
   1573 }
   1574 
   1575 TEST_F(AutofillTableTest, Autofill_GetAllAutofillEntries_TwoSame) {
   1576   AutofillChangeList changes;
   1577   std::map<std::string, std::vector<Time> > name_value_times_map;
   1578 
   1579   std::vector<Time> timestamps;
   1580   time_t start = 0;
   1581   for (int i = 0; i < 2; ++i, ++start) {
   1582     FormFieldData field;
   1583     field.name = ASCIIToUTF16("Name");
   1584     field.value = ASCIIToUTF16("Superman");
   1585     EXPECT_TRUE(table_->AddFormFieldValueTime(field, &changes,
   1586                                               Time::FromTimeT(start)));
   1587     timestamps.push_back(Time::FromTimeT(start));
   1588   }
   1589 
   1590   std::string key("NameSuperman");
   1591   name_value_times_map.insert(
   1592       std::pair<std::string, std::vector<Time> >(key, timestamps));
   1593 
   1594   AutofillEntrySet expected_entries(CompareAutofillEntries);
   1595   AutofillKey ak1(ASCIIToUTF16("Name"), ASCIIToUTF16("Superman"));
   1596   AutofillEntry ae1(ak1, timestamps.front(), timestamps.back());
   1597 
   1598   expected_entries.insert(ae1);
   1599 
   1600   std::vector<AutofillEntry> entries;
   1601   ASSERT_TRUE(table_->GetAllAutofillEntries(&entries));
   1602   AutofillEntrySet entry_set(entries.begin(), entries.end(),
   1603                              CompareAutofillEntries);
   1604 
   1605   CompareAutofillEntrySets(entry_set, expected_entries);
   1606 }
   1607 
   1608 }  // namespace autofill
   1609