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 // Device info cannot be disabled.
115 if (it.Get() == syncer::DEVICE_INFO)
118 ASSERT_TRUE(GetClient(0)->DisableSyncForDatatype(it.Get()));
120 // AUTOFILL_PROFILE is lumped together with AUTOFILL.
121 // SESSIONS is lumped together with PROXY_TABS and TYPED_URLS.
122 // HISTORY_DELETE_DIRECTIVES is lumped together with TYPED_URLS.
123 // PRIORITY_PREFERENCES is lumped together with PREFERENCES.
124 // Favicons are lumped together with PROXY_TABS and
125 // HISTORY_DELETE_DIRECTIVES.
126 if (it.Get() == syncer::AUTOFILL_PROFILE ||
127 it.Get() == syncer::SESSIONS ||
128 it.Get() == syncer::HISTORY_DELETE_DIRECTIVES ||
129 it.Get() == syncer::PRIORITY_PREFERENCES ||
130 it.Get() == syncer::FAVICON_IMAGES ||
131 it.Get() == syncer::FAVICON_TRACKING) {
135 syncer::UserShare* user_share =
136 GetSyncService(0)->GetUserShare();
138 ASSERT_FALSE(DoesTopLevelNodeExist(user_share, it.Get()))
139 << syncer::ModelTypeToString(it.Get());
141 if (it.Get() == syncer::AUTOFILL) {
142 // AUTOFILL_PROFILE is lumped together with AUTOFILL.
143 ASSERT_FALSE(DoesTopLevelNodeExist(user_share, syncer::AUTOFILL_PROFILE));
144 } else if (it.Get() == syncer::TYPED_URLS) {
145 ASSERT_FALSE(DoesTopLevelNodeExist(user_share,
146 syncer::HISTORY_DELETE_DIRECTIVES));
147 // SESSIONS should be enabled only if PROXY_TABS is.
148 ASSERT_EQ(GetClient(0)->IsTypePreferred(syncer::PROXY_TABS),
149 DoesTopLevelNodeExist(user_share, syncer::SESSIONS));
150 } else if (it.Get() == syncer::PROXY_TABS) {
151 // SESSIONS should be enabled only if TYPED_URLS is.
152 ASSERT_EQ(GetClient(0)->IsTypePreferred(syncer::TYPED_URLS),
153 DoesTopLevelNodeExist(user_share, syncer::SESSIONS));
154 } else if (it.Get() == syncer::PREFERENCES) {
155 ASSERT_FALSE(DoesTopLevelNodeExist(user_share,
156 syncer::PRIORITY_PREFERENCES));