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>
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <utility>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
199ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h"
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autofill/personal_data_manager_factory.h"
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/prefs/pref_service_syncable.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h"
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h"
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/abstract_profile_sync_service_test.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/autofill_data_type_controller.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/autofill_profile_data_type_controller.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_components_factory.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_service.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sync/profile_sync_service_factory.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/profile_sync_test_util.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test_profile_sync_service.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/autocomplete_syncable_service.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/webdata/web_data_service_factory.h"
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/testing_browser_process.h"
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/testing_profile_manager.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"
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/core/browser/webdata/autofill_profile_syncable_service.h"
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_table.h"
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/sync_driver/data_type_controller.h"
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_data_service_test_util.h"
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sync/internal_api/public/data_type_debug_info_listener.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/read_node.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/read_transaction.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/write_node.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/write_transaction.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/autofill_specifics.pb.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/syncable/mutable_entry.h"
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sync/syncable/syncable_write_transaction.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/test/engine/test_id_factory.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillChange;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillChangeList;
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillEntry;
713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochusing autofill::ServerFieldType;
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillKey;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillProfile;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillProfileChange;
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using autofill::AutofillProfileSyncableService;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillTable;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::AutofillWebDataService;
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using autofill::PersonalDataManager;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::WaitableEvent;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::AutofillDataTypeController;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using browser_sync::AutofillProfileDataTypeController;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::AUTOFILL;
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using syncer::AUTOFILL_PROFILE;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::BaseNode;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::BASE_VERSION;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::CREATE;
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using syncer::syncable::GET_TYPE_ROOT;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::MutableEntry;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::SERVER_SPECIFICS;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::SPECIFICS;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::UNITTEST;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::WriterTag;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::syncable::WriteTransaction;
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using sync_driver::DataTypeController;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::DoAll;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::ElementsAre;
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using testing::Not;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::SetArgumentPointee;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Return;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class HistoryService;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncable {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Id;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char kTestProfileName[] = "test-profile";
114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RunAndSignal(const base::Closure& cb, WaitableEvent* event) {
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  cb.Run();
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  event->Signal();
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillTableMock : public AutofillTable {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillTableMock() : AutofillTable("en-US") {}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(RemoveFormElement,
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               bool(const base::string16& name,
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    const base::string16& value));  // NOLINT
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetAllAutofillEntries,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(std::vector<AutofillEntry>* entries));  // NOLINT
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MOCK_METHOD4(GetAutofillTimestamps,
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)               bool(const base::string16& name,  // NOLINT
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    const base::string16& value,
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    base::Time* date_created,
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    base::Time* date_last_used));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(UpdateAutofillEntries,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const std::vector<AutofillEntry>&));  // NOLINT
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(GetAutofillProfiles,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(std::vector<AutofillProfile*>*));  // NOLINT
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MOCK_METHOD1(UpdateAutofillProfile,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const AutofillProfile&));  // NOLINT
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(AddAutofillProfile,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const AutofillProfile&));  // NOLINT
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD1(RemoveAutofillProfile,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool(const std::string&));  // NOLINT
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(MatchProfiles, profile, "") {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (profile.Compare(arg) == 0);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebDatabaseFake : public WebDatabase {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit WebDatabaseFake(AutofillTable* autofill_table) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddTable(autofill_table);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class MockAutofillBackend : public autofill::AutofillWebDataBackend {
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public:
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MockAutofillBackend(
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      WebDatabase* web_database,
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      const base::Closure& on_changed)
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      : web_database_(web_database),
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        on_changed_(on_changed) {
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual ~MockAutofillBackend() {}
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual WebDatabase* GetDatabase() OVERRIDE { return web_database_; }
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void AddObserver(
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      autofill::AutofillWebDataServiceObserverOnDBThread* observer) OVERRIDE {}
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void RemoveObserver(
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      autofill::AutofillWebDataServiceObserverOnDBThread* observer) OVERRIDE {}
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void RemoveExpiredFormElements() OVERRIDE {}
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void NotifyOfMultipleAutofillChanges() OVERRIDE {
17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, on_changed_);
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private:
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  WebDatabase* web_database_;
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::Closure on_changed_;
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileSyncServiceAutofillTest;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<class AutofillProfile>
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelType GetModelType() {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::UNSPECIFIED;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<>
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelType GetModelType<AutofillEntry>() {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::AUTOFILL;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<>
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelType GetModelType<AutofillProfile>() {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::AUTOFILL_PROFILE;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class TokenWebDataServiceFake : public TokenWebData {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TokenWebDataServiceFake()
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : TokenWebData(
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)) {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsDatabaseLoaded() OVERRIDE {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual AutofillWebDataService::Handle GetAllTokens(
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebDataServiceConsumer* consumer) OVERRIDE {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(tim): It would be nice if WebDataService was injected on
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // construction of ProfileOAuth2TokenService rather than fetched by
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Initialize so that this isn't necessary (we could pass a NULL service).
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // We currently do return it via EXPECT_CALLs, but without depending on
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // order-of-initialization (which seems way more fragile) we can't tell
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // which component is asking at what time, and some components in these
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Autofill tests require a WebDataService.
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TokenWebDataServiceFake() {}
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TokenWebDataServiceFake);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebDataServiceFake : public AutofillWebDataService {
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebDataServiceFake()
2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : AutofillWebDataService(
2354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI),
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)),
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_database_(NULL),
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        autocomplete_syncable_service_(NULL),
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        autofill_profile_syncable_service_(NULL),
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        syncable_service_created_or_destroyed_(false, false) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDatabase(WebDatabase* web_database) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_database_ = web_database;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartSyncableService() {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The |autofill_profile_syncable_service_| must be constructed on the DB
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // thread.
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const base::Closure& on_changed_callback = base::Bind(
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        &WebDataServiceFake::NotifyAutofillMultipleChangedOnUIThread,
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        AsWeakPtr());
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&WebDataServiceFake::CreateSyncableService,
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   base::Unretained(this),
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                   on_changed_callback));
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Wait();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShutdownSyncableService() {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The |autofill_profile_syncable_service_| must be destructed on the DB
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // thread.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&WebDataServiceFake::DestroySyncableService,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Wait();
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsDatabaseLoaded() OVERRIDE {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebDatabase* GetDatabase() OVERRIDE {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return web_database_;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnAutofillEntriesChanged(const AutofillChangeList& changes) {
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WaitableEvent event(true, false);
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::Closure notify_cb =
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&AutocompleteSyncableService::AutofillEntriesChanged,
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   base::Unretained(autocomplete_syncable_service_),
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   changes);
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    BrowserThread::PostTask(
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        BrowserThread::DB,
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE,
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&RunAndSignal, notify_cb, &event));
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event.Wait();
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void OnAutofillProfileChanged(const AutofillProfileChange& changes) {
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    WaitableEvent event(true, false);
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::Closure notify_cb =
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&AutocompleteSyncableService::AutofillProfileChanged,
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   base::Unretained(autofill_profile_syncable_service_),
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   changes);
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    BrowserThread::PostTask(
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        BrowserThread::DB,
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        FROM_HERE,
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&RunAndSignal, notify_cb, &event));
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    event.Wait();
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebDataServiceFake() {}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void CreateSyncableService(const base::Closure& on_changed_callback) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // These services are deleted in DestroySyncableService().
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    backend_.reset(new MockAutofillBackend(
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        GetDatabase(), on_changed_callback));
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AutocompleteSyncableService::CreateForWebDataServiceAndBackend(
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        this, backend_.get());
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AutofillProfileSyncableService::CreateForWebDataServiceAndBackend(
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        this, backend_.get(), "en-US");
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autocomplete_syncable_service_ =
320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AutocompleteSyncableService::FromWebDataService(this);
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_profile_syncable_service_ =
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AutofillProfileSyncableService::FromWebDataService(this);
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Signal();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DestroySyncableService() {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autocomplete_syncable_service_ = NULL;
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    autofill_profile_syncable_service_ = NULL;
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    backend_.reset();
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncable_service_created_or_destroyed_.Signal();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDatabase* web_database_;
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteSyncableService* autocomplete_syncable_service_;
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillProfileSyncableService* autofill_profile_syncable_service_;
33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<autofill::AutofillWebDataBackend> backend_;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitableEvent syncable_service_created_or_destroyed_;
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebDataServiceFake);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* BuildMockWebDataServiceWrapper(content::BrowserContext* profile) {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new MockWebDataServiceWrapper(
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new WebDataServiceFake(),
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      new TokenWebDataServiceFake());
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(MakeAutocompleteSyncComponents, wds) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::DB))
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::WeakPtr<syncer::SyncableService>();
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return AutocompleteSyncableService::FromWebDataService(wds)->AsWeakPtr();
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ACTION_P(ReturnNewDataTypeManagerWithDebugListener, debug_listener) {
3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return new sync_driver::DataTypeManagerImpl(
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::Closure(),
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      debug_listener,
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg1,
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg2,
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      arg3,
3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      arg4);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(MakeAutofillProfileSyncComponents, wds) {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!BrowserThread::CurrentlyOn(BrowserThread::DB))
371a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    return base::WeakPtr<syncer::SyncableService>();
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return AutofillProfileSyncableService::FromWebDataService(wds)->AsWeakPtr();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AbstractAutofillFactory {
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DataTypeController* CreateDataTypeController(
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncComponentsFactory* factory,
3793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      TestingProfile* profile,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncService* service) = 0;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExpectation(ProfileSyncComponentsFactoryMock* factory,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ProfileSyncService* service,
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              AutofillWebDataService* wds,
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              DataTypeController* dtc) = 0;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AbstractAutofillFactory() {}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillEntryFactory : public AbstractAutofillFactory {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual DataTypeController* CreateDataTypeController(
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncComponentsFactory* factory,
3923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      TestingProfile* profile,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncService* service) OVERRIDE {
3946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return new AutofillDataTypeController(factory, profile);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExpectation(ProfileSyncComponentsFactoryMock* factory,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ProfileSyncService* service,
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              AutofillWebDataService* wds,
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              DataTypeController* dtc) OVERRIDE {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*factory, GetSyncableServiceForType(syncer::AUTOFILL)).
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeAutocompleteSyncComponents(wds));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillProfileFactory : public AbstractAutofillFactory {
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual DataTypeController* CreateDataTypeController(
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncComponentsFactory* factory,
4103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      TestingProfile* profile,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProfileSyncService* service) OVERRIDE {
4126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return new AutofillProfileDataTypeController(factory, profile);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetExpectation(ProfileSyncComponentsFactoryMock* factory,
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ProfileSyncService* service,
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              AutofillWebDataService* wds,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              DataTypeController* dtc) OVERRIDE {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*factory,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetSyncableServiceForType(syncer::AUTOFILL_PROFILE)).
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillOnce(MakeAutofillProfileSyncComponents(wds));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockPersonalDataManager : public PersonalDataManager {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockPersonalDataManager() : PersonalDataManager("en-US") {}
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_CONST_METHOD0(IsDataLoaded, bool());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(LoadProfiles, void());
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(LoadCreditCards, void());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(Refresh, void());
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static KeyedService* Build(content::BrowserContext* profile) {
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return new MockPersonalDataManager();
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T> class AddAutofillHelper;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProfileSyncServiceAutofillTest
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   : public AbstractProfileSyncServiceTest,
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     public syncer::DataTypeDebugInfoListener {
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // DataTypeDebugInfoListener implementation.
44568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void OnDataTypeConfigureComplete(
44668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::vector<syncer::DataTypeConfigurationStats>&
44768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          configuration_stats) OVERRIDE {
44868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_EQ(1u, configuration_stats.size());
44968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    association_stats_ = configuration_stats[0].association_stats;
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProfileSyncServiceAutofillTest()
454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      : profile_manager_(TestingBrowserProcess::GetGlobal()),
455c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        debug_ptr_factory_(this) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ProfileSyncServiceAutofillTest() {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfileFactory profile_factory_;
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntryFactory entry_factory_;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AbstractAutofillFactory* GetFactory(syncer::ModelType type) {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == syncer::AUTOFILL) {
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return &entry_factory_;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (type == syncer::AUTOFILL_PROFILE) {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return &profile_factory_;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return NULL;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractProfileSyncServiceTest::SetUp();
476c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ASSERT_TRUE(profile_manager_.SetUp());
477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    TestingProfile::TestingFactories testing_factories;
478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    testing_factories.push_back(std::make_pair(
479c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        ProfileOAuth2TokenServiceFactory::GetInstance(),
480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        BuildAutoIssuingFakeProfileOAuth2TokenService));
481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    profile_ = profile_manager_.CreateTestingProfile(
482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        kTestProfileName,
483c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        scoped_ptr<PrefServiceSyncable>(),
484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        base::UTF8ToUTF16(kTestProfileName),
485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        0,
486c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        std::string(),
487c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        testing_factories);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_database_.reset(new WebDatabaseFake(&autofill_table_));
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MockWebDataServiceWrapper* wrapper =
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<MockWebDataServiceWrapper*>(
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            WebDataServiceFactory::GetInstance()->SetTestingFactoryAndUse(
492c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                profile_, BuildMockWebDataServiceWrapper));
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_data_service_ =
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<WebDataServiceFake*>(wrapper->GetAutofillWebData().get());
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->SetDatabase(web_database_.get());
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    personal_data_manager_ = static_cast<MockPersonalDataManager*>(
498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        autofill::PersonalDataManagerFactory::GetInstance()
499c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            ->SetTestingFactoryAndUse(profile_,
500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                      MockPersonalDataManager::Build));
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*personal_data_manager_, LoadProfiles()).Times(1);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*personal_data_manager_, LoadCreditCards()).Times(1);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    personal_data_manager_->Init(
506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        WebDataServiceFactory::GetAutofillWebDataForProfile(
507c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            profile_, Profile::EXPLICIT_ACCESS),
508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        profile_->GetPrefs(),
509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        profile_->IsOffTheRecord());
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->StartSyncableService();
5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // When UpdateAutofillEntries() is called with an empty list, the return
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // value should be |true|, rather than the default of |false|.
5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<AutofillEntry> empty;
5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_CALL(autofill_table_, UpdateAutofillEntries(empty))
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        .WillRepeatedly(Return(true));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note: The tear down order is important.
522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ProfileSyncServiceFactory::GetInstance()->SetTestingFactory(profile_, NULL);
523868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    web_data_service_->ShutdownOnUIThread();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_data_service_->ShutdownSyncableService();
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    web_data_service_ = NULL;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // To prevent a leak, fully release TestURLRequestContext to ensure its
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // destruction on the IO message loop.
528c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    profile_ = NULL;
529c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    profile_manager_.DeleteTestingProfile(kTestProfileName);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractProfileSyncServiceTest::TearDown();
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int GetSyncCount(syncer::ModelType type) {
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadNode node(&trans);
53646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (node.InitTypeRoot(type) != syncer::BaseNode::INIT_OK)
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return 0;
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return node.GetTotalNodeCount() - 1;
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartSyncService(const base::Closure& callback,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        bool will_fail_association,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        syncer::ModelType type) {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AbstractAutofillFactory* factory = GetFactory(type);
545c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SigninManagerBase* signin = SigninManagerFactory::GetForProfile(profile_);
546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    signin->SetAuthenticatedUsername("test_user@gmail.com");
547c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    sync_service_ = TestProfileSyncService::BuildAutoStartAsyncInit(profile_,
548c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                                                    callback);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ProfileSyncComponentsFactoryMock* components =
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        sync_service_->components_factory_mock();
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DataTypeController* data_type_controller =
553c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        factory->CreateDataTypeController(components, profile_, sync_service_);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    factory->SetExpectation(components,
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            sync_service_,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            web_data_service_.get(),
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            data_type_controller);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_CALL(*components, CreateDataTypeManager(_, _, _, _, _)).
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WillOnce(ReturnNewDataTypeManagerWithDebugListener(
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     syncer::MakeWeakHandle(debug_ptr_factory_.GetWeakPtr())));
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*personal_data_manager_, IsDataLoaded()).
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WillRepeatedly(Return(true));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // We need tokens to get the tests going
567c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ProfileOAuth2TokenServiceFactory::GetForProfile(profile_)
56868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        ->UpdateCredentials("test_user@gmail.com", "oauth2_login_token");
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_service_->RegisterDataTypeController(data_type_controller);
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    sync_service_->Initialize();
57290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // It's possible this test triggered an unrecoverable error, in which case
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // we can't get the sync count.
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (sync_service_->ShouldPushChanges()) {
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(GetSyncCount(type),
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                association_stats_.num_sync_items_after_association);
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(association_stats_.num_sync_items_after_association,
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              association_stats_.num_sync_items_before_association +
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              association_stats_.num_sync_items_added -
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              association_stats_.num_sync_items_deleted);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddAutofillSyncNode(const AutofillEntry& entry) {
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
58946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (autofill_root.InitTypeRoot(syncer::AUTOFILL) != BaseNode::INIT_OK) {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode node(&trans);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string tag = AutocompleteSyncableService::KeyToTag(
5955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UTF16ToUTF8(entry.key().name()),
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UTF16ToUTF8(entry.key().value()));
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode::InitUniqueByCreationResult result =
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node.InitUniqueByCreation(syncer::AUTOFILL, autofill_root, tag);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (result != syncer::WriteNode::INIT_SUCCESS)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::EntitySpecifics specifics;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutocompleteSyncableService::WriteAutofillEntry(entry, &specifics);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::AutofillSpecifics* autofill_specifics =
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        specifics.mutable_autofill();
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node.SetAutofillSpecifics(*autofill_specifics);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddAutofillSyncNode(const AutofillProfile& profile) {
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
61346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (autofill_root.InitTypeRoot(AUTOFILL_PROFILE) != BaseNode::INIT_OK) {
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode node(&trans);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string tag = profile.guid();
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::WriteNode::InitUniqueByCreationResult result =
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        node.InitUniqueByCreation(syncer::AUTOFILL_PROFILE,
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  autofill_root, tag);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (result != syncer::WriteNode::INIT_SUCCESS)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::EntitySpecifics specifics;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutofillProfileSyncableService::WriteAutofillProfile(profile, &specifics);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::AutofillProfileSpecifics* profile_specifics =
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        specifics.mutable_autofill_profile();
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node.SetAutofillProfileSpecifics(*profile_specifics);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetAutofillEntriesFromSyncDB(std::vector<AutofillEntry>* entries,
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    std::vector<AutofillProfile>* profiles) {
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
63646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (autofill_root.InitTypeRoot(syncer::AUTOFILL) != BaseNode::INIT_OK) {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 child_id = autofill_root.GetFirstChildId();
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (child_id != syncer::kInvalidId) {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ReadNode child_node(&trans);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (child_node.InitByIdLookup(child_id) != BaseNode::INIT_OK)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const sync_pb::AutofillSpecifics& autofill(
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          child_node.GetAutofillSpecifics());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (autofill.has_value()) {
6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        AutofillKey key(base::UTF8ToUTF16(autofill.name()),
6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        base::UTF8ToUTF16(autofill.value()));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::vector<base::Time> timestamps;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int timestamps_count = autofill.usage_timestamp_size();
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (int i = 0; i < timestamps_count; ++i) {
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          timestamps.push_back(Time::FromInternalValue(
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              autofill.usage_timestamp(i)));
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
657a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        entries->push_back(
658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            AutofillEntry(key, timestamps.front(), timestamps.back()));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (autofill.has_profile()) {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfile p;
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p.set_guid(autofill.profile().guid());
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfileSyncableService::OverwriteProfileWithServerData(
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            autofill.profile(), &p, "en-US");
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        profiles->push_back(p);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child_id = child_node.GetSuccessorId();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetAutofillProfilesFromSyncDBUnderProfileNode(
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<AutofillProfile>* profiles) {
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ReadNode autofill_root(&trans);
67546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (autofill_root.InitTypeRoot(AUTOFILL_PROFILE) != BaseNode::INIT_OK) {
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int64 child_id = autofill_root.GetFirstChildId();
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    while (child_id != syncer::kInvalidId) {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ReadNode child_node(&trans);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (child_node.InitByIdLookup(child_id) != BaseNode::INIT_OK)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const sync_pb::AutofillProfileSpecifics& autofill(
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          child_node.GetAutofillProfileSpecifics());
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfile p;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p.set_guid(autofill.guid());
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AutofillProfileSyncableService::OverwriteProfileWithServerData(
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            autofill, &p, "en-US");
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        profiles->push_back(p);
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      child_id = child_node.GetSuccessorId();
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIdleChangeProcessorExpectations() {
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(autofill_table_, RemoveFormElement(_, _)).Times(0);
699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_CALL(autofill_table_, GetAutofillTimestamps(_, _, _, _)).Times(0);
7005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Only permit UpdateAutofillEntries() to be called with an empty list.
7025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<AutofillEntry> empty;
7035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_CALL(autofill_table_, UpdateAutofillEntries(Not(empty))).Times(0);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AutofillEntry MakeAutofillEntry(const char* name,
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const char* value,
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int time_shift0,
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int time_shift1) {
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Time deep in the past would cause Autocomplete sync to discard the
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // entries.
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static Time base_time = Time::Now().LocalMidnight();
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::Time date_created = base_time + TimeDelta::FromSeconds(time_shift0);
715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    base::Time date_last_used = date_created;
716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (time_shift1 >= 0)
717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      date_last_used = base_time + TimeDelta::FromSeconds(time_shift1);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return AutofillEntry(
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        AutofillKey(base::ASCIIToUTF16(name), base::ASCIIToUTF16(value)),
720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        date_created, date_last_used);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static AutofillEntry MakeAutofillEntry(const char* name,
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const char* value,
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         int time_shift) {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return MakeAutofillEntry(name, value, time_shift, -1);
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AddAutofillHelper<AutofillEntry>;
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class AddAutofillHelper<AutofillProfile>;
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class FakeServerUpdater;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
733c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  TestingProfileManager profile_manager_;
734c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  TestingProfile* profile_;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillTableMock autofill_table_;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WebDatabaseFake> web_database_;
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<WebDataServiceFake> web_data_service_;
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPersonalDataManager* personal_data_manager_;
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syncer::DataTypeAssociationStats association_stats_;
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<DataTypeDebugInfoListener> debug_ptr_factory_;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class T>
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AddAutofillHelper {
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper(ProfileSyncServiceAutofillTest* test,
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const std::vector<T>& entries)
748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : callback_(base::Bind(&AddAutofillHelper::AddAutofillCallback,
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             base::Unretained(this), test, entries)),
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        success_(false) {
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Closure& callback() const { return callback_; }
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success() { return success_; }
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddAutofillCallback(ProfileSyncServiceAutofillTest* test,
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::vector<T>& entries) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!test->CreateRoot(GetModelType<T>()))
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < entries.size(); ++i) {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!test->AddAutofillSyncNode(entries[i]))
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    success_ = true;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure callback_;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success_;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Overload write transaction to use custom NotifyTransactionComplete
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WriteTransactionTest: public WriteTransaction {
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WriteTransactionTest(const tracked_objects::Location& from_here,
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       WriterTag writer,
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       syncer::syncable::Directory* directory,
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       scoped_ptr<WaitableEvent>* wait_for_syncapi)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : WriteTransaction(from_here, writer, directory),
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wait_for_syncapi_(wait_for_syncapi) { }
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyTransactionComplete(
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelTypeSet types) OVERRIDE {
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is where we differ. Force a thread change here, giving another
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // thread a chance to create a WriteTransaction
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*wait_for_syncapi_)->Wait();
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteTransaction::NotifyTransactionComplete(types);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent>* wait_for_syncapi_;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Our fake server updater. Needs the RefCountedThreadSafe inheritance so we can
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// post tasks with it.
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeServerUpdater : public base::RefCountedThreadSafe<FakeServerUpdater> {
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeServerUpdater(TestProfileSyncService* service,
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    scoped_ptr<WaitableEvent>* wait_for_start,
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    scoped_ptr<WaitableEvent>* wait_for_syncapi)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : entry_(ProfileSyncServiceAutofillTest::MakeAutofillEntry("0", "0", 0)),
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        service_(service),
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wait_for_start_(wait_for_start),
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        wait_for_syncapi_(wait_for_syncapi),
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        is_finished_(false, false) { }
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Update() {
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This gets called in a modelsafeworker thread.
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::DB));
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::UserShare* user_share = service_->GetUserShare();
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::syncable::Directory* directory = user_share->directory.get();
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Create autofill protobuf.
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string tag = AutocompleteSyncableService::KeyToTag(
8185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UTF16ToUTF8(entry_.key().name()),
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::UTF16ToUTF8(entry_.key().value()));
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::AutofillSpecifics new_autofill;
8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new_autofill.set_name(base::UTF16ToUTF8(entry_.key().name()));
8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    new_autofill.set_value(base::UTF16ToUTF8(entry_.key().value()));
823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    new_autofill.add_usage_timestamp(entry_.date_created().ToInternalValue());
824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (entry_.date_created() != entry_.date_last_used()) {
825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      new_autofill.add_usage_timestamp(
826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          entry_.date_last_used().ToInternalValue());
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_pb::EntitySpecifics entity_specifics;
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entity_specifics.mutable_autofill()->CopyFrom(new_autofill);
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Tell main thread we've started
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (*wait_for_start_)->Signal();
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Create write transaction.
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WriteTransactionTest trans(FROM_HERE, UNITTEST, directory,
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 wait_for_syncapi_);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Create actual entry based on autofill protobuf information.
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Simulates effects of UpdateLocalDataFromServerData
84246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      MutableEntry parent(&trans, GET_TYPE_ROOT, syncer::AUTOFILL);
843d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      MutableEntry item(&trans, CREATE, syncer::AUTOFILL, parent.GetId(), tag);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(item.good());
845d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      item.PutSpecifics(entity_specifics);
846d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      item.PutServerSpecifics(entity_specifics);
847d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      item.PutBaseVersion(1);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::syncable::Id server_item_id =
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          service_->id_factory()->NewServerId();
850d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      item.PutId(server_item_id);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::syncable::Id new_predecessor;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(item.PutPredecessor(new_predecessor));
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "FakeServerUpdater finishing.";
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_finished_.Signal();
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateNewEntry(const AutofillEntry& entry) {
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_ = entry;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(BrowserThread::CurrentlyOn(BrowserThread::DB));
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!BrowserThread::PostTask(
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::DB, FROM_HERE,
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&FakeServerUpdater::Update, this))) {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Failed to post task to the db thread.";
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateNewEntryAndWait(const AutofillEntry& entry) {
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry_ = entry;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(BrowserThread::CurrentlyOn(BrowserThread::DB));
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_finished_.Reset();
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         base::Bind(&FakeServerUpdater::Update, this))) {
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << "Failed to post task to the db thread.";
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_finished_.Wait();
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<FakeServerUpdater>;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~FakeServerUpdater() { }
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry entry_;
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestProfileSyncService* service_;
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent>* wait_for_start_;
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent>* wait_for_syncapi_;
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitableEvent is_finished_;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::syncable::Id parent_id_;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Checks if the field of type |field_type| in |profile1| includes all values
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the field in |profile2|.
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IncludesField(const AutofillProfile& profile1,
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   const AutofillProfile& profile2,
8993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                   ServerFieldType field_type) {
900a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> values1;
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile1.GetRawMultiInfo(field_type, &values1);
902a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::vector<base::string16> values2;
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  profile2.GetRawMultiInfo(field_type, &values2);
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::set<base::string16> values_set;
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < values1.size(); ++i)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values_set.insert(values1[i]);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < values2.size(); ++i)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (values_set.find(values2[i]) == values_set.end())
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(skrul): Test abort startup.
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(skrul): Test processing of cloud changes.
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(tim): Add autofill data type controller test, and a case to cover
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//            waiting for the PersonalDataManager.
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, FailModelAssociation) {
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't create the root autofill node so startup fails.
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(base::Closure(), true, syncer::AUTOFILL);
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(sync_service_->HasUnrecoverableError());
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, EmptyNativeEmptySync) {
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).WillOnce(Return(true));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(create_root.success());
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_entries.size());
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_profiles.size());
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeEntriesEmptySync) {
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("foo", "bar", 1));
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(entries), Return(true)));
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, entries.size());
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entries[0] == sync_entries[0]);
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_profiles.size());
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasProfileEmptySync) {
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> profiles;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> expected_profiles;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Owned by GetAutofillProfiles caller.
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* profile0 = new AutofillProfile;
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(profile0,
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "54B3F9AA-335E-4F71-A27D-719C41564230", "Billing",
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profiles.push_back(profile0);
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_profiles.push_back(*profile0);
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(profiles), Return(true)));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL_PROFILE);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL_PROFILE);
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(&sync_profiles));
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, sync_profiles.size());
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, expected_profiles[0].Compare(sync_profiles[0]));
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeWithDuplicatesEmptySync) {
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is buggy autofill code that allows duplicate name/value
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pairs to exist in the database with separate pair_ids.
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> entries;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("foo", "bar", 1));
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("dup", "", 2));
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entries.push_back(MakeAutofillEntry("dup", "", 3));
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(entries), Return(true)));
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, sync_entries.size());
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncNoMerge) {
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry native_entry(MakeAutofillEntry("native", "entry", 1));
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry sync_entry(MakeAutofillEntry("sync", "entry", 2));
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> native_entries;
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_entries.push_back(native_entry);
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(true)));
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_entries.push_back(sync_entry);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillEntry> add_autofill(this, sync_entries);
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, UpdateAutofillEntries(ElementsAre(sync_entry))).
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<AutofillEntry> expected_entries;
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_entries.insert(native_entry);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_entries.insert(sync_entry);
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<AutofillEntry> new_sync_entries_set(new_sync_entries.begin(),
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               new_sync_entries.end());
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected_entries == new_sync_entries_set);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncMergeEntry) {
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry native_entry(MakeAutofillEntry("merge", "entry", 1));
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry sync_entry(MakeAutofillEntry("merge", "entry", 2));
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry merged_entry(MakeAutofillEntry("merge", "entry", 1, 2));
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> native_entries;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_entries.push_back(native_entry);
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_entries), Return(true)));
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_entries.push_back(sync_entry);
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillEntry> add_autofill(this, sync_entries);
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdateAutofillEntries(ElementsAre(merged_entry))).WillOnce(Return(true));
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL);
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
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)  ASSERT_EQ(1U, new_sync_entries.size());
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(merged_entry == new_sync_entries[0]);
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncMergeProfile) {
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
1069c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing",
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
1076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing", "Alicia", "Saenz",
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
109190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              UpdateAutofillProfile(MatchProfiles(sync_profile))).
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, sync_profile.Compare(new_sync_profiles[0]));
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, HasNativeHasSyncMergeProfileCombine) {
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing",
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same address, but different names, phones and e-mails.
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBF", "Billing", "Alicia", "Saenz",
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "19482937549");
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile expected_profile(sync_profile);
1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected_profile.OverwriteWithOrAddTo(*native_profile, "en-US");
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              AddAutofillProfile(MatchProfiles(expected_profile))).
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_,
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              RemoveAutofillProfile("23355099-1170-4B71-8ED4-144470CC9EBF")).
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that key fields are the same.
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(new_sync_profiles[0].IsSubsetOf(sync_profile, "en-US"));
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that multivalued fields of the synced back data include original
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // data.
1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IncludesField(new_sync_profiles[0], sync_profile, autofill::NAME_FULL));
1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IncludesField(
1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_sync_profiles[0], sync_profile, autofill::EMAIL_ADDRESS));
1152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IncludesField(
1153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      new_sync_profiles[0], sync_profile, autofill::PHONE_HOME_WHOLE_NUMBER));
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, MergeProfileWithDifferentGuid) {
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "23355099-1170-4B71-8ED4-144470CC9EBE", "Billing",
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string native_guid = "EDC609ED-7EEE-4F27-B00C-423242A9C44B";
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_guid.c_str(), "Billing",
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Mitchell", "Morrison",
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "91601", "US", "12345678910");
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, AddAutofillProfile(_)).
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, RemoveAutofillProfile(native_guid)).
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(Return(true));
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, sync_profile.Compare(new_sync_profiles[0]));
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(sync_profile.guid(), new_sync_profiles[0].guid());
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeAddEntry) {
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).WillOnce(Return(true));
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry added_entry(MakeAutofillEntry("added", "entry", 1));
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillTimestamps(_, _, _, _)).
1209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<2>(added_entry.date_created()),
1210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     SetArgumentPointee<3>(added_entry.date_last_used()),
1211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     Return(true)));
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.push_back(AutofillChange(AutofillChange::ADD, added_entry.key()));
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillEntriesChanged(changes);
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_entries.size());
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(added_entry == new_sync_entries[0]);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeAddProfile) {
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).WillOnce(Return(true));
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetIdleChangeProcessorExpectations();
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL_PROFILE);
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL_PROFILE);
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile added_profile;
1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&added_profile,
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "D6ADA912-D374-4C0A-917D-F5C8EBE43011", "Josephine", "Alicia", "Saenz",
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillProfileChange change(
1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutofillProfileChange::ADD, added_profile.guid(), &added_profile);
1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillProfileChanged(change);
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_profiles.size());
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, added_profile.Compare(new_sync_profiles[0]));
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeUpdateEntry) {
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry original_entry(MakeAutofillEntry("my", "entry", 1));
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> original_entries;
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_entries.push_back(original_entry);
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true)));
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry updated_entry(MakeAutofillEntry("my", "entry", 1, 2));
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillTimestamps(_, _, _, _)).
1266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<2>(updated_entry.date_created()),
1267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     SetArgumentPointee<3>(updated_entry.date_last_used()),
1268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     Return(true)));
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.push_back(AutofillChange(AutofillChange::UPDATE,
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   updated_entry.key()));
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillEntriesChanged(changes);
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, new_sync_entries.size());
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(updated_entry == new_sync_entries[0]);
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeRemoveEntry) {
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry original_entry(MakeAutofillEntry("my", "entry", 1));
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> original_entries;
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  original_entries.push_back(original_entry);
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(original_entries), Return(true)));
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillChangeList changes;
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  changes.push_back(AutofillChange(AutofillChange::REMOVE,
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   original_entry.key()));
1299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillEntriesChanged(changes);
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> new_sync_entries;
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&new_sync_entries,
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           &new_sync_profiles));
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, new_sync_entries.size());
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, ProcessUserChangeRemoveProfile) {
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile sync_profile;
1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(&sync_profile,
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "3BA5FA1B-1EC4-4BB3-9B57-EC92BE3C1A09", "Josephine", "Alicia", "Saenz",
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillProfile* native_profile = new AutofillProfile;
1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  autofill::test::SetProfileInfoWithGuid(native_profile,
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "3BA5FA1B-1EC4-4BB3-9B57-EC92BE3C1A09", "Josephine", "Alicia", "Saenz",
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "32801", "US", "19482937549");
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile*> native_profiles;
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_profiles.push_back(native_profile);
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillOnce(DoAll(SetArgumentPointee<0>(native_profiles), Return(true)));
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_profiles.push_back(sync_profile);
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddAutofillHelper<AutofillProfile> add_autofill(this, sync_profiles);
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh());
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(add_autofill.callback(), false, syncer::AUTOFILL_PROFILE);
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(add_autofill.success());
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutofillProfileChange change(
1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutofillProfileChange::REMOVE, sync_profile.guid(), NULL);
1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_data_service_->OnAutofillProfileChanged(change);
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> new_sync_profiles;
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillProfilesFromSyncDBUnderProfileNode(
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &new_sync_profiles));
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, new_sync_profiles.size());
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/57884
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ProfileSyncServiceAutofillTest, DISABLED_ServerChangeRace) {
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Once for MergeDataAndStartSyncing() and twice for ProcessSyncChanges(), via
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // LoadAutofillData().
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAllAutofillEntries(_)).
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Times(3).WillRepeatedly(Return(true));
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On the other hand Autofill and Autocomplete are separated now, so
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetAutofillProfiles() should not be called.
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, GetAutofillProfiles(_)).Times(0);
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(autofill_table_, UpdateAutofillEntries(_)).
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WillRepeatedly(Return(true));
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*personal_data_manager_, Refresh()).Times(3);
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateRootHelper create_root(this, syncer::AUTOFILL);
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartSyncService(create_root.callback(), false, syncer::AUTOFILL);
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(create_root.success());
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (true, false) means we have to reset after |Signal|, init to unsignaled.
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent> wait_for_start(new WaitableEvent(true, false));
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WaitableEvent> wait_for_syncapi(new WaitableEvent(true, false));
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<FakeServerUpdater> updater(new FakeServerUpdater(
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sync_service_, &wait_for_start, &wait_for_syncapi));
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This server side update will stall waiting for CommitWaiter.
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updater->CreateNewEntry(MakeAutofillEntry("server", "entry", 1));
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wait_for_start->Wait();
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillEntry syncapi_entry(MakeAutofillEntry("syncapi", "entry", 2));
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(AddAutofillSyncNode(syncapi_entry));
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "Syncapi update finished.";
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we reach here, it means syncapi succeeded and we didn't deadlock. Yay!
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Signal FakeServerUpdater that it can complete.
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wait_for_syncapi->Signal();
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make another entry to ensure nothing broke afterwards and wait for finish
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to clean up.
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updater->CreateNewEntryAndWait(MakeAutofillEntry("server2", "entry2", 3));
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillEntry> sync_entries;
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<AutofillProfile> sync_profiles;
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(GetAutofillEntriesFromSyncDB(&sync_entries, &sync_profiles));
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, sync_entries.size());
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, sync_profiles.size());
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < sync_entries.size(); i++) {
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "Entry " << i << ": " << sync_entries[i].key().name()
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             << ", " << sync_entries[i].key().value();
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1390