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

Side by Side Diff: mojo/edk/system/wait_set_dispatcher_unittest.cc

Issue 1748503002: [mojo-edk] Add MojoWatch and MojoCancelWatch APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 9 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/edk/system/wait_set_dispatcher.h" 5 #include "mojo/edk/system/wait_set_dispatcher.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 15 matching lines...) Expand all
26 class WaitSetDispatcherTest : public ::testing::Test { 26 class WaitSetDispatcherTest : public ::testing::Test {
27 public: 27 public:
28 WaitSetDispatcherTest() {} 28 WaitSetDispatcherTest() {}
29 ~WaitSetDispatcherTest() override {} 29 ~WaitSetDispatcherTest() override {}
30 30
31 void SetUp() override { 31 void SetUp() override {
32 CreateMessagePipe(&dispatcher0_, &dispatcher1_); 32 CreateMessagePipe(&dispatcher0_, &dispatcher1_);
33 } 33 }
34 34
35 void TearDown() override { 35 void TearDown() override {
36 Dispatcher::RequestContext request_context;
36 for (auto& d : dispatchers_to_close_) 37 for (auto& d : dispatchers_to_close_)
37 d->Close(); 38 d->Close(&request_context);
38 } 39 }
39 40
40 MojoResult GetOneReadyDispatcher( 41 MojoResult GetOneReadyDispatcher(
41 const scoped_refptr<WaitSetDispatcher>& wait_set, 42 const scoped_refptr<WaitSetDispatcher>& wait_set,
42 scoped_refptr<Dispatcher>* ready_dispatcher, 43 scoped_refptr<Dispatcher>* ready_dispatcher,
43 uintptr_t* context) { 44 uintptr_t* context) {
44 uint32_t count = 1; 45 uint32_t count = 1;
45 MojoResult dispatcher_result = MOJO_RESULT_UNKNOWN; 46 MojoResult dispatcher_result = MOJO_RESULT_UNKNOWN;
46 DispatcherVector dispatchers; 47 DispatcherVector dispatchers;
47 MojoResult result = wait_set->GetReadyDispatchers( 48 MojoResult result = wait_set->GetReadyDispatchers(
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 TEST_F(WaitSetDispatcherTest, Basic) { 92 TEST_F(WaitSetDispatcherTest, Basic) {
92 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); 93 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher();
93 CloseOnShutdown(wait_set); 94 CloseOnShutdown(wait_set);
94 ASSERT_EQ(MOJO_RESULT_OK, 95 ASSERT_EQ(MOJO_RESULT_OK,
95 wait_set->AddWaitingDispatcher(dispatcher0_, 96 wait_set->AddWaitingDispatcher(dispatcher0_,
96 MOJO_HANDLE_SIGNAL_READABLE, 1)); 97 MOJO_HANDLE_SIGNAL_READABLE, 1));
97 ASSERT_EQ(MOJO_RESULT_OK, 98 ASSERT_EQ(MOJO_RESULT_OK,
98 wait_set->AddWaitingDispatcher(dispatcher1_, 99 wait_set->AddWaitingDispatcher(dispatcher1_,
99 MOJO_HANDLE_SIGNAL_WRITABLE, 2)); 100 MOJO_HANDLE_SIGNAL_WRITABLE, 2));
100 101
102 Dispatcher::RequestContext request_context;
101 Waiter w; 103 Waiter w;
102 uintptr_t context = 0; 104 uintptr_t context = 0;
103 w.Init(); 105 w.Init();
104 HandleSignalsState hss; 106 HandleSignalsState hss;
105 // |dispatcher1_| should already be writable. 107 // |dispatcher1_| should already be writable.
106 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 108 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
107 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); 109 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
108 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 110 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
109 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 111 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
110 112
(...skipping 20 matching lines...) Expand all
131 EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); 133 EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE));
132 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); 134 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr));
133 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 135 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
134 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); 136 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr));
135 137
136 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. 138 // Write to |dispatcher1_|, which should make |dispatcher0_| readable.
137 char buffer[] = "abcd"; 139 char buffer[] = "abcd";
138 w.Init(); 140 w.Init();
139 ASSERT_EQ(MOJO_RESULT_OK, 141 ASSERT_EQ(MOJO_RESULT_OK,
140 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0, 142 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0,
141 MOJO_WRITE_MESSAGE_FLAG_NONE)); 143 MOJO_WRITE_MESSAGE_FLAG_NONE,
144 &request_context));
142 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); 145 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr));
143 woken_dispatcher = nullptr; 146 woken_dispatcher = nullptr;
144 context = 0; 147 context = 0;
145 EXPECT_EQ(MOJO_RESULT_OK, 148 EXPECT_EQ(MOJO_RESULT_OK,
146 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); 149 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context));
147 EXPECT_EQ(dispatcher0_, woken_dispatcher); 150 EXPECT_EQ(dispatcher0_, woken_dispatcher);
148 EXPECT_EQ(1u, context); 151 EXPECT_EQ(1u, context);
149 152
150 // Again, if a ready dispatcher isn't removed, it will continue to be 153 // Again, if a ready dispatcher isn't removed, it will continue to be
151 // returned. 154 // returned.
152 woken_dispatcher = nullptr; 155 woken_dispatcher = nullptr;
153 EXPECT_EQ(MOJO_RESULT_OK, 156 EXPECT_EQ(MOJO_RESULT_OK,
154 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); 157 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr));
155 EXPECT_EQ(dispatcher0_, woken_dispatcher); 158 EXPECT_EQ(dispatcher0_, woken_dispatcher);
156 159
157 wait_set->RemoveAwakable(&w, nullptr); 160 wait_set->RemoveAwakable(&w, nullptr);
158 } 161 }
159 162
160 TEST_F(WaitSetDispatcherTest, HandleWithoutRemoving) { 163 TEST_F(WaitSetDispatcherTest, HandleWithoutRemoving) {
161 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); 164 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher();
162 CloseOnShutdown(wait_set); 165 CloseOnShutdown(wait_set);
163 ASSERT_EQ(MOJO_RESULT_OK, 166 ASSERT_EQ(MOJO_RESULT_OK,
164 wait_set->AddWaitingDispatcher(dispatcher0_, 167 wait_set->AddWaitingDispatcher(dispatcher0_,
165 MOJO_HANDLE_SIGNAL_READABLE, 1)); 168 MOJO_HANDLE_SIGNAL_READABLE, 1));
166 169
170 Dispatcher::RequestContext request_context;
167 Waiter w; 171 Waiter w;
168 uintptr_t context = 0; 172 uintptr_t context = 0;
169 w.Init(); 173 w.Init();
170 HandleSignalsState hss; 174 HandleSignalsState hss;
171 // No ready dispatcher. 175 // No ready dispatcher.
172 hss = HandleSignalsState(); 176 hss = HandleSignalsState();
173 EXPECT_EQ(MOJO_RESULT_OK, 177 EXPECT_EQ(MOJO_RESULT_OK,
174 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); 178 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
175 EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); 179 EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE));
176 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); 180 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr));
177 scoped_refptr<Dispatcher> woken_dispatcher; 181 scoped_refptr<Dispatcher> woken_dispatcher;
178 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 182 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
179 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); 183 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr));
180 184
181 // The tested behaviour below should be repeatable. 185 // The tested behaviour below should be repeatable.
182 for (size_t i = 0; i < 3; i++) { 186 for (size_t i = 0; i < 3; i++) {
183 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. 187 // Write to |dispatcher1_|, which should make |dispatcher0_| readable.
184 char buffer[] = "abcd"; 188 char buffer[] = "abcd";
185 w.Init(); 189 w.Init();
186 ASSERT_EQ(MOJO_RESULT_OK, 190 ASSERT_EQ(MOJO_RESULT_OK,
187 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0, 191 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0,
188 MOJO_WRITE_MESSAGE_FLAG_NONE)); 192 MOJO_WRITE_MESSAGE_FLAG_NONE,
193 &request_context));
189 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); 194 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr));
190 woken_dispatcher = nullptr; 195 woken_dispatcher = nullptr;
191 context = 0; 196 context = 0;
192 EXPECT_EQ(MOJO_RESULT_OK, 197 EXPECT_EQ(MOJO_RESULT_OK,
193 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); 198 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context));
194 EXPECT_EQ(dispatcher0_, woken_dispatcher); 199 EXPECT_EQ(dispatcher0_, woken_dispatcher);
195 EXPECT_EQ(1u, context); 200 EXPECT_EQ(1u, context);
196 201
197 // Read from |dispatcher0_| which should change it's state to non-readable. 202 // Read from |dispatcher0_| which should change it's state to non-readable.
198 char read_buffer[sizeof(buffer) + 5]; 203 char read_buffer[sizeof(buffer) + 5];
199 uint32_t num_bytes = sizeof(read_buffer); 204 uint32_t num_bytes = sizeof(read_buffer);
200 ASSERT_EQ(MOJO_RESULT_OK, 205 ASSERT_EQ(MOJO_RESULT_OK,
201 dispatcher0_->ReadMessage(read_buffer, &num_bytes, nullptr, 206 dispatcher0_->ReadMessage(read_buffer, &num_bytes, nullptr,
202 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); 207 nullptr, MOJO_READ_MESSAGE_FLAG_NONE,
208 &request_context));
203 EXPECT_EQ(sizeof(buffer), num_bytes); 209 EXPECT_EQ(sizeof(buffer), num_bytes);
204 210
205 // No dispatchers are ready. 211 // No dispatchers are ready.
206 w.Init(); 212 w.Init();
207 woken_dispatcher = nullptr; 213 woken_dispatcher = nullptr;
208 context = 0; 214 context = 0;
209 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 215 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
210 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); 216 GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context));
211 EXPECT_EQ(nullptr, woken_dispatcher); 217 EXPECT_EQ(nullptr, woken_dispatcher);
212 EXPECT_EQ(0u, context); 218 EXPECT_EQ(0u, context);
(...skipping 17 matching lines...) Expand all
230 ASSERT_EQ(MOJO_RESULT_OK, 236 ASSERT_EQ(MOJO_RESULT_OK,
231 wait_set->AddWaitingDispatcher(dispatcher1_, 237 wait_set->AddWaitingDispatcher(dispatcher1_,
232 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); 238 MOJO_HANDLE_SIGNAL_WRITABLE, 0));
233 ASSERT_EQ(MOJO_RESULT_OK, 239 ASSERT_EQ(MOJO_RESULT_OK,
234 wait_set->AddWaitingDispatcher(mp1_dispatcher0, 240 wait_set->AddWaitingDispatcher(mp1_dispatcher0,
235 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); 241 MOJO_HANDLE_SIGNAL_WRITABLE, 0));
236 ASSERT_EQ(MOJO_RESULT_OK, 242 ASSERT_EQ(MOJO_RESULT_OK,
237 wait_set->AddWaitingDispatcher(mp1_dispatcher1, 243 wait_set->AddWaitingDispatcher(mp1_dispatcher1,
238 MOJO_HANDLE_SIGNAL_WRITABLE, 0)); 244 MOJO_HANDLE_SIGNAL_WRITABLE, 0));
239 245
246 Dispatcher::RequestContext request_context;
240 Waiter w; 247 Waiter w;
241 w.Init(); 248 w.Init();
242 HandleSignalsState hss; 249 HandleSignalsState hss;
243 // The three writable dispatchers should be ready. 250 // The three writable dispatchers should be ready.
244 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 251 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
245 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); 252 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
246 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 253 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
247 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 254 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
248 255
249 scoped_refptr<Dispatcher> woken_dispatcher; 256 scoped_refptr<Dispatcher> woken_dispatcher;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 nullptr)); 312 nullptr));
306 EXPECT_EQ(2u, count); 313 EXPECT_EQ(2u, count);
307 std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); 314 std::sort(dispatchers_vector.begin(), dispatchers_vector.end());
308 EXPECT_EQ(expected_dispatchers, dispatchers_vector); 315 EXPECT_EQ(expected_dispatchers, dispatchers_vector);
309 316
310 // Write to |dispatcher1_|, which should make |dispatcher0_| readable. 317 // Write to |dispatcher1_|, which should make |dispatcher0_| readable.
311 char buffer[] = "abcd"; 318 char buffer[] = "abcd";
312 w.Init(); 319 w.Init();
313 ASSERT_EQ(MOJO_RESULT_OK, 320 ASSERT_EQ(MOJO_RESULT_OK,
314 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0, 321 dispatcher1_->WriteMessage(buffer, sizeof(buffer), nullptr, 0,
315 MOJO_WRITE_MESSAGE_FLAG_NONE)); 322 MOJO_WRITE_MESSAGE_FLAG_NONE,
323 &request_context));
316 { 324 {
317 Waiter mp_w; 325 Waiter mp_w;
318 mp_w.Init(); 326 mp_w.Init();
319 // Wait for |dispatcher0_| to be readable. 327 // Wait for |dispatcher0_| to be readable.
320 if (dispatcher0_->AddAwakable(&mp_w, MOJO_HANDLE_SIGNAL_READABLE, 0, 328 if (dispatcher0_->AddAwakable(&mp_w, MOJO_HANDLE_SIGNAL_READABLE, 0,
321 nullptr) == MOJO_RESULT_OK) { 329 nullptr) == MOJO_RESULT_OK) {
322 EXPECT_EQ(MOJO_RESULT_OK, mp_w.Wait(MOJO_DEADLINE_INDEFINITE, 0)); 330 EXPECT_EQ(MOJO_RESULT_OK, mp_w.Wait(MOJO_DEADLINE_INDEFINITE, 0));
323 dispatcher0_->RemoveAwakable(&mp_w, nullptr); 331 dispatcher0_->RemoveAwakable(&mp_w, nullptr);
324 } 332 }
325 } 333 }
(...skipping 29 matching lines...) Expand all
355 MOJO_HANDLE_SIGNAL_READABLE, 0)); 363 MOJO_HANDLE_SIGNAL_READABLE, 0));
356 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 364 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
357 wait_set->AddWaitingDispatcher(dispatcher0_, 365 wait_set->AddWaitingDispatcher(dispatcher0_,
358 MOJO_HANDLE_SIGNAL_READABLE, 0)); 366 MOJO_HANDLE_SIGNAL_READABLE, 0));
359 367
360 // Remove a dispatcher that wasn't added. 368 // Remove a dispatcher that wasn't added.
361 EXPECT_EQ(MOJO_RESULT_NOT_FOUND, 369 EXPECT_EQ(MOJO_RESULT_NOT_FOUND,
362 wait_set->RemoveWaitingDispatcher(dispatcher1_)); 370 wait_set->RemoveWaitingDispatcher(dispatcher1_));
363 371
364 // Add to a closed wait set. 372 // Add to a closed wait set.
365 wait_set->Close(); 373 Dispatcher::RequestContext request_context;
374 wait_set->Close(&request_context);
366 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 375 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
367 wait_set->AddWaitingDispatcher(dispatcher0_, 376 wait_set->AddWaitingDispatcher(dispatcher0_,
368 MOJO_HANDLE_SIGNAL_READABLE, 0)); 377 MOJO_HANDLE_SIGNAL_READABLE, 0));
369 } 378 }
370 379
371 TEST_F(WaitSetDispatcherTest, NotSatisfiable) { 380 TEST_F(WaitSetDispatcherTest, NotSatisfiable) {
372 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); 381 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher();
373 CloseOnShutdown(wait_set); 382 CloseOnShutdown(wait_set);
374 383
375 // Wait sets can only satisfy MOJO_HANDLE_SIGNAL_READABLE. 384 // Wait sets can only satisfy MOJO_HANDLE_SIGNAL_READABLE.
376 Waiter w; 385 Waiter w;
377 w.Init(); 386 w.Init();
378 HandleSignalsState hss; 387 HandleSignalsState hss;
379 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 388 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
380 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); 389 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss));
381 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals); 390 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals);
382 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 391 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
383 392
384 hss = HandleSignalsState(); 393 hss = HandleSignalsState();
385 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 394 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
386 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 0, &hss)); 395 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 0, &hss));
387 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals); 396 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals);
388 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 397 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
389 } 398 }
390 399
391 TEST_F(WaitSetDispatcherTest, ClosedDispatchers) { 400 TEST_F(WaitSetDispatcherTest, ClosedDispatchers) {
392 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); 401 scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher();
393 CloseOnShutdown(wait_set); 402 CloseOnShutdown(wait_set);
394 403
404 Dispatcher::RequestContext request_context;
395 Waiter w; 405 Waiter w;
396 w.Init(); 406 w.Init();
397 HandleSignalsState hss; 407 HandleSignalsState hss;
398 // A dispatcher that was added and then closed will be cancelled. 408 // A dispatcher that was added and then closed will be cancelled.
399 ASSERT_EQ(MOJO_RESULT_OK, 409 ASSERT_EQ(MOJO_RESULT_OK,
400 wait_set->AddWaitingDispatcher(dispatcher0_, 410 wait_set->AddWaitingDispatcher(dispatcher0_,
401 MOJO_HANDLE_SIGNAL_READABLE, 0)); 411 MOJO_HANDLE_SIGNAL_READABLE, 0));
402 EXPECT_EQ(MOJO_RESULT_OK, 412 EXPECT_EQ(MOJO_RESULT_OK,
403 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); 413 wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
404 dispatcher0_->Close(); 414 dispatcher0_->Close(&request_context);
405 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); 415 EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr));
406 EXPECT_TRUE( 416 EXPECT_TRUE(
407 wait_set->GetHandleSignalsState().satisfies(MOJO_HANDLE_SIGNAL_READABLE)); 417 wait_set->GetHandleSignalsState().satisfies(MOJO_HANDLE_SIGNAL_READABLE));
408 scoped_refptr<Dispatcher> woken_dispatcher; 418 scoped_refptr<Dispatcher> woken_dispatcher;
409 EXPECT_EQ(MOJO_RESULT_CANCELLED, 419 EXPECT_EQ(MOJO_RESULT_CANCELLED,
410 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); 420 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr));
411 EXPECT_EQ(dispatcher0_, woken_dispatcher); 421 EXPECT_EQ(dispatcher0_, woken_dispatcher);
412 422
413 // Dispatcher will be implicitly removed because it may be impossible to 423 // Dispatcher will be implicitly removed because it may be impossible to
414 // remove explicitly. 424 // remove explicitly.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 EXPECT_EQ(MOJO_RESULT_OK, 468 EXPECT_EQ(MOJO_RESULT_OK,
459 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); 469 GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr));
460 EXPECT_EQ(nested_wait_set, woken_dispatcher); 470 EXPECT_EQ(nested_wait_set, woken_dispatcher);
461 471
462 wait_set->RemoveAwakable(&w, nullptr); 472 wait_set->RemoveAwakable(&w, nullptr);
463 } 473 }
464 474
465 } // namespace 475 } // namespace
466 } // namespace edk 476 } // namespace edk
467 } // namespace mojo 477 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698