OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This file contains tests that are shared between different implementations of | 5 // This file contains tests that are shared between different implementations of |
6 // |DataPipeImpl|. | 6 // |DataPipeImpl|. |
7 | 7 |
8 #include "mojo/edk/system/data_pipe_impl.h" | 8 #include "mojo/edk/system/data_pipe_impl.h" |
9 | 9 |
10 #include <stdint.h> | 10 #include <stdint.h> |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 | 113 |
114 void Reset() { | 114 void Reset() { |
115 if (helper_) | 115 if (helper_) |
116 helper_->TearDown(); | 116 helper_->TearDown(); |
117 | 117 |
118 helper_.reset(new Helper()); | 118 helper_.reset(new Helper()); |
119 helper_->SetUp(); | 119 helper_->SetUp(); |
120 } | 120 } |
121 | 121 |
122 void ProducerClose() { helper_->ProducerClose(); } | 122 void ProducerClose() { helper_->ProducerClose(); } |
| 123 MojoResult ProducerSetOptions(uint32_t write_threshold_num_bytes) { |
| 124 return dpp()->ProducerSetOptions(write_threshold_num_bytes); |
| 125 } |
| 126 void ProducerGetOptions(uint32_t* write_threshold_num_bytes) { |
| 127 dpp()->ProducerGetOptions(write_threshold_num_bytes); |
| 128 } |
123 MojoResult ProducerWriteData(UserPointer<const void> elements, | 129 MojoResult ProducerWriteData(UserPointer<const void> elements, |
124 UserPointer<uint32_t> num_bytes, | 130 UserPointer<uint32_t> num_bytes, |
125 bool all_or_none) { | 131 bool all_or_none) { |
126 return dpp()->ProducerWriteData(elements, num_bytes, all_or_none); | 132 return dpp()->ProducerWriteData(elements, num_bytes, all_or_none); |
127 } | 133 } |
128 MojoResult ProducerBeginWriteData(UserPointer<void*> buffer, | 134 MojoResult ProducerBeginWriteData(UserPointer<void*> buffer, |
129 UserPointer<uint32_t> buffer_num_bytes) { | 135 UserPointer<uint32_t> buffer_num_bytes) { |
130 return dpp()->ProducerBeginWriteData(buffer, buffer_num_bytes); | 136 return dpp()->ProducerBeginWriteData(buffer, buffer_num_bytes); |
131 } | 137 } |
132 MojoResult ProducerEndWriteData(uint32_t num_bytes_written) { | 138 MojoResult ProducerEndWriteData(uint32_t num_bytes_written) { |
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
770 Waiter cwaiter; // For consumer. | 776 Waiter cwaiter; // For consumer. |
771 HandleSignalsState hss; | 777 HandleSignalsState hss; |
772 uint32_t context; | 778 uint32_t context; |
773 | 779 |
774 // Never readable. | 780 // Never readable. |
775 pwaiter.Init(); | 781 pwaiter.Init(); |
776 hss = HandleSignalsState(); | 782 hss = HandleSignalsState(); |
777 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 783 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
778 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_READABLE, 12, | 784 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_READABLE, 12, |
779 &hss)); | 785 &hss)); |
780 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 786 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
781 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 787 hss.satisfied_signals); |
| 788 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 789 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
782 hss.satisfiable_signals); | 790 hss.satisfiable_signals); |
783 | 791 |
784 // Already writable. | 792 // Already writable. |
785 pwaiter.Init(); | 793 pwaiter.Init(); |
786 hss = HandleSignalsState(); | 794 hss = HandleSignalsState(); |
787 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 795 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
788 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34, | 796 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34, |
789 &hss)); | 797 &hss)); |
790 | 798 |
791 // We'll need to wait for readability for the remote cases. | 799 // We'll need to wait for readability for the remote cases. |
(...skipping 13 matching lines...) Expand all Loading... |
805 // Adding a waiter should now succeed. | 813 // Adding a waiter should now succeed. |
806 pwaiter.Init(); | 814 pwaiter.Init(); |
807 ASSERT_EQ(MOJO_RESULT_OK, | 815 ASSERT_EQ(MOJO_RESULT_OK, |
808 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, | 816 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, |
809 nullptr)); | 817 nullptr)); |
810 // And it shouldn't be writable yet. | 818 // And it shouldn't be writable yet. |
811 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); | 819 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); |
812 hss = HandleSignalsState(); | 820 hss = HandleSignalsState(); |
813 this->ProducerRemoveAwakable(&pwaiter, &hss); | 821 this->ProducerRemoveAwakable(&pwaiter, &hss); |
814 EXPECT_EQ(0u, hss.satisfied_signals); | 822 EXPECT_EQ(0u, hss.satisfied_signals); |
815 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 823 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 824 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
816 hss.satisfiable_signals); | 825 hss.satisfiable_signals); |
817 | 826 |
818 // Wait for data to become available to the consumer. | 827 // Wait for data to become available to the consumer. |
819 context = 0; | 828 context = 0; |
820 EXPECT_EQ(MOJO_RESULT_OK, cwaiter.Wait(test::TinyTimeout(), &context)); | 829 EXPECT_EQ(MOJO_RESULT_OK, cwaiter.Wait(test::TinyTimeout(), &context)); |
821 EXPECT_EQ(1234u, context); | 830 EXPECT_EQ(1234u, context); |
822 hss = HandleSignalsState(); | 831 hss = HandleSignalsState(); |
823 this->ConsumerRemoveAwakable(&cwaiter, &hss); | 832 this->ConsumerRemoveAwakable(&cwaiter, &hss); |
824 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 833 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
825 hss.satisfied_signals); | 834 hss.satisfied_signals); |
(...skipping 15 matching lines...) Expand all Loading... |
841 // Add a waiter. | 850 // Add a waiter. |
842 pwaiter.Init(); | 851 pwaiter.Init(); |
843 ASSERT_EQ(MOJO_RESULT_OK, | 852 ASSERT_EQ(MOJO_RESULT_OK, |
844 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, | 853 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, |
845 nullptr)); | 854 nullptr)); |
846 // And it still shouldn't be writable yet. | 855 // And it still shouldn't be writable yet. |
847 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); | 856 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); |
848 hss = HandleSignalsState(); | 857 hss = HandleSignalsState(); |
849 this->ProducerRemoveAwakable(&pwaiter, &hss); | 858 this->ProducerRemoveAwakable(&pwaiter, &hss); |
850 EXPECT_EQ(0u, hss.satisfied_signals); | 859 EXPECT_EQ(0u, hss.satisfied_signals); |
851 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 860 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 861 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
852 hss.satisfiable_signals); | 862 hss.satisfiable_signals); |
853 | 863 |
854 // Do it again. | 864 // Do it again. |
855 pwaiter.Init(); | 865 pwaiter.Init(); |
856 ASSERT_EQ(MOJO_RESULT_OK, | 866 ASSERT_EQ(MOJO_RESULT_OK, |
857 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78, | 867 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78, |
858 nullptr)); | 868 nullptr)); |
859 | 869 |
860 // Read one element. | 870 // Read one element. |
861 elements[0] = -1; | 871 elements[0] = -1; |
862 elements[1] = -1; | 872 elements[1] = -1; |
863 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 873 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
864 EXPECT_EQ(MOJO_RESULT_OK, | 874 EXPECT_EQ(MOJO_RESULT_OK, |
865 this->ConsumerReadData(UserPointer<void>(elements), | 875 this->ConsumerReadData(UserPointer<void>(elements), |
866 MakeUserPointer(&num_bytes), true, false)); | 876 MakeUserPointer(&num_bytes), true, false)); |
867 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 877 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
868 EXPECT_EQ(123, elements[0]); | 878 EXPECT_EQ(123, elements[0]); |
869 EXPECT_EQ(-1, elements[1]); | 879 EXPECT_EQ(-1, elements[1]); |
870 | 880 |
871 // Waiting should now succeed. | 881 // Waiting should now succeed. |
872 context = 0; | 882 context = 0; |
873 EXPECT_EQ(MOJO_RESULT_OK, pwaiter.Wait(test::TinyTimeout(), &context)); | 883 EXPECT_EQ(MOJO_RESULT_OK, pwaiter.Wait(test::TinyTimeout(), &context)); |
874 EXPECT_EQ(78u, context); | 884 EXPECT_EQ(78u, context); |
875 hss = HandleSignalsState(); | 885 hss = HandleSignalsState(); |
876 this->ProducerRemoveAwakable(&pwaiter, &hss); | 886 this->ProducerRemoveAwakable(&pwaiter, &hss); |
877 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 887 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
878 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 888 hss.satisfied_signals); |
| 889 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 890 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
879 hss.satisfiable_signals); | 891 hss.satisfiable_signals); |
880 | 892 |
881 // Try writing, using a two-phase write. | 893 // Try writing, using a two-phase write. |
882 void* buffer = nullptr; | 894 void* buffer = nullptr; |
883 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); | 895 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); |
884 EXPECT_EQ(MOJO_RESULT_OK, | 896 EXPECT_EQ(MOJO_RESULT_OK, |
885 this->ProducerBeginWriteData(MakeUserPointer(&buffer), | 897 this->ProducerBeginWriteData(MakeUserPointer(&buffer), |
886 MakeUserPointer(&num_bytes))); | 898 MakeUserPointer(&num_bytes))); |
887 EXPECT_TRUE(buffer); | 899 EXPECT_TRUE(buffer); |
888 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 900 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
(...skipping 22 matching lines...) Expand all Loading... |
911 EXPECT_EQ(456, static_cast<const int32_t*>(read_buffer)[0]); | 923 EXPECT_EQ(456, static_cast<const int32_t*>(read_buffer)[0]); |
912 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(static_cast<uint32_t>( | 924 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(static_cast<uint32_t>( |
913 1u * sizeof(elements[0])))); | 925 1u * sizeof(elements[0])))); |
914 | 926 |
915 // Waiting should succeed. | 927 // Waiting should succeed. |
916 context = 0; | 928 context = 0; |
917 EXPECT_EQ(MOJO_RESULT_OK, pwaiter.Wait(test::TinyTimeout(), &context)); | 929 EXPECT_EQ(MOJO_RESULT_OK, pwaiter.Wait(test::TinyTimeout(), &context)); |
918 EXPECT_EQ(90u, context); | 930 EXPECT_EQ(90u, context); |
919 hss = HandleSignalsState(); | 931 hss = HandleSignalsState(); |
920 this->ProducerRemoveAwakable(&pwaiter, &hss); | 932 this->ProducerRemoveAwakable(&pwaiter, &hss); |
921 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 933 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
922 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 934 hss.satisfied_signals); |
| 935 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 936 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
923 hss.satisfiable_signals); | 937 hss.satisfiable_signals); |
924 | 938 |
925 // Write one element. | 939 // Write one element. |
926 elements[0] = 123; | 940 elements[0] = 123; |
927 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 941 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
928 EXPECT_EQ(MOJO_RESULT_OK, | 942 EXPECT_EQ(MOJO_RESULT_OK, |
929 this->ProducerWriteData(UserPointer<const void>(elements), | 943 this->ProducerWriteData(UserPointer<const void>(elements), |
930 MakeUserPointer(&num_bytes), false)); | 944 MakeUserPointer(&num_bytes), false)); |
931 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 945 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
932 | 946 |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1334 Waiter pwaiter; // For producer. | 1348 Waiter pwaiter; // For producer. |
1335 Waiter cwaiter; // For consumer. | 1349 Waiter cwaiter; // For consumer. |
1336 HandleSignalsState hss; | 1350 HandleSignalsState hss; |
1337 | 1351 |
1338 // It should be writable. | 1352 // It should be writable. |
1339 pwaiter.Init(); | 1353 pwaiter.Init(); |
1340 hss = HandleSignalsState(); | 1354 hss = HandleSignalsState(); |
1341 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 1355 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
1342 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, | 1356 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, |
1343 &hss)); | 1357 &hss)); |
1344 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 1358 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1345 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1359 hss.satisfied_signals); |
| 1360 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1361 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1346 hss.satisfiable_signals); | 1362 hss.satisfiable_signals); |
1347 | 1363 |
1348 void* write_ptr = nullptr; | 1364 void* write_ptr = nullptr; |
1349 uint32_t num_bytes = 0u; | 1365 uint32_t num_bytes = 0u; |
1350 EXPECT_EQ(MOJO_RESULT_OK, | 1366 EXPECT_EQ(MOJO_RESULT_OK, |
1351 this->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 1367 this->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
1352 MakeUserPointer(&num_bytes))); | 1368 MakeUserPointer(&num_bytes))); |
1353 EXPECT_TRUE(write_ptr); | 1369 EXPECT_TRUE(write_ptr); |
1354 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); | 1370 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); |
1355 | 1371 |
1356 // At this point, it shouldn't be writable. | 1372 // At this point, it shouldn't be writable. |
1357 pwaiter.Init(); | 1373 pwaiter.Init(); |
1358 ASSERT_EQ(MOJO_RESULT_OK, | 1374 ASSERT_EQ(MOJO_RESULT_OK, |
1359 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, | 1375 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, |
1360 nullptr)); | 1376 nullptr)); |
1361 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); | 1377 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); |
1362 hss = HandleSignalsState(); | 1378 hss = HandleSignalsState(); |
1363 this->ProducerRemoveAwakable(&pwaiter, &hss); | 1379 this->ProducerRemoveAwakable(&pwaiter, &hss); |
1364 EXPECT_EQ(0u, hss.satisfied_signals); | 1380 EXPECT_EQ(0u, hss.satisfied_signals); |
1365 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1381 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1382 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1366 hss.satisfiable_signals); | 1383 hss.satisfiable_signals); |
1367 | 1384 |
1368 // It shouldn't be readable yet either (we'll wait later). | 1385 // It shouldn't be readable yet either (we'll wait later). |
1369 cwaiter.Init(); | 1386 cwaiter.Init(); |
1370 ASSERT_EQ(MOJO_RESULT_OK, | 1387 ASSERT_EQ(MOJO_RESULT_OK, |
1371 this->ConsumerAddAwakable(&cwaiter, MOJO_HANDLE_SIGNAL_READABLE, 2, | 1388 this->ConsumerAddAwakable(&cwaiter, MOJO_HANDLE_SIGNAL_READABLE, 2, |
1372 nullptr)); | 1389 nullptr)); |
1373 | 1390 |
1374 static_cast<int32_t*>(write_ptr)[0] = 123; | 1391 static_cast<int32_t*>(write_ptr)[0] = 123; |
1375 EXPECT_EQ(MOJO_RESULT_OK, this->ProducerEndWriteData( | 1392 EXPECT_EQ(MOJO_RESULT_OK, this->ProducerEndWriteData( |
1376 static_cast<uint32_t>(1u * sizeof(int32_t)))); | 1393 static_cast<uint32_t>(1u * sizeof(int32_t)))); |
1377 | 1394 |
1378 // It should immediately be writable again. | 1395 // It should immediately be writable again. |
1379 pwaiter.Init(); | 1396 pwaiter.Init(); |
1380 hss = HandleSignalsState(); | 1397 hss = HandleSignalsState(); |
1381 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 1398 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
1382 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, | 1399 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, |
1383 &hss)); | 1400 &hss)); |
1384 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 1401 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1385 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1402 hss.satisfied_signals); |
| 1403 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1404 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1386 hss.satisfiable_signals); | 1405 hss.satisfiable_signals); |
1387 | 1406 |
1388 // It should become readable. | 1407 // It should become readable. |
1389 EXPECT_EQ(MOJO_RESULT_OK, cwaiter.Wait(test::TinyTimeout(), nullptr)); | 1408 EXPECT_EQ(MOJO_RESULT_OK, cwaiter.Wait(test::TinyTimeout(), nullptr)); |
1390 hss = HandleSignalsState(); | 1409 hss = HandleSignalsState(); |
1391 this->ConsumerRemoveAwakable(&cwaiter, &hss); | 1410 this->ConsumerRemoveAwakable(&cwaiter, &hss); |
1392 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1411 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
1393 hss.satisfied_signals); | 1412 hss.satisfied_signals); |
1394 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1413 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
1395 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1414 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1428 MakeUserPointer(&num_bytes))); | 1447 MakeUserPointer(&num_bytes))); |
1429 EXPECT_TRUE(read_ptr); | 1448 EXPECT_TRUE(read_ptr); |
1430 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes); | 1449 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes); |
1431 | 1450 |
1432 // At this point, it should still be writable. | 1451 // At this point, it should still be writable. |
1433 pwaiter.Init(); | 1452 pwaiter.Init(); |
1434 hss = HandleSignalsState(); | 1453 hss = HandleSignalsState(); |
1435 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 1454 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
1436 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, | 1455 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, |
1437 &hss)); | 1456 &hss)); |
1438 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 1457 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1439 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1458 hss.satisfied_signals); |
| 1459 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1460 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1440 hss.satisfiable_signals); | 1461 hss.satisfiable_signals); |
1441 | 1462 |
1442 // But not readable. | 1463 // But not readable. |
1443 cwaiter.Init(); | 1464 cwaiter.Init(); |
1444 ASSERT_EQ(MOJO_RESULT_OK, | 1465 ASSERT_EQ(MOJO_RESULT_OK, |
1445 this->ConsumerAddAwakable(&cwaiter, MOJO_HANDLE_SIGNAL_READABLE, 7, | 1466 this->ConsumerAddAwakable(&cwaiter, MOJO_HANDLE_SIGNAL_READABLE, 7, |
1446 nullptr)); | 1467 nullptr)); |
1447 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, cwaiter.Wait(0, nullptr)); | 1468 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, cwaiter.Wait(0, nullptr)); |
1448 hss = HandleSignalsState(); | 1469 hss = HandleSignalsState(); |
1449 this->ConsumerRemoveAwakable(&cwaiter, &hss); | 1470 this->ConsumerRemoveAwakable(&cwaiter, &hss); |
(...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2542 // |ConsumerEndReadData()| below) we want |producer_open()| to be false but | 2563 // |ConsumerEndReadData()| below) we want |producer_open()| to be false but |
2543 // the call to |channel_endpoint_->EnqueueMessage()| to fail. (This race can | 2564 // the call to |channel_endpoint_->EnqueueMessage()| to fail. (This race can |
2544 // occur without the sleep, but is much less likely.) | 2565 // occur without the sleep, but is much less likely.) |
2545 ThreadSleep(10u); | 2566 ThreadSleep(10u); |
2546 | 2567 |
2547 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(num_bytes)); | 2568 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(num_bytes)); |
2548 | 2569 |
2549 this->ConsumerClose(); | 2570 this->ConsumerClose(); |
2550 } | 2571 } |
2551 | 2572 |
| 2573 TYPED_TEST(DataPipeImplTest, WriteThreshold) { |
| 2574 const MojoCreateDataPipeOptions options = { |
| 2575 kSizeOfOptions, // |struct_size|. |
| 2576 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
| 2577 1u, // |element_num_bytes|. |
| 2578 10u // |capacity_num_bytes|. |
| 2579 }; |
| 2580 this->Create(options); |
| 2581 this->DoTransfer(); |
| 2582 |
| 2583 // The default write threshold should be 0 (which means "default", i.e., one |
| 2584 // element). |
| 2585 uint32_t write_threshold_num_bytes = 123; |
| 2586 this->ProducerGetOptions(&write_threshold_num_bytes); |
| 2587 EXPECT_EQ(0u, write_threshold_num_bytes); |
| 2588 |
| 2589 Waiter waiter; |
| 2590 HandleSignalsState hss; |
| 2591 |
| 2592 // Try to wait to the write threshold signal; it should already have it. |
| 2593 waiter.Init(); |
| 2594 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 2595 this->ProducerAddAwakable( |
| 2596 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, &hss)); |
| 2597 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2598 hss.satisfied_signals); |
| 2599 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2600 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2601 hss.satisfiable_signals); |
| 2602 |
| 2603 // Before writing, add a waiter on the consumer (since we'll need to know when |
| 2604 // the written bytes have propagated). |
| 2605 Waiter read_waiter; |
| 2606 read_waiter.Init(); |
| 2607 ASSERT_EQ(MOJO_RESULT_OK, |
| 2608 this->ConsumerAddAwakable(&read_waiter, MOJO_HANDLE_SIGNAL_READABLE, |
| 2609 0, nullptr)); |
| 2610 |
| 2611 // Write 5 bytes. |
| 2612 static const char kTestData[5] = {'A', 'B', 'C', 'D', 'E'}; |
| 2613 uint32_t num_bytes = 5; |
| 2614 EXPECT_EQ(MOJO_RESULT_OK, |
| 2615 this->ProducerWriteData(UserPointer<const void>(kTestData), |
| 2616 MakeUserPointer(&num_bytes), false)); |
| 2617 EXPECT_EQ(5u, num_bytes); |
| 2618 |
| 2619 // It should still have the write threshold signal. |
| 2620 waiter.Init(); |
| 2621 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 2622 this->ProducerAddAwakable( |
| 2623 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr)); |
| 2624 |
| 2625 // Set the write threshold to 5. |
| 2626 this->ProducerSetOptions(5); |
| 2627 write_threshold_num_bytes = 123u; |
| 2628 this->ProducerGetOptions(&write_threshold_num_bytes); |
| 2629 EXPECT_EQ(5u, write_threshold_num_bytes); |
| 2630 |
| 2631 // Should still have the write threshold signal. |
| 2632 waiter.Init(); |
| 2633 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 2634 this->ProducerAddAwakable( |
| 2635 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr)); |
| 2636 |
| 2637 // Set the write threshold to 6. |
| 2638 this->ProducerSetOptions(6); |
| 2639 |
| 2640 // Should no longer have the write threshold signal. |
| 2641 waiter.Init(); |
| 2642 ASSERT_EQ(MOJO_RESULT_OK, |
| 2643 this->ProducerAddAwakable( |
| 2644 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr)); |
| 2645 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 2646 hss = HandleSignalsState(); |
| 2647 this->ProducerRemoveAwakable(&waiter, &hss); |
| 2648 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 2649 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2650 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2651 hss.satisfiable_signals); |
| 2652 |
| 2653 // Add a waiter. |
| 2654 waiter.Init(); |
| 2655 ASSERT_EQ(MOJO_RESULT_OK, |
| 2656 this->ProducerAddAwakable( |
| 2657 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr)); |
| 2658 |
| 2659 // Wait for the consumer to be readable. |
| 2660 EXPECT_EQ(MOJO_RESULT_OK, read_waiter.Wait(test::TinyTimeout(), nullptr)); |
| 2661 this->ConsumerRemoveAwakable(&read_waiter, nullptr); |
| 2662 |
| 2663 // Read a byte. |
| 2664 char read_byte = 'a'; |
| 2665 num_bytes = sizeof(read_byte); |
| 2666 EXPECT_EQ(MOJO_RESULT_OK, |
| 2667 this->ConsumerReadData(UserPointer<void>(&read_byte), |
| 2668 MakeUserPointer(&num_bytes), true, false)); |
| 2669 EXPECT_EQ(1u, num_bytes); |
| 2670 EXPECT_EQ(kTestData[0], read_byte); |
| 2671 |
| 2672 // Wait; should get the write threshold signal. |
| 2673 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); |
| 2674 hss = HandleSignalsState(); |
| 2675 this->ProducerRemoveAwakable(&waiter, &hss); |
| 2676 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2677 hss.satisfied_signals); |
| 2678 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2679 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2680 hss.satisfiable_signals); |
| 2681 |
| 2682 // Write 6 more bytes. |
| 2683 static const char kMoreTestData[6] = {'1', '2', '3', '4', '5', '6'}; |
| 2684 num_bytes = 6; |
| 2685 EXPECT_EQ(MOJO_RESULT_OK, |
| 2686 this->ProducerWriteData(UserPointer<const void>(kMoreTestData), |
| 2687 MakeUserPointer(&num_bytes), false)); |
| 2688 EXPECT_EQ(6u, num_bytes); |
| 2689 |
| 2690 // Should no longer have the write threshold signal. |
| 2691 waiter.Init(); |
| 2692 ASSERT_EQ(MOJO_RESULT_OK, |
| 2693 this->ProducerAddAwakable( |
| 2694 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr)); |
| 2695 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 2696 this->ProducerRemoveAwakable(&waiter, nullptr); |
| 2697 |
| 2698 // Set the write threshold to 0 (which means the element size, 1). |
| 2699 this->ProducerSetOptions(0); |
| 2700 write_threshold_num_bytes = 123u; |
| 2701 this->ProducerGetOptions(&write_threshold_num_bytes); |
| 2702 EXPECT_EQ(0u, write_threshold_num_bytes); |
| 2703 |
| 2704 // Should still not have the write threshold signal. |
| 2705 waiter.Init(); |
| 2706 ASSERT_EQ(MOJO_RESULT_OK, |
| 2707 this->ProducerAddAwakable( |
| 2708 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr)); |
| 2709 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
| 2710 this->ProducerRemoveAwakable(&waiter, nullptr); |
| 2711 |
| 2712 // Add a waiter. |
| 2713 waiter.Init(); |
| 2714 ASSERT_EQ(MOJO_RESULT_OK, |
| 2715 this->ProducerAddAwakable( |
| 2716 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr)); |
| 2717 |
| 2718 // Close the consumer. |
| 2719 this->ConsumerClose(); |
| 2720 |
| 2721 // Wait; the condition should now never be satisfiable. |
| 2722 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 2723 waiter.Wait(test::TinyTimeout(), nullptr)); |
| 2724 hss = HandleSignalsState(); |
| 2725 this->ProducerRemoveAwakable(&waiter, &hss); |
| 2726 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 2727 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 2728 |
| 2729 this->ProducerClose(); |
| 2730 } |
| 2731 |
2552 TYPED_TEST(DataPipeImplTest, ReadThreshold) { | 2732 TYPED_TEST(DataPipeImplTest, ReadThreshold) { |
2553 const MojoCreateDataPipeOptions options = { | 2733 const MojoCreateDataPipeOptions options = { |
2554 kSizeOfOptions, // |struct_size|. | 2734 kSizeOfOptions, // |struct_size|. |
2555 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. | 2735 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. |
2556 1u, // |element_num_bytes|. | 2736 1u, // |element_num_bytes|. |
2557 1000u // |capacity_num_bytes|. | 2737 1000u // |capacity_num_bytes|. |
2558 }; | 2738 }; |
2559 this->Create(options); | 2739 this->Create(options); |
2560 this->DoTransfer(); | 2740 this->DoTransfer(); |
2561 | 2741 |
2562 // The default read threshold should be 0 (which means "default", i.e., one | 2742 // The default read threshold should be 0 (which means "default", i.e., one |
2563 // element). | 2743 // element). |
2564 uint32_t read_threshold_num_bytes = 123u; | 2744 uint32_t read_threshold_num_bytes = 123; |
2565 this->ConsumerGetOptions(&read_threshold_num_bytes); | 2745 this->ConsumerGetOptions(&read_threshold_num_bytes); |
2566 EXPECT_EQ(0u, read_threshold_num_bytes); | 2746 EXPECT_EQ(0u, read_threshold_num_bytes); |
2567 | 2747 |
2568 Waiter waiter; | 2748 Waiter waiter; |
2569 HandleSignalsState hss; | 2749 HandleSignalsState hss; |
2570 | 2750 |
2571 // Add a waiter. | 2751 // Add a waiter. |
2572 waiter.Init(); | 2752 waiter.Init(); |
2573 ASSERT_EQ(MOJO_RESULT_OK, | 2753 ASSERT_EQ(MOJO_RESULT_OK, |
2574 this->ConsumerAddAwakable( | 2754 this->ConsumerAddAwakable( |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2748 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 0, &hss)); | 2928 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 0, &hss)); |
2749 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 2929 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
2750 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 2930 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
2751 | 2931 |
2752 this->ConsumerClose(); | 2932 this->ConsumerClose(); |
2753 } | 2933 } |
2754 | 2934 |
2755 } // namespace | 2935 } // namespace |
2756 } // namespace system | 2936 } // namespace system |
2757 } // namespace mojo | 2937 } // namespace mojo |
OLD | NEW |