1a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// found in the LICENSE file. 4a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 5a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chrome/test/base/testing_io_thread_state.h" 6a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 7a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/message_loop/message_loop_proxy.h" 8a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/run_loop.h" 9a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/time/tick_clock.h" 10a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chrome/browser/io_thread.h" 11a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chrome/test/base/testing_browser_process.h" 12a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/browser/browser_thread.h" 13a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 14a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#if defined(OS_CHROMEOS) 15a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chromeos/dbus/dbus_thread_manager.h" 16a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "chromeos/network/network_handler.h" 17a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#endif 18a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 19a3f7b4e666c476898878fa745f637129375cd889Ben Murdochusing content::BrowserThread; 20a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 21a3f7b4e666c476898878fa745f637129375cd889Ben Murdochnamespace { 22a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 23a3f7b4e666c476898878fa745f637129375cd889Ben Murdochbase::Closure ThreadSafeQuit(base::RunLoop* run_loop) { 24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (BrowserThread::CurrentlyOn(BrowserThread::IO)) { 25a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return run_loop->QuitClosure(); 26a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } else { 27a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch using base::Bind; 28a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch using base::IgnoreResult; 29a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return Bind(IgnoreResult(&base::MessageLoopProxy::PostTask), 30a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::MessageLoopProxy::current(), 31a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch FROM_HERE, 32a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch run_loop->QuitClosure()); 33a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 34a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 35a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 36a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} // namespace 37a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 38a3f7b4e666c476898878fa745f637129375cd889Ben Murdochnamespace chrome { 39a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 40a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTestingIOThreadState::TestingIOThreadState() { 41a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#if defined(OS_CHROMEOS) 42a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Needed by IOThread constructor. 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chromeos::DBusThreadManager::Initialize(); 44a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch chromeos::NetworkHandler::Initialize(); 45a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#endif 46a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 47a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch io_thread_state_.reset( 48a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch new IOThread(TestingBrowserProcess::GetGlobal()->local_state(), 49a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestingBrowserProcess::GetGlobal()->policy_service(), 50a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch NULL, NULL)); 51a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 52a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Safe because there are no virtuals. 53a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop run_loop; 54a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch CHECK(BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 55a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::Bind(&TestingIOThreadState::Initialize, 56a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::Unretained(this), 57a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch ThreadSafeQuit(&run_loop)))); 58a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch run_loop.Run(); 59a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 60a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestingBrowserProcess::GetGlobal()->SetIOThread(io_thread_state_.get()); 61a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 62a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 63a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTestingIOThreadState::~TestingIOThreadState() { 64a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Remove all the local IOThread state. 65a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop run_loop; 66a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch CHECK(BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 67a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::Bind(&TestingIOThreadState::Shutdown, 68a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::Unretained(this), 69a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch ThreadSafeQuit(&run_loop)))); 70a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch run_loop.Run(); 71a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestingBrowserProcess::GetGlobal()->SetIOThread(NULL); 72a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 73a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch io_thread_state_.reset(); 74a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 75a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#if defined(OS_CHROMEOS) 76a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch chromeos::NetworkHandler::Shutdown(); 77a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch chromeos::DBusThreadManager::Shutdown(); 78a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#endif 79a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 80a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 81a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid TestingIOThreadState::Initialize(const base::Closure& done) { 82a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 83a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 84a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch io_thread_state_->SetGlobalsForTesting(new IOThread::Globals()); 85a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 86a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch done.Run(); 87a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 88a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 89a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid TestingIOThreadState::Shutdown(const base::Closure& done) { 90a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 91a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 92a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch delete io_thread_state_->globals(); 93a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch io_thread_state_->SetGlobalsForTesting(NULL); 94a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch done.Run(); 95a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 96a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 97a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} // namespace chrome 98