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

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

Issue 741503003: Adding MOJO_HANDLE_SIGNAL_PEER_CLOSED to be notified when a peer is closed. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Fix go formatting Created 6 years 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/edk/system/multiprocess_message_pipe_unittest.cc ('k') | mojo/public/c/system/types.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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 <stdint.h> 5 #include <stdint.h>
6 #include <stdio.h> 6 #include <stdio.h>
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 23 matching lines...) Expand all
34 #include "mojo/edk/system/shared_buffer_dispatcher.h" 34 #include "mojo/edk/system/shared_buffer_dispatcher.h"
35 #include "mojo/edk/system/test_utils.h" 35 #include "mojo/edk/system/test_utils.h"
36 #include "mojo/edk/system/waiter.h" 36 #include "mojo/edk/system/waiter.h"
37 #include "mojo/edk/test/test_utils.h" 37 #include "mojo/edk/test/test_utils.h"
38 #include "testing/gtest/include/gtest/gtest.h" 38 #include "testing/gtest/include/gtest/gtest.h"
39 39
40 namespace mojo { 40 namespace mojo {
41 namespace system { 41 namespace system {
42 namespace { 42 namespace {
43 43
44 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE |
45 MOJO_HANDLE_SIGNAL_WRITABLE |
46 MOJO_HANDLE_SIGNAL_PEER_CLOSED;
47
44 class RemoteMessagePipeTest : public testing::Test { 48 class RemoteMessagePipeTest : public testing::Test {
45 public: 49 public:
46 RemoteMessagePipeTest() : io_thread_(base::TestIOThread::kAutoStart) {} 50 RemoteMessagePipeTest() : io_thread_(base::TestIOThread::kAutoStart) {}
47 ~RemoteMessagePipeTest() override {} 51 ~RemoteMessagePipeTest() override {}
48 52
49 void SetUp() override { 53 void SetUp() override {
50 io_thread_.PostTaskAndWait( 54 io_thread_.PostTaskAndWait(
51 FROM_HERE, base::Bind(&RemoteMessagePipeTest::SetUpOnIOThread, 55 FROM_HERE, base::Bind(&RemoteMessagePipeTest::SetUpOnIOThread,
52 base::Unretained(this))); 56 base::Unretained(this)));
53 } 57 }
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), 201 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello),
198 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 202 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
199 203
200 // Wait. 204 // Wait.
201 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 205 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
202 EXPECT_EQ(123u, context); 206 EXPECT_EQ(123u, context);
203 hss = HandleSignalsState(); 207 hss = HandleSignalsState();
204 mp1->RemoveWaiter(1, &waiter, &hss); 208 mp1->RemoveWaiter(1, &waiter, &hss);
205 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 209 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
206 hss.satisfied_signals); 210 hss.satisfied_signals);
207 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 211 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
208 hss.satisfiable_signals);
209 212
210 // Read from MP 1, port 1. 213 // Read from MP 1, port 1.
211 EXPECT_EQ(MOJO_RESULT_OK, 214 EXPECT_EQ(MOJO_RESULT_OK,
212 mp1->ReadMessage(1, UserPointer<void>(buffer), 215 mp1->ReadMessage(1, UserPointer<void>(buffer),
213 MakeUserPointer(&buffer_size), nullptr, nullptr, 216 MakeUserPointer(&buffer_size), nullptr, nullptr,
214 MOJO_READ_MESSAGE_FLAG_NONE)); 217 MOJO_READ_MESSAGE_FLAG_NONE));
215 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); 218 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size));
216 EXPECT_STREQ(kHello, buffer); 219 EXPECT_STREQ(kHello, buffer);
217 220
218 // Write in the other direction: MP 1, port 1 -> ... -> MP 0, port 0. 221 // Write in the other direction: MP 1, port 1 -> ... -> MP 0, port 0.
219 222
220 waiter.Init(); 223 waiter.Init();
221 ASSERT_EQ( 224 ASSERT_EQ(
222 MOJO_RESULT_OK, 225 MOJO_RESULT_OK,
223 mp0->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, nullptr)); 226 mp0->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, nullptr));
224 227
225 EXPECT_EQ( 228 EXPECT_EQ(
226 MOJO_RESULT_OK, 229 MOJO_RESULT_OK,
227 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), 230 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld),
228 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 231 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
229 232
230 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 233 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
231 EXPECT_EQ(456u, context); 234 EXPECT_EQ(456u, context);
232 hss = HandleSignalsState(); 235 hss = HandleSignalsState();
233 mp0->RemoveWaiter(0, &waiter, &hss); 236 mp0->RemoveWaiter(0, &waiter, &hss);
234 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 237 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
235 hss.satisfied_signals); 238 hss.satisfied_signals);
236 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 239 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
237 hss.satisfiable_signals);
238 240
239 buffer_size = static_cast<uint32_t>(sizeof(buffer)); 241 buffer_size = static_cast<uint32_t>(sizeof(buffer));
240 EXPECT_EQ(MOJO_RESULT_OK, 242 EXPECT_EQ(MOJO_RESULT_OK,
241 mp0->ReadMessage(0, UserPointer<void>(buffer), 243 mp0->ReadMessage(0, UserPointer<void>(buffer),
242 MakeUserPointer(&buffer_size), nullptr, nullptr, 244 MakeUserPointer(&buffer_size), nullptr, nullptr,
243 MOJO_READ_MESSAGE_FLAG_NONE)); 245 MOJO_READ_MESSAGE_FLAG_NONE));
244 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(buffer_size)); 246 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(buffer_size));
245 EXPECT_STREQ(kWorld, buffer); 247 EXPECT_STREQ(kWorld, buffer);
246 248
247 // Close MP 0, port 0. 249 // Close MP 0, port 0.
248 mp0->Close(0); 250 mp0->Close(0);
249 251
250 // Try to wait for MP 1, port 1 to become readable. This will eventually fail 252 // Try to wait for MP 1, port 1 to become readable. This will eventually fail
251 // when it realizes that MP 0, port 0 has been closed. (It may also fail 253 // when it realizes that MP 0, port 0 has been closed. (It may also fail
252 // immediately.) 254 // immediately.)
253 waiter.Init(); 255 waiter.Init();
254 hss = HandleSignalsState(); 256 hss = HandleSignalsState();
255 MojoResult result = 257 MojoResult result =
256 mp1->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, &hss); 258 mp1->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, &hss);
257 if (result == MOJO_RESULT_OK) { 259 if (result == MOJO_RESULT_OK) {
258 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 260 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
259 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 261 waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
260 EXPECT_EQ(789u, context); 262 EXPECT_EQ(789u, context);
261 hss = HandleSignalsState(); 263 hss = HandleSignalsState();
262 mp1->RemoveWaiter(1, &waiter, &hss); 264 mp1->RemoveWaiter(1, &waiter, &hss);
263 } 265 }
264 EXPECT_EQ(0u, hss.satisfied_signals); 266 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
265 EXPECT_EQ(0u, hss.satisfiable_signals); 267 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
266 268
267 // And MP 1, port 1. 269 // And MP 1, port 1.
268 mp1->Close(1); 270 mp1->Close(1);
271 }
272
273 TEST_F(RemoteMessagePipeTest, PeerClosed) {
274 Waiter waiter;
275 HandleSignalsState hss;
276 uint32_t context = 0;
277
278 // Connect message pipes. MP 0, port 1 will be attached to channel 0 and
279 // connected to MP 1, port 0, which will be attached to channel 1. This leaves
280 // MP 0, port 0 and MP 1, port 1 as the "user-facing" endpoints.
281
282 scoped_refptr<ChannelEndpoint> ep0;
283 scoped_refptr<MessagePipe> mp0(MessagePipe::CreateLocalProxy(&ep0));
284 scoped_refptr<ChannelEndpoint> ep1;
285 scoped_refptr<MessagePipe> mp1(MessagePipe::CreateProxyLocal(&ep1));
286 BootstrapChannelEndpoints(ep0, ep1);
287
288 // Close MP 0, port 0.
289 mp0->Close(0);
290
291 // Try to wait for MP 1, port 1 to be signaled with peer closed.
292 waiter.Init();
293 hss = HandleSignalsState();
294 MojoResult result =
295 mp1->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 101, &hss);
296 if (result == MOJO_RESULT_OK) {
297 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
298 EXPECT_EQ(101u, context);
299 hss = HandleSignalsState();
300 mp1->RemoveWaiter(1, &waiter, &hss);
301 }
302 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
303 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
304
305 // And MP 1, port 1.
306 mp1->Close(1);
269 } 307 }
270 308
271 TEST_F(RemoteMessagePipeTest, Multiplex) { 309 TEST_F(RemoteMessagePipeTest, Multiplex) {
272 static const char kHello[] = "hello"; 310 static const char kHello[] = "hello";
273 static const char kWorld[] = "world!!!1!!!1!"; 311 static const char kWorld[] = "world!!!1!!!1!";
274 char buffer[100] = {0}; 312 char buffer[100] = {0};
275 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); 313 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
276 Waiter waiter; 314 Waiter waiter;
277 HandleSignalsState hss; 315 HandleSignalsState hss;
278 uint32_t context = 0; 316 uint32_t context = 0;
(...skipping 28 matching lines...) Expand all
307 mp0->WriteMessage(0, UserPointer<const void>(&remote_id), 345 mp0->WriteMessage(0, UserPointer<const void>(&remote_id),
308 sizeof(remote_id), nullptr, 346 sizeof(remote_id), nullptr,
309 MOJO_WRITE_MESSAGE_FLAG_NONE)); 347 MOJO_WRITE_MESSAGE_FLAG_NONE));
310 348
311 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 349 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
312 EXPECT_EQ(123u, context); 350 EXPECT_EQ(123u, context);
313 hss = HandleSignalsState(); 351 hss = HandleSignalsState();
314 mp1->RemoveWaiter(1, &waiter, &hss); 352 mp1->RemoveWaiter(1, &waiter, &hss);
315 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 353 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
316 hss.satisfied_signals); 354 hss.satisfied_signals);
317 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 355 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
318 hss.satisfiable_signals);
319 356
320 ChannelEndpointId received_id; 357 ChannelEndpointId received_id;
321 buffer_size = static_cast<uint32_t>(sizeof(received_id)); 358 buffer_size = static_cast<uint32_t>(sizeof(received_id));
322 EXPECT_EQ(MOJO_RESULT_OK, 359 EXPECT_EQ(MOJO_RESULT_OK,
323 mp1->ReadMessage(1, UserPointer<void>(&received_id), 360 mp1->ReadMessage(1, UserPointer<void>(&received_id),
324 MakeUserPointer(&buffer_size), nullptr, nullptr, 361 MakeUserPointer(&buffer_size), nullptr, nullptr,
325 MOJO_READ_MESSAGE_FLAG_NONE)); 362 MOJO_READ_MESSAGE_FLAG_NONE));
326 EXPECT_EQ(sizeof(received_id), static_cast<size_t>(buffer_size)); 363 EXPECT_EQ(sizeof(received_id), static_cast<size_t>(buffer_size));
327 EXPECT_EQ(remote_id, received_id); 364 EXPECT_EQ(remote_id, received_id);
328 365
(...skipping 13 matching lines...) Expand all
342 MOJO_RESULT_OK, 379 MOJO_RESULT_OK,
343 mp2->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), 380 mp2->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello),
344 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 381 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
345 382
346 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 383 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
347 EXPECT_EQ(789u, context); 384 EXPECT_EQ(789u, context);
348 hss = HandleSignalsState(); 385 hss = HandleSignalsState();
349 mp3->RemoveWaiter(0, &waiter, &hss); 386 mp3->RemoveWaiter(0, &waiter, &hss);
350 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 387 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
351 hss.satisfied_signals); 388 hss.satisfied_signals);
352 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 389 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
353 hss.satisfiable_signals);
354 390
355 // Make sure there's nothing on MP 0, port 0 or MP 1, port 1 or MP 2, port 0. 391 // Make sure there's nothing on MP 0, port 0 or MP 1, port 1 or MP 2, port 0.
356 buffer_size = static_cast<uint32_t>(sizeof(buffer)); 392 buffer_size = static_cast<uint32_t>(sizeof(buffer));
357 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 393 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
358 mp0->ReadMessage(0, UserPointer<void>(buffer), 394 mp0->ReadMessage(0, UserPointer<void>(buffer),
359 MakeUserPointer(&buffer_size), nullptr, nullptr, 395 MakeUserPointer(&buffer_size), nullptr, nullptr,
360 MOJO_READ_MESSAGE_FLAG_NONE)); 396 MOJO_READ_MESSAGE_FLAG_NONE));
361 buffer_size = static_cast<uint32_t>(sizeof(buffer)); 397 buffer_size = static_cast<uint32_t>(sizeof(buffer));
362 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 398 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
363 mp1->ReadMessage(1, UserPointer<void>(buffer), 399 mp1->ReadMessage(1, UserPointer<void>(buffer),
(...skipping 25 matching lines...) Expand all
389 MOJO_RESULT_OK, 425 MOJO_RESULT_OK,
390 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld), 426 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld),
391 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 427 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
392 428
393 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 429 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
394 EXPECT_EQ(123u, context); 430 EXPECT_EQ(123u, context);
395 hss = HandleSignalsState(); 431 hss = HandleSignalsState();
396 mp1->RemoveWaiter(1, &waiter, &hss); 432 mp1->RemoveWaiter(1, &waiter, &hss);
397 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 433 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
398 hss.satisfied_signals); 434 hss.satisfied_signals);
399 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 435 EXPECT_EQ(kAllSignals | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
400 hss.satisfiable_signals); 436 hss.satisfiable_signals);
401 437
402 // Make sure there's nothing on the other ports. 438 // Make sure there's nothing on the other ports.
403 buffer_size = static_cast<uint32_t>(sizeof(buffer)); 439 buffer_size = static_cast<uint32_t>(sizeof(buffer));
404 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 440 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
405 mp0->ReadMessage(0, UserPointer<void>(buffer), 441 mp0->ReadMessage(0, UserPointer<void>(buffer),
406 MakeUserPointer(&buffer_size), nullptr, nullptr, 442 MakeUserPointer(&buffer_size), nullptr, nullptr,
407 MOJO_READ_MESSAGE_FLAG_NONE)); 443 MOJO_READ_MESSAGE_FLAG_NONE));
408 buffer_size = static_cast<uint32_t>(sizeof(buffer)); 444 buffer_size = static_cast<uint32_t>(sizeof(buffer));
409 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 445 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 dispatcher = nullptr; 635 dispatcher = nullptr;
600 } 636 }
601 637
602 // Wait. 638 // Wait.
603 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 639 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
604 EXPECT_EQ(123u, context); 640 EXPECT_EQ(123u, context);
605 hss = HandleSignalsState(); 641 hss = HandleSignalsState();
606 mp1->RemoveWaiter(1, &waiter, &hss); 642 mp1->RemoveWaiter(1, &waiter, &hss);
607 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 643 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
608 hss.satisfied_signals); 644 hss.satisfied_signals);
609 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 645 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
610 hss.satisfiable_signals);
611 646
612 // Read from MP 1, port 1. 647 // Read from MP 1, port 1.
613 char read_buffer[100] = {0}; 648 char read_buffer[100] = {0};
614 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 649 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
615 DispatcherVector read_dispatchers; 650 DispatcherVector read_dispatchers;
616 uint32_t read_num_dispatchers = 10; // Maximum to get. 651 uint32_t read_num_dispatchers = 10; // Maximum to get.
617 EXPECT_EQ( 652 EXPECT_EQ(
618 MOJO_RESULT_OK, 653 MOJO_RESULT_OK,
619 mp1->ReadMessage(1, UserPointer<void>(read_buffer), 654 mp1->ReadMessage(1, UserPointer<void>(read_buffer),
620 MakeUserPointer(&read_buffer_size), &read_dispatchers, 655 MakeUserPointer(&read_buffer_size), &read_dispatchers,
(...skipping 23 matching lines...) Expand all
644 // TODO(vtl): FIXME -- We (racily) crash if I close |dispatcher| immediately 679 // TODO(vtl): FIXME -- We (racily) crash if I close |dispatcher| immediately
645 // here. (We don't crash if I sleep and then close.) 680 // here. (We don't crash if I sleep and then close.)
646 681
647 // Wait for the dispatcher to become readable. 682 // Wait for the dispatcher to become readable.
648 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 683 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
649 EXPECT_EQ(456u, context); 684 EXPECT_EQ(456u, context);
650 hss = HandleSignalsState(); 685 hss = HandleSignalsState();
651 dispatcher->RemoveWaiter(&waiter, &hss); 686 dispatcher->RemoveWaiter(&waiter, &hss);
652 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 687 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
653 hss.satisfied_signals); 688 hss.satisfied_signals);
654 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 689 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
655 hss.satisfiable_signals);
656 690
657 // Read from the dispatcher. 691 // Read from the dispatcher.
658 memset(read_buffer, 0, sizeof(read_buffer)); 692 memset(read_buffer, 0, sizeof(read_buffer));
659 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 693 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
660 EXPECT_EQ(MOJO_RESULT_OK, 694 EXPECT_EQ(MOJO_RESULT_OK,
661 dispatcher->ReadMessage(UserPointer<void>(read_buffer), 695 dispatcher->ReadMessage(UserPointer<void>(read_buffer),
662 MakeUserPointer(&read_buffer_size), 0, 696 MakeUserPointer(&read_buffer_size), 0,
663 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); 697 nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
664 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); 698 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size));
665 EXPECT_STREQ(kHello, read_buffer); 699 EXPECT_STREQ(kHello, read_buffer);
666 700
667 // Prepare to wait on "local_mp", port 1. 701 // Prepare to wait on "local_mp", port 1.
668 waiter.Init(); 702 waiter.Init();
669 ASSERT_EQ(MOJO_RESULT_OK, 703 ASSERT_EQ(MOJO_RESULT_OK,
670 local_mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, 704 local_mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789,
671 nullptr)); 705 nullptr));
672 706
673 // Write to the dispatcher. 707 // Write to the dispatcher.
674 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( 708 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage(
675 UserPointer<const void>(kHello), sizeof(kHello), 709 UserPointer<const void>(kHello), sizeof(kHello),
676 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 710 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
677 711
678 // Wait. 712 // Wait.
679 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 713 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
680 EXPECT_EQ(789u, context); 714 EXPECT_EQ(789u, context);
681 hss = HandleSignalsState(); 715 hss = HandleSignalsState();
682 local_mp->RemoveWaiter(1, &waiter, &hss); 716 local_mp->RemoveWaiter(1, &waiter, &hss);
683 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 717 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
684 hss.satisfied_signals); 718 hss.satisfied_signals);
685 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 719 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
686 hss.satisfiable_signals);
687 720
688 // Read from "local_mp", port 1. 721 // Read from "local_mp", port 1.
689 memset(read_buffer, 0, sizeof(read_buffer)); 722 memset(read_buffer, 0, sizeof(read_buffer));
690 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 723 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
691 EXPECT_EQ(MOJO_RESULT_OK, 724 EXPECT_EQ(MOJO_RESULT_OK,
692 local_mp->ReadMessage(1, UserPointer<void>(read_buffer), 725 local_mp->ReadMessage(1, UserPointer<void>(read_buffer),
693 MakeUserPointer(&read_buffer_size), nullptr, 726 MakeUserPointer(&read_buffer_size), nullptr,
694 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); 727 nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
695 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); 728 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size));
696 EXPECT_STREQ(kHello, read_buffer); 729 EXPECT_STREQ(kHello, read_buffer);
(...skipping 17 matching lines...) Expand all
714 uint32_t context = 0; 747 uint32_t context = 0;
715 748
716 // We'll try to pass this dispatcher. 749 // We'll try to pass this dispatcher.
717 scoped_refptr<MessagePipeDispatcher> dispatcher( 750 scoped_refptr<MessagePipeDispatcher> dispatcher(
718 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); 751 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions));
719 scoped_refptr<MessagePipe> local_mp(MessagePipe::CreateLocalLocal()); 752 scoped_refptr<MessagePipe> local_mp(MessagePipe::CreateLocalLocal());
720 dispatcher->Init(local_mp, 0); 753 dispatcher->Init(local_mp, 0);
721 754
722 hss = local_mp->GetHandleSignalsState(0); 755 hss = local_mp->GetHandleSignalsState(0);
723 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 756 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
724 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 757 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
725 hss.satisfiable_signals);
726 // Write to the other end (|local_mp|, port 1), and then close it. 758 // Write to the other end (|local_mp|, port 1), and then close it.
727 EXPECT_EQ( 759 EXPECT_EQ(
728 MOJO_RESULT_OK, 760 MOJO_RESULT_OK,
729 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), 761 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello),
730 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 762 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
731 hss = local_mp->GetHandleSignalsState(0); 763 hss = local_mp->GetHandleSignalsState(0);
732 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 764 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
733 hss.satisfied_signals); 765 hss.satisfied_signals);
734 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 766 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
735 hss.satisfiable_signals);
736 // Then the second message.... 767 // Then the second message....
737 EXPECT_EQ( 768 EXPECT_EQ(
738 MOJO_RESULT_OK, 769 MOJO_RESULT_OK,
739 local_mp->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), 770 local_mp->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld),
740 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 771 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
741 hss = local_mp->GetHandleSignalsState(0); 772 hss = local_mp->GetHandleSignalsState(0);
742 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 773 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
743 hss.satisfied_signals); 774 hss.satisfied_signals);
744 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 775 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
745 hss.satisfiable_signals);
746 // Then close it. 776 // Then close it.
747 local_mp->Close(1); 777 local_mp->Close(1);
748 778
749 scoped_refptr<ChannelEndpoint> ep0; 779 scoped_refptr<ChannelEndpoint> ep0;
750 scoped_refptr<MessagePipe> mp0(MessagePipe::CreateLocalProxy(&ep0)); 780 scoped_refptr<MessagePipe> mp0(MessagePipe::CreateLocalProxy(&ep0));
751 scoped_refptr<ChannelEndpoint> ep1; 781 scoped_refptr<ChannelEndpoint> ep1;
752 scoped_refptr<MessagePipe> mp1(MessagePipe::CreateProxyLocal(&ep1)); 782 scoped_refptr<MessagePipe> mp1(MessagePipe::CreateProxyLocal(&ep1));
753 BootstrapChannelEndpoints(ep0, ep1); 783 BootstrapChannelEndpoints(ep0, ep1);
754 784
755 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do 785 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do
(...skipping 23 matching lines...) Expand all
779 dispatcher = nullptr; 809 dispatcher = nullptr;
780 } 810 }
781 811
782 // Wait. 812 // Wait.
783 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 813 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
784 EXPECT_EQ(123u, context); 814 EXPECT_EQ(123u, context);
785 hss = HandleSignalsState(); 815 hss = HandleSignalsState();
786 mp1->RemoveWaiter(1, &waiter, &hss); 816 mp1->RemoveWaiter(1, &waiter, &hss);
787 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 817 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
788 hss.satisfied_signals); 818 hss.satisfied_signals);
789 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 819 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
790 hss.satisfiable_signals);
791 820
792 // Read from MP 1, port 1. 821 // Read from MP 1, port 1.
793 char read_buffer[100] = {0}; 822 char read_buffer[100] = {0};
794 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 823 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
795 DispatcherVector read_dispatchers; 824 DispatcherVector read_dispatchers;
796 uint32_t read_num_dispatchers = 10; // Maximum to get. 825 uint32_t read_num_dispatchers = 10; // Maximum to get.
797 EXPECT_EQ( 826 EXPECT_EQ(
798 MOJO_RESULT_OK, 827 MOJO_RESULT_OK,
799 mp1->ReadMessage(1, UserPointer<void>(read_buffer), 828 mp1->ReadMessage(1, UserPointer<void>(read_buffer),
800 MakeUserPointer(&read_buffer_size), &read_dispatchers, 829 MakeUserPointer(&read_buffer_size), &read_dispatchers,
801 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); 830 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE));
802 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); 831 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size));
803 EXPECT_STREQ(kHello, read_buffer); 832 EXPECT_STREQ(kHello, read_buffer);
804 EXPECT_EQ(1u, read_dispatchers.size()); 833 EXPECT_EQ(1u, read_dispatchers.size());
805 EXPECT_EQ(1u, read_num_dispatchers); 834 EXPECT_EQ(1u, read_num_dispatchers);
806 ASSERT_TRUE(read_dispatchers[0].get()); 835 ASSERT_TRUE(read_dispatchers[0].get());
807 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); 836 EXPECT_TRUE(read_dispatchers[0]->HasOneRef());
808 837
809 EXPECT_EQ(Dispatcher::kTypeMessagePipe, read_dispatchers[0]->GetType()); 838 EXPECT_EQ(Dispatcher::kTypeMessagePipe, read_dispatchers[0]->GetType());
810 dispatcher = static_cast<MessagePipeDispatcher*>(read_dispatchers[0].get()); 839 dispatcher = static_cast<MessagePipeDispatcher*>(read_dispatchers[0].get());
811 840
812 // |dispatcher| should already be readable and not writable. 841 // |dispatcher| should already be readable and not writable.
813 hss = dispatcher->GetHandleSignalsState(); 842 hss = dispatcher->GetHandleSignalsState();
814 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 843 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
815 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 844 hss.satisfied_signals);
845 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
846 hss.satisfiable_signals);
816 // So read from it. 847 // So read from it.
817 memset(read_buffer, 0, sizeof(read_buffer)); 848 memset(read_buffer, 0, sizeof(read_buffer));
818 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 849 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
819 EXPECT_EQ(MOJO_RESULT_OK, 850 EXPECT_EQ(MOJO_RESULT_OK,
820 dispatcher->ReadMessage(UserPointer<void>(read_buffer), 851 dispatcher->ReadMessage(UserPointer<void>(read_buffer),
821 MakeUserPointer(&read_buffer_size), 0, 852 MakeUserPointer(&read_buffer_size), 0,
822 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); 853 nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
823 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); 854 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size));
824 EXPECT_STREQ(kHello, read_buffer); 855 EXPECT_STREQ(kHello, read_buffer);
825 // It should still be readable. 856 // It should still be readable.
826 hss = dispatcher->GetHandleSignalsState(); 857 hss = dispatcher->GetHandleSignalsState();
827 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 858 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
828 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 859 hss.satisfied_signals);
860 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
861 hss.satisfiable_signals);
829 // So read from it. 862 // So read from it.
830 memset(read_buffer, 0, sizeof(read_buffer)); 863 memset(read_buffer, 0, sizeof(read_buffer));
831 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 864 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
832 EXPECT_EQ(MOJO_RESULT_OK, 865 EXPECT_EQ(MOJO_RESULT_OK,
833 dispatcher->ReadMessage(UserPointer<void>(read_buffer), 866 dispatcher->ReadMessage(UserPointer<void>(read_buffer),
834 MakeUserPointer(&read_buffer_size), 0, 867 MakeUserPointer(&read_buffer_size), 0,
835 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); 868 nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
836 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(read_buffer_size)); 869 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(read_buffer_size));
837 EXPECT_STREQ(kWorld, read_buffer); 870 EXPECT_STREQ(kWorld, read_buffer);
838 // Now it should no longer be readable. 871 // Now it should no longer be readable.
839 hss = dispatcher->GetHandleSignalsState(); 872 hss = dispatcher->GetHandleSignalsState();
840 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals); 873 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
841 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfiable_signals); 874 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
842 875
843 // Close everything that belongs to us. 876 // Close everything that belongs to us.
844 mp0->Close(0); 877 mp0->Close(0);
845 mp1->Close(1); 878 mp1->Close(1);
846 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); 879 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
847 } 880 }
848 881
849 #if defined(OS_POSIX) 882 #if defined(OS_POSIX)
850 #define MAYBE_SharedBufferPassing SharedBufferPassing 883 #define MAYBE_SharedBufferPassing SharedBufferPassing
851 #else 884 #else
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 dispatcher = nullptr; 943 dispatcher = nullptr;
911 } 944 }
912 945
913 // Wait. 946 // Wait.
914 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 947 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
915 EXPECT_EQ(123u, context); 948 EXPECT_EQ(123u, context);
916 hss = HandleSignalsState(); 949 hss = HandleSignalsState();
917 mp1->RemoveWaiter(1, &waiter, &hss); 950 mp1->RemoveWaiter(1, &waiter, &hss);
918 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 951 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
919 hss.satisfied_signals); 952 hss.satisfied_signals);
920 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 953 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
921 hss.satisfiable_signals);
922 954
923 // Read from MP 1, port 1. 955 // Read from MP 1, port 1.
924 char read_buffer[100] = {0}; 956 char read_buffer[100] = {0};
925 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 957 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
926 DispatcherVector read_dispatchers; 958 DispatcherVector read_dispatchers;
927 uint32_t read_num_dispatchers = 10; // Maximum to get. 959 uint32_t read_num_dispatchers = 10; // Maximum to get.
928 EXPECT_EQ( 960 EXPECT_EQ(
929 MOJO_RESULT_OK, 961 MOJO_RESULT_OK,
930 mp1->ReadMessage(1, UserPointer<void>(read_buffer), 962 mp1->ReadMessage(1, UserPointer<void>(read_buffer),
931 MakeUserPointer(&read_buffer_size), &read_dispatchers, 963 MakeUserPointer(&read_buffer_size), &read_dispatchers,
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 dispatcher = nullptr; 1062 dispatcher = nullptr;
1031 } 1063 }
1032 1064
1033 // Wait. 1065 // Wait.
1034 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 1066 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
1035 EXPECT_EQ(123u, context); 1067 EXPECT_EQ(123u, context);
1036 hss = HandleSignalsState(); 1068 hss = HandleSignalsState();
1037 mp1->RemoveWaiter(1, &waiter, &hss); 1069 mp1->RemoveWaiter(1, &waiter, &hss);
1038 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1070 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1039 hss.satisfied_signals); 1071 hss.satisfied_signals);
1040 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1072 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
1041 hss.satisfiable_signals);
1042 1073
1043 // Read from MP 1, port 1. 1074 // Read from MP 1, port 1.
1044 char read_buffer[100] = {0}; 1075 char read_buffer[100] = {0};
1045 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 1076 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
1046 DispatcherVector read_dispatchers; 1077 DispatcherVector read_dispatchers;
1047 uint32_t read_num_dispatchers = 10; // Maximum to get. 1078 uint32_t read_num_dispatchers = 10; // Maximum to get.
1048 EXPECT_EQ( 1079 EXPECT_EQ(
1049 MOJO_RESULT_OK, 1080 MOJO_RESULT_OK,
1050 mp1->ReadMessage(1, UserPointer<void>(read_buffer), 1081 mp1->ReadMessage(1, UserPointer<void>(read_buffer),
1051 MakeUserPointer(&read_buffer_size), &read_dispatchers, 1082 MakeUserPointer(&read_buffer_size), &read_dispatchers,
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1168 dispatcher = nullptr; 1199 dispatcher = nullptr;
1169 } 1200 }
1170 1201
1171 // Wait. 1202 // Wait.
1172 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 1203 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
1173 EXPECT_EQ(123u, context); 1204 EXPECT_EQ(123u, context);
1174 hss = HandleSignalsState(); 1205 hss = HandleSignalsState();
1175 mp1->RemoveWaiter(1, &waiter, &hss); 1206 mp1->RemoveWaiter(1, &waiter, &hss);
1176 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1207 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1177 hss.satisfied_signals); 1208 hss.satisfied_signals);
1178 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1209 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
1179 hss.satisfiable_signals);
1180 1210
1181 // Read from MP 1, port 1. 1211 // Read from MP 1, port 1.
1182 char read_buffer[100] = {0}; 1212 char read_buffer[100] = {0};
1183 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 1213 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
1184 DispatcherVector read_dispatchers; 1214 DispatcherVector read_dispatchers;
1185 uint32_t read_num_dispatchers = 10; // Maximum to get. 1215 uint32_t read_num_dispatchers = 10; // Maximum to get.
1186 EXPECT_EQ( 1216 EXPECT_EQ(
1187 MOJO_RESULT_OK, 1217 MOJO_RESULT_OK,
1188 mp1->ReadMessage(1, UserPointer<void>(read_buffer), 1218 mp1->ReadMessage(1, UserPointer<void>(read_buffer),
1189 MakeUserPointer(&read_buffer_size), &read_dispatchers, 1219 MakeUserPointer(&read_buffer_size), &read_dispatchers,
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1228 dispatcher = nullptr; 1258 dispatcher = nullptr;
1229 } 1259 }
1230 1260
1231 // Wait. 1261 // Wait.
1232 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 1262 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
1233 EXPECT_EQ(456u, context); 1263 EXPECT_EQ(456u, context);
1234 hss = HandleSignalsState(); 1264 hss = HandleSignalsState();
1235 mp0->RemoveWaiter(0, &waiter, &hss); 1265 mp0->RemoveWaiter(0, &waiter, &hss);
1236 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1266 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1237 hss.satisfied_signals); 1267 hss.satisfied_signals);
1238 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1268 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
1239 hss.satisfiable_signals);
1240 1269
1241 // Read from MP 0, port 0. 1270 // Read from MP 0, port 0.
1242 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 1271 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
1243 read_num_dispatchers = 10; // Maximum to get. 1272 read_num_dispatchers = 10; // Maximum to get.
1244 EXPECT_EQ( 1273 EXPECT_EQ(
1245 MOJO_RESULT_OK, 1274 MOJO_RESULT_OK,
1246 mp0->ReadMessage(0, UserPointer<void>(read_buffer), 1275 mp0->ReadMessage(0, UserPointer<void>(read_buffer),
1247 MakeUserPointer(&read_buffer_size), &read_dispatchers, 1276 MakeUserPointer(&read_buffer_size), &read_dispatchers,
1248 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); 1277 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE));
1249 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(read_buffer_size)); 1278 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(read_buffer_size));
(...skipping 19 matching lines...) Expand all
1269 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), 1298 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello),
1270 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 1299 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
1271 1300
1272 // Wait for the dispatcher to become readable. 1301 // Wait for the dispatcher to become readable.
1273 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 1302 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
1274 EXPECT_EQ(789u, context); 1303 EXPECT_EQ(789u, context);
1275 hss = HandleSignalsState(); 1304 hss = HandleSignalsState();
1276 dispatcher->RemoveWaiter(&waiter, &hss); 1305 dispatcher->RemoveWaiter(&waiter, &hss);
1277 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1306 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1278 hss.satisfied_signals); 1307 hss.satisfied_signals);
1279 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1308 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
1280 hss.satisfiable_signals);
1281 1309
1282 // Read from the dispatcher. 1310 // Read from the dispatcher.
1283 memset(read_buffer, 0, sizeof(read_buffer)); 1311 memset(read_buffer, 0, sizeof(read_buffer));
1284 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 1312 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
1285 EXPECT_EQ(MOJO_RESULT_OK, 1313 EXPECT_EQ(MOJO_RESULT_OK,
1286 dispatcher->ReadMessage(UserPointer<void>(read_buffer), 1314 dispatcher->ReadMessage(UserPointer<void>(read_buffer),
1287 MakeUserPointer(&read_buffer_size), 0, 1315 MakeUserPointer(&read_buffer_size), 0,
1288 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); 1316 nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
1289 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); 1317 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size));
1290 EXPECT_STREQ(kHello, read_buffer); 1318 EXPECT_STREQ(kHello, read_buffer);
1291 1319
1292 // Prepare to wait on "local_mp", port 1. 1320 // Prepare to wait on "local_mp", port 1.
1293 waiter.Init(); 1321 waiter.Init();
1294 ASSERT_EQ(MOJO_RESULT_OK, 1322 ASSERT_EQ(MOJO_RESULT_OK,
1295 local_mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, 1323 local_mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789,
1296 nullptr)); 1324 nullptr));
1297 1325
1298 // Write to the dispatcher. 1326 // Write to the dispatcher.
1299 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( 1327 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage(
1300 UserPointer<const void>(kHello), sizeof(kHello), 1328 UserPointer<const void>(kHello), sizeof(kHello),
1301 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); 1329 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE));
1302 1330
1303 // Wait. 1331 // Wait.
1304 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); 1332 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context));
1305 EXPECT_EQ(789u, context); 1333 EXPECT_EQ(789u, context);
1306 hss = HandleSignalsState(); 1334 hss = HandleSignalsState();
1307 local_mp->RemoveWaiter(1, &waiter, &hss); 1335 local_mp->RemoveWaiter(1, &waiter, &hss);
1308 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1336 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1309 hss.satisfied_signals); 1337 hss.satisfied_signals);
1310 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1338 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
1311 hss.satisfiable_signals);
1312 1339
1313 // Read from "local_mp", port 1. 1340 // Read from "local_mp", port 1.
1314 memset(read_buffer, 0, sizeof(read_buffer)); 1341 memset(read_buffer, 0, sizeof(read_buffer));
1315 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); 1342 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer));
1316 EXPECT_EQ(MOJO_RESULT_OK, 1343 EXPECT_EQ(MOJO_RESULT_OK,
1317 local_mp->ReadMessage(1, UserPointer<void>(read_buffer), 1344 local_mp->ReadMessage(1, UserPointer<void>(read_buffer),
1318 MakeUserPointer(&read_buffer_size), nullptr, 1345 MakeUserPointer(&read_buffer_size), nullptr,
1319 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); 1346 nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
1320 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); 1347 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size));
1321 EXPECT_STREQ(kHello, read_buffer); 1348 EXPECT_STREQ(kHello, read_buffer);
1322 1349
1323 // TODO(vtl): Also test the cases where messages are written and read (at 1350 // TODO(vtl): Also test the cases where messages are written and read (at
1324 // various points) on the message pipe being passed around. 1351 // various points) on the message pipe being passed around.
1325 1352
1326 // Close everything that belongs to us. 1353 // Close everything that belongs to us.
1327 mp0->Close(0); 1354 mp0->Close(0);
1328 mp1->Close(1); 1355 mp1->Close(1);
1329 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); 1356 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close());
1330 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed. 1357 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed.
1331 local_mp->Close(1); 1358 local_mp->Close(1);
1332 } 1359 }
1333 1360
1334 } // namespace 1361 } // namespace
1335 } // namespace system 1362 } // namespace system
1336 } // namespace mojo 1363 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/multiprocess_message_pipe_unittest.cc ('k') | mojo/public/c/system/types.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698