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

Side by Side Diff: sync/internal_api/http_bridge_unittest.cc

Issue 23717047: Retry: sync: Gracefully handle early shutdown (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Renames Created 7 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « sync/internal_api/http_bridge.cc ('k') | sync/internal_api/internal_components_factory_impl.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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 "base/message_loop/message_loop_proxy.h" 5 #include "base/message_loop/message_loop_proxy.h"
6 #include "base/synchronization/waitable_event.h" 6 #include "base/synchronization/waitable_event.h"
7 #include "base/threading/thread.h" 7 #include "base/threading/thread.h"
8 #include "net/test/spawned_test_server/spawned_test_server.h" 8 #include "net/test/spawned_test_server/spawned_test_server.h"
9 #include "net/url_request/test_url_fetcher_factory.h" 9 #include "net/url_request/test_url_fetcher_factory.h"
10 #include "net/url_request/url_fetcher_delegate.h" 10 #include "net/url_request/url_fetcher_delegate.h"
11 #include "net/url_request/url_request_test_util.h" 11 #include "net/url_request/url_request_test_util.h"
12 #include "sync/internal_api/public/base/cancelation_signal.h"
12 #include "sync/internal_api/public/http_bridge.h" 13 #include "sync/internal_api/public/http_bridge.h"
13 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
14 15
15 namespace syncer { 16 namespace syncer {
16 17
17 namespace { 18 namespace {
18 // TODO(timsteele): Should use PathService here. See Chromium Issue 3113. 19 // TODO(timsteele): Should use PathService here. See Chromium Issue 3113.
19 const base::FilePath::CharType kDocRoot[] = 20 const base::FilePath::CharType kDocRoot[] =
20 FILE_PATH_LITERAL("chrome/test/data"); 21 FILE_PATH_LITERAL("chrome/test/data");
21 } 22 }
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 // Abort should have held a reference. 401 // Abort should have held a reference.
401 io_waiter.Signal(); 402 io_waiter.Signal();
402 403
403 // Done. 404 // Done.
404 sync_thread.Stop(); 405 sync_thread.Stop();
405 io_thread()->Stop(); 406 io_thread()->Stop();
406 } 407 }
407 408
408 void HttpBridgeRunOnSyncThread( 409 void HttpBridgeRunOnSyncThread(
409 net::URLRequestContextGetter* baseline_context_getter, 410 net::URLRequestContextGetter* baseline_context_getter,
411 CancelationSignal* factory_cancelation_signal,
410 syncer::HttpPostProviderFactory** bridge_factory_out, 412 syncer::HttpPostProviderFactory** bridge_factory_out,
411 syncer::HttpPostProviderInterface** bridge_out, 413 syncer::HttpPostProviderInterface** bridge_out,
412 base::WaitableEvent* signal_when_created, 414 base::WaitableEvent* signal_when_created,
413 base::WaitableEvent* wait_for_shutdown) { 415 base::WaitableEvent* wait_for_shutdown) {
414 scoped_ptr<syncer::HttpPostProviderFactory> bridge_factory( 416 scoped_ptr<syncer::HttpBridgeFactory> bridge_factory(
415 new syncer::HttpBridgeFactory(baseline_context_getter, 417 new syncer::HttpBridgeFactory(baseline_context_getter,
416 "test", 418 NetworkTimeUpdateCallback(),
417 NetworkTimeUpdateCallback())); 419 factory_cancelation_signal));
420 bridge_factory->Init("test");
418 *bridge_factory_out = bridge_factory.get(); 421 *bridge_factory_out = bridge_factory.get();
419 422
420 HttpPostProviderInterface* bridge = bridge_factory->Create(); 423 HttpPostProviderInterface* bridge = bridge_factory->Create();
421 *bridge_out = bridge; 424 *bridge_out = bridge;
422 425
423 signal_when_created->Signal(); 426 signal_when_created->Signal();
424 wait_for_shutdown->Wait(); 427 wait_for_shutdown->Wait();
425 428
426 bridge_factory->Destroy(bridge); 429 bridge_factory->Destroy(bridge);
427 } 430 }
(...skipping 12 matching lines...) Expand all
440 443
441 syncer::HttpPostProviderFactory* factory = NULL; 444 syncer::HttpPostProviderFactory* factory = NULL;
442 syncer::HttpPostProviderInterface* bridge = NULL; 445 syncer::HttpPostProviderInterface* bridge = NULL;
443 446
444 scoped_refptr<net::URLRequestContextGetter> baseline_context_getter( 447 scoped_refptr<net::URLRequestContextGetter> baseline_context_getter(
445 new net::TestURLRequestContextGetter(io_thread()->message_loop_proxy())); 448 new net::TestURLRequestContextGetter(io_thread()->message_loop_proxy()));
446 449
447 base::WaitableEvent signal_when_created(false, false); 450 base::WaitableEvent signal_when_created(false, false);
448 base::WaitableEvent wait_for_shutdown(false, false); 451 base::WaitableEvent wait_for_shutdown(false, false);
449 452
453 CancelationSignal release_request_context_signal;
454
450 // Create bridge factory and factory on sync thread and wait for the creation 455 // Create bridge factory and factory on sync thread and wait for the creation
451 // to finish. 456 // to finish.
452 sync_thread.message_loop()->PostTask(FROM_HERE, 457 sync_thread.message_loop()->PostTask(FROM_HERE,
453 base::Bind(&HttpBridgeRunOnSyncThread, 458 base::Bind(&HttpBridgeRunOnSyncThread,
454 base::Unretained(baseline_context_getter.get()), 459 base::Unretained(baseline_context_getter.get()),
455 &factory, &bridge, &signal_when_created, &wait_for_shutdown)); 460 &release_request_context_signal ,&factory, &bridge,
461 &signal_when_created, &wait_for_shutdown));
456 signal_when_created.Wait(); 462 signal_when_created.Wait();
457 463
458 // Simulate sync shutdown by aborting bridge and shutting down factory on 464 // Simulate sync shutdown by aborting bridge and shutting down factory on
459 // frontend. 465 // frontend.
460 bridge->Abort(); 466 bridge->Abort();
461 factory->Shutdown(); 467 release_request_context_signal.Signal();
462 468
463 // Wait for sync's RequestContextGetter to be cleared on IO thread and 469 // Wait for sync's RequestContextGetter to be cleared on IO thread and
464 // check for reference count. 470 // check for reference count.
465 base::WaitableEvent signal_wait_start(false, false); 471 base::WaitableEvent signal_wait_start(false, false);
466 base::WaitableEvent wait_done(false, false); 472 base::WaitableEvent wait_done(false, false);
467 io_thread()->message_loop()->PostTask( 473 io_thread()->message_loop()->PostTask(
468 FROM_HERE, 474 FROM_HERE,
469 base::Bind(&WaitOnIOThread, &signal_wait_start, &wait_done)); 475 base::Bind(&WaitOnIOThread, &signal_wait_start, &wait_done));
470 signal_wait_start.Wait(); 476 signal_wait_start.Wait();
471 // |baseline_context_getter| should have only one reference from local 477 // |baseline_context_getter| should have only one reference from local
472 // variable. 478 // variable.
473 EXPECT_TRUE(baseline_context_getter->HasOneRef()); 479 EXPECT_TRUE(baseline_context_getter->HasOneRef());
474 baseline_context_getter = NULL; 480 baseline_context_getter = NULL;
475 481
476 // Unblock and stop IO thread before sync thread. 482 // Unblock and stop IO thread before sync thread.
477 wait_done.Signal(); 483 wait_done.Signal();
478 io_thread()->Stop(); 484 io_thread()->Stop();
479 485
480 // Unblock and stop sync thread. 486 // Unblock and stop sync thread.
481 wait_for_shutdown.Signal(); 487 wait_for_shutdown.Signal();
482 sync_thread.Stop(); 488 sync_thread.Stop();
483 } 489 }
484 490
485 } // namespace syncer 491 } // namespace syncer
OLDNEW
« no previous file with comments | « sync/internal_api/http_bridge.cc ('k') | sync/internal_api/internal_components_factory_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698