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

Side by Side Diff: mojo/edk/system/multiprocess_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
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 <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 <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 const std::string quitquitquit("quitquitquit"); 55 const std::string quitquitquit("quitquitquit");
56 int rv = 0; 56 int rv = 0;
57 for (;; rv = (rv + 1) % 100) { 57 for (;; rv = (rv + 1) % 100) {
58 // Wait for our end of the message pipe to be readable. 58 // Wait for our end of the message pipe to be readable.
59 HandleSignalsState hss; 59 HandleSignalsState hss;
60 MojoResult result = 60 MojoResult result =
61 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss); 61 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss);
62 if (result != MOJO_RESULT_OK) { 62 if (result != MOJO_RESULT_OK) {
63 // It was closed, probably. 63 // It was closed, probably.
64 CHECK_EQ(result, MOJO_RESULT_FAILED_PRECONDITION); 64 CHECK_EQ(result, MOJO_RESULT_FAILED_PRECONDITION);
65 CHECK_EQ(hss.satisfied_signals, 0u); 65 CHECK_EQ(hss.satisfied_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED);
66 CHECK_EQ(hss.satisfiable_signals, 0u); 66 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_PEER_CLOSED);
67 break; 67 break;
68 } else { 68 } else {
69 CHECK((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); 69 CHECK((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE));
70 CHECK((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); 70 CHECK((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE));
71 } 71 }
72 72
73 std::string read_buffer(1000, '\0'); 73 std::string read_buffer(1000, '\0');
74 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); 74 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size());
75 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), 75 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]),
76 MakeUserPointer(&read_buffer_size), nullptr, 76 MakeUserPointer(&read_buffer_size), nullptr,
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 read_buffer.resize(read_buffer_size); 189 read_buffer.resize(read_buffer_size);
190 190
191 EXPECT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer); 191 EXPECT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer);
192 } 192 }
193 193
194 // Wait for it to become readable, which should fail (since we sent 194 // Wait for it to become readable, which should fail (since we sent
195 // "quitquitquit"). 195 // "quitquitquit").
196 HandleSignalsState hss; 196 HandleSignalsState hss;
197 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 197 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
198 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); 198 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
199 EXPECT_EQ(0u, hss.satisfied_signals); 199 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
200 EXPECT_EQ(0u, hss.satisfiable_signals); 200 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
201 201
202 mp->Close(0); 202 mp->Close(0);
203 203
204 EXPECT_EQ(static_cast<int>(kNumMessages % 100), 204 EXPECT_EQ(static_cast<int>(kNumMessages % 100),
205 helper()->WaitForChildShutdown()); 205 helper()->WaitForChildShutdown());
206 } 206 }
207 207
208 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckSharedBuffer) { 208 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckSharedBuffer) {
209 embedder::SimplePlatformSupport platform_support; 209 embedder::SimplePlatformSupport platform_support;
210 test::ChannelThread channel_thread(&platform_support); 210 test::ChannelThread channel_thread(&platform_support);
211 embedder::ScopedPlatformHandle client_platform_handle = 211 embedder::ScopedPlatformHandle client_platform_handle =
212 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); 212 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass();
213 CHECK(client_platform_handle.is_valid()); 213 CHECK(client_platform_handle.is_valid());
214 scoped_refptr<ChannelEndpoint> ep; 214 scoped_refptr<ChannelEndpoint> ep;
215 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); 215 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep));
216 channel_thread.Start(client_platform_handle.Pass(), ep); 216 channel_thread.Start(client_platform_handle.Pass(), ep);
217 217
218 // Wait for the first message from our parent. 218 // Wait for the first message from our parent.
219 HandleSignalsState hss; 219 HandleSignalsState hss;
220 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), 220 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss),
221 MOJO_RESULT_OK); 221 MOJO_RESULT_OK);
222 // In this test, the parent definitely doesn't close its end of the message 222 // In this test, the parent definitely doesn't close its end of the message
223 // pipe before we do. 223 // pipe before we do.
224 CHECK_EQ(hss.satisfied_signals, 224 CHECK_EQ(hss.satisfied_signals,
225 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 225 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
226 CHECK_EQ(hss.satisfiable_signals, 226 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
227 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 227 MOJO_HANDLE_SIGNAL_WRITABLE |
228 MOJO_HANDLE_SIGNAL_PEER_CLOSED);
228 229
229 // It should have a shared buffer. 230 // It should have a shared buffer.
230 std::string read_buffer(100, '\0'); 231 std::string read_buffer(100, '\0');
231 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); 232 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
232 DispatcherVector dispatchers; 233 DispatcherVector dispatchers;
233 uint32_t num_dispatchers = 10; // Maximum number to receive. 234 uint32_t num_dispatchers = 10; // Maximum number to receive.
234 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), 235 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]),
235 MakeUserPointer(&num_bytes), &dispatchers, 236 MakeUserPointer(&num_bytes), &dispatchers,
236 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), 237 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE),
237 MOJO_RESULT_OK); 238 MOJO_RESULT_OK);
(...skipping 27 matching lines...) Expand all
265 static_cast<uint32_t>(go2.size()), nullptr, 266 static_cast<uint32_t>(go2.size()), nullptr,
266 MOJO_WRITE_MESSAGE_FLAG_NONE), 267 MOJO_WRITE_MESSAGE_FLAG_NONE),
267 MOJO_RESULT_OK); 268 MOJO_RESULT_OK);
268 269
269 // Now wait for our parent to send us a message. 270 // Now wait for our parent to send us a message.
270 hss = HandleSignalsState(); 271 hss = HandleSignalsState();
271 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), 272 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss),
272 MOJO_RESULT_OK); 273 MOJO_RESULT_OK);
273 CHECK_EQ(hss.satisfied_signals, 274 CHECK_EQ(hss.satisfied_signals,
274 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 275 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
275 CHECK_EQ(hss.satisfiable_signals, 276 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
276 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 277 MOJO_HANDLE_SIGNAL_WRITABLE |
278 MOJO_HANDLE_SIGNAL_PEER_CLOSED);
277 279
278 read_buffer = std::string(100, '\0'); 280 read_buffer = std::string(100, '\0');
279 num_bytes = static_cast<uint32_t>(read_buffer.size()); 281 num_bytes = static_cast<uint32_t>(read_buffer.size());
280 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), 282 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]),
281 MakeUserPointer(&num_bytes), nullptr, nullptr, 283 MakeUserPointer(&num_bytes), nullptr, nullptr,
282 MOJO_READ_MESSAGE_FLAG_NONE), 284 MOJO_READ_MESSAGE_FLAG_NONE),
283 MOJO_RESULT_OK); 285 MOJO_RESULT_OK);
284 read_buffer.resize(num_bytes); 286 read_buffer.resize(num_bytes);
285 CHECK_EQ(read_buffer, std::string("go 3")); 287 CHECK_EQ(read_buffer, std::string("go 3"));
286 288
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 const std::string go3("go 3"); 372 const std::string go3("go 3");
371 EXPECT_EQ(MOJO_RESULT_OK, 373 EXPECT_EQ(MOJO_RESULT_OK,
372 mp->WriteMessage(0, UserPointer<const void>(&go3[0]), 374 mp->WriteMessage(0, UserPointer<const void>(&go3[0]),
373 static_cast<uint32_t>(go3.size()), nullptr, 375 static_cast<uint32_t>(go3.size()), nullptr,
374 MOJO_WRITE_MESSAGE_FLAG_NONE)); 376 MOJO_WRITE_MESSAGE_FLAG_NONE));
375 377
376 // Wait for |mp| to become readable, which should fail. 378 // Wait for |mp| to become readable, which should fail.
377 hss = HandleSignalsState(); 379 hss = HandleSignalsState();
378 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 380 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
379 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); 381 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
380 EXPECT_EQ(0u, hss.satisfied_signals); 382 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
381 EXPECT_EQ(0u, hss.satisfiable_signals); 383 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
382 384
383 mp->Close(0); 385 mp->Close(0);
384 386
385 EXPECT_EQ(0, helper()->WaitForChildShutdown()); 387 EXPECT_EQ(0, helper()->WaitForChildShutdown());
386 } 388 }
387 389
388 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckPlatformHandleFile) { 390 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckPlatformHandleFile) {
389 embedder::SimplePlatformSupport platform_support; 391 embedder::SimplePlatformSupport platform_support;
390 test::ChannelThread channel_thread(&platform_support); 392 test::ChannelThread channel_thread(&platform_support);
391 embedder::ScopedPlatformHandle client_platform_handle = 393 embedder::ScopedPlatformHandle client_platform_handle =
392 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); 394 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass();
393 CHECK(client_platform_handle.is_valid()); 395 CHECK(client_platform_handle.is_valid());
394 scoped_refptr<ChannelEndpoint> ep; 396 scoped_refptr<ChannelEndpoint> ep;
395 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); 397 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep));
396 channel_thread.Start(client_platform_handle.Pass(), ep); 398 channel_thread.Start(client_platform_handle.Pass(), ep);
397 399
398 HandleSignalsState hss; 400 HandleSignalsState hss;
399 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), 401 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss),
400 MOJO_RESULT_OK); 402 MOJO_RESULT_OK);
401 CHECK_EQ(hss.satisfied_signals, 403 CHECK_EQ(hss.satisfied_signals,
402 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 404 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
403 CHECK_EQ(hss.satisfiable_signals, 405 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
404 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 406 MOJO_HANDLE_SIGNAL_WRITABLE |
407 MOJO_HANDLE_SIGNAL_PEER_CLOSED);
405 408
406 std::string read_buffer(100, '\0'); 409 std::string read_buffer(100, '\0');
407 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); 410 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
408 DispatcherVector dispatchers; 411 DispatcherVector dispatchers;
409 uint32_t num_dispatchers = 10; // Maximum number to receive. 412 uint32_t num_dispatchers = 10; // Maximum number to receive.
410 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), 413 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]),
411 MakeUserPointer(&num_bytes), &dispatchers, 414 MakeUserPointer(&num_bytes), &dispatchers,
412 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), 415 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE),
413 MOJO_RESULT_OK); 416 MOJO_RESULT_OK);
414 mp->Close(0); 417 mp->Close(0);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 MOJO_WRITE_MESSAGE_FLAG_NONE)); 481 MOJO_WRITE_MESSAGE_FLAG_NONE));
479 transport.End(); 482 transport.End();
480 483
481 EXPECT_TRUE(dispatcher->HasOneRef()); 484 EXPECT_TRUE(dispatcher->HasOneRef());
482 dispatcher = nullptr; 485 dispatcher = nullptr;
483 486
484 // Wait for it to become readable, which should fail. 487 // Wait for it to become readable, which should fail.
485 HandleSignalsState hss; 488 HandleSignalsState hss;
486 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 489 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
487 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); 490 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
488 EXPECT_EQ(0u, hss.satisfied_signals); 491 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
489 EXPECT_EQ(0u, hss.satisfiable_signals); 492 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
490 493
491 mp->Close(0); 494 mp->Close(0);
492 495
493 EXPECT_EQ(0, helper()->WaitForChildShutdown()); 496 EXPECT_EQ(0, helper()->WaitForChildShutdown());
494 } 497 }
495 498
496 } // namespace 499 } // namespace
497 } // namespace system 500 } // namespace system
498 } // namespace mojo 501 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/message_pipe_unittest.cc ('k') | mojo/edk/system/remote_message_pipe_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698