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

Side by Side Diff: mojo/common/handle_watcher_unittest.cc

Issue 506353002: Make HandleWatcher watch on the same thread if the thread is running a MessagePumpMojo. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: updated unittests Created 6 years, 3 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
« no previous file with comments | « mojo/common/handle_watcher.cc ('k') | mojo/common/message_pump_mojo.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 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 "mojo/common/handle_watcher.h" 5 #include "mojo/common/handle_watcher.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/at_exit.h" 9 #include "base/at_exit.h"
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/memory/scoped_vector.h" 12 #include "base/memory/scoped_vector.h"
13 #include "base/run_loop.h" 13 #include "base/run_loop.h"
14 #include "base/test/simple_test_tick_clock.h" 14 #include "base/test/simple_test_tick_clock.h"
15 #include "base/threading/thread.h" 15 #include "base/threading/thread.h"
16 #include "mojo/common/message_pump_mojo.h"
16 #include "mojo/common/time_helper.h" 17 #include "mojo/common/time_helper.h"
17 #include "mojo/public/cpp/system/core.h" 18 #include "mojo/public/cpp/system/core.h"
18 #include "mojo/public/cpp/test_support/test_utils.h" 19 #include "mojo/public/cpp/test_support/test_utils.h"
19 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
20 21
21 namespace mojo { 22 namespace mojo {
22 namespace common { 23 namespace common {
23 namespace test { 24 namespace test {
24 25
26 enum MessageLoopConfig {
27 MESSAGE_LOOP_CONFIG_DEFAULT = 0,
28 MESSAGE_LOOP_CONFIG_MOJO = 1,
29 MESSAGE_LOOP_CONFIG_COUNT = 2
30 };
31
25 void ObserveCallback(bool* was_signaled, 32 void ObserveCallback(bool* was_signaled,
26 MojoResult* result_observed, 33 MojoResult* result_observed,
27 MojoResult result) { 34 MojoResult result) {
28 *was_signaled = true; 35 *was_signaled = true;
29 *result_observed = result; 36 *result_observed = result;
30 } 37 }
31 38
32 void RunUntilIdle() { 39 void RunUntilIdle() {
33 base::RunLoop run_loop; 40 base::RunLoop run_loop;
34 run_loop.RunUntilIdle(); 41 run_loop.RunUntilIdle();
35 } 42 }
36 43
37 void DeleteWatcherAndForwardResult( 44 void DeleteWatcherAndForwardResult(
38 HandleWatcher* watcher, 45 HandleWatcher* watcher,
39 base::Callback<void(MojoResult)> next_callback, 46 base::Callback<void(MojoResult)> next_callback,
40 MojoResult result) { 47 MojoResult result) {
41 delete watcher; 48 delete watcher;
42 next_callback.Run(result); 49 next_callback.Run(result);
43 } 50 }
44 51
52 scoped_ptr<base::MessageLoop> CreateMessageLoop(MessageLoopConfig config) {
53 scoped_ptr<base::MessageLoop> loop;
54 switch (config) {
55 case MESSAGE_LOOP_CONFIG_DEFAULT:
56 loop.reset(new base::MessageLoop());
57 break;
58 case MESSAGE_LOOP_CONFIG_MOJO:
59 loop.reset(new base::MessageLoop(MessagePumpMojo::Create()));
60 break;
61 case MESSAGE_LOOP_CONFIG_COUNT:
62 break;
sky 2014/08/28 23:12:19 NOTREACHED
yzshen1 2014/08/29 00:23:45 This 'case' is removed entirely.
63 }
64 return loop.Pass();
65 }
66
45 // Helper class to manage the callback and running the message loop waiting for 67 // Helper class to manage the callback and running the message loop waiting for
46 // message to be received. Typical usage is something like: 68 // message to be received. Typical usage is something like:
47 // Schedule callback returned from GetCallback(). 69 // Schedule callback returned from GetCallback().
48 // RunUntilGotCallback(); 70 // RunUntilGotCallback();
49 // EXPECT_TRUE(got_callback()); 71 // EXPECT_TRUE(got_callback());
50 // clear_callback(); 72 // clear_callback();
51 class CallbackHelper { 73 class CallbackHelper {
52 public: 74 public:
53 CallbackHelper() 75 CallbackHelper()
54 : got_callback_(false), 76 : got_callback_(false),
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 base::RunLoop* run_loop_; 120 base::RunLoop* run_loop_;
99 121
100 base::WeakPtrFactory<CallbackHelper> weak_factory_; 122 base::WeakPtrFactory<CallbackHelper> weak_factory_;
101 123
102 private: 124 private:
103 DISALLOW_COPY_AND_ASSIGN(CallbackHelper); 125 DISALLOW_COPY_AND_ASSIGN(CallbackHelper);
104 }; 126 };
105 127
106 class HandleWatcherTest : public testing::Test { 128 class HandleWatcherTest : public testing::Test {
107 public: 129 public:
108 HandleWatcherTest() {} 130 HandleWatcherTest() : next_message_loop_config_(MESSAGE_LOOP_CONFIG_DEFAULT) {
131 }
109 virtual ~HandleWatcherTest() { 132 virtual ~HandleWatcherTest() {
110 test::SetTickClockForTest(NULL); 133 test::SetTickClockForTest(NULL);
111 } 134 }
112 135
113 protected: 136 protected:
137 bool NextTestConfig() {
138 if (next_message_loop_config_ == MESSAGE_LOOP_CONFIG_COUNT)
139 return false;
140
141 // We have to destroy the current message loop before we create a new one.
142 message_loop_.reset();
143
144 message_loop_ = CreateMessageLoop(next_message_loop_config_);
145 next_message_loop_config_ = static_cast<MessageLoopConfig>(
146 next_message_loop_config_ + 1);
147 return true;
148 }
149
114 void InstallTickClock() { 150 void InstallTickClock() {
115 test::SetTickClockForTest(&tick_clock_); 151 test::SetTickClockForTest(&tick_clock_);
116 } 152 }
117 153
118 base::SimpleTestTickClock tick_clock_; 154 base::SimpleTestTickClock tick_clock_;
119 155
120 private: 156 private:
121 base::ShadowingAtExitManager at_exit_; 157 base::ShadowingAtExitManager at_exit_;
122 base::MessageLoop message_loop_; 158 scoped_ptr<base::MessageLoop> message_loop_;
159 MessageLoopConfig next_message_loop_config_;
123 160
124 DISALLOW_COPY_AND_ASSIGN(HandleWatcherTest); 161 DISALLOW_COPY_AND_ASSIGN(HandleWatcherTest);
125 }; 162 };
126 163
127 // Trivial test case with a single handle to watch. 164 // Trivial test case with a single handle to watch.
128 TEST_F(HandleWatcherTest, SingleHandler) { 165 TEST_F(HandleWatcherTest, SingleHandler) {
129 MessagePipe test_pipe; 166 while (NextTestConfig()) {
130 ASSERT_TRUE(test_pipe.handle0.is_valid()); 167 MessagePipe test_pipe;
131 CallbackHelper callback_helper; 168 ASSERT_TRUE(test_pipe.handle0.is_valid());
132 HandleWatcher watcher; 169 CallbackHelper callback_helper;
133 callback_helper.Start(&watcher, test_pipe.handle0.get()); 170 HandleWatcher watcher;
134 RunUntilIdle(); 171 callback_helper.Start(&watcher, test_pipe.handle0.get());
135 EXPECT_FALSE(callback_helper.got_callback()); 172 RunUntilIdle();
136 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe.handle1.get(), 173 EXPECT_FALSE(callback_helper.got_callback());
137 std::string())); 174 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe.handle1.get(),
138 callback_helper.RunUntilGotCallback(); 175 std::string()));
139 EXPECT_TRUE(callback_helper.got_callback()); 176 callback_helper.RunUntilGotCallback();
177 EXPECT_TRUE(callback_helper.got_callback());
178 }
140 } 179 }
141 180
142 // Creates three handles and notfies them in reverse order ensuring each one is 181 // Creates three handles and notfies them in reverse order ensuring each one is
143 // notified appropriately. 182 // notified appropriately.
144 TEST_F(HandleWatcherTest, ThreeHandles) { 183 TEST_F(HandleWatcherTest, ThreeHandles) {
145 MessagePipe test_pipe1; 184 while (NextTestConfig()) {
sky 2014/08/28 23:12:19 Did you look into making these parameterized tests
yzshen1 2014/08/29 00:23:45 Great suggestion!
146 MessagePipe test_pipe2; 185 MessagePipe test_pipe1;
147 MessagePipe test_pipe3; 186 MessagePipe test_pipe2;
148 CallbackHelper callback_helper1; 187 MessagePipe test_pipe3;
149 CallbackHelper callback_helper2; 188 CallbackHelper callback_helper1;
150 CallbackHelper callback_helper3; 189 CallbackHelper callback_helper2;
151 ASSERT_TRUE(test_pipe1.handle0.is_valid()); 190 CallbackHelper callback_helper3;
152 ASSERT_TRUE(test_pipe2.handle0.is_valid()); 191 ASSERT_TRUE(test_pipe1.handle0.is_valid());
153 ASSERT_TRUE(test_pipe3.handle0.is_valid()); 192 ASSERT_TRUE(test_pipe2.handle0.is_valid());
154 193 ASSERT_TRUE(test_pipe3.handle0.is_valid());
155 HandleWatcher watcher1; 194
156 callback_helper1.Start(&watcher1, test_pipe1.handle0.get()); 195 HandleWatcher watcher1;
157 RunUntilIdle(); 196 callback_helper1.Start(&watcher1, test_pipe1.handle0.get());
158 EXPECT_FALSE(callback_helper1.got_callback()); 197 RunUntilIdle();
159 EXPECT_FALSE(callback_helper2.got_callback()); 198 EXPECT_FALSE(callback_helper1.got_callback());
160 EXPECT_FALSE(callback_helper3.got_callback()); 199 EXPECT_FALSE(callback_helper2.got_callback());
161 200 EXPECT_FALSE(callback_helper3.got_callback());
162 HandleWatcher watcher2; 201
163 callback_helper2.Start(&watcher2, test_pipe2.handle0.get()); 202 HandleWatcher watcher2;
164 RunUntilIdle(); 203 callback_helper2.Start(&watcher2, test_pipe2.handle0.get());
165 EXPECT_FALSE(callback_helper1.got_callback()); 204 RunUntilIdle();
166 EXPECT_FALSE(callback_helper2.got_callback()); 205 EXPECT_FALSE(callback_helper1.got_callback());
167 EXPECT_FALSE(callback_helper3.got_callback()); 206 EXPECT_FALSE(callback_helper2.got_callback());
168 207 EXPECT_FALSE(callback_helper3.got_callback());
169 HandleWatcher watcher3; 208
170 callback_helper3.Start(&watcher3, test_pipe3.handle0.get()); 209 HandleWatcher watcher3;
171 RunUntilIdle(); 210 callback_helper3.Start(&watcher3, test_pipe3.handle0.get());
172 EXPECT_FALSE(callback_helper1.got_callback()); 211 RunUntilIdle();
173 EXPECT_FALSE(callback_helper2.got_callback()); 212 EXPECT_FALSE(callback_helper1.got_callback());
174 EXPECT_FALSE(callback_helper3.got_callback()); 213 EXPECT_FALSE(callback_helper2.got_callback());
175 214 EXPECT_FALSE(callback_helper3.got_callback());
176 // Write to 3 and make sure it's notified. 215
177 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe3.handle1.get(), 216 // Write to 3 and make sure it's notified.
178 std::string())); 217 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe3.handle1.get(),
179 callback_helper3.RunUntilGotCallback(); 218 std::string()));
180 EXPECT_FALSE(callback_helper1.got_callback()); 219 callback_helper3.RunUntilGotCallback();
181 EXPECT_FALSE(callback_helper2.got_callback()); 220 EXPECT_FALSE(callback_helper1.got_callback());
182 EXPECT_TRUE(callback_helper3.got_callback()); 221 EXPECT_FALSE(callback_helper2.got_callback());
183 callback_helper3.clear_callback(); 222 EXPECT_TRUE(callback_helper3.got_callback());
184 223 callback_helper3.clear_callback();
185 // Write to 1 and 3. Only 1 should be notified since 3 was is no longer 224
186 // running. 225 // Write to 1 and 3. Only 1 should be notified since 3 was is no longer
187 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe1.handle1.get(), 226 // running.
188 std::string())); 227 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe1.handle1.get(),
189 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe3.handle1.get(), 228 std::string()));
190 std::string())); 229 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe3.handle1.get(),
191 callback_helper1.RunUntilGotCallback(); 230 std::string()));
192 EXPECT_TRUE(callback_helper1.got_callback()); 231 callback_helper1.RunUntilGotCallback();
193 EXPECT_FALSE(callback_helper2.got_callback()); 232 EXPECT_TRUE(callback_helper1.got_callback());
194 EXPECT_FALSE(callback_helper3.got_callback()); 233 EXPECT_FALSE(callback_helper2.got_callback());
195 callback_helper1.clear_callback(); 234 EXPECT_FALSE(callback_helper3.got_callback());
196 235 callback_helper1.clear_callback();
197 // Write to 1 and 2. Only 2 should be notified (since 1 was already notified). 236
198 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe1.handle1.get(), 237 // Write to 1 and 2. Only 2 should be notified (since 1 was already
199 std::string())); 238 // notified).
200 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe2.handle1.get(), 239 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe1.handle1.get(),
201 std::string())); 240 std::string()));
202 callback_helper2.RunUntilGotCallback(); 241 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe2.handle1.get(),
203 EXPECT_FALSE(callback_helper1.got_callback()); 242 std::string()));
204 EXPECT_TRUE(callback_helper2.got_callback()); 243 callback_helper2.RunUntilGotCallback();
205 EXPECT_FALSE(callback_helper3.got_callback()); 244 EXPECT_FALSE(callback_helper1.got_callback());
245 EXPECT_TRUE(callback_helper2.got_callback());
246 EXPECT_FALSE(callback_helper3.got_callback());
247 }
206 } 248 }
207 249
208 // Verifies Start() invoked a second time works. 250 // Verifies Start() invoked a second time works.
209 TEST_F(HandleWatcherTest, Restart) { 251 TEST_F(HandleWatcherTest, Restart) {
210 MessagePipe test_pipe1; 252 while (NextTestConfig()) {
211 MessagePipe test_pipe2; 253 MessagePipe test_pipe1;
212 CallbackHelper callback_helper1; 254 MessagePipe test_pipe2;
213 CallbackHelper callback_helper2; 255 CallbackHelper callback_helper1;
214 ASSERT_TRUE(test_pipe1.handle0.is_valid()); 256 CallbackHelper callback_helper2;
215 ASSERT_TRUE(test_pipe2.handle0.is_valid()); 257 ASSERT_TRUE(test_pipe1.handle0.is_valid());
216 258 ASSERT_TRUE(test_pipe2.handle0.is_valid());
217 HandleWatcher watcher1; 259
218 callback_helper1.Start(&watcher1, test_pipe1.handle0.get()); 260 HandleWatcher watcher1;
219 RunUntilIdle(); 261 callback_helper1.Start(&watcher1, test_pipe1.handle0.get());
220 EXPECT_FALSE(callback_helper1.got_callback()); 262 RunUntilIdle();
221 EXPECT_FALSE(callback_helper2.got_callback()); 263 EXPECT_FALSE(callback_helper1.got_callback());
222 264 EXPECT_FALSE(callback_helper2.got_callback());
223 HandleWatcher watcher2; 265
224 callback_helper2.Start(&watcher2, test_pipe2.handle0.get()); 266 HandleWatcher watcher2;
225 RunUntilIdle(); 267 callback_helper2.Start(&watcher2, test_pipe2.handle0.get());
226 EXPECT_FALSE(callback_helper1.got_callback()); 268 RunUntilIdle();
227 EXPECT_FALSE(callback_helper2.got_callback()); 269 EXPECT_FALSE(callback_helper1.got_callback());
228 270 EXPECT_FALSE(callback_helper2.got_callback());
229 // Write to 1 and make sure it's notified. 271
230 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe1.handle1.get(), 272 // Write to 1 and make sure it's notified.
231 std::string())); 273 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe1.handle1.get(),
232 callback_helper1.RunUntilGotCallback(); 274 std::string()));
233 EXPECT_TRUE(callback_helper1.got_callback()); 275 callback_helper1.RunUntilGotCallback();
234 EXPECT_FALSE(callback_helper2.got_callback()); 276 EXPECT_TRUE(callback_helper1.got_callback());
235 callback_helper1.clear_callback(); 277 EXPECT_FALSE(callback_helper2.got_callback());
236 EXPECT_TRUE(mojo::test::DiscardMessage(test_pipe1.handle0.get())); 278 callback_helper1.clear_callback();
237 279 EXPECT_TRUE(mojo::test::DiscardMessage(test_pipe1.handle0.get()));
238 // Write to 2 and make sure it's notified. 280
239 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe2.handle1.get(), 281 // Write to 2 and make sure it's notified.
240 std::string())); 282 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe2.handle1.get(),
241 callback_helper2.RunUntilGotCallback(); 283 std::string()));
242 EXPECT_FALSE(callback_helper1.got_callback()); 284 callback_helper2.RunUntilGotCallback();
243 EXPECT_TRUE(callback_helper2.got_callback()); 285 EXPECT_FALSE(callback_helper1.got_callback());
244 callback_helper2.clear_callback(); 286 EXPECT_TRUE(callback_helper2.got_callback());
245 287 callback_helper2.clear_callback();
246 // Listen on 1 again. 288
247 callback_helper1.Start(&watcher1, test_pipe1.handle0.get()); 289 // Listen on 1 again.
248 RunUntilIdle(); 290 callback_helper1.Start(&watcher1, test_pipe1.handle0.get());
249 EXPECT_FALSE(callback_helper1.got_callback()); 291 RunUntilIdle();
250 EXPECT_FALSE(callback_helper2.got_callback()); 292 EXPECT_FALSE(callback_helper1.got_callback());
251 293 EXPECT_FALSE(callback_helper2.got_callback());
252 // Write to 1 and make sure it's notified. 294
253 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe1.handle1.get(), 295 // Write to 1 and make sure it's notified.
254 std::string())); 296 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe1.handle1.get(),
255 callback_helper1.RunUntilGotCallback(); 297 std::string()));
256 EXPECT_TRUE(callback_helper1.got_callback()); 298 callback_helper1.RunUntilGotCallback();
257 EXPECT_FALSE(callback_helper2.got_callback()); 299 EXPECT_TRUE(callback_helper1.got_callback());
300 EXPECT_FALSE(callback_helper2.got_callback());
301 }
258 } 302 }
259 303
260 // Verifies deadline is honored. 304 // Verifies deadline is honored.
261 TEST_F(HandleWatcherTest, Deadline) { 305 TEST_F(HandleWatcherTest, Deadline) {
262 InstallTickClock(); 306 while (NextTestConfig()) {
263 307 InstallTickClock();
264 MessagePipe test_pipe1; 308
265 MessagePipe test_pipe2; 309 MessagePipe test_pipe1;
266 MessagePipe test_pipe3; 310 MessagePipe test_pipe2;
267 CallbackHelper callback_helper1; 311 MessagePipe test_pipe3;
268 CallbackHelper callback_helper2; 312 CallbackHelper callback_helper1;
269 CallbackHelper callback_helper3; 313 CallbackHelper callback_helper2;
270 ASSERT_TRUE(test_pipe1.handle0.is_valid()); 314 CallbackHelper callback_helper3;
271 ASSERT_TRUE(test_pipe2.handle0.is_valid()); 315 ASSERT_TRUE(test_pipe1.handle0.is_valid());
272 ASSERT_TRUE(test_pipe3.handle0.is_valid()); 316 ASSERT_TRUE(test_pipe2.handle0.is_valid());
273 317 ASSERT_TRUE(test_pipe3.handle0.is_valid());
274 // Add a watcher with an infinite timeout. 318
275 HandleWatcher watcher1; 319 // Add a watcher with an infinite timeout.
276 callback_helper1.Start(&watcher1, test_pipe1.handle0.get()); 320 HandleWatcher watcher1;
277 RunUntilIdle(); 321 callback_helper1.Start(&watcher1, test_pipe1.handle0.get());
278 EXPECT_FALSE(callback_helper1.got_callback()); 322 RunUntilIdle();
279 EXPECT_FALSE(callback_helper2.got_callback()); 323 EXPECT_FALSE(callback_helper1.got_callback());
280 EXPECT_FALSE(callback_helper3.got_callback()); 324 EXPECT_FALSE(callback_helper2.got_callback());
281 325 EXPECT_FALSE(callback_helper3.got_callback());
282 // Add another watcher wth a timeout of 500 microseconds. 326
283 HandleWatcher watcher2; 327 // Add another watcher wth a timeout of 500 microseconds.
284 watcher2.Start(test_pipe2.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE, 500, 328 HandleWatcher watcher2;
285 callback_helper2.GetCallback()); 329 watcher2.Start(test_pipe2.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE, 500,
286 RunUntilIdle(); 330 callback_helper2.GetCallback());
287 EXPECT_FALSE(callback_helper1.got_callback()); 331 RunUntilIdle();
288 EXPECT_FALSE(callback_helper2.got_callback()); 332 EXPECT_FALSE(callback_helper1.got_callback());
289 EXPECT_FALSE(callback_helper3.got_callback()); 333 EXPECT_FALSE(callback_helper2.got_callback());
290 334 EXPECT_FALSE(callback_helper3.got_callback());
291 // Advance the clock passed the deadline. We also have to start another 335
292 // watcher to wake up the background thread. 336 // Advance the clock passed the deadline. We also have to start another
293 tick_clock_.Advance(base::TimeDelta::FromMicroseconds(501)); 337 // watcher to wake up the background thread.
294 338 tick_clock_.Advance(base::TimeDelta::FromMicroseconds(501));
295 HandleWatcher watcher3; 339
296 callback_helper3.Start(&watcher3, test_pipe3.handle0.get()); 340 HandleWatcher watcher3;
297 341 callback_helper3.Start(&watcher3, test_pipe3.handle0.get());
298 callback_helper2.RunUntilGotCallback(); 342
299 EXPECT_FALSE(callback_helper1.got_callback()); 343 callback_helper2.RunUntilGotCallback();
300 EXPECT_TRUE(callback_helper2.got_callback()); 344 EXPECT_FALSE(callback_helper1.got_callback());
301 EXPECT_FALSE(callback_helper3.got_callback()); 345 EXPECT_TRUE(callback_helper2.got_callback());
346 EXPECT_FALSE(callback_helper3.got_callback());
347 }
302 } 348 }
303 349
304 TEST_F(HandleWatcherTest, DeleteInCallback) { 350 TEST_F(HandleWatcherTest, DeleteInCallback) {
305 MessagePipe test_pipe; 351 while (NextTestConfig()) {
306 CallbackHelper callback_helper; 352 MessagePipe test_pipe;
307 353 CallbackHelper callback_helper;
308 HandleWatcher* watcher = new HandleWatcher(); 354
309 callback_helper.StartWithCallback(watcher, test_pipe.handle1.get(), 355 HandleWatcher* watcher = new HandleWatcher();
310 base::Bind(&DeleteWatcherAndForwardResult, 356 callback_helper.StartWithCallback(
311 watcher, 357 watcher, test_pipe.handle1.get(),
312 callback_helper.GetCallback())); 358 base::Bind(&DeleteWatcherAndForwardResult, watcher,
313 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe.handle0.get(), 359 callback_helper.GetCallback()));
314 std::string())); 360 EXPECT_TRUE(mojo::test::WriteTextMessage(test_pipe.handle0.get(),
315 callback_helper.RunUntilGotCallback(); 361 std::string()));
316 EXPECT_TRUE(callback_helper.got_callback()); 362 callback_helper.RunUntilGotCallback();
363 EXPECT_TRUE(callback_helper.got_callback());
364 }
317 } 365 }
318 366
319 TEST(HandleWatcherCleanEnvironmentTest, AbortedOnMessageLoopDestruction) { 367 TEST(HandleWatcherCleanEnvironmentTest, AbortedOnMessageLoopDestruction) {
320 bool was_signaled = false; 368 for (int i = 0; i < MESSAGE_LOOP_CONFIG_COUNT; ++i) {
321 MojoResult result = MOJO_RESULT_OK; 369 bool was_signaled = false;
322 370 MojoResult result = MOJO_RESULT_OK;
323 base::ShadowingAtExitManager at_exit; 371
324 MessagePipe pipe; 372 base::ShadowingAtExitManager at_exit;
325 HandleWatcher watcher; 373 MessagePipe pipe;
326 { 374 HandleWatcher watcher;
327 base::MessageLoop loop; 375 {
328 376 scoped_ptr<base::MessageLoop> loop(
329 watcher.Start(pipe.handle0.get(), 377 CreateMessageLoop(static_cast<MessageLoopConfig>(i)));
330 MOJO_HANDLE_SIGNAL_READABLE, 378
331 MOJO_DEADLINE_INDEFINITE, 379 watcher.Start(pipe.handle0.get(),
332 base::Bind(&ObserveCallback, &was_signaled, &result)); 380 MOJO_HANDLE_SIGNAL_READABLE,
333 381 MOJO_DEADLINE_INDEFINITE,
334 // Now, let the MessageLoop get torn down. We expect our callback to run. 382 base::Bind(&ObserveCallback, &was_signaled, &result));
335 } 383
336 384 // Now, let the MessageLoop get torn down. We expect our callback to run.
337 EXPECT_TRUE(was_signaled); 385 }
338 EXPECT_EQ(MOJO_RESULT_ABORTED, result); 386
387 EXPECT_TRUE(was_signaled);
388 EXPECT_EQ(MOJO_RESULT_ABORTED, result);
389 }
339 } 390 }
340 391
341 void NeverReached(MojoResult result) { 392 void NeverReached(MojoResult result) {
342 FAIL() << "Callback should never be invoked " << result; 393 FAIL() << "Callback should never be invoked " << result;
343 } 394 }
344 395
345 // Called on the main thread when a thread is done. Decrements |active_count| 396 // Called on the main thread when a thread is done. Decrements |active_count|
346 // and if |active_count| is zero quits |run_loop|. 397 // and if |active_count| is zero quits |run_loop|.
347 void StressThreadDone(base::RunLoop* run_loop, int* active_count) { 398 void StressThreadDone(base::RunLoop* run_loop, int* active_count) {
348 (*active_count)--; 399 (*active_count)--;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 467
417 base::ShadowingAtExitManager at_exit; 468 base::ShadowingAtExitManager at_exit;
418 base::MessageLoop message_loop; 469 base::MessageLoop message_loop;
419 base::RunLoop run_loop; 470 base::RunLoop run_loop;
420 ScopedVector<base::Thread> threads; 471 ScopedVector<base::Thread> threads;
421 int threads_active_counter = kThreadCount; 472 int threads_active_counter = kThreadCount;
422 // Starts the threads first and then post the task in hopes of having more 473 // Starts the threads first and then post the task in hopes of having more
423 // threads running at once. 474 // threads running at once.
424 for (int i = 0; i < kThreadCount; ++i) { 475 for (int i = 0; i < kThreadCount; ++i) {
425 scoped_ptr<base::Thread> thread(new base::Thread("test thread")); 476 scoped_ptr<base::Thread> thread(new base::Thread("test thread"));
426 thread->Start(); 477 if (i % 2) {
478 base::Thread::Options thread_options;
479 thread_options.message_pump_factory =
480 base::Bind(&MessagePumpMojo::Create);
481 thread->StartWithOptions(thread_options);
482 } else {
483 thread->Start();
484 }
427 threads.push_back(thread.release()); 485 threads.push_back(thread.release());
428 } 486 }
429 for (int i = 0; i < kThreadCount; ++i) { 487 for (int i = 0; i < kThreadCount; ++i) {
430 threads[i]->task_runner()->PostTask( 488 threads[i]->task_runner()->PostTask(
431 FROM_HERE, base::Bind(&RunStressTest, kWatchCount, 489 FROM_HERE, base::Bind(&RunStressTest, kWatchCount,
432 message_loop.task_runner(), 490 message_loop.task_runner(),
433 &run_loop, &threads_active_counter)); 491 &run_loop, &threads_active_counter));
434 } 492 }
435 run_loop.Run(); 493 run_loop.Run();
436 ASSERT_EQ(0, threads_active_counter); 494 ASSERT_EQ(0, threads_active_counter);
437 } 495 }
438 496
439 } // namespace test 497 } // namespace test
440 } // namespace common 498 } // namespace common
441 } // namespace mojo 499 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/common/handle_watcher.cc ('k') | mojo/common/message_pump_mojo.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698