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"
189ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/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"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h"
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/abstract_profile_sync_service_test.h"
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/sync/fake_oauth2_token_service.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/autofill_data_type_controller.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/autofill_profile_data_type_controller.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/data_type_controller.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/generic_change_processor.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/shared_change_processor.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_test_util.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test_profile_sync_service.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/autocomplete_syncable_service.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/autofill_profile_syncable_service.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_data_service_factory.h"
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/autofill/core/browser/autofill_test_utils.h"
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h"
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_change.h"
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_entry.h"
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_table.h"
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_data_service_test_util.h"
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sync/internal_api/public/data_type_debug_info_listener.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/read_node.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/read_transaction.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/write_node.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/write_transaction.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/autofill_specifics.pb.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/mutable_entry.h"
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/syncable/syncable_write_transaction.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/test/engine/test_id_factory.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillChange;
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillChangeList;
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillEntry;
683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochusing autofill::ServerFieldType;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillKey;
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillProfile;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillProfileChange;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillTable;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillWebDataService;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::PersonalDataManager;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::WaitableEvent;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::AutofillDataTypeController;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::AutofillProfileDataTypeController;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::DataTypeController;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::GenericChangeProcessor;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::SharedChangeProcessor;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::AUTOFILL;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::BaseNode;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::BASE_VERSION;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::CREATE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::GET_BY_SERVER_TAG;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::MutableEntry;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::SERVER_SPECIFICS;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::SPECIFICS;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::UNITTEST;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::WriterTag;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::WriteTransaction;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ElementsAre;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::SetArgumentPointee;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class HistoryService;
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncable {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Id;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RunAndSignal(const base::Closure& cb, WaitableEvent* event) {
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  cb.Run();
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  event->Signal();
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillTableMock : public AutofillTable {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillTableMock() : AutofillTable("en-US") {}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(RemoveFormElement,
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               bool(const base::string16& name,
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    const base::string16& value));  // NOLINT
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetAllAutofillEntries,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(std::vector<AutofillEntry>* entries));  // NOLINT
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD3(GetAutofillTimestamps,
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               bool(const base::string16& name,  // NOLINT
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    const base::string16& value,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    std::vector<base::Time>* timestamps));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(UpdateAutofillEntries,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const std::vector<AutofillEntry>&));  // NOLINT
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetAutofillProfiles,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(std::vector<AutofillProfile*>*));  // NOLINT
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MOCK_METHOD1(UpdateAutofillProfile,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const AutofillProfile&));  // NOLINT
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(AddAutofillProfile,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const AutofillProfile&));  // NOLINT
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(RemoveAutofillProfile,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const std::string&));  // NOLINT
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(MatchProfiles, profile, "") {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (profile.Compare(arg) == 0);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebDatabaseFake : public WebDatabase {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit WebDatabaseFake(AutofillTable* autofill_table) {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTable(autofill_table);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class MockAutofillBackend : public autofill::AutofillWebDataBackend {
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MockAutofillBackend(
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      WebDatabase* web_database,
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const base::Closure& on_changed)
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : web_database_(web_database),
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        on_changed_(on_changed) {
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~MockAutofillBackend() {}
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual WebDatabase* GetDatabase() OVERRIDE { return web_database_; }
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void AddObserver(
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      autofill::AutofillWebDataServiceObserverOnDBThread* observer) OVERRIDE {}
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void RemoveObserver(
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      autofill::AutofillWebDataServiceObserverOnDBThread* observer) OVERRIDE {}
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void RemoveExpiredFormElements() OVERRIDE {}
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void NotifyOfMultipleAutofillChanges() OVERRIDE {
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, on_changed_);
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebDatabase* web_database_;
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::Closure on_changed_;
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceAutofillTest;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<class AutofillProfile>
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelType GetModelType() {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::UNSPECIFIED;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<>
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelType GetModelType<AutofillEntry>() {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::AUTOFILL;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<>
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelType GetModelType<AutofillProfile>() {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::AUTOFILL_PROFILE;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TokenWebDataServiceFake : public TokenWebData {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TokenWebDataServiceFake()
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : TokenWebData() {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsDatabaseLoaded() OVERRIDE {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebDataService::Handle GetAllTokens(
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebDataServiceConsumer* consumer) OVERRIDE {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(tim): It would be nice if WebDataService was injected on
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // construction of ProfileOAuth2TokenService rather than fetched by
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Initialize so that this isn't necessary (we could pass a NULL service).
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // We currently do return it via EXPECT_CALLs, but without depending on
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // order-of-initialization (which seems way more fragile) we can't tell
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // which component is asking at what time, and some components in these
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Autofill tests require a WebDataService.
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TokenWebDataServiceFake() {}
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TokenWebDataServiceFake);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebDataServiceFake : public AutofillWebDataService {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebDataServiceFake()
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : AutofillWebDataService(
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)),
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_database_(NULL),
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        autocomplete_syncable_service_(NULL),
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        autofill_profile_syncable_service_(NULL),
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        syncable_service_created_or_destroyed_(false, false) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDatabase(WebDatabase* web_database) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_database_ = web_database;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartSyncableService() {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The |autofill_profile_syncable_service_| must be constructed on the DB
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // thread.
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const base::Closure& on_changed_callback = base::Bind(
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        &WebDataServiceFake::NotifyAutofillMultipleChangedOnUIThread,
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        AsWeakPtr());
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&WebDataServiceFake::CreateSyncableService,
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   base::Unretained(this),
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   on_changed_callback));
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Wait();
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShutdownSyncableService() {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The |autofill_profile_syncable_service_| must be destructed on the DB
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // thread.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&WebDataServiceFake::DestroySyncableService,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Wait();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsDatabaseLoaded() OVERRIDE {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebDatabase* GetDatabase() OVERRIDE {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return web_database_;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnAutofillEntriesChanged(const AutofillChangeList& changes) {
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WaitableEvent event(true, false);
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::Closure notify_cb =
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&AutocompleteSyncableService::AutofillEntriesChanged,
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   base::Unretained(autocomplete_syncable_service_),
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   changes);
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    BrowserThread::PostTask(
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        BrowserThread::DB,
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE,
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&RunAndSignal, notify_cb, &event));
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event.Wait();
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnAutofillProfileChanged(const AutofillProfileChange& changes) {
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WaitableEvent event(true, false);
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::Closure notify_cb =
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&AutocompleteSyncableService::AutofillProfileChanged,
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   base::Unretained(autofill_profile_syncable_service_),
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   changes);
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    BrowserThread::PostTask(
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        BrowserThread::DB,
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE,
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&RunAndSignal, notify_cb, &event));
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event.Wait();
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebDataServiceFake() {}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void CreateSyncableService(const base::Closure& on_changed_callback) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // These services are deleted in DestroySyncableService().
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    backend_.reset(new MockAutofillBackend(
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetDatabase(), on_changed_callback));
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AutocompleteSyncableService::CreateForWebDataServiceAndBackend(
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        this, backend_.get());
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AutofillProfileSyncableService::CreateForWebDataServiceAndBackend(
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        this, backend_.get(), "en-US");
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autocomplete_syncable_service_ =
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AutocompleteSyncableService::FromWebDataService(this);
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_profile_syncable_service_ =
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AutofillProfileSyncableService::FromWebDataService(this);
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Signal();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DestroySyncableService() {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autocomplete_syncable_service_ = NULL;
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_profile_syncable_service_ = NULL;
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    backend_.reset();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Signal();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDatabase* web_database_;
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSyncableService* autocomplete_syncable_service_;
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillProfileSyncableService* autofill_profile_syncable_service_;
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<autofill::AutofillWebDataBackend> backend_;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitableEvent syncable_service_created_or_destroyed_;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebDataServiceFake);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)BrowserContextKeyedService* BuildMockWebDataServiceWrapper(
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::BrowserContext* profile) {
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new MockWebDataServiceWrapper(
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      NULL,
34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new WebDataServiceFake(),
34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new TokenWebDataServiceFake());
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(MakeAutocompleteSyncComponents, wds) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::DB))
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::WeakPtr<syncer::SyncableService>();
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return AutocompleteSyncableService::FromWebDataService(wds)->AsWeakPtr();
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_P(ReturnNewDataTypeManagerWithDebugListener, debug_listener) {
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new browser_sync::DataTypeManagerImpl(
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      debug_listener,
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg1,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg2,
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg3,
357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      arg4,
358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      arg5);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(MakeGenericChangeProcessor) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::UserShare* user_share = arg0->GetUserShare();
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new GenericChangeProcessor(
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg1,
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg2,
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg3,
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      user_share);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION(MakeSharedChangeProcessor) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new SharedChangeProcessor();
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(MakeAutofillProfileSyncComponents, wds) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::DB))
377a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return base::WeakPtr<syncer::SyncableService>();
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return AutofillProfileSyncableService::FromWebDataService(wds)->AsWeakPtr();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AbstractAutofillFactory {
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DataTypeController* CreateDataTypeController(
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncComponentsFactory* factory,
3853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      TestingProfile* profile,
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncService* service) = 0;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExpectation(ProfileSyncComponentsFactoryMock* factory,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ProfileSyncService* service,
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              AutofillWebDataService* wds,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              DataTypeController* dtc) = 0;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AbstractAutofillFactory() {}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillEntryFactory : public AbstractAutofillFactory {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual browser_sync::DataTypeController* CreateDataTypeController(
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncComponentsFactory* factory,
3983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      TestingProfile* profile,
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncService* service) OVERRIDE {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new AutofillDataTypeController(factory, profile, service);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExpectation(ProfileSyncComponentsFactoryMock* factory,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ProfileSyncService* service,
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              AutofillWebDataService* wds,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              DataTypeController* dtc) OVERRIDE {
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*factory, CreateGenericChangeProcessor(_,_,_,_)).
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeGenericChangeProcessor());
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*factory, CreateSharedChangeProcessor()).
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeSharedChangeProcessor());
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*factory, GetSyncableServiceForType(syncer::AUTOFILL)).
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeAutocompleteSyncComponents(wds));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillProfileFactory : public AbstractAutofillFactory {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual browser_sync::DataTypeController* CreateDataTypeController(
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncComponentsFactory* factory,
4203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      TestingProfile* profile,
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncService* service) OVERRIDE {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new AutofillProfileDataTypeController(factory, profile, service);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExpectation(ProfileSyncComponentsFactoryMock* factory,
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ProfileSyncService* service,
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              AutofillWebDataService* wds,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              DataTypeController* dtc) OVERRIDE {
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*factory, CreateGenericChangeProcessor(_,_,_,_)).
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeGenericChangeProcessor());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*factory, CreateSharedChangeProcessor()).
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeSharedChangeProcessor());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*factory,
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetSyncableServiceForType(syncer::AUTOFILL_PROFILE)).
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeAutofillProfileSyncComponents(wds));
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockPersonalDataManager : public PersonalDataManager {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockPersonalDataManager() : PersonalDataManager("en-US") {}
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsDataLoaded, bool());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(LoadProfiles, void());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(LoadCreditCards, void());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Refresh, void());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MockPersonalDataManagerService
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public autofill::PersonalDataManagerService {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
45190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static BrowserContextKeyedService* Build(content::BrowserContext* profile) {
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new MockPersonalDataManagerService();
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockPersonalDataManagerService() {
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    personal_data_manager_.reset(new MockPersonalDataManager());
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockPersonalDataManagerService() {}
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void Shutdown() OVERRIDE {
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    personal_data_manager_.reset();
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual MockPersonalDataManager* GetPersonalDataManager() OVERRIDE {
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return personal_data_manager_.get();
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<MockPersonalDataManager> personal_data_manager_;
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockPersonalDataManagerService);
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T> class AddAutofillHelper;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProfileSyncServiceAutofillTest
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   : public AbstractProfileSyncServiceTest,
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     public syncer::DataTypeDebugInfoListener {
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DataTypeDebugInfoListener implementation.
48068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void OnDataTypeConfigureComplete(
48168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::vector<syncer::DataTypeConfigurationStats>&
48268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          configuration_stats) OVERRIDE {
48368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_EQ(1u, configuration_stats.size());
48468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    association_stats_ = configuration_stats[0].association_stats;
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileSyncServiceAutofillTest()
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   : debug_ptr_factory_(this) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ProfileSyncServiceAutofillTest() {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfileFactory profile_factory_;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntryFactory entry_factory_;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AbstractAutofillFactory* GetFactory(syncer::ModelType type) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == syncer::AUTOFILL) {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return &entry_factory_;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (type == syncer::AUTOFILL_PROFILE) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return &profile_factory_;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractProfileSyncServiceTest::SetUp();
5103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    TestingProfile::Builder builder;
5113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(),
5123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                              FakeOAuth2TokenService::BuildTokenService);
5133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    profile_ = builder.Build().Pass();
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_database_.reset(new WebDatabaseFake(&autofill_table_));
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockWebDataServiceWrapper* wrapper =
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<MockWebDataServiceWrapper*>(
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            WebDataServiceFactory::GetInstance()->SetTestingFactoryAndUse(
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                profile_.get(), BuildMockWebDataServiceWrapper));
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_data_service_ =
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<WebDataServiceFake*>(wrapper->GetAutofillWebData().get());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->SetDatabase(web_database_.get());
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockPersonalDataManagerService* personal_data_manager_service =
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<MockPersonalDataManagerService*>(
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            autofill::PersonalDataManagerFactory::GetInstance()
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                ->SetTestingFactoryAndUse(
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                    profile_.get(), MockPersonalDataManagerService::Build));
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    personal_data_manager_ =
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        personal_data_manager_service->GetPersonalDataManager();
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*personal_data_manager_, LoadProfiles()).Times(1);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*personal_data_manager_, LoadCreditCards()).Times(1);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    personal_data_manager_->Init(
535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        WebDataServiceFactory::GetAutofillWebDataForProfile(
536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            profile_.get(), Profile::EXPLICIT_ACCESS),
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        profile_->GetPrefs(),
538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        profile_->IsOffTheRecord());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->StartSyncableService();
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note: The tear down order is important.
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProfileSyncServiceFactory::GetInstance()->SetTestingFactory(
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        profile_.get(), NULL);
547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    web_data_service_->ShutdownOnUIThread();
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->ShutdownSyncableService();
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    web_data_service_ = NULL;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // To prevent a leak, fully release TestURLRequestContext to ensure its
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // destruction on the IO message loop.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset();
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractProfileSyncServiceTest::TearDown();
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int GetSyncCount(syncer::ModelType type) {
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadNode node(&trans);
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (node.InitByTagLookup(syncer::ModelTypeToRootTag(type)) !=
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        syncer::BaseNode::INIT_OK)
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return 0;
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return node.GetTotalNodeCount() - 1;
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartSyncService(const base::Closure& callback,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        bool will_fail_association,
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        syncer::ModelType type) {
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractAutofillFactory* factory = GetFactory(type);
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SigninManagerBase* signin =
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SigninManagerFactory::GetForProfile(profile_.get());
572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    signin->SetAuthenticatedUsername("test_user@gmail.com");
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_service_ = static_cast<TestProfileSyncService*>(
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            profile_.get(), &TestProfileSyncService::BuildAutoStartAsyncInit));
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_service_->set_backend_init_callback(callback);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProfileSyncComponentsFactoryMock* components =
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sync_service_->components_factory_mock();
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DataTypeController* data_type_controller =
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        factory->CreateDataTypeController(components,
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          profile_.get(),
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          sync_service_);
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    factory->SetExpectation(components,
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            sync_service_,
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            web_data_service_.get(),
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            data_type_controller);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
589868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(*components, CreateDataTypeManager(_, _, _, _, _, _)).
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WillOnce(ReturnNewDataTypeManagerWithDebugListener(
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     syncer::MakeWeakHandle(debug_ptr_factory_.GetWeakPtr())));
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*personal_data_manager_, IsDataLoaded()).
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillRepeatedly(Return(true));
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // We need tokens to get the tests going
59768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ProfileOAuth2TokenServiceFactory::GetForProfile(profile_.get())
59868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ->UpdateCredentials("test_user@gmail.com", "oauth2_login_token");
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_service_->RegisterDataTypeController(data_type_controller);
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_service_->Initialize();
60290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // It's possible this test triggered an unrecoverable error, in which case
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // we can't get the sync count.
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (sync_service_->ShouldPushChanges()) {
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(GetSyncCount(type),
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                association_stats_.num_sync_items_after_association);
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(association_stats_.num_sync_items_after_association,
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              association_stats_.num_sync_items_before_association +
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              association_stats_.num_sync_items_added -
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              association_stats_.num_sync_items_deleted);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddAutofillSyncNode(const AutofillEntry& entry) {
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (autofill_root.InitByTagLookup(
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            syncer::ModelTypeToRootTag(syncer::AUTOFILL)) !=
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                BaseNode::INIT_OK) {
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode node(&trans);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string tag = AutocompleteSyncableService::KeyToTag(
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UTF16ToUTF8(entry.key().name()), UTF16ToUTF8(entry.key().value()));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode::InitUniqueByCreationResult result =
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node.InitUniqueByCreation(syncer::AUTOFILL, autofill_root, tag);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (result != syncer::WriteNode::INIT_SUCCESS)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::EntitySpecifics specifics;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutocompleteSyncableService::WriteAutofillEntry(entry, &specifics);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::AutofillSpecifics* autofill_specifics =
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        specifics.mutable_autofill();
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node.SetAutofillSpecifics(*autofill_specifics);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddAutofillSyncNode(const AutofillProfile& profile) {
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (autofill_root.InitByTagLookup(kAutofillProfileTag) !=
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            BaseNode::INIT_OK) {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode node(&trans);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string tag = profile.guid();
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode::InitUniqueByCreationResult result =
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node.InitUniqueByCreation(syncer::AUTOFILL_PROFILE,
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  autofill_root, tag);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (result != syncer::WriteNode::INIT_SUCCESS)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::EntitySpecifics specifics;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillProfileSyncableService::WriteAutofillProfile(profile, &specifics);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::AutofillProfileSpecifics* profile_specifics =
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        specifics.mutable_autofill_profile();
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node.SetAutofillProfileSpecifics(*profile_specifics);
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetAutofillEntriesFromSyncDB(std::vector<AutofillEntry>* entries,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    std::vector<AutofillProfile>* profiles) {
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (autofill_root.InitByTagLookup(
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            syncer::ModelTypeToRootTag(syncer::AUTOFILL)) !=
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                BaseNode::INIT_OK) {
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 child_id = autofill_root.GetFirstChildId();
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (child_id != syncer::kInvalidId) {
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ReadNode child_node(&trans);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (child_node.InitByIdLookup(child_id) != BaseNode::INIT_OK)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const sync_pb::AutofillSpecifics& autofill(
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          child_node.GetAutofillSpecifics());
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (autofill.has_value()) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillKey key(UTF8ToUTF16(autofill.name()),
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        UTF8ToUTF16(autofill.value()));
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::vector<base::Time> timestamps;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int timestamps_count = autofill.usage_timestamp_size();
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (int i = 0; i < timestamps_count; ++i) {
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          timestamps.push_back(Time::FromInternalValue(
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              autofill.usage_timestamp(i)));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        entries->push_back(AutofillEntry(key, timestamps));
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (autofill.has_profile()) {
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfile p;
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p.set_guid(autofill.profile().guid());
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfileSyncableService::OverwriteProfileWithServerData(
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            autofill.profile(), &p, "en-US");
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        profiles->push_back(p);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child_id = child_node.GetSuccessorId();
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetAutofillProfilesFromSyncDBUnderProfileNode(
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<AutofillProfile>* profiles) {
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (autofill_root.InitByTagLookup(kAutofillProfileTag) !=
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            BaseNode::INIT_OK) {
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 child_id = autofill_root.GetFirstChildId();
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (child_id != syncer::kInvalidId) {
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ReadNode child_node(&trans);
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (child_node.InitByIdLookup(child_id) != BaseNode::INIT_OK)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const sync_pb::AutofillProfileSpecifics& autofill(
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          child_node.GetAutofillProfileSpecifics());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfile p;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p.set_guid(autofill.guid());
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfileSyncableService::OverwriteProfileWithServerData(
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            autofill, &p, "en-US");
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        profiles->push_back(p);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child_id = child_node.GetSuccessorId();
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIdleChangeProcessorExpectations() {
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(autofill_table_, RemoveFormElement(_, _)).Times(0);
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(autofill_table_, GetAutofillTimestamps(_, _, _)).Times(0);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(autofill_table_, UpdateAutofillEntries(_)).Times(0);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AutofillEntry MakeAutofillEntry(const char* name,
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const char* value,
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int time_shift0,
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int time_shift1) {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Time deep in the past would cause Autocomplete sync to discard the
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // entries.
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static Time base_time = Time::Now().LocalMidnight();
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<Time> timestamps;
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (time_shift0 > 0)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      timestamps.push_back(base_time + TimeDelta::FromSeconds(time_shift0));
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (time_shift1 > 0)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      timestamps.push_back(base_time + TimeDelta::FromSeconds(time_shift1));
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return AutofillEntry(
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillKey(ASCIIToUTF16(name), ASCIIToUTF16(value)), timestamps);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AutofillEntry MakeAutofillEntry(const char* name,
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const char* value,
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int time_shift) {
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MakeAutofillEntry(name, value, time_shift, -1);
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AddAutofillHelper<AutofillEntry>;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AddAutofillHelper<AutofillProfile>;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class FakeServerUpdater;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillTableMock autofill_table_;
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WebDatabaseFake> web_database_;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<WebDataServiceFake> web_data_service_;
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPersonalDataManager* personal_data_manager_;
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syncer::DataTypeAssociationStats association_stats_;
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<DataTypeDebugInfoListener> debug_ptr_factory_;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T>
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AddAutofillHelper {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper(ProfileSyncServiceAutofillTest* test,
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const std::vector<T>& entries)
778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : callback_(base::Bind(&AddAutofillHelper::AddAutofillCallback,
779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             base::Unretained(this), test, entries)),
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        success_(false) {
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Closure& callback() const { return callback_; }
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success() { return success_; }
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddAutofillCallback(ProfileSyncServiceAutofillTest* test,
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::vector<T>& entries) {
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!test->CreateRoot(GetModelType<T>()))
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < entries.size(); ++i) {
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!test->AddAutofillSyncNode(entries[i]))
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success_ = true;
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure callback_;
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success_;
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overload write transaction to use custom NotifyTransactionComplete
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WriteTransactionTest: public WriteTransaction {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTransactionTest(const tracked_objects::Location& from_here,
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       WriterTag writer,
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       syncer::syncable::Directory* directory,
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       scoped_ptr<WaitableEvent>* wait_for_syncapi)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : WriteTransaction(from_here, writer, directory),
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wait_for_syncapi_(wait_for_syncapi) { }
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyTransactionComplete(
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelTypeSet types) OVERRIDE {
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is where we differ. Force a thread change here, giving another
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // thread a chance to create a WriteTransaction
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*wait_for_syncapi_)->Wait();
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteTransaction::NotifyTransactionComplete(types);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent>* wait_for_syncapi_;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Our fake server updater. Needs the RefCountedThreadSafe inheritance so we can
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// post tasks with it.
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeServerUpdater : public base::RefCountedThreadSafe<FakeServerUpdater> {
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeServerUpdater(TestProfileSyncService* service,
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    scoped_ptr<WaitableEvent>* wait_for_start,
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    scoped_ptr<WaitableEvent>* wait_for_syncapi)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : entry_(ProfileSyncServiceAutofillTest::MakeAutofillEntry("0", "0", 0)),
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        service_(service),
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wait_for_start_(wait_for_start),
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wait_for_syncapi_(wait_for_syncapi),
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_finished_(false, false) { }
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Update() {
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This gets called in a modelsafeworker thread.
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::UserShare* user_share = service_->GetUserShare();
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::syncable::Directory* directory = user_share->directory.get();
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create autofill protobuf.
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string tag = AutocompleteSyncableService::KeyToTag(
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        UTF16ToUTF8(entry_.key().name()), UTF16ToUTF8(entry_.key().value()));
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::AutofillSpecifics new_autofill;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_autofill.set_name(UTF16ToUTF8(entry_.key().name()));
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_autofill.set_value(UTF16ToUTF8(entry_.key().value()));
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<base::Time>& ts(entry_.timestamps());
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<base::Time>::const_iterator timestamp = ts.begin();
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         timestamp != ts.end(); ++timestamp) {
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_autofill.add_usage_timestamp(timestamp->ToInternalValue());
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::EntitySpecifics entity_specifics;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entity_specifics.mutable_autofill()->CopyFrom(new_autofill);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Tell main thread we've started
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*wait_for_start_)->Signal();
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Create write transaction.
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WriteTransactionTest trans(FROM_HERE, UNITTEST, directory,
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 wait_for_syncapi_);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Create actual entry based on autofill protobuf information.
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Simulates effects of UpdateLocalDataFromServerData
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MutableEntry parent(&trans, GET_BY_SERVER_TAG,
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          syncer::ModelTypeToRootTag(syncer::AUTOFILL));
873d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      MutableEntry item(&trans, CREATE, syncer::AUTOFILL, parent.GetId(), tag);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(item.good());
875d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      item.PutSpecifics(entity_specifics);
876d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      item.PutServerSpecifics(entity_specifics);
877d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      item.PutBaseVersion(1);
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::syncable::Id server_item_id =
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          service_->id_factory()->NewServerId();
880d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      item.PutId(server_item_id);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::syncable::Id new_predecessor;
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(item.PutPredecessor(new_predecessor));
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "FakeServerUpdater finishing.";
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_finished_.Signal();
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateNewEntry(const AutofillEntry& entry) {
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_ = entry;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(BrowserThread::CurrentlyOn(BrowserThread::DB));
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!BrowserThread::PostTask(
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&FakeServerUpdater::Update, this))) {
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Failed to post task to the db thread.";
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateNewEntryAndWait(const AutofillEntry& entry) {
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_ = entry;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(BrowserThread::CurrentlyOn(BrowserThread::DB));
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_finished_.Reset();
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         base::Bind(&FakeServerUpdater::Update, this))) {
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Failed to post task to the db thread.";
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_finished_.Wait();
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<FakeServerUpdater>;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~FakeServerUpdater() { }
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry entry_;
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProfileSyncService* service_;
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent>* wait_for_start_;
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent>* wait_for_syncapi_;
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitableEvent is_finished_;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::syncable::Id parent_id_;
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks if the field of type |field_type| in |profile1| includes all values
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the field in |profile2|.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IncludesField(const AutofillProfile& profile1,
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const AutofillProfile& profile2,
9293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                   ServerFieldType field_type) {
930a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> values1;
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile1.GetRawMultiInfo(field_type, &values1);
932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> values2;
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile2.GetRawMultiInfo(field_type, &values2);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::set<base::string16> values_set;
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < values1.size(); ++i)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values_set.insert(values1[i]);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < values2.size(); ++i)
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (values_set.find(values2[i]) == values_set.end())
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(skrul): Test abort startup.
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(skrul): Test processing of cloud changes.
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(tim): Add autofill data type controller test, and a case to cover
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//            waiting for the PersonalDataManager.
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, FailModelAssociation) {
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't create the root autofill node so startup fails.
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(base::Closure(), true, syncer::AUTOFILL);
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_service_->HasUnrecoverableError());
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, EmptyNativeEmptySync) {
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).WillOnce(Return(true));
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(create_root.success());
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_entries.size());
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_profiles.size());
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeEntriesEmptySync) {
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("foo", "bar", 1));
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(entries), Return(true)));
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, entries.size());
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entries[0] == sync_entries[0]);
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_profiles.size());
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasProfileEmptySync) {
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> profiles;
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> expected_profiles;
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Owned by GetAutofillProfiles caller.
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* profile0 = new AutofillProfile;
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(profile0,
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "54B3F9AA-335E-4F71-A27D-719C41564230", "Billing",
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profiles.push_back(profile0);
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_profiles.push_back(*profile0);
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(profiles), Return(true)));
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL_PROFILE);
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL_PROFILE);
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(&sync_profiles));
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, sync_profiles.size());
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, expected_profiles[0].Compare(sync_profiles[0]));
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeWithDuplicatesEmptySync) {
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is buggy autofill code that allows duplicate name/value
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pairs to exist in the database with separate pair_ids.
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("foo", "bar", 1));
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("dup", "", 2));
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("dup", "", 3));
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(entries), Return(true)));
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, sync_entries.size());
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncNoMerge) {
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry native_entry(MakeAutofillEntry("native", "entry", 1));
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry sync_entry(MakeAutofillEntry("sync", "entry", 2));
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> native_entries;
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_entries.push_back(native_entry);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(true)));
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_entries.push_back(sync_entry);
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillEntry> add_autofill(this, sync_entries);
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, UpdateAutofillEntries(ElementsAre(sync_entry))).
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL);
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<AutofillEntry> expected_entries;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_entries.insert(native_entry);
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_entries.insert(sync_entry);
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<AutofillEntry> new_sync_entries_set(new_sync_entries.begin(),
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               new_sync_entries.end());
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected_entries == new_sync_entries_set);
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncMergeEntry) {
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry native_entry(MakeAutofillEntry("merge", "entry", 1));
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry sync_entry(MakeAutofillEntry("merge", "entry", 2));
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry merged_entry(MakeAutofillEntry("merge", "entry", 1, 2));
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> native_entries;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_entries.push_back(native_entry);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(true)));
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_entries.push_back(sync_entry);
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillEntry> add_autofill(this, sync_entries);
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdateAutofillEntries(ElementsAre(merged_entry))).WillOnce(Return(true));
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL);
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_entries.size());
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_entry == new_sync_entries[0]);
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncMergeProfile) {
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing",
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing", "Alicia", "Saenz",
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
112190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              UpdateAutofillProfile(MatchProfiles(sync_profile))).
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, sync_profile.Compare(new_sync_profiles[0]));
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncMergeProfileCombine) {
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing",
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same address, but different names, phones and e-mails.
1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBF", "Billing", "Alicia", "Saenz",
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "19482937549");
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile expected_profile(sync_profile);
1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected_profile.OverwriteWithOrAddTo(*native_profile, "en-US");
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              AddAutofillProfile(MatchProfiles(expected_profile))).
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RemoveAutofillProfile("23355099-1170-4B71-8ED4-144470CC9EBF")).
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that key fields are the same.
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(new_sync_profiles[0].IsSubsetOf(sync_profile, "en-US"));
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that multivalued fields of the synced back data include original
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // data.
1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IncludesField(new_sync_profiles[0], sync_profile, autofill::NAME_FULL));
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IncludesField(
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_sync_profiles[0], sync_profile, autofill::EMAIL_ADDRESS));
1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IncludesField(
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_sync_profiles[0], sync_profile, autofill::PHONE_HOME_WHOLE_NUMBER));
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, MergeProfileWithDifferentGuid) {
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing",
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string native_guid = "EDC609ED-7EEE-4F27-B00C-423242A9C44B";
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_guid.c_str(), "Billing",
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, AddAutofillProfile(_)).
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, RemoveAutofillProfile(native_guid)).
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, sync_profile.Compare(new_sync_profiles[0]));
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(sync_profile.guid(), new_sync_profiles[0].guid());
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeAddEntry) {
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).WillOnce(Return(true));
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry added_entry(MakeAutofillEntry("added", "entry", 1));
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<base::Time> timestamps(added_entry.timestamps());
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillTimestamps(_, _, _)).
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<2>(timestamps), Return(true)));
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.push_back(AutofillChange(AutofillChange::ADD, added_entry.key()));
1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillEntriesChanged(changes);
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_entries.size());
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(added_entry == new_sync_entries[0]);
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeAddProfile) {
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).WillOnce(Return(true));
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL_PROFILE);
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL_PROFILE);
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile added_profile;
1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&added_profile,
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "D6ADA912-D374-4C0A-917D-F5C8EBE43011", "Josephine", "Alicia", "Saenz",
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillProfileChange change(
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutofillProfileChange::ADD, added_profile.guid(), &added_profile);
1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillProfileChanged(change);
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, added_profile.Compare(new_sync_profiles[0]));
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeUpdateEntry) {
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry original_entry(MakeAutofillEntry("my", "entry", 1));
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> original_entries;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_entries.push_back(original_entry);
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true)));
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry updated_entry(MakeAutofillEntry("my", "entry", 1, 2));
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<base::Time> timestamps(updated_entry.timestamps());
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillTimestamps(_, _, _)).
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<2>(timestamps), Return(true)));
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.push_back(AutofillChange(AutofillChange::UPDATE,
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   updated_entry.key()));
1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillEntriesChanged(changes);
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_entries.size());
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(updated_entry == new_sync_entries[0]);
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeRemoveEntry) {
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry original_entry(MakeAutofillEntry("my", "entry", 1));
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> original_entries;
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_entries.push_back(original_entry);
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true)));
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.push_back(AutofillChange(AutofillChange::REMOVE,
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   original_entry.key()));
1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillEntriesChanged(changes);
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, new_sync_entries.size());
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeRemoveProfile) {
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "3BA5FA1B-1EC4-4BB3-9B57-EC92BE3C1A09", "Josephine", "Alicia", "Saenz",
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "3BA5FA1B-1EC4-4BB3-9B57-EC92BE3C1A09", "Josephine", "Alicia", "Saenz",
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillProfileChange change(
1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutofillProfileChange::REMOVE, sync_profile.guid(), NULL);
1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillProfileChanged(change);
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, new_sync_profiles.size());
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/57884
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, DISABLED_ServerChangeRace) {
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once for MergeDataAndStartSyncing() and twice for ProcessSyncChanges(), via
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LoadAutofillData().
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Times(3).WillRepeatedly(Return(true));
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On the other hand Autofill and Autocomplete are separated now, so
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetAutofillProfiles() should not be called.
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).Times(0);
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, UpdateAutofillEntries(_)).
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(true));
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh()).Times(3);
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (true, false) means we have to reset after |Signal|, init to unsignaled.
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent> wait_for_start(new WaitableEvent(true, false));
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent> wait_for_syncapi(new WaitableEvent(true, false));
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<FakeServerUpdater> updater(new FakeServerUpdater(
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sync_service_, &wait_for_start, &wait_for_syncapi));
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This server side update will stall waiting for CommitWaiter.
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updater->CreateNewEntry(MakeAutofillEntry("server", "entry", 1));
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wait_for_start->Wait();
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry syncapi_entry(MakeAutofillEntry("syncapi", "entry", 2));
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(AddAutofillSyncNode(syncapi_entry));
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Syncapi update finished.";
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we reach here, it means syncapi succeeded and we didn't deadlock. Yay!
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Signal FakeServerUpdater that it can complete.
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wait_for_syncapi->Signal();
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make another entry to ensure nothing broke afterwards and wait for finish
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to clean up.
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updater->CreateNewEntryAndWait(MakeAutofillEntry("server2", "entry2", 3));
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, sync_entries.size());
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_profiles.size());
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < sync_entries.size(); i++) {
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "Entry " << i << ": " << sync_entries[i].key().name()
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << ", " << sync_entries[i].key().value();
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1418