OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <stdint.h> | 5 #include <stdint.h> |
6 #include <stdio.h> | 6 #include <stdio.h> |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 921 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
932 } | 932 } |
933 if (i & 8u) | 933 if (i & 8u) |
934 base::PlatformThread::Sleep(delay); | 934 base::PlatformThread::Sleep(delay); |
935 | 935 |
936 mp1->Close(1); | 936 mp1->Close(1); |
937 | 937 |
938 RestoreInitialState(); | 938 RestoreInitialState(); |
939 } | 939 } |
940 } | 940 } |
941 | 941 |
| 942 // Tests passing an end of a message pipe over a remote message pipe, and then |
| 943 // passing that end back. |
| 944 // TODO(vtl): Also test passing a message pipe across two remote message pipes. |
| 945 TEST_F(RemoteMessagePipeTest, PassMessagePipeHandleAcrossAndBack) { |
| 946 static const char kHello[] = "hello"; |
| 947 static const char kWorld[] = "world"; |
| 948 Waiter waiter; |
| 949 HandleSignalsState hss; |
| 950 uint32_t context = 0; |
| 951 |
| 952 scoped_refptr<MessagePipe> mp0(MessagePipe::CreateLocalProxy()); |
| 953 scoped_refptr<MessagePipe> mp1(MessagePipe::CreateProxyLocal()); |
| 954 ConnectMessagePipes(mp0, mp1); |
| 955 |
| 956 // We'll try to pass this dispatcher. |
| 957 scoped_refptr<MessagePipeDispatcher> dispatcher( |
| 958 new MessagePipeDispatcher(MessagePipeDispatcher::kDefaultCreateOptions)); |
| 959 scoped_refptr<MessagePipe> local_mp(MessagePipe::CreateLocalLocal()); |
| 960 dispatcher->Init(local_mp, 0); |
| 961 |
| 962 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
| 963 // it later, it might already be readable.) |
| 964 waiter.Init(); |
| 965 ASSERT_EQ(MOJO_RESULT_OK, |
| 966 mp1->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, NULL)); |
| 967 |
| 968 // Write to MP 0, port 0. |
| 969 { |
| 970 DispatcherTransport transport( |
| 971 test::DispatcherTryStartTransport(dispatcher.get())); |
| 972 EXPECT_TRUE(transport.is_valid()); |
| 973 |
| 974 std::vector<DispatcherTransport> transports; |
| 975 transports.push_back(transport); |
| 976 EXPECT_EQ(MOJO_RESULT_OK, |
| 977 mp0->WriteMessage(0, |
| 978 UserPointer<const void>(kHello), |
| 979 sizeof(kHello), |
| 980 &transports, |
| 981 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 982 transport.End(); |
| 983 |
| 984 // |dispatcher| should have been closed. This is |DCHECK()|ed when the |
| 985 // |dispatcher| is destroyed. |
| 986 EXPECT_TRUE(dispatcher->HasOneRef()); |
| 987 dispatcher = NULL; |
| 988 } |
| 989 |
| 990 // Wait. |
| 991 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 992 EXPECT_EQ(123u, context); |
| 993 hss = HandleSignalsState(); |
| 994 mp1->RemoveWaiter(1, &waiter, &hss); |
| 995 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 996 hss.satisfied_signals); |
| 997 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 998 hss.satisfiable_signals); |
| 999 |
| 1000 // Read from MP 1, port 1. |
| 1001 char read_buffer[100] = {0}; |
| 1002 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 1003 DispatcherVector read_dispatchers; |
| 1004 uint32_t read_num_dispatchers = 10; // Maximum to get. |
| 1005 EXPECT_EQ(MOJO_RESULT_OK, |
| 1006 mp1->ReadMessage(1, |
| 1007 UserPointer<void>(read_buffer), |
| 1008 MakeUserPointer(&read_buffer_size), |
| 1009 &read_dispatchers, |
| 1010 &read_num_dispatchers, |
| 1011 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 1012 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
| 1013 EXPECT_STREQ(kHello, read_buffer); |
| 1014 EXPECT_EQ(1u, read_dispatchers.size()); |
| 1015 EXPECT_EQ(1u, read_num_dispatchers); |
| 1016 ASSERT_TRUE(read_dispatchers[0].get()); |
| 1017 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); |
| 1018 |
| 1019 EXPECT_EQ(Dispatcher::kTypeMessagePipe, read_dispatchers[0]->GetType()); |
| 1020 dispatcher = static_cast<MessagePipeDispatcher*>(read_dispatchers[0].get()); |
| 1021 read_dispatchers.clear(); |
| 1022 |
| 1023 // Now pass it back. |
| 1024 |
| 1025 // Prepare to wait on MP 0, port 0. (Add the waiter now. Otherwise, if we do |
| 1026 // it later, it might already be readable.) |
| 1027 waiter.Init(); |
| 1028 ASSERT_EQ(MOJO_RESULT_OK, |
| 1029 mp0->AddWaiter(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, NULL)); |
| 1030 |
| 1031 // Write to MP 1, port 1. |
| 1032 { |
| 1033 DispatcherTransport transport( |
| 1034 test::DispatcherTryStartTransport(dispatcher.get())); |
| 1035 EXPECT_TRUE(transport.is_valid()); |
| 1036 |
| 1037 std::vector<DispatcherTransport> transports; |
| 1038 transports.push_back(transport); |
| 1039 EXPECT_EQ(MOJO_RESULT_OK, |
| 1040 mp1->WriteMessage(1, |
| 1041 UserPointer<const void>(kWorld), |
| 1042 sizeof(kWorld), |
| 1043 &transports, |
| 1044 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1045 transport.End(); |
| 1046 |
| 1047 // |dispatcher| should have been closed. This is |DCHECK()|ed when the |
| 1048 // |dispatcher| is destroyed. |
| 1049 EXPECT_TRUE(dispatcher->HasOneRef()); |
| 1050 dispatcher = NULL; |
| 1051 } |
| 1052 |
| 1053 // Wait. |
| 1054 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 1055 EXPECT_EQ(456u, context); |
| 1056 hss = HandleSignalsState(); |
| 1057 mp0->RemoveWaiter(0, &waiter, &hss); |
| 1058 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1059 hss.satisfied_signals); |
| 1060 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1061 hss.satisfiable_signals); |
| 1062 |
| 1063 // Read from MP 0, port 0. |
| 1064 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 1065 read_num_dispatchers = 10; // Maximum to get. |
| 1066 EXPECT_EQ(MOJO_RESULT_OK, |
| 1067 mp0->ReadMessage(0, |
| 1068 UserPointer<void>(read_buffer), |
| 1069 MakeUserPointer(&read_buffer_size), |
| 1070 &read_dispatchers, |
| 1071 &read_num_dispatchers, |
| 1072 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 1073 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(read_buffer_size)); |
| 1074 EXPECT_STREQ(kWorld, read_buffer); |
| 1075 EXPECT_EQ(1u, read_dispatchers.size()); |
| 1076 EXPECT_EQ(1u, read_num_dispatchers); |
| 1077 ASSERT_TRUE(read_dispatchers[0].get()); |
| 1078 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); |
| 1079 |
| 1080 EXPECT_EQ(Dispatcher::kTypeMessagePipe, read_dispatchers[0]->GetType()); |
| 1081 dispatcher = static_cast<MessagePipeDispatcher*>(read_dispatchers[0].get()); |
| 1082 read_dispatchers.clear(); |
| 1083 |
| 1084 // Add the waiter now, before it becomes readable to avoid a race. |
| 1085 waiter.Init(); |
| 1086 ASSERT_EQ( |
| 1087 MOJO_RESULT_OK, |
| 1088 dispatcher->AddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, NULL)); |
| 1089 |
| 1090 // Write to "local_mp", port 1. |
| 1091 EXPECT_EQ(MOJO_RESULT_OK, |
| 1092 local_mp->WriteMessage(1, |
| 1093 UserPointer<const void>(kHello), |
| 1094 sizeof(kHello), |
| 1095 NULL, |
| 1096 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1097 |
| 1098 // Wait for the dispatcher to become readable. |
| 1099 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 1100 EXPECT_EQ(789u, context); |
| 1101 hss = HandleSignalsState(); |
| 1102 dispatcher->RemoveWaiter(&waiter, &hss); |
| 1103 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1104 hss.satisfied_signals); |
| 1105 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1106 hss.satisfiable_signals); |
| 1107 |
| 1108 // Read from the dispatcher. |
| 1109 memset(read_buffer, 0, sizeof(read_buffer)); |
| 1110 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 1111 EXPECT_EQ(MOJO_RESULT_OK, |
| 1112 dispatcher->ReadMessage(UserPointer<void>(read_buffer), |
| 1113 MakeUserPointer(&read_buffer_size), |
| 1114 0, |
| 1115 NULL, |
| 1116 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 1117 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
| 1118 EXPECT_STREQ(kHello, read_buffer); |
| 1119 |
| 1120 // Prepare to wait on "local_mp", port 1. |
| 1121 waiter.Init(); |
| 1122 ASSERT_EQ( |
| 1123 MOJO_RESULT_OK, |
| 1124 local_mp->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, NULL)); |
| 1125 |
| 1126 // Write to the dispatcher. |
| 1127 EXPECT_EQ(MOJO_RESULT_OK, |
| 1128 dispatcher->WriteMessage(UserPointer<const void>(kHello), |
| 1129 sizeof(kHello), |
| 1130 NULL, |
| 1131 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 1132 |
| 1133 // Wait. |
| 1134 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
| 1135 EXPECT_EQ(789u, context); |
| 1136 hss = HandleSignalsState(); |
| 1137 local_mp->RemoveWaiter(1, &waiter, &hss); |
| 1138 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1139 hss.satisfied_signals); |
| 1140 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1141 hss.satisfiable_signals); |
| 1142 |
| 1143 // Read from "local_mp", port 1. |
| 1144 memset(read_buffer, 0, sizeof(read_buffer)); |
| 1145 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 1146 EXPECT_EQ(MOJO_RESULT_OK, |
| 1147 local_mp->ReadMessage(1, |
| 1148 UserPointer<void>(read_buffer), |
| 1149 MakeUserPointer(&read_buffer_size), |
| 1150 NULL, |
| 1151 NULL, |
| 1152 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 1153 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
| 1154 EXPECT_STREQ(kHello, read_buffer); |
| 1155 |
| 1156 // TODO(vtl): Also test the cases where messages are written and read (at |
| 1157 // various points) on the message pipe being passed around. |
| 1158 |
| 1159 // Close everything that belongs to us. |
| 1160 mp0->Close(0); |
| 1161 mp1->Close(1); |
| 1162 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); |
| 1163 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed. |
| 1164 local_mp->Close(1); |
| 1165 } |
| 1166 |
942 } // namespace | 1167 } // namespace |
943 } // namespace system | 1168 } // namespace system |
944 } // namespace mojo | 1169 } // namespace mojo |
OLD | NEW |