Home | History | Annotate | Download | only in webdata
      1 // Copyright (c) 2011 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 <string>
      6 #include <vector>
      7 
      8 #include "base/basictypes.h"
      9 #include "base/file_util.h"
     10 #include "base/memory/ref_counted.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "base/memory/scoped_vector.h"
     13 #include "base/message_loop.h"
     14 #include "base/path_service.h"
     15 #include "base/stl_util-inl.h"
     16 #include "base/string16.h"
     17 #include "base/string_util.h"
     18 #include "base/synchronization/waitable_event.h"
     19 #include "base/time.h"
     20 #include "base/utf_string_conversions.h"
     21 #include "chrome/browser/autofill/autofill_profile.h"
     22 #include "chrome/browser/autofill/credit_card.h"
     23 #include "chrome/browser/webdata/autofill_change.h"
     24 #include "chrome/browser/webdata/autofill_entry.h"
     25 #include "chrome/browser/webdata/web_data_service.h"
     26 #include "chrome/browser/webdata/web_data_service_test_util.h"
     27 #include "chrome/common/chrome_paths.h"
     28 #include "chrome/common/guid.h"
     29 #include "chrome/test/thread_observer_helper.h"
     30 #include "content/browser/browser_thread.h"
     31 #include "content/common/notification_details.h"
     32 #include "content/common/notification_service.h"
     33 #include "content/common/notification_type.h"
     34 #include "testing/gmock/include/gmock/gmock.h"
     35 #include "testing/gtest/include/gtest/gtest.h"
     36 #include "webkit/glue/form_field.h"
     37 
     38 using base::Time;
     39 using base::TimeDelta;
     40 using base::WaitableEvent;
     41 using testing::_;
     42 using testing::DoDefault;
     43 using testing::ElementsAreArray;
     44 using testing::Pointee;
     45 using testing::Property;
     46 
     47 typedef std::vector<AutofillChange> AutofillChangeList;
     48 
     49 static const int kWebDataServiceTimeoutSeconds = 8;
     50 
     51 ACTION_P(SignalEvent, event) {
     52   event->Signal();
     53 }
     54 
     55 class AutofillDBThreadObserverHelper : public DBThreadObserverHelper {
     56  protected:
     57   virtual void RegisterObservers() {
     58     registrar_.Add(&observer_,
     59                    NotificationType::AUTOFILL_ENTRIES_CHANGED,
     60                    NotificationService::AllSources());
     61     registrar_.Add(&observer_,
     62                    NotificationType::AUTOFILL_PROFILE_CHANGED,
     63                    NotificationService::AllSources());
     64     registrar_.Add(&observer_,
     65                    NotificationType::AUTOFILL_CREDIT_CARD_CHANGED,
     66                    NotificationService::AllSources());
     67   }
     68 };
     69 
     70 class WebDataServiceTest : public testing::Test {
     71  public:
     72   WebDataServiceTest()
     73       : ui_thread_(BrowserThread::UI, &message_loop_),
     74         db_thread_(BrowserThread::DB) {}
     75 
     76  protected:
     77   virtual void SetUp() {
     78     db_thread_.Start();
     79 
     80     PathService::Get(chrome::DIR_TEST_DATA, &profile_dir_);
     81     const std::string test_profile = "WebDataServiceTest";
     82     profile_dir_ = profile_dir_.AppendASCII(test_profile);
     83     file_util::Delete(profile_dir_, true);
     84     file_util::CreateDirectory(profile_dir_);
     85     wds_ = new WebDataService();
     86     wds_->Init(profile_dir_);
     87   }
     88 
     89   virtual void TearDown() {
     90     if (wds_.get())
     91       wds_->Shutdown();
     92     file_util::Delete(profile_dir_, true);
     93 
     94     db_thread_.Stop();
     95     MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask);
     96     MessageLoop::current()->Run();
     97   }
     98 
     99   MessageLoopForUI message_loop_;
    100   BrowserThread ui_thread_;
    101   BrowserThread db_thread_;
    102   FilePath profile_dir_;
    103   scoped_refptr<WebDataService> wds_;
    104 };
    105 
    106 class WebDataServiceAutofillTest : public WebDataServiceTest {
    107  public:
    108   WebDataServiceAutofillTest()
    109       : WebDataServiceTest(),
    110         unique_id1_(1),
    111         unique_id2_(2),
    112         test_timeout_(TimeDelta::FromSeconds(kWebDataServiceTimeoutSeconds)),
    113         done_event_(false, false) {}
    114 
    115  protected:
    116   virtual void SetUp() {
    117     WebDataServiceTest::SetUp();
    118     name1_ = ASCIIToUTF16("name1");
    119     name2_ = ASCIIToUTF16("name2");
    120     value1_ = ASCIIToUTF16("value1");
    121     value2_ = ASCIIToUTF16("value2");
    122     observer_helper_ = new AutofillDBThreadObserverHelper();
    123     observer_helper_->Init();
    124   }
    125 
    126   virtual void TearDown() {
    127     // Release this first so it can get destructed on the db thread.
    128     observer_helper_ = NULL;
    129     WebDataServiceTest::TearDown();
    130   }
    131 
    132   void AppendFormField(const string16& name,
    133                        const string16& value,
    134                        std::vector<webkit_glue::FormField>* form_fields) {
    135     form_fields->push_back(
    136         webkit_glue::FormField(string16(),
    137                                name,
    138                                value,
    139                                string16(),
    140                                0,
    141                                false));
    142   }
    143 
    144   string16 name1_;
    145   string16 name2_;
    146   string16 value1_;
    147   string16 value2_;
    148   int unique_id1_, unique_id2_;
    149   const TimeDelta test_timeout_;
    150   scoped_refptr<AutofillDBThreadObserverHelper> observer_helper_;
    151   WaitableEvent done_event_;
    152 };
    153 
    154 TEST_F(WebDataServiceAutofillTest, FormFillAdd) {
    155   const AutofillChange expected_changes[] = {
    156     AutofillChange(AutofillChange::ADD, AutofillKey(name1_, value1_)),
    157     AutofillChange(AutofillChange::ADD, AutofillKey(name2_, value2_))
    158   };
    159 
    160   // This will verify that the correct notification is triggered,
    161   // passing the correct list of autofill keys in the details.
    162   EXPECT_CALL(
    163       *observer_helper_->observer(),
    164       Observe(NotificationType(NotificationType::AUTOFILL_ENTRIES_CHANGED),
    165               Source<WebDataService>(wds_.get()),
    166               Property(&Details<const AutofillChangeList>::ptr,
    167                        Pointee(ElementsAreArray(expected_changes))))).
    168       WillOnce(SignalEvent(&done_event_));
    169 
    170   std::vector<webkit_glue::FormField> form_fields;
    171   AppendFormField(name1_, value1_, &form_fields);
    172   AppendFormField(name2_, value2_, &form_fields);
    173   wds_->AddFormFields(form_fields);
    174 
    175   // The event will be signaled when the mock observer is notified.
    176   done_event_.TimedWait(test_timeout_);
    177 
    178   AutofillWebDataServiceConsumer<std::vector<string16> > consumer;
    179   WebDataService::Handle handle;
    180   static const int limit = 10;
    181   handle = wds_->GetFormValuesForElementName(
    182       name1_, string16(), limit, &consumer);
    183 
    184   // The message loop will exit when the consumer is called.
    185   MessageLoop::current()->Run();
    186 
    187   EXPECT_EQ(handle, consumer.handle());
    188   ASSERT_EQ(1U, consumer.result().size());
    189   EXPECT_EQ(value1_, consumer.result()[0]);
    190 }
    191 
    192 TEST_F(WebDataServiceAutofillTest, FormFillRemoveOne) {
    193   // First add some values to autofill.
    194   EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)).
    195       WillOnce(SignalEvent(&done_event_));
    196   std::vector<webkit_glue::FormField> form_fields;
    197   AppendFormField(name1_, value1_, &form_fields);
    198   wds_->AddFormFields(form_fields);
    199 
    200   // The event will be signaled when the mock observer is notified.
    201   done_event_.TimedWait(test_timeout_);
    202 
    203   // This will verify that the correct notification is triggered,
    204   // passing the correct list of autofill keys in the details.
    205   const AutofillChange expected_changes[] = {
    206     AutofillChange(AutofillChange::REMOVE, AutofillKey(name1_, value1_))
    207   };
    208   EXPECT_CALL(
    209       *observer_helper_->observer(),
    210       Observe(NotificationType(NotificationType::AUTOFILL_ENTRIES_CHANGED),
    211               Source<WebDataService>(wds_.get()),
    212               Property(&Details<const AutofillChangeList>::ptr,
    213                        Pointee(ElementsAreArray(expected_changes))))).
    214       WillOnce(SignalEvent(&done_event_));
    215   wds_->RemoveFormValueForElementName(name1_, value1_);
    216 
    217   // The event will be signaled when the mock observer is notified.
    218   done_event_.TimedWait(test_timeout_);
    219 }
    220 
    221 TEST_F(WebDataServiceAutofillTest, FormFillRemoveMany) {
    222   TimeDelta one_day(TimeDelta::FromDays(1));
    223   Time t = Time::Now();
    224 
    225   EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)).
    226       WillOnce(SignalEvent(&done_event_));
    227   std::vector<webkit_glue::FormField> form_fields;
    228   AppendFormField(name1_, value1_, &form_fields);
    229   AppendFormField(name2_, value2_, &form_fields);
    230   wds_->AddFormFields(form_fields);
    231 
    232   // The event will be signaled when the mock observer is notified.
    233   done_event_.TimedWait(test_timeout_);
    234 
    235   // This will verify that the correct notification is triggered,
    236   // passing the correct list of autofill keys in the details.
    237   const AutofillChange expected_changes[] = {
    238     AutofillChange(AutofillChange::REMOVE, AutofillKey(name1_, value1_)),
    239     AutofillChange(AutofillChange::REMOVE, AutofillKey(name2_, value2_))
    240   };
    241   EXPECT_CALL(
    242       *observer_helper_->observer(),
    243       Observe(NotificationType(NotificationType::AUTOFILL_ENTRIES_CHANGED),
    244               Source<WebDataService>(wds_.get()),
    245               Property(&Details<const AutofillChangeList>::ptr,
    246                        Pointee(ElementsAreArray(expected_changes))))).
    247       WillOnce(SignalEvent(&done_event_));
    248   wds_->RemoveFormElementsAddedBetween(t, t + one_day);
    249 
    250   // The event will be signaled when the mock observer is notified.
    251   done_event_.TimedWait(test_timeout_);
    252 }
    253 
    254 TEST_F(WebDataServiceAutofillTest, ProfileAdd) {
    255   AutofillProfile profile;
    256 
    257   // Check that GUID-based notification was sent.
    258   const AutofillProfileChange expected_change(
    259       AutofillProfileChange::ADD, profile.guid(), &profile);
    260   EXPECT_CALL(
    261       *observer_helper_->observer(),
    262       Observe(NotificationType(NotificationType::AUTOFILL_PROFILE_CHANGED),
    263               Source<WebDataService>(wds_.get()),
    264               Property(&Details<const AutofillProfileChange>::ptr,
    265                        Pointee(expected_change)))).
    266       WillOnce(SignalEvent(&done_event_));
    267 
    268   wds_->AddAutofillProfile(profile);
    269   done_event_.TimedWait(test_timeout_);
    270 
    271   // Check that it was added.
    272   AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > consumer;
    273   WebDataService::Handle handle = wds_->GetAutofillProfiles(&consumer);
    274   MessageLoop::current()->Run();
    275   EXPECT_EQ(handle, consumer.handle());
    276   ASSERT_EQ(1U, consumer.result().size());
    277   EXPECT_EQ(profile, *consumer.result()[0]);
    278   STLDeleteElements(&consumer.result());
    279 }
    280 
    281 TEST_F(WebDataServiceAutofillTest, ProfileRemove) {
    282   AutofillProfile profile;
    283 
    284   // Add a profile.
    285   EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)).
    286       Times(1).
    287       WillOnce(SignalEvent(&done_event_));
    288   wds_->AddAutofillProfile(profile);
    289   done_event_.TimedWait(test_timeout_);
    290 
    291   // Check that it was added.
    292   AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > consumer;
    293   WebDataService::Handle handle = wds_->GetAutofillProfiles(&consumer);
    294   MessageLoop::current()->Run();
    295   EXPECT_EQ(handle, consumer.handle());
    296   ASSERT_EQ(1U, consumer.result().size());
    297   EXPECT_EQ(profile, *consumer.result()[0]);
    298   STLDeleteElements(&consumer.result());
    299 
    300   // Check that GUID-based notification was sent.
    301   const AutofillProfileChange expected_change(
    302       AutofillProfileChange::REMOVE, profile.guid(), NULL);
    303   EXPECT_CALL(
    304       *observer_helper_->observer(),
    305       Observe(NotificationType(NotificationType::AUTOFILL_PROFILE_CHANGED),
    306               Source<WebDataService>(wds_.get()),
    307               Property(&Details<const AutofillProfileChange>::ptr,
    308                        Pointee(expected_change)))).
    309       WillOnce(SignalEvent(&done_event_));
    310 
    311   // Remove the profile.
    312   wds_->RemoveAutofillProfile(profile.guid());
    313   done_event_.TimedWait(test_timeout_);
    314 
    315   // Check that it was removed.
    316   AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > consumer2;
    317   WebDataService::Handle handle2 = wds_->GetAutofillProfiles(&consumer2);
    318   MessageLoop::current()->Run();
    319   EXPECT_EQ(handle2, consumer2.handle());
    320   ASSERT_EQ(0U, consumer2.result().size());
    321 }
    322 
    323 TEST_F(WebDataServiceAutofillTest, ProfileUpdate) {
    324   AutofillProfile profile1;
    325   profile1.SetInfo(NAME_FIRST, ASCIIToUTF16("Abe"));
    326   AutofillProfile profile2;
    327   profile2.SetInfo(NAME_FIRST, ASCIIToUTF16("Alice"));
    328 
    329   EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)).
    330       WillOnce(DoDefault()).
    331       WillOnce(SignalEvent(&done_event_));
    332   wds_->AddAutofillProfile(profile1);
    333   wds_->AddAutofillProfile(profile2);
    334   done_event_.TimedWait(test_timeout_);
    335 
    336   // Check that they were added.
    337   AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > consumer;
    338   WebDataService::Handle handle = wds_->GetAutofillProfiles(&consumer);
    339   MessageLoop::current()->Run();
    340   EXPECT_EQ(handle, consumer.handle());
    341   ASSERT_EQ(2U, consumer.result().size());
    342   EXPECT_EQ(profile1, *consumer.result()[0]);
    343   EXPECT_EQ(profile2, *consumer.result()[1]);
    344   STLDeleteElements(&consumer.result());
    345 
    346   AutofillProfile profile1_changed(profile1);
    347   profile1_changed.SetInfo(NAME_FIRST, ASCIIToUTF16("Bill"));
    348   const AutofillProfileChange expected_change(
    349       AutofillProfileChange::UPDATE, profile1.guid(), &profile1_changed);
    350 
    351   EXPECT_CALL(
    352       *observer_helper_->observer(),
    353       Observe(NotificationType(NotificationType::AUTOFILL_PROFILE_CHANGED),
    354               Source<WebDataService>(wds_.get()),
    355               Property(&Details<const AutofillProfileChange>::ptr,
    356                        Pointee(expected_change)))).
    357       WillOnce(SignalEvent(&done_event_));
    358 
    359   // Update the profile.
    360   wds_->UpdateAutofillProfile(profile1_changed);
    361   done_event_.TimedWait(test_timeout_);
    362 
    363   // Check that the updates were made.
    364   AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > consumer2;
    365   WebDataService::Handle handle2 = wds_->GetAutofillProfiles(&consumer2);
    366   MessageLoop::current()->Run();
    367   EXPECT_EQ(handle2, consumer2.handle());
    368   ASSERT_EQ(2U, consumer2.result().size());
    369   EXPECT_NE(profile1, *consumer2.result()[0]);
    370   EXPECT_EQ(profile1_changed, *consumer2.result()[0]);
    371   EXPECT_EQ(profile2, *consumer2.result()[1]);
    372   STLDeleteElements(&consumer2.result());
    373 }
    374 
    375 TEST_F(WebDataServiceAutofillTest, CreditAdd) {
    376   CreditCard card;
    377   const AutofillCreditCardChange expected_change(
    378       AutofillCreditCardChange::ADD, card.guid(), &card);
    379 
    380   EXPECT_CALL(
    381       *observer_helper_->observer(),
    382       Observe(
    383           NotificationType(NotificationType::AUTOFILL_CREDIT_CARD_CHANGED),
    384               Source<WebDataService>(wds_.get()),
    385               Property(&Details<const AutofillCreditCardChange>::ptr,
    386                        Pointee(expected_change)))).
    387       WillOnce(SignalEvent(&done_event_));
    388 
    389   wds_->AddCreditCard(card);
    390   done_event_.TimedWait(test_timeout_);
    391 
    392   // Check that it was added.
    393   AutofillWebDataServiceConsumer<std::vector<CreditCard*> > consumer;
    394   WebDataService::Handle handle = wds_->GetCreditCards(&consumer);
    395   MessageLoop::current()->Run();
    396   EXPECT_EQ(handle, consumer.handle());
    397   ASSERT_EQ(1U, consumer.result().size());
    398   EXPECT_EQ(card, *consumer.result()[0]);
    399   STLDeleteElements(&consumer.result());
    400 }
    401 
    402 TEST_F(WebDataServiceAutofillTest, CreditCardRemove) {
    403   CreditCard credit_card;
    404 
    405   // Add a credit card.
    406   EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)).
    407       WillOnce(SignalEvent(&done_event_));
    408   wds_->AddCreditCard(credit_card);
    409   done_event_.TimedWait(test_timeout_);
    410 
    411   // Check that it was added.
    412   AutofillWebDataServiceConsumer<std::vector<CreditCard*> > consumer;
    413   WebDataService::Handle handle = wds_->GetCreditCards(&consumer);
    414   MessageLoop::current()->Run();
    415   EXPECT_EQ(handle, consumer.handle());
    416   ASSERT_EQ(1U, consumer.result().size());
    417   EXPECT_EQ(credit_card, *consumer.result()[0]);
    418   STLDeleteElements(&consumer.result());
    419 
    420   // Remove the credit card.
    421   const AutofillCreditCardChange expected_change(
    422       AutofillCreditCardChange::REMOVE, credit_card.guid(), NULL);
    423   EXPECT_CALL(
    424       *observer_helper_->observer(),
    425       Observe(
    426           NotificationType(NotificationType::AUTOFILL_CREDIT_CARD_CHANGED),
    427               Source<WebDataService>(wds_.get()),
    428               Property(&Details<const AutofillCreditCardChange>::ptr,
    429                        Pointee(expected_change)))).
    430       WillOnce(SignalEvent(&done_event_));
    431   wds_->RemoveCreditCard(credit_card.guid());
    432   done_event_.TimedWait(test_timeout_);
    433 
    434   // Check that it was removed.
    435   AutofillWebDataServiceConsumer<std::vector<CreditCard*> > consumer2;
    436   WebDataService::Handle handle2 = wds_->GetCreditCards(&consumer2);
    437   MessageLoop::current()->Run();
    438   EXPECT_EQ(handle2, consumer2.handle());
    439   ASSERT_EQ(0U, consumer2.result().size());
    440 }
    441 
    442 TEST_F(WebDataServiceAutofillTest, CreditUpdate) {
    443   CreditCard card1;
    444   card1.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Abe"));
    445   CreditCard card2;
    446   card2.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Alice"));
    447 
    448   EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)).
    449       Times(2).
    450       WillOnce(DoDefault()).
    451       WillOnce(SignalEvent(&done_event_));
    452   wds_->AddCreditCard(card1);
    453   wds_->AddCreditCard(card2);
    454   done_event_.TimedWait(test_timeout_);
    455 
    456   // Check that they got added.
    457   AutofillWebDataServiceConsumer<std::vector<CreditCard*> > consumer;
    458   WebDataService::Handle handle = wds_->GetCreditCards(&consumer);
    459   MessageLoop::current()->Run();
    460   EXPECT_EQ(handle, consumer.handle());
    461   ASSERT_EQ(2U, consumer.result().size());
    462   EXPECT_EQ(card1, *consumer.result()[0]);
    463   EXPECT_EQ(card2, *consumer.result()[1]);
    464   STLDeleteElements(&consumer.result());
    465 
    466   CreditCard card1_changed(card1);
    467   card1_changed.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Bill"));
    468   const AutofillCreditCardChange expected_change(
    469       AutofillCreditCardChange::UPDATE, card1.guid(), &card1_changed);
    470 
    471   EXPECT_CALL(
    472       *observer_helper_->observer(),
    473       Observe(
    474           NotificationType(NotificationType::AUTOFILL_CREDIT_CARD_CHANGED),
    475               Source<WebDataService>(wds_.get()),
    476               Property(&Details<const AutofillCreditCardChange>::ptr,
    477                        Pointee(expected_change)))).
    478       WillOnce(SignalEvent(&done_event_));
    479 
    480   wds_->UpdateCreditCard(card1_changed);
    481   done_event_.TimedWait(test_timeout_);
    482 
    483   // Check that the updates were made.
    484   AutofillWebDataServiceConsumer<std::vector<CreditCard*> > consumer2;
    485   WebDataService::Handle handle2 = wds_->GetCreditCards(&consumer2);
    486   MessageLoop::current()->Run();
    487   EXPECT_EQ(handle2, consumer2.handle());
    488   ASSERT_EQ(2U, consumer2.result().size());
    489   EXPECT_NE(card1, *consumer2.result()[0]);
    490   EXPECT_EQ(card1_changed, *consumer2.result()[0]);
    491   EXPECT_EQ(card2, *consumer2.result()[1]);
    492   STLDeleteElements(&consumer2.result());
    493 }
    494 
    495 TEST_F(WebDataServiceAutofillTest, AutofillRemoveModifiedBetween) {
    496   // Add a profile.
    497   EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)).
    498       Times(1).
    499       WillOnce(SignalEvent(&done_event_));
    500   AutofillProfile profile;
    501   wds_->AddAutofillProfile(profile);
    502   done_event_.TimedWait(test_timeout_);
    503 
    504   // Check that it was added.
    505   AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> >
    506       profile_consumer;
    507   WebDataService::Handle handle = wds_->GetAutofillProfiles(&profile_consumer);
    508   MessageLoop::current()->Run();
    509   EXPECT_EQ(handle, profile_consumer.handle());
    510   ASSERT_EQ(1U, profile_consumer.result().size());
    511   EXPECT_EQ(profile, *profile_consumer.result()[0]);
    512   STLDeleteElements(&profile_consumer.result());
    513 
    514   // Add a credit card.
    515   EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)).
    516       WillOnce(SignalEvent(&done_event_));
    517   CreditCard credit_card;
    518   wds_->AddCreditCard(credit_card);
    519   done_event_.TimedWait(test_timeout_);
    520 
    521   // Check that it was added.
    522   AutofillWebDataServiceConsumer<std::vector<CreditCard*> >
    523       card_consumer;
    524   handle = wds_->GetCreditCards(&card_consumer);
    525   MessageLoop::current()->Run();
    526   EXPECT_EQ(handle, card_consumer.handle());
    527   ASSERT_EQ(1U, card_consumer.result().size());
    528   EXPECT_EQ(credit_card, *card_consumer.result()[0]);
    529   STLDeleteElements(&card_consumer.result());
    530 
    531   // Check that GUID-based notification was sent for the profile.
    532   const AutofillProfileChange expected_profile_change(
    533       AutofillProfileChange::REMOVE, profile.guid(), NULL);
    534   EXPECT_CALL(
    535       *observer_helper_->observer(),
    536       Observe(NotificationType(NotificationType::AUTOFILL_PROFILE_CHANGED),
    537               Source<WebDataService>(wds_.get()),
    538               Property(&Details<const AutofillProfileChange>::ptr,
    539                        Pointee(expected_profile_change)))).
    540       WillOnce(SignalEvent(&done_event_));
    541 
    542   // Check that GUID-based notification was sent for the credit card.
    543   const AutofillCreditCardChange expected_card_change(
    544       AutofillCreditCardChange::REMOVE, credit_card.guid(), NULL);
    545   EXPECT_CALL(
    546       *observer_helper_->observer(),
    547       Observe(
    548           NotificationType(NotificationType::AUTOFILL_CREDIT_CARD_CHANGED),
    549               Source<WebDataService>(wds_.get()),
    550               Property(&Details<const AutofillCreditCardChange>::ptr,
    551                        Pointee(expected_card_change)))).
    552       WillOnce(SignalEvent(&done_event_));
    553 
    554   // Remove the profile using time range of "all time".
    555   wds_->RemoveAutofillProfilesAndCreditCardsModifiedBetween(Time(), Time());
    556   done_event_.TimedWait(test_timeout_);
    557   done_event_.TimedWait(test_timeout_);
    558 
    559   // Check that the profile was removed.
    560   AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> >
    561       profile_consumer2;
    562   WebDataService::Handle handle2 =
    563       wds_->GetAutofillProfiles(&profile_consumer2);
    564   MessageLoop::current()->Run();
    565   EXPECT_EQ(handle2, profile_consumer2.handle());
    566   ASSERT_EQ(0U, profile_consumer2.result().size());
    567 
    568   // Check that the credit card was removed.
    569   AutofillWebDataServiceConsumer<std::vector<CreditCard*> >
    570       card_consumer2;
    571   handle2 = wds_->GetCreditCards(&card_consumer2);
    572   MessageLoop::current()->Run();
    573   EXPECT_EQ(handle2, card_consumer2.handle());
    574   ASSERT_EQ(0U, card_consumer2.result().size());
    575 }
    576