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