Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync / test / integration / sync_errors_test.cc
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 "base/run_loop.h"
8 #include "chrome/browser/sync/profile_sync_service.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/profile_sync_service_harness.h"
12 #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
13 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
14 #include "chrome/browser/sync/test/integration/sync_test.h"
15 #include "chrome/common/pref_names.h"
16 #include "google_apis/gaia/google_service_auth_error.h"
17 #include "sync/protocol/sync_protocol_error.h"
18
19 using bookmarks_helper::AddFolder;
20 using bookmarks_helper::SetTitle;
21 using sync_integration_test_util::AwaitCommitActivityCompletion;
22
23 namespace {
24
25 class SyncDisabledChecker : public SingleClientStatusChangeChecker {
26  public:
27   explicit SyncDisabledChecker(ProfileSyncService* service)
28       : SingleClientStatusChangeChecker(service) {}
29
30   bool IsExitConditionSatisfied() override {
31     return !service()->setup_in_progress() &&
32            !service()->HasSyncSetupCompleted();
33   }
34
35   std::string GetDebugMessage() const override { return "Sync Disabled"; }
36 };
37
38 class TypeDisabledChecker : public SingleClientStatusChangeChecker {
39  public:
40   explicit TypeDisabledChecker(ProfileSyncService* service,
41                                syncer::ModelType type)
42       : SingleClientStatusChangeChecker(service), type_(type) {}
43
44   bool IsExitConditionSatisfied() override {
45     return !service()->GetActiveDataTypes().Has(type_);
46   }
47
48   std::string GetDebugMessage() const override { return "Type disabled"; }
49  private:
50    syncer::ModelType type_;
51 };
52
53 bool AwaitSyncDisabled(ProfileSyncService* service) {
54   SyncDisabledChecker checker(service);
55   checker.Wait();
56   return !checker.TimedOut();
57 }
58
59 bool AwaitTypeDisabled(ProfileSyncService* service,
60                        syncer::ModelType type) {
61   TypeDisabledChecker checker(service, type);
62   checker.Wait();
63   return !checker.TimedOut();
64 }
65
66 class SyncErrorTest : public SyncTest {
67  public:
68   SyncErrorTest() : SyncTest(SINGLE_CLIENT) {}
69   ~SyncErrorTest() override {}
70
71  private:
72   DISALLOW_COPY_AND_ASSIGN(SyncErrorTest);
73 };
74
75 // Helper class that waits until the sync engine has hit an actionable error.
76 class ActionableErrorChecker : public SingleClientStatusChangeChecker {
77  public:
78   explicit ActionableErrorChecker(ProfileSyncService* service)
79       : SingleClientStatusChangeChecker(service) {}
80
81   ~ActionableErrorChecker() override {}
82
83   // Checks if an actionable error has been hit. Called repeatedly each time PSS
84   // notifies observers of a state change.
85   bool IsExitConditionSatisfied() override {
86     ProfileSyncService::Status status;
87     service()->QueryDetailedSyncStatus(&status);
88     return (status.sync_protocol_error.action != syncer::UNKNOWN_ACTION &&
89             service()->HasUnrecoverableError());
90   }
91
92   std::string GetDebugMessage() const override {
93     return "ActionableErrorChecker";
94   }
95
96  private:
97   DISALLOW_COPY_AND_ASSIGN(ActionableErrorChecker);
98 };
99
100 IN_PROC_BROWSER_TEST_F(SyncErrorTest, BirthdayErrorTest) {
101   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
102
103   // Add an item, wait for sync, and trigger a birthday error on the server.
104   const BookmarkNode* node1 = AddFolder(0, 0, "title1");
105   SetTitle(0, node1, "new_title1");
106   ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
107   ASSERT_TRUE(GetFakeServer()->SetNewStoreBirthday("new store birthday"));
108
109   // Now make one more change so we will do another sync.
110   const BookmarkNode* node2 = AddFolder(0, 0, "title2");
111   SetTitle(0, node2, "new_title2");
112   ASSERT_TRUE(AwaitSyncDisabled(GetSyncService((0))));
113 }
114
115 IN_PROC_BROWSER_TEST_F(SyncErrorTest, ActionableErrorTest) {
116   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
117
118   const BookmarkNode* node1 = AddFolder(0, 0, "title1");
119   SetTitle(0, node1, "new_title1");
120   ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
121
122   std::string description = "Not My Fault";
123   std::string url = "www.google.com";
124   EXPECT_TRUE(GetFakeServer()->TriggerActionableError(
125       sync_pb::SyncEnums::TRANSIENT_ERROR,
126       description,
127       url,
128       sync_pb::SyncEnums::UPGRADE_CLIENT));
129
130   // Now make one more change so we will do another sync.
131   const BookmarkNode* node2 = AddFolder(0, 0, "title2");
132   SetTitle(0, node2, "new_title2");
133
134   // Wait until an actionable error is encountered.
135   ActionableErrorChecker actionable_error_checker(GetSyncService((0)));
136   actionable_error_checker.Wait();
137   ASSERT_FALSE(actionable_error_checker.TimedOut());
138
139   ProfileSyncService::Status status;
140   GetSyncService((0))->QueryDetailedSyncStatus(&status);
141   ASSERT_EQ(status.sync_protocol_error.error_type, syncer::TRANSIENT_ERROR);
142   ASSERT_EQ(status.sync_protocol_error.action, syncer::UPGRADE_CLIENT);
143   ASSERT_EQ(status.sync_protocol_error.url, url);
144   ASSERT_EQ(status.sync_protocol_error.error_description, description);
145 }
146
147 // TODO(sync): Fix failing test on Chrome OS: http://crbug.com/351160
148 IN_PROC_BROWSER_TEST_F(SyncErrorTest, DISABLED_ErrorWhileSettingUpAutoStart) {
149   ASSERT_TRUE(SetupClients());
150   ASSERT_TRUE(GetSyncService(0)->auto_start_enabled());
151
152   // In auto start enabled platforms like chrome os we should be
153   // able to set up even if the first sync while setting up fails.
154   EXPECT_TRUE(GetFakeServer()->TriggerError(
155       sync_pb::SyncEnums::TRANSIENT_ERROR));
156   EXPECT_TRUE(GetFakeServer()->EnableAlternatingTriggeredErrors());
157   // Now setup sync and it should succeed.
158   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
159 }
160
161 #if defined(OS_CHROMEOS)
162 #define MAYBE_ErrorWhileSettingUp DISABLED_ErrorWhileSettingUp
163 #else
164 #define MAYBE_ErrorWhileSettingUp ErrorWhileSettingUp
165 #endif
166 IN_PROC_BROWSER_TEST_F(SyncErrorTest, MAYBE_ErrorWhileSettingUp) {
167   ASSERT_TRUE(SetupClients());
168   ASSERT_FALSE(GetSyncService(0)->auto_start_enabled());
169
170   // In Non auto start enabled environments if the setup sync fails then
171   // the setup would fail. So setup sync normally.
172   ASSERT_TRUE(SetupSync()) << "Setup sync failed";
173   ASSERT_TRUE(GetClient(0)->DisableSyncForDatatype(syncer::AUTOFILL));
174
175   EXPECT_TRUE(GetFakeServer()->TriggerError(
176       sync_pb::SyncEnums::TRANSIENT_ERROR));
177   EXPECT_TRUE(GetFakeServer()->EnableAlternatingTriggeredErrors());
178
179   // Now enable a datatype, whose first 2 syncs would fail, but we should
180   // recover and setup succesfully on the third attempt.
181   ASSERT_TRUE(GetClient(0)->EnableSyncForDatatype(syncer::AUTOFILL));
182 }
183
184 IN_PROC_BROWSER_TEST_F(SyncErrorTest, BirthdayErrorUsingActionableErrorTest) {
185   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
186
187   const BookmarkNode* node1 = AddFolder(0, 0, "title1");
188   SetTitle(0, node1, "new_title1");
189   ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
190
191   std::string description = "Not My Fault";
192   std::string url = "www.google.com";
193   EXPECT_TRUE(GetFakeServer()->TriggerActionableError(
194       sync_pb::SyncEnums::NOT_MY_BIRTHDAY,
195       description,
196       url,
197       sync_pb::SyncEnums::DISABLE_SYNC_ON_CLIENT));
198
199   // Now make one more change so we will do another sync.
200   const BookmarkNode* node2 = AddFolder(0, 0, "title2");
201   SetTitle(0, node2, "new_title2");
202   ASSERT_TRUE(AwaitSyncDisabled(GetSyncService((0))));
203   ProfileSyncService::Status status;
204   GetSyncService((0))->QueryDetailedSyncStatus(&status);
205   ASSERT_EQ(status.sync_protocol_error.error_type, syncer::NOT_MY_BIRTHDAY);
206   ASSERT_EQ(status.sync_protocol_error.action, syncer::DISABLE_SYNC_ON_CLIENT);
207   ASSERT_EQ(status.sync_protocol_error.url, url);
208   ASSERT_EQ(status.sync_protocol_error.error_description, description);
209 }
210
211 IN_PROC_BROWSER_TEST_F(SyncErrorTest, DisableDatatypeWhileRunning) {
212   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
213   syncer::ModelTypeSet synced_datatypes =
214       GetSyncService((0))->GetActiveDataTypes();
215   ASSERT_TRUE(synced_datatypes.Has(syncer::TYPED_URLS));
216   ASSERT_TRUE(synced_datatypes.Has(syncer::SESSIONS));
217   GetProfile(0)->GetPrefs()->SetBoolean(
218       prefs::kSavingBrowserHistoryDisabled, true);
219
220   // Wait for reconfigurations.
221   ASSERT_TRUE(AwaitTypeDisabled(GetSyncService(0), syncer::TYPED_URLS));
222   ASSERT_TRUE(AwaitTypeDisabled(GetSyncService(0), syncer::SESSIONS));
223
224   const BookmarkNode* node1 = AddFolder(0, 0, "title1");
225   SetTitle(0, node1, "new_title1");
226   ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
227   // TODO(lipalani)" Verify initial sync ended for typed url is false.
228 }
229
230 }  // namespace