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

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: 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 "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_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_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_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_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_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_CLOSED, hss.satisfied_signals);
385 EXPECT_EQ(0u, hss.satisfiable_signals); 390 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals);
386 391
387 dp->ProducerClose(); 392 dp->ProducerClose();
388 } 393 }
389 394
390 TEST(LocalDataPipeTest, BasicConsumerWaiting) { 395 TEST(LocalDataPipeTest, BasicConsumerWaiting) {
391 const MojoCreateDataPipeOptions options = { 396 const MojoCreateDataPipeOptions options = {
392 kSizeOfOptions, // |struct_size|. 397 kSizeOfOptions, // |struct_size|.
393 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. 398 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
394 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. 399 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|.
395 1000 * sizeof(int32_t) // |capacity_num_bytes|. 400 1000 * sizeof(int32_t) // |capacity_num_bytes|.
396 }; 401 };
397 MojoCreateDataPipeOptions validated_options = {0}; 402 MojoCreateDataPipeOptions validated_options = {0};
398 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( 403 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions(
399 MakeUserPointer(&options), &validated_options)); 404 MakeUserPointer(&options), &validated_options));
400 405
401 { 406 {
402 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); 407 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
403 Waiter waiter; 408 Waiter waiter;
404 uint32_t context = 0; 409 uint32_t context = 0;
405 HandleSignalsState hss; 410 HandleSignalsState hss;
406 411
407 // Never writable. 412 // Never writable.
408 waiter.Init(); 413 waiter.Init();
409 hss = HandleSignalsState(); 414 hss = HandleSignalsState();
410 EXPECT_EQ( 415 EXPECT_EQ(
411 MOJO_RESULT_FAILED_PRECONDITION, 416 MOJO_RESULT_FAILED_PRECONDITION,
412 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, &hss)); 417 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12, &hss));
413 EXPECT_EQ(0u, hss.satisfied_signals); 418 EXPECT_EQ(0u, hss.satisfied_signals);
414 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 419 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
420 hss.satisfiable_signals);
415 421
416 // Not yet readable. 422 // Not yet readable.
417 waiter.Init(); 423 waiter.Init();
418 ASSERT_EQ(MOJO_RESULT_OK, 424 ASSERT_EQ(MOJO_RESULT_OK,
419 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, 425 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34,
420 nullptr)); 426 nullptr));
421 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 427 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
422 hss = HandleSignalsState(); 428 hss = HandleSignalsState();
423 dp->ConsumerRemoveWaiter(&waiter, &hss); 429 dp->ConsumerRemoveWaiter(&waiter, &hss);
424 EXPECT_EQ(0u, hss.satisfied_signals); 430 EXPECT_EQ(0u, hss.satisfied_signals);
425 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 431 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
432 hss.satisfiable_signals);
426 433
427 // Write two elements. 434 // Write two elements.
428 int32_t elements[2] = {123, 456}; 435 int32_t elements[2] = {123, 456};
429 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); 436 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
430 EXPECT_EQ(MOJO_RESULT_OK, 437 EXPECT_EQ(MOJO_RESULT_OK,
431 dp->ProducerWriteData(UserPointer<const void>(elements), 438 dp->ProducerWriteData(UserPointer<const void>(elements),
432 MakeUserPointer(&num_bytes), true)); 439 MakeUserPointer(&num_bytes), true));
433 440
434 // Should already be readable. 441 // Should already be readable.
435 waiter.Init(); 442 waiter.Init();
436 hss = HandleSignalsState(); 443 hss = HandleSignalsState();
437 EXPECT_EQ( 444 EXPECT_EQ(
438 MOJO_RESULT_ALREADY_EXISTS, 445 MOJO_RESULT_ALREADY_EXISTS,
439 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, &hss)); 446 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, &hss));
440 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 447 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
441 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 448 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
449 hss.satisfiable_signals);
442 450
443 // Discard one element. 451 // Discard one element.
444 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 452 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
445 EXPECT_EQ(MOJO_RESULT_OK, 453 EXPECT_EQ(MOJO_RESULT_OK,
446 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); 454 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true));
447 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 455 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
448 456
449 // Should still be readable. 457 // Should still be readable.
450 waiter.Init(); 458 waiter.Init();
451 hss = HandleSignalsState(); 459 hss = HandleSignalsState();
452 EXPECT_EQ( 460 EXPECT_EQ(
453 MOJO_RESULT_ALREADY_EXISTS, 461 MOJO_RESULT_ALREADY_EXISTS,
454 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); 462 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss));
455 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 463 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
456 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 464 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
465 hss.satisfiable_signals);
457 466
458 // Peek one element. 467 // Peek one element.
459 elements[0] = -1; 468 elements[0] = -1;
460 elements[1] = -1; 469 elements[1] = -1;
461 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 470 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
462 EXPECT_EQ(MOJO_RESULT_OK, 471 EXPECT_EQ(MOJO_RESULT_OK,
463 dp->ConsumerReadData(UserPointer<void>(elements), 472 dp->ConsumerReadData(UserPointer<void>(elements),
464 MakeUserPointer(&num_bytes), true, true)); 473 MakeUserPointer(&num_bytes), true, true));
465 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 474 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
466 EXPECT_EQ(456, elements[0]); 475 EXPECT_EQ(456, elements[0]);
467 EXPECT_EQ(-1, elements[1]); 476 EXPECT_EQ(-1, elements[1]);
468 477
469 // Should still be readable. 478 // Should still be readable.
470 waiter.Init(); 479 waiter.Init();
471 hss = HandleSignalsState(); 480 hss = HandleSignalsState();
472 EXPECT_EQ( 481 EXPECT_EQ(
473 MOJO_RESULT_ALREADY_EXISTS, 482 MOJO_RESULT_ALREADY_EXISTS,
474 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); 483 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss));
475 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 484 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
476 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 485 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
486 hss.satisfiable_signals);
477 487
478 // Read one element. 488 // Read one element.
479 elements[0] = -1; 489 elements[0] = -1;
480 elements[1] = -1; 490 elements[1] = -1;
481 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 491 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
482 EXPECT_EQ(MOJO_RESULT_OK, 492 EXPECT_EQ(MOJO_RESULT_OK,
483 dp->ConsumerReadData(UserPointer<void>(elements), 493 dp->ConsumerReadData(UserPointer<void>(elements),
484 MakeUserPointer(&num_bytes), true, false)); 494 MakeUserPointer(&num_bytes), true, false));
485 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 495 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
486 EXPECT_EQ(456, elements[0]); 496 EXPECT_EQ(456, elements[0]);
(...skipping 12 matching lines...) Expand all
499 EXPECT_EQ(MOJO_RESULT_OK, 509 EXPECT_EQ(MOJO_RESULT_OK,
500 dp->ProducerWriteData(UserPointer<const void>(elements), 510 dp->ProducerWriteData(UserPointer<const void>(elements),
501 MakeUserPointer(&num_bytes), true)); 511 MakeUserPointer(&num_bytes), true));
502 512
503 // Waiting should now succeed. 513 // Waiting should now succeed.
504 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); 514 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context));
505 EXPECT_EQ(90u, context); 515 EXPECT_EQ(90u, context);
506 hss = HandleSignalsState(); 516 hss = HandleSignalsState();
507 dp->ConsumerRemoveWaiter(&waiter, &hss); 517 dp->ConsumerRemoveWaiter(&waiter, &hss);
508 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 518 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
509 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 519 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
520 hss.satisfiable_signals);
510 521
511 // Close the producer. 522 // Close the producer.
512 dp->ProducerClose(); 523 dp->ProducerClose();
513 524
514 // Should still be readable. 525 // Should still be readable.
515 waiter.Init(); 526 waiter.Init();
516 hss = HandleSignalsState(); 527 hss = HandleSignalsState();
517 EXPECT_EQ( 528 EXPECT_EQ(
518 MOJO_RESULT_ALREADY_EXISTS, 529 MOJO_RESULT_ALREADY_EXISTS,
519 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); 530 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss));
520 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 531 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
521 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 532 hss.satisfied_signals);
533 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
534 hss.satisfiable_signals);
522 535
523 // Read one element. 536 // Read one element.
524 elements[0] = -1; 537 elements[0] = -1;
525 elements[1] = -1; 538 elements[1] = -1;
526 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 539 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
527 EXPECT_EQ(MOJO_RESULT_OK, 540 EXPECT_EQ(MOJO_RESULT_OK,
528 dp->ConsumerReadData(UserPointer<void>(elements), 541 dp->ConsumerReadData(UserPointer<void>(elements),
529 MakeUserPointer(&num_bytes), true, false)); 542 MakeUserPointer(&num_bytes), true, false));
530 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 543 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
531 EXPECT_EQ(789, elements[0]); 544 EXPECT_EQ(789, elements[0]);
532 EXPECT_EQ(-1, elements[1]); 545 EXPECT_EQ(-1, elements[1]);
533 546
534 // Should be never-readable. 547 // Should be never-readable.
535 waiter.Init(); 548 waiter.Init();
536 hss = HandleSignalsState(); 549 hss = HandleSignalsState();
537 EXPECT_EQ( 550 EXPECT_EQ(
538 MOJO_RESULT_FAILED_PRECONDITION, 551 MOJO_RESULT_FAILED_PRECONDITION,
539 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); 552 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss));
540 EXPECT_EQ(0u, hss.satisfied_signals); 553 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals);
541 EXPECT_EQ(0u, hss.satisfiable_signals); 554 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals);
542 555
543 dp->ConsumerClose(); 556 dp->ConsumerClose();
544 } 557 }
545 558
546 // Test with two-phase APIs and closing the producer with an active consumer 559 // Test with two-phase APIs and closing the producer with an active consumer
547 // waiter. 560 // waiter.
548 { 561 {
549 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); 562 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
550 Waiter waiter; 563 Waiter waiter;
551 uint32_t context = 0; 564 uint32_t context = 0;
(...skipping 15 matching lines...) Expand all
567 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(static_cast<uint32_t>( 580 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(static_cast<uint32_t>(
568 2u * sizeof(elements[0])))); 581 2u * sizeof(elements[0]))));
569 582
570 // Should already be readable. 583 // Should already be readable.
571 waiter.Init(); 584 waiter.Init();
572 hss = HandleSignalsState(); 585 hss = HandleSignalsState();
573 EXPECT_EQ( 586 EXPECT_EQ(
574 MOJO_RESULT_ALREADY_EXISTS, 587 MOJO_RESULT_ALREADY_EXISTS,
575 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss)); 588 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12, &hss));
576 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 589 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
577 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 590 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
591 hss.satisfiable_signals);
578 592
579 // Read one element. 593 // Read one element.
580 // Request two in all-or-none mode, but only read one. 594 // Request two in all-or-none mode, but only read one.
581 const void* read_buffer = nullptr; 595 const void* read_buffer = nullptr;
582 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); 596 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
583 EXPECT_EQ(MOJO_RESULT_OK, 597 EXPECT_EQ(MOJO_RESULT_OK,
584 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer), 598 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer),
585 MakeUserPointer(&num_bytes), true)); 599 MakeUserPointer(&num_bytes), true));
586 EXPECT_TRUE(read_buffer); 600 EXPECT_TRUE(read_buffer);
587 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); 601 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); 602 const int32_t* read_elements = static_cast<const int32_t*>(read_buffer);
589 EXPECT_EQ(123, read_elements[0]); 603 EXPECT_EQ(123, read_elements[0]);
590 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>( 604 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>(
591 1u * sizeof(elements[0])))); 605 1u * sizeof(elements[0]))));
592 606
593 // Should still be readable. 607 // Should still be readable.
594 waiter.Init(); 608 waiter.Init();
595 hss = HandleSignalsState(); 609 hss = HandleSignalsState();
596 EXPECT_EQ( 610 EXPECT_EQ(
597 MOJO_RESULT_ALREADY_EXISTS, 611 MOJO_RESULT_ALREADY_EXISTS,
598 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss)); 612 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34, &hss));
599 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 613 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
600 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 614 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
615 hss.satisfiable_signals);
601 616
602 // Read one element. 617 // Read one element.
603 // Request three, but not in all-or-none mode. 618 // Request three, but not in all-or-none mode.
604 read_buffer = nullptr; 619 read_buffer = nullptr;
605 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); 620 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
606 EXPECT_EQ(MOJO_RESULT_OK, 621 EXPECT_EQ(MOJO_RESULT_OK,
607 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer), 622 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer),
608 MakeUserPointer(&num_bytes), false)); 623 MakeUserPointer(&num_bytes), false));
609 EXPECT_TRUE(read_buffer); 624 EXPECT_TRUE(read_buffer);
610 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 625 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
611 read_elements = static_cast<const int32_t*>(read_buffer); 626 read_elements = static_cast<const int32_t*>(read_buffer);
612 EXPECT_EQ(456, read_elements[0]); 627 EXPECT_EQ(456, read_elements[0]);
613 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>( 628 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(static_cast<uint32_t>(
614 1u * sizeof(elements[0])))); 629 1u * sizeof(elements[0]))));
615 630
616 // Adding a waiter should now succeed. 631 // Adding a waiter should now succeed.
617 waiter.Init(); 632 waiter.Init();
618 ASSERT_EQ(MOJO_RESULT_OK, 633 ASSERT_EQ(MOJO_RESULT_OK,
619 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56, 634 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56,
620 nullptr)); 635 nullptr));
621 636
622 // Close the producer. 637 // Close the producer.
623 dp->ProducerClose(); 638 dp->ProducerClose();
624 639
625 // Should be never-readable. 640 // Should be never-readable.
626 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context)); 641 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, waiter.Wait(1000, &context));
627 EXPECT_EQ(56u, context); 642 EXPECT_EQ(56u, context);
628 hss = HandleSignalsState(); 643 hss = HandleSignalsState();
629 dp->ConsumerRemoveWaiter(&waiter, &hss); 644 dp->ConsumerRemoveWaiter(&waiter, &hss);
630 EXPECT_EQ(0u, hss.satisfied_signals); 645 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfied_signals);
631 EXPECT_EQ(0u, hss.satisfiable_signals); 646 EXPECT_EQ(MOJO_HANDLE_SIGNAL_CLOSED, hss.satisfiable_signals);
632 647
633 dp->ConsumerClose(); 648 dp->ConsumerClose();
634 } 649 }
635 } 650 }
636 651
637 // Tests that data pipes aren't writable/readable during two-phase writes/reads. 652 // Tests that data pipes aren't writable/readable during two-phase writes/reads.
638 TEST(LocalDataPipeTest, BasicTwoPhaseWaiting) { 653 TEST(LocalDataPipeTest, BasicTwoPhaseWaiting) {
639 const MojoCreateDataPipeOptions options = { 654 const MojoCreateDataPipeOptions options = {
640 kSizeOfOptions, // |struct_size|. 655 kSizeOfOptions, // |struct_size|.
641 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. 656 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
642 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. 657 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|.
643 1000 * sizeof(int32_t) // |capacity_num_bytes|. 658 1000 * sizeof(int32_t) // |capacity_num_bytes|.
644 }; 659 };
645 MojoCreateDataPipeOptions validated_options = {0}; 660 MojoCreateDataPipeOptions validated_options = {0};
646 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( 661 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions(
647 MakeUserPointer(&options), &validated_options)); 662 MakeUserPointer(&options), &validated_options));
648 663
649 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); 664 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
650 Waiter waiter; 665 Waiter waiter;
651 HandleSignalsState hss; 666 HandleSignalsState hss;
652 667
653 // It should be writable. 668 // It should be writable.
654 waiter.Init(); 669 waiter.Init();
655 hss = HandleSignalsState(); 670 hss = HandleSignalsState();
656 EXPECT_EQ( 671 EXPECT_EQ(
657 MOJO_RESULT_ALREADY_EXISTS, 672 MOJO_RESULT_ALREADY_EXISTS,
658 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); 673 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss));
659 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 674 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
660 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 675 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED,
676 hss.satisfiable_signals);
661 677
662 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); 678 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
663 void* write_ptr = nullptr; 679 void* write_ptr = nullptr;
664 EXPECT_EQ(MOJO_RESULT_OK, 680 EXPECT_EQ(MOJO_RESULT_OK,
665 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), 681 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
666 MakeUserPointer(&num_bytes), false)); 682 MakeUserPointer(&num_bytes), false));
667 EXPECT_TRUE(write_ptr); 683 EXPECT_TRUE(write_ptr);
668 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); 684 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
669 685
670 // At this point, it shouldn't be writable. 686 // At this point, it shouldn't be writable.
671 waiter.Init(); 687 waiter.Init();
672 ASSERT_EQ( 688 ASSERT_EQ(
673 MOJO_RESULT_OK, 689 MOJO_RESULT_OK,
674 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr)); 690 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, nullptr));
675 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 691 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
676 hss = HandleSignalsState(); 692 hss = HandleSignalsState();
677 dp->ProducerRemoveWaiter(&waiter, &hss); 693 dp->ProducerRemoveWaiter(&waiter, &hss);
678 EXPECT_EQ(0u, hss.satisfied_signals); 694 EXPECT_EQ(0u, hss.satisfied_signals);
679 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 695 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED,
696 hss.satisfiable_signals);
680 697
681 // It shouldn't be readable yet either. 698 // It shouldn't be readable yet either.
682 waiter.Init(); 699 waiter.Init();
683 ASSERT_EQ( 700 ASSERT_EQ(
684 MOJO_RESULT_OK, 701 MOJO_RESULT_OK,
685 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, nullptr)); 702 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 2, nullptr));
686 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 703 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
687 hss = HandleSignalsState(); 704 hss = HandleSignalsState();
688 dp->ConsumerRemoveWaiter(&waiter, &hss); 705 dp->ConsumerRemoveWaiter(&waiter, &hss);
689 EXPECT_EQ(0u, hss.satisfied_signals); 706 EXPECT_EQ(0u, hss.satisfied_signals);
690 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 707 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
708 hss.satisfiable_signals);
691 709
692 static_cast<int32_t*>(write_ptr)[0] = 123; 710 static_cast<int32_t*>(write_ptr)[0] = 123;
693 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( 711 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(
694 static_cast<uint32_t>(1u * sizeof(int32_t)))); 712 static_cast<uint32_t>(1u * sizeof(int32_t))));
695 713
696 // It should be writable again. 714 // It should be writable again.
697 waiter.Init(); 715 waiter.Init();
698 hss = HandleSignalsState(); 716 hss = HandleSignalsState();
699 EXPECT_EQ( 717 EXPECT_EQ(
700 MOJO_RESULT_ALREADY_EXISTS, 718 MOJO_RESULT_ALREADY_EXISTS,
701 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss)); 719 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, &hss));
702 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 720 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
703 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 721 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED,
722 hss.satisfiable_signals);
704 723
705 // And readable. 724 // And readable.
706 waiter.Init(); 725 waiter.Init();
707 hss = HandleSignalsState(); 726 hss = HandleSignalsState();
708 EXPECT_EQ( 727 EXPECT_EQ(
709 MOJO_RESULT_ALREADY_EXISTS, 728 MOJO_RESULT_ALREADY_EXISTS,
710 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 4, &hss)); 729 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 4, &hss));
711 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 730 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
712 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 731 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
732 hss.satisfiable_signals);
713 733
714 // Start another two-phase write and check that it's readable even in the 734 // Start another two-phase write and check that it's readable even in the
715 // middle of it. 735 // middle of it.
716 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); 736 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
717 write_ptr = nullptr; 737 write_ptr = nullptr;
718 EXPECT_EQ(MOJO_RESULT_OK, 738 EXPECT_EQ(MOJO_RESULT_OK,
719 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), 739 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
720 MakeUserPointer(&num_bytes), false)); 740 MakeUserPointer(&num_bytes), false));
721 EXPECT_TRUE(write_ptr); 741 EXPECT_TRUE(write_ptr);
722 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); 742 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
723 743
724 // It should be readable. 744 // It should be readable.
725 waiter.Init(); 745 waiter.Init();
726 hss = HandleSignalsState(); 746 hss = HandleSignalsState();
727 EXPECT_EQ( 747 EXPECT_EQ(
728 MOJO_RESULT_ALREADY_EXISTS, 748 MOJO_RESULT_ALREADY_EXISTS,
729 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); 749 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss));
730 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 750 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
731 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 751 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
752 hss.satisfiable_signals);
732 753
733 // End the two-phase write without writing anything. 754 // End the two-phase write without writing anything.
734 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u)); 755 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(0u));
735 756
736 // Start a two-phase read. 757 // Start a two-phase read.
737 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); 758 num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
738 const void* read_ptr = nullptr; 759 const void* read_ptr = nullptr;
739 EXPECT_EQ(MOJO_RESULT_OK, 760 EXPECT_EQ(MOJO_RESULT_OK,
740 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), 761 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr),
741 MakeUserPointer(&num_bytes), false)); 762 MakeUserPointer(&num_bytes), false));
742 EXPECT_TRUE(read_ptr); 763 EXPECT_TRUE(read_ptr);
743 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes); 764 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes);
744 765
745 // At this point, it should still be writable. 766 // At this point, it should still be writable.
746 waiter.Init(); 767 waiter.Init();
747 hss = HandleSignalsState(); 768 hss = HandleSignalsState();
748 EXPECT_EQ( 769 EXPECT_EQ(
749 MOJO_RESULT_ALREADY_EXISTS, 770 MOJO_RESULT_ALREADY_EXISTS,
750 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); 771 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss));
751 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 772 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
752 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 773 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED,
774 hss.satisfiable_signals);
753 775
754 // But not readable. 776 // But not readable.
755 waiter.Init(); 777 waiter.Init();
756 ASSERT_EQ( 778 ASSERT_EQ(
757 MOJO_RESULT_OK, 779 MOJO_RESULT_OK,
758 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr)); 780 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr));
759 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 781 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
760 hss = HandleSignalsState(); 782 hss = HandleSignalsState();
761 dp->ConsumerRemoveWaiter(&waiter, &hss); 783 dp->ConsumerRemoveWaiter(&waiter, &hss);
762 EXPECT_EQ(0u, hss.satisfied_signals); 784 EXPECT_EQ(0u, hss.satisfied_signals);
763 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 785 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
786 hss.satisfiable_signals);
764 787
765 // End the two-phase read without reading anything. 788 // End the two-phase read without reading anything.
766 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u)); 789 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u));
767 790
768 // It should be readable again. 791 // It should be readable again.
769 waiter.Init(); 792 waiter.Init();
770 hss = HandleSignalsState(); 793 hss = HandleSignalsState();
771 EXPECT_EQ( 794 EXPECT_EQ(
772 MOJO_RESULT_ALREADY_EXISTS, 795 MOJO_RESULT_ALREADY_EXISTS,
773 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 8, &hss)); 796 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 8, &hss));
774 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 797 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
775 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 798 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
799 hss.satisfiable_signals);
776 800
777 dp->ProducerClose(); 801 dp->ProducerClose();
778 dp->ConsumerClose(); 802 dp->ConsumerClose();
779 } 803 }
780 804
781 // Test that a "may discard" data pipe is writable even when it's full. 805 // Test that a "may discard" data pipe is writable even when it's full.
782 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { 806 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) {
783 const MojoCreateDataPipeOptions options = { 807 const MojoCreateDataPipeOptions options = {
784 kSizeOfOptions, // |struct_size|. 808 kSizeOfOptions, // |struct_size|.
785 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. 809 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|.
786 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. 810 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|.
787 1 * sizeof(int32_t) // |capacity_num_bytes|. 811 1 * sizeof(int32_t) // |capacity_num_bytes|.
788 }; 812 };
789 MojoCreateDataPipeOptions validated_options = {0}; 813 MojoCreateDataPipeOptions validated_options = {0};
790 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions( 814 EXPECT_EQ(MOJO_RESULT_OK, DataPipe::ValidateCreateOptions(
791 MakeUserPointer(&options), &validated_options)); 815 MakeUserPointer(&options), &validated_options));
792 816
793 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); 817 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options));
794 Waiter waiter; 818 Waiter waiter;
795 HandleSignalsState hss; 819 HandleSignalsState hss;
796 820
797 // Writable. 821 // Writable.
798 waiter.Init(); 822 waiter.Init();
799 hss = HandleSignalsState(); 823 hss = HandleSignalsState();
800 EXPECT_EQ( 824 EXPECT_EQ(
801 MOJO_RESULT_ALREADY_EXISTS, 825 MOJO_RESULT_ALREADY_EXISTS,
802 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); 826 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss));
803 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 827 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
804 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 828 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED,
829 hss.satisfiable_signals);
805 830
806 // Not readable. 831 // Not readable.
807 waiter.Init(); 832 waiter.Init();
808 ASSERT_EQ( 833 ASSERT_EQ(
809 MOJO_RESULT_OK, 834 MOJO_RESULT_OK,
810 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr)); 835 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 1, nullptr));
811 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 836 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
812 hss = HandleSignalsState(); 837 hss = HandleSignalsState();
813 dp->ConsumerRemoveWaiter(&waiter, &hss); 838 dp->ConsumerRemoveWaiter(&waiter, &hss);
814 EXPECT_EQ(0u, hss.satisfied_signals); 839 EXPECT_EQ(0u, hss.satisfied_signals);
815 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 840 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
841 hss.satisfiable_signals);
816 842
817 uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t)); 843 uint32_t num_bytes = static_cast<uint32_t>(sizeof(int32_t));
818 int32_t element = 123; 844 int32_t element = 123;
819 EXPECT_EQ(MOJO_RESULT_OK, 845 EXPECT_EQ(MOJO_RESULT_OK,
820 dp->ProducerWriteData(UserPointer<const void>(&element), 846 dp->ProducerWriteData(UserPointer<const void>(&element),
821 MakeUserPointer(&num_bytes), false)); 847 MakeUserPointer(&num_bytes), false));
822 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); 848 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes);
823 849
824 // Still writable (even though it's full). 850 // Still writable (even though it's full).
825 waiter.Init(); 851 waiter.Init();
826 hss = HandleSignalsState(); 852 hss = HandleSignalsState();
827 EXPECT_EQ( 853 EXPECT_EQ(
828 MOJO_RESULT_ALREADY_EXISTS, 854 MOJO_RESULT_ALREADY_EXISTS,
829 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 2, &hss)); 855 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 2, &hss));
830 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 856 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
831 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 857 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED,
858 hss.satisfiable_signals);
832 859
833 // Now readable. 860 // Now readable.
834 waiter.Init(); 861 waiter.Init();
835 hss = HandleSignalsState(); 862 hss = HandleSignalsState();
836 EXPECT_EQ( 863 EXPECT_EQ(
837 MOJO_RESULT_ALREADY_EXISTS, 864 MOJO_RESULT_ALREADY_EXISTS,
838 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss)); 865 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 3, &hss));
839 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 866 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
840 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 867 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
868 hss.satisfiable_signals);
841 869
842 // Overwrite that element. 870 // Overwrite that element.
843 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); 871 num_bytes = static_cast<uint32_t>(sizeof(int32_t));
844 element = 456; 872 element = 456;
845 EXPECT_EQ(MOJO_RESULT_OK, 873 EXPECT_EQ(MOJO_RESULT_OK,
846 dp->ProducerWriteData(UserPointer<const void>(&element), 874 dp->ProducerWriteData(UserPointer<const void>(&element),
847 MakeUserPointer(&num_bytes), false)); 875 MakeUserPointer(&num_bytes), false));
848 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); 876 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes);
849 877
850 // Still writable. 878 // Still writable.
851 waiter.Init(); 879 waiter.Init();
852 hss = HandleSignalsState(); 880 hss = HandleSignalsState();
853 EXPECT_EQ( 881 EXPECT_EQ(
854 MOJO_RESULT_ALREADY_EXISTS, 882 MOJO_RESULT_ALREADY_EXISTS,
855 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss)); 883 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 4, &hss));
856 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 884 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
857 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 885 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED,
886 hss.satisfiable_signals);
858 887
859 // And still readable. 888 // And still readable.
860 waiter.Init(); 889 waiter.Init();
861 hss = HandleSignalsState(); 890 hss = HandleSignalsState();
862 EXPECT_EQ( 891 EXPECT_EQ(
863 MOJO_RESULT_ALREADY_EXISTS, 892 MOJO_RESULT_ALREADY_EXISTS,
864 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss)); 893 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5, &hss));
865 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 894 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
866 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 895 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
896 hss.satisfiable_signals);
867 897
868 // Read that element. 898 // Read that element.
869 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); 899 num_bytes = static_cast<uint32_t>(sizeof(int32_t));
870 element = 0; 900 element = 0;
871 EXPECT_EQ(MOJO_RESULT_OK, 901 EXPECT_EQ(MOJO_RESULT_OK,
872 dp->ConsumerReadData(UserPointer<void>(&element), 902 dp->ConsumerReadData(UserPointer<void>(&element),
873 MakeUserPointer(&num_bytes), false, false)); 903 MakeUserPointer(&num_bytes), false, false));
874 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); 904 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes);
875 EXPECT_EQ(456, element); 905 EXPECT_EQ(456, element);
876 906
877 // Still writable. 907 // Still writable.
878 waiter.Init(); 908 waiter.Init();
879 hss = HandleSignalsState(); 909 hss = HandleSignalsState();
880 EXPECT_EQ( 910 EXPECT_EQ(
881 MOJO_RESULT_ALREADY_EXISTS, 911 MOJO_RESULT_ALREADY_EXISTS,
882 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss)); 912 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, &hss));
883 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 913 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
884 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); 914 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_CLOSED,
915 hss.satisfiable_signals);
885 916
886 // No longer readable. 917 // No longer readable.
887 waiter.Init(); 918 waiter.Init();
888 ASSERT_EQ( 919 ASSERT_EQ(
889 MOJO_RESULT_OK, 920 MOJO_RESULT_OK,
890 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr)); 921 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 7, nullptr));
891 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); 922 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
892 hss = HandleSignalsState(); 923 hss = HandleSignalsState();
893 dp->ConsumerRemoveWaiter(&waiter, &hss); 924 dp->ConsumerRemoveWaiter(&waiter, &hss);
894 EXPECT_EQ(0u, hss.satisfied_signals); 925 EXPECT_EQ(0u, hss.satisfied_signals);
895 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); 926 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_CLOSED,
927 hss.satisfiable_signals);
896 928
897 dp->ProducerClose(); 929 dp->ProducerClose();
898 dp->ConsumerClose(); 930 dp->ConsumerClose();
899 } 931 }
900 932
901 void Seq(int32_t start, size_t count, int32_t* out) { 933 void Seq(int32_t start, size_t count, int32_t* out) {
902 for (size_t i = 0; i < count; i++) 934 for (size_t i = 0; i < count; i++)
903 out[i] = start + static_cast<int32_t>(i); 935 out[i] = start + static_cast<int32_t>(i);
904 } 936 }
905 937
(...skipping 1061 matching lines...) Expand 10 before | Expand all | Expand 10 after
1967 // End reading. 1999 // End reading.
1968 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); 2000 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u));
1969 2001
1970 dp->ProducerClose(); 2002 dp->ProducerClose();
1971 dp->ConsumerClose(); 2003 dp->ConsumerClose();
1972 } 2004 }
1973 2005
1974 } // namespace 2006 } // namespace
1975 } // namespace system 2007 } // namespace system
1976 } // namespace mojo 2008 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698