| 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 #include "mojo/system/local_data_pipe.h" | 5 #include "mojo/system/local_data_pipe.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| 11 #include "mojo/system/data_pipe.h" | 11 #include "mojo/system/data_pipe.h" |
| 12 #include "mojo/system/memory.h" | |
| 13 #include "mojo/system/waiter.h" | 12 #include "mojo/system/waiter.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 14 |
| 16 namespace mojo { | 15 namespace mojo { |
| 17 namespace system { | 16 namespace system { |
| 18 namespace { | 17 namespace { |
| 19 | 18 |
| 20 const uint32_t kSizeOfOptions = | 19 const uint32_t kSizeOfOptions = |
| 21 static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions)); | 20 static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions)); |
| 22 | 21 |
| 23 // Validate options. | 22 // Validate options. |
| 24 TEST(LocalDataPipeTest, Creation) { | 23 TEST(LocalDataPipeTest, Creation) { |
| 25 // Create using default options. | 24 // Create using default options. |
| 26 { | 25 { |
| 27 // Get default options. | 26 // Get default options. |
| 28 MojoCreateDataPipeOptions default_options = { 0 }; | 27 MojoCreateDataPipeOptions default_options = { 0 }; |
| 29 EXPECT_EQ(MOJO_RESULT_OK, | 28 EXPECT_EQ(MOJO_RESULT_OK, |
| 30 DataPipe::ValidateCreateOptions(NULL, &default_options)); | 29 DataPipe::ValidateCreateOptions(NullUserPointer(), |
| 30 &default_options)); |
| 31 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(default_options)); | 31 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(default_options)); |
| 32 dp->ProducerClose(); | 32 dp->ProducerClose(); |
| 33 dp->ConsumerClose(); | 33 dp->ConsumerClose(); |
| 34 } | 34 } |
| 35 | 35 |
| 36 // Create using non-default options. | 36 // Create using non-default options. |
| 37 { | 37 { |
| 38 const MojoCreateDataPipeOptions options = { | 38 const MojoCreateDataPipeOptions options = { |
| 39 kSizeOfOptions, // |struct_size|. | 39 kSizeOfOptions, // |struct_size|. |
| 40 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 40 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 41 1, // |element_num_bytes|. | 41 1, // |element_num_bytes|. |
| 42 1000 // |capacity_num_bytes|. | 42 1000 // |capacity_num_bytes|. |
| 43 }; | 43 }; |
| 44 MojoCreateDataPipeOptions validated_options = { 0 }; | 44 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 45 EXPECT_EQ(MOJO_RESULT_OK, | 45 EXPECT_EQ(MOJO_RESULT_OK, |
| 46 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 46 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 47 &validated_options)); |
| 47 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 48 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 48 dp->ProducerClose(); | 49 dp->ProducerClose(); |
| 49 dp->ConsumerClose(); | 50 dp->ConsumerClose(); |
| 50 } | 51 } |
| 51 { | 52 { |
| 52 const MojoCreateDataPipeOptions options = { | 53 const MojoCreateDataPipeOptions options = { |
| 53 kSizeOfOptions, // |struct_size|. | 54 kSizeOfOptions, // |struct_size|. |
| 54 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 55 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 55 4, // |element_num_bytes|. | 56 4, // |element_num_bytes|. |
| 56 4000 // |capacity_num_bytes|. | 57 4000 // |capacity_num_bytes|. |
| 57 }; | 58 }; |
| 58 MojoCreateDataPipeOptions validated_options = { 0 }; | 59 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 59 EXPECT_EQ(MOJO_RESULT_OK, | 60 EXPECT_EQ(MOJO_RESULT_OK, |
| 60 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 61 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 62 &validated_options)); |
| 61 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 63 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 62 dp->ProducerClose(); | 64 dp->ProducerClose(); |
| 63 dp->ConsumerClose(); | 65 dp->ConsumerClose(); |
| 64 } | 66 } |
| 65 { | 67 { |
| 66 const MojoCreateDataPipeOptions options = { | 68 const MojoCreateDataPipeOptions options = { |
| 67 kSizeOfOptions, // |struct_size|. | 69 kSizeOfOptions, // |struct_size|. |
| 68 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 70 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 69 7, // |element_num_bytes|. | 71 7, // |element_num_bytes|. |
| 70 7000000 // |capacity_num_bytes|. | 72 7000000 // |capacity_num_bytes|. |
| 71 }; | 73 }; |
| 72 MojoCreateDataPipeOptions validated_options = { 0 }; | 74 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 73 EXPECT_EQ(MOJO_RESULT_OK, | 75 EXPECT_EQ(MOJO_RESULT_OK, |
| 74 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 76 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 77 &validated_options)); |
| 75 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 78 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 76 dp->ProducerClose(); | 79 dp->ProducerClose(); |
| 77 dp->ConsumerClose(); | 80 dp->ConsumerClose(); |
| 78 } | 81 } |
| 79 // Default capacity. | 82 // Default capacity. |
| 80 { | 83 { |
| 81 const MojoCreateDataPipeOptions options = { | 84 const MojoCreateDataPipeOptions options = { |
| 82 kSizeOfOptions, // |struct_size|. | 85 kSizeOfOptions, // |struct_size|. |
| 83 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 86 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 84 100, // |element_num_bytes|. | 87 100, // |element_num_bytes|. |
| 85 0 // |capacity_num_bytes|. | 88 0 // |capacity_num_bytes|. |
| 86 }; | 89 }; |
| 87 MojoCreateDataPipeOptions validated_options = { 0 }; | 90 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 88 EXPECT_EQ(MOJO_RESULT_OK, | 91 EXPECT_EQ(MOJO_RESULT_OK, |
| 89 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 92 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 93 &validated_options)); |
| 90 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 94 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 91 dp->ProducerClose(); | 95 dp->ProducerClose(); |
| 92 dp->ConsumerClose(); | 96 dp->ConsumerClose(); |
| 93 } | 97 } |
| 94 } | 98 } |
| 95 | 99 |
| 96 TEST(LocalDataPipeTest, SimpleReadWrite) { | 100 TEST(LocalDataPipeTest, SimpleReadWrite) { |
| 97 const MojoCreateDataPipeOptions options = { | 101 const MojoCreateDataPipeOptions options = { |
| 98 kSizeOfOptions, // |struct_size|. | 102 kSizeOfOptions, // |struct_size|. |
| 99 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 103 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 100 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 104 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 101 1000 * sizeof(int32_t) // |capacity_num_bytes|. | 105 1000 * sizeof(int32_t) // |capacity_num_bytes|. |
| 102 }; | 106 }; |
| 103 MojoCreateDataPipeOptions validated_options = { 0 }; | 107 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 104 EXPECT_EQ(MOJO_RESULT_OK, | 108 EXPECT_EQ(MOJO_RESULT_OK, |
| 105 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 109 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 110 &validated_options)); |
| 106 | 111 |
| 107 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 112 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 108 | 113 |
| 109 int32_t elements[10] = { 0 }; | 114 int32_t elements[10] = { 0 }; |
| 110 uint32_t num_bytes = 0; | 115 uint32_t num_bytes = 0; |
| 111 | 116 |
| 112 // Try reading; nothing there yet. | 117 // Try reading; nothing there yet. |
| 113 num_bytes = static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0])); | 118 num_bytes = static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0])); |
| 114 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 119 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 115 dp->ConsumerReadData(UserPointer<void>(elements), | 120 dp->ConsumerReadData(UserPointer<void>(elements), |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 // are strict maximums. This is not guaranteed by the API. | 204 // are strict maximums. This is not guaranteed by the API. |
| 200 | 205 |
| 201 const MojoCreateDataPipeOptions options = { | 206 const MojoCreateDataPipeOptions options = { |
| 202 kSizeOfOptions, // |struct_size|. | 207 kSizeOfOptions, // |struct_size|. |
| 203 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 208 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 204 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 209 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 205 2 * sizeof(int32_t) // |capacity_num_bytes|. | 210 2 * sizeof(int32_t) // |capacity_num_bytes|. |
| 206 }; | 211 }; |
| 207 MojoCreateDataPipeOptions validated_options = { 0 }; | 212 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 208 EXPECT_EQ(MOJO_RESULT_OK, | 213 EXPECT_EQ(MOJO_RESULT_OK, |
| 209 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 214 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 215 &validated_options)); |
| 210 | 216 |
| 211 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 217 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 212 Waiter waiter; | 218 Waiter waiter; |
| 213 uint32_t context = 0; | 219 uint32_t context = 0; |
| 214 | 220 |
| 215 // Never readable. | 221 // Never readable. |
| 216 waiter.Init(); | 222 waiter.Init(); |
| 217 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 223 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 218 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12)); | 224 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12)); |
| 219 | 225 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 | 331 |
| 326 TEST(LocalDataPipeTest, BasicConsumerWaiting) { | 332 TEST(LocalDataPipeTest, BasicConsumerWaiting) { |
| 327 const MojoCreateDataPipeOptions options = { | 333 const MojoCreateDataPipeOptions options = { |
| 328 kSizeOfOptions, // |struct_size|. | 334 kSizeOfOptions, // |struct_size|. |
| 329 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 335 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 330 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 336 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 331 1000 * sizeof(int32_t) // |capacity_num_bytes|. | 337 1000 * sizeof(int32_t) // |capacity_num_bytes|. |
| 332 }; | 338 }; |
| 333 MojoCreateDataPipeOptions validated_options = { 0 }; | 339 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 334 EXPECT_EQ(MOJO_RESULT_OK, | 340 EXPECT_EQ(MOJO_RESULT_OK, |
| 335 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 341 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 342 &validated_options)); |
| 336 | 343 |
| 337 { | 344 { |
| 338 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 345 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 339 Waiter waiter; | 346 Waiter waiter; |
| 340 uint32_t context = 0; | 347 uint32_t context = 0; |
| 341 | 348 |
| 342 // Never writable. | 349 // Never writable. |
| 343 waiter.Init(); | 350 waiter.Init(); |
| 344 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 351 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 345 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12)); | 352 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 12)); |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 // Tests that data pipes aren't writable/readable during two-phase writes/reads. | 521 // Tests that data pipes aren't writable/readable during two-phase writes/reads. |
| 515 TEST(LocalDataPipeTest, BasicTwoPhaseWaiting) { | 522 TEST(LocalDataPipeTest, BasicTwoPhaseWaiting) { |
| 516 const MojoCreateDataPipeOptions options = { | 523 const MojoCreateDataPipeOptions options = { |
| 517 kSizeOfOptions, // |struct_size|. | 524 kSizeOfOptions, // |struct_size|. |
| 518 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 525 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 519 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 526 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 520 1000 * sizeof(int32_t) // |capacity_num_bytes|. | 527 1000 * sizeof(int32_t) // |capacity_num_bytes|. |
| 521 }; | 528 }; |
| 522 MojoCreateDataPipeOptions validated_options = { 0 }; | 529 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 523 EXPECT_EQ(MOJO_RESULT_OK, | 530 EXPECT_EQ(MOJO_RESULT_OK, |
| 524 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 531 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 532 &validated_options)); |
| 525 | 533 |
| 526 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 534 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 527 Waiter waiter; | 535 Waiter waiter; |
| 528 | 536 |
| 529 // It should be writable. | 537 // It should be writable. |
| 530 waiter.Init(); | 538 waiter.Init(); |
| 531 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 539 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 532 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 540 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
| 533 | 541 |
| 534 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); | 542 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t)); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 // Test that a "may discard" data pipe is writable even when it's full. | 630 // Test that a "may discard" data pipe is writable even when it's full. |
| 623 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { | 631 TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { |
| 624 const MojoCreateDataPipeOptions options = { | 632 const MojoCreateDataPipeOptions options = { |
| 625 kSizeOfOptions, // |struct_size|. | 633 kSizeOfOptions, // |struct_size|. |
| 626 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 634 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 627 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 635 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 628 1 * sizeof(int32_t) // |capacity_num_bytes|. | 636 1 * sizeof(int32_t) // |capacity_num_bytes|. |
| 629 }; | 637 }; |
| 630 MojoCreateDataPipeOptions validated_options = { 0 }; | 638 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 631 EXPECT_EQ(MOJO_RESULT_OK, | 639 EXPECT_EQ(MOJO_RESULT_OK, |
| 632 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 640 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 641 &validated_options)); |
| 633 | 642 |
| 634 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 643 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 635 Waiter waiter; | 644 Waiter waiter; |
| 636 | 645 |
| 637 // Writable. | 646 // Writable. |
| 638 waiter.Init(); | 647 waiter.Init(); |
| 639 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 648 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 640 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); | 649 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
| 641 | 650 |
| 642 // Not readable. | 651 // Not readable. |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 | 722 |
| 714 TEST(LocalDataPipeTest, MayDiscard) { | 723 TEST(LocalDataPipeTest, MayDiscard) { |
| 715 const MojoCreateDataPipeOptions options = { | 724 const MojoCreateDataPipeOptions options = { |
| 716 kSizeOfOptions, // |struct_size|. | 725 kSizeOfOptions, // |struct_size|. |
| 717 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 726 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 718 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 727 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 719 10 * sizeof(int32_t) // |capacity_num_bytes|. | 728 10 * sizeof(int32_t) // |capacity_num_bytes|. |
| 720 }; | 729 }; |
| 721 MojoCreateDataPipeOptions validated_options = { 0 }; | 730 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 722 EXPECT_EQ(MOJO_RESULT_OK, | 731 EXPECT_EQ(MOJO_RESULT_OK, |
| 723 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 732 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 733 &validated_options)); |
| 724 | 734 |
| 725 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 735 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 726 | 736 |
| 727 int32_t buffer[100] = { 0 }; | 737 int32_t buffer[100] = { 0 }; |
| 728 uint32_t num_bytes = 0; | 738 uint32_t num_bytes = 0; |
| 729 | 739 |
| 730 num_bytes = 20u * sizeof(int32_t); | 740 num_bytes = 20u * sizeof(int32_t); |
| 731 Seq(0, arraysize(buffer), buffer); | 741 Seq(0, arraysize(buffer), buffer); |
| 732 // Try writing more than capacity. (This test relies on the implementation | 742 // Try writing more than capacity. (This test relies on the implementation |
| 733 // enforcing the capacity strictly.) | 743 // enforcing the capacity strictly.) |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 906 | 916 |
| 907 TEST(LocalDataPipeTest, AllOrNone) { | 917 TEST(LocalDataPipeTest, AllOrNone) { |
| 908 const MojoCreateDataPipeOptions options = { | 918 const MojoCreateDataPipeOptions options = { |
| 909 kSizeOfOptions, // |struct_size|. | 919 kSizeOfOptions, // |struct_size|. |
| 910 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 920 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 911 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 921 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 912 10 * sizeof(int32_t) // |capacity_num_bytes|. | 922 10 * sizeof(int32_t) // |capacity_num_bytes|. |
| 913 }; | 923 }; |
| 914 MojoCreateDataPipeOptions validated_options = { 0 }; | 924 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 915 EXPECT_EQ(MOJO_RESULT_OK, | 925 EXPECT_EQ(MOJO_RESULT_OK, |
| 916 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 926 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 927 &validated_options)); |
| 917 | 928 |
| 918 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 929 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 919 | 930 |
| 920 // Try writing way too much. | 931 // Try writing way too much. |
| 921 uint32_t num_bytes = 20u * sizeof(int32_t); | 932 uint32_t num_bytes = 20u * sizeof(int32_t); |
| 922 int32_t buffer[100]; | 933 int32_t buffer[100]; |
| 923 Seq(0, arraysize(buffer), buffer); | 934 Seq(0, arraysize(buffer), buffer); |
| 924 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 935 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 925 dp->ProducerWriteData(UserPointer<const void>(buffer), | 936 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 926 MakeUserPointer(&num_bytes), true)); | 937 MakeUserPointer(&num_bytes), true)); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1066 | 1077 |
| 1067 TEST(LocalDataPipeTest, AllOrNoneMayDiscard) { | 1078 TEST(LocalDataPipeTest, AllOrNoneMayDiscard) { |
| 1068 const MojoCreateDataPipeOptions options = { | 1079 const MojoCreateDataPipeOptions options = { |
| 1069 kSizeOfOptions, // |struct_size|. | 1080 kSizeOfOptions, // |struct_size|. |
| 1070 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 1081 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 1071 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 1082 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 1072 10 * sizeof(int32_t) // |capacity_num_bytes|. | 1083 10 * sizeof(int32_t) // |capacity_num_bytes|. |
| 1073 }; | 1084 }; |
| 1074 MojoCreateDataPipeOptions validated_options = { 0 }; | 1085 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 1075 EXPECT_EQ(MOJO_RESULT_OK, | 1086 EXPECT_EQ(MOJO_RESULT_OK, |
| 1076 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 1087 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 1088 &validated_options)); |
| 1077 | 1089 |
| 1078 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1090 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1079 | 1091 |
| 1080 // Try writing way too much. | 1092 // Try writing way too much. |
| 1081 uint32_t num_bytes = 20u * sizeof(int32_t); | 1093 uint32_t num_bytes = 20u * sizeof(int32_t); |
| 1082 int32_t buffer[100]; | 1094 int32_t buffer[100]; |
| 1083 Seq(0, arraysize(buffer), buffer); | 1095 Seq(0, arraysize(buffer), buffer); |
| 1084 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1096 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1085 dp->ProducerWriteData(UserPointer<const void>(buffer), | 1097 dp->ProducerWriteData(UserPointer<const void>(buffer), |
| 1086 MakeUserPointer(&num_bytes), true)); | 1098 MakeUserPointer(&num_bytes), true)); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1165 | 1177 |
| 1166 TEST(LocalDataPipeTest, TwoPhaseAllOrNone) { | 1178 TEST(LocalDataPipeTest, TwoPhaseAllOrNone) { |
| 1167 const MojoCreateDataPipeOptions options = { | 1179 const MojoCreateDataPipeOptions options = { |
| 1168 kSizeOfOptions, // |struct_size|. | 1180 kSizeOfOptions, // |struct_size|. |
| 1169 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 1181 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 1170 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 1182 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 1171 10 * sizeof(int32_t) // |capacity_num_bytes|. | 1183 10 * sizeof(int32_t) // |capacity_num_bytes|. |
| 1172 }; | 1184 }; |
| 1173 MojoCreateDataPipeOptions validated_options = { 0 }; | 1185 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 1174 EXPECT_EQ(MOJO_RESULT_OK, | 1186 EXPECT_EQ(MOJO_RESULT_OK, |
| 1175 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 1187 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 1188 &validated_options)); |
| 1176 | 1189 |
| 1177 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1190 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1178 | 1191 |
| 1179 // Try writing way too much (two-phase). | 1192 // Try writing way too much (two-phase). |
| 1180 uint32_t num_bytes = 20u * sizeof(int32_t); | 1193 uint32_t num_bytes = 20u * sizeof(int32_t); |
| 1181 void* write_ptr = NULL; | 1194 void* write_ptr = NULL; |
| 1182 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1195 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 1183 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 1196 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1184 MakeUserPointer(&num_bytes), true)); | 1197 MakeUserPointer(&num_bytes), true)); |
| 1185 | 1198 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1304 test_data[i] = static_cast<unsigned char>(i); | 1317 test_data[i] = static_cast<unsigned char>(i); |
| 1305 | 1318 |
| 1306 const MojoCreateDataPipeOptions options = { | 1319 const MojoCreateDataPipeOptions options = { |
| 1307 kSizeOfOptions, // |struct_size|. | 1320 kSizeOfOptions, // |struct_size|. |
| 1308 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 1321 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 1309 1u, // |element_num_bytes|. | 1322 1u, // |element_num_bytes|. |
| 1310 100u // |capacity_num_bytes|. | 1323 100u // |capacity_num_bytes|. |
| 1311 }; | 1324 }; |
| 1312 MojoCreateDataPipeOptions validated_options = { 0 }; | 1325 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 1313 EXPECT_EQ(MOJO_RESULT_OK, | 1326 EXPECT_EQ(MOJO_RESULT_OK, |
| 1314 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 1327 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 1328 &validated_options)); |
| 1315 // This test won't be valid if |ValidateCreateOptions()| decides to give the | 1329 // This test won't be valid if |ValidateCreateOptions()| decides to give the |
| 1316 // pipe more space. | 1330 // pipe more space. |
| 1317 ASSERT_EQ(100u, validated_options.capacity_num_bytes); | 1331 ASSERT_EQ(100u, validated_options.capacity_num_bytes); |
| 1318 | 1332 |
| 1319 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1333 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1320 | 1334 |
| 1321 // Write 20 bytes. | 1335 // Write 20 bytes. |
| 1322 uint32_t num_bytes = 20u; | 1336 uint32_t num_bytes = 20u; |
| 1323 EXPECT_EQ(MOJO_RESULT_OK, | 1337 EXPECT_EQ(MOJO_RESULT_OK, |
| 1324 dp->ProducerWriteData(UserPointer<const void>(&test_data[0]), | 1338 dp->ProducerWriteData(UserPointer<const void>(&test_data[0]), |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1388 const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData)); | 1402 const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData)); |
| 1389 | 1403 |
| 1390 const MojoCreateDataPipeOptions options = { | 1404 const MojoCreateDataPipeOptions options = { |
| 1391 kSizeOfOptions, // |struct_size|. | 1405 kSizeOfOptions, // |struct_size|. |
| 1392 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 1406 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 1393 1u, // |element_num_bytes|. | 1407 1u, // |element_num_bytes|. |
| 1394 1000u // |capacity_num_bytes|. | 1408 1000u // |capacity_num_bytes|. |
| 1395 }; | 1409 }; |
| 1396 MojoCreateDataPipeOptions validated_options = { 0 }; | 1410 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 1397 EXPECT_EQ(MOJO_RESULT_OK, | 1411 EXPECT_EQ(MOJO_RESULT_OK, |
| 1398 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 1412 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 1413 &validated_options)); |
| 1399 | 1414 |
| 1400 // Close producer first, then consumer. | 1415 // Close producer first, then consumer. |
| 1401 { | 1416 { |
| 1402 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1417 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1403 | 1418 |
| 1404 // Write some data, so we'll have something to read. | 1419 // Write some data, so we'll have something to read. |
| 1405 uint32_t num_bytes = kTestDataSize; | 1420 uint32_t num_bytes = kTestDataSize; |
| 1406 EXPECT_EQ(MOJO_RESULT_OK, | 1421 EXPECT_EQ(MOJO_RESULT_OK, |
| 1407 dp->ProducerWriteData(UserPointer<const void>(kTestData), | 1422 dp->ProducerWriteData(UserPointer<const void>(kTestData), |
| 1408 MakeUserPointer(&num_bytes), false)); | 1423 MakeUserPointer(&num_bytes), false)); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1573 | 1588 |
| 1574 TEST(LocalDataPipeTest, TwoPhaseMoreInvalidArguments) { | 1589 TEST(LocalDataPipeTest, TwoPhaseMoreInvalidArguments) { |
| 1575 const MojoCreateDataPipeOptions options = { | 1590 const MojoCreateDataPipeOptions options = { |
| 1576 kSizeOfOptions, // |struct_size|. | 1591 kSizeOfOptions, // |struct_size|. |
| 1577 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 1592 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 1578 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 1593 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
| 1579 10 * sizeof(int32_t) // |capacity_num_bytes|. | 1594 10 * sizeof(int32_t) // |capacity_num_bytes|. |
| 1580 }; | 1595 }; |
| 1581 MojoCreateDataPipeOptions validated_options = { 0 }; | 1596 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 1582 EXPECT_EQ(MOJO_RESULT_OK, | 1597 EXPECT_EQ(MOJO_RESULT_OK, |
| 1583 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 1598 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 1599 &validated_options)); |
| 1584 | 1600 |
| 1585 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1601 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1586 | 1602 |
| 1587 // No data. | 1603 // No data. |
| 1588 uint32_t num_bytes = 1000u; | 1604 uint32_t num_bytes = 1000u; |
| 1589 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); | 1605 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
| 1590 EXPECT_EQ(0u, num_bytes); | 1606 EXPECT_EQ(0u, num_bytes); |
| 1591 | 1607 |
| 1592 // Try "ending" a two-phase write when one isn't active. | 1608 // Try "ending" a two-phase write when one isn't active. |
| 1593 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1609 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1699 // |ProducerWriteData()| then changes the data underneath the two-phase read.) | 1715 // |ProducerWriteData()| then changes the data underneath the two-phase read.) |
| 1700 TEST(LocalDataPipeTest, DISABLED_MayDiscardTwoPhaseConsistent) { | 1716 TEST(LocalDataPipeTest, DISABLED_MayDiscardTwoPhaseConsistent) { |
| 1701 const MojoCreateDataPipeOptions options = { | 1717 const MojoCreateDataPipeOptions options = { |
| 1702 kSizeOfOptions, // |struct_size|. | 1718 kSizeOfOptions, // |struct_size|. |
| 1703 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 1719 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
| 1704 1, // |element_num_bytes|. | 1720 1, // |element_num_bytes|. |
| 1705 2 // |capacity_num_bytes|. | 1721 2 // |capacity_num_bytes|. |
| 1706 }; | 1722 }; |
| 1707 MojoCreateDataPipeOptions validated_options = { 0 }; | 1723 MojoCreateDataPipeOptions validated_options = { 0 }; |
| 1708 EXPECT_EQ(MOJO_RESULT_OK, | 1724 EXPECT_EQ(MOJO_RESULT_OK, |
| 1709 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 1725 DataPipe::ValidateCreateOptions(MakeUserPointer(&options), |
| 1726 &validated_options)); |
| 1710 | 1727 |
| 1711 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1728 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
| 1712 | 1729 |
| 1713 // Write some elements. | 1730 // Write some elements. |
| 1714 char elements[2] = { 'a', 'b' }; | 1731 char elements[2] = { 'a', 'b' }; |
| 1715 uint32_t num_bytes = 2u; | 1732 uint32_t num_bytes = 2u; |
| 1716 EXPECT_EQ(MOJO_RESULT_OK, | 1733 EXPECT_EQ(MOJO_RESULT_OK, |
| 1717 dp->ProducerWriteData(UserPointer<const void>(elements), | 1734 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 1718 MakeUserPointer(&num_bytes), false)); | 1735 MakeUserPointer(&num_bytes), false)); |
| 1719 EXPECT_EQ(2u, num_bytes); | 1736 EXPECT_EQ(2u, num_bytes); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1766 // End reading. | 1783 // End reading. |
| 1767 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); | 1784 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); |
| 1768 | 1785 |
| 1769 dp->ProducerClose(); | 1786 dp->ProducerClose(); |
| 1770 dp->ConsumerClose(); | 1787 dp->ConsumerClose(); |
| 1771 } | 1788 } |
| 1772 | 1789 |
| 1773 } // namespace | 1790 } // namespace |
| 1774 } // namespace system | 1791 } // namespace system |
| 1775 } // namespace mojo | 1792 } // namespace mojo |
| OLD | NEW |