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

Side by Side Diff: mojo/public/c/system/tests/core_unittest.cc

Issue 774673003: Added MojoNewWait and MojoNewWaitMany, along with unit tests. (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 // This file tests the C API. 5 // This file tests the C API.
6 6
7 #include "mojo/public/c/system/core.h" 7 #include "mojo/public/c/system/core.h"
8 8
9 #include <string.h> 9 #include <string.h>
10 10
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 // This checks that things actually work in C (not C++). 289 // This checks that things actually work in C (not C++).
290 TEST(CoreTest, MinimalCTest) { 290 TEST(CoreTest, MinimalCTest) {
291 const char* failure = MinimalCTest(); 291 const char* failure = MinimalCTest();
292 EXPECT_TRUE(failure == NULL) << failure; 292 EXPECT_TRUE(failure == NULL) << failure;
293 } 293 }
294 294
295 // TODO(vtl): Add multi-threaded tests. 295 // TODO(vtl): Add multi-threaded tests.
296 296
297 } // namespace 297 } // namespace
298 } // namespace mojo 298 } // namespace mojo
299
300 // TODO(jimbe) Remove code above and rename calls to wait below.
301
302 namespace mojo {
303 namespace new_wait {
304
305 const MojoHandleSignals MOJO_HANDLE_SIGNAL_READWRITABLE =
viettrungluu 2014/12/02 17:24:56 Use C++ style for constants (kSignalReadadableWrit
jimbe 2014/12/02 19:21:19 Done.
306 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE;
307
308 const MojoHandleSignals MOJO_HANDLE_SIGNAL_ALL = MOJO_HANDLE_SIGNAL_READABLE |
viettrungluu 2014/12/02 17:24:56 "
jimbe 2014/12/02 19:21:19 Done.
309 MOJO_HANDLE_SIGNAL_WRITABLE |
310 MOJO_HANDLE_SIGNAL_PEER_CLOSED;
311
312 TEST(NewCoreTest, GetTimeTicksNow) {
viettrungluu 2014/12/02 17:24:56 Don't duplicate tests that you don't change.
jimbe 2014/12/02 19:21:19 As currently implemented, I can safely delete the
313 const MojoTimeTicks start = MojoGetTimeTicksNow();
314 EXPECT_NE(static_cast<MojoTimeTicks>(0), start)
315 << "MojoGetTimeTicksNow should return nonzero value";
316 }
317
318 // The only handle that's guaranteed to be invalid is |MOJO_HANDLE_INVALID|.
319 // Tests that everything that takes a handle properly recognizes it.
320 TEST(NewCoreTest, InvalidHandle) {
viettrungluu 2014/12/02 17:24:56 Just add this as |TEST(CoreTest, NewInvalidHandle)
jimbe 2014/12/02 19:21:19 Same comment as above.
321 MojoHandle h0, h1;
322 MojoHandleSignals sig;
323 char buffer[10] = {0};
324 uint32_t buffer_size;
325 void* write_pointer;
326 const void* read_pointer;
327
328 // Close:
329 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(MOJO_HANDLE_INVALID));
330
331 // Wait:
332 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
333 MojoNewWait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE, 1000000,
334 NULL));
335
336 h0 = MOJO_HANDLE_INVALID;
337 sig = ~MOJO_HANDLE_SIGNAL_NONE;
338 EXPECT_EQ(
339 MOJO_RESULT_INVALID_ARGUMENT,
340 MojoNewWaitMany(&h0, &sig, 1, MOJO_DEADLINE_INDEFINITE, NULL, NULL));
341
342 // Message pipe:
343 EXPECT_EQ(
344 MOJO_RESULT_INVALID_ARGUMENT,
345 MojoWriteMessage(h0, buffer, 3, NULL, 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
346 buffer_size = static_cast<uint32_t>(sizeof(buffer));
347 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
348 MojoReadMessage(h0, buffer, &buffer_size, NULL, NULL,
349 MOJO_READ_MESSAGE_FLAG_NONE));
350
351 // Data pipe:
352 buffer_size = static_cast<uint32_t>(sizeof(buffer));
353 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
354 MojoWriteData(h0, buffer, &buffer_size, MOJO_WRITE_DATA_FLAG_NONE));
355 write_pointer = NULL;
356 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
357 MojoBeginWriteData(h0, &write_pointer, &buffer_size,
358 MOJO_WRITE_DATA_FLAG_NONE));
359 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoEndWriteData(h0, 1));
360 buffer_size = static_cast<uint32_t>(sizeof(buffer));
361 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
362 MojoReadData(h0, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
363 read_pointer = NULL;
364 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
365 MojoBeginReadData(h0, &read_pointer, &buffer_size,
366 MOJO_READ_DATA_FLAG_NONE));
367 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoEndReadData(h0, 1));
368
369 // Shared buffer:
370 h1 = MOJO_HANDLE_INVALID;
371 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
372 MojoDuplicateBufferHandle(h0, NULL, &h1));
373 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
374 MojoMapBuffer(h0, 0, 1, &write_pointer, MOJO_MAP_BUFFER_FLAG_NONE));
375 }
376
377 TEST(NewCoreTest, BasicMessagePipe) {
378 MojoHandle h0, h1;
379 MojoHandleSignals sig;
380 char buffer[10] = {0};
381 uint32_t buffer_size;
382
383 h0 = MOJO_HANDLE_INVALID;
384 h1 = MOJO_HANDLE_INVALID;
385 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(NULL, &h0, &h1));
386 EXPECT_NE(h0, MOJO_HANDLE_INVALID);
387 EXPECT_NE(h1, MOJO_HANDLE_INVALID);
388
389 // Shouldn't be readable, we haven't written anything.
390 MojoHandleSignalsState state;
391 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
392 MojoNewWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 0, &state));
393 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
394 EXPECT_EQ(MOJO_HANDLE_SIGNAL_ALL, state.satisfiable_signals);
395
396 // Should be writable.
397 EXPECT_EQ(MOJO_RESULT_OK,
398 MojoNewWait(h0, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &state));
399 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
400 EXPECT_EQ(MOJO_HANDLE_SIGNAL_ALL, state.satisfiable_signals);
401
402 // Try to read.
403 buffer_size = static_cast<uint32_t>(sizeof(buffer));
404 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
405 MojoReadMessage(h0, buffer, &buffer_size, NULL, NULL,
406 MOJO_READ_MESSAGE_FLAG_NONE));
407
408 // Write to |h1|.
409 static const char kHello[] = "hello";
410 buffer_size = static_cast<uint32_t>(sizeof(kHello));
411 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteMessage(h1, kHello, buffer_size, NULL, 0,
412 MOJO_WRITE_MESSAGE_FLAG_NONE));
413
414 // |h0| should be readable.
415 uint32_t result_index;
416 MojoHandleSignalsState states[1];
417 sig = MOJO_HANDLE_SIGNAL_READABLE;
418 EXPECT_EQ(MOJO_RESULT_OK,
419 MojoNewWaitMany(&h0, &sig, 1, MOJO_DEADLINE_INDEFINITE,
420 &result_index, states));
421
422 EXPECT_EQ(0u, result_index);
423 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READWRITABLE, states[0].satisfied_signals);
424 EXPECT_EQ(MOJO_HANDLE_SIGNAL_ALL, states[0].satisfiable_signals);
425
426 // Read from |h0|.
427 buffer_size = static_cast<uint32_t>(sizeof(buffer));
428 EXPECT_EQ(MOJO_RESULT_OK, MojoReadMessage(h0, buffer, &buffer_size, NULL,
429 NULL, MOJO_READ_MESSAGE_FLAG_NONE));
430 EXPECT_EQ(static_cast<uint32_t>(sizeof(kHello)), buffer_size);
431 EXPECT_STREQ(kHello, buffer);
432
433 // |h0| should no longer be readable.
434 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
435 MojoNewWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 10, &state));
436
437 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
438 EXPECT_EQ(MOJO_HANDLE_SIGNAL_ALL, state.satisfiable_signals);
439
440 // Close |h0|.
441 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0));
442
443 // |h1| should no longer be readable or writable.
444 EXPECT_EQ(
445 MOJO_RESULT_FAILED_PRECONDITION,
446 MojoNewWait(h1, MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
447 1000, &state));
448
449 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
450 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
451
452 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1));
453 }
454
455 // TODO(ncbray): enable these tests once NaCl supports the corresponding APIs.
456 #ifdef __native_client__
457 #define MAYBE_BasicDataPipe DISABLED_BasicDataPipe
458 #define MAYBE_BasicSharedBuffer DISABLED_BasicSharedBuffer
459 #else
460 #define MAYBE_BasicDataPipe BasicDataPipe
461 #define MAYBE_BasicSharedBuffer BasicSharedBuffer
462 #endif
463
464 TEST(NewCoreTest, MAYBE_BasicDataPipe) {
465 MojoHandle hp, hc;
466 MojoHandleSignals sig;
467 char buffer[20] = {0};
468 uint32_t buffer_size;
469 void* write_pointer;
470 const void* read_pointer;
471
472 hp = MOJO_HANDLE_INVALID;
473 hc = MOJO_HANDLE_INVALID;
474 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(NULL, &hp, &hc));
475 EXPECT_NE(hp, MOJO_HANDLE_INVALID);
476 EXPECT_NE(hc, MOJO_HANDLE_INVALID);
477
478 // The consumer |hc| shouldn't be readable.
479 MojoHandleSignalsState state;
480 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
481 MojoNewWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0, &state));
482
483 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, state.satisfied_signals);
484 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
485 state.satisfiable_signals);
486
487 // The producer |hp| should be writable.
488 EXPECT_EQ(MOJO_RESULT_OK,
489 MojoNewWait(hp, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &state));
490
491 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, state.satisfied_signals);
492 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
493 state.satisfiable_signals);
494
495 // Try to read from |hc|.
496 buffer_size = static_cast<uint32_t>(sizeof(buffer));
497 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
498 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
499
500 // Try to begin a two-phase read from |hc|.
501 read_pointer = NULL;
502 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
503 MojoBeginReadData(hc, &read_pointer, &buffer_size,
504 MOJO_READ_DATA_FLAG_NONE));
505
506 // Write to |hp|.
507 static const char kHello[] = "hello ";
508 // Don't include terminating null.
509 buffer_size = static_cast<uint32_t>(strlen(kHello));
510 EXPECT_EQ(MOJO_RESULT_OK, MojoWriteData(hp, kHello, &buffer_size,
511 MOJO_WRITE_MESSAGE_FLAG_NONE));
512
513 // |hc| should be(come) readable.
514 uint32_t result_index;
515 MojoHandleSignalsState states[1];
516 sig = MOJO_HANDLE_SIGNAL_READABLE;
517 EXPECT_EQ(MOJO_RESULT_OK,
518 MojoNewWaitMany(&hc, &sig, 1, MOJO_DEADLINE_INDEFINITE,
519 &result_index, states));
520
521 EXPECT_EQ(0u, result_index);
522 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, states[0].satisfied_signals);
523 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
524 states[0].satisfiable_signals);
525
526 // Do a two-phase write to |hp|.
527 EXPECT_EQ(MOJO_RESULT_OK, MojoBeginWriteData(hp, &write_pointer, &buffer_size,
528 MOJO_WRITE_DATA_FLAG_NONE));
529 static const char kWorld[] = "world";
530 ASSERT_GE(buffer_size, sizeof(kWorld));
531 // Include the terminating null.
532 memcpy(write_pointer, kWorld, sizeof(kWorld));
533 EXPECT_EQ(MOJO_RESULT_OK,
534 MojoEndWriteData(hp, static_cast<uint32_t>(sizeof(kWorld))));
535
536 // Read one character from |hc|.
537 memset(buffer, 0, sizeof(buffer));
538 buffer_size = 1;
539 EXPECT_EQ(MOJO_RESULT_OK,
540 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE));
541
542 // Close |hp|.
543 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp));
544
545 // |hc| should still be readable.
546 EXPECT_EQ(MOJO_RESULT_OK,
547 MojoNewWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0, &state));
548
549 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
550 state.satisfied_signals);
551 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
552 state.satisfiable_signals);
553
554 // Do a two-phase read from |hc|.
555 read_pointer = NULL;
556 EXPECT_EQ(MOJO_RESULT_OK, MojoBeginReadData(hc, &read_pointer, &buffer_size,
557 MOJO_READ_DATA_FLAG_NONE));
558 ASSERT_LE(buffer_size, sizeof(buffer) - 1);
559 memcpy(&buffer[1], read_pointer, buffer_size);
560 EXPECT_EQ(MOJO_RESULT_OK, MojoEndReadData(hc, buffer_size));
561 EXPECT_STREQ("hello world", buffer);
562
563 // |hc| should no longer be readable.
564 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
565 MojoNewWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 1000, &state));
566
567 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
568 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
569
570 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hc));
571
572 // TODO(vtl): Test the other way around -- closing the consumer should make
573 // the producer never-writable?
574 }
575
576 TEST(NewCoreTest, MAYBE_BasicSharedBuffer) {
577 MojoHandle h0, h1;
578 void* pointer;
579
580 // Create a shared buffer (|h0|).
581 h0 = MOJO_HANDLE_INVALID;
582 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateSharedBuffer(NULL, 100, &h0));
583 EXPECT_NE(h0, MOJO_HANDLE_INVALID);
584
585 // Map everything.
586 pointer = NULL;
587 EXPECT_EQ(MOJO_RESULT_OK,
588 MojoMapBuffer(h0, 0, 100, &pointer, MOJO_MAP_BUFFER_FLAG_NONE));
589 ASSERT_TRUE(pointer);
590 static_cast<char*>(pointer)[50] = 'x';
591
592 // Duplicate |h0| to |h1|.
593 h1 = MOJO_HANDLE_INVALID;
594 EXPECT_EQ(MOJO_RESULT_OK, MojoDuplicateBufferHandle(h0, NULL, &h1));
595 EXPECT_NE(h1, MOJO_HANDLE_INVALID);
596
597 // Close |h0|.
598 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0));
599
600 // The mapping should still be good.
601 static_cast<char*>(pointer)[51] = 'y';
602
603 // Unmap it.
604 EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(pointer));
605
606 // Map half of |h1|.
607 pointer = NULL;
608 EXPECT_EQ(MOJO_RESULT_OK,
609 MojoMapBuffer(h1, 50, 50, &pointer, MOJO_MAP_BUFFER_FLAG_NONE));
610 ASSERT_TRUE(pointer);
611
612 // It should have what we wrote.
613 EXPECT_EQ('x', static_cast<char*>(pointer)[0]);
614 EXPECT_EQ('y', static_cast<char*>(pointer)[1]);
615
616 // Unmap it.
617 EXPECT_EQ(MOJO_RESULT_OK, MojoUnmapBuffer(pointer));
618
619 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1));
620 }
621
622 // Defined in core_unittest_pure_c.c.
623 extern "C" const char* MinimalCTest(void);
624
625 // This checks that things actually work in C (not C++).
626 TEST(NewCoreTest, MinimalCTest) {
627 const char* failure = MinimalCTest();
628 EXPECT_TRUE(failure == NULL) << failure;
629 }
630
631 // TODO(vtl): Add multi-threaded tests.
632
633 } // namespace
634 } // namespace mojo
635
636 // End TODO(jimbe)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698