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.
5 #include "chrome/browser/sync/profile_sync_service.h"
6 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
7 #include "chrome/browser/sync/test/integration/sync_test.h"
8 #include "sync/internal_api/public/base/model_type.h"
9 #include "sync/internal_api/public/read_node.h"
10 #include "sync/internal_api/public/read_transaction.h"
12 // This file contains tests that exercise enabling and disabling data
17 class EnableDisableSingleClientTest
: public SyncTest
{
19 EnableDisableSingleClientTest() : SyncTest(SINGLE_CLIENT
) {}
20 virtual ~EnableDisableSingleClientTest() {}
22 // Don't use self-notifications as they can trigger additional sync cycles.
23 virtual bool TestUsesSelfNotifications() OVERRIDE
{ return false; }
25 DISALLOW_COPY_AND_ASSIGN(EnableDisableSingleClientTest
);
28 bool DoesTopLevelNodeExist(syncer::UserShare
* user_share
,
29 syncer::ModelType type
) {
30 syncer::ReadTransaction
trans(FROM_HERE
, user_share
);
31 syncer::ReadNode
node(&trans
);
32 return node
.InitTypeRoot(type
) == syncer::BaseNode::INIT_OK
;
35 bool IsUnready(const sync_driver::DataTypeStatusTable
& data_type_status_table
,
36 syncer::ModelType type
) {
37 return data_type_status_table
.GetUnreadyErrorTypes().Has(type
);
40 IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest
, EnableOneAtATime
) {
41 ASSERT_TRUE(SetupClients());
43 // Setup sync with no enabled types.
44 ASSERT_TRUE(GetClient(0)->SetupSync(syncer::ModelTypeSet()));
46 const syncer::ModelTypeSet registered_types
=
47 GetSyncService(0)->GetRegisteredDataTypes();
48 syncer::UserShare
* user_share
= GetSyncService(0)->GetUserShare();
49 const sync_driver::DataTypeStatusTable
& data_type_status_table
=
50 GetSyncService(0)->data_type_status_table();
51 for (syncer::ModelTypeSet::Iterator it
= registered_types
.First();
52 it
.Good(); it
.Inc()) {
53 ASSERT_TRUE(GetClient(0)->EnableSyncForDatatype(it
.Get()));
55 // AUTOFILL_PROFILE is lumped together with AUTOFILL.
56 // SESSIONS is lumped together with PROXY_TABS and
57 // HISTORY_DELETE_DIRECTIVES.
58 // Favicons are lumped together with PROXY_TABS and
59 // HISTORY_DELETE_DIRECTIVES.
60 if (it
.Get() == syncer::AUTOFILL_PROFILE
|| it
.Get() == syncer::SESSIONS
) {
64 if (!syncer::ProxyTypes().Has(it
.Get())) {
65 ASSERT_TRUE(DoesTopLevelNodeExist(user_share
, it
.Get()) ||
66 IsUnready(data_type_status_table
, it
.Get()))
67 << syncer::ModelTypeToString(it
.Get());
70 // AUTOFILL_PROFILE is lumped together with AUTOFILL.
71 if (it
.Get() == syncer::AUTOFILL
) {
72 ASSERT_TRUE(DoesTopLevelNodeExist(user_share
,
73 syncer::AUTOFILL_PROFILE
));
74 } else if (it
.Get() == syncer::HISTORY_DELETE_DIRECTIVES
||
75 it
.Get() == syncer::PROXY_TABS
) {
76 ASSERT_TRUE(DoesTopLevelNodeExist(user_share
,
82 IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest
, DisableOneAtATime
) {
83 ASSERT_TRUE(SetupClients());
85 // Setup sync with no disabled types.
86 ASSERT_TRUE(GetClient(0)->SetupSync());
88 const syncer::ModelTypeSet registered_types
=
89 GetSyncService(0)->GetRegisteredDataTypes();
91 syncer::UserShare
* user_share
= GetSyncService(0)->GetUserShare();
93 const sync_driver::DataTypeStatusTable
& data_type_status_table
=
94 GetSyncService(0)->data_type_status_table();
96 // Make sure all top-level nodes exist first.
97 for (syncer::ModelTypeSet::Iterator it
= registered_types
.First();
98 it
.Good(); it
.Inc()) {
99 if (!syncer::ProxyTypes().Has(it
.Get())) {
100 ASSERT_TRUE(DoesTopLevelNodeExist(user_share
, it
.Get()) ||
101 IsUnready(data_type_status_table
, it
.Get()));
105 for (syncer::ModelTypeSet::Iterator it
= registered_types
.First();
106 it
.Good(); it
.Inc()) {
107 // SUPERVISED_USERS and SUPERVISED_USER_SHARED_SETTINGS are always synced.
108 if (it
.Get() == syncer::SUPERVISED_USERS
||
109 it
.Get() == syncer::SUPERVISED_USER_SHARED_SETTINGS
||
110 it
.Get() == syncer::SYNCED_NOTIFICATIONS
||
111 it
.Get() == syncer::SYNCED_NOTIFICATION_APP_INFO
)
114 ASSERT_TRUE(GetClient(0)->DisableSyncForDatatype(it
.Get()));
116 // AUTOFILL_PROFILE is lumped together with AUTOFILL.
117 // SESSIONS is lumped together with PROXY_TABS and TYPED_URLS.
118 // HISTORY_DELETE_DIRECTIVES is lumped together with TYPED_URLS.
119 // PRIORITY_PREFERENCES is lumped together with PREFERENCES.
120 // Favicons are lumped together with PROXY_TABS and
121 // HISTORY_DELETE_DIRECTIVES.
122 if (it
.Get() == syncer::AUTOFILL_PROFILE
||
123 it
.Get() == syncer::SESSIONS
||
124 it
.Get() == syncer::HISTORY_DELETE_DIRECTIVES
||
125 it
.Get() == syncer::PRIORITY_PREFERENCES
||
126 it
.Get() == syncer::FAVICON_IMAGES
||
127 it
.Get() == syncer::FAVICON_TRACKING
) {
131 syncer::UserShare
* user_share
=
132 GetSyncService(0)->GetUserShare();
134 ASSERT_FALSE(DoesTopLevelNodeExist(user_share
, it
.Get()))
135 << syncer::ModelTypeToString(it
.Get());
137 if (it
.Get() == syncer::AUTOFILL
) {
138 // AUTOFILL_PROFILE is lumped together with AUTOFILL.
139 ASSERT_FALSE(DoesTopLevelNodeExist(user_share
, syncer::AUTOFILL_PROFILE
));
140 } else if (it
.Get() == syncer::TYPED_URLS
) {
141 ASSERT_FALSE(DoesTopLevelNodeExist(user_share
,
142 syncer::HISTORY_DELETE_DIRECTIVES
));
143 // SESSIONS should be enabled only if PROXY_TABS is.
144 ASSERT_EQ(GetClient(0)->IsTypePreferred(syncer::PROXY_TABS
),
145 DoesTopLevelNodeExist(user_share
, syncer::SESSIONS
));
146 } else if (it
.Get() == syncer::PROXY_TABS
) {
147 // SESSIONS should be enabled only if TYPED_URLS is.
148 ASSERT_EQ(GetClient(0)->IsTypePreferred(syncer::TYPED_URLS
),
149 DoesTopLevelNodeExist(user_share
, syncer::SESSIONS
));
150 } else if (it
.Get() == syncer::PREFERENCES
) {
151 ASSERT_FALSE(DoesTopLevelNodeExist(user_share
,
152 syncer::PRIORITY_PREFERENCES
));