OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/memory/ref_counted.h" |
| 6 #include "base/test/test_io_thread.h" |
| 7 #include "mojo/edk/system/waiter.h" |
| 8 #include "mojo/edk/system/waiter_test_utils.h" |
| 9 #include "mojo/edk/test/scoped_ipc_support.h" |
| 10 #include "mojo/public/c/system/core.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" |
| 12 |
| 13 namespace mojo { |
| 14 namespace system { |
| 15 namespace { |
| 16 |
| 17 class MessagePipeTest : public testing::Test { |
| 18 public: |
| 19 MessagePipeTest() |
| 20 : test_io_thread_(base::TestIOThread::kAutoStart), |
| 21 ipc_support_(test_io_thread_.task_runner()) {} |
| 22 ~MessagePipeTest() override {} |
| 23 |
| 24 private: |
| 25 base::MessageLoop message_loop_; |
| 26 base::TestIOThread test_io_thread_; |
| 27 mojo::test::ScopedIPCSupport ipc_support_; |
| 28 |
| 29 MOJO_DISALLOW_COPY_AND_ASSIGN(MessagePipeTest); |
| 30 }; |
| 31 |
| 32 static const char kHelloWorld[] = "hello world"; |
| 33 TEST_F(MessagePipeTest, WriteData) { |
| 34 MojoHandle pipe1, pipe2; |
| 35 ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe1, &pipe2)); |
| 36 ASSERT_EQ(MOJO_RESULT_OK, |
| 37 MojoWriteMessage(pipe1, kHelloWorld, sizeof(kHelloWorld), nullptr, |
| 38 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 39 MojoClose(pipe1); |
| 40 MojoClose(pipe2); |
| 41 } |
| 42 |
| 43 |
| 44 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE | |
| 45 MOJO_HANDLE_SIGNAL_WRITABLE | |
| 46 MOJO_HANDLE_SIGNAL_PEER_CLOSED; |
| 47 |
| 48 // Tests: |
| 49 // - only default flags |
| 50 // - reading messages from a port |
| 51 // - when there are no/one/two messages available for that port |
| 52 // - with buffer size 0 (and null buffer) -- should get size |
| 53 // - with too-small buffer -- should get size |
| 54 // - also verify that buffers aren't modified when/where they shouldn't be |
| 55 // - writing messages to a port |
| 56 // - in the obvious scenarios (as above) |
| 57 // - to a port that's been closed |
| 58 // - writing a message to a port, closing the other (would be the source) port, |
| 59 // and reading it |
| 60 TEST_F(MessagePipeTest, Basic) { |
| 61 MojoHandle pipe0, pipe1; |
| 62 ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe0, &pipe1)); |
| 63 |
| 64 int32_t buffer[2]; |
| 65 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
| 66 uint32_t buffer_size; |
| 67 |
| 68 // Nothing to read yet on port 0. |
| 69 buffer[0] = 123; |
| 70 buffer[1] = 456; |
| 71 buffer_size = kBufferSize; |
| 72 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 73 MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
| 74 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 75 EXPECT_EQ(kBufferSize, buffer_size); |
| 76 EXPECT_EQ(123, buffer[0]); |
| 77 EXPECT_EQ(456, buffer[1]); |
| 78 |
| 79 // Ditto for port 1. |
| 80 buffer[0] = 123; |
| 81 buffer[1] = 456; |
| 82 buffer_size = kBufferSize; |
| 83 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 84 MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
| 85 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 86 |
| 87 // Write from port 1 (to port 0). |
| 88 buffer[0] = 789012345; |
| 89 buffer[1] = 0; |
| 90 EXPECT_EQ(MOJO_RESULT_OK, |
| 91 MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
| 92 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 93 |
| 94 MojoHandleSignalsState state; |
| 95 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
| 96 MOJO_DEADLINE_INDEFINITE, &state)); |
| 97 |
| 98 // Read from port 0. |
| 99 buffer[0] = 123; |
| 100 buffer[1] = 456; |
| 101 buffer_size = kBufferSize; |
| 102 EXPECT_EQ(MOJO_RESULT_OK, |
| 103 MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
| 104 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 105 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
| 106 EXPECT_EQ(789012345, buffer[0]); |
| 107 EXPECT_EQ(456, buffer[1]); |
| 108 |
| 109 // Read again from port 0 -- it should be empty. |
| 110 buffer_size = kBufferSize; |
| 111 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 112 MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
| 113 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 114 |
| 115 // Write two messages from port 0 (to port 1). |
| 116 buffer[0] = 123456789; |
| 117 buffer[1] = 0; |
| 118 EXPECT_EQ(MOJO_RESULT_OK, |
| 119 MojoWriteMessage(pipe0, buffer, sizeof(buffer[0]), nullptr, 0, |
| 120 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 121 buffer[0] = 234567890; |
| 122 buffer[1] = 0; |
| 123 EXPECT_EQ(MOJO_RESULT_OK, |
| 124 MojoWriteMessage(pipe0, buffer, sizeof(buffer[0]), nullptr, 0, |
| 125 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 126 |
| 127 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_READABLE, |
| 128 MOJO_DEADLINE_INDEFINITE, &state)); |
| 129 |
| 130 // Read from port 1 with buffer size 0 (should get the size of next message). |
| 131 // Also test that giving a null buffer is okay when the buffer size is 0. |
| 132 buffer_size = 0; |
| 133 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 134 MojoReadMessage(pipe1, nullptr, &buffer_size, nullptr, 0, |
| 135 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 136 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
| 137 |
| 138 // Read from port 1 with buffer size 1 (too small; should get the size of next |
| 139 // message). |
| 140 buffer[0] = 123; |
| 141 buffer[1] = 456; |
| 142 buffer_size = 1; |
| 143 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 144 MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
| 145 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 146 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
| 147 EXPECT_EQ(123, buffer[0]); |
| 148 EXPECT_EQ(456, buffer[1]); |
| 149 |
| 150 // Read from port 1. |
| 151 buffer[0] = 123; |
| 152 buffer[1] = 456; |
| 153 buffer_size = kBufferSize; |
| 154 EXPECT_EQ(MOJO_RESULT_OK, |
| 155 MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
| 156 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 157 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
| 158 EXPECT_EQ(123456789, buffer[0]); |
| 159 EXPECT_EQ(456, buffer[1]); |
| 160 |
| 161 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_READABLE, |
| 162 MOJO_DEADLINE_INDEFINITE, &state)); |
| 163 |
| 164 // Read again from port 1. |
| 165 buffer[0] = 123; |
| 166 buffer[1] = 456; |
| 167 buffer_size = kBufferSize; |
| 168 EXPECT_EQ(MOJO_RESULT_OK, |
| 169 MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
| 170 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 171 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
| 172 EXPECT_EQ(234567890, buffer[0]); |
| 173 EXPECT_EQ(456, buffer[1]); |
| 174 |
| 175 // Read again from port 1 -- it should be empty. |
| 176 buffer_size = kBufferSize; |
| 177 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 178 MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
| 179 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 180 |
| 181 // Write from port 0 (to port 1). |
| 182 buffer[0] = 345678901; |
| 183 buffer[1] = 0; |
| 184 EXPECT_EQ(MOJO_RESULT_OK, |
| 185 MojoWriteMessage(pipe0, buffer, sizeof(buffer[0]), nullptr, 0, |
| 186 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 187 |
| 188 // Close port 0. |
| 189 MojoClose(pipe0); |
| 190 |
| 191 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 192 MOJO_DEADLINE_INDEFINITE, &state)); |
| 193 |
| 194 // Try to write from port 1 (to port 0). |
| 195 buffer[0] = 456789012; |
| 196 buffer[1] = 0; |
| 197 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 198 MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
| 199 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 200 |
| 201 // Read from port 1; should still get message (even though port 0 was closed). |
| 202 buffer[0] = 123; |
| 203 buffer[1] = 456; |
| 204 buffer_size = kBufferSize; |
| 205 EXPECT_EQ(MOJO_RESULT_OK, |
| 206 MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
| 207 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 208 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
| 209 EXPECT_EQ(345678901, buffer[0]); |
| 210 EXPECT_EQ(456, buffer[1]); |
| 211 |
| 212 // Read again from port 1 -- it should be empty (and port 0 is closed). |
| 213 buffer_size = kBufferSize; |
| 214 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 215 MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
| 216 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 217 |
| 218 MojoClose(pipe1); |
| 219 } |
| 220 |
| 221 TEST_F(MessagePipeTest, CloseWithQueuedIncomingMessages) { |
| 222 MojoHandle pipe0, pipe1; |
| 223 ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe0, &pipe1)); |
| 224 |
| 225 int32_t buffer[1]; |
| 226 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
| 227 uint32_t buffer_size; |
| 228 |
| 229 // Write some messages from port 1 (to port 0). |
| 230 for (int32_t i = 0; i < 5; i++) { |
| 231 buffer[0] = i; |
| 232 EXPECT_EQ(MOJO_RESULT_OK, |
| 233 MojoWriteMessage(pipe1, buffer, kBufferSize, nullptr, 0, |
| 234 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 235 } |
| 236 |
| 237 MojoHandleSignalsState state; |
| 238 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
| 239 MOJO_DEADLINE_INDEFINITE, &state)); |
| 240 |
| 241 // Port 0 shouldn't be empty. |
| 242 buffer_size = 0; |
| 243 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 244 MojoReadMessage(pipe0, nullptr, &buffer_size, nullptr, 0, |
| 245 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 246 EXPECT_EQ(kBufferSize, buffer_size); |
| 247 |
| 248 // Close port 0 first, which should have outstanding (incoming) messages. |
| 249 MojoClose(pipe0); |
| 250 MojoClose(pipe1); |
| 251 } |
| 252 |
| 253 TEST_F(MessagePipeTest, DiscardMode) { |
| 254 MojoHandle pipe0, pipe1; |
| 255 ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe0, &pipe1)); |
| 256 |
| 257 int32_t buffer[2]; |
| 258 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
| 259 uint32_t buffer_size; |
| 260 |
| 261 // Write from port 1 (to port 0). |
| 262 buffer[0] = 789012345; |
| 263 buffer[1] = 0; |
| 264 EXPECT_EQ(MOJO_RESULT_OK, |
| 265 MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
| 266 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 267 |
| 268 MojoHandleSignalsState state; |
| 269 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
| 270 MOJO_DEADLINE_INDEFINITE, &state)); |
| 271 |
| 272 // Read/discard from port 0 (no buffer); get size. |
| 273 buffer_size = 0; |
| 274 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 275 MojoReadMessage(pipe0, nullptr, &buffer_size, nullptr, 0, |
| 276 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
| 277 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
| 278 |
| 279 // Read again from port 0 -- it should be empty. |
| 280 buffer_size = kBufferSize; |
| 281 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 282 MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
| 283 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
| 284 |
| 285 // Write from port 1 (to port 0). |
| 286 buffer[0] = 890123456; |
| 287 buffer[1] = 0; |
| 288 EXPECT_EQ(MOJO_RESULT_OK, |
| 289 MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
| 290 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 291 |
| 292 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
| 293 MOJO_DEADLINE_INDEFINITE, &state)); |
| 294 |
| 295 // Read from port 0 (buffer big enough). |
| 296 buffer[0] = 123; |
| 297 buffer[1] = 456; |
| 298 buffer_size = kBufferSize; |
| 299 EXPECT_EQ(MOJO_RESULT_OK, |
| 300 MojoReadMessage(pipe0, buffer, &buffer_size, 0, nullptr, |
| 301 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
| 302 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
| 303 EXPECT_EQ(890123456, buffer[0]); |
| 304 EXPECT_EQ(456, buffer[1]); |
| 305 |
| 306 // Read again from port 0 -- it should be empty. |
| 307 buffer_size = kBufferSize; |
| 308 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 309 MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
| 310 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
| 311 |
| 312 // Write from port 1 (to port 0). |
| 313 buffer[0] = 901234567; |
| 314 buffer[1] = 0; |
| 315 EXPECT_EQ(MOJO_RESULT_OK, |
| 316 MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
| 317 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 318 |
| 319 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
| 320 MOJO_DEADLINE_INDEFINITE, &state)); |
| 321 |
| 322 // Read/discard from port 0 (buffer too small); get size. |
| 323 buffer_size = 1; |
| 324 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 325 MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
| 326 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
| 327 EXPECT_EQ(static_cast<uint32_t>(sizeof(buffer[0])), buffer_size); |
| 328 |
| 329 // Read again from port 0 -- it should be empty. |
| 330 buffer_size = kBufferSize; |
| 331 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 332 MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
| 333 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
| 334 |
| 335 // Write from port 1 (to port 0). |
| 336 buffer[0] = 123456789; |
| 337 buffer[1] = 0; |
| 338 EXPECT_EQ(MOJO_RESULT_OK, |
| 339 MojoWriteMessage(pipe1, buffer, sizeof(buffer[0]), nullptr, 0, |
| 340 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 341 |
| 342 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, |
| 343 MOJO_DEADLINE_INDEFINITE, &state)); |
| 344 |
| 345 // Discard from port 0. |
| 346 buffer_size = 1; |
| 347 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 348 MojoReadMessage(pipe0, nullptr, 0, nullptr, 0, |
| 349 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
| 350 |
| 351 // Read again from port 0 -- it should be empty. |
| 352 buffer_size = kBufferSize; |
| 353 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 354 MojoReadMessage(pipe0, buffer, &buffer_size, nullptr, 0, |
| 355 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); |
| 356 |
| 357 MojoClose(pipe0); |
| 358 MojoClose(pipe1); |
| 359 } |
| 360 |
| 361 TEST_F(MessagePipeTest, BasicWaiting) { |
| 362 MojoHandle pipe0, pipe1; |
| 363 ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &pipe0, &pipe1)); |
| 364 |
| 365 HandleSignalsState hss; |
| 366 |
| 367 int32_t buffer[1]; |
| 368 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
| 369 uint32_t buffer_size; |
| 370 |
| 371 // Always writable (until the other port is closed). |
| 372 hss = HandleSignalsState(); |
| 373 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe0, MOJO_HANDLE_SIGNAL_WRITABLE, 0, |
| 374 &hss)); |
| 375 ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 376 ASSERT_EQ(kAllSignals, hss.satisfiable_signals); |
| 377 hss = HandleSignalsState(); |
| 378 |
| 379 // Not yet readable. |
| 380 ASSERT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 381 MojoWait(pipe0, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
| 382 ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 383 ASSERT_EQ(kAllSignals, hss.satisfiable_signals); |
| 384 |
| 385 // The peer is not closed. |
| 386 hss = HandleSignalsState(); |
| 387 ASSERT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 388 MojoWait(pipe0, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 0, &hss)); |
| 389 ASSERT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 390 ASSERT_EQ(kAllSignals, hss.satisfiable_signals); |
| 391 |
| 392 // Write from port 0 (to port 1), to make port 1 readable. |
| 393 buffer[0] = 123456789; |
| 394 ASSERT_EQ(MOJO_RESULT_OK, |
| 395 MojoWriteMessage(pipe0, buffer, kBufferSize, nullptr, 0, |
| 396 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 397 |
| 398 // Port 1 should already be readable now. |
| 399 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_READABLE, |
| 400 MOJO_DEADLINE_INDEFINITE, &hss)); |
| 401 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 402 hss.satisfied_signals); |
| 403 ASSERT_EQ(kAllSignals, hss.satisfiable_signals); |
| 404 // ... and still writable. |
| 405 hss = HandleSignalsState(); |
| 406 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 407 MOJO_DEADLINE_INDEFINITE, &hss)); |
| 408 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 409 hss.satisfied_signals); |
| 410 ASSERT_EQ(kAllSignals, hss.satisfiable_signals); |
| 411 |
| 412 // Close port 0. |
| 413 MojoClose(pipe0); |
| 414 |
| 415 // Port 1 should be signaled with peer closed. |
| 416 hss = HandleSignalsState(); |
| 417 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 418 MOJO_DEADLINE_INDEFINITE, &hss)); |
| 419 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 420 hss.satisfied_signals); |
| 421 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 422 hss.satisfiable_signals); |
| 423 |
| 424 // Port 1 should not be writable. |
| 425 hss = HandleSignalsState(); |
| 426 |
| 427 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 428 MojoWait(pipe1, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 429 MOJO_DEADLINE_INDEFINITE, &hss)); |
| 430 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 431 hss.satisfied_signals); |
| 432 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 433 hss.satisfiable_signals); |
| 434 |
| 435 // But it should still be readable. |
| 436 hss = HandleSignalsState(); |
| 437 ASSERT_EQ(MOJO_RESULT_OK, MojoWait(pipe1, MOJO_HANDLE_SIGNAL_READABLE, |
| 438 MOJO_DEADLINE_INDEFINITE, &hss)); |
| 439 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 440 hss.satisfied_signals); |
| 441 ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 442 hss.satisfiable_signals); |
| 443 |
| 444 // Read from port 1. |
| 445 buffer[0] = 0; |
| 446 buffer_size = kBufferSize; |
| 447 ASSERT_EQ(MOJO_RESULT_OK, |
| 448 MojoReadMessage(pipe1, buffer, &buffer_size, nullptr, 0, |
| 449 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 450 ASSERT_EQ(123456789, buffer[0]); |
| 451 |
| 452 // Now port 1 should no longer be readable. |
| 453 hss = HandleSignalsState(); |
| 454 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 455 MojoWait(pipe1, MOJO_HANDLE_SIGNAL_READABLE, |
| 456 MOJO_DEADLINE_INDEFINITE, &hss)); |
| 457 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 458 ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 459 |
| 460 MojoClose(pipe1); |
| 461 } |
| 462 |
| 463 } // namespace |
| 464 } // namespace system |
| 465 } // namespace mojo |
OLD | NEW |