- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync / test / integration / two_client_apps_sync_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/basictypes.h"
6 #include "chrome/browser/extensions/extension_service.h"
7 #include "chrome/browser/extensions/extension_sorting.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/sync/profile_sync_service_harness.h"
10 #include "chrome/browser/sync/test/integration/apps_helper.h"
11 #include "chrome/browser/sync/test/integration/sync_app_helper.h"
12 #include "chrome/browser/sync/test/integration/sync_test.h"
13 #include "chrome/common/extensions/extension_constants.h"
14 #include "sync/api/string_ordinal.h"
15
16 using apps_helper::AllProfilesHaveSameAppsAsVerifier;
17 using apps_helper::CopyNTPOrdinals;
18 using apps_helper::DisableApp;
19 using apps_helper::EnableApp;
20 using apps_helper::FixNTPOrdinalCollisions;
21 using apps_helper::GetAppLaunchOrdinalForApp;
22 using apps_helper::HasSameAppsAsVerifier;
23 using apps_helper::IncognitoDisableApp;
24 using apps_helper::IncognitoEnableApp;
25 using apps_helper::InstallApp;
26 using apps_helper::InstallAppsPendingForSync;
27 using apps_helper::InstallPlatformApp;
28 using apps_helper::SetAppLaunchOrdinalForApp;
29 using apps_helper::SetPageOrdinalForApp;
30 using apps_helper::UninstallApp;
31
32 class TwoClientAppsSyncTest : public SyncTest {
33  public:
34   TwoClientAppsSyncTest() : SyncTest(TWO_CLIENT) {}
35
36   virtual ~TwoClientAppsSyncTest() {}
37
38  private:
39   DISALLOW_COPY_AND_ASSIGN(TwoClientAppsSyncTest);
40 };
41
42 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, StartWithNoApps) {
43   ASSERT_TRUE(SetupSync());
44
45   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
46 }
47
48 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, StartWithSameApps) {
49   ASSERT_TRUE(SetupClients());
50
51   const int kNumApps = 5;
52   for (int i = 0; i < kNumApps; ++i) {
53     InstallApp(GetProfile(0), i);
54     InstallApp(GetProfile(1), i);
55     InstallApp(verifier(), i);
56   }
57
58   ASSERT_TRUE(SetupSync());
59
60   ASSERT_TRUE(AwaitQuiescence());
61
62   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
63 }
64
65 // Install some apps on both clients, some on only one client, some on only the
66 // other, and sync.  Both clients should end up with all apps, and the app and
67 // page ordinals should be identical.
68 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, StartWithDifferentApps) {
69   ASSERT_TRUE(SetupClients());
70
71   int i = 0;
72
73   const int kNumCommonApps = 5;
74   for (int j = 0; j < kNumCommonApps; ++i, ++j) {
75     InstallApp(GetProfile(0), i);
76     InstallApp(GetProfile(1), i);
77     InstallApp(verifier(), i);
78   }
79
80   const int kNumProfile0Apps = 10;
81   for (int j = 0; j < kNumProfile0Apps; ++i, ++j) {
82     InstallApp(GetProfile(0), i);
83     InstallApp(verifier(), i);
84     CopyNTPOrdinals(GetProfile(0), verifier(), i);
85   }
86
87   const int kNumProfile1Apps = 10;
88   for (int j = 0; j < kNumProfile1Apps; ++i, ++j) {
89     InstallApp(GetProfile(1), i);
90     InstallApp(verifier(), i);
91     CopyNTPOrdinals(GetProfile(1), verifier(), i);
92   }
93
94   const int kNumPlatformApps = 5;
95   for (int j = 0; j < kNumPlatformApps; ++i, ++j) {
96     InstallPlatformApp(GetProfile(1), i);
97     InstallPlatformApp(verifier(), i);
98     CopyNTPOrdinals(GetProfile(1), verifier(), i);
99   }
100
101   FixNTPOrdinalCollisions(verifier());
102
103   ASSERT_TRUE(SetupSync());
104
105   ASSERT_TRUE(AwaitQuiescence());
106
107   InstallAppsPendingForSync(GetProfile(0));
108   InstallAppsPendingForSync(GetProfile(1));
109
110   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
111 }
112
113 // Install some apps on both clients, then sync.  Then install some apps on only
114 // one client, some on only the other, and then sync again.  Both clients should
115 // end up with all apps, and the app and page ordinals should be identical.
116 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, InstallDifferentApps) {
117   ASSERT_TRUE(SetupClients());
118
119   int i = 0;
120
121   const int kNumCommonApps = 5;
122   for (int j = 0; j < kNumCommonApps; ++i, ++j) {
123     InstallApp(GetProfile(0), i);
124     InstallApp(GetProfile(1), i);
125     InstallApp(verifier(), i);
126   }
127
128   ASSERT_TRUE(SetupSync());
129
130   ASSERT_TRUE(AwaitQuiescence());
131
132   const int kNumProfile0Apps = 10;
133   for (int j = 0; j < kNumProfile0Apps; ++i, ++j) {
134     InstallApp(GetProfile(0), i);
135     InstallApp(verifier(), i);
136     CopyNTPOrdinals(GetProfile(0), verifier(), i);
137   }
138
139   const int kNumProfile1Apps = 10;
140   for (int j = 0; j < kNumProfile1Apps; ++i, ++j) {
141     InstallApp(GetProfile(1), i);
142     InstallApp(verifier(), i);
143     CopyNTPOrdinals(GetProfile(1), verifier(), i);
144   }
145
146   FixNTPOrdinalCollisions(verifier());
147
148   ASSERT_TRUE(AwaitQuiescence());
149
150   InstallAppsPendingForSync(GetProfile(0));
151   InstallAppsPendingForSync(GetProfile(1));
152
153   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
154 }
155
156 // TCM ID - 3711279.
157 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, Add) {
158   ASSERT_TRUE(SetupSync());
159   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
160
161   InstallApp(GetProfile(0), 0);
162   InstallApp(verifier(), 0);
163   ASSERT_TRUE(AwaitQuiescence());
164
165   InstallAppsPendingForSync(GetProfile(0));
166   InstallAppsPendingForSync(GetProfile(1));
167   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
168 }
169
170 // TCM ID - 3706267.
171 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, Uninstall) {
172   ASSERT_TRUE(SetupSync());
173   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
174
175   InstallApp(GetProfile(0), 0);
176   InstallApp(verifier(), 0);
177   ASSERT_TRUE(AwaitQuiescence());
178
179   InstallAppsPendingForSync(GetProfile(0));
180   InstallAppsPendingForSync(GetProfile(1));
181   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
182
183   UninstallApp(GetProfile(0), 0);
184   UninstallApp(verifier(), 0);
185   ASSERT_TRUE(AwaitQuiescence());
186   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
187 }
188
189 // Install an app on one client, then sync. Then uninstall the app on the first
190 // client and sync again. Now install a new app on the first client and sync.
191 // Both client should only have the second app, with identical app and page
192 // ordinals.
193 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, UninstallThenInstall) {
194   ASSERT_TRUE(SetupSync());
195   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
196
197   InstallApp(GetProfile(0), 0);
198   InstallApp(verifier(), 0);
199   ASSERT_TRUE(AwaitQuiescence());
200
201   InstallAppsPendingForSync(GetProfile(0));
202   InstallAppsPendingForSync(GetProfile(1));
203   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
204
205   UninstallApp(GetProfile(0), 0);
206   UninstallApp(verifier(), 0);
207   ASSERT_TRUE(AwaitQuiescence());
208   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
209
210   InstallApp(GetProfile(0), 1);
211   InstallApp(verifier(), 1);
212   ASSERT_TRUE(AwaitQuiescence());
213   InstallAppsPendingForSync(GetProfile(0));
214   InstallAppsPendingForSync(GetProfile(1));
215   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
216 }
217
218 // TCM ID - 3699295.
219 // Flaky: http://crbug.com/226055
220 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, DISABLED_Merge) {
221   ASSERT_TRUE(SetupSync());
222   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
223
224   InstallApp(GetProfile(0), 0);
225   InstallApp(GetProfile(1), 0);
226   ASSERT_TRUE(AwaitQuiescence());
227
228   UninstallApp(GetProfile(0), 0);
229   InstallApp(GetProfile(0), 1);
230   InstallApp(verifier(), 1);
231
232   InstallApp(GetProfile(0), 2);
233   InstallApp(GetProfile(1), 2);
234   InstallApp(verifier(), 2);
235
236   InstallApp(GetProfile(1), 3);
237   InstallApp(verifier(), 3);
238
239   ASSERT_TRUE(AwaitQuiescence());
240   InstallAppsPendingForSync(GetProfile(0));
241   InstallAppsPendingForSync(GetProfile(1));
242   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
243 }
244
245 // TCM ID - 7723126.
246 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, UpdateEnableDisableApp) {
247   ASSERT_TRUE(SetupSync());
248   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
249
250   InstallApp(GetProfile(0), 0);
251   InstallApp(GetProfile(1), 0);
252   InstallApp(verifier(), 0);
253   ASSERT_TRUE(AwaitQuiescence());
254   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
255
256   DisableApp(GetProfile(0), 0);
257   DisableApp(verifier(), 0);
258   ASSERT_TRUE(HasSameAppsAsVerifier(0));
259   ASSERT_FALSE(HasSameAppsAsVerifier(1));
260
261   ASSERT_TRUE(AwaitQuiescence());
262   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
263
264   EnableApp(GetProfile(1), 0);
265   EnableApp(verifier(), 0);
266   ASSERT_TRUE(HasSameAppsAsVerifier(1));
267   ASSERT_FALSE(HasSameAppsAsVerifier(0));
268
269   ASSERT_TRUE(AwaitQuiescence());
270   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
271 }
272
273 // TCM ID - 7706637.
274 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, UpdateIncognitoEnableDisable) {
275   ASSERT_TRUE(SetupSync());
276   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
277
278   InstallApp(GetProfile(0), 0);
279   InstallApp(GetProfile(1), 0);
280   InstallApp(verifier(), 0);
281   ASSERT_TRUE(AwaitQuiescence());
282   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
283
284   IncognitoEnableApp(GetProfile(0), 0);
285   IncognitoEnableApp(verifier(), 0);
286   ASSERT_TRUE(HasSameAppsAsVerifier(0));
287   ASSERT_FALSE(HasSameAppsAsVerifier(1));
288
289   ASSERT_TRUE(AwaitQuiescence());
290   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
291
292   IncognitoDisableApp(GetProfile(1), 0);
293   IncognitoDisableApp(verifier(), 0);
294   ASSERT_TRUE(HasSameAppsAsVerifier(1));
295   ASSERT_FALSE(HasSameAppsAsVerifier(0));
296
297   ASSERT_TRUE(AwaitQuiescence());
298   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
299 }
300
301 // TCM ID - 3718276.
302 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, DisableApps) {
303   ASSERT_TRUE(SetupSync());
304   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
305
306   ASSERT_TRUE(GetClient(1)->DisableSyncForDatatype(syncer::APPS));
307   InstallApp(GetProfile(0), 0);
308   InstallApp(verifier(), 0);
309   ASSERT_TRUE(GetClient(0)->AwaitFullSyncCompletion("Installed an app."));
310   ASSERT_TRUE(HasSameAppsAsVerifier(0));
311   ASSERT_FALSE(HasSameAppsAsVerifier(1));
312
313   ASSERT_TRUE(GetClient(1)->EnableSyncForDatatype(syncer::APPS));
314   ASSERT_TRUE(AwaitQuiescence());
315
316   InstallAppsPendingForSync(GetProfile(0));
317   InstallAppsPendingForSync(GetProfile(1));
318   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
319 }
320
321 // Disable sync for the second client and then install an app on the first
322 // client, then enable sync on the second client. Both clients should have the
323 // same app with identical app and page ordinals.
324 // TCM ID - 3720303.
325 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, DisableSync) {
326   ASSERT_TRUE(SetupSync());
327   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
328
329   ASSERT_TRUE(GetClient(1)->DisableSyncForAllDatatypes());
330   InstallApp(GetProfile(0), 0);
331   InstallApp(verifier(), 0);
332   ASSERT_TRUE(GetClient(0)->AwaitFullSyncCompletion("Installed an app."));
333   ASSERT_TRUE(HasSameAppsAsVerifier(0));
334   ASSERT_FALSE(HasSameAppsAsVerifier(1));
335
336   ASSERT_TRUE(GetClient(1)->EnableSyncForAllDatatypes());
337   ASSERT_TRUE(AwaitQuiescence());
338
339   InstallAppsPendingForSync(GetProfile(0));
340   InstallAppsPendingForSync(GetProfile(1));
341   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
342 }
343
344 // Install the same app on both clients, then sync. Change the page ordinal on
345 // one client and sync. Both clients should have the updated page ordinal for
346 // the app.
347 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, UpdatePageOrdinal) {
348   ASSERT_TRUE(SetupSync());
349   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
350
351   syncer::StringOrdinal initial_page =
352       syncer::StringOrdinal::CreateInitialOrdinal();
353   InstallApp(GetProfile(0), 0);
354   InstallApp(GetProfile(1), 0);
355   InstallApp(verifier(), 0);
356   ASSERT_TRUE(AwaitQuiescence());
357   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
358
359   syncer::StringOrdinal second_page = initial_page.CreateAfter();
360   SetPageOrdinalForApp(GetProfile(0), 0, second_page);
361   SetPageOrdinalForApp(verifier(), 0, second_page);
362   ASSERT_TRUE(AwaitQuiescence());
363   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
364 }
365
366 // Install the same app on both clients, then sync. Change the app launch
367 // ordinal on one client and sync. Both clients should have the updated app
368 // launch ordinal for the app.
369 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, UpdateAppLaunchOrdinal) {
370   ASSERT_TRUE(SetupSync());
371   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
372
373   InstallApp(GetProfile(0), 0);
374   InstallApp(GetProfile(1), 0);
375   InstallApp(verifier(), 0);
376   ASSERT_TRUE(AwaitQuiescence());
377   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
378
379   syncer::StringOrdinal initial_position =
380       GetAppLaunchOrdinalForApp(GetProfile(0), 0);
381
382   syncer::StringOrdinal second_position = initial_position.CreateAfter();
383   SetAppLaunchOrdinalForApp(GetProfile(0), 0, second_position);
384   SetAppLaunchOrdinalForApp(verifier(), 0, second_position);
385   ASSERT_TRUE(AwaitQuiescence());
386   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
387 }
388
389 // Adjust the CWS location within a page on the first client and sync. Adjust
390 // which page the CWS appears on and sync. Both clients should have the same
391 // page and app launch ordinal values for the CWS.
392 IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, UpdateCWSOrdinals) {
393   ASSERT_TRUE(SetupSync());
394   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
395
396   // Change the app launch ordinal.
397   syncer::StringOrdinal cws_app_launch_ordinal =
398       GetProfile(0)->GetExtensionService()->
399       extension_prefs()->extension_sorting()->GetAppLaunchOrdinal(
400           extension_misc::kWebStoreAppId);
401   GetProfile(0)->GetExtensionService()->extension_prefs()->extension_sorting()->
402       SetAppLaunchOrdinal(
403           extension_misc::kWebStoreAppId, cws_app_launch_ordinal.CreateAfter());
404   verifier()->GetExtensionService()->extension_prefs()->extension_sorting()->
405       SetAppLaunchOrdinal(
406           extension_misc::kWebStoreAppId, cws_app_launch_ordinal.CreateAfter());
407   ASSERT_TRUE(AwaitQuiescence());
408   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
409
410   // Change the page ordinal.
411   syncer::StringOrdinal cws_page_ordinal =
412       GetProfile(1)->GetExtensionService()->
413       extension_prefs()->extension_sorting()->GetPageOrdinal(
414           extension_misc::kWebStoreAppId);
415   GetProfile(1)->GetExtensionService()->extension_prefs()->
416       extension_sorting()->SetPageOrdinal(extension_misc::kWebStoreAppId,
417                                           cws_page_ordinal.CreateAfter());
418   verifier()->GetExtensionService()->extension_prefs()->
419       extension_sorting()->SetPageOrdinal(extension_misc::kWebStoreAppId,
420                                           cws_page_ordinal.CreateAfter());
421   ASSERT_TRUE(AwaitQuiescence());
422   ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
423 }
424
425 // TODO(akalin): Add tests exercising:
426 //   - Offline installation/uninstallation behavior
427 //   - App-specific properties