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