- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync / test / integration / sync_test.h
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.
4
5 #ifndef CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_TEST_H_
6 #define CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_TEST_H_
7
8 #include <string>
9 #include <vector>
10
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"
20
21
22 class CommandLine;
23 class Profile;
24 class ProfileSyncServiceHarness;
25
26 namespace net {
27 class FakeURLFetcherFactory;
28 class ProxyConfig;
29 class ScopedDefaultHostResolverProc;
30 class URLFetcherImplFactory;
31 class URLRequestContextGetter;
32 }
33
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 {
38  public:
39   // The different types of live sync tests that can be implemented.
40   enum TestType {
41     // Tests where only one client profile is synced with the server. Typically
42     // sanity level tests.
43     SINGLE_CLIENT,
44
45     // Tests where two client profiles are synced with the server. Typically
46     // functionality level tests.
47     TWO_CLIENT,
48
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
51     // works.
52     MULTIPLE_CLIENT
53   };
54
55   // The type of server we're running against.
56   enum ServerType {
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.
66   };
67
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.
72     ERROR_FREQUENCY_NONE,
73
74     // Server sends the error on all requests.
75     ERROR_FREQUENCY_ALWAYS,
76
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
81   };
82
83   // A SyncTest must be associated with a particular test type.
84   explicit SyncTest(TestType test_type);
85
86   virtual ~SyncTest();
87
88   // Validates command line parameters and creates a local python test server if
89   // specified.
90   virtual void SetUp() OVERRIDE;
91
92   // Brings down local python test server if one was created.
93   virtual void TearDown() OVERRIDE;
94
95   // Sets up command line flags required for sync tests.
96   virtual void SetUpCommandLine(CommandLine* cl) OVERRIDE;
97
98   // Used to get the number of sync clients used by a test.
99   int num_clients() WARN_UNUSED_RESULT { return num_clients_; }
100
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;
104
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;
108
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;
112
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();
117   }
118
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;
122
123   // Used to determine whether the verifier profile should be updated or not.
124   bool use_verifier() WARN_UNUSED_RESULT { return use_verifier_; }
125
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();
130
131   // Initializes sync clients and profiles but does not sync any of them.
132   virtual bool SetupClients() WARN_UNUSED_RESULT;
133
134   // Initializes sync clients and profiles if required and syncs each of them.
135   virtual bool SetupSync() WARN_UNUSED_RESULT;
136
137   // Enable outgoing network connections for the given profile.
138   virtual void EnableNetwork(Profile* profile);
139
140   // Disable outgoing network connections for the given profile.
141   virtual void DisableNetwork(Profile* profile);
142
143   // Encrypts the datatype |type| for profile |index|.
144   bool EnableEncryption(int index, syncer::ModelType type);
145
146   // Checks if the datatype |type| is encrypted for profile |index|.
147   bool IsEncrypted(int index, syncer::ModelType type);
148
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();
152
153   // Returns true if the server being used supports controlling
154   // notifications.
155   bool ServerSupportsNotificationControl() const;
156
157   // Disable notifications on the server.  This operation is available
158   // only if ServerSupportsNotificationControl() returned true.
159   void DisableNotifications();
160
161   // Enable notifications on the server.  This operation is available
162   // only if ServerSupportsNotificationControl() returned true.
163   void EnableNotifications();
164
165   // Trigger a notification to be sent to all clients.  This operation
166   // is available only if ServerSupportsNotificationControl() returned
167   // true.
168   void TriggerNotification(syncer::ModelTypeSet changed_types);
169
170   // Returns true if the server being used supports injecting errors.
171   bool ServerSupportsErrorTriggering() const;
172
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);
177
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();
181
182   // Triggers a transient error on the server. Note the server will stay in
183   // this state until shut down.
184   void TriggerTransientError();
185
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();
190
191   // Triggers an XMPP auth error on the server.  Note the server will
192   // stay in this state until shut down.
193   void TriggerXmppAuthError();
194
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);
200
201   // Triggers the creation the Synced Bookmarks folder on the server.
202   void TriggerCreateSyncedBookmarks();
203
204   // Returns the number of default items that every client syncs.
205   int NumberOfDefaultSyncItems() const;
206
207  protected:
208   // Add custom switches needed for running the test.
209   virtual void AddTestSwitches(CommandLine* cl);
210
211   // Append the command line switches to enable experimental types that aren't
212   // on by default yet.
213   virtual void AddOptionalTypesToCommandLine(CommandLine* cl);
214
215   // InProcessBrowserTest override. Destroys all the sync clients and sync
216   // profiles created by a test.
217   virtual void CleanUpOnMainThread() OVERRIDE;
218
219   // InProcessBrowserTest override. Changes behavior of the default host
220   // resolver to avoid DNS lookup errors.
221   virtual void SetUpInProcessBrowserTestFixture() OVERRIDE;
222
223   // InProcessBrowserTest override. Resets the host resolver its default
224   // behavior.
225   virtual void TearDownInProcessBrowserTestFixture() OVERRIDE;
226
227   // Creates Profile, Browser and ProfileSyncServiceHarness instances for
228   // |index|. Used by SetupClients().
229   virtual void InitializeInstance(int index);
230
231   // Implementations of the EnableNotifications() and DisableNotifications()
232   // functions defined above.
233   void DisableNotificationsImpl();
234   void EnableNotificationsImpl();
235
236   // GAIA account used by the test case.
237   std::string username_;
238
239   // GAIA password used by the test case.
240   std::string password_;
241
242   // Locally available plain text file in which GAIA credentials are stored.
243   base::FilePath password_file_;
244
245  private:
246   // Helper to ProfileManager::CreateProfile that handles path creation.
247   static Profile* MakeProfile(const base::FilePath::StringType name);
248
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();
254
255   // Helper method that starts up a sync test server if required.
256   void SetUpTestServerIfRequired();
257
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();
262
263   // Helper method used to start up a local sync test server. Returns true if
264   // successful.
265   bool SetUpLocalTestServer();
266
267   // Helper method used to destroy the local python sync test server if one was
268   // created. Returns true if successful.
269   bool TearDownLocalPythonTestServer();
270
271   // Helper method used to destroy the local sync test server if one was
272   // created. Returns true if successful.
273   bool TearDownLocalTestServer();
274
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
278   // successful.
279   bool WaitForTestServerToStart(base::TimeDelta wait, int intervals);
280
281   // Helper method used to check if the test server is up and running.
282   bool IsTestServerRunning();
283
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);
288
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();
293
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();
298
299   // Python sync test server, started on demand.
300   syncer::LocalSyncTestServer sync_server_;
301
302   // Helper class to whitelist the notification port.
303   scoped_ptr<net::ScopedPortException> xmpp_port_;
304
305   // Used to differentiate between single-client, two-client, multi-client and
306   // many-client tests.
307   TestType test_type_;
308
309   // Tells us what kind of server we're using (some tests run only on certain
310   // server types).
311   ServerType server_type_;
312
313   // Number of sync clients that will be created by a test.
314   int num_clients_;
315
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_;
320
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_;
325
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_;
330
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.
334   Profile* verifier_;
335
336   // Indicates whether changes to a profile should also change the verifier
337   // profile or not.
338   bool use_verifier_;
339
340   // Indicates whether or not notifications were explicitly enabled/disabled.
341   // Defaults to true.
342   bool notifications_enabled_;
343
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_;
348
349   // Used to start and stop the local test server.
350   base::ProcessHandle test_server_handle_;
351
352   // Fake URLFetcher factory used to mock out GAIA signin.
353   scoped_ptr<net::FakeURLFetcherFactory> fake_factory_;
354
355   // The URLFetcherImplFactory instance used to instantiate |fake_factory_|.
356   scoped_ptr<net::URLFetcherImplFactory> factory_;
357
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_;
361
362   DISALLOW_COPY_AND_ASSIGN(SyncTest);
363 };
364
365 #endif  // CHROME_BROWSER_SYNC_TEST_INTEGRATION_SYNC_TEST_H_