Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1123)

Side by Side Diff: chrome/browser/chrome_thread_unittest.cc

Issue 1800008: Created a MessageLoopProxy interface. This provides a thread-safe refcounted ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/chrome_thread.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/message_loop.h" 5 #include "base/message_loop.h"
6 #include "base/message_loop_proxy.h"
6 #include "chrome/browser/chrome_thread.h" 7 #include "chrome/browser/chrome_thread.h"
7 #include "testing/gtest/include/gtest/gtest.h" 8 #include "testing/gtest/include/gtest/gtest.h"
8 #include "testing/platform_test.h" 9 #include "testing/platform_test.h"
9 10
10 class ChromeThreadTest : public testing::Test { 11 class ChromeThreadTest : public testing::Test {
11 public: 12 public:
12 void Release() { 13 void Release() {
13 CHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); 14 CHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
14 loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask); 15 loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask);
15 } 16 }
16 17
17 protected: 18 protected:
18 virtual void SetUp() { 19 virtual void SetUp() {
20 ui_thread_.reset(new ChromeThread(ChromeThread::UI));
19 file_thread_.reset(new ChromeThread(ChromeThread::FILE)); 21 file_thread_.reset(new ChromeThread(ChromeThread::FILE));
20 io_thread_.reset(new ChromeThread(ChromeThread::IO)); 22 ui_thread_->Start();
21 file_thread_->Start(); 23 file_thread_->Start();
22 io_thread_->Start();
23 } 24 }
24 25
25 virtual void TearDown() { 26 virtual void TearDown() {
27 ui_thread_->Stop();
26 file_thread_->Stop(); 28 file_thread_->Stop();
27 io_thread_->Stop();
28 } 29 }
29 30
30 static void BasicFunction(MessageLoop* message_loop) { 31 static void BasicFunction(MessageLoop* message_loop) {
31 CHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); 32 CHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
32 message_loop->PostTask(FROM_HERE, new MessageLoop::QuitTask); 33 message_loop->PostTask(FROM_HERE, new MessageLoop::QuitTask);
33 } 34 }
34 35
35 class DummyTask : public Task { 36 class DummyTask : public Task {
36 public: 37 public:
37 explicit DummyTask(bool* deleted) : deleted_(deleted) { } 38 explicit DummyTask(bool* deleted) : deleted_(deleted) { }
38 ~DummyTask() { 39 ~DummyTask() {
39 *deleted_ = true; 40 *deleted_ = true;
40 } 41 }
41 42
42 void Run() { 43 void Run() {
43 CHECK(false); 44 CHECK(false);
44 } 45 }
45 46
46 private: 47 private:
47 bool* deleted_; 48 bool* deleted_;
48 }; 49 };
49 50
50 class DeletedOnIO 51 class DeletedOnFile
51 : public base::RefCountedThreadSafe< 52 : public base::RefCountedThreadSafe<
52 DeletedOnIO, ChromeThread::DeleteOnIOThread> { 53 DeletedOnFile, ChromeThread::DeleteOnFileThread> {
53 public: 54 public:
54 explicit DeletedOnIO(MessageLoop* message_loop) 55 explicit DeletedOnFile(MessageLoop* message_loop)
55 : message_loop_(message_loop) { } 56 : message_loop_(message_loop) { }
56 57
57 ~DeletedOnIO() { 58 ~DeletedOnFile() {
58 CHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); 59 CHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
59 message_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask()); 60 message_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask());
60 } 61 }
61 62
62 private: 63 private:
63 MessageLoop* message_loop_; 64 MessageLoop* message_loop_;
64 }; 65 };
65 66
66 class NeverDeleted 67 class NeverDeleted
67 : public base::RefCountedThreadSafe< 68 : public base::RefCountedThreadSafe<
68 NeverDeleted, ChromeThread::DeleteOnWebKitThread> { 69 NeverDeleted, ChromeThread::DeleteOnWebKitThread> {
69 public: 70 public:
70 ~NeverDeleted() { 71 ~NeverDeleted() {
71 CHECK(false); 72 CHECK(false);
72 } 73 }
73 }; 74 };
74 75
75 private: 76 private:
77 scoped_ptr<ChromeThread> ui_thread_;
76 scoped_ptr<ChromeThread> file_thread_; 78 scoped_ptr<ChromeThread> file_thread_;
77 scoped_ptr<ChromeThread> io_thread_;
78 MessageLoop loop_; 79 MessageLoop loop_;
79 }; 80 };
80 81
81 TEST_F(ChromeThreadTest, PostTask) { 82 TEST_F(ChromeThreadTest, PostTask) {
82 ChromeThread::PostTask( 83 ChromeThread::PostTask(
83 ChromeThread::IO, FROM_HERE, 84 ChromeThread::FILE, FROM_HERE,
84 NewRunnableFunction(&BasicFunction, MessageLoop::current())); 85 NewRunnableFunction(&BasicFunction, MessageLoop::current()));
85 MessageLoop::current()->Run(); 86 MessageLoop::current()->Run();
86 } 87 }
87 88
88 TEST_F(ChromeThreadTest, Release) { 89 TEST_F(ChromeThreadTest, Release) {
89 ChromeThread::ReleaseSoon(ChromeThread::FILE, FROM_HERE, this); 90 ChromeThread::ReleaseSoon(ChromeThread::UI, FROM_HERE, this);
90 MessageLoop::current()->Run(); 91 MessageLoop::current()->Run();
91 } 92 }
92 93
93 TEST_F(ChromeThreadTest, TaskToNonExistentThreadIsDeleted) { 94 TEST_F(ChromeThreadTest, TaskToNonExistentThreadIsDeleted) {
94 bool deleted = false; 95 bool deleted = false;
95 ChromeThread::PostTask( 96 ChromeThread::PostTask(
96 ChromeThread::WEBKIT, FROM_HERE, 97 ChromeThread::WEBKIT, FROM_HERE,
97 new DummyTask(&deleted)); 98 new DummyTask(&deleted));
98 EXPECT_TRUE(deleted); 99 EXPECT_TRUE(deleted);
99 } 100 }
100 101
101 TEST_F(ChromeThreadTest, ReleasedOnCorrectThread) { 102 TEST_F(ChromeThreadTest, ReleasedOnCorrectThread) {
102 { 103 {
103 scoped_refptr<DeletedOnIO> test(new DeletedOnIO(MessageLoop::current())); 104 scoped_refptr<DeletedOnFile> test(
105 new DeletedOnFile(MessageLoop::current()));
104 } 106 }
105 MessageLoop::current()->Run(); 107 MessageLoop::current()->Run();
106 } 108 }
107 109
108 TEST_F(ChromeThreadTest, NotReleasedIfTargetThreadNonExistent) { 110 TEST_F(ChromeThreadTest, NotReleasedIfTargetThreadNonExistent) {
109 scoped_refptr<NeverDeleted> test(new NeverDeleted()); 111 scoped_refptr<NeverDeleted> test(new NeverDeleted());
110 } 112 }
113
114 TEST_F(ChromeThreadTest, PostTaskViaMessageLoopProxy) {
115 scoped_refptr<MessageLoopProxy> message_loop_proxy =
116 ChromeThread::GetMessageLoopProxyForThread(ChromeThread::FILE);
117 message_loop_proxy->PostTask(FROM_HERE,
118 NewRunnableFunction(&BasicFunction,
119 MessageLoop::current()));
120 MessageLoop::current()->Run();
121 }
122
123 TEST_F(ChromeThreadTest, ReleaseViaMessageLoopProxy) {
124 scoped_refptr<MessageLoopProxy> message_loop_proxy =
125 ChromeThread::GetMessageLoopProxyForThread(ChromeThread::UI);
126 message_loop_proxy->ReleaseSoon(FROM_HERE, this);
127 MessageLoop::current()->Run();
128 }
129
130 TEST_F(ChromeThreadTest, TaskToNonExistentThreadIsDeletedViaMessageLoopProxy) {
131 bool deleted = false;
132 scoped_refptr<MessageLoopProxy> message_loop_proxy =
133 ChromeThread::GetMessageLoopProxyForThread(ChromeThread::WEBKIT);
134 message_loop_proxy->PostTask(FROM_HERE, new DummyTask(&deleted));
135 EXPECT_TRUE(deleted);
136 }
137
138 TEST_F(ChromeThreadTest, PostTaskViaMessageLoopProxyAfterThreadExits) {
139 scoped_ptr<ChromeThread> io_thread(new ChromeThread(ChromeThread::IO));
140 io_thread->Start();
141 io_thread->Stop();
142
143 bool deleted = false;
144 scoped_refptr<MessageLoopProxy> message_loop_proxy =
145 ChromeThread::GetMessageLoopProxyForThread(ChromeThread::IO);
146 bool ret = message_loop_proxy->PostTask(FROM_HERE, new DummyTask(&deleted));
147 EXPECT_FALSE(ret);
148 EXPECT_TRUE(deleted);
149 }
150
151 TEST_F(ChromeThreadTest, PostTaskViaMessageLoopProxyAfterThreadIsDeleted) {
152 {
153 scoped_ptr<ChromeThread> io_thread(new ChromeThread(ChromeThread::IO));
154 io_thread->Start();
155 }
156 bool deleted = false;
157 scoped_refptr<MessageLoopProxy> message_loop_proxy =
158 ChromeThread::GetMessageLoopProxyForThread(ChromeThread::IO);
159 bool ret = message_loop_proxy->PostTask(FROM_HERE, new DummyTask(&deleted));
160 EXPECT_FALSE(ret);
161 EXPECT_TRUE(deleted);
162 }
163
OLDNEW
« no previous file with comments | « chrome/browser/chrome_thread.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698