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