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

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: 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_CLOSED);
66 CHECK_EQ(hss.satisfiable_signals, 0u); 66 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_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 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 read_buffer.resize(read_buffer_size); 177 read_buffer.resize(read_buffer_size);
178 178
179 EXPECT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer); 179 EXPECT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer);
180 } 180 }
181 181
182 // Wait for it to become readable, which should fail (since we sent 182 // Wait for it to become readable, which should fail (since we sent
183 // "quitquitquit"). 183 // "quitquitquit").
184 HandleSignalsState hss; 184 HandleSignalsState hss;
185 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 185 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
186 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); 186 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
187 EXPECT_EQ(0u, hss.satisfied_signals); 187 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals);
188 EXPECT_EQ(0u, hss.satisfiable_signals); 188 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals);
189 189
190 mp->Close(0); 190 mp->Close(0);
191 191
192 EXPECT_EQ(static_cast<int>(kNumMessages % 100), 192 EXPECT_EQ(static_cast<int>(kNumMessages % 100),
193 helper()->WaitForChildShutdown()); 193 helper()->WaitForChildShutdown());
194 } 194 }
195 195
196 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckSharedBuffer) { 196 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckSharedBuffer) {
197 embedder::SimplePlatformSupport platform_support; 197 embedder::SimplePlatformSupport platform_support;
198 test::ChannelThread channel_thread(&platform_support); 198 test::ChannelThread channel_thread(&platform_support);
199 embedder::ScopedPlatformHandle client_platform_handle = 199 embedder::ScopedPlatformHandle client_platform_handle =
200 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); 200 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass();
201 CHECK(client_platform_handle.is_valid()); 201 CHECK(client_platform_handle.is_valid());
202 scoped_refptr<ChannelEndpoint> ep; 202 scoped_refptr<ChannelEndpoint> ep;
203 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); 203 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep));
204 channel_thread.Start(client_platform_handle.Pass(), ep); 204 channel_thread.Start(client_platform_handle.Pass(), ep);
205 205
206 // Wait for the first message from our parent. 206 // Wait for the first message from our parent.
207 HandleSignalsState hss; 207 HandleSignalsState hss;
208 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), 208 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss),
209 MOJO_RESULT_OK); 209 MOJO_RESULT_OK);
210 // In this test, the parent definitely doesn't close its end of the message 210 // In this test, the parent definitely doesn't close its end of the message
211 // pipe before we do. 211 // pipe before we do.
212 CHECK_EQ(hss.satisfied_signals, 212 CHECK_EQ(hss.satisfied_signals,
213 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 213 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
214 CHECK_EQ(hss.satisfiable_signals, 214 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
215 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 215 MOJO_HANDLE_SIGNAL_WRITABLE |
216 MOJO_HANDLE_SIGNAL_CLOSED);
216 217
217 // It should have a shared buffer. 218 // It should have a shared buffer.
218 std::string read_buffer(100, '\0'); 219 std::string read_buffer(100, '\0');
219 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); 220 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
220 DispatcherVector dispatchers; 221 DispatcherVector dispatchers;
221 uint32_t num_dispatchers = 10; // Maximum number to receive. 222 uint32_t num_dispatchers = 10; // Maximum number to receive.
222 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), 223 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]),
223 MakeUserPointer(&num_bytes), &dispatchers, 224 MakeUserPointer(&num_bytes), &dispatchers,
224 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), 225 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE),
225 MOJO_RESULT_OK); 226 MOJO_RESULT_OK);
(...skipping 27 matching lines...) Expand all
253 static_cast<uint32_t>(go2.size()), nullptr, 254 static_cast<uint32_t>(go2.size()), nullptr,
254 MOJO_WRITE_MESSAGE_FLAG_NONE), 255 MOJO_WRITE_MESSAGE_FLAG_NONE),
255 MOJO_RESULT_OK); 256 MOJO_RESULT_OK);
256 257
257 // Now wait for our parent to send us a message. 258 // Now wait for our parent to send us a message.
258 hss = HandleSignalsState(); 259 hss = HandleSignalsState();
259 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), 260 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss),
260 MOJO_RESULT_OK); 261 MOJO_RESULT_OK);
261 CHECK_EQ(hss.satisfied_signals, 262 CHECK_EQ(hss.satisfied_signals,
262 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 263 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
263 CHECK_EQ(hss.satisfiable_signals, 264 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
264 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 265 MOJO_HANDLE_SIGNAL_WRITABLE |
266 MOJO_HANDLE_SIGNAL_CLOSED);
265 267
266 read_buffer = std::string(100, '\0'); 268 read_buffer = std::string(100, '\0');
267 num_bytes = static_cast<uint32_t>(read_buffer.size()); 269 num_bytes = static_cast<uint32_t>(read_buffer.size());
268 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), 270 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]),
269 MakeUserPointer(&num_bytes), nullptr, nullptr, 271 MakeUserPointer(&num_bytes), nullptr, nullptr,
270 MOJO_READ_MESSAGE_FLAG_NONE), 272 MOJO_READ_MESSAGE_FLAG_NONE),
271 MOJO_RESULT_OK); 273 MOJO_RESULT_OK);
272 read_buffer.resize(num_bytes); 274 read_buffer.resize(num_bytes);
273 CHECK_EQ(read_buffer, std::string("go 3")); 275 CHECK_EQ(read_buffer, std::string("go 3"));
274 276
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 const std::string go3("go 3"); 359 const std::string go3("go 3");
358 EXPECT_EQ(MOJO_RESULT_OK, 360 EXPECT_EQ(MOJO_RESULT_OK,
359 mp->WriteMessage(0, UserPointer<const void>(&go3[0]), 361 mp->WriteMessage(0, UserPointer<const void>(&go3[0]),
360 static_cast<uint32_t>(go3.size()), nullptr, 362 static_cast<uint32_t>(go3.size()), nullptr,
361 MOJO_WRITE_MESSAGE_FLAG_NONE)); 363 MOJO_WRITE_MESSAGE_FLAG_NONE));
362 364
363 // Wait for |mp| to become readable, which should fail. 365 // Wait for |mp| to become readable, which should fail.
364 hss = HandleSignalsState(); 366 hss = HandleSignalsState();
365 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 367 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
366 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); 368 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
367 EXPECT_EQ(0u, hss.satisfied_signals); 369 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals);
368 EXPECT_EQ(0u, hss.satisfiable_signals); 370 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals);
369 371
370 mp->Close(0); 372 mp->Close(0);
371 373
372 EXPECT_EQ(0, helper()->WaitForChildShutdown()); 374 EXPECT_EQ(0, helper()->WaitForChildShutdown());
373 } 375 }
374 376
375 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckPlatformHandleFile) { 377 MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckPlatformHandleFile) {
376 embedder::SimplePlatformSupport platform_support; 378 embedder::SimplePlatformSupport platform_support;
377 test::ChannelThread channel_thread(&platform_support); 379 test::ChannelThread channel_thread(&platform_support);
378 embedder::ScopedPlatformHandle client_platform_handle = 380 embedder::ScopedPlatformHandle client_platform_handle =
379 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); 381 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass();
380 CHECK(client_platform_handle.is_valid()); 382 CHECK(client_platform_handle.is_valid());
381 scoped_refptr<ChannelEndpoint> ep; 383 scoped_refptr<ChannelEndpoint> ep;
382 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); 384 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep));
383 channel_thread.Start(client_platform_handle.Pass(), ep); 385 channel_thread.Start(client_platform_handle.Pass(), ep);
384 386
385 HandleSignalsState hss; 387 HandleSignalsState hss;
386 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), 388 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss),
387 MOJO_RESULT_OK); 389 MOJO_RESULT_OK);
388 CHECK_EQ(hss.satisfied_signals, 390 CHECK_EQ(hss.satisfied_signals,
389 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 391 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE);
390 CHECK_EQ(hss.satisfiable_signals, 392 CHECK_EQ(hss.satisfiable_signals, MOJO_HANDLE_SIGNAL_READABLE |
391 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); 393 MOJO_HANDLE_SIGNAL_WRITABLE |
394 MOJO_HANDLE_SIGNAL_CLOSED);
392 395
393 std::string read_buffer(100, '\0'); 396 std::string read_buffer(100, '\0');
394 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); 397 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
395 DispatcherVector dispatchers; 398 DispatcherVector dispatchers;
396 uint32_t num_dispatchers = 10; // Maximum number to receive. 399 uint32_t num_dispatchers = 10; // Maximum number to receive.
397 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), 400 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]),
398 MakeUserPointer(&num_bytes), &dispatchers, 401 MakeUserPointer(&num_bytes), &dispatchers,
399 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), 402 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE),
400 MOJO_RESULT_OK); 403 MOJO_RESULT_OK);
401 mp->Close(0); 404 mp->Close(0);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 MOJO_WRITE_MESSAGE_FLAG_NONE)); 467 MOJO_WRITE_MESSAGE_FLAG_NONE));
465 transport.End(); 468 transport.End();
466 469
467 EXPECT_TRUE(dispatcher->HasOneRef()); 470 EXPECT_TRUE(dispatcher->HasOneRef());
468 dispatcher = nullptr; 471 dispatcher = nullptr;
469 472
470 // Wait for it to become readable, which should fail. 473 // Wait for it to become readable, which should fail.
471 HandleSignalsState hss; 474 HandleSignalsState hss;
472 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 475 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
473 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); 476 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss));
474 EXPECT_EQ(0u, hss.satisfied_signals); 477 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals);
475 EXPECT_EQ(0u, hss.satisfiable_signals); 478 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals);
476 479
477 mp->Close(0); 480 mp->Close(0);
478 481
479 EXPECT_EQ(0, helper()->WaitForChildShutdown()); 482 EXPECT_EQ(0, helper()->WaitForChildShutdown());
480 } 483 }
481 484
482 } // namespace 485 } // namespace
483 } // namespace system 486 } // namespace system
484 } // namespace mojo 487 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698