two_client_extension_settings_and_app_settings_sync_test.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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 "base/stringprintf.h" 6#include "chrome/browser/profiles/profile.h" 7#include "chrome/browser/sync/profile_sync_service_harness.h" 8#include "chrome/browser/sync/test/integration/apps_helper.h" 9#include "chrome/browser/sync/test/integration/extension_settings_helper.h" 10#include "chrome/browser/sync/test/integration/extensions_helper.h" 11#include "chrome/browser/sync/test/integration/sync_datatype_helper.h" 12#include "chrome/browser/sync/test/integration/sync_test.h" 13 14namespace { 15 16using apps_helper::InstallAppForAllProfiles; 17using extension_settings_helper::AllExtensionSettingsSameAsVerifier; 18using extension_settings_helper::SetExtensionSettings; 19using extension_settings_helper::SetExtensionSettingsForAllProfiles; 20using extensions_helper::InstallExtensionForAllProfiles; 21using sync_datatype_helper::test; 22 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. 26void 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) { 31 { 32 // Write to extension0 from profile 0 but not profile 1. 33 DictionaryValue settings; 34 settings.SetString("asdf", base::StringPrintf("asdfasdf-%d", seed)); 35 SetExtensionSettings(test()->verifier(), extension0, settings); 36 SetExtensionSettings(test()->GetProfile(0), extension0, settings); 37 } 38 { 39 // Write the same data to extension1 from both profiles. 40 DictionaryValue settings; 41 settings.SetString("asdf", base::StringPrintf("asdfasdf-%d", seed)); 42 settings.SetString("qwer", base::StringPrintf("qwerqwer-%d", seed)); 43 SetExtensionSettingsForAllProfiles(extension1, settings); 44 } 45 { 46 // Write different data to extension2 from each profile. 47 DictionaryValue settings0; 48 settings0.SetString("zxcv", base::StringPrintf("zxcvzxcv-%d", seed)); 49 SetExtensionSettings(test()->verifier(), extension2, settings0); 50 SetExtensionSettings(test()->GetProfile(0), extension2, settings0); 51 52 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); 57 } 58} 59 60class TwoClientExtensionSettingsAndAppSettingsSyncTest : public SyncTest { 61 public: 62 TwoClientExtensionSettingsAndAppSettingsSyncTest() : SyncTest(TWO_CLIENT) {} 63 virtual ~TwoClientExtensionSettingsAndAppSettingsSyncTest() {} 64 65 private: 66 DISALLOW_COPY_AND_ASSIGN(TwoClientExtensionSettingsAndAppSettingsSyncTest); 67}; 68 69// For three independent extensions: 70// 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 73// settings, sync. 74testing::AssertionResult StartWithSameSettingsTest( 75 const std::string& extension0, 76 const std::string& extension1, 77 const std::string& extension2) { 78 { 79 // Leave extension0 empty. 80 } 81 { 82 DictionaryValue settings; 83 settings.SetString("foo", "bar"); 84 SetExtensionSettingsForAllProfiles(extension1, settings); 85 } 86 { 87 DictionaryValue settings; 88 settings.SetString("foo", "bar"); 89 settings.SetString("baz", "qux"); 90 SetExtensionSettingsForAllProfiles(extension2, settings); 91 } 92 93 if (!test()->SetupSync()) 94 return testing::AssertionFailure(); 95 if (!test()->AwaitQuiescence()) 96 return testing::AssertionFailure(); 97 if (!AllExtensionSettingsSameAsVerifier()) 98 return testing::AssertionFailure(); 99 100 MutateSomeSettings(0, extension0, extension1, extension2); 101 if (!test()->AwaitQuiescence()) 102 return testing::AssertionFailure(); 103 if (!AllExtensionSettingsSameAsVerifier()) 104 return testing::AssertionFailure(); 105 106 MutateSomeSettings(1, extension0, extension1, extension2); 107 if (!test()->AwaitQuiescence()) 108 return testing::AssertionFailure(); 109 if (!AllExtensionSettingsSameAsVerifier()) 110 return testing::AssertionFailure(); 111 112 return testing::AssertionSuccess(); 113} 114 115// For three independent extensions: 116// 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. 120testing::AssertionResult StartWithDifferentSettingsTest( 121 const std::string& extension0, 122 const std::string& extension1, 123 const std::string& extension2) { 124 { 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). 130 } 131 { 132 DictionaryValue settings; 133 settings.SetString("foo", "bar"); 134 SetExtensionSettings(test()->verifier(), extension1, settings); 135 SetExtensionSettings(test()->GetProfile(0), extension1, settings); 136 } 137 { 138 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); 143 } 144 145 if (!test()->SetupSync()) 146 return testing::AssertionFailure(); 147 if (!test()->AwaitQuiescence()) 148 return testing::AssertionFailure(); 149 if (!AllExtensionSettingsSameAsVerifier()) 150 return testing::AssertionFailure(); 151 152 MutateSomeSettings(2, extension0, extension1, extension2); 153 if (!test()->AwaitQuiescence()) 154 return testing::AssertionFailure(); 155 if (!AllExtensionSettingsSameAsVerifier()) 156 return testing::AssertionFailure(); 157 158 MutateSomeSettings(3, extension0, extension1, extension2); 159 if (!test()->AwaitQuiescence()) 160 return testing::AssertionFailure(); 161 if (!AllExtensionSettingsSameAsVerifier()) 162 return testing::AssertionFailure(); 163 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(); 171 172 MutateSomeSettings(4, extension0, extension1, extension2); 173 if (!test()->AwaitQuiescence()) 174 return testing::AssertionFailure(); 175 if (!AllExtensionSettingsSameAsVerifier()) 176 return testing::AssertionFailure(); 177 178 return testing::AssertionSuccess(); 179} 180 181IN_PROC_BROWSER_TEST_F(TwoClientExtensionSettingsAndAppSettingsSyncTest, 182 ExtensionsStartWithSameSettings) { 183 ASSERT_TRUE(SetupClients()); 184 ASSERT_PRED3(StartWithSameSettingsTest, 185 InstallExtensionForAllProfiles(0), 186 InstallExtensionForAllProfiles(1), 187 InstallExtensionForAllProfiles(2) 188 ); 189} 190 191IN_PROC_BROWSER_TEST_F(TwoClientExtensionSettingsAndAppSettingsSyncTest, 192 AppsStartWithSameSettings) { 193 ASSERT_TRUE(SetupClients()); 194 ASSERT_PRED3(StartWithSameSettingsTest, 195 InstallAppForAllProfiles(0), 196 InstallAppForAllProfiles(1), 197 InstallAppForAllProfiles(2) 198 ); 199} 200 201IN_PROC_BROWSER_TEST_F(TwoClientExtensionSettingsAndAppSettingsSyncTest, 202 ExtensionsStartWithDifferentSettings) { 203 ASSERT_TRUE(SetupClients()); 204 ASSERT_PRED3(StartWithDifferentSettingsTest, 205 InstallExtensionForAllProfiles(0), 206 InstallExtensionForAllProfiles(1), 207 InstallExtensionForAllProfiles(2) 208 ); 209} 210 211IN_PROC_BROWSER_TEST_F(TwoClientExtensionSettingsAndAppSettingsSyncTest, 212 AppsStartWithDifferentSettings) { 213 ASSERT_TRUE(SetupClients()); 214 ASSERT_PRED3(StartWithDifferentSettingsTest, 215 InstallAppForAllProfiles(0), 216 InstallAppForAllProfiles(1), 217 InstallAppForAllProfiles(2) 218 ); 219} 220 221} // namespace 222