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" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 105 DataPipe::ValidateCreateOptions(&options, &validated_options)); |
106 | 106 |
107 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 107 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
108 | 108 |
109 int32_t elements[10] = { 0 }; | 109 int32_t elements[10] = { 0 }; |
110 uint32_t num_bytes = 0; | 110 uint32_t num_bytes = 0; |
111 | 111 |
112 // Try reading; nothing there yet. | 112 // Try reading; nothing there yet. |
113 num_bytes = static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0])); | 113 num_bytes = static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0])); |
114 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 114 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
115 dp->ConsumerReadData(elements, &num_bytes, false)); | 115 dp->ConsumerReadData(UserPointer<void>(elements), |
| 116 MakeUserPointer(&num_bytes), false)); |
116 | 117 |
117 // Query; nothing there yet. | 118 // Query; nothing there yet. |
118 num_bytes = 0; | 119 num_bytes = 0; |
119 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 120 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
120 EXPECT_EQ(0u, num_bytes); | 121 EXPECT_EQ(0u, num_bytes); |
121 | 122 |
122 // Discard; nothing there yet. | 123 // Discard; nothing there yet. |
123 num_bytes = static_cast<uint32_t>(5u * sizeof(elements[0])); | 124 num_bytes = static_cast<uint32_t>(5u * sizeof(elements[0])); |
124 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 125 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
125 dp->ConsumerDiscardData(&num_bytes, false)); | 126 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), false)); |
126 | 127 |
127 // Read with invalid |num_bytes|. | 128 // Read with invalid |num_bytes|. |
128 num_bytes = sizeof(elements[0]) + 1; | 129 num_bytes = sizeof(elements[0]) + 1; |
129 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 130 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
130 dp->ConsumerReadData(elements, &num_bytes, false)); | 131 dp->ConsumerReadData(UserPointer<void>(elements), |
| 132 MakeUserPointer(&num_bytes), false)); |
131 | 133 |
132 // Write two elements. | 134 // Write two elements. |
133 elements[0] = 123; | 135 elements[0] = 123; |
134 elements[1] = 456; | 136 elements[1] = 456; |
135 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 137 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
136 EXPECT_EQ(MOJO_RESULT_OK, | 138 EXPECT_EQ(MOJO_RESULT_OK, |
137 dp->ProducerWriteData(elements, &num_bytes, false)); | 139 dp->ProducerWriteData(elements, &num_bytes, false)); |
138 // It should have written everything (even without "all or none"). | 140 // It should have written everything (even without "all or none"). |
139 EXPECT_EQ(2u * sizeof(elements[0]), num_bytes); | 141 EXPECT_EQ(2u * sizeof(elements[0]), num_bytes); |
140 | 142 |
141 // Query. | 143 // Query. |
142 num_bytes = 0; | 144 num_bytes = 0; |
143 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 145 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
144 EXPECT_EQ(2 * sizeof(elements[0]), num_bytes); | 146 EXPECT_EQ(2 * sizeof(elements[0]), num_bytes); |
145 | 147 |
146 // Read one element. | 148 // Read one element. |
147 elements[0] = -1; | 149 elements[0] = -1; |
148 elements[1] = -1; | 150 elements[1] = -1; |
149 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 151 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
150 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, false)); | 152 EXPECT_EQ(MOJO_RESULT_OK, |
| 153 dp->ConsumerReadData(UserPointer<void>(elements), |
| 154 MakeUserPointer(&num_bytes), false)); |
151 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); | 155 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); |
152 EXPECT_EQ(123, elements[0]); | 156 EXPECT_EQ(123, elements[0]); |
153 EXPECT_EQ(-1, elements[1]); | 157 EXPECT_EQ(-1, elements[1]); |
154 | 158 |
155 // Query. | 159 // Query. |
156 num_bytes = 0; | 160 num_bytes = 0; |
157 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 161 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
158 EXPECT_EQ(1 * sizeof(elements[0]), num_bytes); | 162 EXPECT_EQ(1 * sizeof(elements[0]), num_bytes); |
159 | 163 |
160 // Try to read two elements, with "all or none". | 164 // Try to read two elements, with "all or none". |
161 elements[0] = -1; | 165 elements[0] = -1; |
162 elements[1] = -1; | 166 elements[1] = -1; |
163 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 167 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
164 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 168 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
165 dp->ConsumerReadData(elements, &num_bytes, true)); | 169 dp->ConsumerReadData(UserPointer<void>(elements), |
| 170 MakeUserPointer(&num_bytes), true)); |
166 EXPECT_EQ(-1, elements[0]); | 171 EXPECT_EQ(-1, elements[0]); |
167 EXPECT_EQ(-1, elements[1]); | 172 EXPECT_EQ(-1, elements[1]); |
168 | 173 |
169 // Try to read two elements, without "all or none". | 174 // Try to read two elements, without "all or none". |
170 elements[0] = -1; | 175 elements[0] = -1; |
171 elements[1] = -1; | 176 elements[1] = -1; |
172 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 177 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
173 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, false)); | 178 EXPECT_EQ(MOJO_RESULT_OK, |
| 179 dp->ConsumerReadData(UserPointer<void>(elements), |
| 180 MakeUserPointer(&num_bytes), false)); |
174 EXPECT_EQ(456, elements[0]); | 181 EXPECT_EQ(456, elements[0]); |
175 EXPECT_EQ(-1, elements[1]); | 182 EXPECT_EQ(-1, elements[1]); |
176 | 183 |
177 // Query. | 184 // Query. |
178 num_bytes = 0; | 185 num_bytes = 0; |
179 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 186 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
180 EXPECT_EQ(0u, num_bytes); | 187 EXPECT_EQ(0u, num_bytes); |
181 | 188 |
182 dp->ProducerClose(); | 189 dp->ProducerClose(); |
183 dp->ConsumerClose(); | 190 dp->ConsumerClose(); |
184 } | 191 } |
185 | 192 |
186 // Note: The "basic" waiting tests test that the "wait states" are correct in | 193 // Note: The "basic" waiting tests test that the "wait states" are correct in |
187 // various situations; they don't test that waiters are properly awoken on state | 194 // various situations; they don't test that waiters are properly awoken on state |
188 // changes. (For that, we need to use multiple threads.) | 195 // changes. (For that, we need to use multiple threads.) |
189 TEST(LocalDataPipeTest, BasicProducerWaiting) { | 196 TEST(LocalDataPipeTest, BasicProducerWaiting) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
230 | 237 |
231 // Do it again. | 238 // Do it again. |
232 waiter.Init(); | 239 waiter.Init(); |
233 ASSERT_EQ(MOJO_RESULT_OK, | 240 ASSERT_EQ(MOJO_RESULT_OK, |
234 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78)); | 241 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78)); |
235 | 242 |
236 // Read one element. | 243 // Read one element. |
237 elements[0] = -1; | 244 elements[0] = -1; |
238 elements[1] = -1; | 245 elements[1] = -1; |
239 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 246 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
240 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, true)); | 247 EXPECT_EQ(MOJO_RESULT_OK, |
| 248 dp->ConsumerReadData(UserPointer<void>(elements), |
| 249 MakeUserPointer(&num_bytes), true)); |
241 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 250 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
242 EXPECT_EQ(123, elements[0]); | 251 EXPECT_EQ(123, elements[0]); |
243 EXPECT_EQ(-1, elements[1]); | 252 EXPECT_EQ(-1, elements[1]); |
244 | 253 |
245 // Waiting should now succeed. | 254 // Waiting should now succeed. |
246 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); | 255 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(1000, &context)); |
247 EXPECT_EQ(78u, context); | 256 EXPECT_EQ(78u, context); |
248 dp->ProducerRemoveWaiter(&waiter); | 257 dp->ProducerRemoveWaiter(&waiter); |
249 | 258 |
250 // Try writing, using a two-phase write. | 259 // Try writing, using a two-phase write. |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
343 EXPECT_EQ(MOJO_RESULT_OK, | 352 EXPECT_EQ(MOJO_RESULT_OK, |
344 dp->ProducerWriteData(elements, &num_bytes, true)); | 353 dp->ProducerWriteData(elements, &num_bytes, true)); |
345 | 354 |
346 // Should already be readable. | 355 // Should already be readable. |
347 waiter.Init(); | 356 waiter.Init(); |
348 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 357 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
349 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56)); | 358 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 56)); |
350 | 359 |
351 // Discard one element. | 360 // Discard one element. |
352 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 361 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
353 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerDiscardData(&num_bytes, true)); | 362 EXPECT_EQ(MOJO_RESULT_OK, |
| 363 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
354 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 364 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
355 | 365 |
356 // Should still be readable. | 366 // Should still be readable. |
357 waiter.Init(); | 367 waiter.Init(); |
358 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 368 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
359 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78)); | 369 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78)); |
360 | 370 |
361 // Read one element. | 371 // Read one element. |
362 elements[0] = -1; | 372 elements[0] = -1; |
363 elements[1] = -1; | 373 elements[1] = -1; |
364 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 374 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
365 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, true)); | 375 EXPECT_EQ(MOJO_RESULT_OK, |
| 376 dp->ConsumerReadData(UserPointer<void>(elements), |
| 377 MakeUserPointer(&num_bytes), true)); |
366 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 378 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
367 EXPECT_EQ(456, elements[0]); | 379 EXPECT_EQ(456, elements[0]); |
368 EXPECT_EQ(-1, elements[1]); | 380 EXPECT_EQ(-1, elements[1]); |
369 | 381 |
370 // Adding a waiter should now succeed. | 382 // Adding a waiter should now succeed. |
371 waiter.Init(); | 383 waiter.Init(); |
372 ASSERT_EQ(MOJO_RESULT_OK, | 384 ASSERT_EQ(MOJO_RESULT_OK, |
373 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 90)); | 385 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 90)); |
374 | 386 |
375 // Write one element. | 387 // Write one element. |
(...skipping 13 matching lines...) Expand all Loading... |
389 | 401 |
390 // Should still be readable. | 402 // Should still be readable. |
391 waiter.Init(); | 403 waiter.Init(); |
392 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 404 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
393 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12)); | 405 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 12)); |
394 | 406 |
395 // Read one element. | 407 // Read one element. |
396 elements[0] = -1; | 408 elements[0] = -1; |
397 elements[1] = -1; | 409 elements[1] = -1; |
398 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 410 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
399 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(elements, &num_bytes, true)); | 411 EXPECT_EQ(MOJO_RESULT_OK, |
| 412 dp->ConsumerReadData(UserPointer<void>(elements), |
| 413 MakeUserPointer(&num_bytes), true)); |
400 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 414 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
401 EXPECT_EQ(789, elements[0]); | 415 EXPECT_EQ(789, elements[0]); |
402 EXPECT_EQ(-1, elements[1]); | 416 EXPECT_EQ(-1, elements[1]); |
403 | 417 |
404 // Should be never-readable. | 418 // Should be never-readable. |
405 waiter.Init(); | 419 waiter.Init(); |
406 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 420 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
407 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34)); | 421 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 34)); |
408 | 422 |
409 dp->ConsumerClose(); | 423 dp->ConsumerClose(); |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 | 669 |
656 // And still readable. | 670 // And still readable. |
657 waiter.Init(); | 671 waiter.Init(); |
658 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 672 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
659 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5)); | 673 dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 5)); |
660 | 674 |
661 // Read that element. | 675 // Read that element. |
662 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); | 676 num_bytes = static_cast<uint32_t>(sizeof(int32_t)); |
663 element = 0; | 677 element = 0; |
664 EXPECT_EQ(MOJO_RESULT_OK, | 678 EXPECT_EQ(MOJO_RESULT_OK, |
665 dp->ConsumerReadData(&element, &num_bytes, false)); | 679 dp->ConsumerReadData(UserPointer<void>(&element), |
| 680 MakeUserPointer(&num_bytes), false)); |
666 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); | 681 EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); |
667 EXPECT_EQ(456, element); | 682 EXPECT_EQ(456, element); |
668 | 683 |
669 // Still writable. | 684 // Still writable. |
670 waiter.Init(); | 685 waiter.Init(); |
671 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 686 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
672 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6)); | 687 dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6)); |
673 | 688 |
674 // No longer readable. | 689 // No longer readable. |
675 waiter.Init(); | 690 waiter.Init(); |
(...skipping 30 matching lines...) Expand all Loading... |
706 num_bytes = 20u * sizeof(int32_t); | 721 num_bytes = 20u * sizeof(int32_t); |
707 Seq(0, arraysize(buffer), buffer); | 722 Seq(0, arraysize(buffer), buffer); |
708 // Try writing more than capacity. (This test relies on the implementation | 723 // Try writing more than capacity. (This test relies on the implementation |
709 // enforcing the capacity strictly.) | 724 // enforcing the capacity strictly.) |
710 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, false)); | 725 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, false)); |
711 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 726 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
712 | 727 |
713 // Read half of what we wrote. | 728 // Read half of what we wrote. |
714 num_bytes = 5u * sizeof(int32_t); | 729 num_bytes = 5u * sizeof(int32_t); |
715 memset(buffer, 0xab, sizeof(buffer)); | 730 memset(buffer, 0xab, sizeof(buffer)); |
716 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(buffer, &num_bytes, false)); | 731 EXPECT_EQ(MOJO_RESULT_OK, |
| 732 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 733 MakeUserPointer(&num_bytes), false)); |
717 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 734 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
718 int32_t expected_buffer[100]; | 735 int32_t expected_buffer[100]; |
719 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 736 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
720 Seq(0, 5u, expected_buffer); | 737 Seq(0, 5u, expected_buffer); |
721 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 738 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
722 // Internally, a circular buffer would now look like: | 739 // Internally, a circular buffer would now look like: |
723 // -, -, -, -, -, 5, 6, 7, 8, 9 | 740 // -, -, -, -, -, 5, 6, 7, 8, 9 |
724 | 741 |
725 // Write a bit more than the space that's available. | 742 // Write a bit more than the space that's available. |
726 num_bytes = 8u * sizeof(int32_t); | 743 num_bytes = 8u * sizeof(int32_t); |
727 Seq(100, arraysize(buffer), buffer); | 744 Seq(100, arraysize(buffer), buffer); |
728 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, false)); | 745 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, false)); |
729 EXPECT_EQ(8u * sizeof(int32_t), num_bytes); | 746 EXPECT_EQ(8u * sizeof(int32_t), num_bytes); |
730 // Internally, a circular buffer would now look like: | 747 // Internally, a circular buffer would now look like: |
731 // 100, 101, 102, 103, 104, 105, 106, 107, 8, 9 | 748 // 100, 101, 102, 103, 104, 105, 106, 107, 8, 9 |
732 | 749 |
733 // Read half of what's available. | 750 // Read half of what's available. |
734 num_bytes = 5u * sizeof(int32_t); | 751 num_bytes = 5u * sizeof(int32_t); |
735 memset(buffer, 0xab, sizeof(buffer)); | 752 memset(buffer, 0xab, sizeof(buffer)); |
736 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(buffer, &num_bytes, false)); | 753 EXPECT_EQ(MOJO_RESULT_OK, |
| 754 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 755 MakeUserPointer(&num_bytes), false)); |
737 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 756 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
738 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 757 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
739 expected_buffer[0] = 8; | 758 expected_buffer[0] = 8; |
740 expected_buffer[1] = 9; | 759 expected_buffer[1] = 9; |
741 expected_buffer[2] = 100; | 760 expected_buffer[2] = 100; |
742 expected_buffer[3] = 101; | 761 expected_buffer[3] = 101; |
743 expected_buffer[4] = 102; | 762 expected_buffer[4] = 102; |
744 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 763 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
745 // Internally, a circular buffer would now look like: | 764 // Internally, a circular buffer would now look like: |
746 // -, -, -, 103, 104, 105, 106, 107, -, - | 765 // -, -, -, 103, 104, 105, 106, 107, -, - |
(...skipping 10 matching lines...) Expand all Loading... |
757 num_bytes = 5u * sizeof(int32_t); | 776 num_bytes = 5u * sizeof(int32_t); |
758 Seq(300, arraysize(buffer), buffer); | 777 Seq(300, arraysize(buffer), buffer); |
759 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, false)); | 778 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, false)); |
760 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 779 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
761 // Internally, a circular buffer would now look like: | 780 // Internally, a circular buffer would now look like: |
762 // 301, 302, 303, 304, 104, 105, 106, 107, 200, 300 | 781 // 301, 302, 303, 304, 104, 105, 106, 107, 200, 300 |
763 | 782 |
764 // Read it all. | 783 // Read it all. |
765 num_bytes = sizeof(buffer); | 784 num_bytes = sizeof(buffer); |
766 memset(buffer, 0xab, sizeof(buffer)); | 785 memset(buffer, 0xab, sizeof(buffer)); |
767 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(buffer, &num_bytes, false)); | 786 EXPECT_EQ(MOJO_RESULT_OK, |
| 787 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 788 MakeUserPointer(&num_bytes), false)); |
768 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 789 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
769 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 790 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
770 expected_buffer[0] = 104; | 791 expected_buffer[0] = 104; |
771 expected_buffer[1] = 105; | 792 expected_buffer[1] = 105; |
772 expected_buffer[2] = 106; | 793 expected_buffer[2] = 106; |
773 expected_buffer[3] = 107; | 794 expected_buffer[3] = 107; |
774 expected_buffer[4] = 200; | 795 expected_buffer[4] = 200; |
775 expected_buffer[5] = 300; | 796 expected_buffer[5] = 300; |
776 expected_buffer[6] = 301; | 797 expected_buffer[6] = 301; |
777 expected_buffer[7] = 302; | 798 expected_buffer[7] = 302; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
840 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 861 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
841 // Only write 3 elements though. | 862 // Only write 3 elements though. |
842 Seq(700, 3, static_cast<int32_t*>(write_ptr)); | 863 Seq(700, 3, static_cast<int32_t*>(write_ptr)); |
843 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(3u * sizeof(int32_t))); | 864 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(3u * sizeof(int32_t))); |
844 // Internally, a circular buffer would now look like: | 865 // Internally, a circular buffer would now look like: |
845 // 500, 600, 601, 602, 603, 700, 701, 702, -, - | 866 // 500, 600, 601, 602, 603, 700, 701, 702, -, - |
846 | 867 |
847 // Read everything. | 868 // Read everything. |
848 num_bytes = sizeof(buffer); | 869 num_bytes = sizeof(buffer); |
849 memset(buffer, 0xab, sizeof(buffer)); | 870 memset(buffer, 0xab, sizeof(buffer)); |
850 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(buffer, &num_bytes, false)); | 871 EXPECT_EQ(MOJO_RESULT_OK, |
| 872 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 873 MakeUserPointer(&num_bytes), false)); |
851 EXPECT_EQ(8u * sizeof(int32_t), num_bytes); | 874 EXPECT_EQ(8u * sizeof(int32_t), num_bytes); |
852 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 875 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
853 expected_buffer[0] = 500; | 876 expected_buffer[0] = 500; |
854 expected_buffer[1] = 600; | 877 expected_buffer[1] = 600; |
855 expected_buffer[2] = 601; | 878 expected_buffer[2] = 601; |
856 expected_buffer[3] = 602; | 879 expected_buffer[3] = 602; |
857 expected_buffer[4] = 603; | 880 expected_buffer[4] = 603; |
858 expected_buffer[5] = 700; | 881 expected_buffer[5] = 700; |
859 expected_buffer[6] = 701; | 882 expected_buffer[6] = 701; |
860 expected_buffer[7] = 702; | 883 expected_buffer[7] = 702; |
(...skipping 18 matching lines...) Expand all Loading... |
879 | 902 |
880 // Try writing way too much. | 903 // Try writing way too much. |
881 uint32_t num_bytes = 20u * sizeof(int32_t); | 904 uint32_t num_bytes = 20u * sizeof(int32_t); |
882 int32_t buffer[100]; | 905 int32_t buffer[100]; |
883 Seq(0, arraysize(buffer), buffer); | 906 Seq(0, arraysize(buffer), buffer); |
884 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 907 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
885 dp->ProducerWriteData(buffer, &num_bytes, true)); | 908 dp->ProducerWriteData(buffer, &num_bytes, true)); |
886 | 909 |
887 // Should still be empty. | 910 // Should still be empty. |
888 num_bytes = ~0u; | 911 num_bytes = ~0u; |
889 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 912 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
890 EXPECT_EQ(0u, num_bytes); | 913 EXPECT_EQ(0u, num_bytes); |
891 | 914 |
892 // Write some data. | 915 // Write some data. |
893 num_bytes = 5u * sizeof(int32_t); | 916 num_bytes = 5u * sizeof(int32_t); |
894 Seq(100, arraysize(buffer), buffer); | 917 Seq(100, arraysize(buffer), buffer); |
895 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); | 918 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); |
896 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 919 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
897 | 920 |
898 // Half full. | 921 // Half full. |
899 num_bytes = 0u; | 922 num_bytes = 0u; |
900 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 923 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
901 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 924 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
902 | 925 |
903 // Too much. | 926 // Too much. |
904 num_bytes = 6u * sizeof(int32_t); | 927 num_bytes = 6u * sizeof(int32_t); |
905 Seq(200, arraysize(buffer), buffer); | 928 Seq(200, arraysize(buffer), buffer); |
906 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 929 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
907 dp->ProducerWriteData(buffer, &num_bytes, true)); | 930 dp->ProducerWriteData(buffer, &num_bytes, true)); |
908 | 931 |
909 // Try reading too much. | 932 // Try reading too much. |
910 num_bytes = 11u * sizeof(int32_t); | 933 num_bytes = 11u * sizeof(int32_t); |
911 memset(buffer, 0xab, sizeof(buffer)); | 934 memset(buffer, 0xab, sizeof(buffer)); |
912 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 935 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
913 dp->ConsumerReadData(buffer, &num_bytes, true)); | 936 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 937 MakeUserPointer(&num_bytes), true)); |
914 int32_t expected_buffer[100]; | 938 int32_t expected_buffer[100]; |
915 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 939 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
916 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 940 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
917 | 941 |
918 // Try discarding too much. | 942 // Try discarding too much. |
919 num_bytes = 11u * sizeof(int32_t); | 943 num_bytes = 11u * sizeof(int32_t); |
920 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 944 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
921 dp->ConsumerDiscardData(&num_bytes, true)); | 945 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
922 | 946 |
923 // Just a little. | 947 // Just a little. |
924 num_bytes = 2u * sizeof(int32_t); | 948 num_bytes = 2u * sizeof(int32_t); |
925 Seq(300, arraysize(buffer), buffer); | 949 Seq(300, arraysize(buffer), buffer); |
926 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); | 950 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); |
927 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); | 951 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); |
928 | 952 |
929 // Just right. | 953 // Just right. |
930 num_bytes = 3u * sizeof(int32_t); | 954 num_bytes = 3u * sizeof(int32_t); |
931 Seq(400, arraysize(buffer), buffer); | 955 Seq(400, arraysize(buffer), buffer); |
932 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); | 956 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); |
933 EXPECT_EQ(3u * sizeof(int32_t), num_bytes); | 957 EXPECT_EQ(3u * sizeof(int32_t), num_bytes); |
934 | 958 |
935 // Exactly full. | 959 // Exactly full. |
936 num_bytes = 0u; | 960 num_bytes = 0u; |
937 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 961 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
938 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 962 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
939 | 963 |
940 // Read half. | 964 // Read half. |
941 num_bytes = 5u * sizeof(int32_t); | 965 num_bytes = 5u * sizeof(int32_t); |
942 memset(buffer, 0xab, sizeof(buffer)); | 966 memset(buffer, 0xab, sizeof(buffer)); |
943 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(buffer, &num_bytes, true)); | 967 EXPECT_EQ(MOJO_RESULT_OK, |
| 968 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 969 MakeUserPointer(&num_bytes), true)); |
944 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 970 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
945 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 971 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
946 Seq(100, 5, expected_buffer); | 972 Seq(100, 5, expected_buffer); |
947 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 973 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
948 | 974 |
949 // Try reading too much again. | 975 // Try reading too much again. |
950 num_bytes = 6u * sizeof(int32_t); | 976 num_bytes = 6u * sizeof(int32_t); |
951 memset(buffer, 0xab, sizeof(buffer)); | 977 memset(buffer, 0xab, sizeof(buffer)); |
952 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 978 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
953 dp->ConsumerReadData(buffer, &num_bytes, true)); | 979 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 980 MakeUserPointer(&num_bytes), true)); |
954 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 981 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
955 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 982 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
956 | 983 |
957 // Try discarding too much again. | 984 // Try discarding too much again. |
958 num_bytes = 6u * sizeof(int32_t); | 985 num_bytes = 6u * sizeof(int32_t); |
959 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 986 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
960 dp->ConsumerDiscardData(&num_bytes, true)); | 987 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
961 | 988 |
962 // Discard a little. | 989 // Discard a little. |
963 num_bytes = 2u * sizeof(int32_t); | 990 num_bytes = 2u * sizeof(int32_t); |
964 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerDiscardData(&num_bytes, true)); | 991 EXPECT_EQ(MOJO_RESULT_OK, |
| 992 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
965 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); | 993 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); |
966 | 994 |
967 // Three left. | 995 // Three left. |
968 num_bytes = 0u; | 996 num_bytes = 0u; |
969 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 997 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
970 EXPECT_EQ(3u * sizeof(int32_t), num_bytes); | 998 EXPECT_EQ(3u * sizeof(int32_t), num_bytes); |
971 | 999 |
972 // Close the producer, then test producer-closed cases. | 1000 // Close the producer, then test producer-closed cases. |
973 dp->ProducerClose(); | 1001 dp->ProducerClose(); |
974 | 1002 |
975 // Try reading too much; "failed precondition" since the producer is closed. | 1003 // Try reading too much; "failed precondition" since the producer is closed. |
976 num_bytes = 4u * sizeof(int32_t); | 1004 num_bytes = 4u * sizeof(int32_t); |
977 memset(buffer, 0xab, sizeof(buffer)); | 1005 memset(buffer, 0xab, sizeof(buffer)); |
978 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1006 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
979 dp->ConsumerReadData(buffer, &num_bytes, true)); | 1007 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1008 MakeUserPointer(&num_bytes), true)); |
980 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1009 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
981 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1010 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
982 | 1011 |
983 // Try discarding too much; "failed precondition" again. | 1012 // Try discarding too much; "failed precondition" again. |
984 num_bytes = 4u * sizeof(int32_t); | 1013 num_bytes = 4u * sizeof(int32_t); |
985 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1014 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
986 dp->ConsumerDiscardData(&num_bytes, true)); | 1015 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
987 | 1016 |
988 // Read a little. | 1017 // Read a little. |
989 num_bytes = 2u * sizeof(int32_t); | 1018 num_bytes = 2u * sizeof(int32_t); |
990 memset(buffer, 0xab, sizeof(buffer)); | 1019 memset(buffer, 0xab, sizeof(buffer)); |
991 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(buffer, &num_bytes, true)); | 1020 EXPECT_EQ(MOJO_RESULT_OK, |
| 1021 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1022 MakeUserPointer(&num_bytes), true)); |
992 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); | 1023 EXPECT_EQ(2u * sizeof(int32_t), num_bytes); |
993 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1024 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
994 Seq(400, 2, expected_buffer); | 1025 Seq(400, 2, expected_buffer); |
995 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1026 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
996 | 1027 |
997 // Discard the remaining element. | 1028 // Discard the remaining element. |
998 num_bytes = 1u * sizeof(int32_t); | 1029 num_bytes = 1u * sizeof(int32_t); |
999 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerDiscardData(&num_bytes, true)); | 1030 EXPECT_EQ(MOJO_RESULT_OK, |
| 1031 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
1000 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1032 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
1001 | 1033 |
1002 // Empty again. | 1034 // Empty again. |
1003 num_bytes = ~0u; | 1035 num_bytes = ~0u; |
1004 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1036 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1005 EXPECT_EQ(0u, num_bytes); | 1037 EXPECT_EQ(0u, num_bytes); |
1006 | 1038 |
1007 dp->ConsumerClose(); | 1039 dp->ConsumerClose(); |
1008 } | 1040 } |
1009 | 1041 |
1010 TEST(LocalDataPipeTest, AllOrNoneMayDiscard) { | 1042 TEST(LocalDataPipeTest, AllOrNoneMayDiscard) { |
1011 const MojoCreateDataPipeOptions options = { | 1043 const MojoCreateDataPipeOptions options = { |
1012 kSizeOfOptions, // |struct_size|. | 1044 kSizeOfOptions, // |struct_size|. |
1013 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. | 1045 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_MAY_DISCARD, // |flags|. |
1014 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 1046 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
(...skipping 20 matching lines...) Expand all Loading... |
1035 | 1067 |
1036 // Write lots of stuff (discarding all but "104"). | 1068 // Write lots of stuff (discarding all but "104"). |
1037 num_bytes = 9u * sizeof(int32_t); | 1069 num_bytes = 9u * sizeof(int32_t); |
1038 Seq(200, arraysize(buffer), buffer); | 1070 Seq(200, arraysize(buffer), buffer); |
1039 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); | 1071 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); |
1040 EXPECT_EQ(9u * sizeof(int32_t), num_bytes); | 1072 EXPECT_EQ(9u * sizeof(int32_t), num_bytes); |
1041 | 1073 |
1042 // Read one. | 1074 // Read one. |
1043 num_bytes = 1u * sizeof(int32_t); | 1075 num_bytes = 1u * sizeof(int32_t); |
1044 memset(buffer, 0xab, sizeof(buffer)); | 1076 memset(buffer, 0xab, sizeof(buffer)); |
1045 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(buffer, &num_bytes, true)); | 1077 EXPECT_EQ(MOJO_RESULT_OK, |
| 1078 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1079 MakeUserPointer(&num_bytes), true)); |
1046 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1080 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
1047 int32_t expected_buffer[100]; | 1081 int32_t expected_buffer[100]; |
1048 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1082 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
1049 expected_buffer[0] = 104; | 1083 expected_buffer[0] = 104; |
1050 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1084 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
1051 | 1085 |
1052 // Try reading too many. | 1086 // Try reading too many. |
1053 num_bytes = 10u * sizeof(int32_t); | 1087 num_bytes = 10u * sizeof(int32_t); |
1054 memset(buffer, 0xab, sizeof(buffer)); | 1088 memset(buffer, 0xab, sizeof(buffer)); |
1055 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1089 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
1056 dp->ConsumerReadData(buffer, &num_bytes, true)); | 1090 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1091 MakeUserPointer(&num_bytes), true)); |
1057 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1092 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
1058 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1093 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
1059 | 1094 |
1060 // Try discarding too many. | 1095 // Try discarding too many. |
1061 num_bytes = 10u * sizeof(int32_t); | 1096 num_bytes = 10u * sizeof(int32_t); |
1062 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1097 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
1063 dp->ConsumerDiscardData(&num_bytes, true)); | 1098 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
1064 | 1099 |
1065 // Discard a bunch. | 1100 // Discard a bunch. |
1066 num_bytes = 4u * sizeof(int32_t); | 1101 num_bytes = 4u * sizeof(int32_t); |
1067 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerDiscardData(&num_bytes, true)); | 1102 EXPECT_EQ(MOJO_RESULT_OK, |
| 1103 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), true)); |
1068 | 1104 |
1069 // Half full. | 1105 // Half full. |
1070 num_bytes = 0u; | 1106 num_bytes = 0u; |
1071 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1107 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1072 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 1108 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
1073 | 1109 |
1074 // Write as much as possible. | 1110 // Write as much as possible. |
1075 num_bytes = 10u * sizeof(int32_t); | 1111 num_bytes = 10u * sizeof(int32_t); |
1076 Seq(300, arraysize(buffer), buffer); | 1112 Seq(300, arraysize(buffer), buffer); |
1077 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); | 1113 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); |
1078 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 1114 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
1079 | 1115 |
1080 // Read everything. | 1116 // Read everything. |
1081 num_bytes = 10u * sizeof(int32_t); | 1117 num_bytes = 10u * sizeof(int32_t); |
1082 memset(buffer, 0xab, sizeof(buffer)); | 1118 memset(buffer, 0xab, sizeof(buffer)); |
1083 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerReadData(buffer, &num_bytes, true)); | 1119 EXPECT_EQ(MOJO_RESULT_OK, |
| 1120 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1121 MakeUserPointer(&num_bytes), true)); |
1084 memset(expected_buffer, 0xab, sizeof(expected_buffer)); | 1122 memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
1085 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 1123 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
1086 Seq(300, 10, expected_buffer); | 1124 Seq(300, 10, expected_buffer); |
1087 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); | 1125 EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
1088 | 1126 |
1089 // Note: All-or-none two-phase writes on a "may discard" data pipe are tested | 1127 // Note: All-or-none two-phase writes on a "may discard" data pipe are tested |
1090 // in LocalDataPipeTest.MayDiscard. | 1128 // in LocalDataPipeTest.MayDiscard. |
1091 | 1129 |
1092 dp->ProducerClose(); | 1130 dp->ProducerClose(); |
1093 dp->ConsumerClose(); | 1131 dp->ConsumerClose(); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1154 read_ptr = NULL; | 1192 read_ptr = NULL; |
1155 EXPECT_EQ(MOJO_RESULT_OK, | 1193 EXPECT_EQ(MOJO_RESULT_OK, |
1156 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), | 1194 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
1157 MakeUserPointer(&num_bytes), true)); | 1195 MakeUserPointer(&num_bytes), true)); |
1158 EXPECT_GE(num_bytes, 1u * sizeof(int32_t)); | 1196 EXPECT_GE(num_bytes, 1u * sizeof(int32_t)); |
1159 EXPECT_EQ(0, static_cast<const int32_t*>(read_ptr)[0]); | 1197 EXPECT_EQ(0, static_cast<const int32_t*>(read_ptr)[0]); |
1160 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(1u * sizeof(int32_t))); | 1198 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(1u * sizeof(int32_t))); |
1161 | 1199 |
1162 // We should have four left, leaving room for six. | 1200 // We should have four left, leaving room for six. |
1163 num_bytes = 0u; | 1201 num_bytes = 0u; |
1164 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1202 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1165 EXPECT_EQ(4u * sizeof(int32_t), num_bytes); | 1203 EXPECT_EQ(4u * sizeof(int32_t), num_bytes); |
1166 | 1204 |
1167 // Assuming a tight circular buffer of the specified capacity, we can't do a | 1205 // Assuming a tight circular buffer of the specified capacity, we can't do a |
1168 // two-phase write of six now. | 1206 // two-phase write of six now. |
1169 num_bytes = 6u * sizeof(int32_t); | 1207 num_bytes = 6u * sizeof(int32_t); |
1170 write_ptr = NULL; | 1208 write_ptr = NULL; |
1171 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1209 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
1172 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 1210 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
1173 MakeUserPointer(&num_bytes), true)); | 1211 MakeUserPointer(&num_bytes), true)); |
1174 | 1212 |
1175 // Write six elements (simple), filling the buffer. | 1213 // Write six elements (simple), filling the buffer. |
1176 num_bytes = 6u * sizeof(int32_t); | 1214 num_bytes = 6u * sizeof(int32_t); |
1177 int32_t buffer[100]; | 1215 int32_t buffer[100]; |
1178 Seq(100, 6, buffer); | 1216 Seq(100, 6, buffer); |
1179 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); | 1217 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(buffer, &num_bytes, true)); |
1180 EXPECT_EQ(6u * sizeof(int32_t), num_bytes); | 1218 EXPECT_EQ(6u * sizeof(int32_t), num_bytes); |
1181 | 1219 |
1182 // We have ten. | 1220 // We have ten. |
1183 num_bytes = 0u; | 1221 num_bytes = 0u; |
1184 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1222 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1185 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); | 1223 EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
1186 | 1224 |
1187 // But a two-phase read of ten should fail. | 1225 // But a two-phase read of ten should fail. |
1188 num_bytes = 10u * sizeof(int32_t); | 1226 num_bytes = 10u * sizeof(int32_t); |
1189 read_ptr = NULL; | 1227 read_ptr = NULL; |
1190 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 1228 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
1191 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), | 1229 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
1192 MakeUserPointer(&num_bytes), true)); | 1230 MakeUserPointer(&num_bytes), true)); |
1193 | 1231 |
1194 // Close the producer. | 1232 // Close the producer. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1249 // Write 20 bytes. | 1287 // Write 20 bytes. |
1250 uint32_t num_bytes = 20u; | 1288 uint32_t num_bytes = 20u; |
1251 EXPECT_EQ(MOJO_RESULT_OK, | 1289 EXPECT_EQ(MOJO_RESULT_OK, |
1252 dp->ProducerWriteData(&test_data[0], &num_bytes, false)); | 1290 dp->ProducerWriteData(&test_data[0], &num_bytes, false)); |
1253 EXPECT_EQ(20u, num_bytes); | 1291 EXPECT_EQ(20u, num_bytes); |
1254 | 1292 |
1255 // Read 10 bytes. | 1293 // Read 10 bytes. |
1256 unsigned char read_buffer[1000] = { 0 }; | 1294 unsigned char read_buffer[1000] = { 0 }; |
1257 num_bytes = 10u; | 1295 num_bytes = 10u; |
1258 EXPECT_EQ(MOJO_RESULT_OK, | 1296 EXPECT_EQ(MOJO_RESULT_OK, |
1259 dp->ConsumerReadData(read_buffer, &num_bytes, false)); | 1297 dp->ConsumerReadData(UserPointer<void>(read_buffer), |
| 1298 MakeUserPointer(&num_bytes), false)); |
1260 EXPECT_EQ(10u, num_bytes); | 1299 EXPECT_EQ(10u, num_bytes); |
1261 EXPECT_EQ(0, memcmp(read_buffer, &test_data[0], 10u)); | 1300 EXPECT_EQ(0, memcmp(read_buffer, &test_data[0], 10u)); |
1262 | 1301 |
1263 // Check that a two-phase write can now only write (at most) 80 bytes. (This | 1302 // Check that a two-phase write can now only write (at most) 80 bytes. (This |
1264 // checks an implementation detail; this behavior is not guaranteed, but we | 1303 // checks an implementation detail; this behavior is not guaranteed, but we |
1265 // need it for this test.) | 1304 // need it for this test.) |
1266 void* write_buffer_ptr = NULL; | 1305 void* write_buffer_ptr = NULL; |
1267 num_bytes = 0u; | 1306 num_bytes = 0u; |
1268 EXPECT_EQ(MOJO_RESULT_OK, | 1307 EXPECT_EQ(MOJO_RESULT_OK, |
1269 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), | 1308 dp->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), |
(...skipping 20 matching lines...) Expand all Loading... |
1290 EXPECT_TRUE(read_buffer_ptr != NULL); | 1329 EXPECT_TRUE(read_buffer_ptr != NULL); |
1291 EXPECT_EQ(90u, num_bytes); | 1330 EXPECT_EQ(90u, num_bytes); |
1292 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u)); | 1331 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(0u)); |
1293 | 1332 |
1294 // Read as much as possible (using |ConsumerReadData()|). We should read 100 | 1333 // Read as much as possible (using |ConsumerReadData()|). We should read 100 |
1295 // bytes. | 1334 // bytes. |
1296 num_bytes = | 1335 num_bytes = |
1297 static_cast<uint32_t>(arraysize(read_buffer) * sizeof(read_buffer[0])); | 1336 static_cast<uint32_t>(arraysize(read_buffer) * sizeof(read_buffer[0])); |
1298 memset(read_buffer, 0, num_bytes); | 1337 memset(read_buffer, 0, num_bytes); |
1299 EXPECT_EQ(MOJO_RESULT_OK, | 1338 EXPECT_EQ(MOJO_RESULT_OK, |
1300 dp->ConsumerReadData(read_buffer, &num_bytes, false)); | 1339 dp->ConsumerReadData(UserPointer<void>(read_buffer), |
| 1340 MakeUserPointer(&num_bytes), false)); |
1301 EXPECT_EQ(100u, num_bytes); | 1341 EXPECT_EQ(100u, num_bytes); |
1302 EXPECT_EQ(0, memcmp(read_buffer, &test_data[10], 100u)); | 1342 EXPECT_EQ(0, memcmp(read_buffer, &test_data[10], 100u)); |
1303 | 1343 |
1304 dp->ProducerClose(); | 1344 dp->ProducerClose(); |
1305 dp->ConsumerClose(); | 1345 dp->ConsumerClose(); |
1306 } | 1346 } |
1307 | 1347 |
1308 // Tests the behavior of closing the producer or consumer with respect to | 1348 // Tests the behavior of closing the producer or consumer with respect to |
1309 // writes and reads (simple and two-phase). | 1349 // writes and reads (simple and two-phase). |
1310 TEST(LocalDataPipeTest, CloseWriteRead) { | 1350 TEST(LocalDataPipeTest, CloseWriteRead) { |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1456 dp->ProducerWriteData(kTestData, &num_bytes, false)); | 1496 dp->ProducerWriteData(kTestData, &num_bytes, false)); |
1457 EXPECT_EQ(kTestDataSize, num_bytes); | 1497 EXPECT_EQ(kTestDataSize, num_bytes); |
1458 | 1498 |
1459 // Close the producer. | 1499 // Close the producer. |
1460 dp->ProducerClose(); | 1500 dp->ProducerClose(); |
1461 | 1501 |
1462 // Read that data. | 1502 // Read that data. |
1463 char buffer[1000]; | 1503 char buffer[1000]; |
1464 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 1504 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
1465 EXPECT_EQ(MOJO_RESULT_OK, | 1505 EXPECT_EQ(MOJO_RESULT_OK, |
1466 dp->ConsumerReadData(buffer, &num_bytes, false)); | 1506 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1507 MakeUserPointer(&num_bytes), false)); |
1467 EXPECT_EQ(kTestDataSize, num_bytes); | 1508 EXPECT_EQ(kTestDataSize, num_bytes); |
1468 EXPECT_EQ(0, memcmp(buffer, kTestData, kTestDataSize)); | 1509 EXPECT_EQ(0, memcmp(buffer, kTestData, kTestDataSize)); |
1469 | 1510 |
1470 // A second read should fail. | 1511 // A second read should fail. |
1471 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 1512 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
1472 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1513 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
1473 dp->ConsumerReadData(buffer, &num_bytes, false)); | 1514 dp->ConsumerReadData(UserPointer<void>(buffer), |
| 1515 MakeUserPointer(&num_bytes), false)); |
1474 | 1516 |
1475 // A two-phase read should also fail. | 1517 // A two-phase read should also fail. |
1476 const void* read_buffer_ptr = NULL; | 1518 const void* read_buffer_ptr = NULL; |
1477 num_bytes = 0u; | 1519 num_bytes = 0u; |
1478 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1520 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
1479 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), | 1521 dp->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), |
1480 MakeUserPointer(&num_bytes), false)); | 1522 MakeUserPointer(&num_bytes), false)); |
1481 | 1523 |
1482 // Ditto for discard. | 1524 // Ditto for discard. |
1483 num_bytes = 10u; | 1525 num_bytes = 10u; |
1484 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1526 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
1485 dp->ConsumerDiscardData(&num_bytes, false)); | 1527 dp->ConsumerDiscardData(MakeUserPointer(&num_bytes), false)); |
1486 | 1528 |
1487 dp->ConsumerClose(); | 1529 dp->ConsumerClose(); |
1488 } | 1530 } |
1489 } | 1531 } |
1490 | 1532 |
1491 TEST(LocalDataPipeTest, TwoPhaseMoreInvalidArguments) { | 1533 TEST(LocalDataPipeTest, TwoPhaseMoreInvalidArguments) { |
1492 const MojoCreateDataPipeOptions options = { | 1534 const MojoCreateDataPipeOptions options = { |
1493 kSizeOfOptions, // |struct_size|. | 1535 kSizeOfOptions, // |struct_size|. |
1494 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 1536 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
1495 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. | 1537 static_cast<uint32_t>(sizeof(int32_t)), // |element_num_bytes|. |
1496 10 * sizeof(int32_t) // |capacity_num_bytes|. | 1538 10 * sizeof(int32_t) // |capacity_num_bytes|. |
1497 }; | 1539 }; |
1498 MojoCreateDataPipeOptions validated_options = { 0 }; | 1540 MojoCreateDataPipeOptions validated_options = { 0 }; |
1499 EXPECT_EQ(MOJO_RESULT_OK, | 1541 EXPECT_EQ(MOJO_RESULT_OK, |
1500 DataPipe::ValidateCreateOptions(&options, &validated_options)); | 1542 DataPipe::ValidateCreateOptions(&options, &validated_options)); |
1501 | 1543 |
1502 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); | 1544 scoped_refptr<LocalDataPipe> dp(new LocalDataPipe(validated_options)); |
1503 | 1545 |
1504 // No data. | 1546 // No data. |
1505 uint32_t num_bytes = 1000u; | 1547 uint32_t num_bytes = 1000u; |
1506 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1548 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1507 EXPECT_EQ(0u, num_bytes); | 1549 EXPECT_EQ(0u, num_bytes); |
1508 | 1550 |
1509 // Try "ending" a two-phase write when one isn't active. | 1551 // Try "ending" a two-phase write when one isn't active. |
1510 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1552 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
1511 dp->ProducerEndWriteData(1u * sizeof(int32_t))); | 1553 dp->ProducerEndWriteData(1u * sizeof(int32_t))); |
1512 | 1554 |
1513 // Still no data. | 1555 // Still no data. |
1514 num_bytes = 1000u; | 1556 num_bytes = 1000u; |
1515 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1557 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1516 EXPECT_EQ(0u, num_bytes); | 1558 EXPECT_EQ(0u, num_bytes); |
1517 | 1559 |
1518 // Try ending a two-phase write with an invalid amount (too much). | 1560 // Try ending a two-phase write with an invalid amount (too much). |
1519 num_bytes = 0u; | 1561 num_bytes = 0u; |
1520 void* write_ptr = NULL; | 1562 void* write_ptr = NULL; |
1521 EXPECT_EQ(MOJO_RESULT_OK, | 1563 EXPECT_EQ(MOJO_RESULT_OK, |
1522 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 1564 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
1523 MakeUserPointer(&num_bytes), false)); | 1565 MakeUserPointer(&num_bytes), false)); |
1524 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 1566 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
1525 dp->ProducerEndWriteData( | 1567 dp->ProducerEndWriteData( |
1526 num_bytes + static_cast<uint32_t>(sizeof(int32_t)))); | 1568 num_bytes + static_cast<uint32_t>(sizeof(int32_t)))); |
1527 | 1569 |
1528 // But the two-phase write still ended. | 1570 // But the two-phase write still ended. |
1529 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, dp->ProducerEndWriteData(0u)); | 1571 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, dp->ProducerEndWriteData(0u)); |
1530 | 1572 |
1531 // Still no data. | 1573 // Still no data. |
1532 num_bytes = 1000u; | 1574 num_bytes = 1000u; |
1533 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1575 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1534 EXPECT_EQ(0u, num_bytes); | 1576 EXPECT_EQ(0u, num_bytes); |
1535 | 1577 |
1536 // Try ending a two-phase write with an invalid amount (not a multiple of the | 1578 // Try ending a two-phase write with an invalid amount (not a multiple of the |
1537 // element size). | 1579 // element size). |
1538 num_bytes = 0u; | 1580 num_bytes = 0u; |
1539 write_ptr = NULL; | 1581 write_ptr = NULL; |
1540 EXPECT_EQ(MOJO_RESULT_OK, | 1582 EXPECT_EQ(MOJO_RESULT_OK, |
1541 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 1583 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
1542 MakeUserPointer(&num_bytes), false)); | 1584 MakeUserPointer(&num_bytes), false)); |
1543 EXPECT_GE(num_bytes, 1u); | 1585 EXPECT_GE(num_bytes, 1u); |
1544 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dp->ProducerEndWriteData(1u)); | 1586 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dp->ProducerEndWriteData(1u)); |
1545 | 1587 |
1546 // But the two-phase write still ended. | 1588 // But the two-phase write still ended. |
1547 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, dp->ProducerEndWriteData(0u)); | 1589 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, dp->ProducerEndWriteData(0u)); |
1548 | 1590 |
1549 // Still no data. | 1591 // Still no data. |
1550 num_bytes = 1000u; | 1592 num_bytes = 1000u; |
1551 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1593 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1552 EXPECT_EQ(0u, num_bytes); | 1594 EXPECT_EQ(0u, num_bytes); |
1553 | 1595 |
1554 // Now write some data, so we'll be able to try reading. | 1596 // Now write some data, so we'll be able to try reading. |
1555 int32_t element = 123; | 1597 int32_t element = 123; |
1556 num_bytes = 1u * sizeof(int32_t); | 1598 num_bytes = 1u * sizeof(int32_t); |
1557 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(&element, &num_bytes, false)); | 1599 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerWriteData(&element, &num_bytes, false)); |
1558 | 1600 |
1559 // One element available. | 1601 // One element available. |
1560 num_bytes = 0u; | 1602 num_bytes = 0u; |
1561 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1603 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1562 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1604 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
1563 | 1605 |
1564 // Try "ending" a two-phase read when one isn't active. | 1606 // Try "ending" a two-phase read when one isn't active. |
1565 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1607 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
1566 dp->ConsumerEndReadData(1u * sizeof(int32_t))); | 1608 dp->ConsumerEndReadData(1u * sizeof(int32_t))); |
1567 | 1609 |
1568 // Still one element available. | 1610 // Still one element available. |
1569 num_bytes = 0u; | 1611 num_bytes = 0u; |
1570 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1612 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1571 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1613 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
1572 | 1614 |
1573 // Try ending a two-phase read with an invalid amount (too much). | 1615 // Try ending a two-phase read with an invalid amount (too much). |
1574 num_bytes = 0u; | 1616 num_bytes = 0u; |
1575 const void* read_ptr = NULL; | 1617 const void* read_ptr = NULL; |
1576 EXPECT_EQ(MOJO_RESULT_OK, | 1618 EXPECT_EQ(MOJO_RESULT_OK, |
1577 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), | 1619 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
1578 MakeUserPointer(&num_bytes), false)); | 1620 MakeUserPointer(&num_bytes), false)); |
1579 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 1621 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
1580 dp->ConsumerEndReadData( | 1622 dp->ConsumerEndReadData( |
1581 num_bytes + static_cast<uint32_t>(sizeof(int32_t)))); | 1623 num_bytes + static_cast<uint32_t>(sizeof(int32_t)))); |
1582 | 1624 |
1583 // Still one element available. | 1625 // Still one element available. |
1584 num_bytes = 0u; | 1626 num_bytes = 0u; |
1585 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1627 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1586 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1628 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
1587 | 1629 |
1588 // Try ending a two-phase read with an invalid amount (not a multiple of the | 1630 // Try ending a two-phase read with an invalid amount (not a multiple of the |
1589 // element size). | 1631 // element size). |
1590 num_bytes = 0u; | 1632 num_bytes = 0u; |
1591 read_ptr = NULL; | 1633 read_ptr = NULL; |
1592 EXPECT_EQ(MOJO_RESULT_OK, | 1634 EXPECT_EQ(MOJO_RESULT_OK, |
1593 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), | 1635 dp->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
1594 MakeUserPointer(&num_bytes), false)); | 1636 MakeUserPointer(&num_bytes), false)); |
1595 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1637 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
1596 EXPECT_EQ(123, static_cast<const int32_t*>(read_ptr)[0]); | 1638 EXPECT_EQ(123, static_cast<const int32_t*>(read_ptr)[0]); |
1597 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dp->ConsumerEndReadData(1u)); | 1639 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, dp->ConsumerEndReadData(1u)); |
1598 | 1640 |
1599 // Still one element available. | 1641 // Still one element available. |
1600 num_bytes = 0u; | 1642 num_bytes = 0u; |
1601 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(&num_bytes)); | 1643 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
1602 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); | 1644 EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
1603 | 1645 |
1604 dp->ProducerClose(); | 1646 dp->ProducerClose(); |
1605 dp->ConsumerClose(); | 1647 dp->ConsumerClose(); |
1606 } | 1648 } |
1607 | 1649 |
1608 // Tests that even with "may discard", the data won't change under a two-phase | 1650 // Tests that even with "may discard", the data won't change under a two-phase |
1609 // read. | 1651 // read. |
1610 // TODO(vtl): crbug.com/348644: We currently don't pass this. (There are two | 1652 // TODO(vtl): crbug.com/348644: We currently don't pass this. (There are two |
1611 // related issues: First, we don't recognize that the data given to | 1653 // related issues: First, we don't recognize that the data given to |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1675 // End reading. | 1717 // End reading. |
1676 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); | 1718 EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerEndReadData(2u)); |
1677 | 1719 |
1678 dp->ProducerClose(); | 1720 dp->ProducerClose(); |
1679 dp->ConsumerClose(); | 1721 dp->ConsumerClose(); |
1680 } | 1722 } |
1681 | 1723 |
1682 } // namespace | 1724 } // namespace |
1683 } // namespace system | 1725 } // namespace system |
1684 } // namespace mojo | 1726 } // namespace mojo |
OLD | NEW |