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

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

Issue 1350023003: Add a Mojo EDK for Chrome that uses one OS pipe per message pipe. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: more cleanup Created 5 years, 2 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 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 "third_party/mojo/src/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"
13 #include "mojo/edk/system/awakable.h"
14 #include "mojo/edk/system/core_test_base.h"
15 #include "mojo/edk/system/test_utils.h"
12 #include "mojo/public/cpp/system/macros.h" 16 #include "mojo/public/cpp/system/macros.h"
13 #include "third_party/mojo/src/mojo/edk/system/awakable.h"
14 #include "third_party/mojo/src/mojo/edk/system/core_test_base.h"
15 #include "third_party/mojo/src/mojo/edk/system/test_utils.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 11 matching lines...) Expand all
40 TEST_F(CoreTest, Basic) { 41 TEST_F(CoreTest, Basic) {
41 MockHandleInfo info; 42 MockHandleInfo info;
42 43
43 EXPECT_EQ(0u, info.GetCtorCallCount()); 44 EXPECT_EQ(0u, info.GetCtorCallCount());
44 MojoHandle h = CreateMockHandle(&info); 45 MojoHandle h = CreateMockHandle(&info);
45 EXPECT_EQ(1u, info.GetCtorCallCount()); 46 EXPECT_EQ(1u, info.GetCtorCallCount());
46 EXPECT_NE(h, MOJO_HANDLE_INVALID); 47 EXPECT_NE(h, MOJO_HANDLE_INVALID);
47 48
48 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); 49 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
49 EXPECT_EQ(MOJO_RESULT_OK, 50 EXPECT_EQ(MOJO_RESULT_OK,
50 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 0, 51 core()->WriteMessage(h, nullptr, 0, nullptr, 0,
51 MOJO_WRITE_MESSAGE_FLAG_NONE)); 52 MOJO_WRITE_MESSAGE_FLAG_NONE));
52 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); 53 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
53 54
54 EXPECT_EQ(0u, info.GetReadMessageCallCount()); 55 EXPECT_EQ(0u, info.GetReadMessageCallCount());
55 uint32_t num_bytes = 0; 56 uint32_t num_bytes = 0;
56 EXPECT_EQ( 57 EXPECT_EQ(
57 MOJO_RESULT_OK, 58 MOJO_RESULT_OK,
58 core()->ReadMessage(h, NullUserPointer(), MakeUserPointer(&num_bytes), 59 core()->ReadMessage(h, nullptr, &num_bytes, nullptr, nullptr,
59 NullUserPointer(), NullUserPointer(),
60 MOJO_READ_MESSAGE_FLAG_NONE)); 60 MOJO_READ_MESSAGE_FLAG_NONE));
61 EXPECT_EQ(1u, info.GetReadMessageCallCount()); 61 EXPECT_EQ(1u, info.GetReadMessageCallCount());
62 EXPECT_EQ(MOJO_RESULT_OK, 62 EXPECT_EQ(MOJO_RESULT_OK,
63 core()->ReadMessage(h, NullUserPointer(), NullUserPointer(), 63 core()->ReadMessage(h, nullptr, nullptr, nullptr, nullptr,
64 NullUserPointer(), NullUserPointer(),
65 MOJO_READ_MESSAGE_FLAG_NONE)); 64 MOJO_READ_MESSAGE_FLAG_NONE));
66 EXPECT_EQ(2u, info.GetReadMessageCallCount()); 65 EXPECT_EQ(2u, info.GetReadMessageCallCount());
67 66
68 EXPECT_EQ(0u, info.GetWriteDataCallCount()); 67 EXPECT_EQ(0u, info.GetWriteDataCallCount());
69 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, 68 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
70 core()->WriteData(h, NullUserPointer(), NullUserPointer(), 69 core()->WriteData(h, nullptr, nullptr, MOJO_WRITE_DATA_FLAG_NONE));
71 MOJO_WRITE_DATA_FLAG_NONE));
72 EXPECT_EQ(1u, info.GetWriteDataCallCount()); 70 EXPECT_EQ(1u, info.GetWriteDataCallCount());
73 71
74 EXPECT_EQ(0u, info.GetBeginWriteDataCallCount()); 72 EXPECT_EQ(0u, info.GetBeginWriteDataCallCount());
75 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, 73 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
76 core()->BeginWriteData(h, NullUserPointer(), NullUserPointer(), 74 core()->BeginWriteData(h, nullptr, nullptr,
77 MOJO_WRITE_DATA_FLAG_NONE)); 75 MOJO_WRITE_DATA_FLAG_NONE));
78 EXPECT_EQ(1u, info.GetBeginWriteDataCallCount()); 76 EXPECT_EQ(1u, info.GetBeginWriteDataCallCount());
79 77
80 EXPECT_EQ(0u, info.GetEndWriteDataCallCount()); 78 EXPECT_EQ(0u, info.GetEndWriteDataCallCount());
81 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndWriteData(h, 0)); 79 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndWriteData(h, 0));
82 EXPECT_EQ(1u, info.GetEndWriteDataCallCount()); 80 EXPECT_EQ(1u, info.GetEndWriteDataCallCount());
83 81
84 EXPECT_EQ(0u, info.GetReadDataCallCount()); 82 EXPECT_EQ(0u, info.GetReadDataCallCount());
85 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, 83 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
86 core()->ReadData(h, NullUserPointer(), NullUserPointer(), 84 core()->ReadData(h, nullptr, nullptr, MOJO_READ_DATA_FLAG_NONE));
87 MOJO_READ_DATA_FLAG_NONE));
88 EXPECT_EQ(1u, info.GetReadDataCallCount()); 85 EXPECT_EQ(1u, info.GetReadDataCallCount());
89 86
90 EXPECT_EQ(0u, info.GetBeginReadDataCallCount()); 87 EXPECT_EQ(0u, info.GetBeginReadDataCallCount());
91 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, 88 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
92 core()->BeginReadData(h, NullUserPointer(), NullUserPointer(), 89 core()->BeginReadData(h, nullptr, nullptr,
93 MOJO_READ_DATA_FLAG_NONE)); 90 MOJO_READ_DATA_FLAG_NONE));
94 EXPECT_EQ(1u, info.GetBeginReadDataCallCount()); 91 EXPECT_EQ(1u, info.GetBeginReadDataCallCount());
95 92
96 EXPECT_EQ(0u, info.GetEndReadDataCallCount()); 93 EXPECT_EQ(0u, info.GetEndReadDataCallCount());
97 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0)); 94 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0));
98 EXPECT_EQ(1u, info.GetEndReadDataCallCount()); 95 EXPECT_EQ(1u, info.GetEndReadDataCallCount());
99 96
100 EXPECT_EQ(0u, info.GetAddAwakableCallCount()); 97 EXPECT_EQ(0u, info.GetAddAwakableCallCount());
101 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 98 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
102 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE, 99 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE,
103 NullUserPointer())); 100 nullptr));
104 EXPECT_EQ(1u, info.GetAddAwakableCallCount()); 101 EXPECT_EQ(1u, info.GetAddAwakableCallCount());
105 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 102 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
106 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0, NullUserPointer())); 103 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0, nullptr));
107 EXPECT_EQ(2u, info.GetAddAwakableCallCount()); 104 EXPECT_EQ(2u, info.GetAddAwakableCallCount());
108 MojoHandleSignalsState hss = kFullMojoHandleSignalsState; 105 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
109 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 106 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
110 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE, 107 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE,
111 MakeUserPointer(&hss))); 108 &hss));
112 EXPECT_EQ(3u, info.GetAddAwakableCallCount()); 109 EXPECT_EQ(3u, info.GetAddAwakableCallCount());
113 EXPECT_EQ(0u, hss.satisfied_signals); 110 EXPECT_EQ(0u, hss.satisfied_signals);
114 EXPECT_EQ(0u, hss.satisfiable_signals); 111 EXPECT_EQ(0u, hss.satisfiable_signals);
115 EXPECT_EQ( 112 EXPECT_EQ(
116 MOJO_RESULT_FAILED_PRECONDITION, 113 MOJO_RESULT_FAILED_PRECONDITION,
117 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, NullUserPointer())); 114 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, nullptr));
118 EXPECT_EQ(4u, info.GetAddAwakableCallCount()); 115 EXPECT_EQ(4u, info.GetAddAwakableCallCount());
119 hss = kFullMojoHandleSignalsState; 116 hss = kFullMojoHandleSignalsState;
120 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 117 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
121 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, 118 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, &hss));
122 MakeUserPointer(&hss)));
123 EXPECT_EQ(5u, info.GetAddAwakableCallCount()); 119 EXPECT_EQ(5u, info.GetAddAwakableCallCount());
124 EXPECT_EQ(0u, hss.satisfied_signals); 120 EXPECT_EQ(0u, hss.satisfied_signals);
125 EXPECT_EQ(0u, hss.satisfiable_signals); 121 EXPECT_EQ(0u, hss.satisfiable_signals);
126 122
127 MojoHandleSignals handle_signals = ~MOJO_HANDLE_SIGNAL_NONE; 123 MojoHandleSignals handle_signals = ~MOJO_HANDLE_SIGNAL_NONE;
128 EXPECT_EQ( 124 EXPECT_EQ(
129 MOJO_RESULT_FAILED_PRECONDITION, 125 MOJO_RESULT_FAILED_PRECONDITION,
130 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1, 126 core()->WaitMany(&h, &handle_signals, 1, MOJO_DEADLINE_INDEFINITE,
131 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), 127 nullptr, nullptr));
132 NullUserPointer()));
133 EXPECT_EQ(6u, info.GetAddAwakableCallCount()); 128 EXPECT_EQ(6u, info.GetAddAwakableCallCount());
134 uint32_t result_index = static_cast<uint32_t>(-1); 129 uint32_t result_index = static_cast<uint32_t>(-1);
135 EXPECT_EQ( 130 EXPECT_EQ(
136 MOJO_RESULT_FAILED_PRECONDITION, 131 MOJO_RESULT_FAILED_PRECONDITION,
137 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1, 132 core()->WaitMany(&h, &handle_signals, 1, MOJO_DEADLINE_INDEFINITE,
138 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index), 133 &result_index, nullptr));
139 NullUserPointer()));
140 EXPECT_EQ(7u, info.GetAddAwakableCallCount()); 134 EXPECT_EQ(7u, info.GetAddAwakableCallCount());
141 EXPECT_EQ(0u, result_index); 135 EXPECT_EQ(0u, result_index);
142 hss = kFullMojoHandleSignalsState; 136 hss = kFullMojoHandleSignalsState;
143 EXPECT_EQ( 137 EXPECT_EQ(
144 MOJO_RESULT_FAILED_PRECONDITION, 138 MOJO_RESULT_FAILED_PRECONDITION,
145 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1, 139 core()->WaitMany(&h, &handle_signals, 1, MOJO_DEADLINE_INDEFINITE,
146 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), 140 nullptr, &hss));
147 MakeUserPointer(&hss)));
148 EXPECT_EQ(8u, info.GetAddAwakableCallCount()); 141 EXPECT_EQ(8u, info.GetAddAwakableCallCount());
149 EXPECT_EQ(0u, hss.satisfied_signals); 142 EXPECT_EQ(0u, hss.satisfied_signals);
150 EXPECT_EQ(0u, hss.satisfiable_signals); 143 EXPECT_EQ(0u, hss.satisfiable_signals);
151 result_index = static_cast<uint32_t>(-1); 144 result_index = static_cast<uint32_t>(-1);
152 hss = kFullMojoHandleSignalsState; 145 hss = kFullMojoHandleSignalsState;
153 EXPECT_EQ( 146 EXPECT_EQ(
154 MOJO_RESULT_FAILED_PRECONDITION, 147 MOJO_RESULT_FAILED_PRECONDITION,
155 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1, 148 core()->WaitMany(&h, &handle_signals, 1, MOJO_DEADLINE_INDEFINITE,
156 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index), 149 &result_index, &hss));
157 MakeUserPointer(&hss)));
158 EXPECT_EQ(9u, info.GetAddAwakableCallCount()); 150 EXPECT_EQ(9u, info.GetAddAwakableCallCount());
159 EXPECT_EQ(0u, result_index); 151 EXPECT_EQ(0u, result_index);
160 EXPECT_EQ(0u, hss.satisfied_signals); 152 EXPECT_EQ(0u, hss.satisfied_signals);
161 EXPECT_EQ(0u, hss.satisfiable_signals); 153 EXPECT_EQ(0u, hss.satisfiable_signals);
162 154
163 EXPECT_EQ(0u, info.GetDtorCallCount()); 155 EXPECT_EQ(0u, info.GetDtorCallCount());
164 EXPECT_EQ(0u, info.GetCloseCallCount()); 156 EXPECT_EQ(0u, info.GetCloseCallCount());
165 EXPECT_EQ(0u, info.GetCancelAllAwakablesCallCount()); 157 EXPECT_EQ(0u, info.GetCancelAllAwakablesCallCount());
166 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); 158 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
167 EXPECT_EQ(1u, info.GetCancelAllAwakablesCallCount()); 159 EXPECT_EQ(1u, info.GetCancelAllAwakablesCallCount());
(...skipping 17 matching lines...) Expand all
185 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); 177 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
186 EXPECT_EQ(1u, info.GetCloseCallCount()); 178 EXPECT_EQ(1u, info.GetCloseCallCount());
187 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h)); 179 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h));
188 EXPECT_EQ(1u, info.GetCloseCallCount()); 180 EXPECT_EQ(1u, info.GetCloseCallCount());
189 } 181 }
190 182
191 // |Wait()|: 183 // |Wait()|:
192 { 184 {
193 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 185 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
194 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE, 186 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE,
195 MOJO_DEADLINE_INDEFINITE, NullUserPointer())); 187 MOJO_DEADLINE_INDEFINITE, nullptr));
196 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 188 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
197 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE, 189 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE,
198 MOJO_DEADLINE_INDEFINITE, NullUserPointer())); 190 MOJO_DEADLINE_INDEFINITE, nullptr));
199 191
200 MojoHandleSignalsState hss = kFullMojoHandleSignalsState; 192 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
201 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 193 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
202 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE, 194 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE,
203 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&hss))); 195 MOJO_DEADLINE_INDEFINITE, &hss));
204 // On invalid argument, it shouldn't modify the handle signals state. 196 // On invalid argument, it shouldn't modify the handle signals state.
205 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals, 197 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
206 hss.satisfied_signals); 198 hss.satisfied_signals);
207 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals, 199 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
208 hss.satisfiable_signals); 200 hss.satisfiable_signals);
209 hss = kFullMojoHandleSignalsState; 201 hss = kFullMojoHandleSignalsState;
210 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 202 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
211 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE, 203 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE,
212 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&hss))); 204 MOJO_DEADLINE_INDEFINITE, &hss));
213 // On invalid argument, it shouldn't modify the handle signals state. 205 // On invalid argument, it shouldn't modify the handle signals state.
214 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals, 206 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
215 hss.satisfied_signals); 207 hss.satisfied_signals);
216 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals, 208 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
217 hss.satisfiable_signals); 209 hss.satisfiable_signals);
218 } 210 }
219 211
220 // |WaitMany()|: 212 // |WaitMany()|:
221 { 213 {
222 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; 214 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
223 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE, 215 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE,
224 ~MOJO_HANDLE_SIGNAL_NONE}; 216 ~MOJO_HANDLE_SIGNAL_NONE};
225 EXPECT_EQ( 217 EXPECT_EQ(
226 MOJO_RESULT_INVALID_ARGUMENT, 218 MOJO_RESULT_INVALID_ARGUMENT,
227 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 0, 219 core()->WaitMany(handles, signals, 0, MOJO_DEADLINE_INDEFINITE,
228 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), 220 nullptr, nullptr));
229 NullUserPointer()));
230 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 221 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
231 core()->WaitMany(NullUserPointer(), MakeUserPointer(signals), 0, 222 core()->WaitMany(nullptr, signals, 0, MOJO_DEADLINE_INDEFINITE,
232 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), 223 nullptr, nullptr));
233 NullUserPointer()));
234 // If |num_handles| is invalid, it should leave |result_index| and 224 // If |num_handles| is invalid, it should leave |result_index| and
235 // |signals_states| alone. 225 // |signals_states| alone.
236 // (We use -1 internally; make sure that doesn't leak.) 226 // (We use -1 internally; make sure that doesn't leak.)
237 uint32_t result_index = 123; 227 uint32_t result_index = 123;
238 MojoHandleSignalsState hss = kFullMojoHandleSignalsState; 228 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
239 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 229 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
240 core()->WaitMany(NullUserPointer(), MakeUserPointer(signals), 0, 230 core()->WaitMany(nullptr, signals, 0, MOJO_DEADLINE_INDEFINITE,
241 MOJO_DEADLINE_INDEFINITE, 231 &result_index, &hss));
242 MakeUserPointer(&result_index),
243 MakeUserPointer(&hss)));
244 EXPECT_EQ(123u, result_index); 232 EXPECT_EQ(123u, result_index);
245 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals, 233 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
246 hss.satisfied_signals); 234 hss.satisfied_signals);
247 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals, 235 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
248 hss.satisfiable_signals); 236 hss.satisfiable_signals);
249 237
250 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 238 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
251 core()->WaitMany(MakeUserPointer(handles), NullUserPointer(), 0, 239 core()->WaitMany(handles, nullptr, 0, MOJO_DEADLINE_INDEFINITE,
252 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), 240 nullptr, nullptr));
253 NullUserPointer()));
254 EXPECT_EQ( 241 EXPECT_EQ(
255 MOJO_RESULT_INVALID_ARGUMENT, 242 MOJO_RESULT_INVALID_ARGUMENT,
256 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 1, 243 core()->WaitMany(handles, signals, 1, MOJO_DEADLINE_INDEFINITE, nullptr,
257 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), 244 nullptr));
258 NullUserPointer()));
259 // But if a handle is bad, then it should set |result_index| but still leave 245 // But if a handle is bad, then it should set |result_index| but still leave
260 // |signals_states| alone. 246 // |signals_states| alone.
261 result_index = static_cast<uint32_t>(-1); 247 result_index = static_cast<uint32_t>(-1);
262 hss = kFullMojoHandleSignalsState; 248 hss = kFullMojoHandleSignalsState;
263 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 249 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
264 core()->WaitMany( 250 core()->WaitMany(
265 MakeUserPointer(handles), MakeUserPointer(signals), 1, 251 handles, signals, 1, MOJO_DEADLINE_INDEFINITE, &result_index,
266 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index), 252 &hss));
267 MakeUserPointer(&hss)));
268 EXPECT_EQ(0u, result_index); 253 EXPECT_EQ(0u, result_index);
269 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals, 254 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
270 hss.satisfied_signals); 255 hss.satisfied_signals);
271 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals, 256 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
272 hss.satisfiable_signals); 257 hss.satisfiable_signals);
273 258
274 MockHandleInfo info[2]; 259 MockHandleInfo info[2];
275 handles[0] = CreateMockHandle(&info[0]); 260 handles[0] = CreateMockHandle(&info[0]);
276 261
277 result_index = static_cast<uint32_t>(-1); 262 result_index = static_cast<uint32_t>(-1);
278 hss = kFullMojoHandleSignalsState; 263 hss = kFullMojoHandleSignalsState;
279 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 264 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
280 core()->WaitMany( 265 core()->WaitMany(
281 MakeUserPointer(handles), MakeUserPointer(signals), 1, 266 handles, signals, 1, MOJO_DEADLINE_INDEFINITE, &result_index,
282 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index), 267 &hss));
283 MakeUserPointer(&hss)));
284 EXPECT_EQ(0u, result_index); 268 EXPECT_EQ(0u, result_index);
285 EXPECT_EQ(0u, hss.satisfied_signals); 269 EXPECT_EQ(0u, hss.satisfied_signals);
286 EXPECT_EQ(0u, hss.satisfiable_signals); 270 EXPECT_EQ(0u, hss.satisfiable_signals);
287 271
288 // On invalid argument, it'll leave |signals_states| alone. 272 // On invalid argument, it'll leave |signals_states| alone.
289 result_index = static_cast<uint32_t>(-1); 273 result_index = static_cast<uint32_t>(-1);
290 hss = kFullMojoHandleSignalsState; 274 hss = kFullMojoHandleSignalsState;
291 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 275 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
292 core()->WaitMany( 276 core()->WaitMany(
293 MakeUserPointer(handles), MakeUserPointer(signals), 2, 277 handles, signals, 2, MOJO_DEADLINE_INDEFINITE, &result_index,
294 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index), 278 &hss));
295 MakeUserPointer(&hss)));
296 EXPECT_EQ(1u, result_index); 279 EXPECT_EQ(1u, result_index);
297 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals, 280 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
298 hss.satisfied_signals); 281 hss.satisfied_signals);
299 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals, 282 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
300 hss.satisfiable_signals); 283 hss.satisfiable_signals);
301 handles[1] = handles[0] + 1; // Invalid handle. 284 handles[1] = handles[0] + 1; // Invalid handle.
302 EXPECT_EQ( 285 EXPECT_EQ(
303 MOJO_RESULT_INVALID_ARGUMENT, 286 MOJO_RESULT_INVALID_ARGUMENT,
304 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 2, 287 core()->WaitMany(handles, signals, 2, MOJO_DEADLINE_INDEFINITE, nullptr,
305 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), 288 nullptr));
306 NullUserPointer()));
307 handles[1] = CreateMockHandle(&info[1]); 289 handles[1] = CreateMockHandle(&info[1]);
308 EXPECT_EQ( 290 EXPECT_EQ(
309 MOJO_RESULT_FAILED_PRECONDITION, 291 MOJO_RESULT_FAILED_PRECONDITION,
310 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 2, 292 core()->WaitMany(handles, signals, 2, MOJO_DEADLINE_INDEFINITE, nullptr,
311 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), 293 nullptr));
312 NullUserPointer()));
313 294
314 // TODO(vtl): Test one where we get "failed precondition" only for the 295 // TODO(vtl): Test one where we get "failed precondition" only for the
315 // second handle (and the first one is valid to wait on). 296 // second handle (and the first one is valid to wait on).
316 297
317 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0])); 298 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0]));
318 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1])); 299 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1]));
319 } 300 }
320 301
321 // |CreateMessagePipe()|: Nothing to check (apart from things that cause 302 // |CreateMessagePipe()|: Nothing to check (apart from things that cause
322 // death). 303 // death).
323 304
324 // |WriteMessage()|: 305 // |WriteMessage()|:
325 // Only check arguments checked by |Core|, namely |handle|, |handles|, and 306 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
326 // |num_handles|. 307 // |num_handles|.
327 { 308 {
328 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 309 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
329 core()->WriteMessage(MOJO_HANDLE_INVALID, NullUserPointer(), 0, 310 core()->WriteMessage(MOJO_HANDLE_INVALID, nullptr, 0,
330 NullUserPointer(), 0, 311 nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
331 MOJO_WRITE_MESSAGE_FLAG_NONE));
332 312
333 MockHandleInfo info; 313 MockHandleInfo info;
334 MojoHandle h = CreateMockHandle(&info); 314 MojoHandle h = CreateMockHandle(&info);
335 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; 315 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
336 316
337 // Huge handle count (implausibly big on some systems -- more than can be 317 // Huge handle count (implausibly big on some systems -- more than can be
338 // stored in a 32-bit address space). 318 // stored in a 32-bit address space).
339 // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or 319 // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or
340 // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or 320 // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or
341 // not. 321 // not.
342 EXPECT_NE( 322 EXPECT_NE(
343 MOJO_RESULT_OK, 323 MOJO_RESULT_OK,
344 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles), 324 core()->WriteMessage(h, nullptr, 0, handles,
345 std::numeric_limits<uint32_t>::max(), 325 std::numeric_limits<uint32_t>::max(),
346 MOJO_WRITE_MESSAGE_FLAG_NONE)); 326 MOJO_WRITE_MESSAGE_FLAG_NONE));
347 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); 327 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
348 328
349 // Huge handle count (plausibly big). 329 // Huge handle count (plausibly big).
350 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, 330 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
351 core()->WriteMessage( 331 core()->WriteMessage(
352 h, NullUserPointer(), 0, MakeUserPointer(handles), 332 h, nullptr, 0, handles,
353 std::numeric_limits<uint32_t>::max() / sizeof(handles[0]), 333 std::numeric_limits<uint32_t>::max() / sizeof(handles[0]),
354 MOJO_WRITE_MESSAGE_FLAG_NONE)); 334 MOJO_WRITE_MESSAGE_FLAG_NONE));
355 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); 335 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
356 336
357 // Invalid handle in |handles|. 337 // Invalid handle in |handles|.
358 EXPECT_EQ( 338 EXPECT_EQ(
359 MOJO_RESULT_INVALID_ARGUMENT, 339 MOJO_RESULT_INVALID_ARGUMENT,
360 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles), 340 core()->WriteMessage(h, nullptr, 0, handles, 1,
361 1, MOJO_WRITE_MESSAGE_FLAG_NONE)); 341 MOJO_WRITE_MESSAGE_FLAG_NONE));
362 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); 342 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
363 343
364 // Two invalid handles in |handles|. 344 // Two invalid handles in |handles|.
365 EXPECT_EQ( 345 EXPECT_EQ(
366 MOJO_RESULT_INVALID_ARGUMENT, 346 MOJO_RESULT_INVALID_ARGUMENT,
367 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles), 347 core()->WriteMessage(h, nullptr, 0, handles, 2,
368 2, MOJO_WRITE_MESSAGE_FLAG_NONE)); 348 MOJO_WRITE_MESSAGE_FLAG_NONE));
369 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); 349 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
370 350
371 // Can't send a handle over itself. 351 // Can't send a handle over itself.
372 handles[0] = h; 352 handles[0] = h;
373 EXPECT_EQ( 353 EXPECT_EQ(
374 MOJO_RESULT_BUSY, 354 MOJO_RESULT_BUSY,
375 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles), 355 core()->WriteMessage(h, nullptr, 0, handles, 1,
376 1, MOJO_WRITE_MESSAGE_FLAG_NONE)); 356 MOJO_WRITE_MESSAGE_FLAG_NONE));
377 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); 357 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
378 358
379 MockHandleInfo info2; 359 MockHandleInfo info2;
380 MojoHandle h2 = CreateMockHandle(&info2); 360 MojoHandle h2 = CreateMockHandle(&info2);
381 361
382 // This is "okay", but |MockDispatcher| doesn't implement it. 362 // This is "okay", but |MockDispatcher| doesn't implement it.
383 handles[0] = h2; 363 handles[0] = h2;
384 EXPECT_EQ( 364 EXPECT_EQ(
385 MOJO_RESULT_UNIMPLEMENTED, 365 MOJO_RESULT_UNIMPLEMENTED,
386 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles), 366 core()->WriteMessage(h, nullptr, 0, handles, 1,
387 1, MOJO_WRITE_MESSAGE_FLAG_NONE)); 367 MOJO_WRITE_MESSAGE_FLAG_NONE));
388 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); 368 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
389 369
390 // One of the |handles| is still invalid. 370 // One of the |handles| is still invalid.
391 EXPECT_EQ( 371 EXPECT_EQ(
392 MOJO_RESULT_INVALID_ARGUMENT, 372 MOJO_RESULT_INVALID_ARGUMENT,
393 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles), 373 core()->WriteMessage(h, nullptr, 0, handles, 2,
394 2, MOJO_WRITE_MESSAGE_FLAG_NONE)); 374 MOJO_WRITE_MESSAGE_FLAG_NONE));
395 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); 375 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
396 376
397 // One of the |handles| is the same as |handle|. 377 // One of the |handles| is the same as |handle|.
398 handles[1] = h; 378 handles[1] = h;
399 EXPECT_EQ( 379 EXPECT_EQ(
400 MOJO_RESULT_BUSY, 380 MOJO_RESULT_BUSY,
401 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles), 381 core()->WriteMessage(h, nullptr, 0, handles, 2,
402 2, MOJO_WRITE_MESSAGE_FLAG_NONE)); 382 MOJO_WRITE_MESSAGE_FLAG_NONE));
403 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); 383 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
404 384
405 // Can't send a handle twice in the same message. 385 // Can't send a handle twice in the same message.
406 handles[1] = h2; 386 handles[1] = h2;
407 EXPECT_EQ( 387 EXPECT_EQ(
408 MOJO_RESULT_BUSY, 388 MOJO_RESULT_BUSY,
409 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles), 389 core()->WriteMessage(h, nullptr, 0, handles, 2,
410 2, MOJO_WRITE_MESSAGE_FLAG_NONE)); 390 MOJO_WRITE_MESSAGE_FLAG_NONE));
411 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); 391 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
412 392
413 // Note: Since we never successfully sent anything with it, |h2| should 393 // Note: Since we never successfully sent anything with it, |h2| should
414 // still be valid. 394 // still be valid.
415 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h2)); 395 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h2));
416 396
417 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); 397 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
418 } 398 }
419 399
420 // |ReadMessage()|: 400 // |ReadMessage()|:
421 // Only check arguments checked by |Core|, namely |handle|, |handles|, and 401 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
422 // |num_handles|. 402 // |num_handles|.
423 { 403 {
424 EXPECT_EQ( 404 EXPECT_EQ(
425 MOJO_RESULT_INVALID_ARGUMENT, 405 MOJO_RESULT_INVALID_ARGUMENT,
426 core()->ReadMessage(MOJO_HANDLE_INVALID, NullUserPointer(), 406 core()->ReadMessage(MOJO_HANDLE_INVALID, nullptr, nullptr, nullptr,
427 NullUserPointer(), NullUserPointer(), 407 nullptr, MOJO_READ_MESSAGE_FLAG_NONE));
428 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
429 408
430 MockHandleInfo info; 409 MockHandleInfo info;
431 MojoHandle h = CreateMockHandle(&info); 410 MojoHandle h = CreateMockHandle(&info);
432 411
433 // Okay. 412 // Okay.
434 uint32_t handle_count = 0; 413 uint32_t handle_count = 0;
435 EXPECT_EQ(MOJO_RESULT_OK, 414 EXPECT_EQ(MOJO_RESULT_OK,
436 core()->ReadMessage( 415 core()->ReadMessage(
437 h, NullUserPointer(), NullUserPointer(), NullUserPointer(), 416 h, nullptr, nullptr, nullptr, &handle_count,
438 MakeUserPointer(&handle_count), MOJO_READ_MESSAGE_FLAG_NONE)); 417 MOJO_READ_MESSAGE_FLAG_NONE));
439 // Checked by |Core|, shouldn't go through to the dispatcher. 418 // Checked by |Core|, shouldn't go through to the dispatcher.
440 EXPECT_EQ(1u, info.GetReadMessageCallCount()); 419 EXPECT_EQ(1u, info.GetReadMessageCallCount());
441 420
442 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); 421 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
443 } 422 }
444 } 423 }
445 424
446 // These test invalid arguments that should cause death if we're being paranoid 425 // These test invalid arguments that should cause death if we're being paranoid
447 // about checking arguments (which we would want to do if, e.g., we were in a 426 // about checking arguments (which we would want to do if, e.g., we were in a
448 // true "kernel" situation, but we might not want to do otherwise for 427 // true "kernel" situation, but we might not want to do otherwise for
449 // performance reasons). Probably blatant errors like passing in null pointers 428 // performance reasons). Probably blatant errors like passing in null pointers
450 // (for required pointer arguments) will still cause death, but perhaps not 429 // (for required pointer arguments) will still cause death, but perhaps not
451 // predictably. 430 // predictably.
452 TEST_F(CoreTest, InvalidArgumentsDeath) { 431 TEST_F(CoreTest, InvalidArgumentsDeath) {
453 const char kMemoryCheckFailedRegex[] = "Check failed"; 432 const char kMemoryCheckFailedRegex[] = "Check failed";
454 433
455 // |WaitMany()|: 434 // |WaitMany()|:
456 { 435 {
457 MojoHandle handle = MOJO_HANDLE_INVALID; 436 MojoHandle handle = MOJO_HANDLE_INVALID;
458 MojoHandleSignals signals = ~MOJO_HANDLE_SIGNAL_NONE; 437 MojoHandleSignals signals = ~MOJO_HANDLE_SIGNAL_NONE;
459 EXPECT_DEATH_IF_SUPPORTED( 438 EXPECT_DEATH_IF_SUPPORTED(
460 core()->WaitMany(NullUserPointer(), MakeUserPointer(&signals), 1, 439 core()->WaitMany(nullptr, &signals, 1, MOJO_DEADLINE_INDEFINITE,
461 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), 440 nullptr, nullptr),
462 NullUserPointer()),
463 kMemoryCheckFailedRegex); 441 kMemoryCheckFailedRegex);
464 EXPECT_DEATH_IF_SUPPORTED( 442 EXPECT_DEATH_IF_SUPPORTED(
465 core()->WaitMany(MakeUserPointer(&handle), NullUserPointer(), 1, 443 core()->WaitMany(&handle, nullptr, 1, MOJO_DEADLINE_INDEFINITE, nullptr,
466 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), 444 nullptr),
467 NullUserPointer()),
468 kMemoryCheckFailedRegex); 445 kMemoryCheckFailedRegex);
469 // TODO(vtl): |result_index| and |signals_states| are optional. Test them 446 // TODO(vtl): |result_index| and |signals_states| are optional. Test them
470 // with non-null invalid pointers? 447 // with non-null invalid pointers?
471 } 448 }
472 449
473 // |CreateMessagePipe()|: 450 // |CreateMessagePipe()|:
474 { 451 {
475 MojoHandle h; 452 MojoHandle h;
476 EXPECT_DEATH_IF_SUPPORTED( 453 EXPECT_DEATH_IF_SUPPORTED(
477 core()->CreateMessagePipe(NullUserPointer(), NullUserPointer(), 454 core()->CreateMessagePipe(nullptr, nullptr, nullptr),
478 NullUserPointer()),
479 kMemoryCheckFailedRegex); 455 kMemoryCheckFailedRegex);
480 EXPECT_DEATH_IF_SUPPORTED( 456 EXPECT_DEATH_IF_SUPPORTED(
481 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h), 457 core()->CreateMessagePipe(nullptr, &h, nullptr),
482 NullUserPointer()),
483 kMemoryCheckFailedRegex); 458 kMemoryCheckFailedRegex);
484 EXPECT_DEATH_IF_SUPPORTED( 459 EXPECT_DEATH_IF_SUPPORTED(
485 core()->CreateMessagePipe(NullUserPointer(), NullUserPointer(), 460 core()->CreateMessagePipe(nullptr, nullptr, &h),
486 MakeUserPointer(&h)),
487 kMemoryCheckFailedRegex); 461 kMemoryCheckFailedRegex);
488 } 462 }
489 463
490 // |WriteMessage()|: 464 // |WriteMessage()|:
491 // Only check arguments checked by |Core|, namely |handle|, |handles|, and 465 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
492 // |num_handles|. 466 // |num_handles|.
493 { 467 {
494 MockHandleInfo info; 468 MockHandleInfo info;
495 MojoHandle h = CreateMockHandle(&info); 469 MojoHandle h = CreateMockHandle(&info);
496 470
497 // Null |handles| with nonzero |num_handles|. 471 // Null |handles| with nonzero |num_handles|.
498 EXPECT_DEATH_IF_SUPPORTED( 472 EXPECT_DEATH_IF_SUPPORTED(
499 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 1, 473 core()->WriteMessage(h, nullptr, 0, nullptr, 1,
500 MOJO_WRITE_MESSAGE_FLAG_NONE), 474 MOJO_WRITE_MESSAGE_FLAG_NONE),
501 kMemoryCheckFailedRegex); 475 kMemoryCheckFailedRegex);
502 476
503 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); 477 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
504 } 478 }
505 479
506 // |ReadMessage()|: 480 // |ReadMessage()|:
507 // Only check arguments checked by |Core|, namely |handle|, |handles|, and 481 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
508 // |num_handles|. 482 // |num_handles|.
509 { 483 {
510 MockHandleInfo info; 484 MockHandleInfo info;
511 MojoHandle h = CreateMockHandle(&info); 485 MojoHandle h = CreateMockHandle(&info);
512 486
513 uint32_t handle_count = 1; 487 uint32_t handle_count = 1;
514 EXPECT_DEATH_IF_SUPPORTED( 488 EXPECT_DEATH_IF_SUPPORTED(
515 core()->ReadMessage(h, NullUserPointer(), NullUserPointer(), 489 core()->ReadMessage(h, nullptr, nullptr, nullptr, &handle_count,
516 NullUserPointer(), MakeUserPointer(&handle_count),
517 MOJO_READ_MESSAGE_FLAG_NONE), 490 MOJO_READ_MESSAGE_FLAG_NONE),
518 kMemoryCheckFailedRegex); 491 kMemoryCheckFailedRegex);
519 492
520 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); 493 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
521 } 494 }
522 } 495 }
523 496
524 // TODO(vtl): test |Wait()| and |WaitMany()| properly 497 // TODO(vtl): test |Wait()| and |WaitMany()| properly
525 // - including |WaitMany()| with the same handle more than once (with 498 // - including |WaitMany()| with the same handle more than once (with
526 // same/different signals) 499 // same/different signals)
527 500
528 TEST_F(CoreTest, MessagePipe) { 501 TEST_F(CoreTest, MessagePipe) {
529 MojoHandle h[2]; 502 MojoHandle h[2];
530 MojoHandleSignalsState hss[2]; 503 MojoHandleSignalsState hss[2];
531 uint32_t result_index; 504 uint32_t result_index;
532 505
533 EXPECT_EQ(MOJO_RESULT_OK, 506 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateMessagePipe(nullptr, &h[0], &h[1]));
534 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h[0]),
535 MakeUserPointer(&h[1])));
536 // Should get two distinct, valid handles. 507 // Should get two distinct, valid handles.
537 EXPECT_NE(h[0], MOJO_HANDLE_INVALID); 508 EXPECT_NE(h[0], MOJO_HANDLE_INVALID);
538 EXPECT_NE(h[1], MOJO_HANDLE_INVALID); 509 EXPECT_NE(h[1], MOJO_HANDLE_INVALID);
539 EXPECT_NE(h[0], h[1]); 510 EXPECT_NE(h[0], h[1]);
540 511
541 // Neither should be readable. 512 // Neither should be readable.
542 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, 513 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
543 MOJO_HANDLE_SIGNAL_READABLE}; 514 MOJO_HANDLE_SIGNAL_READABLE};
544 result_index = static_cast<uint32_t>(-1); 515 result_index = static_cast<uint32_t>(-1);
545 hss[0] = kEmptyMojoHandleSignalsState; 516 hss[0] = kEmptyMojoHandleSignalsState;
546 hss[1] = kEmptyMojoHandleSignalsState; 517 hss[1] = kEmptyMojoHandleSignalsState;
547 EXPECT_EQ( 518 EXPECT_EQ(
548 MOJO_RESULT_DEADLINE_EXCEEDED, 519 MOJO_RESULT_DEADLINE_EXCEEDED,
549 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 0, 520 core()->WaitMany(h, signals, 2, 0, &result_index, hss));
550 MakeUserPointer(&result_index), MakeUserPointer(hss)));
551 EXPECT_EQ(static_cast<uint32_t>(-1), result_index); 521 EXPECT_EQ(static_cast<uint32_t>(-1), result_index);
552 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals); 522 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
553 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals); 523 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals);
554 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals); 524 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
555 EXPECT_EQ(kAllSignals, hss[1].satisfiable_signals); 525 EXPECT_EQ(kAllSignals, hss[1].satisfiable_signals);
556 526
557 // Try to read anyway. 527 // Try to read anyway.
558 char buffer[1] = {'a'}; 528 char buffer[1] = {'a'};
559 uint32_t buffer_size = 1; 529 uint32_t buffer_size = 1;
560 EXPECT_EQ( 530 EXPECT_EQ(
561 MOJO_RESULT_SHOULD_WAIT, 531 MOJO_RESULT_SHOULD_WAIT,
562 core()->ReadMessage(h[0], UserPointer<void>(buffer), 532 core()->ReadMessage(h[0], buffer, &buffer_size, nullptr, nullptr,
563 MakeUserPointer(&buffer_size), NullUserPointer(), 533 MOJO_READ_MESSAGE_FLAG_NONE));
564 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
565 // Check that it left its inputs alone. 534 // Check that it left its inputs alone.
566 EXPECT_EQ('a', buffer[0]); 535 EXPECT_EQ('a', buffer[0]);
567 EXPECT_EQ(1u, buffer_size); 536 EXPECT_EQ(1u, buffer_size);
568 537
569 // Both should be writable. 538 // Both should be writable.
570 hss[0] = kEmptyMojoHandleSignalsState; 539 hss[0] = kEmptyMojoHandleSignalsState;
571 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[0], MOJO_HANDLE_SIGNAL_WRITABLE, 540 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[0], MOJO_HANDLE_SIGNAL_WRITABLE,
572 1000000000, MakeUserPointer(&hss[0]))); 541 1000000000, &hss[0]));
573 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals); 542 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
574 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals); 543 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals);
575 hss[0] = kEmptyMojoHandleSignalsState; 544 hss[0] = kEmptyMojoHandleSignalsState;
576 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 545 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE,
577 1000000000, MakeUserPointer(&hss[0]))); 546 1000000000, &hss[0]));
578 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals); 547 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
579 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals); 548 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals);
580 549
581 // Also check that |h[1]| is writable using |WaitMany()|. 550 // Also check that |h[1]| is writable using |WaitMany()|.
582 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; 551 signals[0] = MOJO_HANDLE_SIGNAL_READABLE;
583 signals[1] = MOJO_HANDLE_SIGNAL_WRITABLE; 552 signals[1] = MOJO_HANDLE_SIGNAL_WRITABLE;
584 result_index = static_cast<uint32_t>(-1); 553 result_index = static_cast<uint32_t>(-1);
585 hss[0] = kEmptyMojoHandleSignalsState; 554 hss[0] = kEmptyMojoHandleSignalsState;
586 hss[1] = kEmptyMojoHandleSignalsState; 555 hss[1] = kEmptyMojoHandleSignalsState;
587 EXPECT_EQ( 556 EXPECT_EQ(
588 MOJO_RESULT_OK, 557 MOJO_RESULT_OK,
589 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 558 core()->WaitMany(h, signals, 2, MOJO_DEADLINE_INDEFINITE, &result_index,
590 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index), 559 hss));
591 MakeUserPointer(hss)));
592 EXPECT_EQ(1u, result_index); 560 EXPECT_EQ(1u, result_index);
593 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals); 561 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
594 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals); 562 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals);
595 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals); 563 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
596 EXPECT_EQ(kAllSignals, hss[1].satisfiable_signals); 564 EXPECT_EQ(kAllSignals, hss[1].satisfiable_signals);
597 565
598 // Write to |h[1]|. 566 // Write to |h[1]|.
599 buffer[0] = 'b'; 567 buffer[0] = 'b';
600 EXPECT_EQ( 568 EXPECT_EQ(
601 MOJO_RESULT_OK, 569 MOJO_RESULT_OK,
602 core()->WriteMessage(h[1], UserPointer<const void>(buffer), 1, 570 core()->WriteMessage(h[1], buffer, 1, nullptr, 0,
603 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); 571 MOJO_WRITE_MESSAGE_FLAG_NONE));
604 572
605 // Check that |h[0]| is now readable. 573 // Check that |h[0]| is now readable.
606 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; 574 signals[0] = MOJO_HANDLE_SIGNAL_READABLE;
607 signals[1] = MOJO_HANDLE_SIGNAL_READABLE; 575 signals[1] = MOJO_HANDLE_SIGNAL_READABLE;
608 result_index = static_cast<uint32_t>(-1); 576 result_index = static_cast<uint32_t>(-1);
609 hss[0] = kEmptyMojoHandleSignalsState; 577 hss[0] = kEmptyMojoHandleSignalsState;
610 hss[1] = kEmptyMojoHandleSignalsState; 578 hss[1] = kEmptyMojoHandleSignalsState;
611 EXPECT_EQ( 579 EXPECT_EQ(
612 MOJO_RESULT_OK, 580 MOJO_RESULT_OK,
613 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 581 core()->WaitMany(h, signals, 2, MOJO_DEADLINE_INDEFINITE, &result_index,
614 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index), 582 hss));
615 MakeUserPointer(hss)));
616 EXPECT_EQ(0u, result_index); 583 EXPECT_EQ(0u, result_index);
617 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 584 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
618 hss[0].satisfied_signals); 585 hss[0].satisfied_signals);
619 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals); 586 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals);
620 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals); 587 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
621 EXPECT_EQ(kAllSignals, hss[1].satisfiable_signals); 588 EXPECT_EQ(kAllSignals, hss[1].satisfiable_signals);
622 589
623 // Read from |h[0]|. 590 // Read from |h[0]|.
624 // First, get only the size. 591 // First, get only the size.
625 buffer_size = 0; 592 buffer_size = 0;
626 EXPECT_EQ( 593 EXPECT_EQ(
627 MOJO_RESULT_RESOURCE_EXHAUSTED, 594 MOJO_RESULT_RESOURCE_EXHAUSTED,
628 core()->ReadMessage(h[0], NullUserPointer(), 595 core()->ReadMessage(h[0], nullptr, &buffer_size, nullptr, nullptr,
629 MakeUserPointer(&buffer_size), NullUserPointer(), 596 MOJO_READ_MESSAGE_FLAG_NONE));
630 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
631 EXPECT_EQ(1u, buffer_size); 597 EXPECT_EQ(1u, buffer_size);
632 // Then actually read it. 598 // Then actually read it.
633 buffer[0] = 'c'; 599 buffer[0] = 'c';
634 buffer_size = 1; 600 buffer_size = 1;
635 EXPECT_EQ( 601 EXPECT_EQ(
636 MOJO_RESULT_OK, 602 MOJO_RESULT_OK,
637 core()->ReadMessage(h[0], UserPointer<void>(buffer), 603 core()->ReadMessage(h[0], buffer, &buffer_size, nullptr, nullptr,
638 MakeUserPointer(&buffer_size), NullUserPointer(), 604 MOJO_READ_MESSAGE_FLAG_NONE));
639 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
640 EXPECT_EQ('b', buffer[0]); 605 EXPECT_EQ('b', buffer[0]);
641 EXPECT_EQ(1u, buffer_size); 606 EXPECT_EQ(1u, buffer_size);
642 607
643 // |h[0]| should no longer be readable. 608 // |h[0]| should no longer be readable.
644 hss[0] = kEmptyMojoHandleSignalsState; 609 hss[0] = kEmptyMojoHandleSignalsState;
645 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, 610 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
646 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_READABLE, 0, 611 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_READABLE, 0, &hss[0]));
647 MakeUserPointer(&hss[0])));
648 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals); 612 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
649 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals); 613 EXPECT_EQ(kAllSignals, hss[0].satisfiable_signals);
650 614
651 // Write to |h[0]|. 615 // Write to |h[0]|.
652 buffer[0] = 'd'; 616 buffer[0] = 'd';
653 EXPECT_EQ( 617 EXPECT_EQ(
654 MOJO_RESULT_OK, 618 MOJO_RESULT_OK,
655 core()->WriteMessage(h[0], UserPointer<const void>(buffer), 1, 619 core()->WriteMessage(h[0], buffer, 1, nullptr, 0,
656 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); 620 MOJO_WRITE_MESSAGE_FLAG_NONE));
657 621
658 // Close |h[0]|. 622 // Close |h[0]|.
659 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0])); 623 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0]));
660 624
625 // Wait for |h[1]| to learn about the other end's closure.
626 EXPECT_EQ(MOJO_RESULT_OK,
627 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1000000000,
628 &hss[0]));
629
661 // Check that |h[1]| is no longer writable (and will never be). 630 // Check that |h[1]| is no longer writable (and will never be).
662 hss[0] = kEmptyMojoHandleSignalsState; 631 hss[0] = kEmptyMojoHandleSignalsState;
663 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 632 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
664 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000, 633 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000,
665 MakeUserPointer(&hss[0]))); 634 &hss[0]));
666 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 635 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
667 hss[0].satisfied_signals); 636 hss[0].satisfied_signals);
668 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 637 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
669 hss[0].satisfiable_signals); 638 hss[0].satisfiable_signals);
670 639
671 // Check that |h[1]| is still readable (for the moment). 640 // Check that |h[1]| is still readable (for the moment).
672 hss[0] = kEmptyMojoHandleSignalsState; 641 hss[0] = kEmptyMojoHandleSignalsState;
673 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 642 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE,
674 1000000000, MakeUserPointer(&hss[0]))); 643 1000000000, &hss[0]));
675 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 644 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
676 hss[0].satisfied_signals); 645 hss[0].satisfied_signals);
677 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 646 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
678 hss[0].satisfiable_signals); 647 hss[0].satisfiable_signals);
679 648
680 // Discard a message from |h[1]|. 649 // Discard a message from |h[1]|.
681 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, 650 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
682 core()->ReadMessage(h[1], NullUserPointer(), NullUserPointer(), 651 core()->ReadMessage(h[1], nullptr, nullptr, nullptr, nullptr,
683 NullUserPointer(), NullUserPointer(),
684 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); 652 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD));
685 653
686 // |h[1]| is no longer readable (and will never be). 654 // |h[1]| is no longer readable (and will never be).
687 hss[0] = kFullMojoHandleSignalsState; 655 hss[0] = kFullMojoHandleSignalsState;
688 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 656 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
689 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, 657 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
690 MakeUserPointer(&hss[0]))); 658 &hss[0]));
691 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[0].satisfied_signals); 659 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[0].satisfied_signals);
692 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[0].satisfiable_signals); 660 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[0].satisfiable_signals);
693 661
694 // Try writing to |h[1]|. 662 // Try writing to |h[1]|.
695 buffer[0] = 'e'; 663 buffer[0] = 'e';
696 EXPECT_EQ( 664 EXPECT_EQ(
697 MOJO_RESULT_FAILED_PRECONDITION, 665 MOJO_RESULT_FAILED_PRECONDITION,
698 core()->WriteMessage(h[1], UserPointer<const void>(buffer), 1, 666 core()->WriteMessage(h[1], buffer, 1, nullptr, 0,
699 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); 667 MOJO_WRITE_MESSAGE_FLAG_NONE));
700 668
701 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1])); 669 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1]));
702 } 670 }
703 671
704 // Tests passing a message pipe handle. 672 // Tests passing a message pipe handle.
705 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) { 673 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
706 const char kHello[] = "hello"; 674 const char kHello[] = "hello";
707 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); 675 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
708 const char kWorld[] = "world!!!"; 676 const char kWorld[] = "world!!!";
709 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); 677 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
710 char buffer[100]; 678 char buffer[100];
711 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 679 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
712 uint32_t num_bytes; 680 uint32_t num_bytes;
713 MojoHandle handles[10]; 681 MojoHandle handles[10];
714 uint32_t num_handles; 682 uint32_t num_handles;
715 MojoHandleSignalsState hss; 683 MojoHandleSignalsState hss;
716 MojoHandle h_received; 684 MojoHandle h_received;
717 685
718 MojoHandle h_passing[2]; 686 MojoHandle h_passing[2];
719 EXPECT_EQ(MOJO_RESULT_OK, 687 EXPECT_EQ(MOJO_RESULT_OK,
720 core()->CreateMessagePipe(NullUserPointer(), 688 core()->CreateMessagePipe(nullptr, &h_passing[0], &h_passing[1]));
721 MakeUserPointer(&h_passing[0]),
722 MakeUserPointer(&h_passing[1])));
723 689
724 // Make sure that |h_passing[]| work properly. 690 // Make sure that |h_passing[]| work properly.
725 EXPECT_EQ(MOJO_RESULT_OK, 691 EXPECT_EQ(MOJO_RESULT_OK,
726 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), 692 core()->WriteMessage(h_passing[0], kHello, kHelloSize, nullptr, 0,
727 kHelloSize, NullUserPointer(), 0,
728 MOJO_WRITE_MESSAGE_FLAG_NONE)); 693 MOJO_WRITE_MESSAGE_FLAG_NONE));
729 hss = kEmptyMojoHandleSignalsState; 694 hss = kEmptyMojoHandleSignalsState;
730 EXPECT_EQ(MOJO_RESULT_OK, 695 EXPECT_EQ(MOJO_RESULT_OK,
731 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, 696 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
732 MakeUserPointer(&hss))); 697 &hss));
733 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 698 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
734 hss.satisfied_signals); 699 hss.satisfied_signals);
735 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); 700 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
736 num_bytes = kBufferSize; 701 num_bytes = kBufferSize;
737 num_handles = MOJO_ARRAYSIZE(handles); 702 num_handles = MOJO_ARRAYSIZE(handles);
738 EXPECT_EQ(MOJO_RESULT_OK, 703 EXPECT_EQ(MOJO_RESULT_OK,
739 core()->ReadMessage( 704 core()->ReadMessage(
740 h_passing[1], UserPointer<void>(buffer), 705 h_passing[1], buffer, &num_bytes, handles, &num_handles,
741 MakeUserPointer(&num_bytes), MakeUserPointer(handles), 706 MOJO_READ_MESSAGE_FLAG_NONE));
742 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
743 EXPECT_EQ(kHelloSize, num_bytes); 707 EXPECT_EQ(kHelloSize, num_bytes);
744 EXPECT_STREQ(kHello, buffer); 708 EXPECT_STREQ(kHello, buffer);
745 EXPECT_EQ(0u, num_handles); 709 EXPECT_EQ(0u, num_handles);
746 710
747 // Make sure that you can't pass either of the message pipe's handles over 711 // Make sure that you can't pass either of the message pipe's handles over
748 // itself. 712 // itself.
749 EXPECT_EQ(MOJO_RESULT_BUSY, 713 EXPECT_EQ(MOJO_RESULT_BUSY,
750 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), 714 core()->WriteMessage(h_passing[0], kHello, kHelloSize,
751 kHelloSize, MakeUserPointer(&h_passing[0]), 1, 715 &h_passing[0], 1,
752 MOJO_WRITE_MESSAGE_FLAG_NONE)); 716 MOJO_WRITE_MESSAGE_FLAG_NONE));
753 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 717 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
754 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), 718 core()->WriteMessage(h_passing[0], kHello, kHelloSize,
755 kHelloSize, MakeUserPointer(&h_passing[1]), 1, 719 &h_passing[1], 1,
756 MOJO_WRITE_MESSAGE_FLAG_NONE)); 720 MOJO_WRITE_MESSAGE_FLAG_NONE));
757 721
758 MojoHandle h_passed[2]; 722 MojoHandle h_passed[2];
759 EXPECT_EQ(MOJO_RESULT_OK, 723 EXPECT_EQ(MOJO_RESULT_OK,
760 core()->CreateMessagePipe(NullUserPointer(), 724 core()->CreateMessagePipe(nullptr, &h_passed[0], &h_passed[1]));
761 MakeUserPointer(&h_passed[0]),
762 MakeUserPointer(&h_passed[1])));
763 725
764 // Make sure that |h_passed[]| work properly. 726 // Make sure that |h_passed[]| work properly.
765 EXPECT_EQ(MOJO_RESULT_OK, 727 EXPECT_EQ(MOJO_RESULT_OK,
766 core()->WriteMessage(h_passed[0], UserPointer<const void>(kHello), 728 core()->WriteMessage(h_passed[0], kHello, kHelloSize, nullptr, 0,
767 kHelloSize, NullUserPointer(), 0,
768 MOJO_WRITE_MESSAGE_FLAG_NONE)); 729 MOJO_WRITE_MESSAGE_FLAG_NONE));
769 hss = kEmptyMojoHandleSignalsState; 730 hss = kEmptyMojoHandleSignalsState;
770 EXPECT_EQ(MOJO_RESULT_OK, 731 EXPECT_EQ(MOJO_RESULT_OK,
771 core()->Wait(h_passed[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, 732 core()->Wait(h_passed[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
772 MakeUserPointer(&hss))); 733 &hss));
773 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 734 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
774 hss.satisfied_signals); 735 hss.satisfied_signals);
775 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); 736 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
776 num_bytes = kBufferSize; 737 num_bytes = kBufferSize;
777 num_handles = MOJO_ARRAYSIZE(handles); 738 num_handles = MOJO_ARRAYSIZE(handles);
778 EXPECT_EQ(MOJO_RESULT_OK, 739 EXPECT_EQ(MOJO_RESULT_OK,
779 core()->ReadMessage( 740 core()->ReadMessage(
780 h_passed[1], UserPointer<void>(buffer), 741 h_passed[1], buffer, &num_bytes, handles, &num_handles,
781 MakeUserPointer(&num_bytes), MakeUserPointer(handles), 742 MOJO_READ_MESSAGE_FLAG_NONE));
782 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
783 EXPECT_EQ(kHelloSize, num_bytes); 743 EXPECT_EQ(kHelloSize, num_bytes);
784 EXPECT_STREQ(kHello, buffer); 744 EXPECT_STREQ(kHello, buffer);
785 EXPECT_EQ(0u, num_handles); 745 EXPECT_EQ(0u, num_handles);
786 746
787 // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|. 747 // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|.
788 EXPECT_EQ(MOJO_RESULT_OK, 748 EXPECT_EQ(MOJO_RESULT_OK,
789 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld), 749 core()->WriteMessage(h_passing[0], kWorld, kWorldSize,
790 kWorldSize, MakeUserPointer(&h_passed[1]), 1, 750 &h_passed[1], 1,
791 MOJO_WRITE_MESSAGE_FLAG_NONE)); 751 MOJO_WRITE_MESSAGE_FLAG_NONE));
792 hss = kEmptyMojoHandleSignalsState; 752 hss = kEmptyMojoHandleSignalsState;
793 EXPECT_EQ(MOJO_RESULT_OK, 753 EXPECT_EQ(MOJO_RESULT_OK,
794 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, 754 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
795 MakeUserPointer(&hss))); 755 &hss));
796 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 756 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
797 hss.satisfied_signals); 757 hss.satisfied_signals);
798 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); 758 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
799 num_bytes = kBufferSize; 759 num_bytes = kBufferSize;
800 num_handles = MOJO_ARRAYSIZE(handles); 760 num_handles = MOJO_ARRAYSIZE(handles);
801 EXPECT_EQ(MOJO_RESULT_OK, 761 EXPECT_EQ(MOJO_RESULT_OK,
802 core()->ReadMessage( 762 core()->ReadMessage(
803 h_passing[1], UserPointer<void>(buffer), 763 h_passing[1], buffer, &num_bytes, handles, &num_handles,
804 MakeUserPointer(&num_bytes), MakeUserPointer(handles), 764 MOJO_READ_MESSAGE_FLAG_NONE));
805 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
806 EXPECT_EQ(kWorldSize, num_bytes); 765 EXPECT_EQ(kWorldSize, num_bytes);
807 EXPECT_STREQ(kWorld, buffer); 766 EXPECT_STREQ(kWorld, buffer);
808 EXPECT_EQ(1u, num_handles); 767 EXPECT_EQ(1u, num_handles);
809 h_received = handles[0]; 768 h_received = handles[0];
810 EXPECT_NE(h_received, MOJO_HANDLE_INVALID); 769 EXPECT_NE(h_received, MOJO_HANDLE_INVALID);
811 EXPECT_NE(h_received, h_passing[0]); 770 EXPECT_NE(h_received, h_passing[0]);
812 EXPECT_NE(h_received, h_passing[1]); 771 EXPECT_NE(h_received, h_passing[1]);
813 EXPECT_NE(h_received, h_passed[0]); 772 EXPECT_NE(h_received, h_passed[0]);
814 773
815 // Note: We rely on the Mojo system not re-using handle values very often. 774 // Note: We rely on the Mojo system not re-using handle values very often.
816 EXPECT_NE(h_received, h_passed[1]); 775 EXPECT_NE(h_received, h_passed[1]);
817 776
818 // |h_passed[1]| should no longer be valid; check that trying to close it 777 // |h_passed[1]| should no longer be valid; check that trying to close it
819 // fails. See above note. 778 // fails. See above note.
820 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1])); 779 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1]));
821 780
822 // Write to |h_passed[0]|. Should receive on |h_received|. 781 // Write to |h_passed[0]|. Should receive on |h_received|.
823 EXPECT_EQ(MOJO_RESULT_OK, 782 EXPECT_EQ(MOJO_RESULT_OK,
824 core()->WriteMessage(h_passed[0], UserPointer<const void>(kHello), 783 core()->WriteMessage(h_passed[0], kHello, kHelloSize, nullptr, 0,
825 kHelloSize, NullUserPointer(), 0,
826 MOJO_WRITE_MESSAGE_FLAG_NONE)); 784 MOJO_WRITE_MESSAGE_FLAG_NONE));
827 hss = kEmptyMojoHandleSignalsState; 785 hss = kEmptyMojoHandleSignalsState;
828 EXPECT_EQ(MOJO_RESULT_OK, 786 EXPECT_EQ(MOJO_RESULT_OK,
829 core()->Wait(h_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, 787 core()->Wait(h_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
830 MakeUserPointer(&hss))); 788 &hss));
831 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 789 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
832 hss.satisfied_signals); 790 hss.satisfied_signals);
833 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); 791 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
834 num_bytes = kBufferSize; 792 num_bytes = kBufferSize;
835 num_handles = MOJO_ARRAYSIZE(handles); 793 num_handles = MOJO_ARRAYSIZE(handles);
836 EXPECT_EQ(MOJO_RESULT_OK, 794 EXPECT_EQ(MOJO_RESULT_OK,
837 core()->ReadMessage( 795 core()->ReadMessage(
838 h_received, UserPointer<void>(buffer), 796 h_received, buffer, &num_bytes, handles, &num_handles,
839 MakeUserPointer(&num_bytes), MakeUserPointer(handles), 797 MOJO_READ_MESSAGE_FLAG_NONE));
840 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
841 EXPECT_EQ(kHelloSize, num_bytes); 798 EXPECT_EQ(kHelloSize, num_bytes);
842 EXPECT_STREQ(kHello, buffer); 799 EXPECT_STREQ(kHello, buffer);
843 EXPECT_EQ(0u, num_handles); 800 EXPECT_EQ(0u, num_handles);
844 801
845 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); 802 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0]));
846 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); 803 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1]));
847 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0])); 804 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0]));
848 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received)); 805 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received));
849 } 806 }
850 807
851 TEST_F(CoreTest, DataPipe) { 808 TEST_F(CoreTest, DataPipe) {
852 MojoHandle ph, ch; // p is for producer and c is for consumer. 809 MojoHandle ph, ch; // p is for producer and c is for consumer.
853 MojoHandleSignalsState hss; 810 MojoHandleSignalsState hss;
854 811
855 EXPECT_EQ(MOJO_RESULT_OK, 812 EXPECT_EQ(MOJO_RESULT_OK,
856 core()->CreateDataPipe(NullUserPointer(), MakeUserPointer(&ph), 813 core()->CreateDataPipe(nullptr, &ph, &ch));
857 MakeUserPointer(&ch)));
858 // Should get two distinct, valid handles. 814 // Should get two distinct, valid handles.
859 EXPECT_NE(ph, MOJO_HANDLE_INVALID); 815 EXPECT_NE(ph, MOJO_HANDLE_INVALID);
860 EXPECT_NE(ch, MOJO_HANDLE_INVALID); 816 EXPECT_NE(ch, MOJO_HANDLE_INVALID);
861 EXPECT_NE(ph, ch); 817 EXPECT_NE(ph, ch);
862 818
863 // Producer should be never-readable, but already writable. 819 // Producer should be never-readable, but already writable.
864 hss = kEmptyMojoHandleSignalsState; 820 hss = kEmptyMojoHandleSignalsState;
865 EXPECT_EQ( 821 EXPECT_EQ(
866 MOJO_RESULT_FAILED_PRECONDITION, 822 MOJO_RESULT_FAILED_PRECONDITION,
867 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); 823 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
868 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 824 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
869 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 825 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
870 hss.satisfiable_signals); 826 hss.satisfiable_signals);
871 hss = kEmptyMojoHandleSignalsState; 827 hss = kEmptyMojoHandleSignalsState;
872 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0, 828 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0,
873 MakeUserPointer(&hss))); 829 &hss));
874 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 830 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
875 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 831 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
876 hss.satisfiable_signals); 832 hss.satisfiable_signals);
877 833
878 // Consumer should be never-writable, and not yet readable. 834 // Consumer should be never-writable, and not yet readable.
879 hss = kFullMojoHandleSignalsState; 835 hss = kFullMojoHandleSignalsState;
880 EXPECT_EQ( 836 EXPECT_EQ(
881 MOJO_RESULT_FAILED_PRECONDITION, 837 MOJO_RESULT_FAILED_PRECONDITION,
882 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0, MakeUserPointer(&hss))); 838 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss));
883 EXPECT_EQ(0u, hss.satisfied_signals); 839 EXPECT_EQ(0u, hss.satisfied_signals);
884 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 840 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
885 hss.satisfiable_signals); 841 hss.satisfiable_signals);
886 hss = kFullMojoHandleSignalsState; 842 hss = kFullMojoHandleSignalsState;
887 EXPECT_EQ( 843 EXPECT_EQ(
888 MOJO_RESULT_DEADLINE_EXCEEDED, 844 MOJO_RESULT_DEADLINE_EXCEEDED,
889 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); 845 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
890 EXPECT_EQ(0u, hss.satisfied_signals); 846 EXPECT_EQ(0u, hss.satisfied_signals);
891 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 847 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
892 hss.satisfiable_signals); 848 hss.satisfiable_signals);
893 849
894 // Write. 850 // Write.
895 signed char elements[2] = {'A', 'B'}; 851 signed char elements[2] = {'A', 'B'};
896 uint32_t num_bytes = 2u; 852 uint32_t num_bytes = 2u;
897 EXPECT_EQ(MOJO_RESULT_OK, 853 EXPECT_EQ(MOJO_RESULT_OK,
898 core()->WriteData(ph, UserPointer<const void>(elements), 854 core()->WriteData(ph, elements, &num_bytes,
899 MakeUserPointer(&num_bytes),
900 MOJO_WRITE_DATA_FLAG_NONE)); 855 MOJO_WRITE_DATA_FLAG_NONE));
901 EXPECT_EQ(2u, num_bytes); 856 EXPECT_EQ(2u, num_bytes);
902 857
858 // Wait for the data to arrive to the consumer.
859 EXPECT_EQ(MOJO_RESULT_OK,
860 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, &hss));
861
903 // Consumer should now be readable. 862 // Consumer should now be readable.
904 hss = kEmptyMojoHandleSignalsState; 863 hss = kEmptyMojoHandleSignalsState;
905 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, 864 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0,
906 MakeUserPointer(&hss))); 865 &hss));
907 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 866 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
908 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 867 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
909 hss.satisfiable_signals); 868 hss.satisfiable_signals);
910 869
911 // Peek one character. 870 // Peek one character.
912 elements[0] = -1; 871 elements[0] = -1;
913 elements[1] = -1; 872 elements[1] = -1;
914 num_bytes = 1u; 873 num_bytes = 1u;
915 EXPECT_EQ(MOJO_RESULT_OK, 874 EXPECT_EQ(MOJO_RESULT_OK,
916 core()->ReadData( 875 core()->ReadData(
917 ch, UserPointer<void>(elements), MakeUserPointer(&num_bytes), 876 ch, elements, &num_bytes,
918 MOJO_READ_DATA_FLAG_NONE | MOJO_READ_DATA_FLAG_PEEK)); 877 MOJO_READ_DATA_FLAG_NONE | MOJO_READ_DATA_FLAG_PEEK));
919 EXPECT_EQ('A', elements[0]); 878 EXPECT_EQ('A', elements[0]);
920 EXPECT_EQ(-1, elements[1]); 879 EXPECT_EQ(-1, elements[1]);
921 880
922 // Read one character. 881 // Read one character.
923 elements[0] = -1; 882 elements[0] = -1;
924 elements[1] = -1; 883 elements[1] = -1;
925 num_bytes = 1u; 884 num_bytes = 1u;
926 EXPECT_EQ(MOJO_RESULT_OK, core()->ReadData(ch, UserPointer<void>(elements), 885 EXPECT_EQ(MOJO_RESULT_OK, core()->ReadData(ch, elements, &num_bytes,
927 MakeUserPointer(&num_bytes),
928 MOJO_READ_DATA_FLAG_NONE)); 886 MOJO_READ_DATA_FLAG_NONE));
929 EXPECT_EQ('A', elements[0]); 887 EXPECT_EQ('A', elements[0]);
930 EXPECT_EQ(-1, elements[1]); 888 EXPECT_EQ(-1, elements[1]);
931 889
932 // Two-phase write. 890 // Two-phase write.
933 void* write_ptr = nullptr; 891 void* write_ptr = nullptr;
934 num_bytes = 0u; 892 num_bytes = 0u;
935 ASSERT_EQ(MOJO_RESULT_OK, 893 ASSERT_EQ(MOJO_RESULT_OK,
936 core()->BeginWriteData(ph, MakeUserPointer(&write_ptr), 894 core()->BeginWriteData(ph, &write_ptr, &num_bytes,
937 MakeUserPointer(&num_bytes),
938 MOJO_WRITE_DATA_FLAG_NONE)); 895 MOJO_WRITE_DATA_FLAG_NONE));
939 // We count on the default options providing a decent buffer size. 896 // We count on the default options providing a decent buffer size.
940 ASSERT_GE(num_bytes, 3u); 897 ASSERT_GE(num_bytes, 3u);
941 898
942 // Trying to do a normal write during a two-phase write should fail. 899 // Trying to do a normal write during a two-phase write should fail.
943 elements[0] = 'X'; 900 elements[0] = 'X';
944 num_bytes = 1u; 901 num_bytes = 1u;
945 EXPECT_EQ(MOJO_RESULT_BUSY, 902 EXPECT_EQ(MOJO_RESULT_BUSY,
946 core()->WriteData(ph, UserPointer<const void>(elements), 903 core()->WriteData(ph, elements, &num_bytes,
947 MakeUserPointer(&num_bytes),
948 MOJO_WRITE_DATA_FLAG_NONE)); 904 MOJO_WRITE_DATA_FLAG_NONE));
949 905
950 // Actually write the data, and complete it now. 906 // Actually write the data, and complete it now.
951 static_cast<char*>(write_ptr)[0] = 'C'; 907 static_cast<char*>(write_ptr)[0] = 'C';
952 static_cast<char*>(write_ptr)[1] = 'D'; 908 static_cast<char*>(write_ptr)[1] = 'D';
953 static_cast<char*>(write_ptr)[2] = 'E'; 909 static_cast<char*>(write_ptr)[2] = 'E';
954 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u)); 910 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u));
955 911
912 // Wait for the data to arrive to the consumer.
913 EXPECT_EQ(MOJO_RESULT_OK,
914 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, &hss));
915
956 // Query how much data we have. 916 // Query how much data we have.
957 num_bytes = 0; 917 num_bytes = 0;
958 EXPECT_EQ(MOJO_RESULT_OK, 918 EXPECT_EQ(MOJO_RESULT_OK,
959 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), 919 core()->ReadData(ch, nullptr, &num_bytes,
960 MOJO_READ_DATA_FLAG_QUERY)); 920 MOJO_READ_DATA_FLAG_QUERY));
961 EXPECT_EQ(4u, num_bytes); 921 EXPECT_GE(num_bytes, 1u);
962 922
963 // Try to query with peek. Should fail. 923 // Try to query with peek. Should fail.
964 num_bytes = 0; 924 num_bytes = 0;
965 EXPECT_EQ( 925 EXPECT_EQ(
966 MOJO_RESULT_INVALID_ARGUMENT, 926 MOJO_RESULT_INVALID_ARGUMENT,
967 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), 927 core()->ReadData(ch, nullptr, &num_bytes,
968 MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK)); 928 MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK));
969 EXPECT_EQ(0u, num_bytes); 929 EXPECT_EQ(0u, num_bytes);
970 930
971 // Try to discard ten characters, in all-or-none mode. Should fail. 931 // Try to discard ten characters, in all-or-none mode. Should fail.
972 num_bytes = 10; 932 num_bytes = 10;
973 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, 933 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
974 core()->ReadData( 934 core()->ReadData(
975 ch, NullUserPointer(), MakeUserPointer(&num_bytes), 935 ch, nullptr, &num_bytes,
976 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE)); 936 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
977 937
978 // Try to discard two characters, in peek mode. Should fail. 938 // Try to discard two characters, in peek mode. Should fail.
979 num_bytes = 2; 939 num_bytes = 2;
980 EXPECT_EQ( 940 EXPECT_EQ(
981 MOJO_RESULT_INVALID_ARGUMENT, 941 MOJO_RESULT_INVALID_ARGUMENT,
982 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), 942 core()->ReadData(ch, nullptr, &num_bytes,
983 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK)); 943 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK));
984 944
985 // Discard two characters. 945 // Discard a character.
986 num_bytes = 2; 946 num_bytes = 1;
987 EXPECT_EQ(MOJO_RESULT_OK, 947 EXPECT_EQ(MOJO_RESULT_OK,
988 core()->ReadData( 948 core()->ReadData(
989 ch, NullUserPointer(), MakeUserPointer(&num_bytes), 949 ch, nullptr, &num_bytes,
990 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE)); 950 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
991 951
992 // Try a two-phase read of the remaining two bytes with peek. Should fail. 952 // Ensure the 3 bytes were read.
953 EXPECT_EQ(MOJO_RESULT_OK,
954 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, &hss));
955
956 // Try a two-phase read of the remaining three bytes with peek. Should fail.
993 const void* read_ptr = nullptr; 957 const void* read_ptr = nullptr;
994 num_bytes = 2; 958 num_bytes = 3;
995 ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 959 ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
996 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), 960 core()->BeginReadData(ch, &read_ptr, &num_bytes,
997 MakeUserPointer(&num_bytes),
998 MOJO_READ_DATA_FLAG_PEEK)); 961 MOJO_READ_DATA_FLAG_PEEK));
999 962
1000 // Read the remaining two characters, in two-phase mode (all-or-none). 963 // Read the remaining two characters, in two-phase mode (all-or-none).
1001 num_bytes = 2; 964 num_bytes = 3;
1002 ASSERT_EQ(MOJO_RESULT_OK, 965 ASSERT_EQ(MOJO_RESULT_OK,
1003 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), 966 core()->BeginReadData(ch, &read_ptr, &num_bytes,
1004 MakeUserPointer(&num_bytes),
1005 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); 967 MOJO_READ_DATA_FLAG_ALL_OR_NONE));
1006 // Note: Count on still being able to do the contiguous read here. 968 // Note: Count on still being able to do the contiguous read here.
1007 ASSERT_EQ(2u, num_bytes); 969 ASSERT_EQ(3u, num_bytes);
1008 970
1009 // Discarding right now should fail. 971 // Discarding right now should fail.
1010 num_bytes = 1; 972 num_bytes = 1;
1011 EXPECT_EQ(MOJO_RESULT_BUSY, 973 EXPECT_EQ(MOJO_RESULT_BUSY,
1012 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), 974 core()->ReadData(ch, nullptr, &num_bytes,
1013 MOJO_READ_DATA_FLAG_DISCARD)); 975 MOJO_READ_DATA_FLAG_DISCARD));
1014 976
1015 // Actually check our data and end the two-phase read. 977 // Actually check our data and end the two-phase read.
1016 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[0]); 978 EXPECT_EQ('C', static_cast<const char*>(read_ptr)[0]);
1017 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[1]); 979 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[1]);
1018 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u)); 980 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[2]);
981 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 3u));
1019 982
1020 // Consumer should now be no longer readable. 983 // Consumer should now be no longer readable.
1021 hss = kFullMojoHandleSignalsState; 984 hss = kFullMojoHandleSignalsState;
1022 EXPECT_EQ( 985 EXPECT_EQ(
1023 MOJO_RESULT_DEADLINE_EXCEEDED, 986 MOJO_RESULT_DEADLINE_EXCEEDED,
1024 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); 987 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
1025 EXPECT_EQ(0u, hss.satisfied_signals); 988 EXPECT_EQ(0u, hss.satisfied_signals);
1026 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 989 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1027 hss.satisfiable_signals); 990 hss.satisfiable_signals);
1028 991
1029 // TODO(vtl): More. 992 // TODO(vtl): More.
1030 993
1031 // Close the producer. 994 // Close the producer.
1032 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); 995 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
1033 996
997 // Wait for this to get to the consumer.
998 EXPECT_EQ(MOJO_RESULT_OK,
999 core()->Wait(ch, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1000000000, &hss));
1000
1034 // The consumer should now be never-readable. 1001 // The consumer should now be never-readable.
1035 hss = kFullMojoHandleSignalsState; 1002 hss = kFullMojoHandleSignalsState;
1036 EXPECT_EQ( 1003 EXPECT_EQ(
1037 MOJO_RESULT_FAILED_PRECONDITION, 1004 MOJO_RESULT_FAILED_PRECONDITION,
1038 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); 1005 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss));
1039 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 1006 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
1040 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 1007 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
1041 1008
1042 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); 1009 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
1043 } 1010 }
1044 1011
1045 // Tests passing data pipe producer and consumer handles. 1012 // Tests passing data pipe producer and consumer handles.
1046 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) { 1013 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
1047 const char kHello[] = "hello"; 1014 const char kHello[] = "hello";
1048 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); 1015 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
1049 const char kWorld[] = "world!!!"; 1016 const char kWorld[] = "world!!!";
1050 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); 1017 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
1051 char buffer[100]; 1018 char buffer[100];
1052 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 1019 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
1053 uint32_t num_bytes; 1020 uint32_t num_bytes;
1054 MojoHandle handles[10]; 1021 MojoHandle handles[10];
1055 uint32_t num_handles; 1022 uint32_t num_handles;
1056 MojoHandleSignalsState hss; 1023 MojoHandleSignalsState hss;
1057 1024
1058 MojoHandle h_passing[2]; 1025 MojoHandle h_passing[2];
1059 EXPECT_EQ(MOJO_RESULT_OK, 1026 EXPECT_EQ(MOJO_RESULT_OK,
1060 core()->CreateMessagePipe(NullUserPointer(), 1027 core()->CreateMessagePipe(nullptr, &h_passing[0], &h_passing[1]));
1061 MakeUserPointer(&h_passing[0]),
1062 MakeUserPointer(&h_passing[1])));
1063 1028
1064 MojoHandle ph, ch; 1029 MojoHandle ph, ch;
1065 EXPECT_EQ(MOJO_RESULT_OK, 1030 EXPECT_EQ(MOJO_RESULT_OK,
1066 core()->CreateDataPipe(NullUserPointer(), MakeUserPointer(&ph), 1031 core()->CreateDataPipe(nullptr, &ph, &ch));
1067 MakeUserPointer(&ch)));
1068 1032
1069 // Send |ch| from |h_passing[0]| to |h_passing[1]|. 1033 // Send |ch| from |h_passing[0]| to |h_passing[1]|.
1070 EXPECT_EQ(MOJO_RESULT_OK, 1034 EXPECT_EQ(MOJO_RESULT_OK,
1071 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), 1035 core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ch, 1,
1072 kHelloSize, MakeUserPointer(&ch), 1,
1073 MOJO_WRITE_MESSAGE_FLAG_NONE)); 1036 MOJO_WRITE_MESSAGE_FLAG_NONE));
1074 hss = kEmptyMojoHandleSignalsState; 1037 hss = kEmptyMojoHandleSignalsState;
1075 EXPECT_EQ(MOJO_RESULT_OK, 1038 EXPECT_EQ(MOJO_RESULT_OK,
1076 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, 1039 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
1077 MakeUserPointer(&hss))); 1040 &hss));
1078 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1041 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1079 hss.satisfied_signals); 1042 hss.satisfied_signals);
1080 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); 1043 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
1081 num_bytes = kBufferSize; 1044 num_bytes = kBufferSize;
1082 num_handles = MOJO_ARRAYSIZE(handles); 1045 num_handles = MOJO_ARRAYSIZE(handles);
1083 EXPECT_EQ(MOJO_RESULT_OK, 1046 EXPECT_EQ(MOJO_RESULT_OK,
1084 core()->ReadMessage( 1047 core()->ReadMessage(
1085 h_passing[1], UserPointer<void>(buffer), 1048 h_passing[1], buffer, &num_bytes, handles, &num_handles,
1086 MakeUserPointer(&num_bytes), MakeUserPointer(handles), 1049 MOJO_READ_MESSAGE_FLAG_NONE));
1087 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
1088 EXPECT_EQ(kHelloSize, num_bytes); 1050 EXPECT_EQ(kHelloSize, num_bytes);
1089 EXPECT_STREQ(kHello, buffer); 1051 EXPECT_STREQ(kHello, buffer);
1090 EXPECT_EQ(1u, num_handles); 1052 EXPECT_EQ(1u, num_handles);
1091 MojoHandle ch_received = handles[0]; 1053 MojoHandle ch_received = handles[0];
1092 EXPECT_NE(ch_received, MOJO_HANDLE_INVALID); 1054 EXPECT_NE(ch_received, MOJO_HANDLE_INVALID);
1093 EXPECT_NE(ch_received, h_passing[0]); 1055 EXPECT_NE(ch_received, h_passing[0]);
1094 EXPECT_NE(ch_received, h_passing[1]); 1056 EXPECT_NE(ch_received, h_passing[1]);
1095 EXPECT_NE(ch_received, ph); 1057 EXPECT_NE(ch_received, ph);
1096 1058
1097 // Note: We rely on the Mojo system not re-using handle values very often. 1059 // Note: We rely on the Mojo system not re-using handle values very often.
1098 EXPECT_NE(ch_received, ch); 1060 EXPECT_NE(ch_received, ch);
1099 1061
1100 // |ch| should no longer be valid; check that trying to close it fails. See 1062 // |ch| should no longer be valid; check that trying to close it fails. See
1101 // above note. 1063 // above note.
1102 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch)); 1064 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch));
1103 1065
1104 // Write to |ph|. Should receive on |ch_received|. 1066 // Write to |ph|. Should receive on |ch_received|.
1105 num_bytes = kWorldSize; 1067 num_bytes = kWorldSize;
1106 EXPECT_EQ(MOJO_RESULT_OK, 1068 EXPECT_EQ(MOJO_RESULT_OK,
1107 core()->WriteData(ph, UserPointer<const void>(kWorld), 1069 core()->WriteData(ph, kWorld, &num_bytes,
1108 MakeUserPointer(&num_bytes),
1109 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); 1070 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
1110 hss = kEmptyMojoHandleSignalsState; 1071 hss = kEmptyMojoHandleSignalsState;
1111 EXPECT_EQ(MOJO_RESULT_OK, 1072 EXPECT_EQ(MOJO_RESULT_OK,
1112 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, 1073 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
1113 MakeUserPointer(&hss))); 1074 &hss));
1114 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 1075 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
1115 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1076 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1116 hss.satisfiable_signals); 1077 hss.satisfiable_signals);
1117 num_bytes = kBufferSize; 1078 num_bytes = kBufferSize;
1118 EXPECT_EQ(MOJO_RESULT_OK, 1079 EXPECT_EQ(MOJO_RESULT_OK,
1119 core()->ReadData(ch_received, UserPointer<void>(buffer), 1080 core()->ReadData(ch_received, buffer, &num_bytes,
1120 MakeUserPointer(&num_bytes),
1121 MOJO_READ_MESSAGE_FLAG_NONE)); 1081 MOJO_READ_MESSAGE_FLAG_NONE));
1122 EXPECT_EQ(kWorldSize, num_bytes); 1082 EXPECT_EQ(kWorldSize, num_bytes);
1123 EXPECT_STREQ(kWorld, buffer); 1083 EXPECT_STREQ(kWorld, buffer);
1124 1084
1125 // Now pass |ph| in the same direction. 1085 // Now pass |ph| in the same direction.
1126 EXPECT_EQ(MOJO_RESULT_OK, 1086 EXPECT_EQ(MOJO_RESULT_OK,
1127 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld), 1087 core()->WriteMessage(h_passing[0], kWorld, kWorldSize, &ph, 1,
1128 kWorldSize, MakeUserPointer(&ph), 1,
1129 MOJO_WRITE_MESSAGE_FLAG_NONE)); 1088 MOJO_WRITE_MESSAGE_FLAG_NONE));
1130 hss = kEmptyMojoHandleSignalsState; 1089 hss = kEmptyMojoHandleSignalsState;
1131 EXPECT_EQ(MOJO_RESULT_OK, 1090 EXPECT_EQ(MOJO_RESULT_OK,
1132 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, 1091 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
1133 MakeUserPointer(&hss))); 1092 &hss));
1134 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1093 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1135 hss.satisfied_signals); 1094 hss.satisfied_signals);
1136 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); 1095 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
1137 num_bytes = kBufferSize; 1096 num_bytes = kBufferSize;
1138 num_handles = MOJO_ARRAYSIZE(handles); 1097 num_handles = MOJO_ARRAYSIZE(handles);
1139 EXPECT_EQ(MOJO_RESULT_OK, 1098 EXPECT_EQ(MOJO_RESULT_OK,
1140 core()->ReadMessage( 1099 core()->ReadMessage(
1141 h_passing[1], UserPointer<void>(buffer), 1100 h_passing[1], buffer, &num_bytes, handles, &num_handles,
1142 MakeUserPointer(&num_bytes), MakeUserPointer(handles), 1101 MOJO_READ_MESSAGE_FLAG_NONE));
1143 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
1144 EXPECT_EQ(kWorldSize, num_bytes); 1102 EXPECT_EQ(kWorldSize, num_bytes);
1145 EXPECT_STREQ(kWorld, buffer); 1103 EXPECT_STREQ(kWorld, buffer);
1146 EXPECT_EQ(1u, num_handles); 1104 EXPECT_EQ(1u, num_handles);
1147 MojoHandle ph_received = handles[0]; 1105 MojoHandle ph_received = handles[0];
1148 EXPECT_NE(ph_received, MOJO_HANDLE_INVALID); 1106 EXPECT_NE(ph_received, MOJO_HANDLE_INVALID);
1149 EXPECT_NE(ph_received, h_passing[0]); 1107 EXPECT_NE(ph_received, h_passing[0]);
1150 EXPECT_NE(ph_received, h_passing[1]); 1108 EXPECT_NE(ph_received, h_passing[1]);
1151 EXPECT_NE(ph_received, ch_received); 1109 EXPECT_NE(ph_received, ch_received);
1152 1110
1153 // Again, rely on the Mojo system not re-using handle values very often. 1111 // Again, rely on the Mojo system not re-using handle values very often.
1154 EXPECT_NE(ph_received, ph); 1112 EXPECT_NE(ph_received, ph);
1155 1113
1156 // |ph| should no longer be valid; check that trying to close it fails. See 1114 // |ph| should no longer be valid; check that trying to close it fails. See
1157 // above note. 1115 // above note.
1158 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph)); 1116 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph));
1159 1117
1160 // Write to |ph_received|. Should receive on |ch_received|. 1118 // Write to |ph_received|. Should receive on |ch_received|.
1161 num_bytes = kHelloSize; 1119 num_bytes = kHelloSize;
1162 EXPECT_EQ(MOJO_RESULT_OK, 1120 EXPECT_EQ(MOJO_RESULT_OK,
1163 core()->WriteData(ph_received, UserPointer<const void>(kHello), 1121 core()->WriteData(ph_received, kHello, &num_bytes,
1164 MakeUserPointer(&num_bytes),
1165 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); 1122 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
1166 hss = kEmptyMojoHandleSignalsState; 1123 hss = kEmptyMojoHandleSignalsState;
1167 EXPECT_EQ(MOJO_RESULT_OK, 1124 EXPECT_EQ(MOJO_RESULT_OK,
1168 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, 1125 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
1169 MakeUserPointer(&hss))); 1126 &hss));
1170 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 1127 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
1171 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1128 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1172 hss.satisfiable_signals); 1129 hss.satisfiable_signals);
1173 num_bytes = kBufferSize; 1130 num_bytes = kBufferSize;
1174 EXPECT_EQ(MOJO_RESULT_OK, 1131 EXPECT_EQ(MOJO_RESULT_OK,
1175 core()->ReadData(ch_received, UserPointer<void>(buffer), 1132 core()->ReadData(ch_received, buffer, &num_bytes,
1176 MakeUserPointer(&num_bytes),
1177 MOJO_READ_MESSAGE_FLAG_NONE)); 1133 MOJO_READ_MESSAGE_FLAG_NONE));
1178 EXPECT_EQ(kHelloSize, num_bytes); 1134 EXPECT_EQ(kHelloSize, num_bytes);
1179 EXPECT_STREQ(kHello, buffer); 1135 EXPECT_STREQ(kHello, buffer);
1180 1136
1181 ph = ph_received; 1137 ph = ph_received;
1182 ph_received = MOJO_HANDLE_INVALID; 1138 ph_received = MOJO_HANDLE_INVALID;
1183 ch = ch_received; 1139 ch = ch_received;
1184 ch_received = MOJO_HANDLE_INVALID; 1140 ch_received = MOJO_HANDLE_INVALID;
1185 1141
1186 // Make sure that |ph| can't be sent if it's in a two-phase write. 1142 // Make sure that |ph| can't be sent if it's in a two-phase write.
1187 void* write_ptr = nullptr; 1143 void* write_ptr = nullptr;
1188 num_bytes = 0; 1144 num_bytes = 0;
1189 ASSERT_EQ(MOJO_RESULT_OK, 1145 ASSERT_EQ(MOJO_RESULT_OK,
1190 core()->BeginWriteData(ph, MakeUserPointer(&write_ptr), 1146 core()->BeginWriteData(ph, &write_ptr, &num_bytes,
1191 MakeUserPointer(&num_bytes),
1192 MOJO_WRITE_DATA_FLAG_NONE)); 1147 MOJO_WRITE_DATA_FLAG_NONE));
1193 ASSERT_GE(num_bytes, 1u); 1148 ASSERT_GE(num_bytes, 1u);
1194 EXPECT_EQ(MOJO_RESULT_BUSY, 1149 EXPECT_EQ(MOJO_RESULT_BUSY,
1195 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), 1150 core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ph, 1,
1196 kHelloSize, MakeUserPointer(&ph), 1,
1197 MOJO_WRITE_MESSAGE_FLAG_NONE)); 1151 MOJO_WRITE_MESSAGE_FLAG_NONE));
1198 1152
1199 // But |ch| can, even if |ph| is in a two-phase write. 1153 // But |ch| can, even if |ph| is in a two-phase write.
1200 EXPECT_EQ(MOJO_RESULT_OK, 1154 EXPECT_EQ(MOJO_RESULT_OK,
1201 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), 1155 core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ch, 1,
1202 kHelloSize, MakeUserPointer(&ch), 1,
1203 MOJO_WRITE_MESSAGE_FLAG_NONE)); 1156 MOJO_WRITE_MESSAGE_FLAG_NONE));
1204 ch = MOJO_HANDLE_INVALID; 1157 ch = MOJO_HANDLE_INVALID;
1205 EXPECT_EQ(MOJO_RESULT_OK, 1158 EXPECT_EQ(MOJO_RESULT_OK,
1206 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, 1159 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
1207 NullUserPointer())); 1160 nullptr));
1208 num_bytes = kBufferSize; 1161 num_bytes = kBufferSize;
1209 num_handles = MOJO_ARRAYSIZE(handles); 1162 num_handles = MOJO_ARRAYSIZE(handles);
1210 EXPECT_EQ(MOJO_RESULT_OK, 1163 EXPECT_EQ(MOJO_RESULT_OK,
1211 core()->ReadMessage( 1164 core()->ReadMessage(
1212 h_passing[1], UserPointer<void>(buffer), 1165 h_passing[1], buffer, &num_bytes, handles, &num_handles,
1213 MakeUserPointer(&num_bytes), MakeUserPointer(handles), 1166 MOJO_READ_MESSAGE_FLAG_NONE));
1214 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
1215 EXPECT_EQ(kHelloSize, num_bytes); 1167 EXPECT_EQ(kHelloSize, num_bytes);
1216 EXPECT_STREQ(kHello, buffer); 1168 EXPECT_STREQ(kHello, buffer);
1217 EXPECT_EQ(1u, num_handles); 1169 EXPECT_EQ(1u, num_handles);
1218 ch = handles[0]; 1170 ch = handles[0];
1219 EXPECT_NE(ch, MOJO_HANDLE_INVALID); 1171 EXPECT_NE(ch, MOJO_HANDLE_INVALID);
1220 1172
1221 // Complete the two-phase write. 1173 // Complete the two-phase write.
1222 static_cast<char*>(write_ptr)[0] = 'x'; 1174 static_cast<char*>(write_ptr)[0] = 'x';
1223 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1)); 1175 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1));
1224 1176
1225 // Wait for |ch| to be readable. 1177 // Wait for |ch| to be readable.
1226 hss = kEmptyMojoHandleSignalsState; 1178 hss = kEmptyMojoHandleSignalsState;
1227 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1179 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE,
1228 1000000000, MakeUserPointer(&hss))); 1180 1000000000, &hss));
1229 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 1181 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
1230 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1182 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1231 hss.satisfiable_signals); 1183 hss.satisfiable_signals);
1232 1184
1233 // Make sure that |ch| can't be sent if it's in a two-phase read. 1185 // Make sure that |ch| can't be sent if it's in a two-phase read.
1234 const void* read_ptr = nullptr; 1186 const void* read_ptr = nullptr;
1235 num_bytes = 1; 1187 num_bytes = 1;
1236 ASSERT_EQ(MOJO_RESULT_OK, 1188 ASSERT_EQ(MOJO_RESULT_OK,
1237 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), 1189 core()->BeginReadData(ch, &read_ptr, &num_bytes,
1238 MakeUserPointer(&num_bytes),
1239 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); 1190 MOJO_READ_DATA_FLAG_ALL_OR_NONE));
1240 EXPECT_EQ(MOJO_RESULT_BUSY, 1191 EXPECT_EQ(MOJO_RESULT_BUSY,
1241 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello), 1192 core()->WriteMessage(h_passing[0], kHello, kHelloSize, &ch, 1,
1242 kHelloSize, MakeUserPointer(&ch), 1,
1243 MOJO_WRITE_MESSAGE_FLAG_NONE)); 1193 MOJO_WRITE_MESSAGE_FLAG_NONE));
1244 1194
1245 // But |ph| can, even if |ch| is in a two-phase read. 1195 // But |ph| can, even if |ch| is in a two-phase read.
1246 EXPECT_EQ(MOJO_RESULT_OK, 1196 EXPECT_EQ(MOJO_RESULT_OK,
1247 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld), 1197 core()->WriteMessage(h_passing[0], kWorld, kWorldSize, &ph, 1,
1248 kWorldSize, MakeUserPointer(&ph), 1,
1249 MOJO_WRITE_MESSAGE_FLAG_NONE)); 1198 MOJO_WRITE_MESSAGE_FLAG_NONE));
1250 ph = MOJO_HANDLE_INVALID; 1199 ph = MOJO_HANDLE_INVALID;
1251 hss = kEmptyMojoHandleSignalsState; 1200 hss = kEmptyMojoHandleSignalsState;
1252 EXPECT_EQ(MOJO_RESULT_OK, 1201 EXPECT_EQ(MOJO_RESULT_OK,
1253 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000, 1202 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
1254 MakeUserPointer(&hss))); 1203 &hss));
1255 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, 1204 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1256 hss.satisfied_signals); 1205 hss.satisfied_signals);
1257 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); 1206 EXPECT_EQ(kAllSignals, hss.satisfiable_signals);
1258 num_bytes = kBufferSize; 1207 num_bytes = kBufferSize;
1259 num_handles = MOJO_ARRAYSIZE(handles); 1208 num_handles = MOJO_ARRAYSIZE(handles);
1260 EXPECT_EQ(MOJO_RESULT_OK, 1209 EXPECT_EQ(MOJO_RESULT_OK,
1261 core()->ReadMessage( 1210 core()->ReadMessage(
1262 h_passing[1], UserPointer<void>(buffer), 1211 h_passing[1], buffer, &num_bytes, handles, &num_handles,
1263 MakeUserPointer(&num_bytes), MakeUserPointer(handles), 1212 MOJO_READ_MESSAGE_FLAG_NONE));
1264 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
1265 EXPECT_EQ(kWorldSize, num_bytes); 1213 EXPECT_EQ(kWorldSize, num_bytes);
1266 EXPECT_STREQ(kWorld, buffer); 1214 EXPECT_STREQ(kWorld, buffer);
1267 EXPECT_EQ(1u, num_handles); 1215 EXPECT_EQ(1u, num_handles);
1268 ph = handles[0]; 1216 ph = handles[0];
1269 EXPECT_NE(ph, MOJO_HANDLE_INVALID); 1217 EXPECT_NE(ph, MOJO_HANDLE_INVALID);
1270 1218
1271 // Complete the two-phase read. 1219 // Complete the two-phase read.
1272 EXPECT_EQ('x', static_cast<const char*>(read_ptr)[0]); 1220 EXPECT_EQ('x', static_cast<const char*>(read_ptr)[0]);
1273 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 1)); 1221 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 1));
1274 1222
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1306 1254
1307 EXPECT_FALSE(info.GetAddedAwakableAt(0)->Awake(MOJO_RESULT_BUSY, 0)); 1255 EXPECT_FALSE(info.GetAddedAwakableAt(0)->Awake(MOJO_RESULT_BUSY, 0));
1308 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result); 1256 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result);
1309 1257
1310 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); 1258 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
1311 } 1259 }
1312 1260
1313 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. 1261 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|.
1314 1262
1315 } // namespace 1263 } // namespace
1316 } // namespace system 1264 } // namespace edk
1317 } // namespace mojo 1265 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698