// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/test/test_io_thread.h" #include "base/bind.h" #include "base/callback.h" #include "base/synchronization/waitable_event.h" namespace { void PostTaskAndWaitHelper(base::WaitableEvent* event, const base::Closure& task) { task.Run(); event->Signal(); } } // namespace namespace base { TestIOThread::TestIOThread(Mode mode) : io_thread_("test_io_thread"), io_thread_started_(false) { switch (mode) { case kAutoStart: Start(); return; case kManualStart: return; } CHECK(false) << "Invalid mode"; } TestIOThread::~TestIOThread() { Stop(); } void TestIOThread::Start() { CHECK(!io_thread_started_); io_thread_started_ = true; CHECK(io_thread_.StartWithOptions( base::Thread::Options(base::MessageLoop::TYPE_IO, 0))); } void TestIOThread::Stop() { // Note: It's okay to call |Stop()| even if the thread isn't running. io_thread_.Stop(); io_thread_started_ = false; } void TestIOThread::PostTask(const tracked_objects::Location& from_here, const base::Closure& task) { task_runner()->PostTask(from_here, task); } void TestIOThread::PostTaskAndWait(const tracked_objects::Location& from_here, const base::Closure& task) { base::WaitableEvent event(false, false); task_runner()->PostTask(from_here, base::Bind(&PostTaskAndWaitHelper, &event, task)); event.Wait(); } } // namespace base