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

Side by Side Diff: mojo/edk/system/local_data_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/local_data_pipe.cc ('k') | mojo/edk/system/local_message_pipe_endpoint.cc » ('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 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 "mojo/edk/system/local_data_pipe.h" 5 #include "mojo/edk/system/local_data_pipe.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 uint32_t context = 0; 232 uint32_t context = 0;
233 HandleSignalsState hss; 233 HandleSignalsState hss;
234 234
235 // Never readable. 235 // Never readable.
236 waiter.Init(); 236 waiter.Init();
237 hss = HandleSignalsState(); 237 hss = HandleSignalsState();
238 EXPECT_EQ( 238 EXPECT_EQ(
239 MOJO_RESULT_FAILED_PRECONDITION, 239 MOJO_RESULT_FAILED_PRECONDITION,
240 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); 240 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss));
241 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 241 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
242 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 242 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
243 hss.satisfiable_signals);
243 244
244 // Already writable. 245 // Already writable.
245 waiter.Init(); 246 waiter.Init();
246 hss = HandleSignalsState(); 247 hss = HandleSignalsState();
247 EXPECT_EQ( 248 EXPECT_EQ(
248 MOJO_RESULT_ALREADY_EXISTS, 249 MOJO_RESULT_ALREADY_EXISTS,
249 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34, &hss)); 250 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34, &hss));
250 251
251 // Write two elements. 252 // Write two elements.
252 int32_t elements[2] = {123, 456}; 253 int32_t elements[2] = {123, 456};
253 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); 254 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
254 EXPECT_EQ(MOJO_RESULT_OK, 255 EXPECT_EQ(MOJO_RESULT_OK,
255 dp->ProducerWriteData(UserPointer<const void>(elements), 256 dp->ProducerWriteData(UserPointer<const void>(elements),
256 MakeUserPointer(&num_bytes), true)); 257 MakeUserPointer(&num_bytes), true));
257 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); 258 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes);
258 259
259 // Adding a waiter should now succeed. 260 // Adding a waiter should now succeed.
260 waiter.Init(); 261 waiter.Init();
261 ASSERT_EQ( 262 ASSERT_EQ(
262 MOJO_RESULT_OK, 263 MOJO_RESULT_OK,
263 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr)); 264 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr));
264 // And it shouldn't be writable yet. 265 // And it shouldn't be writable yet.
265 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 266 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
266 hss = HandleSignalsState(); 267 hss = HandleSignalsState();
267 dp->ProducerRemoveWaiter(&waiter, &hss); 268 dp->ProducerRemoveWaiter(&waiter, &hss);
268 EXPECT_EQ(0u, hss.satisfied_signals); 269 EXPECT_EQ(0u, hss.satisfied_signals);
269 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 270 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
271 hss.satisfiable_signals);
270 272
271 // Peek one element. 273 // Peek one element.
272 elements[0] = -1; 274 elements[0] = -1;
273 elements[1] = -1; 275 elements[1] = -1;
274 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 276 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
275 EXPECT_EQ(MOJO_RESULT_OK, 277 EXPECT_EQ(MOJO_RESULT_OK,
276 dp->ConsumerReadData(UserPointer<void>(elements), 278 dp->ConsumerReadData(UserPointer<void>(elements),
277 MakeUserPointer(&num_bytes), true, true)); 279 MakeUserPointer(&num_bytes), true, true));
278 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 280 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
279 EXPECT_EQ(123, elements[0]); 281 EXPECT_EQ(123, elements[0]);
280 EXPECT_EQ(-1, elements[1]); 282 EXPECT_EQ(-1, elements[1]);
281 283
282 // Add a waiter. 284 // Add a waiter.
283 waiter.Init(); 285 waiter.Init();
284 ASSERT_EQ( 286 ASSERT_EQ(
285 MOJO_RESULT_OK, 287 MOJO_RESULT_OK,
286 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr)); 288 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr));
287 // And it still shouldn't be writable yet. 289 // And it still shouldn't be writable yet.
288 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 290 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
289 hss = HandleSignalsState(); 291 hss = HandleSignalsState();
290 dp->ProducerRemoveWaiter(&waiter, &hss); 292 dp->ProducerRemoveWaiter(&waiter, &hss);
291 EXPECT_EQ(0u, hss.satisfied_signals); 293 EXPECT_EQ(0u, hss.satisfied_signals);
292 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 294 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
295 hss.satisfiable_signals);
293 296
294 // Do it again. 297 // Do it again.
295 waiter.Init(); 298 waiter.Init();
296 ASSERT_EQ( 299 ASSERT_EQ(
297 MOJO_RESULT_OK, 300 MOJO_RESULT_OK,
298 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78, nullptr)); 301 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78, nullptr));
299 302
300 // Read one element. 303 // Read one element.
301 elements[0] = -1; 304 elements[0] = -1;
302 elements[1] = -1; 305 elements[1] = -1;
303 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 306 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
304 EXPECT_EQ(MOJO_RESULT_OK, 307 EXPECT_EQ(MOJO_RESULT_OK,
305 dp->ConsumerReadData(UserPointer<void>(elements), 308 dp->ConsumerReadData(UserPointer<void>(elements),
306 MakeUserPointer(&num_bytes), true, false)); 309 MakeUserPointer(&num_bytes), true, false));
307 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 310 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
308 EXPECT_EQ(123, elements[0]); 311 EXPECT_EQ(123, elements[0]);
309 EXPECT_EQ(-1, elements[1]); 312 EXPECT_EQ(-1, elements[1]);
310 313
311 // Waiting should now succeed. 314 // Waiting should now succeed.
312 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); 315 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context));
313 EXPECT_EQ(78u, context); 316 EXPECT_EQ(78u, context);
314 hss = HandleSignalsState(); 317 hss = HandleSignalsState();
315 dp->ProducerRemoveWaiter(&waiter, &hss); 318 dp->ProducerRemoveWaiter(&waiter, &hss);
316 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 319 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
317 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 320 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
321 hss.satisfiable_signals);
318 322
319 // Try writing, using a two-phase write. 323 // Try writing, using a two-phase write.
320 void* buffer = nullptr; 324 void* buffer = nullptr;
321 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); 325 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
322 EXPECT_EQ(MOJO_RESULT_OK, 326 EXPECT_EQ(MOJO_RESULT_OK,
323 dp->ProducerBeginWriteData(MakeUserPointer(&buffer), 327 dp->ProducerBeginWriteData(MakeUserPointer(&buffer),
324 MakeUserPointer(&num_bytes), false)); 328 MakeUserPointer(&num_bytes), false));
325 EXPECT_TRUE(buffer); 329 EXPECT_TRUE(buffer);
326 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 330 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
327 331
(...skipping 22 matching lines...) Expand all
350 EXPECT_EQ( 354 EXPECT_EQ(
351 MOJO_RESULT_OK, 355 MOJO_RESULT_OK,
352 dp->ConsumerEndReadData(static_cast<uint32_t>(1u * sizeof(elements[0])))); 356 dp->ConsumerEndReadData(static_cast<uint32_t>(1u * sizeof(elements[0]))));
353 357
354 // Waiting should succeed. 358 // Waiting should succeed.
355 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); 359 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context));
356 EXPECT_EQ(90u, context); 360 EXPECT_EQ(90u, context);
357 hss = HandleSignalsState(); 361 hss = HandleSignalsState();
358 dp->ProducerRemoveWaiter(&waiter, &hss); 362 dp->ProducerRemoveWaiter(&waiter, &hss);
359 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 363 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
360 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 364 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
365 hss.satisfiable_signals);
361 366
362 // Write one element. 367 // Write one element.
363 elements[0] = 123; 368 elements[0] = 123;
364 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 369 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
365 EXPECT_EQ(MOJO_RESULT_OK, 370 EXPECT_EQ(MOJO_RESULT_OK,
366 dp->ProducerWriteData(UserPointer<const void>(elements), 371 dp->ProducerWriteData(UserPointer<const void>(elements),
367 MakeUserPointer(&num_bytes), false)); 372 MakeUserPointer(&num_bytes), false));
368 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 373 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
369 374
370 // Add a waiter. 375 // Add a waiter.
371 waiter.Init(); 376 waiter.Init();
372 ASSERT_EQ( 377 ASSERT_EQ(
373 MOJO_RESULT_OK, 378 MOJO_RESULT_OK,
374 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, nullptr)); 379 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, nullptr));
375 380
376 // Close the consumer. 381 // Close the consumer.
377 dp->ConsumerClose(); 382 dp->ConsumerClose();
378 383
379 // It should now be never-writable. 384 // It should now be never-writable.
380 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); 385 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context));
381 EXPECT_EQ(12u, context); 386 EXPECT_EQ(12u, context);
382 hss = HandleSignalsState(); 387 hss = HandleSignalsState();
383 dp->ProducerRemoveWaiter(&waiter, &hss); 388 dp->ProducerRemoveWaiter(&waiter, &hss);
384 EXPECT_EQ(0u, hss.satisfied_signals); 389 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
385 EXPECT_EQ(0u, hss.satisfiable_signals); 390 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
386 391
387 dp->ProducerClose(); 392 dp->ProducerClose();
388 } 393 }
389 394
395 TEST(LocalDataPipeTest, PeerClosedWaiting) {
396 const MojoCreateDataPipeOptions options = {
397 kSizeOfOptions, // |struct_size|.
398 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
399 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|.
400 2 * sizeof(int32_t) // |capacity_num_bytes|.
401 };
402 MojoCreateDataPipeOptions validated_options = {0};
403 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions(
404 MakeUserPointer(&options), &validated_options));
405
406 Waiter waiter;
407 HandleSignalsState hss;
408
409 // Check MOJO_HANDLE_SIGNAL_PEER_CLOSED on producer.
410 {
411 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
412 // Add a waiter.
413 waiter.Init();
414 ASSERT_EQ(MOJO_RESULT_OK,
415 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 12,
416 nullptr));
417
418 // Close the consumer.
419 dp->ConsumerClose();
420
421 // It should be signaled.
422 uint32_t context = 0;
423 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context));
424 EXPECT_EQ(12u, context);
425 hss = HandleSignalsState();
426 dp->ProducerRemoveWaiter(&waiter, &hss);
427 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
428 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
429
430 dp->ProducerClose();
431 }
432
433 // Check MOJO_HANDLE_SIGNAL_PEER_CLOSED on consumer.
434 {
435 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
436 // Add a waiter.
437 waiter.Init();
438 ASSERT_EQ(MOJO_RESULT_OK,
439 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 12,
440 nullptr));
441
442 // Close the producer.
443 dp->ProducerClose();
444
445 // It should be signaled.
446 uint32_t context = 0;
447 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context));
448 EXPECT_EQ(12u, context);
449 hss = HandleSignalsState();
450 dp->ConsumerRemoveWaiter(&waiter, &hss);
451 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
452 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
453
454 dp->ConsumerClose();
455 }
456 }
457
390 TEST(LocalDataPipeTest, BasicConsumerWaiting) { 458 TEST(LocalDataPipeTest, BasicConsumerWaiting) {
391 const MojoCreateDataPipeOptions options = { 459 const MojoCreateDataPipeOptions options = {
392 kSizeOfOptions, // |struct_size|. 460 kSizeOfOptions, // |struct_size|.
393 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. 461 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
394 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. 462 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|.
395 1000 * sizeof(int32_t) // |capacity_num_bytes|. 463 1000 * sizeof(int32_t) // |capacity_num_bytes|.
396 }; 464 };
397 MojoCreateDataPipeOptions validated_options = {0}; 465 MojoCreateDataPipeOptions validated_options = {0};
398 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( 466 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions(
399 MakeUserPointer(&options), &validated_options)); 467 MakeUserPointer(&options), &validated_options));
400 468
401 { 469 {
402 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); 470 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
403 Waiter waiter; 471 Waiter waiter;
404 uint32_t context = 0; 472 uint32_t context = 0;
405 HandleSignalsState hss; 473 HandleSignalsState hss;
406 474
407 // Never writable. 475 // Never writable.
408 waiter.Init(); 476 waiter.Init();
409 hss = HandleSignalsState(); 477 hss = HandleSignalsState();
410 EXPECT_EQ( 478 EXPECT_EQ(
411 MOJO_RESULT_FAILED_PRECONDITION, 479 MOJO_RESULT_FAILED_PRECONDITION,
412 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, &hss)); 480 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, &hss));
413 EXPECT_EQ(0u, hss.satisfied_signals); 481 EXPECT_EQ(0u, hss.satisfied_signals);
414 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 482 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
483 hss.satisfiable_signals);
415 484
416 // Not yet readable. 485 // Not yet readable.
417 waiter.Init(); 486 waiter.Init();
418 ASSERT_EQ(MOJO_RESULT_OK, 487 ASSERT_EQ(MOJO_RESULT_OK,
419 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, 488 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34,
420 nullptr)); 489 nullptr));
421 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 490 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
422 hss = HandleSignalsState(); 491 hss = HandleSignalsState();
423 dp->ConsumerRemoveWaiter(&waiter, &hss); 492 dp->ConsumerRemoveWaiter(&waiter, &hss);
424 EXPECT_EQ(0u, hss.satisfied_signals); 493 EXPECT_EQ(0u, hss.satisfied_signals);
425 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 494 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
495 hss.satisfiable_signals);
426 496
427 // Write two elements. 497 // Write two elements.
428 int32_t elements[2] = {123, 456}; 498 int32_t elements[2] = {123, 456};
429 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); 499 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
430 EXPECT_EQ(MOJO_RESULT_OK, 500 EXPECT_EQ(MOJO_RESULT_OK,
431 dp->ProducerWriteData(UserPointer<const void>(elements), 501 dp->ProducerWriteData(UserPointer<const void>(elements),
432 MakeUserPointer(&num_bytes), true)); 502 MakeUserPointer(&num_bytes), true));
433 503
434 // Should already be readable. 504 // Should already be readable.
435 waiter.Init(); 505 waiter.Init();
436 hss = HandleSignalsState(); 506 hss = HandleSignalsState();
437 EXPECT_EQ( 507 EXPECT_EQ(
438 MOJO_RESULT_ALREADY_EXISTS, 508 MOJO_RESULT_ALREADY_EXISTS,
439 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, &hss)); 509 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, &hss));
440 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 510 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
441 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 511 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
512 hss.satisfiable_signals);
442 513
443 // Discard one element. 514 // Discard one element.
444 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 515 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
445 EXPECT_EQ(MOJO_RESULT_OK, 516 EXPECT_EQ(MOJO_RESULT_OK,
446 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); 517 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true));
447 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 518 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
448 519
449 // Should still be readable. 520 // Should still be readable.
450 waiter.Init(); 521 waiter.Init();
451 hss = HandleSignalsState(); 522 hss = HandleSignalsState();
452 EXPECT_EQ( 523 EXPECT_EQ(
453 MOJO_RESULT_ALREADY_EXISTS, 524 MOJO_RESULT_ALREADY_EXISTS,
454 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); 525 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss));
455 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 526 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
456 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 527 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
528 hss.satisfiable_signals);
457 529
458 // Peek one element. 530 // Peek one element.
459 elements[0] = -1; 531 elements[0] = -1;
460 elements[1] = -1; 532 elements[1] = -1;
461 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 533 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
462 EXPECT_EQ(MOJO_RESULT_OK, 534 EXPECT_EQ(MOJO_RESULT_OK,
463 dp->ConsumerReadData(UserPointer<void>(elements), 535 dp->ConsumerReadData(UserPointer<void>(elements),
464 MakeUserPointer(&num_bytes), true, true)); 536 MakeUserPointer(&num_bytes), true, true));
465 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 537 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
466 EXPECT_EQ(456, elements[0]); 538 EXPECT_EQ(456, elements[0]);
467 EXPECT_EQ(-1, elements[1]); 539 EXPECT_EQ(-1, elements[1]);
468 540
469 // Should still be readable. 541 // Should still be readable.
470 waiter.Init(); 542 waiter.Init();
471 hss = HandleSignalsState(); 543 hss = HandleSignalsState();
472 EXPECT_EQ( 544 EXPECT_EQ(
473 MOJO_RESULT_ALREADY_EXISTS, 545 MOJO_RESULT_ALREADY_EXISTS,
474 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); 546 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss));
475 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 547 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
476 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 548 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
549 hss.satisfiable_signals);
477 550
478 // Read one element. 551 // Read one element.
479 elements[0] = -1; 552 elements[0] = -1;
480 elements[1] = -1; 553 elements[1] = -1;
481 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 554 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
482 EXPECT_EQ(MOJO_RESULT_OK, 555 EXPECT_EQ(MOJO_RESULT_OK,
483 dp->ConsumerReadData(UserPointer<void>(elements), 556 dp->ConsumerReadData(UserPointer<void>(elements),
484 MakeUserPointer(&num_bytes), true, false)); 557 MakeUserPointer(&num_bytes), true, false));
485 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 558 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
486 EXPECT_EQ(456, elements[0]); 559 EXPECT_EQ(456, elements[0]);
(...skipping 12 matching lines...) Expand all
499 EXPECT_EQ(MOJO_RESULT_OK, 572 EXPECT_EQ(MOJO_RESULT_OK,
500 dp->ProducerWriteData(UserPointer<const void>(elements), 573 dp->ProducerWriteData(UserPointer<const void>(elements),
501 MakeUserPointer(&num_bytes), true)); 574 MakeUserPointer(&num_bytes), true));
502 575
503 // Waiting should now succeed. 576 // Waiting should now succeed.
504 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); 577 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context));
505 EXPECT_EQ(90u, context); 578 EXPECT_EQ(90u, context);
506 hss = HandleSignalsState(); 579 hss = HandleSignalsState();
507 dp->ConsumerRemoveWaiter(&waiter, &hss); 580 dp->ConsumerRemoveWaiter(&waiter, &hss);
508 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 581 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
509 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 582 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
583 hss.satisfiable_signals);
510 584
511 // Close the producer. 585 // Close the producer.
512 dp->ProducerClose(); 586 dp->ProducerClose();
513 587
514 // Should still be readable. 588 // Should still be readable.
515 waiter.Init(); 589 waiter.Init();
516 hss = HandleSignalsState(); 590 hss = HandleSignalsState();
517 EXPECT_EQ( 591 EXPECT_EQ(
518 MOJO_RESULT_ALREADY_EXISTS, 592 MOJO_RESULT_ALREADY_EXISTS,
519 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); 593 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss));
520 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 594 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
521 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 595 hss.satisfied_signals);
596 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
597 hss.satisfiable_signals);
522 598
523 // Read one element. 599 // Read one element.
524 elements[0] = -1; 600 elements[0] = -1;
525 elements[1] = -1; 601 elements[1] = -1;
526 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 602 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
527 EXPECT_EQ(MOJO_RESULT_OK, 603 EXPECT_EQ(MOJO_RESULT_OK,
528 dp->ConsumerReadData(UserPointer<void>(elements), 604 dp->ConsumerReadData(UserPointer<void>(elements),
529 MakeUserPointer(&num_bytes), true, false)); 605 MakeUserPointer(&num_bytes), true, false));
530 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 606 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
531 EXPECT_EQ(789, elements[0]); 607 EXPECT_EQ(789, elements[0]);
532 EXPECT_EQ(-1, elements[1]); 608 EXPECT_EQ(-1, elements[1]);
533 609
534 // Should be never-readable. 610 // Should be never-readable.
535 waiter.Init(); 611 waiter.Init();
536 hss = HandleSignalsState(); 612 hss = HandleSignalsState();
537 EXPECT_EQ( 613 EXPECT_EQ(
538 MOJO_RESULT_FAILED_PRECONDITION, 614 MOJO_RESULT_FAILED_PRECONDITION,
539 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); 615 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss));
540 EXPECT_EQ(0u, hss.satisfied_signals); 616 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
541 EXPECT_EQ(0u, hss.satisfiable_signals); 617 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
542 618
543 dp->ConsumerClose(); 619 dp->ConsumerClose();
544 } 620 }
545 621
546 // Test with two-phase APIs and closing the producer with an active consumer 622 // Test with two-phase APIs and closing the producer with an active consumer
547 // waiter. 623 // waiter.
548 { 624 {
549 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); 625 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
550 Waiter waiter; 626 Waiter waiter;
551 uint32_t context = 0; 627 uint32_t context = 0;
(...skipping 15 matching lines...) Expand all
567 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(static_cast<uint32_t>( 643 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(static_cast<uint32_t>(
568 2u * sizeof(elements[0])))); 644 2u * sizeof(elements[0]))));
569 645
570 // Should already be readable. 646 // Should already be readable.
571 waiter.Init(); 647 waiter.Init();
572 hss = HandleSignalsState(); 648 hss = HandleSignalsState();
573 EXPECT_EQ( 649 EXPECT_EQ(
574 MOJO_RESULT_ALREADY_EXISTS, 650 MOJO_RESULT_ALREADY_EXISTS,
575 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); 651 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss));
576 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 652 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
577 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 653 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
654 hss.satisfiable_signals);
578 655
579 // Read one element. 656 // Read one element.
580 // Request two in all-or-none mode, but only read one. 657 // Request two in all-or-none mode, but only read one.
581 const void* read_buffer = nullptr; 658 const void* read_buffer = nullptr;
582 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); 659 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
583 EXPECT_EQ(MOJO_RESULT_OK, 660 EXPECT_EQ(MOJO_RESULT_OK,
584 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer), 661 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer),
585 MakeUserPointer(&num_bytes), true)); 662 MakeUserPointer(&num_bytes), true));
586 EXPECT_TRUE(read_buffer); 663 EXPECT_TRUE(read_buffer);
587 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); 664 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes);
588 const int32_t* read_elements = static_cast<const int32_t*>(read_buffer); 665 const int32_t* read_elements = static_cast<const int32_t*>(read_buffer);
589 EXPECT_EQ(123, read_elements[0]); 666 EXPECT_EQ(123, read_elements[0]);
590 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>( 667 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>(
591 1u * sizeof(elements[0])))); 668 1u * sizeof(elements[0]))));
592 669
593 // Should still be readable. 670 // Should still be readable.
594 waiter.Init(); 671 waiter.Init();
595 hss = HandleSignalsState(); 672 hss = HandleSignalsState();
596 EXPECT_EQ( 673 EXPECT_EQ(
597 MOJO_RESULT_ALREADY_EXISTS, 674 MOJO_RESULT_ALREADY_EXISTS,
598 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); 675 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss));
599 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 676 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
600 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 677 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
678 hss.satisfiable_signals);
601 679
602 // Read one element. 680 // Read one element.
603 // Request three, but not in all-or-none mode. 681 // Request three, but not in all-or-none mode.
604 read_buffer = nullptr; 682 read_buffer = nullptr;
605 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); 683 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
606 EXPECT_EQ(MOJO_RESULT_OK, 684 EXPECT_EQ(MOJO_RESULT_OK,
607 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer), 685 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer),
608 MakeUserPointer(&num_bytes), false)); 686 MakeUserPointer(&num_bytes), false));
609 EXPECT_TRUE(read_buffer); 687 EXPECT_TRUE(read_buffer);
610 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 688 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
611 read_elements = static_cast<const int32_t*>(read_buffer); 689 read_elements = static_cast<const int32_t*>(read_buffer);
612 EXPECT_EQ(456, read_elements[0]); 690 EXPECT_EQ(456, read_elements[0]);
613 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>( 691 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>(
614 1u * sizeof(elements[0])))); 692 1u * sizeof(elements[0]))));
615 693
616 // Adding a waiter should now succeed. 694 // Adding a waiter should now succeed.
617 waiter.Init(); 695 waiter.Init();
618 ASSERT_EQ(MOJO_RESULT_OK, 696 ASSERT_EQ(MOJO_RESULT_OK,
619 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, 697 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56,
620 nullptr)); 698 nullptr));
621 699
622 // Close the producer. 700 // Close the producer.
623 dp->ProducerClose(); 701 dp->ProducerClose();
624 702
625 // Should be never-readable. 703 // Should be never-readable.
626 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); 704 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context));
627 EXPECT_EQ(56u, context); 705 EXPECT_EQ(56u, context);
628 hss = HandleSignalsState(); 706 hss = HandleSignalsState();
629 dp->ConsumerRemoveWaiter(&waiter, &hss); 707 dp->ConsumerRemoveWaiter(&waiter, &hss);
630 EXPECT_EQ(0u, hss.satisfied_signals); 708 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
631 EXPECT_EQ(0u, hss.satisfiable_signals); 709 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
632 710
633 dp->ConsumerClose(); 711 dp->ConsumerClose();
634 } 712 }
635 } 713 }
636 714
637 // Tests that data pipes aren't writable/readable during two-phase writes/reads. 715 // Tests that data pipes aren't writable/readable during two-phase writes/reads.
638 TEST(LocalDataPipeTest, BasicTwoPhaseWaiting) { 716 TEST(LocalDataPipeTest, BasicTwoPhaseWaiting) {
639 const MojoCreateDataPipeOptions options = { 717 const MojoCreateDataPipeOptions options = {
640 kSizeOfOptions, // |struct_size|. 718 kSizeOfOptions, // |struct_size|.
641 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. 719 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
642 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. 720 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|.
643 1000 * sizeof(int32_t) // |capacity_num_bytes|. 721 1000 * sizeof(int32_t) // |capacity_num_bytes|.
644 }; 722 };
645 MojoCreateDataPipeOptions validated_options = {0}; 723 MojoCreateDataPipeOptions validated_options = {0};
646 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( 724 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions(
647 MakeUserPointer(&options), &validated_options)); 725 MakeUserPointer(&options), &validated_options));
648 726
649 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); 727 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
650 Waiter waiter; 728 Waiter waiter;
651 HandleSignalsState hss; 729 HandleSignalsState hss;
652 730
653 // It should be writable. 731 // It should be writable.
654 waiter.Init(); 732 waiter.Init();
655 hss = HandleSignalsState(); 733 hss = HandleSignalsState();
656 EXPECT_EQ( 734 EXPECT_EQ(
657 MOJO_RESULT_ALREADY_EXISTS, 735 MOJO_RESULT_ALREADY_EXISTS,
658 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); 736 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss));
659 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 737 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
660 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 738 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
739 hss.satisfiable_signals);
661 740
662 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); 741 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
663 void* write_ptr = nullptr; 742 void* write_ptr = nullptr;
664 EXPECT_EQ(MOJO_RESULT_OK, 743 EXPECT_EQ(MOJO_RESULT_OK,
665 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), 744 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
666 MakeUserPointer(&num_bytes), false)); 745 MakeUserPointer(&num_bytes), false));
667 EXPECT_TRUE(write_ptr); 746 EXPECT_TRUE(write_ptr);
668 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); 747 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
669 748
670 // At this point, it shouldn't be writable. 749 // At this point, it shouldn't be writable.
671 waiter.Init(); 750 waiter.Init();
672 ASSERT_EQ( 751 ASSERT_EQ(
673 MOJO_RESULT_OK, 752 MOJO_RESULT_OK,
674 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr)); 753 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr));
675 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 754 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
676 hss = HandleSignalsState(); 755 hss = HandleSignalsState();
677 dp->ProducerRemoveWaiter(&waiter, &hss); 756 dp->ProducerRemoveWaiter(&waiter, &hss);
678 EXPECT_EQ(0u, hss.satisfied_signals); 757 EXPECT_EQ(0u, hss.satisfied_signals);
679 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 758 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
759 hss.satisfiable_signals);
680 760
681 // It shouldn't be readable yet either. 761 // It shouldn't be readable yet either.
682 waiter.Init(); 762 waiter.Init();
683 ASSERT_EQ( 763 ASSERT_EQ(
684 MOJO_RESULT_OK, 764 MOJO_RESULT_OK,
685 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, nullptr)); 765 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, nullptr));
686 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 766 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
687 hss = HandleSignalsState(); 767 hss = HandleSignalsState();
688 dp->ConsumerRemoveWaiter(&waiter, &hss); 768 dp->ConsumerRemoveWaiter(&waiter, &hss);
689 EXPECT_EQ(0u, hss.satisfied_signals); 769 EXPECT_EQ(0u, hss.satisfied_signals);
690 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 770 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
771 hss.satisfiable_signals);
691 772
692 static_cast<int32_t*>(write_ptr)[0] = 123; 773 static_cast<int32_t*>(write_ptr)[0] = 123;
693 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( 774 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(
694 static_cast<uint32_t>(1u * sizeof(int32_t)))); 775 static_cast<uint32_t>(1u * sizeof(int32_t))));
695 776
696 // It should be writable again. 777 // It should be writable again.
697 waiter.Init(); 778 waiter.Init();
698 hss = HandleSignalsState(); 779 hss = HandleSignalsState();
699 EXPECT_EQ( 780 EXPECT_EQ(
700 MOJO_RESULT_ALREADY_EXISTS, 781 MOJO_RESULT_ALREADY_EXISTS,
701 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss)); 782 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss));
702 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 783 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
703 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 784 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
785 hss.satisfiable_signals);
704 786
705 // And readable. 787 // And readable.
706 waiter.Init(); 788 waiter.Init();
707 hss = HandleSignalsState(); 789 hss = HandleSignalsState();
708 EXPECT_EQ( 790 EXPECT_EQ(
709 MOJO_RESULT_ALREADY_EXISTS, 791 MOJO_RESULT_ALREADY_EXISTS,
710 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 4, &hss)); 792 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 4, &hss));
711 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 793 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
712 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 794 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
795 hss.satisfiable_signals);
713 796
714 // Start another two-phase write and check that it's readable even in the 797 // Start another two-phase write and check that it's readable even in the
715 // middle of it. 798 // middle of it.
716 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); 799 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
717 write_ptr = nullptr; 800 write_ptr = nullptr;
718 EXPECT_EQ(MOJO_RESULT_OK, 801 EXPECT_EQ(MOJO_RESULT_OK,
719 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), 802 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
720 MakeUserPointer(&num_bytes), false)); 803 MakeUserPointer(&num_bytes), false));
721 EXPECT_TRUE(write_ptr); 804 EXPECT_TRUE(write_ptr);
722 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); 805 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
723 806
724 // It should be readable. 807 // It should be readable.
725 waiter.Init(); 808 waiter.Init();
726 hss = HandleSignalsState(); 809 hss = HandleSignalsState();
727 EXPECT_EQ( 810 EXPECT_EQ(
728 MOJO_RESULT_ALREADY_EXISTS, 811 MOJO_RESULT_ALREADY_EXISTS,
729 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); 812 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss));
730 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 813 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
731 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 814 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
815 hss.satisfiable_signals);
732 816
733 // End the two-phase write without writing anything. 817 // End the two-phase write without writing anything.
734 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u)); 818 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u));
735 819
736 // Start a two-phase read. 820 // Start a two-phase read.
737 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); 821 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
738 const void* read_ptr = nullptr; 822 const void* read_ptr = nullptr;
739 EXPECT_EQ(MOJO_RESULT_OK, 823 EXPECT_EQ(MOJO_RESULT_OK,
740 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), 824 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr),
741 MakeUserPointer(&num_bytes), false)); 825 MakeUserPointer(&num_bytes), false));
742 EXPECT_TRUE(read_ptr); 826 EXPECT_TRUE(read_ptr);
743 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes); 827 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes);
744 828
745 // At this point, it should still be writable. 829 // At this point, it should still be writable.
746 waiter.Init(); 830 waiter.Init();
747 hss = HandleSignalsState(); 831 hss = HandleSignalsState();
748 EXPECT_EQ( 832 EXPECT_EQ(
749 MOJO_RESULT_ALREADY_EXISTS, 833 MOJO_RESULT_ALREADY_EXISTS,
750 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); 834 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss));
751 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 835 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
752 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 836 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
837 hss.satisfiable_signals);
753 838
754 // But not readable. 839 // But not readable.
755 waiter.Init(); 840 waiter.Init();
756 ASSERT_EQ( 841 ASSERT_EQ(
757 MOJO_RESULT_OK, 842 MOJO_RESULT_OK,
758 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr)); 843 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr));
759 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 844 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
760 hss = HandleSignalsState(); 845 hss = HandleSignalsState();
761 dp->ConsumerRemoveWaiter(&waiter, &hss); 846 dp->ConsumerRemoveWaiter(&waiter, &hss);
762 EXPECT_EQ(0u, hss.satisfied_signals); 847 EXPECT_EQ(0u, hss.satisfied_signals);
763 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 848 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
849 hss.satisfiable_signals);
764 850
765 // End the two-phase read without reading anything. 851 // End the two-phase read without reading anything.
766 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u)); 852 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u));
767 853
768 // It should be readable again. 854 // It should be readable again.
769 waiter.Init(); 855 waiter.Init();
770 hss = HandleSignalsState(); 856 hss = HandleSignalsState();
771 EXPECT_EQ( 857 EXPECT_EQ(
772 MOJO_RESULT_ALREADY_EXISTS, 858 MOJO_RESULT_ALREADY_EXISTS,
773 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 8, &hss)); 859 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 8, &hss));
774 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 860 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
775 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 861 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
862 hss.satisfiable_signals);
776 863
777 dp->ProducerClose(); 864 dp->ProducerClose();
778 dp->ConsumerClose(); 865 dp->ConsumerClose();
779 } 866 }
780 867
781 // Test that a "may discard" data pipe is writable even when it's full. 868 // Test that a "may discard" data pipe is writable even when it's full.
782 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { 869 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) {
783 const MojoCreateDataPipeOptions options = { 870 const MojoCreateDataPipeOptions options = {
784 kSizeOfOptions, // |struct_size|. 871 kSizeOfOptions, // |struct_size|.
785 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. 872 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|.
786 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. 873 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|.
787 1 * sizeof(int32_t) // |capacity_num_bytes|. 874 1 * sizeof(int32_t) // |capacity_num_bytes|.
788 }; 875 };
789 MojoCreateDataPipeOptions validated_options = {0}; 876 MojoCreateDataPipeOptions validated_options = {0};
790 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( 877 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions(
791 MakeUserPointer(&options), &validated_options)); 878 MakeUserPointer(&options), &validated_options));
792 879
793 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); 880 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
794 Waiter waiter; 881 Waiter waiter;
795 HandleSignalsState hss; 882 HandleSignalsState hss;
796 883
797 // Writable. 884 // Writable.
798 waiter.Init(); 885 waiter.Init();
799 hss = HandleSignalsState(); 886 hss = HandleSignalsState();
800 EXPECT_EQ( 887 EXPECT_EQ(
801 MOJO_RESULT_ALREADY_EXISTS, 888 MOJO_RESULT_ALREADY_EXISTS,
802 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); 889 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss));
803 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 890 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
804 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 891 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
892 hss.satisfiable_signals);
805 893
806 // Not readable. 894 // Not readable.
807 waiter.Init(); 895 waiter.Init();
808 ASSERT_EQ( 896 ASSERT_EQ(
809 MOJO_RESULT_OK, 897 MOJO_RESULT_OK,
810 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); 898 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr));
811 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 899 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
812 hss = HandleSignalsState(); 900 hss = HandleSignalsState();
813 dp->ConsumerRemoveWaiter(&waiter, &hss); 901 dp->ConsumerRemoveWaiter(&waiter, &hss);
814 EXPECT_EQ(0u, hss.satisfied_signals); 902 EXPECT_EQ(0u, hss.satisfied_signals);
815 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 903 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
904 hss.satisfiable_signals);
816 905
817 uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t)); 906 uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t));
818 int32_t element = 123; 907 int32_t element = 123;
819 EXPECT_EQ(MOJO_RESULT_OK, 908 EXPECT_EQ(MOJO_RESULT_OK,
820 dp->ProducerWriteData(UserPointer<const void>(&element), 909 dp->ProducerWriteData(UserPointer<const void>(&element),
821 MakeUserPointer(&num_bytes), false)); 910 MakeUserPointer(&num_bytes), false));
822 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); 911 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes);
823 912
824 // Still writable (even though it's full). 913 // Still writable (even though it's full).
825 waiter.Init(); 914 waiter.Init();
826 hss = HandleSignalsState(); 915 hss = HandleSignalsState();
827 EXPECT_EQ( 916 EXPECT_EQ(
828 MOJO_RESULT_ALREADY_EXISTS, 917 MOJO_RESULT_ALREADY_EXISTS,
829 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 2, &hss)); 918 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 2, &hss));
830 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 919 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
831 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 920 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
921 hss.satisfiable_signals);
832 922
833 // Now readable. 923 // Now readable.
834 waiter.Init(); 924 waiter.Init();
835 hss = HandleSignalsState(); 925 hss = HandleSignalsState();
836 EXPECT_EQ( 926 EXPECT_EQ(
837 MOJO_RESULT_ALREADY_EXISTS, 927 MOJO_RESULT_ALREADY_EXISTS,
838 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); 928 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss));
839 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 929 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
840 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 930 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
931 hss.satisfiable_signals);
841 932
842 // Overwrite that element. 933 // Overwrite that element.
843 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); 934 num_bytes = static_cast<uint32_t>(sizeof(int32_t));
844 element = 456; 935 element = 456;
845 EXPECT_EQ(MOJO_RESULT_OK, 936 EXPECT_EQ(MOJO_RESULT_OK,
846 dp->ProducerWriteData(UserPointer<const void>(&element), 937 dp->ProducerWriteData(UserPointer<const void>(&element),
847 MakeUserPointer(&num_bytes), false)); 938 MakeUserPointer(&num_bytes), false));
848 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); 939 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes);
849 940
850 // Still writable. 941 // Still writable.
851 waiter.Init(); 942 waiter.Init();
852 hss = HandleSignalsState(); 943 hss = HandleSignalsState();
853 EXPECT_EQ( 944 EXPECT_EQ(
854 MOJO_RESULT_ALREADY_EXISTS, 945 MOJO_RESULT_ALREADY_EXISTS,
855 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); 946 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss));
856 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 947 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
857 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 948 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
949 hss.satisfiable_signals);
858 950
859 // And still readable. 951 // And still readable.
860 waiter.Init(); 952 waiter.Init();
861 hss = HandleSignalsState(); 953 hss = HandleSignalsState();
862 EXPECT_EQ( 954 EXPECT_EQ(
863 MOJO_RESULT_ALREADY_EXISTS, 955 MOJO_RESULT_ALREADY_EXISTS,
864 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); 956 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss));
865 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 957 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
866 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 958 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
959 hss.satisfiable_signals);
867 960
868 // Read that element. 961 // Read that element.
869 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); 962 num_bytes = static_cast<uint32_t>(sizeof(int32_t));
870 element = 0; 963 element = 0;
871 EXPECT_EQ(MOJO_RESULT_OK, 964 EXPECT_EQ(MOJO_RESULT_OK,
872 dp->ConsumerReadData(UserPointer<void>(&element), 965 dp->ConsumerReadData(UserPointer<void>(&element),
873 MakeUserPointer(&num_bytes), false, false)); 966 MakeUserPointer(&num_bytes), false, false));
874 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); 967 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes);
875 EXPECT_EQ(456, element); 968 EXPECT_EQ(456, element);
876 969
877 // Still writable. 970 // Still writable.
878 waiter.Init(); 971 waiter.Init();
879 hss = HandleSignalsState(); 972 hss = HandleSignalsState();
880 EXPECT_EQ( 973 EXPECT_EQ(
881 MOJO_RESULT_ALREADY_EXISTS, 974 MOJO_RESULT_ALREADY_EXISTS,
882 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); 975 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss));
883 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 976 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
884 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 977 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
978 hss.satisfiable_signals);
885 979
886 // No longer readable. 980 // No longer readable.
887 waiter.Init(); 981 waiter.Init();
888 ASSERT_EQ( 982 ASSERT_EQ(
889 MOJO_RESULT_OK, 983 MOJO_RESULT_OK,
890 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr)); 984 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr));
891 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 985 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
892 hss = HandleSignalsState(); 986 hss = HandleSignalsState();
893 dp->ConsumerRemoveWaiter(&waiter, &hss); 987 dp->ConsumerRemoveWaiter(&waiter, &hss);
894 EXPECT_EQ(0u, hss.satisfied_signals); 988 EXPECT_EQ(0u, hss.satisfied_signals);
895 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 989 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
990 hss.satisfiable_signals);
896 991
897 dp->ProducerClose(); 992 dp->ProducerClose();
898 dp->ConsumerClose(); 993 dp->ConsumerClose();
899 } 994 }
900 995
901 void Seq(int32_t start, size_t count, int32_t* out) { 996 void Seq(int32_t start, size_t count, int32_t* out) {
902 for (size_t i = 0; i < count; i++) 997 for (size_t i = 0; i < count; i++)
903 out[i] = start + static_cast<int32_t>(i); 998 out[i] = start + static_cast<int32_t>(i);
904 } 999 }
905 1000
(...skipping 1061 matching lines...) Expand 10 before | Expand all | Expand 10 after
1967 // End reading. 2062 // End reading.
1968 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); 2063 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u));
1969 2064
1970 dp->ProducerClose(); 2065 dp->ProducerClose();
1971 dp->ConsumerClose(); 2066 dp->ConsumerClose();
1972 } 2067 }
1973 2068
1974 } // namespace 2069 } // namespace
1975 } // namespace system 2070 } // namespace system
1976 } // namespace mojo 2071 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/local_data_pipe.cc ('k') | mojo/edk/system/local_message_pipe_endpoint.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698