Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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) | |
| OLD | NEW |