| 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 |