1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_vector.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/path_service.h" 15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/stl_util-inl.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string16.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/synchronization/waitable_event.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/autofill_profile.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/credit_card.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/webdata/autofill_change.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/webdata/autofill_entry.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/webdata/web_data_service.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/webdata/web_data_service_test_util.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h" 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/common/guid.h" 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/thread_observer_helper.h" 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h" 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h" 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gmock/include/gmock/gmock.h" 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/form_field.h" 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing base::Time; 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing base::TimeDelta; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing base::WaitableEvent; 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::_; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::DoDefault; 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::ElementsAreArray; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Pointee; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::Property; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef std::vector<AutofillChange> AutofillChangeList; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const int kWebDataServiceTimeoutSeconds = 8; 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochACTION_P(SignalEvent, event) { 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch event->Signal(); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutofillDBThreadObserverHelper : public DBThreadObserverHelper { 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void RegisterObservers() { 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(&observer_, 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::AUTOFILL_ENTRIES_CHANGED, 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::AllSources()); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(&observer_, 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::AUTOFILL_PROFILE_CHANGED, 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::AllSources()); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch registrar_.Add(&observer_, 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::AUTOFILL_CREDIT_CARD_CHANGED, 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::AllSources()); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WebDataServiceTest : public testing::Test { 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceTest() 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : ui_thread_(BrowserThread::UI, &message_loop_), 74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick db_thread_(BrowserThread::DB) {} 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetUp() { 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_thread_.Start(); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PathService::Get(chrome::DIR_TEST_DATA, &profile_dir_); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string test_profile = "WebDataServiceTest"; 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile_dir_ = profile_dir_.AppendASCII(test_profile); 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_util::Delete(profile_dir_, true); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_util::CreateDirectory(profile_dir_); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch wds_ = new WebDataService(); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch wds_->Init(profile_dir_); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void TearDown() { 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (wds_.get()) 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch wds_->Shutdown(); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_util::Delete(profile_dir_, true); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_thread_.Stop(); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->Run(); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoopForUI message_loop_; 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread ui_thread_; 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread db_thread_; 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath profile_dir_; 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<WebDataService> wds_; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WebDataServiceAutofillTest : public WebDataServiceTest { 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceAutofillTest() 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : WebDataServiceTest(), 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unique_id1_(1), 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unique_id2_(2), 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_timeout_(TimeDelta::FromSeconds(kWebDataServiceTimeoutSeconds)), 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_(false, false) {} 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetUp() { 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceTest::SetUp(); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch name1_ = ASCIIToUTF16("name1"); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch name2_ = ASCIIToUTF16("name2"); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch value1_ = ASCIIToUTF16("value1"); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch value2_ = ASCIIToUTF16("value2"); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch observer_helper_ = new AutofillDBThreadObserverHelper(); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch observer_helper_->Init(); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void TearDown() { 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Release this first so it can get destructed on the db thread. 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch observer_helper_ = NULL; 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataServiceTest::TearDown(); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void AppendFormField(const string16& name, 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16& value, 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<webkit_glue::FormField>* form_fields) { 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch form_fields->push_back( 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch webkit_glue::FormField(string16(), 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch name, 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch value, 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16(), 140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 0, 141201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch false)); 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 name1_; 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 name2_; 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 value1_; 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 value2_; 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int unique_id1_, unique_id2_; 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const TimeDelta test_timeout_; 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<AutofillDBThreadObserverHelper> observer_helper_; 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WaitableEvent done_event_; 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebDataServiceAutofillTest, FormFillAdd) { 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const AutofillChange expected_changes[] = { 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillChange(AutofillChange::ADD, AutofillKey(name1_, value1_)), 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillChange(AutofillChange::ADD, AutofillKey(name2_, value2_)) 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This will verify that the correct notification is triggered, 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // passing the correct list of autofill keys in the details. 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL( 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *observer_helper_->observer(), 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Observe(NotificationType(NotificationType::AUTOFILL_ENTRIES_CHANGED), 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(wds_.get()), 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Property(&Details<const AutofillChangeList>::ptr, 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pointee(ElementsAreArray(expected_changes))))). 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WillOnce(SignalEvent(&done_event_)); 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<webkit_glue::FormField> form_fields; 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendFormField(name1_, value1_, &form_fields); 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendFormField(name2_, value2_, &form_fields); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch wds_->AddFormFields(form_fields); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The event will be signaled when the mock observer is notified. 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_.TimedWait(test_timeout_); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillWebDataServiceConsumer<std::vector<string16> > consumer; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WebDataService::Handle handle; 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const int limit = 10; 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch handle = wds_->GetFormValuesForElementName( 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch name1_, string16(), limit, &consumer); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The message loop will exit when the consumer is called. 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->Run(); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(handle, consumer.handle()); 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(1U, consumer.result().size()); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(value1_, consumer.result()[0]); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebDataServiceAutofillTest, FormFillRemoveOne) { 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // First add some values to autofill. 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)). 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WillOnce(SignalEvent(&done_event_)); 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<webkit_glue::FormField> form_fields; 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendFormField(name1_, value1_, &form_fields); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch wds_->AddFormFields(form_fields); 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The event will be signaled when the mock observer is notified. 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_.TimedWait(test_timeout_); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This will verify that the correct notification is triggered, 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // passing the correct list of autofill keys in the details. 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const AutofillChange expected_changes[] = { 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillChange(AutofillChange::REMOVE, AutofillKey(name1_, value1_)) 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL( 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *observer_helper_->observer(), 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Observe(NotificationType(NotificationType::AUTOFILL_ENTRIES_CHANGED), 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(wds_.get()), 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Property(&Details<const AutofillChangeList>::ptr, 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pointee(ElementsAreArray(expected_changes))))). 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WillOnce(SignalEvent(&done_event_)); 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch wds_->RemoveFormValueForElementName(name1_, value1_); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The event will be signaled when the mock observer is notified. 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_.TimedWait(test_timeout_); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WebDataServiceAutofillTest, FormFillRemoveMany) { 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TimeDelta one_day(TimeDelta::FromDays(1)); 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Time t = Time::Now(); 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)). 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WillOnce(SignalEvent(&done_event_)); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<webkit_glue::FormField> form_fields; 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendFormField(name1_, value1_, &form_fields); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AppendFormField(name2_, value2_, &form_fields); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch wds_->AddFormFields(form_fields); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The event will be signaled when the mock observer is notified. 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_.TimedWait(test_timeout_); 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This will verify that the correct notification is triggered, 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // passing the correct list of autofill keys in the details. 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const AutofillChange expected_changes[] = { 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillChange(AutofillChange::REMOVE, AutofillKey(name1_, value1_)), 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutofillChange(AutofillChange::REMOVE, AutofillKey(name2_, value2_)) 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL( 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *observer_helper_->observer(), 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Observe(NotificationType(NotificationType::AUTOFILL_ENTRIES_CHANGED), 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(wds_.get()), 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Property(&Details<const AutofillChangeList>::ptr, 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pointee(ElementsAreArray(expected_changes))))). 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WillOnce(SignalEvent(&done_event_)); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch wds_->RemoveFormElementsAddedBetween(t, t + one_day); 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The event will be signaled when the mock observer is notified. 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_.TimedWait(test_timeout_); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 254dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(WebDataServiceAutofillTest, ProfileAdd) { 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile profile; 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Check that GUID-based notification was sent. 258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const AutofillProfileChange expected_change( 259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillProfileChange::ADD, profile.guid(), &profile); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL( 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *observer_helper_->observer(), 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Observe(NotificationType(NotificationType::AUTOFILL_PROFILE_CHANGED), 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(wds_.get()), 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Property(&Details<const AutofillProfileChange>::ptr, 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pointee(expected_change)))). 266dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen WillOnce(SignalEvent(&done_event_)); 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wds_->AddAutofillProfile(profile); 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_.TimedWait(test_timeout_); 270513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 271513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Check that it was added. 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > consumer; 273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebDataService::Handle handle = wds_->GetAutofillProfiles(&consumer); 274513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch MessageLoop::current()->Run(); 275513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(handle, consumer.handle()); 276513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_EQ(1U, consumer.result().size()); 277513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(profile, *consumer.result()[0]); 278513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch STLDeleteElements(&consumer.result()); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 281dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(WebDataServiceAutofillTest, ProfileRemove) { 282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile profile; 283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Add a profile. 285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)). 286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Times(1). 287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WillOnce(SignalEvent(&done_event_)); 288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wds_->AddAutofillProfile(profile); 289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick done_event_.TimedWait(test_timeout_); 290731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Check that it was added. 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > consumer; 293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebDataService::Handle handle = wds_->GetAutofillProfiles(&consumer); 294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MessageLoop::current()->Run(); 295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(handle, consumer.handle()); 296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_EQ(1U, consumer.result().size()); 297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(profile, *consumer.result()[0]); 298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick STLDeleteElements(&consumer.result()); 299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 300dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Check that GUID-based notification was sent. 301dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const AutofillProfileChange expected_change( 302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillProfileChange::REMOVE, profile.guid(), NULL); 303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL( 304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *observer_helper_->observer(), 305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Observe(NotificationType(NotificationType::AUTOFILL_PROFILE_CHANGED), 306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Source<WebDataService>(wds_.get()), 307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Property(&Details<const AutofillProfileChange>::ptr, 308513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Pointee(expected_change)))). 309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen WillOnce(SignalEvent(&done_event_)); 310513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 311513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Remove the profile. 312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wds_->RemoveAutofillProfile(profile.guid()); 313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick done_event_.TimedWait(test_timeout_); 314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Check that it was removed. 316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > consumer2; 317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebDataService::Handle handle2 = wds_->GetAutofillProfiles(&consumer2); 318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MessageLoop::current()->Run(); 319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(handle2, consumer2.handle()); 320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_EQ(0U, consumer2.result().size()); 321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 322731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 323dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(WebDataServiceAutofillTest, ProfileUpdate) { 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile profile1; 325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile1.SetInfo(NAME_FIRST, ASCIIToUTF16("Abe")); 326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile profile2; 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile2.SetInfo(NAME_FIRST, ASCIIToUTF16("Alice")); 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)). 330513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch WillOnce(DoDefault()). 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WillOnce(SignalEvent(&done_event_)); 332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wds_->AddAutofillProfile(profile1); 333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wds_->AddAutofillProfile(profile2); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_.TimedWait(test_timeout_); 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Check that they were added. 337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > consumer; 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebDataService::Handle handle = wds_->GetAutofillProfiles(&consumer); 339513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch MessageLoop::current()->Run(); 340513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(handle, consumer.handle()); 341513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_EQ(2U, consumer.result().size()); 342513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(profile1, *consumer.result()[0]); 343513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(profile2, *consumer.result()[1]); 344513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch STLDeleteElements(&consumer.result()); 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile profile1_changed(profile1); 347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile1_changed.SetInfo(NAME_FIRST, ASCIIToUTF16("Bill")); 348dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const AutofillProfileChange expected_change( 349dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillProfileChange::UPDATE, profile1.guid(), &profile1_changed); 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL( 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *observer_helper_->observer(), 353dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Observe(NotificationType(NotificationType::AUTOFILL_PROFILE_CHANGED), 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(wds_.get()), 355dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Property(&Details<const AutofillProfileChange>::ptr, 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pointee(expected_change)))). 357dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen WillOnce(SignalEvent(&done_event_)); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 359513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Update the profile. 360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wds_->UpdateAutofillProfile(profile1_changed); 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_.TimedWait(test_timeout_); 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 363513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Check that the updates were made. 364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > consumer2; 365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebDataService::Handle handle2 = wds_->GetAutofillProfiles(&consumer2); 366513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch MessageLoop::current()->Run(); 367513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(handle2, consumer2.handle()); 368513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_EQ(2U, consumer2.result().size()); 369513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_NE(profile1, *consumer2.result()[0]); 370513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(profile1_changed, *consumer2.result()[0]); 371513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(profile2, *consumer2.result()[1]); 372513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch STLDeleteElements(&consumer2.result()); 373513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 375dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(WebDataServiceAutofillTest, CreditAdd) { 376513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CreditCard card; 377dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const AutofillCreditCardChange expected_change( 378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillCreditCardChange::ADD, card.guid(), &card); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL( 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *observer_helper_->observer(), 382513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Observe( 383dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotificationType(NotificationType::AUTOFILL_CREDIT_CARD_CHANGED), 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(wds_.get()), 385dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Property(&Details<const AutofillCreditCardChange>::ptr, 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pointee(expected_change)))). 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WillOnce(SignalEvent(&done_event_)); 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 389dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen wds_->AddCreditCard(card); 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_.TimedWait(test_timeout_); 391513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 392513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Check that it was added. 393513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch AutofillWebDataServiceConsumer<std::vector<CreditCard*> > consumer; 394513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch WebDataService::Handle handle = wds_->GetCreditCards(&consumer); 395513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch MessageLoop::current()->Run(); 396513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(handle, consumer.handle()); 397513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_EQ(1U, consumer.result().size()); 398513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(card, *consumer.result()[0]); 399513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch STLDeleteElements(&consumer.result()); 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 402dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(WebDataServiceAutofillTest, CreditCardRemove) { 403513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CreditCard credit_card; 404731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 405731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Add a credit card. 406731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)). 407731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WillOnce(SignalEvent(&done_event_)); 408dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen wds_->AddCreditCard(credit_card); 409731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick done_event_.TimedWait(test_timeout_); 410731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 411731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Check that it was added. 412731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AutofillWebDataServiceConsumer<std::vector<CreditCard*> > consumer; 413731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebDataService::Handle handle = wds_->GetCreditCards(&consumer); 414731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MessageLoop::current()->Run(); 415731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(handle, consumer.handle()); 416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_EQ(1U, consumer.result().size()); 417513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(credit_card, *consumer.result()[0]); 418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick STLDeleteElements(&consumer.result()); 419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Remove the credit card. 421dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const AutofillCreditCardChange expected_change( 422dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillCreditCardChange::REMOVE, credit_card.guid(), NULL); 423731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_CALL( 424731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *observer_helper_->observer(), 425513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Observe( 426dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotificationType(NotificationType::AUTOFILL_CREDIT_CARD_CHANGED), 427731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Source<WebDataService>(wds_.get()), 428dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Property(&Details<const AutofillCreditCardChange>::ptr, 429731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Pointee(expected_change)))). 430731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WillOnce(SignalEvent(&done_event_)); 431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen wds_->RemoveCreditCard(credit_card.guid()); 432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick done_event_.TimedWait(test_timeout_); 433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Check that it was removed. 435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AutofillWebDataServiceConsumer<std::vector<CreditCard*> > consumer2; 436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WebDataService::Handle handle2 = wds_->GetCreditCards(&consumer2); 437731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MessageLoop::current()->Run(); 438731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_EQ(handle2, consumer2.handle()); 439731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_EQ(0U, consumer2.result().size()); 440731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 441731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 442dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(WebDataServiceAutofillTest, CreditUpdate) { 443513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CreditCard card1; 444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen card1.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Abe")); 445513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CreditCard card2; 446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen card2.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Alice")); 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)). 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Times(2). 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WillOnce(DoDefault()). 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WillOnce(SignalEvent(&done_event_)); 452dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen wds_->AddCreditCard(card1); 453dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen wds_->AddCreditCard(card2); 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_.TimedWait(test_timeout_); 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 456513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Check that they got added. 457513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch AutofillWebDataServiceConsumer<std::vector<CreditCard*> > consumer; 458513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch WebDataService::Handle handle = wds_->GetCreditCards(&consumer); 459513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch MessageLoop::current()->Run(); 460513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(handle, consumer.handle()); 461513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_EQ(2U, consumer.result().size()); 462513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(card1, *consumer.result()[0]); 463513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(card2, *consumer.result()[1]); 464513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch STLDeleteElements(&consumer.result()); 465513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 466513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch CreditCard card1_changed(card1); 467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen card1_changed.SetInfo(CREDIT_CARD_NAME, ASCIIToUTF16("Bill")); 468dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const AutofillCreditCardChange expected_change( 469dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen AutofillCreditCardChange::UPDATE, card1.guid(), &card1_changed); 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_CALL( 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *observer_helper_->observer(), 473513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch Observe( 474dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotificationType(NotificationType::AUTOFILL_CREDIT_CARD_CHANGED), 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<WebDataService>(wds_.get()), 476dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Property(&Details<const AutofillCreditCardChange>::ptr, 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Pointee(expected_change)))). 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch WillOnce(SignalEvent(&done_event_)); 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 480dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen wds_->UpdateCreditCard(card1_changed); 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch done_event_.TimedWait(test_timeout_); 482513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 483513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Check that the updates were made. 484513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch AutofillWebDataServiceConsumer<std::vector<CreditCard*> > consumer2; 485513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch WebDataService::Handle handle2 = wds_->GetCreditCards(&consumer2); 486513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch MessageLoop::current()->Run(); 487513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(handle2, consumer2.handle()); 488513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASSERT_EQ(2U, consumer2.result().size()); 489513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_NE(card1, *consumer2.result()[0]); 490513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(card1_changed, *consumer2.result()[0]); 491513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch EXPECT_EQ(card2, *consumer2.result()[1]); 492513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch STLDeleteElements(&consumer2.result()); 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(WebDataServiceAutofillTest, AutofillRemoveModifiedBetween) { 496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add a profile. 497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)). 498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Times(1). 499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WillOnce(SignalEvent(&done_event_)); 500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile profile; 501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wds_->AddAutofillProfile(profile); 502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen done_event_.TimedWait(test_timeout_); 503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 504ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Check that it was added. 505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > 506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_consumer; 507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebDataService::Handle handle = wds_->GetAutofillProfiles(&profile_consumer); 508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoop::current()->Run(); 509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(handle, profile_consumer.handle()); 510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(1U, profile_consumer.result().size()); 511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(profile, *profile_consumer.result()[0]); 512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen STLDeleteElements(&profile_consumer.result()); 513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add a credit card. 515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(*observer_helper_->observer(), Observe(_, _, _)). 516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WillOnce(SignalEvent(&done_event_)); 517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreditCard credit_card; 518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wds_->AddCreditCard(credit_card); 519ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen done_event_.TimedWait(test_timeout_); 520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Check that it was added. 522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillWebDataServiceConsumer<std::vector<CreditCard*> > 523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen card_consumer; 524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen handle = wds_->GetCreditCards(&card_consumer); 525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoop::current()->Run(); 526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(handle, card_consumer.handle()); 527ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(1U, card_consumer.result().size()); 528ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(credit_card, *card_consumer.result()[0]); 529ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen STLDeleteElements(&card_consumer.result()); 530ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 531ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Check that GUID-based notification was sent for the profile. 532ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const AutofillProfileChange expected_profile_change( 533ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfileChange::REMOVE, profile.guid(), NULL); 534ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL( 535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *observer_helper_->observer(), 536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Observe(NotificationType(NotificationType::AUTOFILL_PROFILE_CHANGED), 537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Source<WebDataService>(wds_.get()), 538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Property(&Details<const AutofillProfileChange>::ptr, 539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Pointee(expected_profile_change)))). 540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WillOnce(SignalEvent(&done_event_)); 541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Check that GUID-based notification was sent for the credit card. 543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const AutofillCreditCardChange expected_card_change( 544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillCreditCardChange::REMOVE, credit_card.guid(), NULL); 545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL( 546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *observer_helper_->observer(), 547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Observe( 548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NotificationType(NotificationType::AUTOFILL_CREDIT_CARD_CHANGED), 549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Source<WebDataService>(wds_.get()), 550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Property(&Details<const AutofillCreditCardChange>::ptr, 551ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Pointee(expected_card_change)))). 552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WillOnce(SignalEvent(&done_event_)); 553ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 554ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Remove the profile using time range of "all time". 555ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wds_->RemoveAutofillProfilesAndCreditCardsModifiedBetween(Time(), Time()); 556ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen done_event_.TimedWait(test_timeout_); 557ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen done_event_.TimedWait(test_timeout_); 558ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Check that the profile was removed. 560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillWebDataServiceConsumer<std::vector<AutofillProfile*> > 561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_consumer2; 562ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen WebDataService::Handle handle2 = 563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen wds_->GetAutofillProfiles(&profile_consumer2); 564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoop::current()->Run(); 565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(handle2, profile_consumer2.handle()); 566ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(0U, profile_consumer2.result().size()); 567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 568ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Check that the credit card was removed. 569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillWebDataServiceConsumer<std::vector<CreditCard*> > 570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen card_consumer2; 571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen handle2 = wds_->GetCreditCards(&card_consumer2); 572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MessageLoop::current()->Run(); 573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(handle2, card_consumer2.handle()); 574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(0U, card_consumer2.result().size()); 575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 576