1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/prefs/pref_member.h" 6 #include "base/prefs/pref_service.h" 7 #include "chrome/browser/sync/profile_sync_service.h" 8 #include "chrome/browser/sync/profile_sync_service_harness.h" 9 #include "chrome/browser/sync/test/integration/bookmarks_helper.h" 10 #include "chrome/browser/sync/test/integration/passwords_helper.h" 11 #include "chrome/browser/sync/test/integration/sync_test.h" 12 #include "chrome/common/pref_names.h" 13 #include "google_apis/gaia/google_service_auth_error.h" 14 #include "sync/protocol/sync_protocol_error.h" 15 16 using bookmarks_helper::AddFolder; 17 using bookmarks_helper::SetTitle; 18 19 class SyncErrorTest : public SyncTest { 20 public: 21 SyncErrorTest() : SyncTest(SINGLE_CLIENT) {} 22 virtual ~SyncErrorTest() {} 23 24 private: 25 DISALLOW_COPY_AND_ASSIGN(SyncErrorTest); 26 }; 27 28 IN_PROC_BROWSER_TEST_F(SyncErrorTest, BirthdayErrorTest) { 29 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 30 31 const BookmarkNode* node1 = AddFolder(0, 0, L"title1"); 32 SetTitle(0, node1, L"new_title1"); 33 ASSERT_TRUE(GetClient(0)->AwaitFullSyncCompletion("Offline state change.")); 34 TriggerBirthdayError(); 35 36 // Now make one more change so we will do another sync. 37 const BookmarkNode* node2 = AddFolder(0, 0, L"title2"); 38 SetTitle(0, node2, L"new_title2"); 39 ASSERT_TRUE(GetClient(0)->AwaitSyncDisabled("Birthday error.")); 40 } 41 42 IN_PROC_BROWSER_TEST_F(SyncErrorTest, TransientErrorTest) { 43 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 44 45 const BookmarkNode* node1 = AddFolder(0, 0, L"title1"); 46 SetTitle(0, node1, L"new_title1"); 47 ASSERT_TRUE(GetClient(0)->AwaitFullSyncCompletion("Offline state change.")); 48 TriggerTransientError(); 49 50 // Now make one more change so we will do another sync. 51 const BookmarkNode* node2 = AddFolder(0, 0, L"title2"); 52 SetTitle(0, node2, L"new_title2"); 53 ASSERT_TRUE( 54 GetClient(0)->AwaitExponentialBackoffVerification()); 55 } 56 57 IN_PROC_BROWSER_TEST_F(SyncErrorTest, ActionableErrorTest) { 58 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 59 60 const BookmarkNode* node1 = AddFolder(0, 0, L"title1"); 61 SetTitle(0, node1, L"new_title1"); 62 ASSERT_TRUE(GetClient(0)->AwaitFullSyncCompletion("Sync.")); 63 64 syncer::SyncProtocolError protocol_error; 65 protocol_error.error_type = syncer::TRANSIENT_ERROR; 66 protocol_error.action = syncer::UPGRADE_CLIENT; 67 protocol_error.error_description = "Not My Fault"; 68 protocol_error.url = "www.google.com"; 69 TriggerSyncError(protocol_error, SyncTest::ERROR_FREQUENCY_ALWAYS); 70 71 // Now make one more change so we will do another sync. 72 const BookmarkNode* node2 = AddFolder(0, 0, L"title2"); 73 SetTitle(0, node2, L"new_title2"); 74 ASSERT_TRUE( 75 GetClient(0)->AwaitActionableError()); 76 ProfileSyncService::Status status = GetClient(0)->GetStatus(); 77 ASSERT_EQ(status.sync_protocol_error.error_type, protocol_error.error_type); 78 ASSERT_EQ(status.sync_protocol_error.action, protocol_error.action); 79 ASSERT_EQ(status.sync_protocol_error.url, protocol_error.url); 80 ASSERT_EQ(status.sync_protocol_error.error_description, 81 protocol_error.error_description); 82 } 83 84 IN_PROC_BROWSER_TEST_F(SyncErrorTest, ErrorWhileSettingUp) { 85 ASSERT_TRUE(SetupClients()); 86 87 syncer::SyncProtocolError protocol_error; 88 protocol_error.error_type = syncer::TRANSIENT_ERROR; 89 protocol_error.error_description = "Not My Fault"; 90 protocol_error.url = "www.google.com"; 91 92 if (clients()[0]->AutoStartEnabled()) { 93 // In auto start enabled platforms like chrome os we should be 94 // able to set up even if the first sync while setting up fails. 95 // Trigger error on every 2 out of 3 requests. 96 TriggerSyncError(protocol_error, SyncTest::ERROR_FREQUENCY_TWO_THIRDS); 97 // Now setup sync and it should succeed. 98 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 99 } else { 100 // In Non auto start enabled environments if the setup sync fails then 101 // the setup would fail. So setup sync normally. 102 ASSERT_TRUE(SetupSync()) << "Setup sync failed"; 103 ASSERT_TRUE(clients()[0]->DisableSyncForDatatype(syncer::AUTOFILL)); 104 105 // Trigger error on every 2 out of 3 requests. 106 TriggerSyncError(protocol_error, SyncTest::ERROR_FREQUENCY_TWO_THIRDS); 107 108 // Now enable a datatype, whose first 2 syncs would fail, but we should 109 // recover and setup succesfully on the third attempt. 110 ASSERT_TRUE(clients()[0]->EnableSyncForDatatype(syncer::AUTOFILL)); 111 } 112 } 113 114 115 IN_PROC_BROWSER_TEST_F(SyncErrorTest, 116 BirthdayErrorUsingActionableErrorTest) { 117 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 118 119 const BookmarkNode* node1 = AddFolder(0, 0, L"title1"); 120 SetTitle(0, node1, L"new_title1"); 121 ASSERT_TRUE(GetClient(0)->AwaitFullSyncCompletion("Sync.")); 122 123 syncer::SyncProtocolError protocol_error; 124 protocol_error.error_type = syncer::NOT_MY_BIRTHDAY; 125 protocol_error.action = syncer::DISABLE_SYNC_ON_CLIENT; 126 protocol_error.error_description = "Not My Fault"; 127 protocol_error.url = "www.google.com"; 128 TriggerSyncError(protocol_error, SyncTest::ERROR_FREQUENCY_ALWAYS); 129 130 // Now make one more change so we will do another sync. 131 const BookmarkNode* node2 = AddFolder(0, 0, L"title2"); 132 SetTitle(0, node2, L"new_title2"); 133 ASSERT_TRUE( 134 GetClient(0)->AwaitSyncDisabled("Birthday Error.")); 135 ProfileSyncService::Status status = GetClient(0)->GetStatus(); 136 ASSERT_EQ(status.sync_protocol_error.error_type, protocol_error.error_type); 137 ASSERT_EQ(status.sync_protocol_error.action, protocol_error.action); 138 ASSERT_EQ(status.sync_protocol_error.url, protocol_error.url); 139 ASSERT_EQ(status.sync_protocol_error.error_description, 140 protocol_error.error_description); 141 } 142 143 // TODO(pavely): Fix this test. Test needs to successfully setup sync. Then 144 // setup server to trigger auth error and setup FakeURLFetcher to return 145 // INVALID_CREDENTIALS failure for access token request. Then it should 146 // trigger sync and verify that error surfaced through 147 // ProfileSyncService::GetAuthError() 148 // 149 // Trigger an auth error and make sure the sync client displays a warning in the 150 // UI. 151 IN_PROC_BROWSER_TEST_F(SyncErrorTest, DISABLED_AuthErrorTest) { 152 ASSERT_TRUE(SetupClients()); 153 TriggerAuthError(); 154 155 ASSERT_FALSE(GetClient(0)->SetupSync()); 156 ASSERT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS, 157 GetClient(0)->service()->GetAuthError().state()); 158 } 159 160 // TODO(pavely): Fix this test. Test needs to successfully setup sync. Then 161 // setup server to trigger xmpp auth error and setup FakeURLFetcher to return 162 // INVALID_CREDENTIALS failure for access token request. Then it should 163 // trigger sync and verify that error surfaced through 164 // ProfileSyncService::GetAuthError() 165 // 166 // Trigger an XMPP auth error, and make sure sync treats it like any 167 // other auth error. 168 IN_PROC_BROWSER_TEST_F(SyncErrorTest, DISABLED_XmppAuthErrorTest) { 169 ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; 170 171 TriggerXmppAuthError(); 172 173 ASSERT_FALSE(GetClient(0)->SetupSync()); 174 175 ASSERT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS, 176 GetClient(0)->service()->GetAuthError().state()); 177 } 178 179 // TODO(lipalani): Fix the typed_url dtc so this test case can pass. 180 IN_PROC_BROWSER_TEST_F(SyncErrorTest, DISABLED_DisableDatatypeWhileRunning) { 181 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 182 syncer::ModelTypeSet synced_datatypes = 183 GetClient(0)->service()->GetPreferredDataTypes(); 184 ASSERT_TRUE(synced_datatypes.Has(syncer::TYPED_URLS)); 185 GetProfile(0)->GetPrefs()->SetBoolean( 186 prefs::kSavingBrowserHistoryDisabled, true); 187 188 synced_datatypes = GetClient(0)->service()->GetPreferredDataTypes(); 189 ASSERT_FALSE(synced_datatypes.Has(syncer::TYPED_URLS)); 190 191 const BookmarkNode* node1 = AddFolder(0, 0, L"title1"); 192 SetTitle(0, node1, L"new_title1"); 193 ASSERT_TRUE(GetClient(0)->AwaitFullSyncCompletion("Sync.")); 194 // TODO(lipalani)" Verify initial sync ended for typed url is false. 195 } 196 197