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 "base/strings/stringprintf.h"
6 #include "chrome/browser/profiles/profile.h"
7 #include "chrome/browser/sync/test/integration/apps_helper.h"
8 #include "chrome/browser/sync/test/integration/extension_settings_helper.h"
9 #include "chrome/browser/sync/test/integration/extensions_helper.h"
10 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
11 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
12 #include "chrome/browser/sync/test/integration/sync_test.h"
16 using apps_helper::InstallAppForAllProfiles;
17 using extension_settings_helper::AllExtensionSettingsSameAsVerifier;
18 using extension_settings_helper::SetExtensionSettings;
19 using extension_settings_helper::SetExtensionSettingsForAllProfiles;
20 using extensions_helper::InstallExtensionForAllProfiles;
21 using sync_datatype_helper::test;
23 // Generic mutations done after the initial setup of all tests. Note that
24 // unfortuately we can't test existing configurations of the sync server since
25 // the tests don't support that.
26 void MutateSomeSettings(
27 int seed, // used to modify the mutation values, not keys.
28 const std::string& extension0,
29 const std::string& extension1,
30 const std::string& extension2) {
32 // Write to extension0 from profile 0 but not profile 1.
33 base::DictionaryValue settings;
34 settings.SetString("asdf", base::StringPrintf("asdfasdf-%d", seed));
35 SetExtensionSettings(test()->verifier(), extension0, settings);
36 SetExtensionSettings(test()->GetProfile(0), extension0, settings);
39 // Write the same data to extension1 from both profiles.
40 base::DictionaryValue settings;
41 settings.SetString("asdf", base::StringPrintf("asdfasdf-%d", seed));
42 settings.SetString("qwer", base::StringPrintf("qwerqwer-%d", seed));
43 SetExtensionSettingsForAllProfiles(extension1, settings);
46 // Write different data to extension2 from each profile.
47 base::DictionaryValue settings0;
48 settings0.SetString("zxcv", base::StringPrintf("zxcvzxcv-%d", seed));
49 SetExtensionSettings(test()->verifier(), extension2, settings0);
50 SetExtensionSettings(test()->GetProfile(0), extension2, settings0);
52 base::DictionaryValue settings1;
53 settings1.SetString("1324", base::StringPrintf("12341234-%d", seed));
54 settings1.SetString("5687", base::StringPrintf("56785678-%d", seed));
55 SetExtensionSettings(test()->verifier(), extension2, settings1);
56 SetExtensionSettings(test()->GetProfile(1), extension2, settings1);
60 class TwoClientExtensionSettingsAndAppSettingsSyncTest : public SyncTest {
62 TwoClientExtensionSettingsAndAppSettingsSyncTest() : SyncTest(TWO_CLIENT) {}
63 ~TwoClientExtensionSettingsAndAppSettingsSyncTest() override {}
66 DISALLOW_COPY_AND_ASSIGN(TwoClientExtensionSettingsAndAppSettingsSyncTest);
69 // For three independent extensions:
71 // Set up each extension with the same (but not necessarily empty) settings for
72 // all profiles, start syncing, add some new settings, sync, mutate those
74 testing::AssertionResult StartWithSameSettingsTest(
75 const std::string& extension0,
76 const std::string& extension1,
77 const std::string& extension2) {
79 // Leave extension0 empty.
82 base::DictionaryValue settings;
83 settings.SetString("foo", "bar");
84 SetExtensionSettingsForAllProfiles(extension1, settings);
87 base::DictionaryValue settings;
88 settings.SetString("foo", "bar");
89 settings.SetString("baz", "qux");
90 SetExtensionSettingsForAllProfiles(extension2, settings);
93 if (!test()->SetupSync())
94 return testing::AssertionFailure();
95 if (!test()->AwaitQuiescence())
96 return testing::AssertionFailure();
97 if (!AllExtensionSettingsSameAsVerifier())
98 return testing::AssertionFailure();
100 MutateSomeSettings(0, extension0, extension1, extension2);
101 if (!test()->AwaitQuiescence())
102 return testing::AssertionFailure();
103 if (!AllExtensionSettingsSameAsVerifier())
104 return testing::AssertionFailure();
106 MutateSomeSettings(1, extension0, extension1, extension2);
107 if (!test()->AwaitQuiescence())
108 return testing::AssertionFailure();
109 if (!AllExtensionSettingsSameAsVerifier())
110 return testing::AssertionFailure();
112 return testing::AssertionSuccess();
115 // For three independent extensions:
117 // Set up each extension with different settings for each profile, start
118 // syncing, add some settings, sync, mutate those settings, sync, have a no-op
119 // (non-)change to those settings, sync, mutate again, sync.
120 testing::AssertionResult StartWithDifferentSettingsTest(
121 const std::string& extension0,
122 const std::string& extension1,
123 const std::string& extension2) {
125 // Leave extension0 empty again for no particular reason other than it's
126 // the only remaining unique combination given the other 2 tests have
127 // (empty, nonempty) and (nonempty, nonempty) configurations. We can't test
128 // (nonempty, nonempty) because the merging will provide unpredictable
129 // results, so test (empty, empty).
132 base::DictionaryValue settings;
133 settings.SetString("foo", "bar");
134 SetExtensionSettings(test()->verifier(), extension1, settings);
135 SetExtensionSettings(test()->GetProfile(0), extension1, settings);
138 base::DictionaryValue settings;
139 settings.SetString("foo", "bar");
140 settings.SetString("baz", "qux");
141 SetExtensionSettings(test()->verifier(), extension2, settings);
142 SetExtensionSettings(test()->GetProfile(1), extension2, settings);
145 if (!test()->SetupSync())
146 return testing::AssertionFailure();
147 if (!test()->AwaitQuiescence())
148 return testing::AssertionFailure();
149 if (!AllExtensionSettingsSameAsVerifier())
150 return testing::AssertionFailure();
152 MutateSomeSettings(2, extension0, extension1, extension2);
153 if (!test()->AwaitQuiescence())
154 return testing::AssertionFailure();
155 if (!AllExtensionSettingsSameAsVerifier())
156 return testing::AssertionFailure();
158 MutateSomeSettings(3, extension0, extension1, extension2);
159 if (!test()->AwaitQuiescence())
160 return testing::AssertionFailure();
161 if (!AllExtensionSettingsSameAsVerifier())
162 return testing::AssertionFailure();
164 // Test a round of no-ops once, for sanity. Ideally we'd want to assert that
165 // this causes no sync activity, but that sounds tricky.
166 MutateSomeSettings(3, extension0, extension1, extension2);
167 if (!test()->AwaitQuiescence())
168 return testing::AssertionFailure();
169 if (!AllExtensionSettingsSameAsVerifier())
170 return testing::AssertionFailure();
172 MutateSomeSettings(4, extension0, extension1, extension2);
173 if (!test()->AwaitQuiescence())
174 return testing::AssertionFailure();
175 if (!AllExtensionSettingsSameAsVerifier())
176 return testing::AssertionFailure();
178 return testing::AssertionSuccess();
181 IN_PROC_BROWSER_TEST_F(TwoClientExtensionSettingsAndAppSettingsSyncTest,
182 ExtensionsStartWithSameSettings) {
183 ASSERT_TRUE(SetupClients());
184 ASSERT_PRED3(StartWithSameSettingsTest,
185 InstallExtensionForAllProfiles(0),
186 InstallExtensionForAllProfiles(1),
187 InstallExtensionForAllProfiles(2)
191 IN_PROC_BROWSER_TEST_F(TwoClientExtensionSettingsAndAppSettingsSyncTest,
192 AppsStartWithSameSettings) {
193 ASSERT_TRUE(SetupClients());
194 ASSERT_PRED3(StartWithSameSettingsTest,
195 InstallAppForAllProfiles(0),
196 InstallAppForAllProfiles(1),
197 InstallAppForAllProfiles(2)
201 IN_PROC_BROWSER_TEST_F(TwoClientExtensionSettingsAndAppSettingsSyncTest,
202 ExtensionsStartWithDifferentSettings) {
203 ASSERT_TRUE(SetupClients());
204 ASSERT_PRED3(StartWithDifferentSettingsTest,
205 InstallExtensionForAllProfiles(0),
206 InstallExtensionForAllProfiles(1),
207 InstallExtensionForAllProfiles(2)
211 IN_PROC_BROWSER_TEST_F(TwoClientExtensionSettingsAndAppSettingsSyncTest,
212 AppsStartWithDifferentSettings) {
213 ASSERT_TRUE(SetupClients());
214 ASSERT_PRED3(StartWithDifferentSettingsTest,
215 InstallAppForAllProfiles(0),
216 InstallAppForAllProfiles(1),
217 InstallAppForAllProfiles(2)