OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // TODO(akalin): Rename this file to migration_test.cc. | 5 // TODO(akalin): Rename this file to migration_test.cc. |
6 | 6 |
7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
8 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 8 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
9 #include "chrome/browser/profiles/profile.h" | 9 #include "chrome/browser/profiles/profile.h" |
10 #include "chrome/browser/sync/profile_sync_service_harness.h" | 10 #include "chrome/browser/sync/profile_sync_service_harness.h" |
11 #include "chrome/browser/sync/test/integration/bookmarks_helper.h" | 11 #include "chrome/browser/sync/test/integration/bookmarks_helper.h" |
12 #include "chrome/browser/sync/test/integration/sync_test.h" | 12 #include "chrome/browser/sync/test/integration/sync_test.h" |
13 #include "chrome/browser/sync/test/integration/preferences_helper.h" | 13 #include "chrome/browser/sync/test/integration/preferences_helper.h" |
14 #include "chrome/browser/translate/translate_prefs.h" | 14 #include "chrome/browser/translate/translate_prefs.h" |
15 #include "chrome/common/pref_names.h" | 15 #include "chrome/common/pref_names.h" |
16 #include "chrome/test/base/ui_test_utils.h" | 16 #include "chrome/test/base/ui_test_utils.h" |
17 | 17 |
18 using bookmarks_helper::AddURL; | 18 using bookmarks_helper::AddURL; |
19 using bookmarks_helper::IndexedURL; | 19 using bookmarks_helper::IndexedURL; |
20 using bookmarks_helper::IndexedURLTitle; | 20 using bookmarks_helper::IndexedURLTitle; |
21 | 21 |
22 using preferences_helper::BooleanPrefMatches; | 22 using preferences_helper::BooleanPrefMatches; |
23 using preferences_helper::ChangeBooleanPref; | 23 using preferences_helper::ChangeBooleanPref; |
24 | 24 |
25 namespace { | 25 namespace { |
26 | 26 |
27 // Utility functions to make a model type set out of a small number of | 27 // Utility functions to make a model type set out of a small number of |
28 // model types. | 28 // model types. |
29 | 29 |
30 syncable::ModelTypeSet MakeSet(syncable::ModelType type) { | 30 syncable::ModelEnumSet MakeSet(syncable::ModelType type) { |
31 syncable::ModelTypeSet model_types; | 31 return syncable::ModelEnumSet(type); |
32 model_types.insert(type); | |
33 return model_types; | |
34 } | 32 } |
35 | 33 |
36 syncable::ModelTypeSet MakeSet(syncable::ModelType type1, | 34 syncable::ModelEnumSet MakeSet(syncable::ModelType type1, |
37 syncable::ModelType type2) { | 35 syncable::ModelType type2) { |
38 syncable::ModelTypeSet model_types; | 36 return syncable::ModelEnumSet(type1, type2); |
39 model_types.insert(type1); | |
40 model_types.insert(type2); | |
41 return model_types; | |
42 } | 37 } |
43 | 38 |
44 // An ordered list of model types sets to migrate. Used by | 39 // An ordered list of model types sets to migrate. Used by |
45 // RunMigrationTest(). | 40 // RunMigrationTest(). |
46 typedef std::deque<syncable::ModelTypeSet> MigrationList; | 41 typedef std::deque<syncable::ModelEnumSet> MigrationList; |
47 | 42 |
48 // Utility functions to make a MigrationList out of a small number of | 43 // Utility functions to make a MigrationList out of a small number of |
49 // model types / model type sets. | 44 // model types / model type sets. |
50 | 45 |
51 MigrationList MakeList(const syncable::ModelTypeSet& model_types) { | 46 MigrationList MakeList(syncable::ModelEnumSet model_types) { |
52 return MigrationList(1, model_types); | 47 return MigrationList(1, model_types); |
53 } | 48 } |
54 | 49 |
55 MigrationList MakeList(const syncable::ModelTypeSet& model_types1, | 50 MigrationList MakeList(syncable::ModelEnumSet model_types1, |
56 const syncable::ModelTypeSet& model_types2) { | 51 syncable::ModelEnumSet model_types2) { |
57 MigrationList migration_list; | 52 MigrationList migration_list; |
58 migration_list.push_back(model_types1); | 53 migration_list.push_back(model_types1); |
59 migration_list.push_back(model_types2); | 54 migration_list.push_back(model_types2); |
60 return migration_list; | 55 return migration_list; |
61 } | 56 } |
62 | 57 |
63 MigrationList MakeList(syncable::ModelType type) { | 58 MigrationList MakeList(syncable::ModelType type) { |
64 return MakeList(MakeSet(type)); | 59 return MakeList(MakeSet(type)); |
65 } | 60 } |
66 | 61 |
67 MigrationList MakeList(syncable::ModelType type1, | 62 MigrationList MakeList(syncable::ModelType type1, |
68 syncable::ModelType type2) { | 63 syncable::ModelType type2) { |
69 return MakeList(MakeSet(type1), MakeSet(type2)); | 64 return MakeList(MakeSet(type1), MakeSet(type2)); |
70 } | 65 } |
71 | 66 |
72 class MigrationTest : public SyncTest { | 67 class MigrationTest : public SyncTest { |
73 public: | 68 public: |
74 explicit MigrationTest(TestType test_type) : SyncTest(test_type) {} | 69 explicit MigrationTest(TestType test_type) : SyncTest(test_type) {} |
75 virtual ~MigrationTest() {} | 70 virtual ~MigrationTest() {} |
76 | 71 |
77 // TODO(akalin): Add more MODIFY_(data type) trigger methods, as | 72 // TODO(akalin): Add more MODIFY_(data type) trigger methods, as |
78 // well as a poll-based trigger method. | 73 // well as a poll-based trigger method. |
79 enum TriggerMethod { MODIFY_PREF, MODIFY_BOOKMARK, TRIGGER_NOTIFICATION }; | 74 enum TriggerMethod { MODIFY_PREF, MODIFY_BOOKMARK, TRIGGER_NOTIFICATION }; |
80 | 75 |
81 syncable::ModelTypeSet GetPreferredDataTypes() { | 76 syncable::ModelEnumSet GetPreferredDataTypes() { |
82 syncable::ModelTypeSet preferred_data_types; | 77 syncable::ModelTypeSet preferred_data_types; |
83 GetClient(0)->service()->GetPreferredDataTypes(&preferred_data_types); | 78 GetClient(0)->service()->GetPreferredDataTypes(&preferred_data_types); |
84 // Make sure all clients have the same preferred data types. | 79 // Make sure all clients have the same preferred data types. |
85 for (int i = 1; i < num_clients(); ++i) { | 80 for (int i = 1; i < num_clients(); ++i) { |
86 syncable::ModelTypeSet other_preferred_data_types; | 81 syncable::ModelTypeSet other_preferred_data_types; |
87 GetClient(i)->service()->GetPreferredDataTypes( | 82 GetClient(i)->service()->GetPreferredDataTypes( |
88 &other_preferred_data_types); | 83 &other_preferred_data_types); |
89 EXPECT_EQ(preferred_data_types, other_preferred_data_types); | 84 EXPECT_EQ(preferred_data_types, other_preferred_data_types); |
90 } | 85 } |
91 return preferred_data_types; | 86 return syncable::ModelTypeSetToEnumSet(preferred_data_types); |
92 } | 87 } |
93 | 88 |
94 // Returns a MigrationList with every enabled data type in its own | 89 // Returns a MigrationList with every enabled data type in its own |
95 // set. | 90 // set. |
96 MigrationList GetPreferredDataTypesList() { | 91 MigrationList GetPreferredDataTypesList() { |
97 MigrationList migration_list; | 92 MigrationList migration_list; |
98 const syncable::ModelTypeSet& preferred_data_types = | 93 const syncable::ModelEnumSet preferred_data_types = |
99 GetPreferredDataTypes(); | 94 GetPreferredDataTypes(); |
100 for (syncable::ModelTypeSet::const_iterator it = | 95 for (syncable::ModelEnumSet::Iterator it = |
101 preferred_data_types.begin(); | 96 preferred_data_types.First(); it.Good(); it.Inc()) { |
102 it != preferred_data_types.end(); ++it) { | 97 migration_list.push_back(MakeSet(it.Get())); |
103 migration_list.push_back(MakeSet(*it)); | |
104 } | 98 } |
105 return migration_list; | 99 return migration_list; |
106 } | 100 } |
107 | 101 |
108 // Trigger a migration for the given types with the given method. | 102 // Trigger a migration for the given types with the given method. |
109 void TriggerMigration(const syncable::ModelTypeSet& model_types, | 103 void TriggerMigration(syncable::ModelEnumSet model_types, |
110 TriggerMethod trigger_method) { | 104 TriggerMethod trigger_method) { |
111 switch (trigger_method) { | 105 switch (trigger_method) { |
112 case MODIFY_PREF: | 106 case MODIFY_PREF: |
113 // Unlike MODIFY_BOOKMARK, MODIFY_PREF doesn't cause a | 107 // Unlike MODIFY_BOOKMARK, MODIFY_PREF doesn't cause a |
114 // notification to happen (since model association on a | 108 // notification to happen (since model association on a |
115 // boolean pref clobbers the local value), so it doesn't work | 109 // boolean pref clobbers the local value), so it doesn't work |
116 // for anything but single-client tests. | 110 // for anything but single-client tests. |
117 ASSERT_EQ(1, num_clients()); | 111 ASSERT_EQ(1, num_clients()); |
118 ASSERT_TRUE(BooleanPrefMatches(prefs::kShowHomeButton)); | 112 ASSERT_TRUE(BooleanPrefMatches(prefs::kShowHomeButton)); |
119 ChangeBooleanPref(0, prefs::kShowHomeButton); | 113 ChangeBooleanPref(0, prefs::kShowHomeButton); |
120 break; | 114 break; |
121 case MODIFY_BOOKMARK: | 115 case MODIFY_BOOKMARK: |
122 ASSERT_TRUE(AddURL(0, IndexedURLTitle(0), GURL(IndexedURL(0)))); | 116 ASSERT_TRUE(AddURL(0, IndexedURLTitle(0), GURL(IndexedURL(0)))); |
123 break; | 117 break; |
124 case TRIGGER_NOTIFICATION: | 118 case TRIGGER_NOTIFICATION: |
125 TriggerNotification(model_types); | 119 TriggerNotification(model_types); |
126 break; | 120 break; |
127 default: | 121 default: |
128 ADD_FAILURE(); | 122 ADD_FAILURE(); |
129 } | 123 } |
130 } | 124 } |
131 | 125 |
132 // Block until all clients have completed migration for the given | 126 // Block until all clients have completed migration for the given |
133 // types. | 127 // types. |
134 void AwaitMigration(const syncable::ModelTypeSet& migrate_types) { | 128 void AwaitMigration(syncable::ModelEnumSet migrate_types) { |
| 129 const syncable::ModelTypeSet& migrate_types_set = |
| 130 syncable::ModelEnumSetToSet(migrate_types); |
135 for (int i = 0; i < num_clients(); ++i) { | 131 for (int i = 0; i < num_clients(); ++i) { |
136 ASSERT_TRUE(GetClient(i)->AwaitMigration(migrate_types)); | 132 ASSERT_TRUE(GetClient(i)->AwaitMigration(migrate_types_set)); |
137 } | 133 } |
138 } | 134 } |
139 | 135 |
140 bool ShouldRunMigrationTest() const { | 136 bool ShouldRunMigrationTest() const { |
141 if (!ServerSupportsNotificationControl() || | 137 if (!ServerSupportsNotificationControl() || |
142 !ServerSupportsErrorTriggering()) { | 138 !ServerSupportsErrorTriggering()) { |
143 LOG(WARNING) << "Test skipped in this server environment."; | 139 LOG(WARNING) << "Test skipped in this server environment."; |
144 return false; | 140 return false; |
145 } | 141 } |
146 return true; | 142 return true; |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 IN_PROC_BROWSER_TEST_F(MigrationSingleClientTest, | 289 IN_PROC_BROWSER_TEST_F(MigrationSingleClientTest, |
294 AllTypesWithNigoriIndividually) { | 290 AllTypesWithNigoriIndividually) { |
295 ASSERT_TRUE(SetupClients()); | 291 ASSERT_TRUE(SetupClients()); |
296 MigrationList migration_list = GetPreferredDataTypesList(); | 292 MigrationList migration_list = GetPreferredDataTypesList(); |
297 migration_list.push_front(MakeSet(syncable::NIGORI)); | 293 migration_list.push_front(MakeSet(syncable::NIGORI)); |
298 RunSingleClientMigrationTest(migration_list, MODIFY_BOOKMARK); | 294 RunSingleClientMigrationTest(migration_list, MODIFY_BOOKMARK); |
299 } | 295 } |
300 | 296 |
301 IN_PROC_BROWSER_TEST_F(MigrationSingleClientTest, AllTypesWithNigoriAtOnce) { | 297 IN_PROC_BROWSER_TEST_F(MigrationSingleClientTest, AllTypesWithNigoriAtOnce) { |
302 ASSERT_TRUE(SetupClients()); | 298 ASSERT_TRUE(SetupClients()); |
303 syncable::ModelTypeSet all_types = GetPreferredDataTypes(); | 299 syncable::ModelEnumSet all_types = GetPreferredDataTypes(); |
304 all_types.insert(syncable::NIGORI); | 300 all_types.Put(syncable::NIGORI); |
305 RunSingleClientMigrationTest(MakeList(all_types), MODIFY_PREF); | 301 RunSingleClientMigrationTest(MakeList(all_types), MODIFY_PREF); |
306 } | 302 } |
307 | 303 |
308 class MigrationTwoClientTest : public MigrationTest { | 304 class MigrationTwoClientTest : public MigrationTest { |
309 public: | 305 public: |
310 MigrationTwoClientTest() : MigrationTest(TWO_CLIENT) {} | 306 MigrationTwoClientTest() : MigrationTest(TWO_CLIENT) {} |
311 virtual ~MigrationTwoClientTest() {} | 307 virtual ~MigrationTwoClientTest() {} |
312 | 308 |
313 // Helper function that verifies that preferences sync still works. | 309 // Helper function that verifies that preferences sync still works. |
314 void VerifyPrefSync() { | 310 void VerifyPrefSync() { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 | 367 |
372 IN_PROC_BROWSER_TEST_F(MigrationTwoClientTest, MigrationHellWithNigori) { | 368 IN_PROC_BROWSER_TEST_F(MigrationTwoClientTest, MigrationHellWithNigori) { |
373 ASSERT_TRUE(SetupClients()); | 369 ASSERT_TRUE(SetupClients()); |
374 MigrationList migration_list = GetPreferredDataTypesList(); | 370 MigrationList migration_list = GetPreferredDataTypesList(); |
375 // Let the first nudge be a datatype that's neither prefs nor | 371 // Let the first nudge be a datatype that's neither prefs nor |
376 // bookmarks. | 372 // bookmarks. |
377 migration_list.push_front(MakeSet(syncable::THEMES)); | 373 migration_list.push_front(MakeSet(syncable::THEMES)); |
378 // Pop off one so that we don't migrate all data types; the syncer | 374 // Pop off one so that we don't migrate all data types; the syncer |
379 // freaks out if we do that (see http://crbug.com/94882). | 375 // freaks out if we do that (see http://crbug.com/94882). |
380 ASSERT_GE(migration_list.size(), 2u); | 376 ASSERT_GE(migration_list.size(), 2u); |
381 ASSERT_NE(migration_list.back(), MakeSet(syncable::NIGORI)); | 377 ASSERT_FALSE(migration_list.back().Equals(MakeSet(syncable::NIGORI))); |
382 migration_list.back() = MakeSet(syncable::NIGORI); | 378 migration_list.back() = MakeSet(syncable::NIGORI); |
383 RunTwoClientMigrationTest(migration_list, MODIFY_BOOKMARK); | 379 RunTwoClientMigrationTest(migration_list, MODIFY_BOOKMARK); |
384 } | 380 } |
385 | 381 |
386 class MigrationReconfigureTest : public MigrationTwoClientTest { | 382 class MigrationReconfigureTest : public MigrationTwoClientTest { |
387 public: | 383 public: |
388 MigrationReconfigureTest() {} | 384 MigrationReconfigureTest() {} |
389 | 385 |
390 virtual void SetUpCommandLine(CommandLine* cl) OVERRIDE { | 386 virtual void SetUpCommandLine(CommandLine* cl) OVERRIDE { |
391 AddTestSwitches(cl); | 387 AddTestSwitches(cl); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
448 | 444 |
449 // Phase 5: Verify that preferences can still be synchronized. | 445 // Phase 5: Verify that preferences can still be synchronized. |
450 VerifyPrefSync(); | 446 VerifyPrefSync(); |
451 | 447 |
452 // Phase 6: Verify that sessions are registered and enabled. | 448 // Phase 6: Verify that sessions are registered and enabled. |
453 ASSERT_TRUE(GetClient(0)->IsTypeRunning(syncable::SESSIONS)); | 449 ASSERT_TRUE(GetClient(0)->IsTypeRunning(syncable::SESSIONS)); |
454 ASSERT_TRUE(GetClient(0)->IsTypePreferred(syncable::SESSIONS)); | 450 ASSERT_TRUE(GetClient(0)->IsTypePreferred(syncable::SESSIONS)); |
455 } | 451 } |
456 | 452 |
457 } // namespace | 453 } // namespace |
OLD | NEW |