1 // Copyright 2013 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 #ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_TEST_H_
6 #define CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_TEST_H_
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/scoped_vector.h"
15 #include "chrome/test/base/in_process_browser_test.h"
16 #include "net/dns/mock_host_resolver.h"
17 #include "sync/internal_api/public/base/model_type.h"
18 #include "sync/protocol/sync_protocol_error.h"
19 #include "sync/test/local_sync_test_server.h"
24 class ProfileSyncServiceHarness;
27 class FakeURLFetcherFactory;
29 class ScopedDefaultHostResolverProc;
30 class URLFetcherImplFactory;
31 class URLRequestContextGetter;
34 // This is the base class for integration tests for all sync data types. Derived
35 // classes must be defined for each sync data type. Individual tests are defined
36 // using the IN_PROC_BROWSER_TEST_F macro.
37 class SyncTest : public InProcessBrowserTest {
39 // The different types of live sync tests that can be implemented.
41 // Tests where only one client profile is synced with the server. Typically
42 // sanity level tests.
45 // Tests where two client profiles are synced with the server. Typically
46 // functionality level tests.
49 // Tests where three or more client profiles are synced with the server.
50 // Typically, these tests create client side races and verify that sync
55 // The type of server we're running against.
57 SERVER_TYPE_UNDECIDED,
58 LOCAL_PYTHON_SERVER, // The mock python server that runs locally and is
59 // part of the Chromium checkout.
60 LOCAL_LIVE_SERVER, // Some other server (maybe the real binary used by
61 // Google's sync service) that can be started on
62 // a per-test basis by running a command
63 EXTERNAL_LIVE_SERVER, // A remote server that the test code has no control
64 // over whatsoever; cross your fingers that the
65 // account state is initially clean.
68 // NOTE: IMPORTANT the enum here should match with
69 // the enum defined on the chromiumsync.py test server impl.
70 enum SyncErrorFrequency {
71 // Uninitialized state.
74 // Server sends the error on all requests.
75 ERROR_FREQUENCY_ALWAYS,
77 // Server sends the error on two thirds of the request.
78 // Note this is not random. The server would send the
79 // error on the first 2 requests of every 3 requests.
80 ERROR_FREQUENCY_TWO_THIRDS
83 // A SyncTest must be associated with a particular test type.
84 explicit SyncTest(TestType test_type);
88 // Validates command line parameters and creates a local python test server if
90 virtual void SetUp() OVERRIDE;
92 // Brings down local python test server if one was created.
93 virtual void TearDown() OVERRIDE;
95 // Sets up command line flags required for sync tests.
96 virtual void SetUpCommandLine(CommandLine* cl) OVERRIDE;
98 // Used to get the number of sync clients used by a test.
99 int num_clients() WARN_UNUSED_RESULT { return num_clients_; }
101 // Returns a pointer to a particular sync profile. Callee owns the object
102 // and manages its lifetime.
103 Profile* GetProfile(int index) WARN_UNUSED_RESULT;
105 // Returns a pointer to a particular browser. Callee owns the object
106 // and manages its lifetime.
107 Browser* GetBrowser(int index) WARN_UNUSED_RESULT;
109 // Returns a pointer to a particular sync client. Callee owns the object
110 // and manages its lifetime.
111 ProfileSyncServiceHarness* GetClient(int index) WARN_UNUSED_RESULT;
113 // Returns a reference to the collection of sync clients. Callee owns the
114 // object and manages its lifetime.
115 std::vector<ProfileSyncServiceHarness*>& clients() WARN_UNUSED_RESULT {
116 return clients_.get();
119 // Returns a pointer to the sync profile that is used to verify changes to
120 // individual sync profiles. Callee owns the object and manages its lifetime.
121 Profile* verifier() WARN_UNUSED_RESULT;
123 // Used to determine whether the verifier profile should be updated or not.
124 bool use_verifier() WARN_UNUSED_RESULT { return use_verifier_; }
126 // After calling this method, changes made to a profile will no longer be
127 // reflected in the verifier profile. Note: Not all datatypes use this.
128 // TODO(rsimha): Hook up all datatypes to this mechanism.
129 void DisableVerifier();
131 // Initializes sync clients and profiles but does not sync any of them.
132 virtual bool SetupClients() WARN_UNUSED_RESULT;
134 // Initializes sync clients and profiles if required and syncs each of them.
135 virtual bool SetupSync() WARN_UNUSED_RESULT;
137 // Enable outgoing network connections for the given profile.
138 virtual void EnableNetwork(Profile* profile);
140 // Disable outgoing network connections for the given profile.
141 virtual void DisableNetwork(Profile* profile);
143 // Encrypts the datatype |type| for profile |index|.
144 bool EnableEncryption(int index, syncer::ModelType type);
146 // Checks if the datatype |type| is encrypted for profile |index|.
147 bool IsEncrypted(int index, syncer::ModelType type);
149 // Blocks until all sync clients have completed their mutual sync cycles.
150 // Returns true if a quiescent state was successfully reached.
151 bool AwaitQuiescence();
153 // Returns true if the server being used supports controlling
155 bool ServerSupportsNotificationControl() const;
157 // Disable notifications on the server. This operation is available
158 // only if ServerSupportsNotificationControl() returned true.
159 void DisableNotifications();
161 // Enable notifications on the server. This operation is available
162 // only if ServerSupportsNotificationControl() returned true.
163 void EnableNotifications();
165 // Trigger a notification to be sent to all clients. This operation
166 // is available only if ServerSupportsNotificationControl() returned
168 void TriggerNotification(syncer::ModelTypeSet changed_types);
170 // Returns true if the server being used supports injecting errors.
171 bool ServerSupportsErrorTriggering() const;
173 // Triggers a migration for one or more datatypes, and waits
174 // for the server to complete it. This operation is available
175 // only if ServerSupportsErrorTriggering() returned true.
176 void TriggerMigrationDoneError(syncer::ModelTypeSet model_types);
178 // Triggers the server to set its birthday to a random value thereby
179 // the server would return a birthday error on next sync.
180 void TriggerBirthdayError();
182 // Triggers a transient error on the server. Note the server will stay in
183 // this state until shut down.
184 void TriggerTransientError();
186 // Triggers an auth error on the server, simulating the case when the gaia
187 // password is changed at another location. Note the server will stay in
188 // this state until shut down.
189 void TriggerAuthError();
191 // Triggers an XMPP auth error on the server. Note the server will
192 // stay in this state until shut down.
193 void TriggerXmppAuthError();
195 // Triggers a sync error on the server.
196 // error: The error the server is expected to return.
197 // frequency: Frequency with which the error is returned.
198 void TriggerSyncError(const syncer::SyncProtocolError& error,
199 SyncErrorFrequency frequency);
201 // Triggers the creation the Synced Bookmarks folder on the server.
202 void TriggerCreateSyncedBookmarks();
204 // Returns the number of default items that every client syncs.
205 int NumberOfDefaultSyncItems() const;
208 // Add custom switches needed for running the test.
209 virtual void AddTestSwitches(CommandLine* cl);
211 // Append the command line switches to enable experimental types that aren't
212 // on by default yet.
213 virtual void AddOptionalTypesToCommandLine(CommandLine* cl);
215 // InProcessBrowserTest override. Destroys all the sync clients and sync
216 // profiles created by a test.
217 virtual void CleanUpOnMainThread() OVERRIDE;
219 // InProcessBrowserTest override. Changes behavior of the default host
220 // resolver to avoid DNS lookup errors.
221 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE;
223 // InProcessBrowserTest override. Resets the host resolver its default
225 virtual void TearDownInProcessBrowserTestFixture() OVERRIDE;
227 // Creates Profile, Browser and ProfileSyncServiceHarness instances for
228 // |index|. Used by SetupClients().
229 virtual void InitializeInstance(int index);
231 // Implementations of the EnableNotifications() and DisableNotifications()
232 // functions defined above.
233 void DisableNotificationsImpl();
234 void EnableNotificationsImpl();
236 // GAIA account used by the test case.
237 std::string username_;
239 // GAIA password used by the test case.
240 std::string password_;
242 // Locally available plain text file in which GAIA credentials are stored.
243 base::FilePath password_file_;
246 // Helper to ProfileManager::CreateProfile that handles path creation.
247 static Profile* MakeProfile(const base::FilePath::StringType name);
249 // Helper method used to read GAIA credentials from a local password file
250 // specified via the "--password-file-for-test" command line switch.
251 // Note: The password file must be a plain text file with exactly two lines --
252 // the username on the first line and the password on the second line.
253 void ReadPasswordFile();
255 // Helper method that starts up a sync test server if required.
256 void SetUpTestServerIfRequired();
258 // Helper method used to start up a local python test server. Note: We set up
259 // an XMPP-only python server if |server_type_| is LOCAL_LIVE_SERVER and mock
260 // gaia credentials are in use. Returns true if successful.
261 bool SetUpLocalPythonTestServer();
263 // Helper method used to start up a local sync test server. Returns true if
265 bool SetUpLocalTestServer();
267 // Helper method used to destroy the local python sync test server if one was
268 // created. Returns true if successful.
269 bool TearDownLocalPythonTestServer();
271 // Helper method used to destroy the local sync test server if one was
272 // created. Returns true if successful.
273 bool TearDownLocalTestServer();
275 // Helper method that waits for up to |wait| for the test server
276 // to start. Splits the time into |intervals| intervals, and polls the
277 // server after each interval to see if it has started. Returns true if
279 bool WaitForTestServerToStart(base::TimeDelta wait, int intervals);
281 // Helper method used to check if the test server is up and running.
282 bool IsTestServerRunning();
284 // Used to disable and enable network connectivity by providing and
285 // clearing an invalid proxy configuration.
286 void SetProxyConfig(net::URLRequestContextGetter* context,
287 const net::ProxyConfig& proxy_config);
289 // Helper method used to set up fake responses for kClientLoginUrl,
290 // kIssueAuthTokenUrl, kGetUserInfoUrl and kSearchDomainCheckUrl in order to
291 // mock out calls to GAIA servers.
292 void SetupMockGaiaResponses();
294 // Helper method used to clear any fake responses that might have been set for
295 // various gaia URLs, cancel any outstanding URL requests, and return to using
296 // the default URLFetcher creation mechanism.
297 void ClearMockGaiaResponses();
299 // Python sync test server, started on demand.
300 syncer::LocalSyncTestServer sync_server_;
302 // Helper class to whitelist the notification port.
303 scoped_ptr<net::ScopedPortException> xmpp_port_;
305 // Used to differentiate between single-client, two-client, multi-client and
306 // many-client tests.
309 // Tells us what kind of server we're using (some tests run only on certain
311 ServerType server_type_;
313 // Number of sync clients that will be created by a test.
316 // Collection of sync profiles used by a test. A sync profile maintains sync
317 // data contained within its own subdirectory under the chrome user data
318 // directory. Profiles are owned by the ProfileManager.
319 std::vector<Profile*> profiles_;
321 // Collection of pointers to the browser objects used by a test. One browser
322 // instance is created for each sync profile. Browser object lifetime is
323 // managed by BrowserList, so we don't use a ScopedVector here.
324 std::vector<Browser*> browsers_;
326 // Collection of sync clients used by a test. A sync client is associated with
327 // a sync profile, and implements methods that sync the contents of the
328 // profile with the server.
329 ScopedVector<ProfileSyncServiceHarness> clients_;
331 // Sync profile against which changes to individual profiles are verified. We
332 // don't need a corresponding verifier sync client because the contents of the
333 // verifier profile are strictly local, and are not meant to be synced.
336 // Indicates whether changes to a profile should also change the verifier
340 // Indicates whether or not notifications were explicitly enabled/disabled.
342 bool notifications_enabled_;
344 // Sync integration tests need to make live DNS requests for access to
345 // GAIA and sync server URLs under google.com. We use a scoped version
346 // to override the default resolver while the test is active.
347 scoped_ptr<net::ScopedDefaultHostResolverProc> mock_host_resolver_override_;
349 // Used to start and stop the local test server.
350 base::ProcessHandle test_server_handle_;
352 // Fake URLFetcher factory used to mock out GAIA signin.
353 scoped_ptr<net::FakeURLFetcherFactory> fake_factory_;
355 // The URLFetcherImplFactory instance used to instantiate |fake_factory_|.
356 scoped_ptr<net::URLFetcherImplFactory> factory_;
358 // Number of default entries (as determined by the existing entries at setup
359 // time on client 0).
360 size_t number_of_default_sync_items_;
362 DISALLOW_COPY_AND_ASSIGN(SyncTest);
365 #endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_TEST_H_