| Index: chrome/browser/sync/glue/sync_backend_registrar_unittest.cc
|
| diff --git a/chrome/browser/sync/glue/sync_backend_registrar_unittest.cc b/chrome/browser/sync/glue/sync_backend_registrar_unittest.cc
|
| index f1a62ee0ff836c71d597881825cbb49745ec80f9..cd2d29ddf4edfdb88cc9ecefb6feab6cab9e8586 100644
|
| --- a/chrome/browser/sync/glue/sync_backend_registrar_unittest.cc
|
| +++ b/chrome/browser/sync/glue/sync_backend_registrar_unittest.cc
|
| @@ -256,91 +256,6 @@ TEST_F(SyncBackendRegistrarTest, ActivateDeactivateNonUIDataType) {
|
| TriggerChanges(registrar_.get(), AUTOFILL);
|
| }
|
|
|
| -class SyncBackendRegistrarShutdownTest : public testing::Test {
|
| - public:
|
| - void BlockDBThread() {
|
| - EXPECT_FALSE(db_thread_lock_.Try());
|
| -
|
| - db_thread_blocked_.Signal();
|
| - base::AutoLock l(db_thread_lock_);
|
| - }
|
| -
|
| - protected:
|
| - friend class TestRegistrar;
|
| -
|
| - SyncBackendRegistrarShutdownTest()
|
| - : thread_bundle_(content::TestBrowserThreadBundle::REAL_DB_THREAD |
|
| - content::TestBrowserThreadBundle::REAL_FILE_THREAD |
|
| - content::TestBrowserThreadBundle::REAL_IO_THREAD),
|
| - db_thread_blocked_(false, false),
|
| - registrar_destroyed_(false, false) {}
|
| -
|
| - virtual ~SyncBackendRegistrarShutdownTest() {}
|
| -
|
| - content::TestBrowserThreadBundle thread_bundle_;
|
| - base::WaitableEvent db_thread_blocked_;
|
| - base::Lock db_thread_lock_;
|
| - base::WaitableEvent registrar_destroyed_;
|
| -};
|
| -
|
| -// Wrap SyncBackendRegistrar so that we can monitor its lifetime.
|
| -class TestRegistrar : public SyncBackendRegistrar {
|
| - public:
|
| - explicit TestRegistrar(Profile* profile,
|
| - SyncBackendRegistrarShutdownTest* test)
|
| - : SyncBackendRegistrar("test", profile, scoped_ptr<base::Thread>()),
|
| - test_(test) {}
|
| -
|
| - ~TestRegistrar() override { test_->registrar_destroyed_.Signal(); }
|
| -
|
| - private:
|
| - SyncBackendRegistrarShutdownTest* test_;
|
| -};
|
| -
|
| -TEST_F(SyncBackendRegistrarShutdownTest, BlockingShutdown) {
|
| - // Take ownership of |db_thread_lock_| so that the DB thread can't acquire it.
|
| - db_thread_lock_.Acquire();
|
| -
|
| - // This will block the DB thread by waiting on |db_thread_lock_|.
|
| - BrowserThread::PostTask(
|
| - BrowserThread::DB,
|
| - FROM_HERE,
|
| - base::Bind(&SyncBackendRegistrarShutdownTest::BlockDBThread,
|
| - base::Unretained(this)));
|
| -
|
| - TestingProfile profile;
|
| - scoped_ptr<TestRegistrar> registrar(new TestRegistrar(&profile, this));
|
| - base::Thread* sync_thread = registrar->sync_thread();
|
| -
|
| - // Stop here until the DB thread gets a chance to run and block on the lock.
|
| - // Please note that since the task above didn't finish, the task to
|
| - // initialize the worker on the DB thread hasn't had a chance to run yet too.
|
| - // Which means ModelSafeWorker::SetWorkingLoopToCurrent hasn't been called
|
| - // for the DB worker.
|
| - db_thread_blocked_.Wait();
|
| -
|
| - registrar->SetInitialTypes(ModelTypeSet());
|
| -
|
| - // Start the shutdown.
|
| - registrar->RequestWorkerStopOnUIThread();
|
| - sync_thread->message_loop()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&SyncBackendRegistrar::Shutdown,
|
| - base::Unretained(registrar.release())));
|
| -
|
| - // The test verifies that the sync thread doesn't block because
|
| - // of the blocked DB thread and can finish the shutdown.
|
| - sync_thread->message_loop()->RunUntilIdle();
|
| -
|
| - db_thread_lock_.Release();
|
| -
|
| - base::MessageLoop::current()->RunUntilIdle();
|
| -
|
| - // This verifies that all workers have been removed and the registrar
|
| - // destroyed.
|
| - registrar_destroyed_.Wait();
|
| -}
|
| -
|
| } // namespace
|
|
|
| } // namespace browser_sync
|
|
|