enable_disable_test.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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 "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"
11
12// This file contains tests that exercise enabling and disabling data
13// types.
14
15namespace {
16
17class EnableDisableSingleClientTest : public SyncTest {
18 public:
19  EnableDisableSingleClientTest() : SyncTest(SINGLE_CLIENT) {}
20  virtual ~EnableDisableSingleClientTest() {}
21
22  // Don't use self-notifications as they can trigger additional sync cycles.
23  virtual bool TestUsesSelfNotifications() OVERRIDE { return false; }
24 private:
25  DISALLOW_COPY_AND_ASSIGN(EnableDisableSingleClientTest);
26};
27
28bool 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;
33}
34
35bool IsUnready(const browser_sync::FailedDataTypesHandler& failed_handler,
36               syncer::ModelType type) {
37  return failed_handler.GetUnreadyErrorTypes().Has(type);
38}
39
40IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, EnableOneAtATime) {
41  ASSERT_TRUE(SetupClients());
42
43  // Setup sync with no enabled types.
44  ASSERT_TRUE(GetClient(0)->SetupSync(syncer::ModelTypeSet()));
45
46  const syncer::ModelTypeSet registered_types =
47      GetSyncService(0)->GetRegisteredDataTypes();
48  syncer::UserShare* user_share = GetSyncService(0)->GetUserShare();
49  const browser_sync::FailedDataTypesHandler& failed_handler =
50      GetSyncService(0)->failed_data_types_handler();
51  for (syncer::ModelTypeSet::Iterator it = registered_types.First();
52       it.Good(); it.Inc()) {
53    ASSERT_TRUE(GetClient(0)->EnableSyncForDatatype(it.Get()));
54
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) {
61      continue;
62    }
63
64    if (!syncer::ProxyTypes().Has(it.Get())) {
65      ASSERT_TRUE(DoesTopLevelNodeExist(user_share, it.Get()) ||
66                  IsUnready(failed_handler, it.Get()))
67          << syncer::ModelTypeToString(it.Get());
68    }
69
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,
77                                        syncer::SESSIONS));
78    }
79  }
80}
81
82IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest, DisableOneAtATime) {
83  ASSERT_TRUE(SetupClients());
84
85  // Setup sync with no disabled types.
86  ASSERT_TRUE(GetClient(0)->SetupSync());
87
88  const syncer::ModelTypeSet registered_types =
89      GetSyncService(0)->GetRegisteredDataTypes();
90
91  syncer::UserShare* user_share = GetSyncService(0)->GetUserShare();
92
93  const browser_sync::FailedDataTypesHandler& failed_handler =
94      GetSyncService(0)->failed_data_types_handler();
95
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(failed_handler, it.Get()));
102    }
103  }
104
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)
112      continue;
113
114    ASSERT_TRUE(GetClient(0)->DisableSyncForDatatype(it.Get()));
115
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) {
128      continue;
129    }
130
131    syncer::UserShare* user_share =
132        GetSyncService(0)->GetUserShare();
133
134    ASSERT_FALSE(DoesTopLevelNodeExist(user_share, it.Get()))
135        << syncer::ModelTypeToString(it.Get());
136
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));
153    }
154  }
155}
156
157}  // namespace
158