| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "mojo/edk/system/core.h" | 5 #include "mojo/edk/system/core.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "mojo/edk/embedder/embedder_internal.h" |
| 12 #include "mojo/edk/system/awakable.h" | 13 #include "mojo/edk/system/awakable.h" |
| 13 #include "mojo/edk/system/core_test_base.h" | 14 #include "mojo/edk/system/core_test_base.h" |
| 14 #include "mojo/edk/system/test_utils.h" | 15 #include "mojo/edk/system/test_utils.h" |
| 15 #include "mojo/public/cpp/system/macros.h" | 16 #include "mojo/public/cpp/system/macros.h" |
| 16 | 17 |
| 17 namespace mojo { | 18 namespace mojo { |
| 18 namespace system { | 19 namespace edk { |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u}; | 22 const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u}; |
| 22 const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u}; | 23 const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u}; |
| 23 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE | | 24 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE | |
| 24 MOJO_HANDLE_SIGNAL_WRITABLE | | 25 MOJO_HANDLE_SIGNAL_WRITABLE | |
| 25 MOJO_HANDLE_SIGNAL_PEER_CLOSED; | 26 MOJO_HANDLE_SIGNAL_PEER_CLOSED; |
| 26 | 27 |
| 27 using CoreTest = test::CoreTestBase; | 28 using CoreTest = test::CoreTestBase; |
| 28 | 29 |
| (...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 // Write to |h[0]|. | 652 // Write to |h[0]|. |
| 652 buffer[0] = 'd'; | 653 buffer[0] = 'd'; |
| 653 EXPECT_EQ( | 654 EXPECT_EQ( |
| 654 MOJO_RESULT_OK, | 655 MOJO_RESULT_OK, |
| 655 core()->WriteMessage(h[0], UserPointer<const void>(buffer), 1, | 656 core()->WriteMessage(h[0], UserPointer<const void>(buffer), 1, |
| 656 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 657 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 657 | 658 |
| 658 // Close |h[0]|. | 659 // Close |h[0]|. |
| 659 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0])); | 660 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0])); |
| 660 | 661 |
| 662 // Wait for |h[1]| to learn about the other end's closure. |
| 663 EXPECT_EQ(MOJO_RESULT_OK, |
| 664 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1000000000, |
| 665 MakeUserPointer(&hss[0]))); |
| 666 |
| 661 // Check that |h[1]| is no longer writable (and will never be). | 667 // Check that |h[1]| is no longer writable (and will never be). |
| 662 hss[0] = kEmptyMojoHandleSignalsState; | 668 hss[0] = kEmptyMojoHandleSignalsState; |
| 663 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 669 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 664 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000, | 670 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000, |
| 665 MakeUserPointer(&hss[0]))); | 671 MakeUserPointer(&hss[0]))); |
| 666 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 672 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 667 hss[0].satisfied_signals); | 673 hss[0].satisfied_signals); |
| 668 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 674 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 669 hss[0].satisfiable_signals); | 675 hss[0].satisfiable_signals); |
| 670 | 676 |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 | 899 |
| 894 // Write. | 900 // Write. |
| 895 signed char elements[2] = {'A', 'B'}; | 901 signed char elements[2] = {'A', 'B'}; |
| 896 uint32_t num_bytes = 2u; | 902 uint32_t num_bytes = 2u; |
| 897 EXPECT_EQ(MOJO_RESULT_OK, | 903 EXPECT_EQ(MOJO_RESULT_OK, |
| 898 core()->WriteData(ph, UserPointer<const void>(elements), | 904 core()->WriteData(ph, UserPointer<const void>(elements), |
| 899 MakeUserPointer(&num_bytes), | 905 MakeUserPointer(&num_bytes), |
| 900 MOJO_WRITE_DATA_FLAG_NONE)); | 906 MOJO_WRITE_DATA_FLAG_NONE)); |
| 901 EXPECT_EQ(2u, num_bytes); | 907 EXPECT_EQ(2u, num_bytes); |
| 902 | 908 |
| 909 // Wait for the data to arrive to the consumer. |
| 910 EXPECT_EQ(MOJO_RESULT_OK, |
| 911 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, |
| 912 MakeUserPointer(&hss))); |
| 913 |
| 903 // Consumer should now be readable. | 914 // Consumer should now be readable. |
| 904 hss = kEmptyMojoHandleSignalsState; | 915 hss = kEmptyMojoHandleSignalsState; |
| 905 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, | 916 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, |
| 906 MakeUserPointer(&hss))); | 917 MakeUserPointer(&hss))); |
| 907 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); | 918 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
| 908 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 919 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 909 hss.satisfiable_signals); | 920 hss.satisfiable_signals); |
| 910 | 921 |
| 911 // Peek one character. | 922 // Peek one character. |
| 912 elements[0] = -1; | 923 elements[0] = -1; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 946 core()->WriteData(ph, UserPointer<const void>(elements), | 957 core()->WriteData(ph, UserPointer<const void>(elements), |
| 947 MakeUserPointer(&num_bytes), | 958 MakeUserPointer(&num_bytes), |
| 948 MOJO_WRITE_DATA_FLAG_NONE)); | 959 MOJO_WRITE_DATA_FLAG_NONE)); |
| 949 | 960 |
| 950 // Actually write the data, and complete it now. | 961 // Actually write the data, and complete it now. |
| 951 static_cast<char*>(write_ptr)[0] = 'C'; | 962 static_cast<char*>(write_ptr)[0] = 'C'; |
| 952 static_cast<char*>(write_ptr)[1] = 'D'; | 963 static_cast<char*>(write_ptr)[1] = 'D'; |
| 953 static_cast<char*>(write_ptr)[2] = 'E'; | 964 static_cast<char*>(write_ptr)[2] = 'E'; |
| 954 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u)); | 965 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u)); |
| 955 | 966 |
| 967 // Wait for the data to arrive to the consumer. |
| 968 EXPECT_EQ(MOJO_RESULT_OK, |
| 969 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, |
| 970 MakeUserPointer(&hss))); |
| 971 |
| 956 // Query how much data we have. | 972 // Query how much data we have. |
| 957 num_bytes = 0; | 973 num_bytes = 0; |
| 958 EXPECT_EQ(MOJO_RESULT_OK, | 974 EXPECT_EQ(MOJO_RESULT_OK, |
| 959 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), | 975 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), |
| 960 MOJO_READ_DATA_FLAG_QUERY)); | 976 MOJO_READ_DATA_FLAG_QUERY)); |
| 961 EXPECT_EQ(4u, num_bytes); | 977 EXPECT_GE(num_bytes, 1u); |
| 962 | 978 |
| 963 // Try to query with peek. Should fail. | 979 // Try to query with peek. Should fail. |
| 964 num_bytes = 0; | 980 num_bytes = 0; |
| 965 EXPECT_EQ( | 981 EXPECT_EQ( |
| 966 MOJO_RESULT_INVALID_ARGUMENT, | 982 MOJO_RESULT_INVALID_ARGUMENT, |
| 967 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), | 983 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), |
| 968 MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK)); | 984 MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK)); |
| 969 EXPECT_EQ(0u, num_bytes); | 985 EXPECT_EQ(0u, num_bytes); |
| 970 | 986 |
| 971 // Try to discard ten characters, in all-or-none mode. Should fail. | 987 // Try to discard ten characters, in all-or-none mode. Should fail. |
| 972 num_bytes = 10; | 988 num_bytes = 10; |
| 973 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, | 989 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
| 974 core()->ReadData( | 990 core()->ReadData( |
| 975 ch, NullUserPointer(), MakeUserPointer(&num_bytes), | 991 ch, NullUserPointer(), MakeUserPointer(&num_bytes), |
| 976 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE)); | 992 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE)); |
| 977 | 993 |
| 978 // Try to discard two characters, in peek mode. Should fail. | 994 // Try to discard two characters, in peek mode. Should fail. |
| 979 num_bytes = 2; | 995 num_bytes = 2; |
| 980 EXPECT_EQ( | 996 EXPECT_EQ( |
| 981 MOJO_RESULT_INVALID_ARGUMENT, | 997 MOJO_RESULT_INVALID_ARGUMENT, |
| 982 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), | 998 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), |
| 983 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK)); | 999 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK)); |
| 984 | 1000 |
| 985 // Discard two characters. | 1001 // Discard a character. |
| 986 num_bytes = 2; | 1002 num_bytes = 1; |
| 987 EXPECT_EQ(MOJO_RESULT_OK, | 1003 EXPECT_EQ(MOJO_RESULT_OK, |
| 988 core()->ReadData( | 1004 core()->ReadData( |
| 989 ch, NullUserPointer(), MakeUserPointer(&num_bytes), | 1005 ch, NullUserPointer(), MakeUserPointer(&num_bytes), |
| 990 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE)); | 1006 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE)); |
| 991 | 1007 |
| 992 // Try a two-phase read of the remaining two bytes with peek. Should fail. | 1008 // Ensure the 3 bytes were read. |
| 1009 EXPECT_EQ(MOJO_RESULT_OK, |
| 1010 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, |
| 1011 MakeUserPointer(&hss))); |
| 1012 |
| 1013 // Try a two-phase read of the remaining three bytes with peek. Should fail. |
| 993 const void* read_ptr = nullptr; | 1014 const void* read_ptr = nullptr; |
| 994 num_bytes = 2; | 1015 num_bytes = 3; |
| 995 ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 1016 ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 996 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), | 1017 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), |
| 997 MakeUserPointer(&num_bytes), | 1018 MakeUserPointer(&num_bytes), |
| 998 MOJO_READ_DATA_FLAG_PEEK)); | 1019 MOJO_READ_DATA_FLAG_PEEK)); |
| 999 | 1020 |
| 1000 // Read the remaining two characters, in two-phase mode (all-or-none). | 1021 // Read the remaining two characters, in two-phase mode (all-or-none). |
| 1001 num_bytes = 2; | 1022 num_bytes = 3; |
| 1002 ASSERT_EQ(MOJO_RESULT_OK, | 1023 ASSERT_EQ(MOJO_RESULT_OK, |
| 1003 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), | 1024 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), |
| 1004 MakeUserPointer(&num_bytes), | 1025 MakeUserPointer(&num_bytes), |
| 1005 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); | 1026 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); |
| 1006 // Note: Count on still being able to do the contiguous read here. | 1027 // Note: Count on still being able to do the contiguous read here. |
| 1007 ASSERT_EQ(2u, num_bytes); | 1028 ASSERT_EQ(3u, num_bytes); |
| 1008 | 1029 |
| 1009 // Discarding right now should fail. | 1030 // Discarding right now should fail. |
| 1010 num_bytes = 1; | 1031 num_bytes = 1; |
| 1011 EXPECT_EQ(MOJO_RESULT_BUSY, | 1032 EXPECT_EQ(MOJO_RESULT_BUSY, |
| 1012 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), | 1033 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), |
| 1013 MOJO_READ_DATA_FLAG_DISCARD)); | 1034 MOJO_READ_DATA_FLAG_DISCARD)); |
| 1014 | 1035 |
| 1015 // Actually check our data and end the two-phase read. | 1036 // Actually check our data and end the two-phase read. |
| 1016 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[0]); | 1037 EXPECT_EQ('C', static_cast<const char*>(read_ptr)[0]); |
| 1017 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[1]); | 1038 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[1]); |
| 1018 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u)); | 1039 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[2]); |
| 1040 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 3u)); |
| 1019 | 1041 |
| 1020 // Consumer should now be no longer readable. | 1042 // Consumer should now be no longer readable. |
| 1021 hss = kFullMojoHandleSignalsState; | 1043 hss = kFullMojoHandleSignalsState; |
| 1022 EXPECT_EQ( | 1044 EXPECT_EQ( |
| 1023 MOJO_RESULT_DEADLINE_EXCEEDED, | 1045 MOJO_RESULT_DEADLINE_EXCEEDED, |
| 1024 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); | 1046 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); |
| 1025 EXPECT_EQ(0u, hss.satisfied_signals); | 1047 EXPECT_EQ(0u, hss.satisfied_signals); |
| 1026 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 1048 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1027 hss.satisfiable_signals); | 1049 hss.satisfiable_signals); |
| 1028 | 1050 |
| 1029 // TODO(vtl): More. | 1051 // TODO(vtl): More. |
| 1030 | 1052 |
| 1031 // Close the producer. | 1053 // Close the producer. |
| 1032 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); | 1054 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); |
| 1033 | 1055 |
| 1056 // Wait for this to get to the consumer. |
| 1057 EXPECT_EQ(MOJO_RESULT_OK, |
| 1058 core()->Wait(ch, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1000000000, |
| 1059 MakeUserPointer(&hss))); |
| 1060 |
| 1034 // The consumer should now be never-readable. | 1061 // The consumer should now be never-readable. |
| 1035 hss = kFullMojoHandleSignalsState; | 1062 hss = kFullMojoHandleSignalsState; |
| 1036 EXPECT_EQ( | 1063 EXPECT_EQ( |
| 1037 MOJO_RESULT_FAILED_PRECONDITION, | 1064 MOJO_RESULT_FAILED_PRECONDITION, |
| 1038 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); | 1065 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); |
| 1039 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 1066 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 1040 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 1067 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 1041 | 1068 |
| 1042 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); | 1069 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); |
| 1043 } | 1070 } |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1306 | 1333 |
| 1307 EXPECT_FALSE(info.GetAddedAwakableAt(0)->Awake(MOJO_RESULT_BUSY, 0)); | 1334 EXPECT_FALSE(info.GetAddedAwakableAt(0)->Awake(MOJO_RESULT_BUSY, 0)); |
| 1308 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result); | 1335 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result); |
| 1309 | 1336 |
| 1310 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 1337 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
| 1311 } | 1338 } |
| 1312 | 1339 |
| 1313 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. | 1340 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. |
| 1314 | 1341 |
| 1315 } // namespace | 1342 } // namespace |
| 1316 } // namespace system | 1343 } // namespace edk |
| 1317 } // namespace mojo | 1344 } // namespace mojo |
| OLD | NEW |