Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(383)

Side by Side Diff: sync/tools/sync_client.cc

Issue 15580002: Make use of InvalidationService (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sync/sync_tests.gypi ('k') | sync/tools/sync_listen_notifications.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 #include <cstddef> 5 #include <cstddef>
6 #include <cstdio> 6 #include <cstdio>
7 #include <string> 7 #include <string>
8 8
9 #include "base/at_exit.h" 9 #include "base/at_exit.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/compiler_specific.h" 11 #include "base/compiler_specific.h"
12 #include "base/debug/stack_trace.h" 12 #include "base/debug/stack_trace.h"
13 #include "base/files/scoped_temp_dir.h" 13 #include "base/files/scoped_temp_dir.h"
14 #include "base/json/json_writer.h" 14 #include "base/json/json_writer.h"
15 #include "base/logging.h" 15 #include "base/logging.h"
16 #include "base/memory/ref_counted.h" 16 #include "base/memory/ref_counted.h"
17 #include "base/memory/scoped_ptr.h" 17 #include "base/memory/scoped_ptr.h"
18 #include "base/memory/weak_ptr.h" 18 #include "base/memory/weak_ptr.h"
19 #include "base/message_loop.h" 19 #include "base/message_loop.h"
20 #include "base/rand_util.h"
20 #include "base/task_runner.h" 21 #include "base/task_runner.h"
21 #include "base/threading/thread.h" 22 #include "base/threading/thread.h"
22 #include "jingle/notifier/base/notification_method.h" 23 #include "jingle/notifier/base/notification_method.h"
23 #include "jingle/notifier/base/notifier_options.h" 24 #include "jingle/notifier/base/notifier_options.h"
24 #include "net/base/host_port_pair.h" 25 #include "net/base/host_port_pair.h"
25 #include "net/base/network_change_notifier.h" 26 #include "net/base/network_change_notifier.h"
26 #include "net/dns/host_resolver.h" 27 #include "net/dns/host_resolver.h"
27 #include "net/http/transport_security_state.h" 28 #include "net/http/transport_security_state.h"
28 #include "net/url_request/url_request_test_util.h" 29 #include "net/url_request/url_request_test_util.h"
29 #include "sync/internal_api/public/base/model_type.h" 30 #include "sync/internal_api/public/base/model_type.h"
30 #include "sync/internal_api/public/base_node.h" 31 #include "sync/internal_api/public/base_node.h"
31 #include "sync/internal_api/public/engine/passive_model_worker.h" 32 #include "sync/internal_api/public/engine/passive_model_worker.h"
32 #include "sync/internal_api/public/http_bridge.h" 33 #include "sync/internal_api/public/http_bridge.h"
33 #include "sync/internal_api/public/internal_components_factory_impl.h" 34 #include "sync/internal_api/public/internal_components_factory_impl.h"
34 #include "sync/internal_api/public/read_node.h" 35 #include "sync/internal_api/public/read_node.h"
35 #include "sync/internal_api/public/sync_manager.h" 36 #include "sync/internal_api/public/sync_manager.h"
36 #include "sync/internal_api/public/sync_manager_factory.h" 37 #include "sync/internal_api/public/sync_manager_factory.h"
37 #include "sync/internal_api/public/util/report_unrecoverable_error_function.h" 38 #include "sync/internal_api/public/util/report_unrecoverable_error_function.h"
38 #include "sync/internal_api/public/util/unrecoverable_error_handler.h" 39 #include "sync/internal_api/public/util/unrecoverable_error_handler.h"
39 #include "sync/internal_api/public/util/weak_handle.h" 40 #include "sync/internal_api/public/util/weak_handle.h"
40 #include "sync/js/js_event_details.h" 41 #include "sync/js/js_event_details.h"
41 #include "sync/js/js_event_handler.h" 42 #include "sync/js/js_event_handler.h"
42 #include "sync/notifier/invalidation_state_tracker.h" 43 #include "sync/notifier/invalidation_state_tracker.h"
43 #include "sync/notifier/invalidator.h" 44 #include "sync/notifier/non_blocking_invalidator.h"
44 #include "sync/notifier/invalidator_factory.h"
45 #include "sync/test/fake_encryptor.h" 45 #include "sync/test/fake_encryptor.h"
46 #include "sync/tools/null_invalidation_state_tracker.h" 46 #include "sync/tools/null_invalidation_state_tracker.h"
47 47
48 #if defined(OS_MACOSX) 48 #if defined(OS_MACOSX)
49 #include "base/mac/scoped_nsautorelease_pool.h" 49 #include "base/mac/scoped_nsautorelease_pool.h"
50 #endif 50 #endif
51 51
52 // This is a simple utility that initializes a sync client and 52 // This is a simple utility that initializes a sync client and
53 // prints out any events. 53 // prints out any events.
54 54
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 notifier_options.try_ssltcp_first = 208 notifier_options.try_ssltcp_first =
209 command_line.HasSwitch(kXmppTrySslTcpFirstSwitch); 209 command_line.HasSwitch(kXmppTrySslTcpFirstSwitch);
210 LOG_IF(INFO, notifier_options.try_ssltcp_first) 210 LOG_IF(INFO, notifier_options.try_ssltcp_first)
211 << "Trying SSL/TCP port before XMPP port for notifications."; 211 << "Trying SSL/TCP port before XMPP port for notifications.";
212 212
213 notifier_options.allow_insecure_connection = 213 notifier_options.allow_insecure_connection =
214 command_line.HasSwitch(kXmppAllowInsecureConnectionSwitch); 214 command_line.HasSwitch(kXmppAllowInsecureConnectionSwitch);
215 LOG_IF(INFO, notifier_options.allow_insecure_connection) 215 LOG_IF(INFO, notifier_options.allow_insecure_connection)
216 << "Allowing insecure XMPP connections."; 216 << "Allowing insecure XMPP connections.";
217 217
218 if (command_line.HasSwitch(kNotificationMethodSwitch)) { 218 return notifier_options;
219 notifier_options.notification_method = 219 }
220 notifier::StringToNotificationMethod(
221 command_line.GetSwitchValueASCII(kNotificationMethodSwitch));
222 }
223 220
224 return notifier_options; 221 void StubNetworkTimeUpdateCallback(const base::Time&,
222 const base::TimeDelta&,
223 const base::TimeDelta&) {
225 } 224 }
226 225
227 int SyncClientMain(int argc, char* argv[]) { 226 int SyncClientMain(int argc, char* argv[]) {
228 #if defined(OS_MACOSX) 227 #if defined(OS_MACOSX)
229 base::mac::ScopedNSAutoreleasePool pool; 228 base::mac::ScopedNSAutoreleasePool pool;
230 #endif 229 #endif
231 base::AtExitManager exit_manager; 230 base::AtExitManager exit_manager;
232 CommandLine::Init(argc, argv); 231 CommandLine::Init(argc, argv);
233 logging::LoggingSettings settings; 232 logging::LoggingSettings settings;
234 settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; 233 settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
235 logging::InitLogging(settings); 234 logging::InitLogging(settings);
236 235
237 base::MessageLoop sync_loop; 236 base::MessageLoop sync_loop;
238 base::Thread io_thread("IO thread"); 237 base::Thread io_thread("IO thread");
239 base::Thread::Options options; 238 base::Thread::Options options;
240 options.message_loop_type = base::MessageLoop::TYPE_IO; 239 options.message_loop_type = base::MessageLoop::TYPE_IO;
241 io_thread.StartWithOptions(options); 240 io_thread.StartWithOptions(options);
242 241
243 // Parse command line. 242 // Parse command line.
244 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 243 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
245 SyncCredentials credentials; 244 SyncCredentials credentials;
246 credentials.email = command_line.GetSwitchValueASCII(kEmailSwitch); 245 credentials.email = command_line.GetSwitchValueASCII(kEmailSwitch);
247 credentials.sync_token = command_line.GetSwitchValueASCII(kTokenSwitch); 246 credentials.sync_token = command_line.GetSwitchValueASCII(kTokenSwitch);
248 // TODO(akalin): Write a wrapper script that gets a token for an 247 // TODO(akalin): Write a wrapper script that gets a token for an
249 // email and password and passes that in to this utility. 248 // email and password and passes that in to this utility.
250 if (credentials.email.empty() || credentials.sync_token.empty()) { 249 if (credentials.email.empty() || credentials.sync_token.empty()) {
251 std::printf("Usage: %s --%s=foo@bar.com --%s=token\n" 250 std::printf("Usage: %s --%s=foo@bar.com --%s=token\n"
252 "[--%s=host:port] [--%s] [--%s]\n" 251 "[--%s=host:port] [--%s] [--%s]\n"
253 "[--%s=(server|p2p)]\n\n"
254 "Run chrome and set a breakpoint on\n" 252 "Run chrome and set a breakpoint on\n"
255 "syncer::SyncManagerImpl::UpdateCredentials() " 253 "syncer::SyncManagerImpl::UpdateCredentials() "
256 "after logging into\n" 254 "after logging into\n"
257 "sync to get the token to pass into this utility.\n", 255 "sync to get the token to pass into this utility.\n",
258 argv[0], 256 argv[0],
259 kEmailSwitch, kTokenSwitch, kXmppHostPortSwitch, 257 kEmailSwitch, kTokenSwitch, kXmppHostPortSwitch,
260 kXmppTrySslTcpFirstSwitch, 258 kXmppTrySslTcpFirstSwitch,
261 kXmppAllowInsecureConnectionSwitch, 259 kXmppAllowInsecureConnectionSwitch);
262 kNotificationMethodSwitch);
263 return -1; 260 return -1;
264 } 261 }
265 262
266 // Set up objects that monitor the network. 263 // Set up objects that monitor the network.
267 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier( 264 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier(
268 net::NetworkChangeNotifier::Create()); 265 net::NetworkChangeNotifier::Create());
269 266
270 // Set up sync notifier factory. 267 // Set up sync notifier factory.
271 const scoped_refptr<MyTestURLRequestContextGetter> context_getter = 268 const scoped_refptr<MyTestURLRequestContextGetter> context_getter =
272 new MyTestURLRequestContextGetter(io_thread.message_loop_proxy()); 269 new MyTestURLRequestContextGetter(io_thread.message_loop_proxy());
273 const notifier::NotifierOptions& notifier_options = 270 const notifier::NotifierOptions& notifier_options =
274 ParseNotifierOptions(command_line, context_getter); 271 ParseNotifierOptions(command_line, context_getter);
275 const char kClientInfo[] = "sync_listen_notifications"; 272 const char kClientInfo[] = "standalone_sync_client";
273 std::string invalidator_id = base::RandBytesAsString(8);
276 NullInvalidationStateTracker null_invalidation_state_tracker; 274 NullInvalidationStateTracker null_invalidation_state_tracker;
277 InvalidatorFactory invalidator_factory( 275 scoped_ptr<Invalidator> invalidator(new NonBlockingInvalidator(
278 notifier_options, kClientInfo, 276 notifier_options,
279 null_invalidation_state_tracker.AsWeakPtr()); 277 invalidator_id,
278 null_invalidation_state_tracker.GetAllInvalidationStates(),
279 null_invalidation_state_tracker.GetBootstrapData(),
280 WeakHandle<InvalidationStateTracker>(
281 null_invalidation_state_tracker.AsWeakPtr()),
282 kClientInfo));
280 283
281 // Set up database directory for the syncer. 284 // Set up database directory for the syncer.
282 base::ScopedTempDir database_dir; 285 base::ScopedTempDir database_dir;
283 CHECK(database_dir.CreateUniqueTempDir()); 286 CHECK(database_dir.CreateUniqueTempDir());
284 287
285 // Set up model type parameters. 288 // Developers often add types to ModelTypeSet::All() before the server
286 const ModelTypeSet model_types = ModelTypeSet::All(); 289 // supports them. We need to be explicit about which types we want here.
290 ModelTypeSet model_types;
291 model_types.Put(BOOKMARKS);
292 model_types.Put(PREFERENCES);
293 model_types.Put(PASSWORDS);
294 model_types.Put(AUTOFILL);
295 model_types.Put(THEMES);
296 model_types.Put(TYPED_URLS);
297 model_types.Put(EXTENSIONS);
298 model_types.Put(NIGORI);
299 model_types.Put(SEARCH_ENGINES);
300 model_types.Put(SESSIONS);
301 model_types.Put(APPS);
302 model_types.Put(AUTOFILL_PROFILE);
303 model_types.Put(APP_SETTINGS);
304 model_types.Put(EXTENSION_SETTINGS);
305 model_types.Put(APP_NOTIFICATIONS);
306 model_types.Put(HISTORY_DELETE_DIRECTIVES);
307 model_types.Put(SYNCED_NOTIFICATIONS);
308 model_types.Put(DEVICE_INFO);
309 model_types.Put(EXPERIMENTS);
310 model_types.Put(PRIORITY_PREFERENCES);
311 model_types.Put(DICTIONARY);
312 model_types.Put(FAVICON_IMAGES);
313 model_types.Put(FAVICON_TRACKING);
314
287 ModelSafeRoutingInfo routing_info; 315 ModelSafeRoutingInfo routing_info;
288 for (ModelTypeSet::Iterator it = model_types.First(); 316 for (ModelTypeSet::Iterator it = model_types.First();
289 it.Good(); it.Inc()) { 317 it.Good(); it.Inc()) {
290 routing_info[it.Get()] = GROUP_PASSIVE; 318 routing_info[it.Get()] = GROUP_PASSIVE;
291 } 319 }
292 scoped_refptr<PassiveModelWorker> passive_model_safe_worker = 320 scoped_refptr<PassiveModelWorker> passive_model_safe_worker =
293 new PassiveModelWorker(&sync_loop, NULL); 321 new PassiveModelWorker(&sync_loop, NULL);
294 std::vector<ModelSafeWorker*> workers; 322 std::vector<ModelSafeWorker*> workers;
295 workers.push_back(passive_model_safe_worker.get()); 323 workers.push_back(passive_model_safe_worker.get());
296 324
297 // Set up sync manager. 325 // Set up sync manager.
298 SyncManagerFactory sync_manager_factory; 326 SyncManagerFactory sync_manager_factory;
299 scoped_ptr<SyncManager> sync_manager = 327 scoped_ptr<SyncManager> sync_manager =
300 sync_manager_factory.CreateSyncManager("sync_client manager"); 328 sync_manager_factory.CreateSyncManager("sync_client manager");
301 LoggingJsEventHandler js_event_handler; 329 LoggingJsEventHandler js_event_handler;
302 const char kSyncServerAndPath[] = "clients4.google.com/chrome-sync/dev"; 330 const char kSyncServerAndPath[] = "clients4.google.com/chrome-sync/dev";
303 int kSyncServerPort = 443; 331 int kSyncServerPort = 443;
304 bool kUseSsl = true; 332 bool kUseSsl = true;
305 // Used only by InitialProcessMetadata(), so it's okay to leave this as NULL. 333 // Used only by InitialProcessMetadata(), so it's okay to leave this as NULL.
306 const scoped_refptr<base::TaskRunner> blocking_task_runner = NULL; 334 const scoped_refptr<base::TaskRunner> blocking_task_runner = NULL;
307 const char kUserAgent[] = "sync_client"; 335 const char kUserAgent[] = "sync_client";
308 // TODO(akalin): Replace this with just the context getter once 336 // TODO(akalin): Replace this with just the context getter once
309 // HttpPostProviderFactory is removed. 337 // HttpPostProviderFactory is removed.
310 scoped_ptr<HttpPostProviderFactory> post_factory(new HttpBridgeFactory( 338 scoped_ptr<HttpPostProviderFactory> post_factory(
311 context_getter.get(), kUserAgent, NetworkTimeUpdateCallback())); 339 new HttpBridgeFactory(context_getter,
340 kUserAgent,
341 base::Bind(&StubNetworkTimeUpdateCallback)));
312 // Used only when committing bookmarks, so it's okay to leave this 342 // Used only when committing bookmarks, so it's okay to leave this
313 // as NULL. 343 // as NULL.
314 ExtensionsActivityMonitor* extensions_activity_monitor = NULL; 344 ExtensionsActivityMonitor* extensions_activity_monitor = NULL;
315 LoggingChangeDelegate change_delegate; 345 LoggingChangeDelegate change_delegate;
316 const char kRestoredKeyForBootstrapping[] = ""; 346 const char kRestoredKeyForBootstrapping[] = "";
317 const char kRestoredKeystoreKeyForBootstrapping[] = ""; 347 const char kRestoredKeystoreKeyForBootstrapping[] = "";
318 NullEncryptor null_encryptor; 348 NullEncryptor null_encryptor;
319 LoggingUnrecoverableErrorHandler unrecoverable_error_handler; 349 LoggingUnrecoverableErrorHandler unrecoverable_error_handler;
320 InternalComponentsFactoryImpl::Switches factory_switches = { 350 InternalComponentsFactoryImpl::Switches factory_switches = {
321 InternalComponentsFactory::ENCRYPTION_KEYSTORE, 351 InternalComponentsFactory::ENCRYPTION_KEYSTORE,
322 InternalComponentsFactory::BACKOFF_NORMAL 352 InternalComponentsFactory::BACKOFF_NORMAL
323 }; 353 };
324 354
325 sync_manager->Init(database_dir.path(), 355 sync_manager->Init(database_dir.path(),
326 WeakHandle<JsEventHandler>( 356 WeakHandle<JsEventHandler>(
327 js_event_handler.AsWeakPtr()), 357 js_event_handler.AsWeakPtr()),
328 kSyncServerAndPath, 358 kSyncServerAndPath,
329 kSyncServerPort, 359 kSyncServerPort,
330 kUseSsl, 360 kUseSsl,
331 post_factory.Pass(), 361 post_factory.Pass(),
332 workers, 362 workers,
333 extensions_activity_monitor, 363 extensions_activity_monitor,
334 &change_delegate, 364 &change_delegate,
335 credentials, 365 credentials,
336 scoped_ptr<Invalidator>( 366 invalidator_id,
337 invalidator_factory.CreateInvalidator()),
338 invalidator_factory.GetInvalidatorClientId(),
339 kRestoredKeyForBootstrapping, 367 kRestoredKeyForBootstrapping,
340 kRestoredKeystoreKeyForBootstrapping, 368 kRestoredKeystoreKeyForBootstrapping,
341 scoped_ptr<InternalComponentsFactory>( 369 scoped_ptr<InternalComponentsFactory>(
342 new InternalComponentsFactoryImpl(factory_switches)), 370 new InternalComponentsFactoryImpl(factory_switches)),
343 &null_encryptor, 371 &null_encryptor,
344 &unrecoverable_error_handler, 372 &unrecoverable_error_handler,
345 &LogUnrecoverableErrorContext, false); 373 &LogUnrecoverableErrorContext, false);
346 // TODO(akalin): Avoid passing in model parameters multiple times by 374 // TODO(akalin): Avoid passing in model parameters multiple times by
347 // organizing handling of model types. 375 // organizing handling of model types.
348 sync_manager->UpdateEnabledTypes(model_types); 376 invalidator->UpdateCredentials(credentials.email, credentials.sync_token);
377 invalidator->RegisterHandler(sync_manager.get());
378 invalidator->UpdateRegisteredIds(
379 sync_manager.get(), ModelTypeSetToObjectIdSet(model_types));
349 sync_manager->StartSyncingNormally(routing_info); 380 sync_manager->StartSyncingNormally(routing_info);
350 381
351 sync_loop.Run(); 382 sync_loop.Run();
352 383
353 io_thread.Stop(); 384 io_thread.Stop();
354 return 0; 385 return 0;
355 } 386 }
356 387
357 } // namespace 388 } // namespace
358 } // namespace syncer 389 } // namespace syncer
359 390
360 int main(int argc, char* argv[]) { 391 int main(int argc, char* argv[]) {
361 return syncer::SyncClientMain(argc, argv); 392 return syncer::SyncClientMain(argc, argv);
362 } 393 }
OLDNEW
« no previous file with comments | « sync/sync_tests.gypi ('k') | sync/tools/sync_listen_notifications.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698