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

Side by Side Diff: mojo/system/remote_message_pipe_unittest.cc

Issue 566783002: Mojo: Remove DCHECK disallowing passing of a remote message pipe. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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
« no previous file with comments | « mojo/system/message_pipe.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « mojo/system/message_pipe.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698