profile_sync_service_autofill_unittest.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/token_service_factory.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/abstract_profile_sync_service_test.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/autofill_data_type_controller.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/autofill_profile_data_type_controller.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/data_type_controller.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/generic_change_processor.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/shared_change_processor.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_test_util.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test_profile_sync_service.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/autocomplete_syncable_service.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/autofill_profile_syncable_service.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_data_service_factory.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/autofill/browser/autofill_common_test.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/autofill/browser/personal_data_manager.h"
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/autofill/browser/webdata/autofill_change.h"
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/autofill/browser/webdata/autofill_entry.h"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/autofill/browser/webdata/autofill_table.h"
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/autofill/browser/webdata/autofill_webdata_service.h"
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_data_service_test_util.h"
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sync/internal_api/public/data_type_debug_info_listener.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/read_node.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/read_transaction.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/write_node.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/write_transaction.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/autofill_specifics.pb.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/mutable_entry.h"
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/syncable/syncable_write_transaction.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/test/engine/test_id_factory.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillChange;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillChangeList;
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillEntry;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillFieldType;
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillKey;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillProfile;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillProfileChange;
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillTable;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillWebDataService;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::PersonalDataManager;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::WaitableEvent;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::AutofillDataTypeController;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::AutofillProfileDataTypeController;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::DataTypeController;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::GenericChangeProcessor;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::SharedChangeProcessor;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::AUTOFILL;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::BaseNode;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::BASE_VERSION;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::CREATE;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::GET_BY_SERVER_TAG;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::MutableEntry;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::SERVER_SPECIFICS;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::SPECIFICS;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::UNITTEST;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::WriterTag;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::WriteTransaction;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ElementsAre;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::SetArgumentPointee;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class HistoryService;
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncable {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Id;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RunAndSignal(const base::Closure& cb, WaitableEvent* event) {
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  cb.Run();
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  event->Signal();
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillTableMock : public AutofillTable {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillTableMock() : AutofillTable("en-US") {}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(RemoveFormElement,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const string16& name, const string16& value));  // NOLINT
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetAllAutofillEntries,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(std::vector<AutofillEntry>* entries));  // NOLINT
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD3(GetAutofillTimestamps,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const string16& name,  // NOLINT
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const string16& value,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    std::vector<base::Time>* timestamps));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(UpdateAutofillEntries,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const std::vector<AutofillEntry>&));  // NOLINT
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetAutofillProfiles,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(std::vector<AutofillProfile*>*));  // NOLINT
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MOCK_METHOD1(UpdateAutofillProfile,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const AutofillProfile&));  // NOLINT
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(AddAutofillProfile,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const AutofillProfile&));  // NOLINT
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(RemoveAutofillProfile,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const std::string&));  // NOLINT
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(MatchProfiles, profile, "") {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (profile.Compare(arg) == 0);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebDatabaseFake : public WebDatabase {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit WebDatabaseFake(AutofillTable* autofill_table) {
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTable(autofill_table);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class MockAutofillBackend : public autofill::AutofillWebDataBackend {
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MockAutofillBackend(
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      WebDatabase* web_database,
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const base::Closure& on_changed)
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : web_database_(web_database),
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        on_changed_(on_changed) {
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~MockAutofillBackend() {}
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual WebDatabase* GetDatabase() OVERRIDE { return web_database_; }
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void AddObserver(
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      autofill::AutofillWebDataServiceObserverOnDBThread* observer) OVERRIDE {}
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void RemoveObserver(
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      autofill::AutofillWebDataServiceObserverOnDBThread* observer) OVERRIDE {}
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void RemoveExpiredFormElements() OVERRIDE {}
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void NotifyOfMultipleAutofillChanges() OVERRIDE {
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, on_changed_);
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebDatabase* web_database_;
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::Closure on_changed_;
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceAutofillTest;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<class AutofillProfile>
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelType GetModelType() {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::UNSPECIFIED;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<>
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelType GetModelType<AutofillEntry>() {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::AUTOFILL;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<>
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelType GetModelType<AutofillProfile>() {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::AUTOFILL_PROFILE;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TokenWebDataServiceFake : public TokenWebData {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TokenWebDataServiceFake()
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : TokenWebData() {
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsDatabaseLoaded() OVERRIDE {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebDataService::Handle GetAllTokens(
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebDataServiceConsumer* consumer) OVERRIDE {
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(tim): It would be nice if WebDataService was injected on
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // construction of TokenService rather than fetched by Initialize so that
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // this isn't necessary (we could pass a NULL service). We currently do
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // return it via EXPECT_CALLs, but without depending on order-of-
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // initialization (which seems way more fragile) we can't tell which
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // component is asking at what time, and some components in these Autofill
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // tests require a WebDataService.
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TokenWebDataServiceFake() {}
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TokenWebDataServiceFake);
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebDataServiceFake : public AutofillWebDataService {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebDataServiceFake()
222a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      : AutofillWebDataService(),
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_database_(NULL),
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        autocomplete_syncable_service_(NULL),
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        autofill_profile_syncable_service_(NULL),
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        syncable_service_created_or_destroyed_(false, false) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDatabase(WebDatabase* web_database) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_database_ = web_database;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartSyncableService() {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The |autofill_profile_syncable_service_| must be constructed on the DB
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // thread.
23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const base::Closure& on_changed_callback = base::Bind(
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        &WebDataServiceFake::NotifyAutofillMultipleChangedOnUIThread,
23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        AsWeakPtr());
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&WebDataServiceFake::CreateSyncableService,
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   base::Unretained(this),
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   on_changed_callback));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Wait();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShutdownSyncableService() {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The |autofill_profile_syncable_service_| must be destructed on the DB
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // thread.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&WebDataServiceFake::DestroySyncableService,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Wait();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsDatabaseLoaded() OVERRIDE {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebDatabase* GetDatabase() OVERRIDE {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return web_database_;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnAutofillEntriesChanged(const AutofillChangeList& changes) {
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WaitableEvent event(true, false);
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::Closure notify_cb =
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&AutocompleteSyncableService::AutofillEntriesChanged,
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   base::Unretained(autocomplete_syncable_service_),
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   changes);
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    BrowserThread::PostTask(
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        BrowserThread::DB,
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE,
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&RunAndSignal, notify_cb, &event));
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event.Wait();
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnAutofillProfileChanged(const AutofillProfileChange& changes) {
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WaitableEvent event(true, false);
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::Closure notify_cb =
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&AutocompleteSyncableService::AutofillProfileChanged,
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   base::Unretained(autofill_profile_syncable_service_),
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   changes);
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    BrowserThread::PostTask(
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        BrowserThread::DB,
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE,
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&RunAndSignal, notify_cb, &event));
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event.Wait();
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebDataServiceFake() {}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void CreateSyncableService(const base::Closure& on_changed_callback) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // These services are deleted in DestroySyncableService().
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    backend_.reset(new MockAutofillBackend(
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetDatabase(), on_changed_callback));
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AutocompleteSyncableService::CreateForWebDataServiceAndBackend(
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        this, backend_.get());
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AutofillProfileSyncableService::CreateForWebDataServiceAndBackend(
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        this, backend_.get(), "en-US");
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autocomplete_syncable_service_ =
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AutocompleteSyncableService::FromWebDataService(this);
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_profile_syncable_service_ =
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AutofillProfileSyncableService::FromWebDataService(this);
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Signal();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DestroySyncableService() {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autocomplete_syncable_service_ = NULL;
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_profile_syncable_service_ = NULL;
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    backend_.reset();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Signal();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDatabase* web_database_;
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSyncableService* autocomplete_syncable_service_;
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillProfileSyncableService* autofill_profile_syncable_service_;
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<autofill::AutofillWebDataBackend> backend_;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitableEvent syncable_service_created_or_destroyed_;
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebDataServiceFake);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)BrowserContextKeyedService* BuildMockWebDataServiceWrapper(
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* profile) {
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new MockWebDataServiceWrapper(
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      NULL,
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new WebDataServiceFake(),
33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new TokenWebDataServiceFake());
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(MakeAutocompleteSyncComponents, wds) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::DB))
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::WeakPtr<syncer::SyncableService>();
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return AutocompleteSyncableService::FromWebDataService(wds)->AsWeakPtr();
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_P(ReturnNewDataTypeManagerWithDebugListener, debug_listener) {
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new browser_sync::DataTypeManagerImpl(
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      debug_listener,
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg1,
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg2,
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg3,
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      arg4,
353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      arg5);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(MakeGenericChangeProcessor) {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::UserShare* user_share = arg0->GetUserShare();
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new GenericChangeProcessor(
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg1,
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg2,
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg3,
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user_share);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(MakeSharedChangeProcessor) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new SharedChangeProcessor();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(MakeAutofillProfileSyncComponents, wds) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::DB))
372a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return base::WeakPtr<syncer::SyncableService>();
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return AutofillProfileSyncableService::FromWebDataService(wds)->AsWeakPtr();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AbstractAutofillFactory {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DataTypeController* CreateDataTypeController(
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncComponentsFactory* factory,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileMock* profile,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncService* service) = 0;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExpectation(ProfileSyncComponentsFactoryMock* factory,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ProfileSyncService* service,
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              AutofillWebDataService* wds,
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              DataTypeController* dtc) = 0;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AbstractAutofillFactory() {}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillEntryFactory : public AbstractAutofillFactory {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual browser_sync::DataTypeController* CreateDataTypeController(
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncComponentsFactory* factory,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileMock* profile,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncService* service) OVERRIDE {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new AutofillDataTypeController(factory, profile, service);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExpectation(ProfileSyncComponentsFactoryMock* factory,
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ProfileSyncService* service,
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              AutofillWebDataService* wds,
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              DataTypeController* dtc) OVERRIDE {
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*factory, CreateGenericChangeProcessor(_,_,_,_)).
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeGenericChangeProcessor());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*factory, CreateSharedChangeProcessor()).
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeSharedChangeProcessor());
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*factory, GetSyncableServiceForType(syncer::AUTOFILL)).
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeAutocompleteSyncComponents(wds));
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillProfileFactory : public AbstractAutofillFactory {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual browser_sync::DataTypeController* CreateDataTypeController(
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncComponentsFactory* factory,
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileMock* profile,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncService* service) OVERRIDE {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new AutofillProfileDataTypeController(factory, profile, service);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExpectation(ProfileSyncComponentsFactoryMock* factory,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ProfileSyncService* service,
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              AutofillWebDataService* wds,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              DataTypeController* dtc) OVERRIDE {
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*factory, CreateGenericChangeProcessor(_,_,_,_)).
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeGenericChangeProcessor());
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*factory, CreateSharedChangeProcessor()).
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeSharedChangeProcessor());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*factory,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetSyncableServiceForType(syncer::AUTOFILL_PROFILE)).
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeAutofillProfileSyncComponents(wds));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockPersonalDataManager : public PersonalDataManager {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockPersonalDataManager() : PersonalDataManager("en-US") {}
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsDataLoaded, bool());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(LoadProfiles, void());
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(LoadCreditCards, void());
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Refresh, void());
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MockPersonalDataManagerService
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public autofill::PersonalDataManagerService {
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
44690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static BrowserContextKeyedService* Build(content::BrowserContext* profile) {
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new MockPersonalDataManagerService();
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockPersonalDataManagerService() {
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    personal_data_manager_.reset(new MockPersonalDataManager());
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockPersonalDataManagerService() {}
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Shutdown() OVERRIDE {
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    personal_data_manager_.reset();
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual MockPersonalDataManager* GetPersonalDataManager() OVERRIDE {
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return personal_data_manager_.get();
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<MockPersonalDataManager> personal_data_manager_;
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockPersonalDataManagerService);
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T> class AddAutofillHelper;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProfileSyncServiceAutofillTest
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   : public AbstractProfileSyncServiceTest,
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     public syncer::DataTypeDebugInfoListener {
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DataTypeDebugInfoListener implementation.
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnSingleDataTypeConfigureComplete(
476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const syncer::DataTypeConfigurationStats& configuration_stats) OVERRIDE {
477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    association_stats_ = configuration_stats.association_stats;
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnConfigureComplete() OVERRIDE {
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Do nothing.
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileSyncServiceAutofillTest()
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   : debug_ptr_factory_(this) {
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ProfileSyncServiceAutofillTest() {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfileFactory profile_factory_;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntryFactory entry_factory_;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AbstractAutofillFactory* GetFactory(syncer::ModelType type) {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == syncer::AUTOFILL) {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return &entry_factory_;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (type == syncer::AUTOFILL_PROFILE) {
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return &profile_factory_;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractProfileSyncServiceTest::SetUp();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset(new ProfileMock());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_->CreateRequestContext();
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_database_.reset(new WebDatabaseFake(&autofill_table_));
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockWebDataServiceWrapper* wrapper =
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<MockWebDataServiceWrapper*>(
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            WebDataServiceFactory::GetInstance()->SetTestingFactoryAndUse(
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                profile_.get(), BuildMockWebDataServiceWrapper));
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_data_service_ =
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<WebDataServiceFake*>(wrapper->GetAutofillWebData().get());
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->SetDatabase(web_database_.get());
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockPersonalDataManagerService* personal_data_manager_service =
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<MockPersonalDataManagerService*>(
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            autofill::PersonalDataManagerFactory::GetInstance()
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                ->SetTestingFactoryAndUse(
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    profile_.get(), MockPersonalDataManagerService::Build));
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    personal_data_manager_ =
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        personal_data_manager_service->GetPersonalDataManager();
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    token_service_ = static_cast<TokenService*>(
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        TokenServiceFactory::GetInstance()->SetTestingFactoryAndUse(
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            profile_.get(), BuildTokenService));
5287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ProfileOAuth2TokenServiceFactory::GetInstance()->SetTestingFactory(
5297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        profile_.get(), FakeOAuth2TokenService::BuildTokenService);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*personal_data_manager_, LoadProfiles()).Times(1);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*personal_data_manager_, LoadCreditCards()).Times(1);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    personal_data_manager_->Init(profile_.get());
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->StartSyncableService();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note: The tear down order is important.
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProfileSyncServiceFactory::GetInstance()->SetTestingFactory(
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        profile_.get(), NULL);
542868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    web_data_service_->ShutdownOnUIThread();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->ShutdownSyncableService();
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    web_data_service_ = NULL;
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_->ResetRequestContext();
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // To prevent a leak, fully release TestURLRequestContext to ensure its
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // destruction on the IO message loop.
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset();
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractProfileSyncServiceTest::TearDown();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int GetSyncCount(syncer::ModelType type) {
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadNode node(&trans);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (node.InitByTagLookup(syncer::ModelTypeToRootTag(type)) !=
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        syncer::BaseNode::INIT_OK)
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return 0;
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return node.GetTotalNodeCount() - 1;
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartSyncService(const base::Closure& callback,
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        bool will_fail_association,
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        syncer::ModelType type) {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractAutofillFactory* factory = GetFactory(type);
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SigninManagerBase* signin =
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SigninManagerFactory::GetForProfile(profile_.get());
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    signin->SetAuthenticatedUsername("test_user");
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_service_ = static_cast<TestProfileSyncService*>(
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            profile_.get(), &TestProfileSyncService::BuildAutoStartAsyncInit));
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_service_->set_backend_init_callback(callback);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProfileSyncComponentsFactoryMock* components =
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sync_service_->components_factory_mock();
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DataTypeController* data_type_controller =
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        factory->CreateDataTypeController(components,
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          profile_.get(),
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          sync_service_);
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    factory->SetExpectation(components,
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            sync_service_,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            web_data_service_.get(),
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            data_type_controller);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(*components, CreateDataTypeManager(_, _, _, _, _, _)).
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WillOnce(ReturnNewDataTypeManagerWithDebugListener(
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     syncer::MakeWeakHandle(debug_ptr_factory_.GetWeakPtr())));
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*personal_data_manager_, IsDataLoaded()).
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillRepeatedly(Return(true));
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     // We need tokens to get the tests going
5937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    token_service_->IssueAuthTokenForTest(
5947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        GaiaConstants::kGaiaOAuth2LoginRefreshToken, "oauth2_login_token");
5957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    token_service_->IssueAuthTokenForTest(
5967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        GaiaConstants::kSyncService, "token");
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_service_->RegisterDataTypeController(data_type_controller);
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_service_->Initialize();
60090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // It's possible this test triggered an unrecoverable error, in which case
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // we can't get the sync count.
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (sync_service_->ShouldPushChanges()) {
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(GetSyncCount(type),
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                association_stats_.num_sync_items_after_association);
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(association_stats_.num_sync_items_after_association,
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              association_stats_.num_sync_items_before_association +
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              association_stats_.num_sync_items_added -
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              association_stats_.num_sync_items_deleted);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddAutofillSyncNode(const AutofillEntry& entry) {
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (autofill_root.InitByTagLookup(
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            syncer::ModelTypeToRootTag(syncer::AUTOFILL)) !=
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                BaseNode::INIT_OK) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode node(&trans);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string tag = AutocompleteSyncableService::KeyToTag(
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UTF16ToUTF8(entry.key().name()), UTF16ToUTF8(entry.key().value()));
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode::InitUniqueByCreationResult result =
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node.InitUniqueByCreation(syncer::AUTOFILL, autofill_root, tag);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (result != syncer::WriteNode::INIT_SUCCESS)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::EntitySpecifics specifics;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutocompleteSyncableService::WriteAutofillEntry(entry, &specifics);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::AutofillSpecifics* autofill_specifics =
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        specifics.mutable_autofill();
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node.SetAutofillSpecifics(*autofill_specifics);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddAutofillSyncNode(const AutofillProfile& profile) {
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (autofill_root.InitByTagLookup(kAutofillProfileTag) !=
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            BaseNode::INIT_OK) {
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode node(&trans);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string tag = profile.guid();
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode::InitUniqueByCreationResult result =
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node.InitUniqueByCreation(syncer::AUTOFILL_PROFILE,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  autofill_root, tag);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (result != syncer::WriteNode::INIT_SUCCESS)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::EntitySpecifics specifics;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillProfileSyncableService::WriteAutofillProfile(profile, &specifics);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::AutofillProfileSpecifics* profile_specifics =
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        specifics.mutable_autofill_profile();
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node.SetAutofillProfileSpecifics(*profile_specifics);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetAutofillEntriesFromSyncDB(std::vector<AutofillEntry>* entries,
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    std::vector<AutofillProfile>* profiles) {
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (autofill_root.InitByTagLookup(
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            syncer::ModelTypeToRootTag(syncer::AUTOFILL)) !=
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                BaseNode::INIT_OK) {
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 child_id = autofill_root.GetFirstChildId();
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (child_id != syncer::kInvalidId) {
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ReadNode child_node(&trans);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (child_node.InitByIdLookup(child_id) != BaseNode::INIT_OK)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const sync_pb::AutofillSpecifics& autofill(
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          child_node.GetAutofillSpecifics());
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (autofill.has_value()) {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillKey key(UTF8ToUTF16(autofill.name()),
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        UTF8ToUTF16(autofill.value()));
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::vector<base::Time> timestamps;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int timestamps_count = autofill.usage_timestamp_size();
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (int i = 0; i < timestamps_count; ++i) {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          timestamps.push_back(Time::FromInternalValue(
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              autofill.usage_timestamp(i)));
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entries->push_back(AutofillEntry(key, timestamps));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (autofill.has_profile()) {
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfile p;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p.set_guid(autofill.profile().guid());
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfileSyncableService::OverwriteProfileWithServerData(
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            autofill.profile(), &p, "en-US");
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        profiles->push_back(p);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child_id = child_node.GetSuccessorId();
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetAutofillProfilesFromSyncDBUnderProfileNode(
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<AutofillProfile>* profiles) {
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (autofill_root.InitByTagLookup(kAutofillProfileTag) !=
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            BaseNode::INIT_OK) {
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 child_id = autofill_root.GetFirstChildId();
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (child_id != syncer::kInvalidId) {
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ReadNode child_node(&trans);
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (child_node.InitByIdLookup(child_id) != BaseNode::INIT_OK)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const sync_pb::AutofillProfileSpecifics& autofill(
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          child_node.GetAutofillProfileSpecifics());
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfile p;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p.set_guid(autofill.guid());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfileSyncableService::OverwriteProfileWithServerData(
722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            autofill, &p, "en-US");
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        profiles->push_back(p);
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child_id = child_node.GetSuccessorId();
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIdleChangeProcessorExpectations() {
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(autofill_table_, RemoveFormElement(_, _)).Times(0);
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(autofill_table_, GetAutofillTimestamps(_, _, _)).Times(0);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(autofill_table_, UpdateAutofillEntries(_)).Times(0);
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AutofillEntry MakeAutofillEntry(const char* name,
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const char* value,
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int time_shift0,
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int time_shift1) {
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Time deep in the past would cause Autocomplete sync to discard the
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // entries.
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static Time base_time = Time::Now().LocalMidnight();
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<Time> timestamps;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (time_shift0 > 0)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      timestamps.push_back(base_time + TimeDelta::FromSeconds(time_shift0));
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (time_shift1 > 0)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      timestamps.push_back(base_time + TimeDelta::FromSeconds(time_shift1));
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return AutofillEntry(
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillKey(ASCIIToUTF16(name), ASCIIToUTF16(value)), timestamps);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AutofillEntry MakeAutofillEntry(const char* name,
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const char* value,
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int time_shift) {
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MakeAutofillEntry(name, value, time_shift, -1);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AddAutofillHelper<AutofillEntry>;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AddAutofillHelper<AutofillProfile>;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class FakeServerUpdater;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ProfileMock> profile_;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillTableMock autofill_table_;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WebDatabaseFake> web_database_;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<WebDataServiceFake> web_data_service_;
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPersonalDataManager* personal_data_manager_;
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syncer::DataTypeAssociationStats association_stats_;
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<DataTypeDebugInfoListener> debug_ptr_factory_;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T>
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AddAutofillHelper {
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper(ProfileSyncServiceAutofillTest* test,
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const std::vector<T>& entries)
776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : callback_(base::Bind(&AddAutofillHelper::AddAutofillCallback,
777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             base::Unretained(this), test, entries)),
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        success_(false) {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Closure& callback() const { return callback_; }
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success() { return success_; }
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddAutofillCallback(ProfileSyncServiceAutofillTest* test,
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::vector<T>& entries) {
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!test->CreateRoot(GetModelType<T>()))
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < entries.size(); ++i) {
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!test->AddAutofillSyncNode(entries[i]))
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success_ = true;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure callback_;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success_;
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overload write transaction to use custom NotifyTransactionComplete
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WriteTransactionTest: public WriteTransaction {
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTransactionTest(const tracked_objects::Location& from_here,
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       WriterTag writer,
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       syncer::syncable::Directory* directory,
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       scoped_ptr<WaitableEvent>* wait_for_syncapi)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : WriteTransaction(from_here, writer, directory),
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wait_for_syncapi_(wait_for_syncapi) { }
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyTransactionComplete(
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelTypeSet types) OVERRIDE {
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is where we differ. Force a thread change here, giving another
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // thread a chance to create a WriteTransaction
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*wait_for_syncapi_)->Wait();
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteTransaction::NotifyTransactionComplete(types);
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent>* wait_for_syncapi_;
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Our fake server updater. Needs the RefCountedThreadSafe inheritance so we can
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// post tasks with it.
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeServerUpdater : public base::RefCountedThreadSafe<FakeServerUpdater> {
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeServerUpdater(TestProfileSyncService* service,
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    scoped_ptr<WaitableEvent>* wait_for_start,
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    scoped_ptr<WaitableEvent>* wait_for_syncapi)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : entry_(ProfileSyncServiceAutofillTest::MakeAutofillEntry("0", "0", 0)),
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        service_(service),
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wait_for_start_(wait_for_start),
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wait_for_syncapi_(wait_for_syncapi),
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_finished_(false, false) { }
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Update() {
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This gets called in a modelsafeworker thread.
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::UserShare* user_share = service_->GetUserShare();
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::syncable::Directory* directory = user_share->directory.get();
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create autofill protobuf.
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string tag = AutocompleteSyncableService::KeyToTag(
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UTF16ToUTF8(entry_.key().name()), UTF16ToUTF8(entry_.key().value()));
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::AutofillSpecifics new_autofill;
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_autofill.set_name(UTF16ToUTF8(entry_.key().name()));
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_autofill.set_value(UTF16ToUTF8(entry_.key().value()));
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<base::Time>& ts(entry_.timestamps());
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<base::Time>::const_iterator timestamp = ts.begin();
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         timestamp != ts.end(); ++timestamp) {
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_autofill.add_usage_timestamp(timestamp->ToInternalValue());
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::EntitySpecifics entity_specifics;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entity_specifics.mutable_autofill()->CopyFrom(new_autofill);
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Tell main thread we've started
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*wait_for_start_)->Signal();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Create write transaction.
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WriteTransactionTest trans(FROM_HERE, UNITTEST, directory,
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 wait_for_syncapi_);
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Create actual entry based on autofill protobuf information.
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Simulates effects of UpdateLocalDataFromServerData
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MutableEntry parent(&trans, GET_BY_SERVER_TAG,
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          syncer::ModelTypeToRootTag(syncer::AUTOFILL));
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MutableEntry item(&trans, CREATE, syncer::AUTOFILL,
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        parent.Get(syncer::syncable::ID), tag);
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(item.good());
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item.Put(SPECIFICS, entity_specifics);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item.Put(SERVER_SPECIFICS, entity_specifics);
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item.Put(BASE_VERSION, 1);
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::syncable::Id server_item_id =
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          service_->id_factory()->NewServerId();
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      item.Put(syncer::syncable::ID, server_item_id);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::syncable::Id new_predecessor;
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(item.PutPredecessor(new_predecessor));
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "FakeServerUpdater finishing.";
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_finished_.Signal();
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateNewEntry(const AutofillEntry& entry) {
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_ = entry;
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(BrowserThread::CurrentlyOn(BrowserThread::DB));
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!BrowserThread::PostTask(
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&FakeServerUpdater::Update, this))) {
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Failed to post task to the db thread.";
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateNewEntryAndWait(const AutofillEntry& entry) {
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_ = entry;
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(BrowserThread::CurrentlyOn(BrowserThread::DB));
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_finished_.Reset();
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         base::Bind(&FakeServerUpdater::Update, this))) {
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Failed to post task to the db thread.";
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_finished_.Wait();
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<FakeServerUpdater>;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~FakeServerUpdater() { }
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry entry_;
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProfileSyncService* service_;
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent>* wait_for_start_;
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent>* wait_for_syncapi_;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitableEvent is_finished_;
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::syncable::Id parent_id_;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks if the field of type |field_type| in |profile1| includes all values
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the field in |profile2|.
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IncludesField(const AutofillProfile& profile1,
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const AutofillProfile& profile2,
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   AutofillFieldType field_type) {
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<string16> values1;
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile1.GetRawMultiInfo(field_type, &values1);
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<string16> values2;
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile2.GetRawMultiInfo(field_type, &values2);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<string16> values_set;
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < values1.size(); ++i)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values_set.insert(values1[i]);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < values2.size(); ++i)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (values_set.find(values2[i]) == values_set.end())
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(skrul): Test abort startup.
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(skrul): Test processing of cloud changes.
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(tim): Add autofill data type controller test, and a case to cover
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//            waiting for the PersonalDataManager.
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, FailModelAssociation) {
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't create the root autofill node so startup fails.
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(base::Closure(), true, syncer::AUTOFILL);
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_service_->HasUnrecoverableError());
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, EmptyNativeEmptySync) {
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).WillOnce(Return(true));
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(create_root.success());
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_entries.size());
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_profiles.size());
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeEntriesEmptySync) {
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("foo", "bar", 1));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(entries), Return(true)));
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, entries.size());
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entries[0] == sync_entries[0]);
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_profiles.size());
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasProfileEmptySync) {
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> profiles;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> expected_profiles;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Owned by GetAutofillProfiles caller.
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* profile0 = new AutofillProfile;
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(profile0,
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "54B3F9AA-335E-4F71-A27D-719C41564230", "Billing",
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profiles.push_back(profile0);
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_profiles.push_back(*profile0);
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(profiles), Return(true)));
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL_PROFILE);
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL_PROFILE);
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(&sync_profiles));
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, sync_profiles.size());
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, expected_profiles[0].Compare(sync_profiles[0]));
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeWithDuplicatesEmptySync) {
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is buggy autofill code that allows duplicate name/value
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pairs to exist in the database with separate pair_ids.
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("foo", "bar", 1));
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("dup", "", 2));
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("dup", "", 3));
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(entries), Return(true)));
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, sync_entries.size());
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncNoMerge) {
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry native_entry(MakeAutofillEntry("native", "entry", 1));
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry sync_entry(MakeAutofillEntry("sync", "entry", 2));
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> native_entries;
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_entries.push_back(native_entry);
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(true)));
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_entries.push_back(sync_entry);
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillEntry> add_autofill(this, sync_entries);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, UpdateAutofillEntries(ElementsAre(sync_entry))).
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL);
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<AutofillEntry> expected_entries;
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_entries.insert(native_entry);
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_entries.insert(sync_entry);
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<AutofillEntry> new_sync_entries_set(new_sync_entries.begin(),
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               new_sync_entries.end());
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected_entries == new_sync_entries_set);
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncMergeEntry) {
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry native_entry(MakeAutofillEntry("merge", "entry", 1));
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry sync_entry(MakeAutofillEntry("merge", "entry", 2));
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry merged_entry(MakeAutofillEntry("merge", "entry", 1, 2));
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> native_entries;
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_entries.push_back(native_entry);
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(true)));
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_entries.push_back(sync_entry);
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillEntry> add_autofill(this, sync_entries);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdateAutofillEntries(ElementsAre(merged_entry))).WillOnce(Return(true));
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL);
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_entries.size());
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_entry == new_sync_entries[0]);
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncMergeProfile) {
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
1098c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing",
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
1105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing", "Alicia", "Saenz",
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
112090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              UpdateAutofillProfile(MatchProfiles(sync_profile))).
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, sync_profile.Compare(new_sync_profiles[0]));
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncMergeProfileCombine) {
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing",
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same address, but different names, phones and e-mails.
1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBF", "Billing", "Alicia", "Saenz",
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "19482937549");
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile expected_profile(sync_profile);
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected_profile.OverwriteWithOrAddTo(*native_profile, "en-US");
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              AddAutofillProfile(MatchProfiles(expected_profile))).
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RemoveAutofillProfile("23355099-1170-4B71-8ED4-144470CC9EBF")).
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that key fields are the same.
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(new_sync_profiles[0].IsSubsetOf(sync_profile, "en-US"));
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that multivalued fields of the synced back data include original
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // data.
1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(
1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IncludesField(new_sync_profiles[0], sync_profile, autofill::NAME_FULL));
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IncludesField(
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_sync_profiles[0], sync_profile, autofill::EMAIL_ADDRESS));
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IncludesField(
1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_sync_profiles[0], sync_profile, autofill::PHONE_HOME_WHOLE_NUMBER));
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, MergeProfileWithDifferentGuid) {
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing",
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string native_guid = "EDC609ED-7EEE-4F27-B00C-423242A9C44B";
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_guid.c_str(), "Billing",
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, AddAutofillProfile(_)).
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, RemoveAutofillProfile(native_guid)).
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, sync_profile.Compare(new_sync_profiles[0]));
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(sync_profile.guid(), new_sync_profiles[0].guid());
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeAddEntry) {
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).WillOnce(Return(true));
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry added_entry(MakeAutofillEntry("added", "entry", 1));
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<base::Time> timestamps(added_entry.timestamps());
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillTimestamps(_, _, _)).
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<2>(timestamps), Return(true)));
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.push_back(AutofillChange(AutofillChange::ADD, added_entry.key()));
1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillEntriesChanged(changes);
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_entries.size());
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(added_entry == new_sync_entries[0]);
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeAddProfile) {
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).WillOnce(Return(true));
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL_PROFILE);
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL_PROFILE);
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile added_profile;
1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&added_profile,
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "D6ADA912-D374-4C0A-917D-F5C8EBE43011", "Josephine", "Alicia", "Saenz",
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillProfileChange change(
1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutofillProfileChange::ADD, added_profile.guid(), &added_profile);
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillProfileChanged(change);
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, added_profile.Compare(new_sync_profiles[0]));
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeUpdateEntry) {
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry original_entry(MakeAutofillEntry("my", "entry", 1));
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> original_entries;
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_entries.push_back(original_entry);
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true)));
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry updated_entry(MakeAutofillEntry("my", "entry", 1, 2));
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<base::Time> timestamps(updated_entry.timestamps());
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillTimestamps(_, _, _)).
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<2>(timestamps), Return(true)));
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.push_back(AutofillChange(AutofillChange::UPDATE,
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   updated_entry.key()));
1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillEntriesChanged(changes);
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_entries.size());
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(updated_entry == new_sync_entries[0]);
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeRemoveEntry) {
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry original_entry(MakeAutofillEntry("my", "entry", 1));
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> original_entries;
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_entries.push_back(original_entry);
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true)));
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.push_back(AutofillChange(AutofillChange::REMOVE,
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   original_entry.key()));
1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillEntriesChanged(changes);
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, new_sync_entries.size());
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeRemoveProfile) {
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "3BA5FA1B-1EC4-4BB3-9B57-EC92BE3C1A09", "Josephine", "Alicia", "Saenz",
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "3BA5FA1B-1EC4-4BB3-9B57-EC92BE3C1A09", "Josephine", "Alicia", "Saenz",
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillProfileChange change(
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutofillProfileChange::REMOVE, sync_profile.guid(), NULL);
1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillProfileChanged(change);
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, new_sync_profiles.size());
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/57884
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, DISABLED_ServerChangeRace) {
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once for MergeDataAndStartSyncing() and twice for ProcessSyncChanges(), via
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LoadAutofillData().
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Times(3).WillRepeatedly(Return(true));
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On the other hand Autofill and Autocomplete are separated now, so
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetAutofillProfiles() should not be called.
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).Times(0);
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, UpdateAutofillEntries(_)).
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(true));
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh()).Times(3);
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (true, false) means we have to reset after |Signal|, init to unsignaled.
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent> wait_for_start(new WaitableEvent(true, false));
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent> wait_for_syncapi(new WaitableEvent(true, false));
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<FakeServerUpdater> updater(new FakeServerUpdater(
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sync_service_, &wait_for_start, &wait_for_syncapi));
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This server side update will stall waiting for CommitWaiter.
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updater->CreateNewEntry(MakeAutofillEntry("server", "entry", 1));
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wait_for_start->Wait();
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry syncapi_entry(MakeAutofillEntry("syncapi", "entry", 2));
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(AddAutofillSyncNode(syncapi_entry));
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Syncapi update finished.";
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we reach here, it means syncapi succeeded and we didn't deadlock. Yay!
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Signal FakeServerUpdater that it can complete.
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wait_for_syncapi->Signal();
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make another entry to ensure nothing broke afterwards and wait for finish
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to clean up.
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updater->CreateNewEntryAndWait(MakeAutofillEntry("server2", "entry2", 3));
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, sync_entries.size());
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_profiles.size());
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < sync_entries.size(); i++) {
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "Entry " << i << ": " << sync_entries[i].key().name()
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << ", " << sync_entries[i].key().value();
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1417