Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Side by Side Diff: mojo/edk/system/data_pipe_impl_unittest.cc

Issue 2075353002: Plumb the handle signals state out of Waiter::Wait(). (Closed) Base URL: https://github.com/domokit/mojo.git@work795_wait_set_4.3-x-work794_wait_set_4.2
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698