| 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 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 ASSERT_TRUE(transport.is_valid()); | 288 ASSERT_TRUE(transport.is_valid()); |
| 289 | 289 |
| 290 std::vector<HandleTransport> transports; | 290 std::vector<HandleTransport> transports; |
| 291 transports.push_back(transport); | 291 transports.push_back(transport); |
| 292 ASSERT_EQ(MOJO_RESULT_OK, message_pipe(source_i)->WriteMessage( | 292 ASSERT_EQ(MOJO_RESULT_OK, message_pipe(source_i)->WriteMessage( |
| 293 0, NullUserPointer(), 0, &transports, | 293 0, NullUserPointer(), 0, &transports, |
| 294 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 294 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 295 transport.End(); | 295 transport.End(); |
| 296 } | 296 } |
| 297 uint64_t context = 0; | 297 uint64_t context = 0; |
| 298 ASSERT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionTimeout(), &context)); | 298 ASSERT_EQ(MOJO_RESULT_OK, |
| 299 waiter.Wait(test::ActionTimeout(), &context, nullptr)); |
| 299 EXPECT_EQ(987u, context); | 300 EXPECT_EQ(987u, context); |
| 300 HandleSignalsState hss = HandleSignalsState(); | 301 HandleSignalsState hss = HandleSignalsState(); |
| 301 message_pipe(dest_i)->RemoveAwakable(0, &waiter, &hss); | 302 message_pipe(dest_i)->RemoveAwakable(0, &waiter, &hss); |
| 302 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 303 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 303 hss.satisfied_signals); | 304 hss.satisfied_signals); |
| 304 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 305 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 305 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 306 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 306 hss.satisfiable_signals); | 307 hss.satisfiable_signals); |
| 307 char read_buffer[100] = {}; | 308 char read_buffer[100] = {}; |
| 308 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 309 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 elements[1] = 456; | 681 elements[1] = 456; |
| 681 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 682 num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 682 EXPECT_EQ(MOJO_RESULT_OK, | 683 EXPECT_EQ(MOJO_RESULT_OK, |
| 683 this->ProducerWriteData(UserPointer<const void>(elements), | 684 this->ProducerWriteData(UserPointer<const void>(elements), |
| 684 MakeUserPointer(&num_bytes), false)); | 685 MakeUserPointer(&num_bytes), false)); |
| 685 // It should have written everything (even without "all or none"). | 686 // It should have written everything (even without "all or none"). |
| 686 EXPECT_EQ(2u * sizeof(elements[0]), num_bytes); | 687 EXPECT_EQ(2u * sizeof(elements[0]), num_bytes); |
| 687 | 688 |
| 688 // Wait. | 689 // Wait. |
| 689 context = 0; | 690 context = 0; |
| 690 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionTimeout(), &context)); | 691 EXPECT_EQ(MOJO_RESULT_OK, |
| 692 waiter.Wait(test::ActionTimeout(), &context, nullptr)); |
| 691 EXPECT_EQ(123u, context); | 693 EXPECT_EQ(123u, context); |
| 692 hss = HandleSignalsState(); | 694 hss = HandleSignalsState(); |
| 693 this->ConsumerRemoveAwakable(&waiter, &hss); | 695 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 694 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 696 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 695 hss.satisfied_signals); | 697 hss.satisfied_signals); |
| 696 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 698 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 697 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 699 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 698 hss.satisfiable_signals); | 700 hss.satisfiable_signals); |
| 699 | 701 |
| 700 // Query. | 702 // Query. |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 828 this->ProducerWriteData(UserPointer<const void>(elements), | 830 this->ProducerWriteData(UserPointer<const void>(elements), |
| 829 MakeUserPointer(&num_bytes), true)); | 831 MakeUserPointer(&num_bytes), true)); |
| 830 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); | 832 EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes); |
| 831 | 833 |
| 832 // Adding a waiter should now succeed. | 834 // Adding a waiter should now succeed. |
| 833 pwaiter.Init(); | 835 pwaiter.Init(); |
| 834 ASSERT_EQ(MOJO_RESULT_OK, | 836 ASSERT_EQ(MOJO_RESULT_OK, |
| 835 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, | 837 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 836 false, 56, nullptr)); | 838 false, 56, nullptr)); |
| 837 // And it shouldn't be writable yet. | 839 // And it shouldn't be writable yet. |
| 838 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); | 840 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr, nullptr)); |
| 839 hss = HandleSignalsState(); | 841 hss = HandleSignalsState(); |
| 840 this->ProducerRemoveAwakable(&pwaiter, &hss); | 842 this->ProducerRemoveAwakable(&pwaiter, &hss); |
| 841 EXPECT_EQ(0u, hss.satisfied_signals); | 843 EXPECT_EQ(0u, hss.satisfied_signals); |
| 842 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 844 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 843 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 845 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 844 hss.satisfiable_signals); | 846 hss.satisfiable_signals); |
| 845 | 847 |
| 846 // Wait for data to become available to the consumer. | 848 // Wait for data to become available to the consumer. |
| 847 context = 0; | 849 context = 0; |
| 848 EXPECT_EQ(MOJO_RESULT_OK, cwaiter.Wait(test::TinyTimeout(), &context)); | 850 EXPECT_EQ(MOJO_RESULT_OK, |
| 851 cwaiter.Wait(test::TinyTimeout(), &context, nullptr)); |
| 849 EXPECT_EQ(1234u, context); | 852 EXPECT_EQ(1234u, context); |
| 850 hss = HandleSignalsState(); | 853 hss = HandleSignalsState(); |
| 851 this->ConsumerRemoveAwakable(&cwaiter, &hss); | 854 this->ConsumerRemoveAwakable(&cwaiter, &hss); |
| 852 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 855 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 853 hss.satisfied_signals); | 856 hss.satisfied_signals); |
| 854 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 857 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 855 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 858 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 856 hss.satisfiable_signals); | 859 hss.satisfiable_signals); |
| 857 | 860 |
| 858 // Peek one element. | 861 // Peek one element. |
| 859 elements[0] = -1; | 862 elements[0] = -1; |
| 860 elements[1] = -1; | 863 elements[1] = -1; |
| 861 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 864 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 862 EXPECT_EQ(MOJO_RESULT_OK, | 865 EXPECT_EQ(MOJO_RESULT_OK, |
| 863 this->ConsumerReadData(UserPointer<void>(elements), | 866 this->ConsumerReadData(UserPointer<void>(elements), |
| 864 MakeUserPointer(&num_bytes), true, true)); | 867 MakeUserPointer(&num_bytes), true, true)); |
| 865 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 868 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 866 EXPECT_EQ(123, elements[0]); | 869 EXPECT_EQ(123, elements[0]); |
| 867 EXPECT_EQ(-1, elements[1]); | 870 EXPECT_EQ(-1, elements[1]); |
| 868 | 871 |
| 869 // Add a waiter. | 872 // Add a waiter. |
| 870 pwaiter.Init(); | 873 pwaiter.Init(); |
| 871 ASSERT_EQ(MOJO_RESULT_OK, | 874 ASSERT_EQ(MOJO_RESULT_OK, |
| 872 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, | 875 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 873 false, 56, nullptr)); | 876 false, 56, nullptr)); |
| 874 // And it still shouldn't be writable yet. | 877 // And it still shouldn't be writable yet. |
| 875 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); | 878 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr, nullptr)); |
| 876 hss = HandleSignalsState(); | 879 hss = HandleSignalsState(); |
| 877 this->ProducerRemoveAwakable(&pwaiter, &hss); | 880 this->ProducerRemoveAwakable(&pwaiter, &hss); |
| 878 EXPECT_EQ(0u, hss.satisfied_signals); | 881 EXPECT_EQ(0u, hss.satisfied_signals); |
| 879 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 882 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 880 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 883 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 881 hss.satisfiable_signals); | 884 hss.satisfiable_signals); |
| 882 | 885 |
| 883 // Do it again. | 886 // Do it again. |
| 884 pwaiter.Init(); | 887 pwaiter.Init(); |
| 885 ASSERT_EQ(MOJO_RESULT_OK, | 888 ASSERT_EQ(MOJO_RESULT_OK, |
| 886 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, | 889 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 887 false, 78, nullptr)); | 890 false, 78, nullptr)); |
| 888 | 891 |
| 889 // Read one element. | 892 // Read one element. |
| 890 elements[0] = -1; | 893 elements[0] = -1; |
| 891 elements[1] = -1; | 894 elements[1] = -1; |
| 892 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 895 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 893 EXPECT_EQ(MOJO_RESULT_OK, | 896 EXPECT_EQ(MOJO_RESULT_OK, |
| 894 this->ConsumerReadData(UserPointer<void>(elements), | 897 this->ConsumerReadData(UserPointer<void>(elements), |
| 895 MakeUserPointer(&num_bytes), true, false)); | 898 MakeUserPointer(&num_bytes), true, false)); |
| 896 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 899 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 897 EXPECT_EQ(123, elements[0]); | 900 EXPECT_EQ(123, elements[0]); |
| 898 EXPECT_EQ(-1, elements[1]); | 901 EXPECT_EQ(-1, elements[1]); |
| 899 | 902 |
| 900 // Waiting should now succeed. | 903 // Waiting should now succeed. |
| 901 context = 0; | 904 context = 0; |
| 902 EXPECT_EQ(MOJO_RESULT_OK, pwaiter.Wait(test::TinyTimeout(), &context)); | 905 EXPECT_EQ(MOJO_RESULT_OK, |
| 906 pwaiter.Wait(test::TinyTimeout(), &context, nullptr)); |
| 903 EXPECT_EQ(78u, context); | 907 EXPECT_EQ(78u, context); |
| 904 hss = HandleSignalsState(); | 908 hss = HandleSignalsState(); |
| 905 this->ProducerRemoveAwakable(&pwaiter, &hss); | 909 this->ProducerRemoveAwakable(&pwaiter, &hss); |
| 906 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 910 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 907 hss.satisfied_signals); | 911 hss.satisfied_signals); |
| 908 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 912 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 909 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 913 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 910 hss.satisfiable_signals); | 914 hss.satisfiable_signals); |
| 911 | 915 |
| 912 // Try writing, using a two-phase write. | 916 // Try writing, using a two-phase write. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 938 // Since we only read one element (after having written three in all), the | 942 // Since we only read one element (after having written three in all), the |
| 939 // two-phase read should only allow us to read one. This checks an | 943 // two-phase read should only allow us to read one. This checks an |
| 940 // implementation detail! | 944 // implementation detail! |
| 941 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); |
| 942 EXPECT_EQ(456, static_cast<const int32_t*>(read_buffer)[0]); | 946 EXPECT_EQ(456, static_cast<const int32_t*>(read_buffer)[0]); |
| 943 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(static_cast<uint32_t>( | 947 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(static_cast<uint32_t>( |
| 944 1u * sizeof(elements[0])))); | 948 1u * sizeof(elements[0])))); |
| 945 | 949 |
| 946 // Waiting should succeed. | 950 // Waiting should succeed. |
| 947 context = 0; | 951 context = 0; |
| 948 EXPECT_EQ(MOJO_RESULT_OK, pwaiter.Wait(test::TinyTimeout(), &context)); | 952 EXPECT_EQ(MOJO_RESULT_OK, |
| 953 pwaiter.Wait(test::TinyTimeout(), &context, nullptr)); |
| 949 EXPECT_EQ(90u, context); | 954 EXPECT_EQ(90u, context); |
| 950 hss = HandleSignalsState(); | 955 hss = HandleSignalsState(); |
| 951 this->ProducerRemoveAwakable(&pwaiter, &hss); | 956 this->ProducerRemoveAwakable(&pwaiter, &hss); |
| 952 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 957 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 953 hss.satisfied_signals); | 958 hss.satisfied_signals); |
| 954 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 959 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 955 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 960 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 956 hss.satisfiable_signals); | 961 hss.satisfiable_signals); |
| 957 | 962 |
| 958 // Write one element. | 963 // Write one element. |
| 959 elements[0] = 123; | 964 elements[0] = 123; |
| 960 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 965 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 961 EXPECT_EQ(MOJO_RESULT_OK, | 966 EXPECT_EQ(MOJO_RESULT_OK, |
| 962 this->ProducerWriteData(UserPointer<const void>(elements), | 967 this->ProducerWriteData(UserPointer<const void>(elements), |
| 963 MakeUserPointer(&num_bytes), false)); | 968 MakeUserPointer(&num_bytes), false)); |
| 964 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); | 969 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
| 965 | 970 |
| 966 // Add a waiter. | 971 // Add a waiter. |
| 967 pwaiter.Init(); | 972 pwaiter.Init(); |
| 968 ASSERT_EQ(MOJO_RESULT_OK, | 973 ASSERT_EQ(MOJO_RESULT_OK, |
| 969 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, | 974 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 970 false, 12, nullptr)); | 975 false, 12, nullptr)); |
| 971 | 976 |
| 972 // Close the consumer. | 977 // Close the consumer. |
| 973 this->ConsumerClose(); | 978 this->ConsumerClose(); |
| 974 | 979 |
| 975 // It should now be never-writable. | 980 // It should now be never-writable. |
| 976 context = 0; | 981 context = 0; |
| 977 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 982 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 978 pwaiter.Wait(test::TinyTimeout(), &context)); | 983 pwaiter.Wait(test::TinyTimeout(), &context, nullptr)); |
| 979 EXPECT_EQ(12u, context); | 984 EXPECT_EQ(12u, context); |
| 980 hss = HandleSignalsState(); | 985 hss = HandleSignalsState(); |
| 981 this->ProducerRemoveAwakable(&pwaiter, &hss); | 986 this->ProducerRemoveAwakable(&pwaiter, &hss); |
| 982 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 987 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 983 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 988 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 984 | 989 |
| 985 this->ProducerClose(); | 990 this->ProducerClose(); |
| 986 } | 991 } |
| 987 | 992 |
| 988 TYPED_TEST(DataPipeImplTest, PeerClosedProducerWaiting) { | 993 TYPED_TEST(DataPipeImplTest, PeerClosedProducerWaiting) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1003 waiter.Init(); | 1008 waiter.Init(); |
| 1004 ASSERT_EQ(MOJO_RESULT_OK, | 1009 ASSERT_EQ(MOJO_RESULT_OK, |
| 1005 this->ProducerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1010 this->ProducerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1006 false, 12, nullptr)); | 1011 false, 12, nullptr)); |
| 1007 | 1012 |
| 1008 // Close the consumer. | 1013 // Close the consumer. |
| 1009 this->ConsumerClose(); | 1014 this->ConsumerClose(); |
| 1010 | 1015 |
| 1011 // It should be signaled. | 1016 // It should be signaled. |
| 1012 context = 0; | 1017 context = 0; |
| 1013 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), &context)); | 1018 EXPECT_EQ(MOJO_RESULT_OK, |
| 1019 waiter.Wait(test::TinyTimeout(), &context, nullptr)); |
| 1014 EXPECT_EQ(12u, context); | 1020 EXPECT_EQ(12u, context); |
| 1015 hss = HandleSignalsState(); | 1021 hss = HandleSignalsState(); |
| 1016 this->ProducerRemoveAwakable(&waiter, &hss); | 1022 this->ProducerRemoveAwakable(&waiter, &hss); |
| 1017 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 1023 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 1018 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 1024 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 1019 | 1025 |
| 1020 this->ProducerClose(); | 1026 this->ProducerClose(); |
| 1021 } | 1027 } |
| 1022 | 1028 |
| 1023 TYPED_TEST(DataPipeImplTest, PeerClosedConsumerWaiting) { | 1029 TYPED_TEST(DataPipeImplTest, PeerClosedConsumerWaiting) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1038 waiter.Init(); | 1044 waiter.Init(); |
| 1039 ASSERT_EQ(MOJO_RESULT_OK, | 1045 ASSERT_EQ(MOJO_RESULT_OK, |
| 1040 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1046 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1041 false, 12, nullptr)); | 1047 false, 12, nullptr)); |
| 1042 | 1048 |
| 1043 // Close the producer. | 1049 // Close the producer. |
| 1044 this->ProducerClose(); | 1050 this->ProducerClose(); |
| 1045 | 1051 |
| 1046 // It should be signaled. | 1052 // It should be signaled. |
| 1047 context = 0; | 1053 context = 0; |
| 1048 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), &context)); | 1054 EXPECT_EQ(MOJO_RESULT_OK, |
| 1055 waiter.Wait(test::TinyTimeout(), &context, nullptr)); |
| 1049 EXPECT_EQ(12u, context); | 1056 EXPECT_EQ(12u, context); |
| 1050 hss = HandleSignalsState(); | 1057 hss = HandleSignalsState(); |
| 1051 this->ConsumerRemoveAwakable(&waiter, &hss); | 1058 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 1052 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 1059 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 1053 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 1060 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 1054 | 1061 |
| 1055 this->ConsumerClose(); | 1062 this->ConsumerClose(); |
| 1056 } | 1063 } |
| 1057 | 1064 |
| 1058 TYPED_TEST(DataPipeImplTest, BasicConsumerWaiting) { | 1065 TYPED_TEST(DataPipeImplTest, BasicConsumerWaiting) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1089 | 1096 |
| 1090 // Write two elements. | 1097 // Write two elements. |
| 1091 int32_t elements[2] = {123, 456}; | 1098 int32_t elements[2] = {123, 456}; |
| 1092 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); | 1099 uint32_t num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
| 1093 EXPECT_EQ(MOJO_RESULT_OK, | 1100 EXPECT_EQ(MOJO_RESULT_OK, |
| 1094 this->ProducerWriteData(UserPointer<const void>(elements), | 1101 this->ProducerWriteData(UserPointer<const void>(elements), |
| 1095 MakeUserPointer(&num_bytes), true)); | 1102 MakeUserPointer(&num_bytes), true)); |
| 1096 | 1103 |
| 1097 // Wait for readability (needed for remote cases). | 1104 // Wait for readability (needed for remote cases). |
| 1098 context = 0; | 1105 context = 0; |
| 1099 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), &context)); | 1106 EXPECT_EQ(MOJO_RESULT_OK, |
| 1107 waiter.Wait(test::TinyTimeout(), &context, nullptr)); |
| 1100 EXPECT_EQ(34u, context); | 1108 EXPECT_EQ(34u, context); |
| 1101 hss = HandleSignalsState(); | 1109 hss = HandleSignalsState(); |
| 1102 this->ConsumerRemoveAwakable(&waiter, &hss); | 1110 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 1103 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1111 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1104 hss.satisfied_signals); | 1112 hss.satisfied_signals); |
| 1105 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1113 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1106 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1114 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1107 hss.satisfiable_signals); | 1115 hss.satisfiable_signals); |
| 1108 | 1116 |
| 1109 // Discard one element. | 1117 // Discard one element. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1167 // Write one element. | 1175 // Write one element. |
| 1168 elements[0] = 789; | 1176 elements[0] = 789; |
| 1169 elements[1] = -1; | 1177 elements[1] = -1; |
| 1170 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 1178 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 1171 EXPECT_EQ(MOJO_RESULT_OK, | 1179 EXPECT_EQ(MOJO_RESULT_OK, |
| 1172 this->ProducerWriteData(UserPointer<const void>(elements), | 1180 this->ProducerWriteData(UserPointer<const void>(elements), |
| 1173 MakeUserPointer(&num_bytes), true)); | 1181 MakeUserPointer(&num_bytes), true)); |
| 1174 | 1182 |
| 1175 // Waiting should now succeed. | 1183 // Waiting should now succeed. |
| 1176 context = 0; | 1184 context = 0; |
| 1177 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), &context)); | 1185 EXPECT_EQ(MOJO_RESULT_OK, |
| 1186 waiter.Wait(test::TinyTimeout(), &context, nullptr)); |
| 1178 EXPECT_EQ(90u, context); | 1187 EXPECT_EQ(90u, context); |
| 1179 hss = HandleSignalsState(); | 1188 hss = HandleSignalsState(); |
| 1180 this->ConsumerRemoveAwakable(&waiter, &hss); | 1189 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 1181 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1190 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1182 hss.satisfied_signals); | 1191 hss.satisfied_signals); |
| 1183 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1192 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1184 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1193 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1185 hss.satisfiable_signals); | 1194 hss.satisfiable_signals); |
| 1186 | 1195 |
| 1187 // We'll want to wait for the peer closed signal to propagate. | 1196 // We'll want to wait for the peer closed signal to propagate. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1202 false, 34, &hss)); | 1211 false, 34, &hss)); |
| 1203 // We don't know if the peer closed signal has propagated yet (for the remote | 1212 // We don't know if the peer closed signal has propagated yet (for the remote |
| 1204 // cases). | 1213 // cases). |
| 1205 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 1214 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 1206 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1215 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1207 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1216 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1208 hss.satisfiable_signals); | 1217 hss.satisfiable_signals); |
| 1209 | 1218 |
| 1210 // Wait for the peer closed signal. | 1219 // Wait for the peer closed signal. |
| 1211 context = 0; | 1220 context = 0; |
| 1212 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), &context)); | 1221 EXPECT_EQ(MOJO_RESULT_OK, |
| 1222 waiter.Wait(test::TinyTimeout(), &context, nullptr)); |
| 1213 EXPECT_EQ(12u, context); | 1223 EXPECT_EQ(12u, context); |
| 1214 hss = HandleSignalsState(); | 1224 hss = HandleSignalsState(); |
| 1215 this->ConsumerRemoveAwakable(&waiter, &hss); | 1225 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 1216 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1226 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1217 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1227 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1218 hss.satisfied_signals); | 1228 hss.satisfied_signals); |
| 1219 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1229 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1220 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1230 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1221 hss.satisfiable_signals); | 1231 hss.satisfiable_signals); |
| 1222 | 1232 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1275 EXPECT_TRUE(buffer); | 1285 EXPECT_TRUE(buffer); |
| 1276 EXPECT_GE(num_bytes, static_cast<uint32_t>(3u * sizeof(elements[0]))); | 1286 EXPECT_GE(num_bytes, static_cast<uint32_t>(3u * sizeof(elements[0]))); |
| 1277 elements = static_cast<int32_t*>(buffer); | 1287 elements = static_cast<int32_t*>(buffer); |
| 1278 elements[0] = 123; | 1288 elements[0] = 123; |
| 1279 elements[1] = 456; | 1289 elements[1] = 456; |
| 1280 EXPECT_EQ(MOJO_RESULT_OK, this->ProducerEndWriteData(static_cast<uint32_t>( | 1290 EXPECT_EQ(MOJO_RESULT_OK, this->ProducerEndWriteData(static_cast<uint32_t>( |
| 1281 2u * sizeof(elements[0])))); | 1291 2u * sizeof(elements[0])))); |
| 1282 | 1292 |
| 1283 // Wait for readability (needed for remote cases). | 1293 // Wait for readability (needed for remote cases). |
| 1284 context = 0; | 1294 context = 0; |
| 1285 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), &context)); | 1295 EXPECT_EQ(MOJO_RESULT_OK, |
| 1296 waiter.Wait(test::TinyTimeout(), &context, nullptr)); |
| 1286 EXPECT_EQ(12u, context); | 1297 EXPECT_EQ(12u, context); |
| 1287 hss = HandleSignalsState(); | 1298 hss = HandleSignalsState(); |
| 1288 this->ConsumerRemoveAwakable(&waiter, &hss); | 1299 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 1289 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1300 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1290 hss.satisfied_signals); | 1301 hss.satisfied_signals); |
| 1291 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1302 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1292 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1303 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1293 hss.satisfiable_signals); | 1304 hss.satisfiable_signals); |
| 1294 | 1305 |
| 1295 // Read one element. | 1306 // Read one element. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1336 ASSERT_EQ(MOJO_RESULT_OK, | 1347 ASSERT_EQ(MOJO_RESULT_OK, |
| 1337 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, | 1348 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, |
| 1338 false, 56, nullptr)); | 1349 false, 56, nullptr)); |
| 1339 | 1350 |
| 1340 // Close the producer. | 1351 // Close the producer. |
| 1341 this->ProducerClose(); | 1352 this->ProducerClose(); |
| 1342 | 1353 |
| 1343 // Should be never-readable. | 1354 // Should be never-readable. |
| 1344 context = 0; | 1355 context = 0; |
| 1345 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 1356 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 1346 waiter.Wait(test::TinyTimeout(), &context)); | 1357 waiter.Wait(test::TinyTimeout(), &context, nullptr)); |
| 1347 EXPECT_EQ(56u, context); | 1358 EXPECT_EQ(56u, context); |
| 1348 hss = HandleSignalsState(); | 1359 hss = HandleSignalsState(); |
| 1349 this->ConsumerRemoveAwakable(&waiter, &hss); | 1360 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 1350 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 1361 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 1351 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 1362 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 1352 | 1363 |
| 1353 this->ConsumerClose(); | 1364 this->ConsumerClose(); |
| 1354 } | 1365 } |
| 1355 | 1366 |
| 1356 // Tests that data pipes aren't writable/readable during two-phase writes/reads. | 1367 // Tests that data pipes aren't writable/readable during two-phase writes/reads. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1386 this->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 1397 this->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 1387 MakeUserPointer(&num_bytes))); | 1398 MakeUserPointer(&num_bytes))); |
| 1388 EXPECT_TRUE(write_ptr); | 1399 EXPECT_TRUE(write_ptr); |
| 1389 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); | 1400 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); |
| 1390 | 1401 |
| 1391 // At this point, it shouldn't be writable. | 1402 // At this point, it shouldn't be writable. |
| 1392 pwaiter.Init(); | 1403 pwaiter.Init(); |
| 1393 ASSERT_EQ(MOJO_RESULT_OK, | 1404 ASSERT_EQ(MOJO_RESULT_OK, |
| 1394 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, | 1405 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1395 false, 1, nullptr)); | 1406 false, 1, nullptr)); |
| 1396 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); | 1407 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr, nullptr)); |
| 1397 hss = HandleSignalsState(); | 1408 hss = HandleSignalsState(); |
| 1398 this->ProducerRemoveAwakable(&pwaiter, &hss); | 1409 this->ProducerRemoveAwakable(&pwaiter, &hss); |
| 1399 EXPECT_EQ(0u, hss.satisfied_signals); | 1410 EXPECT_EQ(0u, hss.satisfied_signals); |
| 1400 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1411 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1401 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 1412 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 1402 hss.satisfiable_signals); | 1413 hss.satisfiable_signals); |
| 1403 | 1414 |
| 1404 // It shouldn't be readable yet either (we'll wait later). | 1415 // It shouldn't be readable yet either (we'll wait later). |
| 1405 cwaiter.Init(); | 1416 cwaiter.Init(); |
| 1406 ASSERT_EQ(MOJO_RESULT_OK, | 1417 ASSERT_EQ(MOJO_RESULT_OK, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1417 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, | 1428 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
| 1418 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, | 1429 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1419 false, 3, &hss)); | 1430 false, 3, &hss)); |
| 1420 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 1431 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 1421 hss.satisfied_signals); | 1432 hss.satisfied_signals); |
| 1422 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1433 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1423 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 1434 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 1424 hss.satisfiable_signals); | 1435 hss.satisfiable_signals); |
| 1425 | 1436 |
| 1426 // It should become readable. | 1437 // It should become readable. |
| 1427 EXPECT_EQ(MOJO_RESULT_OK, cwaiter.Wait(test::TinyTimeout(), nullptr)); | 1438 EXPECT_EQ(MOJO_RESULT_OK, |
| 1439 cwaiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 1428 hss = HandleSignalsState(); | 1440 hss = HandleSignalsState(); |
| 1429 this->ConsumerRemoveAwakable(&cwaiter, &hss); | 1441 this->ConsumerRemoveAwakable(&cwaiter, &hss); |
| 1430 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1442 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1431 hss.satisfied_signals); | 1443 hss.satisfied_signals); |
| 1432 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1444 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1433 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1445 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1434 hss.satisfiable_signals); | 1446 hss.satisfiable_signals); |
| 1435 | 1447 |
| 1436 // Start another two-phase write and check that it's readable even in the | 1448 // Start another two-phase write and check that it's readable even in the |
| 1437 // middle of it. | 1449 // middle of it. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1477 hss.satisfied_signals); | 1489 hss.satisfied_signals); |
| 1478 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1490 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1479 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 1491 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 1480 hss.satisfiable_signals); | 1492 hss.satisfiable_signals); |
| 1481 | 1493 |
| 1482 // But not readable. | 1494 // But not readable. |
| 1483 cwaiter.Init(); | 1495 cwaiter.Init(); |
| 1484 ASSERT_EQ(MOJO_RESULT_OK, | 1496 ASSERT_EQ(MOJO_RESULT_OK, |
| 1485 this->ConsumerAddAwakable(&cwaiter, MOJO_HANDLE_SIGNAL_READABLE, | 1497 this->ConsumerAddAwakable(&cwaiter, MOJO_HANDLE_SIGNAL_READABLE, |
| 1486 false, 7, nullptr)); | 1498 false, 7, nullptr)); |
| 1487 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, cwaiter.Wait(0, nullptr)); | 1499 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, cwaiter.Wait(0, nullptr, nullptr)); |
| 1488 hss = HandleSignalsState(); | 1500 hss = HandleSignalsState(); |
| 1489 this->ConsumerRemoveAwakable(&cwaiter, &hss); | 1501 this->ConsumerRemoveAwakable(&cwaiter, &hss); |
| 1490 EXPECT_EQ(0u, hss.satisfied_signals); | 1502 EXPECT_EQ(0u, hss.satisfied_signals); |
| 1491 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1503 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1492 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1504 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1493 hss.satisfiable_signals); | 1505 hss.satisfiable_signals); |
| 1494 | 1506 |
| 1495 // End the two-phase read without reading anything. | 1507 // End the two-phase read without reading anything. |
| 1496 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(0u)); | 1508 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(0u)); |
| 1497 | 1509 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1555 EXPECT_EQ(MOJO_RESULT_OK, | 1567 EXPECT_EQ(MOJO_RESULT_OK, |
| 1556 this->ProducerWriteData(UserPointer<const void>(buffer), | 1568 this->ProducerWriteData(UserPointer<const void>(buffer), |
| 1557 MakeUserPointer(&num_bytes), true)); | 1569 MakeUserPointer(&num_bytes), true)); |
| 1558 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); | 1570 EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
| 1559 | 1571 |
| 1560 // Wait for data. | 1572 // Wait for data. |
| 1561 // TODO(vtl): There's no real guarantee that all the data will become | 1573 // TODO(vtl): There's no real guarantee that all the data will become |
| 1562 // available at once (except that in current implementations, with reasonable | 1574 // available at once (except that in current implementations, with reasonable |
| 1563 // limits, it will). Eventually, we'll be able to wait for a specified amount | 1575 // limits, it will). Eventually, we'll be able to wait for a specified amount |
| 1564 // of data to become available. | 1576 // of data to become available. |
| 1565 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 1577 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 1566 hss = HandleSignalsState(); | 1578 hss = HandleSignalsState(); |
| 1567 this->ConsumerRemoveAwakable(&waiter, &hss); | 1579 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 1568 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1580 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1569 hss.satisfied_signals); | 1581 hss.satisfied_signals); |
| 1570 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1582 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1571 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1583 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1572 hss.satisfiable_signals); | 1584 hss.satisfiable_signals); |
| 1573 | 1585 |
| 1574 // Half full. | 1586 // Half full. |
| 1575 num_bytes = 0u; | 1587 num_bytes = 0u; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1668 // We'll need to wait for the peer closed to propagate. | 1680 // We'll need to wait for the peer closed to propagate. |
| 1669 waiter.Init(); | 1681 waiter.Init(); |
| 1670 ASSERT_EQ(MOJO_RESULT_OK, | 1682 ASSERT_EQ(MOJO_RESULT_OK, |
| 1671 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1683 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1672 false, 2, nullptr)); | 1684 false, 2, nullptr)); |
| 1673 | 1685 |
| 1674 // Close the producer, then test producer-closed cases. | 1686 // Close the producer, then test producer-closed cases. |
| 1675 this->ProducerClose(); | 1687 this->ProducerClose(); |
| 1676 | 1688 |
| 1677 // Wait. | 1689 // Wait. |
| 1678 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 1690 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 1679 hss = HandleSignalsState(); | 1691 hss = HandleSignalsState(); |
| 1680 this->ConsumerRemoveAwakable(&waiter, &hss); | 1692 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 1681 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1693 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1682 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1694 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1683 hss.satisfied_signals); | 1695 hss.satisfied_signals); |
| 1684 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1696 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1685 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1697 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1686 hss.satisfiable_signals); | 1698 hss.satisfiable_signals); |
| 1687 | 1699 |
| 1688 // Try reading too much; "failed precondition" since the producer is closed. | 1700 // Try reading too much; "failed precondition" since the producer is closed. |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1760 | 1772 |
| 1761 // Write 20 bytes. | 1773 // Write 20 bytes. |
| 1762 uint32_t num_bytes = 20u; | 1774 uint32_t num_bytes = 20u; |
| 1763 EXPECT_EQ(MOJO_RESULT_OK, | 1775 EXPECT_EQ(MOJO_RESULT_OK, |
| 1764 this->ProducerWriteData(UserPointer<const void>(&test_data[0]), | 1776 this->ProducerWriteData(UserPointer<const void>(&test_data[0]), |
| 1765 MakeUserPointer(&num_bytes), false)); | 1777 MakeUserPointer(&num_bytes), false)); |
| 1766 EXPECT_EQ(20u, num_bytes); | 1778 EXPECT_EQ(20u, num_bytes); |
| 1767 | 1779 |
| 1768 // Wait for data. | 1780 // Wait for data. |
| 1769 // TODO(vtl): (See corresponding TODO in AllOrNone.) | 1781 // TODO(vtl): (See corresponding TODO in AllOrNone.) |
| 1770 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 1782 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 1771 hss = HandleSignalsState(); | 1783 hss = HandleSignalsState(); |
| 1772 this->ConsumerRemoveAwakable(&waiter, &hss); | 1784 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 1773 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1785 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1774 hss.satisfied_signals); | 1786 hss.satisfied_signals); |
| 1775 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1787 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1776 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1788 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1777 hss.satisfiable_signals); | 1789 hss.satisfiable_signals); |
| 1778 | 1790 |
| 1779 // Read 10 bytes. | 1791 // Read 10 bytes. |
| 1780 unsigned char read_buffer[1000] = {0}; | 1792 unsigned char read_buffer[1000] = {0}; |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1974 void* write_buffer_ptr = nullptr; | 1986 void* write_buffer_ptr = nullptr; |
| 1975 num_bytes = 0u; | 1987 num_bytes = 0u; |
| 1976 EXPECT_EQ(MOJO_RESULT_OK, | 1988 EXPECT_EQ(MOJO_RESULT_OK, |
| 1977 this->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), | 1989 this->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr), |
| 1978 MakeUserPointer(&num_bytes))); | 1990 MakeUserPointer(&num_bytes))); |
| 1979 EXPECT_TRUE(write_buffer_ptr); | 1991 EXPECT_TRUE(write_buffer_ptr); |
| 1980 ASSERT_GT(num_bytes, kTestDataSize); | 1992 ASSERT_GT(num_bytes, kTestDataSize); |
| 1981 | 1993 |
| 1982 // Wait for data. | 1994 // Wait for data. |
| 1983 // TODO(vtl): (See corresponding TODO in AllOrNone.) | 1995 // TODO(vtl): (See corresponding TODO in AllOrNone.) |
| 1984 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 1996 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 1985 hss = HandleSignalsState(); | 1997 hss = HandleSignalsState(); |
| 1986 this->ConsumerRemoveAwakable(&waiter, &hss); | 1998 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 1987 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 1999 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1988 hss.satisfied_signals); | 2000 hss.satisfied_signals); |
| 1989 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2001 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 1990 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2002 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 1991 hss.satisfiable_signals); | 2003 hss.satisfiable_signals); |
| 1992 | 2004 |
| 1993 // Start two-phase read. | 2005 // Start two-phase read. |
| 1994 const void* read_buffer_ptr = nullptr; | 2006 const void* read_buffer_ptr = nullptr; |
| 1995 num_bytes = 0u; | 2007 num_bytes = 0u; |
| 1996 EXPECT_EQ(MOJO_RESULT_OK, | 2008 EXPECT_EQ(MOJO_RESULT_OK, |
| 1997 this->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), | 2009 this->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr), |
| 1998 MakeUserPointer(&num_bytes))); | 2010 MakeUserPointer(&num_bytes))); |
| 1999 EXPECT_TRUE(read_buffer_ptr); | 2011 EXPECT_TRUE(read_buffer_ptr); |
| 2000 EXPECT_EQ(kTestDataSize, num_bytes); | 2012 EXPECT_EQ(kTestDataSize, num_bytes); |
| 2001 | 2013 |
| 2002 // Add waiter. | 2014 // Add waiter. |
| 2003 waiter.Init(); | 2015 waiter.Init(); |
| 2004 ASSERT_EQ(MOJO_RESULT_OK, | 2016 ASSERT_EQ(MOJO_RESULT_OK, |
| 2005 this->ProducerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 2017 this->ProducerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 2006 false, 1, nullptr)); | 2018 false, 1, nullptr)); |
| 2007 | 2019 |
| 2008 // Close the consumer. | 2020 // Close the consumer. |
| 2009 this->ConsumerClose(); | 2021 this->ConsumerClose(); |
| 2010 | 2022 |
| 2011 // Wait for producer to know that the consumer is closed. | 2023 // Wait for producer to know that the consumer is closed. |
| 2012 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 2024 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2013 hss = HandleSignalsState(); | 2025 hss = HandleSignalsState(); |
| 2014 this->ProducerRemoveAwakable(&waiter, &hss); | 2026 this->ProducerRemoveAwakable(&waiter, &hss); |
| 2015 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 2027 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 2016 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 2028 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 2017 | 2029 |
| 2018 // Actually write some data. (Note: Premature freeing of the buffer would | 2030 // Actually write some data. (Note: Premature freeing of the buffer would |
| 2019 // probably only be detected under ASAN or similar.) | 2031 // probably only be detected under ASAN or similar.) |
| 2020 memcpy(write_buffer_ptr, kTestData, kTestDataSize); | 2032 memcpy(write_buffer_ptr, kTestData, kTestDataSize); |
| 2021 // Note: Even though the consumer has been closed, ending the two-phase | 2033 // Note: Even though the consumer has been closed, ending the two-phase |
| 2022 // write will report success. | 2034 // write will report success. |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2094 waiter.Init(); | 2106 waiter.Init(); |
| 2095 ASSERT_EQ(MOJO_RESULT_OK, | 2107 ASSERT_EQ(MOJO_RESULT_OK, |
| 2096 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 2108 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 2097 false, 1, nullptr)); | 2109 false, 1, nullptr)); |
| 2098 | 2110 |
| 2099 // Close the producer. | 2111 // Close the producer. |
| 2100 this->ProducerClose(); | 2112 this->ProducerClose(); |
| 2101 | 2113 |
| 2102 // Wait. (Note that once the consumer knows that the producer is closed, it | 2114 // Wait. (Note that once the consumer knows that the producer is closed, it |
| 2103 // must also know about all the data that was sent.) | 2115 // must also know about all the data that was sent.) |
| 2104 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 2116 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2105 hss = HandleSignalsState(); | 2117 hss = HandleSignalsState(); |
| 2106 this->ConsumerRemoveAwakable(&waiter, &hss); | 2118 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2107 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2119 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2108 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2120 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2109 hss.satisfied_signals); | 2121 hss.satisfied_signals); |
| 2110 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2122 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2111 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2123 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2112 hss.satisfiable_signals); | 2124 hss.satisfiable_signals); |
| 2113 | 2125 |
| 2114 // Peek that data. | 2126 // Peek that data. |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2175 false, 0, nullptr)); | 2187 false, 0, nullptr)); |
| 2176 | 2188 |
| 2177 // Write some data, so we'll have something to read. | 2189 // Write some data, so we'll have something to read. |
| 2178 uint32_t num_bytes = kTestDataSize; | 2190 uint32_t num_bytes = kTestDataSize; |
| 2179 EXPECT_EQ(MOJO_RESULT_OK, | 2191 EXPECT_EQ(MOJO_RESULT_OK, |
| 2180 this->ProducerWriteData(UserPointer<const void>(&kTestData), | 2192 this->ProducerWriteData(UserPointer<const void>(&kTestData), |
| 2181 MakeUserPointer(&num_bytes), false)); | 2193 MakeUserPointer(&num_bytes), false)); |
| 2182 EXPECT_EQ(kTestDataSize, num_bytes); | 2194 EXPECT_EQ(kTestDataSize, num_bytes); |
| 2183 | 2195 |
| 2184 // Wait. | 2196 // Wait. |
| 2185 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 2197 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2186 hss = HandleSignalsState(); | 2198 hss = HandleSignalsState(); |
| 2187 this->ConsumerRemoveAwakable(&waiter, &hss); | 2199 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2188 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2200 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2189 hss.satisfied_signals); | 2201 hss.satisfied_signals); |
| 2190 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2202 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2191 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2203 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2192 hss.satisfiable_signals); | 2204 hss.satisfiable_signals); |
| 2193 | 2205 |
| 2194 // Read that data. | 2206 // Read that data. |
| 2195 int64_t data[10] = {}; | 2207 int64_t data[10] = {}; |
| 2196 num_bytes = static_cast<uint32_t>(sizeof(data)); | 2208 num_bytes = static_cast<uint32_t>(sizeof(data)); |
| 2197 EXPECT_EQ(MOJO_RESULT_OK, | 2209 EXPECT_EQ(MOJO_RESULT_OK, |
| 2198 this->ConsumerReadData(UserPointer<void>(data), | 2210 this->ConsumerReadData(UserPointer<void>(data), |
| 2199 MakeUserPointer(&num_bytes), false, false)); | 2211 MakeUserPointer(&num_bytes), false, false)); |
| 2200 EXPECT_EQ(kTestDataSize, num_bytes); | 2212 EXPECT_EQ(kTestDataSize, num_bytes); |
| 2201 EXPECT_EQ(kTestData, data[0]); | 2213 EXPECT_EQ(kTestData, data[0]); |
| 2202 | 2214 |
| 2203 // Add waiter again. | 2215 // Add waiter again. |
| 2204 waiter.Init(); | 2216 waiter.Init(); |
| 2205 ASSERT_EQ(MOJO_RESULT_OK, | 2217 ASSERT_EQ(MOJO_RESULT_OK, |
| 2206 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, | 2218 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, |
| 2207 false, 0, nullptr)); | 2219 false, 0, nullptr)); |
| 2208 | 2220 |
| 2209 // Close the producer. | 2221 // Close the producer. |
| 2210 this->ProducerClose(); | 2222 this->ProducerClose(); |
| 2211 | 2223 |
| 2212 // Wait. | 2224 // Wait. |
| 2213 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 2225 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 2214 waiter.Wait(test::TinyTimeout(), nullptr)); | 2226 waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2215 hss = HandleSignalsState(); | 2227 hss = HandleSignalsState(); |
| 2216 this->ConsumerRemoveAwakable(&waiter, &hss); | 2228 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2217 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 2229 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 2218 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 2230 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 2219 | 2231 |
| 2220 this->ConsumerClose(); | 2232 this->ConsumerClose(); |
| 2221 } | 2233 } |
| 2222 | 2234 |
| 2223 // During a two-phase read, the consumer is not readable so it may be waited | 2235 // During a two-phase read, the consumer is not readable so it may be waited |
| 2224 // upon (to become readable again). If the producer is closed and the two-phase | 2236 // upon (to become readable again). If the producer is closed and the two-phase |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2246 false, 0, nullptr)); | 2258 false, 0, nullptr)); |
| 2247 | 2259 |
| 2248 // Write some data, so we'll have something to read. | 2260 // Write some data, so we'll have something to read. |
| 2249 uint32_t num_bytes = kTestDataSize; | 2261 uint32_t num_bytes = kTestDataSize; |
| 2250 EXPECT_EQ(MOJO_RESULT_OK, | 2262 EXPECT_EQ(MOJO_RESULT_OK, |
| 2251 this->ProducerWriteData(UserPointer<const void>(&kTestData), | 2263 this->ProducerWriteData(UserPointer<const void>(&kTestData), |
| 2252 MakeUserPointer(&num_bytes), false)); | 2264 MakeUserPointer(&num_bytes), false)); |
| 2253 EXPECT_EQ(kTestDataSize, num_bytes); | 2265 EXPECT_EQ(kTestDataSize, num_bytes); |
| 2254 | 2266 |
| 2255 // Wait. | 2267 // Wait. |
| 2256 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 2268 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2257 hss = HandleSignalsState(); | 2269 hss = HandleSignalsState(); |
| 2258 this->ConsumerRemoveAwakable(&waiter, &hss); | 2270 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2259 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2271 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2260 hss.satisfied_signals); | 2272 hss.satisfied_signals); |
| 2261 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2273 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2262 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2274 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2263 hss.satisfiable_signals); | 2275 hss.satisfiable_signals); |
| 2264 | 2276 |
| 2265 // Start a two-phase read. | 2277 // Start a two-phase read. |
| 2266 num_bytes = 0u; | 2278 num_bytes = 0u; |
| 2267 const void* read_ptr = nullptr; | 2279 const void* read_ptr = nullptr; |
| 2268 EXPECT_EQ(MOJO_RESULT_OK, | 2280 EXPECT_EQ(MOJO_RESULT_OK, |
| 2269 this->ConsumerBeginReadData(MakeUserPointer(&read_ptr), | 2281 this->ConsumerBeginReadData(MakeUserPointer(&read_ptr), |
| 2270 MakeUserPointer(&num_bytes))); | 2282 MakeUserPointer(&num_bytes))); |
| 2271 EXPECT_EQ(kTestDataSize, num_bytes); | 2283 EXPECT_EQ(kTestDataSize, num_bytes); |
| 2272 EXPECT_EQ(kTestData, static_cast<const int64_t*>(read_ptr)[0]); | 2284 EXPECT_EQ(kTestData, static_cast<const int64_t*>(read_ptr)[0]); |
| 2273 | 2285 |
| 2274 // Add waiter (for the producer to be closed). | 2286 // Add waiter (for the producer to be closed). |
| 2275 waiter.Init(); | 2287 waiter.Init(); |
| 2276 ASSERT_EQ(MOJO_RESULT_OK, | 2288 ASSERT_EQ(MOJO_RESULT_OK, |
| 2277 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 2289 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 2278 false, 0, nullptr)); | 2290 false, 0, nullptr)); |
| 2279 | 2291 |
| 2280 // Close the producer. | 2292 // Close the producer. |
| 2281 this->ProducerClose(); | 2293 this->ProducerClose(); |
| 2282 | 2294 |
| 2283 // Wait for producer close to be detected. | 2295 // Wait for producer close to be detected. |
| 2284 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 2296 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2285 hss = HandleSignalsState(); | 2297 hss = HandleSignalsState(); |
| 2286 this->ConsumerRemoveAwakable(&waiter, &hss); | 2298 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2287 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 2299 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 2288 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2300 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2289 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2301 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2290 hss.satisfiable_signals); | 2302 hss.satisfiable_signals); |
| 2291 | 2303 |
| 2292 // Add waiter (for the consumer to become readable). | 2304 // Add waiter (for the consumer to become readable). |
| 2293 waiter.Init(); | 2305 waiter.Init(); |
| 2294 ASSERT_EQ(MOJO_RESULT_OK, | 2306 ASSERT_EQ(MOJO_RESULT_OK, |
| 2295 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, | 2307 this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, |
| 2296 false, 0, nullptr)); | 2308 false, 0, nullptr)); |
| 2297 | 2309 |
| 2298 // Complete the two-phase read. | 2310 // Complete the two-phase read. |
| 2299 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(kTestDataSize)); | 2311 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(kTestDataSize)); |
| 2300 | 2312 |
| 2301 // Wait. | 2313 // Wait. |
| 2302 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 2314 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 2303 waiter.Wait(test::TinyTimeout(), nullptr)); | 2315 waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2304 hss = HandleSignalsState(); | 2316 hss = HandleSignalsState(); |
| 2305 this->ConsumerRemoveAwakable(&waiter, &hss); | 2317 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2306 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 2318 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 2307 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 2319 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 2308 | 2320 |
| 2309 this->ConsumerClose(); | 2321 this->ConsumerClose(); |
| 2310 } | 2322 } |
| 2311 | 2323 |
| 2312 // During a two-phase write, the producer is not writable so it may be waited | 2324 // During a two-phase write, the producer is not writable so it may be waited |
| 2313 // upon (to become writable again). If the consumer is closed, that wait should | 2325 // upon (to become writable again). If the consumer is closed, that wait should |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2345 this->ProducerAddAwakable(&waiter2, MOJO_HANDLE_SIGNAL_WRITABLE, | 2357 this->ProducerAddAwakable(&waiter2, MOJO_HANDLE_SIGNAL_WRITABLE, |
| 2346 false, 0, nullptr)); | 2358 false, 0, nullptr)); |
| 2347 | 2359 |
| 2348 // Close the consumer. | 2360 // Close the consumer. |
| 2349 this->ConsumerClose(); | 2361 this->ConsumerClose(); |
| 2350 | 2362 |
| 2351 // Wait for the consumer close to be detected. | 2363 // Wait for the consumer close to be detected. |
| 2352 // Note: If we didn't wait for the consumer close to be detected before | 2364 // Note: If we didn't wait for the consumer close to be detected before |
| 2353 // completing the two-phase write, wait might succeed (in the remote cases). | 2365 // completing the two-phase write, wait might succeed (in the remote cases). |
| 2354 // This is because the first |Awake()| "wins". | 2366 // This is because the first |Awake()| "wins". |
| 2355 EXPECT_EQ(MOJO_RESULT_OK, waiter1.Wait(test::TinyTimeout(), nullptr)); | 2367 EXPECT_EQ(MOJO_RESULT_OK, |
| 2368 waiter1.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2356 hss = HandleSignalsState(); | 2369 hss = HandleSignalsState(); |
| 2357 this->ProducerRemoveAwakable(&waiter1, &hss); | 2370 this->ProducerRemoveAwakable(&waiter1, &hss); |
| 2358 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 2371 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 2359 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 2372 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 2360 | 2373 |
| 2361 // Complete the two-phase write (with nothing written). | 2374 // Complete the two-phase write (with nothing written). |
| 2362 EXPECT_EQ(MOJO_RESULT_OK, this->ProducerEndWriteData(0u)); | 2375 EXPECT_EQ(MOJO_RESULT_OK, this->ProducerEndWriteData(0u)); |
| 2363 | 2376 |
| 2364 // Wait. | 2377 // Wait. |
| 2365 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 2378 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 2366 waiter2.Wait(test::TinyTimeout(), nullptr)); | 2379 waiter2.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2367 hss = HandleSignalsState(); | 2380 hss = HandleSignalsState(); |
| 2368 this->ProducerRemoveAwakable(&waiter2, &hss); | 2381 this->ProducerRemoveAwakable(&waiter2, &hss); |
| 2369 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 2382 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 2370 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 2383 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 2371 | 2384 |
| 2372 this->ProducerClose(); | 2385 this->ProducerClose(); |
| 2373 } | 2386 } |
| 2374 | 2387 |
| 2375 // Test that two-phase reads/writes behave correctly when given invalid | 2388 // Test that two-phase reads/writes behave correctly when given invalid |
| 2376 // arguments. | 2389 // arguments. |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2459 | 2472 |
| 2460 // Now write some data, so we'll be able to try reading. | 2473 // Now write some data, so we'll be able to try reading. |
| 2461 int32_t element = 123; | 2474 int32_t element = 123; |
| 2462 num_bytes = 1u * sizeof(int32_t); | 2475 num_bytes = 1u * sizeof(int32_t); |
| 2463 EXPECT_EQ(MOJO_RESULT_OK, | 2476 EXPECT_EQ(MOJO_RESULT_OK, |
| 2464 this->ProducerWriteData(UserPointer<const void>(&element), | 2477 this->ProducerWriteData(UserPointer<const void>(&element), |
| 2465 MakeUserPointer(&num_bytes), false)); | 2478 MakeUserPointer(&num_bytes), false)); |
| 2466 | 2479 |
| 2467 // Wait for data. | 2480 // Wait for data. |
| 2468 // TODO(vtl): (See corresponding TODO in AllOrNone.) | 2481 // TODO(vtl): (See corresponding TODO in AllOrNone.) |
| 2469 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 2482 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2470 hss = HandleSignalsState(); | 2483 hss = HandleSignalsState(); |
| 2471 this->ConsumerRemoveAwakable(&waiter, &hss); | 2484 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2472 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2485 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2473 hss.satisfied_signals); | 2486 hss.satisfied_signals); |
| 2474 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2487 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2475 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2488 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2476 hss.satisfiable_signals); | 2489 hss.satisfiable_signals); |
| 2477 | 2490 |
| 2478 // One element available. | 2491 // One element available. |
| 2479 num_bytes = 0u; | 2492 num_bytes = 0u; |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2656 false, 0, nullptr)); | 2669 false, 0, nullptr)); |
| 2657 | 2670 |
| 2658 // Set the write threshold to 6. | 2671 // Set the write threshold to 6. |
| 2659 this->ProducerSetOptions(6); | 2672 this->ProducerSetOptions(6); |
| 2660 | 2673 |
| 2661 // Should no longer have the write threshold signal. | 2674 // Should no longer have the write threshold signal. |
| 2662 waiter.Init(); | 2675 waiter.Init(); |
| 2663 ASSERT_EQ(MOJO_RESULT_OK, this->ProducerAddAwakable( | 2676 ASSERT_EQ(MOJO_RESULT_OK, this->ProducerAddAwakable( |
| 2664 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 2677 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2665 false, 0, nullptr)); | 2678 false, 0, nullptr)); |
| 2666 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 2679 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr, nullptr)); |
| 2667 hss = HandleSignalsState(); | 2680 hss = HandleSignalsState(); |
| 2668 this->ProducerRemoveAwakable(&waiter, &hss); | 2681 this->ProducerRemoveAwakable(&waiter, &hss); |
| 2669 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 2682 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
| 2670 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2683 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2671 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 2684 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2672 hss.satisfiable_signals); | 2685 hss.satisfiable_signals); |
| 2673 | 2686 |
| 2674 // Add a waiter. | 2687 // Add a waiter. |
| 2675 waiter.Init(); | 2688 waiter.Init(); |
| 2676 ASSERT_EQ(MOJO_RESULT_OK, this->ProducerAddAwakable( | 2689 ASSERT_EQ(MOJO_RESULT_OK, this->ProducerAddAwakable( |
| 2677 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 2690 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2678 false, 0, nullptr)); | 2691 false, 0, nullptr)); |
| 2679 | 2692 |
| 2680 // Wait for the consumer to be readable. | 2693 // Wait for the consumer to be readable. |
| 2681 EXPECT_EQ(MOJO_RESULT_OK, read_waiter.Wait(test::TinyTimeout(), nullptr)); | 2694 EXPECT_EQ(MOJO_RESULT_OK, |
| 2695 read_waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2682 this->ConsumerRemoveAwakable(&read_waiter, nullptr); | 2696 this->ConsumerRemoveAwakable(&read_waiter, nullptr); |
| 2683 | 2697 |
| 2684 // Read a byte. | 2698 // Read a byte. |
| 2685 char read_byte = 'a'; | 2699 char read_byte = 'a'; |
| 2686 num_bytes = sizeof(read_byte); | 2700 num_bytes = sizeof(read_byte); |
| 2687 EXPECT_EQ(MOJO_RESULT_OK, | 2701 EXPECT_EQ(MOJO_RESULT_OK, |
| 2688 this->ConsumerReadData(UserPointer<void>(&read_byte), | 2702 this->ConsumerReadData(UserPointer<void>(&read_byte), |
| 2689 MakeUserPointer(&num_bytes), true, false)); | 2703 MakeUserPointer(&num_bytes), true, false)); |
| 2690 EXPECT_EQ(1u, num_bytes); | 2704 EXPECT_EQ(1u, num_bytes); |
| 2691 EXPECT_EQ(kTestData[0], read_byte); | 2705 EXPECT_EQ(kTestData[0], read_byte); |
| 2692 | 2706 |
| 2693 // Wait; should get the write threshold signal. | 2707 // Wait; should get the write threshold signal. |
| 2694 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 2708 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2695 hss = HandleSignalsState(); | 2709 hss = HandleSignalsState(); |
| 2696 this->ProducerRemoveAwakable(&waiter, &hss); | 2710 this->ProducerRemoveAwakable(&waiter, &hss); |
| 2697 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 2711 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2698 hss.satisfied_signals); | 2712 hss.satisfied_signals); |
| 2699 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2713 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2700 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 2714 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2701 hss.satisfiable_signals); | 2715 hss.satisfiable_signals); |
| 2702 | 2716 |
| 2703 // Write 6 more bytes. | 2717 // Write 6 more bytes. |
| 2704 static const char kMoreTestData[6] = {'1', '2', '3', '4', '5', '6'}; | 2718 static const char kMoreTestData[6] = {'1', '2', '3', '4', '5', '6'}; |
| 2705 num_bytes = 6; | 2719 num_bytes = 6; |
| 2706 EXPECT_EQ(MOJO_RESULT_OK, | 2720 EXPECT_EQ(MOJO_RESULT_OK, |
| 2707 this->ProducerWriteData(UserPointer<const void>(kMoreTestData), | 2721 this->ProducerWriteData(UserPointer<const void>(kMoreTestData), |
| 2708 MakeUserPointer(&num_bytes), false)); | 2722 MakeUserPointer(&num_bytes), false)); |
| 2709 EXPECT_EQ(6u, num_bytes); | 2723 EXPECT_EQ(6u, num_bytes); |
| 2710 | 2724 |
| 2711 // Should no longer have the write threshold signal. | 2725 // Should no longer have the write threshold signal. |
| 2712 waiter.Init(); | 2726 waiter.Init(); |
| 2713 ASSERT_EQ(MOJO_RESULT_OK, this->ProducerAddAwakable( | 2727 ASSERT_EQ(MOJO_RESULT_OK, this->ProducerAddAwakable( |
| 2714 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 2728 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2715 false, 0, nullptr)); | 2729 false, 0, nullptr)); |
| 2716 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 2730 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr, nullptr)); |
| 2717 this->ProducerRemoveAwakable(&waiter, nullptr); | 2731 this->ProducerRemoveAwakable(&waiter, nullptr); |
| 2718 | 2732 |
| 2719 // Set the write threshold to 0 (which means the element size, 1). | 2733 // Set the write threshold to 0 (which means the element size, 1). |
| 2720 this->ProducerSetOptions(0); | 2734 this->ProducerSetOptions(0); |
| 2721 write_threshold_num_bytes = 123u; | 2735 write_threshold_num_bytes = 123u; |
| 2722 this->ProducerGetOptions(&write_threshold_num_bytes); | 2736 this->ProducerGetOptions(&write_threshold_num_bytes); |
| 2723 EXPECT_EQ(0u, write_threshold_num_bytes); | 2737 EXPECT_EQ(0u, write_threshold_num_bytes); |
| 2724 | 2738 |
| 2725 // Should still not have the write threshold signal. | 2739 // Should still not have the write threshold signal. |
| 2726 waiter.Init(); | 2740 waiter.Init(); |
| 2727 ASSERT_EQ(MOJO_RESULT_OK, this->ProducerAddAwakable( | 2741 ASSERT_EQ(MOJO_RESULT_OK, this->ProducerAddAwakable( |
| 2728 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 2742 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2729 false, 0, nullptr)); | 2743 false, 0, nullptr)); |
| 2730 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 2744 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr, nullptr)); |
| 2731 this->ProducerRemoveAwakable(&waiter, nullptr); | 2745 this->ProducerRemoveAwakable(&waiter, nullptr); |
| 2732 | 2746 |
| 2733 // Add a waiter. | 2747 // Add a waiter. |
| 2734 waiter.Init(); | 2748 waiter.Init(); |
| 2735 ASSERT_EQ(MOJO_RESULT_OK, this->ProducerAddAwakable( | 2749 ASSERT_EQ(MOJO_RESULT_OK, this->ProducerAddAwakable( |
| 2736 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 2750 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
| 2737 false, 0, nullptr)); | 2751 false, 0, nullptr)); |
| 2738 | 2752 |
| 2739 // Close the consumer. | 2753 // Close the consumer. |
| 2740 this->ConsumerClose(); | 2754 this->ConsumerClose(); |
| 2741 | 2755 |
| 2742 // Wait; the condition should now never be satisfiable. | 2756 // Wait; the condition should now never be satisfiable. |
| 2743 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 2757 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 2744 waiter.Wait(test::TinyTimeout(), nullptr)); | 2758 waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2745 hss = HandleSignalsState(); | 2759 hss = HandleSignalsState(); |
| 2746 this->ProducerRemoveAwakable(&waiter, &hss); | 2760 this->ProducerRemoveAwakable(&waiter, &hss); |
| 2747 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 2761 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 2748 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 2762 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 2749 | 2763 |
| 2750 this->ProducerClose(); | 2764 this->ProducerClose(); |
| 2751 } | 2765 } |
| 2752 | 2766 |
| 2753 TYPED_TEST(DataPipeImplTest, ReadThreshold) { | 2767 TYPED_TEST(DataPipeImplTest, ReadThreshold) { |
| 2754 const MojoCreateDataPipeOptions options = { | 2768 const MojoCreateDataPipeOptions options = { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2768 | 2782 |
| 2769 Waiter waiter; | 2783 Waiter waiter; |
| 2770 HandleSignalsState hss; | 2784 HandleSignalsState hss; |
| 2771 | 2785 |
| 2772 // Add a waiter. | 2786 // Add a waiter. |
| 2773 waiter.Init(); | 2787 waiter.Init(); |
| 2774 ASSERT_EQ(MOJO_RESULT_OK, | 2788 ASSERT_EQ(MOJO_RESULT_OK, |
| 2775 this->ConsumerAddAwakable( | 2789 this->ConsumerAddAwakable( |
| 2776 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); | 2790 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); |
| 2777 // Trivial wait: it shouldn't have the read threshold signal. | 2791 // Trivial wait: it shouldn't have the read threshold signal. |
| 2778 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 2792 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr, nullptr)); |
| 2779 hss = HandleSignalsState(); | 2793 hss = HandleSignalsState(); |
| 2780 this->ConsumerRemoveAwakable(&waiter, &hss); | 2794 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2781 EXPECT_EQ(0u, hss.satisfied_signals); | 2795 EXPECT_EQ(0u, hss.satisfied_signals); |
| 2782 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2796 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2783 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2797 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2784 hss.satisfiable_signals); | 2798 hss.satisfiable_signals); |
| 2785 | 2799 |
| 2786 // Add a waiter. | 2800 // Add a waiter. |
| 2787 waiter.Init(); | 2801 waiter.Init(); |
| 2788 ASSERT_EQ(MOJO_RESULT_OK, | 2802 ASSERT_EQ(MOJO_RESULT_OK, |
| 2789 this->ConsumerAddAwakable( | 2803 this->ConsumerAddAwakable( |
| 2790 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); | 2804 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); |
| 2791 | 2805 |
| 2792 // Write a byte. | 2806 // Write a byte. |
| 2793 const char kTestData[] = {'x'}; | 2807 const char kTestData[] = {'x'}; |
| 2794 const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData)); | 2808 const uint32_t kTestDataSize = static_cast<uint32_t>(sizeof(kTestData)); |
| 2795 uint32_t num_bytes = kTestDataSize; | 2809 uint32_t num_bytes = kTestDataSize; |
| 2796 EXPECT_EQ(MOJO_RESULT_OK, | 2810 EXPECT_EQ(MOJO_RESULT_OK, |
| 2797 this->ProducerWriteData(UserPointer<const void>(kTestData), | 2811 this->ProducerWriteData(UserPointer<const void>(kTestData), |
| 2798 MakeUserPointer(&num_bytes), false)); | 2812 MakeUserPointer(&num_bytes), false)); |
| 2799 EXPECT_EQ(kTestDataSize, num_bytes); | 2813 EXPECT_EQ(kTestDataSize, num_bytes); |
| 2800 | 2814 |
| 2801 // Wait for the read threshold signal. | 2815 // Wait for the read threshold signal. |
| 2802 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 2816 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2803 hss = HandleSignalsState(); | 2817 hss = HandleSignalsState(); |
| 2804 this->ConsumerRemoveAwakable(&waiter, &hss); | 2818 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2805 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2819 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2806 hss.satisfied_signals); | 2820 hss.satisfied_signals); |
| 2807 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2821 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2808 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2822 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2809 hss.satisfiable_signals); | 2823 hss.satisfiable_signals); |
| 2810 | 2824 |
| 2811 // Set the read threshold to 1. | 2825 // Set the read threshold to 1. |
| 2812 this->ConsumerSetOptions(1); | 2826 this->ConsumerSetOptions(1); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2840 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); | 2854 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); |
| 2841 | 2855 |
| 2842 // Write another byte. | 2856 // Write another byte. |
| 2843 num_bytes = kTestDataSize; | 2857 num_bytes = kTestDataSize; |
| 2844 EXPECT_EQ(MOJO_RESULT_OK, | 2858 EXPECT_EQ(MOJO_RESULT_OK, |
| 2845 this->ProducerWriteData(UserPointer<const void>(kTestData), | 2859 this->ProducerWriteData(UserPointer<const void>(kTestData), |
| 2846 MakeUserPointer(&num_bytes), false)); | 2860 MakeUserPointer(&num_bytes), false)); |
| 2847 EXPECT_EQ(kTestDataSize, num_bytes); | 2861 EXPECT_EQ(kTestDataSize, num_bytes); |
| 2848 | 2862 |
| 2849 // Wait for the read threshold signal. | 2863 // Wait for the read threshold signal. |
| 2850 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr)); | 2864 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2851 hss = HandleSignalsState(); | 2865 hss = HandleSignalsState(); |
| 2852 this->ConsumerRemoveAwakable(&waiter, &hss); | 2866 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2853 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2867 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2854 hss.satisfied_signals); | 2868 hss.satisfied_signals); |
| 2855 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2869 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2856 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2870 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2857 hss.satisfiable_signals); | 2871 hss.satisfiable_signals); |
| 2858 | 2872 |
| 2859 // Read one byte. | 2873 // Read one byte. |
| 2860 char read_byte = 'a'; | 2874 char read_byte = 'a'; |
| 2861 num_bytes = sizeof(read_byte); | 2875 num_bytes = sizeof(read_byte); |
| 2862 EXPECT_EQ(MOJO_RESULT_OK, | 2876 EXPECT_EQ(MOJO_RESULT_OK, |
| 2863 this->ConsumerReadData(UserPointer<void>(&read_byte), | 2877 this->ConsumerReadData(UserPointer<void>(&read_byte), |
| 2864 MakeUserPointer(&num_bytes), true, false)); | 2878 MakeUserPointer(&num_bytes), true, false)); |
| 2865 EXPECT_EQ(1u, num_bytes); | 2879 EXPECT_EQ(1u, num_bytes); |
| 2866 EXPECT_EQ(kTestData[0], read_byte); | 2880 EXPECT_EQ(kTestData[0], read_byte); |
| 2867 | 2881 |
| 2868 // Add a waiter. | 2882 // Add a waiter. |
| 2869 waiter.Init(); | 2883 waiter.Init(); |
| 2870 ASSERT_EQ(MOJO_RESULT_OK, | 2884 ASSERT_EQ(MOJO_RESULT_OK, |
| 2871 this->ConsumerAddAwakable( | 2885 this->ConsumerAddAwakable( |
| 2872 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); | 2886 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); |
| 2873 // Trivial wait: it shouldn't have the read threshold signal. | 2887 // Trivial wait: it shouldn't have the read threshold signal. |
| 2874 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 2888 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr, nullptr)); |
| 2875 hss = HandleSignalsState(); | 2889 hss = HandleSignalsState(); |
| 2876 this->ConsumerRemoveAwakable(&waiter, &hss); | 2890 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2877 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 2891 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 2878 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2892 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2879 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2893 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2880 hss.satisfiable_signals); | 2894 hss.satisfiable_signals); |
| 2881 | 2895 |
| 2882 // Add a waiter. | 2896 // Add a waiter. |
| 2883 waiter.Init(); | 2897 waiter.Init(); |
| 2884 ASSERT_EQ(MOJO_RESULT_OK, | 2898 ASSERT_EQ(MOJO_RESULT_OK, |
| 2885 this->ConsumerAddAwakable( | 2899 this->ConsumerAddAwakable( |
| 2886 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); | 2900 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); |
| 2887 // Trivial wait: it shouldn't have the read threshold signal. | 2901 // Trivial wait: it shouldn't have the read threshold signal. |
| 2888 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); | 2902 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr, nullptr)); |
| 2889 hss = HandleSignalsState(); | 2903 hss = HandleSignalsState(); |
| 2890 this->ConsumerRemoveAwakable(&waiter, &hss); | 2904 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2891 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 2905 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 2892 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 2906 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 2893 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 2907 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 2894 hss.satisfiable_signals); | 2908 hss.satisfiable_signals); |
| 2895 | 2909 |
| 2896 // Add a waiter. | 2910 // Add a waiter. |
| 2897 waiter.Init(); | 2911 waiter.Init(); |
| 2898 ASSERT_EQ(MOJO_RESULT_OK, | 2912 ASSERT_EQ(MOJO_RESULT_OK, |
| 2899 this->ConsumerAddAwakable( | 2913 this->ConsumerAddAwakable( |
| 2900 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); | 2914 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, nullptr)); |
| 2901 | 2915 |
| 2902 // Close the producer. | 2916 // Close the producer. |
| 2903 this->ProducerClose(); | 2917 this->ProducerClose(); |
| 2904 | 2918 |
| 2905 // Wait; the current read threshold becomes never satisfiable. | 2919 // Wait; the current read threshold becomes never satisfiable. |
| 2906 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 2920 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 2907 waiter.Wait(test::TinyTimeout(), nullptr)); | 2921 waiter.Wait(test::TinyTimeout(), nullptr, nullptr)); |
| 2908 hss = HandleSignalsState(); | 2922 hss = HandleSignalsState(); |
| 2909 this->ConsumerRemoveAwakable(&waiter, &hss); | 2923 this->ConsumerRemoveAwakable(&waiter, &hss); |
| 2910 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 2924 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 2911 hss.satisfied_signals); | 2925 hss.satisfied_signals); |
| 2912 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 2926 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 2913 hss.satisfiable_signals); | 2927 hss.satisfiable_signals); |
| 2914 | 2928 |
| 2915 // Set the read threshold back to zero to 0. | 2929 // Set the read threshold back to zero to 0. |
| 2916 this->ConsumerSetOptions(0); | 2930 this->ConsumerSetOptions(0); |
| 2917 read_threshold_num_bytes = 123u; | 2931 read_threshold_num_bytes = 123u; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2949 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, &hss)); | 2963 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, false, 0, &hss)); |
| 2950 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 2964 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 2951 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 2965 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 2952 | 2966 |
| 2953 this->ConsumerClose(); | 2967 this->ConsumerClose(); |
| 2954 } | 2968 } |
| 2955 | 2969 |
| 2956 } // namespace | 2970 } // namespace |
| 2957 } // namespace system | 2971 } // namespace system |
| 2958 } // namespace mojo | 2972 } // namespace mojo |
| OLD | NEW |