blob: bb8967a08f2567334803b5aa5c6bbfda9dd4fbff [file] [log] [blame]
James Robinson646469d2014-10-03 15:33:28 -07001// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "mojo/edk/system/core.h"
6
7#include <stdint.h>
8
9#include <limits>
10
Viet-Trung Luu25fa8922016-01-26 16:32:06 -080011#include "mojo/edk/platform/thread_utils.h"
Hajime Morrita7ab59802014-12-12 15:30:26 -080012#include "mojo/edk/system/awakable.h"
James Robinson646469d2014-10-03 15:33:28 -070013#include "mojo/edk/system/core_test_base.h"
Viet-Trung Luu25fa8922016-01-26 16:32:06 -080014#include "mojo/edk/system/test/timeouts.h"
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -070015#include "mojo/public/cpp/system/macros.h"
James Robinson646469d2014-10-03 15:33:28 -070016
Viet-Trung Luu25fa8922016-01-26 16:32:06 -080017using mojo::platform::ThreadSleep;
18
James Robinson646469d2014-10-03 15:33:28 -070019namespace mojo {
20namespace system {
21namespace {
22
23const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u};
24const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u};
James Robinson646469d2014-10-03 15:33:28 -070025
Viet-Trung Luu9acf1aa2015-05-22 11:24:40 -070026using CoreTest = test::CoreTestBase;
James Robinson646469d2014-10-03 15:33:28 -070027
28TEST_F(CoreTest, GetTimeTicksNow) {
29 const MojoTimeTicks start = core()->GetTimeTicksNow();
30 EXPECT_NE(static_cast<MojoTimeTicks>(0), start)
31 << "GetTimeTicksNow should return nonzero value";
Viet-Trung Luu25fa8922016-01-26 16:32:06 -080032 ThreadSleep(test::DeadlineFromMilliseconds(15u));
James Robinson646469d2014-10-03 15:33:28 -070033 const MojoTimeTicks finish = core()->GetTimeTicksNow();
34 // Allow for some fuzz in sleep.
35 EXPECT_GE((finish - start), static_cast<MojoTimeTicks>(8000))
36 << "Sleeping should result in increasing time ticks";
37}
38
39TEST_F(CoreTest, Basic) {
40 MockHandleInfo info;
41
42 EXPECT_EQ(0u, info.GetCtorCallCount());
43 MojoHandle h = CreateMockHandle(&info);
44 EXPECT_EQ(1u, info.GetCtorCallCount());
45 EXPECT_NE(h, MOJO_HANDLE_INVALID);
46
47 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
48 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -080049 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 0,
James Robinson646469d2014-10-03 15:33:28 -070050 MOJO_WRITE_MESSAGE_FLAG_NONE));
51 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
52
53 EXPECT_EQ(0u, info.GetReadMessageCallCount());
54 uint32_t num_bytes = 0;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -080055 EXPECT_EQ(
56 MOJO_RESULT_OK,
57 core()->ReadMessage(h, NullUserPointer(), MakeUserPointer(&num_bytes),
58 NullUserPointer(), NullUserPointer(),
59 MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -070060 EXPECT_EQ(1u, info.GetReadMessageCallCount());
61 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -080062 core()->ReadMessage(h, NullUserPointer(), NullUserPointer(),
63 NullUserPointer(), NullUserPointer(),
James Robinson646469d2014-10-03 15:33:28 -070064 MOJO_READ_MESSAGE_FLAG_NONE));
65 EXPECT_EQ(2u, info.GetReadMessageCallCount());
66
67 EXPECT_EQ(0u, info.GetWriteDataCallCount());
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -080068 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
69 core()->WriteData(h, NullUserPointer(), NullUserPointer(),
70 MOJO_WRITE_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -070071 EXPECT_EQ(1u, info.GetWriteDataCallCount());
72
73 EXPECT_EQ(0u, info.GetBeginWriteDataCallCount());
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -080074 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
75 core()->BeginWriteData(h, NullUserPointer(), NullUserPointer(),
76 MOJO_WRITE_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -070077 EXPECT_EQ(1u, info.GetBeginWriteDataCallCount());
78
79 EXPECT_EQ(0u, info.GetEndWriteDataCallCount());
80 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndWriteData(h, 0));
81 EXPECT_EQ(1u, info.GetEndWriteDataCallCount());
82
83 EXPECT_EQ(0u, info.GetReadDataCallCount());
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -080084 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
85 core()->ReadData(h, NullUserPointer(), NullUserPointer(),
86 MOJO_READ_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -070087 EXPECT_EQ(1u, info.GetReadDataCallCount());
88
89 EXPECT_EQ(0u, info.GetBeginReadDataCallCount());
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -080090 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
91 core()->BeginReadData(h, NullUserPointer(), NullUserPointer(),
92 MOJO_READ_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -070093 EXPECT_EQ(1u, info.GetBeginReadDataCallCount());
94
95 EXPECT_EQ(0u, info.GetEndReadDataCallCount());
96 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0));
97 EXPECT_EQ(1u, info.GetEndReadDataCallCount());
98
Viet-Trung Luu1484e832016-03-08 14:08:48 -080099 EXPECT_EQ(0u, info.GetDuplicateBufferHandleCallCount());
100 EXPECT_EQ(
101 MOJO_RESULT_UNIMPLEMENTED,
102 core()->DuplicateBufferHandle(h, NullUserPointer(), NullUserPointer()));
103 EXPECT_EQ(1u, info.GetDuplicateBufferHandleCallCount());
104
105 EXPECT_EQ(0u, info.GetGetBufferInformationCallCount());
106 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
107 core()->GetBufferInformation(h, NullUserPointer(), 0));
108 EXPECT_EQ(1u, info.GetGetBufferInformationCallCount());
109
110 EXPECT_EQ(0u, info.GetMapBufferCallCount());
111 EXPECT_EQ(
112 MOJO_RESULT_UNIMPLEMENTED,
113 core()->MapBuffer(h, 0, 0, NullUserPointer(), MOJO_MAP_BUFFER_FLAG_NONE));
114 EXPECT_EQ(1u, info.GetMapBufferCallCount());
115
Hajime Morrita096decd2014-12-03 16:17:52 -0800116 EXPECT_EQ(0u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700117 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800118 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE,
James Robinson646469d2014-10-03 15:33:28 -0700119 NullUserPointer()));
Hajime Morrita096decd2014-12-03 16:17:52 -0800120 EXPECT_EQ(1u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700121 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
122 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0, NullUserPointer()));
Hajime Morrita096decd2014-12-03 16:17:52 -0800123 EXPECT_EQ(2u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700124 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
125 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800126 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE,
James Robinson646469d2014-10-03 15:33:28 -0700127 MakeUserPointer(&hss)));
Hajime Morrita096decd2014-12-03 16:17:52 -0800128 EXPECT_EQ(3u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700129 EXPECT_EQ(0u, hss.satisfied_signals);
130 EXPECT_EQ(0u, hss.satisfiable_signals);
131 EXPECT_EQ(
132 MOJO_RESULT_FAILED_PRECONDITION,
133 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, NullUserPointer()));
Hajime Morrita096decd2014-12-03 16:17:52 -0800134 EXPECT_EQ(4u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700135 hss = kFullMojoHandleSignalsState;
136 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800137 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000,
138 MakeUserPointer(&hss)));
Hajime Morrita096decd2014-12-03 16:17:52 -0800139 EXPECT_EQ(5u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700140 EXPECT_EQ(0u, hss.satisfied_signals);
141 EXPECT_EQ(0u, hss.satisfiable_signals);
142
143 MojoHandleSignals handle_signals = ~MOJO_HANDLE_SIGNAL_NONE;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800144 EXPECT_EQ(
145 MOJO_RESULT_FAILED_PRECONDITION,
146 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1,
147 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
148 NullUserPointer()));
Hajime Morrita096decd2014-12-03 16:17:52 -0800149 EXPECT_EQ(6u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700150 uint32_t result_index = static_cast<uint32_t>(-1);
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800151 EXPECT_EQ(
152 MOJO_RESULT_FAILED_PRECONDITION,
153 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1,
154 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
155 NullUserPointer()));
Hajime Morrita096decd2014-12-03 16:17:52 -0800156 EXPECT_EQ(7u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700157 EXPECT_EQ(0u, result_index);
158 hss = kFullMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800159 EXPECT_EQ(
160 MOJO_RESULT_FAILED_PRECONDITION,
161 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1,
162 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
163 MakeUserPointer(&hss)));
Hajime Morrita096decd2014-12-03 16:17:52 -0800164 EXPECT_EQ(8u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700165 EXPECT_EQ(0u, hss.satisfied_signals);
166 EXPECT_EQ(0u, hss.satisfiable_signals);
167 result_index = static_cast<uint32_t>(-1);
168 hss = kFullMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800169 EXPECT_EQ(
170 MOJO_RESULT_FAILED_PRECONDITION,
171 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1,
172 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
173 MakeUserPointer(&hss)));
Hajime Morrita096decd2014-12-03 16:17:52 -0800174 EXPECT_EQ(9u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700175 EXPECT_EQ(0u, result_index);
176 EXPECT_EQ(0u, hss.satisfied_signals);
177 EXPECT_EQ(0u, hss.satisfiable_signals);
178
179 EXPECT_EQ(0u, info.GetDtorCallCount());
180 EXPECT_EQ(0u, info.GetCloseCallCount());
Hajime Morrita096decd2014-12-03 16:17:52 -0800181 EXPECT_EQ(0u, info.GetCancelAllAwakablesCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700182 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
Hajime Morrita096decd2014-12-03 16:17:52 -0800183 EXPECT_EQ(1u, info.GetCancelAllAwakablesCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700184 EXPECT_EQ(1u, info.GetCloseCallCount());
185 EXPECT_EQ(1u, info.GetDtorCallCount());
186
Hajime Morrita096decd2014-12-03 16:17:52 -0800187 // No awakables should ever have ever been added.
188 EXPECT_EQ(0u, info.GetRemoveAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700189}
190
191TEST_F(CoreTest, InvalidArguments) {
192 // |Close()|:
193 {
194 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(MOJO_HANDLE_INVALID));
195 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(10));
196 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(1000000000));
197
198 // Test a double-close.
199 MockHandleInfo info;
200 MojoHandle h = CreateMockHandle(&info);
201 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
202 EXPECT_EQ(1u, info.GetCloseCallCount());
203 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h));
204 EXPECT_EQ(1u, info.GetCloseCallCount());
205 }
206
207 // |Wait()|:
208 {
209 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800210 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE,
211 MOJO_DEADLINE_INDEFINITE, NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700212 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800213 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE,
214 MOJO_DEADLINE_INDEFINITE, NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700215
216 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
217 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800218 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE,
219 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&hss)));
James Robinson646469d2014-10-03 15:33:28 -0700220 // On invalid argument, it shouldn't modify the handle signals state.
221 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
222 hss.satisfied_signals);
223 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
224 hss.satisfiable_signals);
225 hss = kFullMojoHandleSignalsState;
226 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800227 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE,
228 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&hss)));
James Robinson646469d2014-10-03 15:33:28 -0700229 // On invalid argument, it shouldn't modify the handle signals state.
230 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
231 hss.satisfied_signals);
232 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
233 hss.satisfiable_signals);
234 }
235
236 // |WaitMany()|:
237 {
238 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
239 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE,
240 ~MOJO_HANDLE_SIGNAL_NONE};
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800241 EXPECT_EQ(
242 MOJO_RESULT_INVALID_ARGUMENT,
243 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 0,
244 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
245 NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700246 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800247 core()->WaitMany(NullUserPointer(), MakeUserPointer(signals), 0,
248 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
James Robinson646469d2014-10-03 15:33:28 -0700249 NullUserPointer()));
250 // If |num_handles| is invalid, it should leave |result_index| and
251 // |signals_states| alone.
252 // (We use -1 internally; make sure that doesn't leak.)
253 uint32_t result_index = 123;
254 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
255 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800256 core()->WaitMany(NullUserPointer(), MakeUserPointer(signals), 0,
James Robinson646469d2014-10-03 15:33:28 -0700257 MOJO_DEADLINE_INDEFINITE,
258 MakeUserPointer(&result_index),
259 MakeUserPointer(&hss)));
260 EXPECT_EQ(123u, result_index);
261 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
262 hss.satisfied_signals);
263 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
264 hss.satisfiable_signals);
265
266 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800267 core()->WaitMany(MakeUserPointer(handles), NullUserPointer(), 0,
268 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
James Robinson646469d2014-10-03 15:33:28 -0700269 NullUserPointer()));
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800270 EXPECT_EQ(
271 MOJO_RESULT_INVALID_ARGUMENT,
272 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 1,
273 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
274 NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700275 // But if a handle is bad, then it should set |result_index| but still leave
276 // |signals_states| alone.
277 result_index = static_cast<uint32_t>(-1);
278 hss = kFullMojoHandleSignalsState;
279 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800280 core()->WaitMany(
281 MakeUserPointer(handles), MakeUserPointer(signals), 1,
282 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
283 MakeUserPointer(&hss)));
James Robinson646469d2014-10-03 15:33:28 -0700284 EXPECT_EQ(0u, result_index);
285 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
286 hss.satisfied_signals);
287 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
288 hss.satisfiable_signals);
289
290 MockHandleInfo info[2];
291 handles[0] = CreateMockHandle(&info[0]);
292
293 result_index = static_cast<uint32_t>(-1);
294 hss = kFullMojoHandleSignalsState;
295 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800296 core()->WaitMany(
297 MakeUserPointer(handles), MakeUserPointer(signals), 1,
298 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
299 MakeUserPointer(&hss)));
James Robinson646469d2014-10-03 15:33:28 -0700300 EXPECT_EQ(0u, result_index);
301 EXPECT_EQ(0u, hss.satisfied_signals);
302 EXPECT_EQ(0u, hss.satisfiable_signals);
303
304 // On invalid argument, it'll leave |signals_states| alone.
305 result_index = static_cast<uint32_t>(-1);
306 hss = kFullMojoHandleSignalsState;
307 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800308 core()->WaitMany(
309 MakeUserPointer(handles), MakeUserPointer(signals), 2,
310 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
311 MakeUserPointer(&hss)));
James Robinson646469d2014-10-03 15:33:28 -0700312 EXPECT_EQ(1u, result_index);
313 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
314 hss.satisfied_signals);
315 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
316 hss.satisfiable_signals);
317 handles[1] = handles[0] + 1; // Invalid handle.
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800318 EXPECT_EQ(
319 MOJO_RESULT_INVALID_ARGUMENT,
320 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 2,
321 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
322 NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700323 handles[1] = CreateMockHandle(&info[1]);
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800324 EXPECT_EQ(
325 MOJO_RESULT_FAILED_PRECONDITION,
326 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 2,
327 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
328 NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700329
330 // TODO(vtl): Test one where we get "failed precondition" only for the
331 // second handle (and the first one is valid to wait on).
332
333 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0]));
334 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1]));
335 }
336
Viet-Trung Luu1484e832016-03-08 14:08:48 -0800337 // |CreateMessagePipe()|:
338 {
339 // Invalid options: unknown flag.
340 const MojoCreateMessagePipeOptions kOptions = {
341 static_cast<uint32_t>(sizeof(MojoCreateMessagePipeOptions)),
342 ~MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE};
343 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
344 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
345 core()->CreateMessagePipe(MakeUserPointer(&kOptions),
346 MakeUserPointer(&handles[0]),
347 MakeUserPointer(&handles[1])));
348 EXPECT_EQ(MOJO_HANDLE_INVALID, handles[0]);
349 EXPECT_EQ(MOJO_HANDLE_INVALID, handles[1]);
350 }
James Robinson646469d2014-10-03 15:33:28 -0700351
352 // |WriteMessage()|:
353 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
354 // |num_handles|.
355 {
356 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800357 core()->WriteMessage(MOJO_HANDLE_INVALID, NullUserPointer(), 0,
358 NullUserPointer(), 0,
James Robinson646469d2014-10-03 15:33:28 -0700359 MOJO_WRITE_MESSAGE_FLAG_NONE));
360
361 MockHandleInfo info;
362 MojoHandle h = CreateMockHandle(&info);
363 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
364
365 // Huge handle count (implausibly big on some systems -- more than can be
366 // stored in a 32-bit address space).
367 // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or
368 // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or
369 // not.
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800370 EXPECT_NE(
371 MOJO_RESULT_OK,
372 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
373 std::numeric_limits<uint32_t>::max(),
374 MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700375 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
376
377 // Huge handle count (plausibly big).
378 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
379 core()->WriteMessage(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800380 h, NullUserPointer(), 0, MakeUserPointer(handles),
James Robinson646469d2014-10-03 15:33:28 -0700381 std::numeric_limits<uint32_t>::max() / sizeof(handles[0]),
382 MOJO_WRITE_MESSAGE_FLAG_NONE));
383 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
384
385 // Invalid handle in |handles|.
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800386 EXPECT_EQ(
387 MOJO_RESULT_INVALID_ARGUMENT,
388 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
389 1, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700390 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
391
392 // Two invalid handles in |handles|.
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800393 EXPECT_EQ(
394 MOJO_RESULT_INVALID_ARGUMENT,
395 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
396 2, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700397 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
398
399 // Can't send a handle over itself.
400 handles[0] = h;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800401 EXPECT_EQ(
402 MOJO_RESULT_BUSY,
403 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
404 1, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700405 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
406
407 MockHandleInfo info2;
408 MojoHandle h2 = CreateMockHandle(&info2);
409
410 // This is "okay", but |MockDispatcher| doesn't implement it.
411 handles[0] = h2;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800412 EXPECT_EQ(
413 MOJO_RESULT_UNIMPLEMENTED,
414 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
415 1, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700416 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
417
418 // One of the |handles| is still invalid.
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800419 EXPECT_EQ(
420 MOJO_RESULT_INVALID_ARGUMENT,
421 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
422 2, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700423 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
424
425 // One of the |handles| is the same as |handle|.
426 handles[1] = h;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800427 EXPECT_EQ(
428 MOJO_RESULT_BUSY,
429 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
430 2, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700431 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
432
433 // Can't send a handle twice in the same message.
434 handles[1] = h2;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800435 EXPECT_EQ(
436 MOJO_RESULT_BUSY,
437 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
438 2, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700439 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
440
441 // Note: Since we never successfully sent anything with it, |h2| should
442 // still be valid.
443 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h2));
444
445 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
446 }
447
448 // |ReadMessage()|:
449 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
450 // |num_handles|.
451 {
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800452 EXPECT_EQ(
453 MOJO_RESULT_INVALID_ARGUMENT,
454 core()->ReadMessage(MOJO_HANDLE_INVALID, NullUserPointer(),
455 NullUserPointer(), NullUserPointer(),
456 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700457
458 MockHandleInfo info;
459 MojoHandle h = CreateMockHandle(&info);
460
461 // Okay.
462 uint32_t handle_count = 0;
463 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800464 core()->ReadMessage(
465 h, NullUserPointer(), NullUserPointer(), NullUserPointer(),
466 MakeUserPointer(&handle_count), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700467 // Checked by |Core|, shouldn't go through to the dispatcher.
468 EXPECT_EQ(1u, info.GetReadMessageCallCount());
469
470 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
471 }
Viet-Trung Luu1484e832016-03-08 14:08:48 -0800472
473 // |CreateDataPipe()|:
474 {
475 // Invalid options: unknown flag.
476 const MojoCreateDataPipeOptions kOptions = {
477 static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions)),
478 ~MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, 1u, 0u};
479 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
480 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
481 core()->CreateDataPipe(MakeUserPointer(&kOptions),
482 MakeUserPointer(&handles[0]),
483 MakeUserPointer(&handles[1])));
484 EXPECT_EQ(MOJO_HANDLE_INVALID, handles[0]);
485 EXPECT_EQ(MOJO_HANDLE_INVALID, handles[1]);
486 }
487
488 // |WriteData()|:
489 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
490 core()->WriteData(MOJO_HANDLE_INVALID, NullUserPointer(),
491 NullUserPointer(), MOJO_WRITE_DATA_FLAG_NONE));
492
493 // |BeginWriteData()|:
494 EXPECT_EQ(
495 MOJO_RESULT_INVALID_ARGUMENT,
496 core()->BeginWriteData(MOJO_HANDLE_INVALID, NullUserPointer(),
497 NullUserPointer(), MOJO_WRITE_DATA_FLAG_NONE));
498
499 // |EndWriteData()|:
500 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
501 core()->EndWriteData(MOJO_HANDLE_INVALID, 0u));
502
503 // |ReadData()|:
504 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
505 core()->ReadData(MOJO_HANDLE_INVALID, NullUserPointer(),
506 NullUserPointer(), MOJO_READ_DATA_FLAG_NONE));
507
508 // |BeginReadData()|:
509 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
510 core()->BeginReadData(MOJO_HANDLE_INVALID, NullUserPointer(),
511 NullUserPointer(), MOJO_READ_DATA_FLAG_NONE));
512
513 // |EndReadData()|:
514 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
515 core()->EndReadData(MOJO_HANDLE_INVALID, 0u));
516
517 // |CreateSharedBuffer()|:
518 {
519 // Invalid options: unknown flag.
520 const MojoCreateSharedBufferOptions kOptions = {
521 static_cast<uint32_t>(sizeof(MojoCreateSharedBufferOptions)),
522 ~MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
523 MojoHandle handle = MOJO_HANDLE_INVALID;
524 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
525 core()->CreateSharedBuffer(MakeUserPointer(&kOptions), 4096u,
526 MakeUserPointer(&handle)));
527 EXPECT_EQ(MOJO_HANDLE_INVALID, handle);
528 }
529
530 // |DuplicateBufferHandle()|:
531 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
532 core()->DuplicateBufferHandle(
533 MOJO_HANDLE_INVALID, NullUserPointer(), NullUserPointer()));
534
535 // |GetBufferInformation()|:
536 EXPECT_EQ(
537 MOJO_RESULT_INVALID_ARGUMENT,
538 core()->GetBufferInformation(MOJO_HANDLE_INVALID, NullUserPointer(), 0u));
539
540 // |MapBuffer()|:
541 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
542 core()->MapBuffer(MOJO_HANDLE_INVALID, 0u, 0u, NullUserPointer(),
543 MOJO_MAP_BUFFER_FLAG_NONE));
544
545 // |UnmapBuffer()|:
546 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
547 core()->UnmapBuffer(NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700548}
549
550// These test invalid arguments that should cause death if we're being paranoid
551// about checking arguments (which we would want to do if, e.g., we were in a
552// true "kernel" situation, but we might not want to do otherwise for
553// performance reasons). Probably blatant errors like passing in null pointers
554// (for required pointer arguments) will still cause death, but perhaps not
555// predictably.
556TEST_F(CoreTest, InvalidArgumentsDeath) {
557 const char kMemoryCheckFailedRegex[] = "Check failed";
558
559 // |WaitMany()|:
560 {
561 MojoHandle handle = MOJO_HANDLE_INVALID;
562 MojoHandleSignals signals = ~MOJO_HANDLE_SIGNAL_NONE;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800563 EXPECT_DEATH_IF_SUPPORTED(
564 core()->WaitMany(NullUserPointer(), MakeUserPointer(&signals), 1,
565 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
566 NullUserPointer()),
567 kMemoryCheckFailedRegex);
568 EXPECT_DEATH_IF_SUPPORTED(
569 core()->WaitMany(MakeUserPointer(&handle), NullUserPointer(), 1,
570 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
571 NullUserPointer()),
572 kMemoryCheckFailedRegex);
James Robinson646469d2014-10-03 15:33:28 -0700573 // TODO(vtl): |result_index| and |signals_states| are optional. Test them
574 // with non-null invalid pointers?
575 }
576
577 // |CreateMessagePipe()|:
578 {
579 MojoHandle h;
580 EXPECT_DEATH_IF_SUPPORTED(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800581 core()->CreateMessagePipe(NullUserPointer(), NullUserPointer(),
582 NullUserPointer()),
James Robinson646469d2014-10-03 15:33:28 -0700583 kMemoryCheckFailedRegex);
584 EXPECT_DEATH_IF_SUPPORTED(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800585 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h),
586 NullUserPointer()),
James Robinson646469d2014-10-03 15:33:28 -0700587 kMemoryCheckFailedRegex);
588 EXPECT_DEATH_IF_SUPPORTED(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800589 core()->CreateMessagePipe(NullUserPointer(), NullUserPointer(),
590 MakeUserPointer(&h)),
James Robinson646469d2014-10-03 15:33:28 -0700591 kMemoryCheckFailedRegex);
592 }
593
594 // |WriteMessage()|:
595 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
596 // |num_handles|.
597 {
598 MockHandleInfo info;
599 MojoHandle h = CreateMockHandle(&info);
600
601 // Null |handles| with nonzero |num_handles|.
602 EXPECT_DEATH_IF_SUPPORTED(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800603 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 1,
James Robinson646469d2014-10-03 15:33:28 -0700604 MOJO_WRITE_MESSAGE_FLAG_NONE),
605 kMemoryCheckFailedRegex);
606
607 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
608 }
609
610 // |ReadMessage()|:
611 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
612 // |num_handles|.
613 {
614 MockHandleInfo info;
615 MojoHandle h = CreateMockHandle(&info);
616
617 uint32_t handle_count = 1;
618 EXPECT_DEATH_IF_SUPPORTED(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800619 core()->ReadMessage(h, NullUserPointer(), NullUserPointer(),
620 NullUserPointer(), MakeUserPointer(&handle_count),
James Robinson646469d2014-10-03 15:33:28 -0700621 MOJO_READ_MESSAGE_FLAG_NONE),
622 kMemoryCheckFailedRegex);
623
624 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
625 }
Viet-Trung Luu1484e832016-03-08 14:08:48 -0800626
627 // TODO(vtl): Missing a bunch here.
James Robinson646469d2014-10-03 15:33:28 -0700628}
629
630// TODO(vtl): test |Wait()| and |WaitMany()| properly
631// - including |WaitMany()| with the same handle more than once (with
632// same/different signals)
633
634TEST_F(CoreTest, MessagePipe) {
635 MojoHandle h[2];
636 MojoHandleSignalsState hss[2];
637 uint32_t result_index;
638
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800639 EXPECT_EQ(MOJO_RESULT_OK,
640 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h[0]),
641 MakeUserPointer(&h[1])));
James Robinson646469d2014-10-03 15:33:28 -0700642 // Should get two distinct, valid handles.
643 EXPECT_NE(h[0], MOJO_HANDLE_INVALID);
644 EXPECT_NE(h[1], MOJO_HANDLE_INVALID);
645 EXPECT_NE(h[0], h[1]);
646
647 // Neither should be readable.
648 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
649 MOJO_HANDLE_SIGNAL_READABLE};
650 result_index = static_cast<uint32_t>(-1);
651 hss[0] = kEmptyMojoHandleSignalsState;
652 hss[1] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800653 EXPECT_EQ(
654 MOJO_RESULT_DEADLINE_EXCEEDED,
655 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 0,
656 MakeUserPointer(&result_index), MakeUserPointer(hss)));
James Robinson646469d2014-10-03 15:33:28 -0700657 EXPECT_EQ(static_cast<uint32_t>(-1), result_index);
658 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700659 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
660 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
661 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700662 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700663 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
664 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
665 hss[1].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700666
667 // Try to read anyway.
668 char buffer[1] = {'a'};
669 uint32_t buffer_size = 1;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800670 EXPECT_EQ(
671 MOJO_RESULT_SHOULD_WAIT,
672 core()->ReadMessage(h[0], UserPointer<void>(buffer),
673 MakeUserPointer(&buffer_size), NullUserPointer(),
674 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700675 // Check that it left its inputs alone.
676 EXPECT_EQ('a', buffer[0]);
677 EXPECT_EQ(1u, buffer_size);
678
679 // Both should be writable.
680 hss[0] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800681 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[0], MOJO_HANDLE_SIGNAL_WRITABLE,
682 1000000000, MakeUserPointer(&hss[0])));
James Robinson646469d2014-10-03 15:33:28 -0700683 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700684 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
685 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
686 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700687 hss[0] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800688 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE,
689 1000000000, MakeUserPointer(&hss[0])));
James Robinson646469d2014-10-03 15:33:28 -0700690 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700691 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
692 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
693 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700694
695 // Also check that |h[1]| is writable using |WaitMany()|.
696 signals[0] = MOJO_HANDLE_SIGNAL_READABLE;
697 signals[1] = MOJO_HANDLE_SIGNAL_WRITABLE;
698 result_index = static_cast<uint32_t>(-1);
699 hss[0] = kEmptyMojoHandleSignalsState;
700 hss[1] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800701 EXPECT_EQ(
702 MOJO_RESULT_OK,
703 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2,
704 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
705 MakeUserPointer(hss)));
James Robinson646469d2014-10-03 15:33:28 -0700706 EXPECT_EQ(1u, result_index);
707 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700708 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
709 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
710 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700711 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700712 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
713 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
714 hss[1].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700715
716 // Write to |h[1]|.
717 buffer[0] = 'b';
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800718 EXPECT_EQ(
719 MOJO_RESULT_OK,
720 core()->WriteMessage(h[1], UserPointer<const void>(buffer), 1,
721 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700722
723 // Check that |h[0]| is now readable.
724 signals[0] = MOJO_HANDLE_SIGNAL_READABLE;
725 signals[1] = MOJO_HANDLE_SIGNAL_READABLE;
726 result_index = static_cast<uint32_t>(-1);
727 hss[0] = kEmptyMojoHandleSignalsState;
728 hss[1] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800729 EXPECT_EQ(
730 MOJO_RESULT_OK,
731 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2,
732 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
733 MakeUserPointer(hss)));
James Robinson646469d2014-10-03 15:33:28 -0700734 EXPECT_EQ(0u, result_index);
735 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
736 hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700737 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
738 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
739 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700740 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700741 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
742 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
743 hss[1].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700744
745 // Read from |h[0]|.
746 // First, get only the size.
747 buffer_size = 0;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800748 EXPECT_EQ(
749 MOJO_RESULT_RESOURCE_EXHAUSTED,
750 core()->ReadMessage(h[0], NullUserPointer(),
751 MakeUserPointer(&buffer_size), NullUserPointer(),
752 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700753 EXPECT_EQ(1u, buffer_size);
754 // Then actually read it.
755 buffer[0] = 'c';
756 buffer_size = 1;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800757 EXPECT_EQ(
758 MOJO_RESULT_OK,
759 core()->ReadMessage(h[0], UserPointer<void>(buffer),
760 MakeUserPointer(&buffer_size), NullUserPointer(),
761 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700762 EXPECT_EQ('b', buffer[0]);
763 EXPECT_EQ(1u, buffer_size);
764
765 // |h[0]| should no longer be readable.
766 hss[0] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800767 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
768 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_READABLE, 0,
769 MakeUserPointer(&hss[0])));
James Robinson646469d2014-10-03 15:33:28 -0700770 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700771 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
772 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
773 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700774
775 // Write to |h[0]|.
776 buffer[0] = 'd';
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800777 EXPECT_EQ(
778 MOJO_RESULT_OK,
779 core()->WriteMessage(h[0], UserPointer<const void>(buffer), 1,
780 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700781
782 // Close |h[0]|.
783 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0]));
784
785 // Check that |h[1]| is no longer writable (and will never be).
786 hss[0] = kEmptyMojoHandleSignalsState;
787 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800788 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -0700789 MakeUserPointer(&hss[0])));
Benjamin Lerman33c84782014-11-27 10:07:33 +0100790 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
791 hss[0].satisfied_signals);
792 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
793 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700794
795 // Check that |h[1]| is still readable (for the moment).
796 hss[0] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800797 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE,
798 1000000000, MakeUserPointer(&hss[0])));
Benjamin Lerman33c84782014-11-27 10:07:33 +0100799 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
800 hss[0].satisfied_signals);
801 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
802 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700803
804 // Discard a message from |h[1]|.
805 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800806 core()->ReadMessage(h[1], NullUserPointer(), NullUserPointer(),
807 NullUserPointer(), NullUserPointer(),
James Robinson646469d2014-10-03 15:33:28 -0700808 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD));
809
810 // |h[1]| is no longer readable (and will never be).
811 hss[0] = kFullMojoHandleSignalsState;
812 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800813 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -0700814 MakeUserPointer(&hss[0])));
Benjamin Lerman33c84782014-11-27 10:07:33 +0100815 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[0].satisfied_signals);
816 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700817
818 // Try writing to |h[1]|.
819 buffer[0] = 'e';
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800820 EXPECT_EQ(
821 MOJO_RESULT_FAILED_PRECONDITION,
822 core()->WriteMessage(h[1], UserPointer<const void>(buffer), 1,
823 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700824
825 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1]));
826}
827
828// Tests passing a message pipe handle.
829TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
830 const char kHello[] = "hello";
831 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
832 const char kWorld[] = "world!!!";
833 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
834 char buffer[100];
835 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
836 uint32_t num_bytes;
837 MojoHandle handles[10];
838 uint32_t num_handles;
839 MojoHandleSignalsState hss;
840 MojoHandle h_received;
841
842 MojoHandle h_passing[2];
843 EXPECT_EQ(MOJO_RESULT_OK,
844 core()->CreateMessagePipe(NullUserPointer(),
845 MakeUserPointer(&h_passing[0]),
846 MakeUserPointer(&h_passing[1])));
847
848 // Make sure that |h_passing[]| work properly.
849 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800850 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
851 kHelloSize, NullUserPointer(), 0,
James Robinson646469d2014-10-03 15:33:28 -0700852 MOJO_WRITE_MESSAGE_FLAG_NONE));
853 hss = kEmptyMojoHandleSignalsState;
854 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800855 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -0700856 MakeUserPointer(&hss)));
857 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
858 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700859 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
860 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
861 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700862 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -0700863 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -0700864 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800865 core()->ReadMessage(
866 h_passing[1], UserPointer<void>(buffer),
867 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
868 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700869 EXPECT_EQ(kHelloSize, num_bytes);
870 EXPECT_STREQ(kHello, buffer);
871 EXPECT_EQ(0u, num_handles);
872
873 // Make sure that you can't pass either of the message pipe's handles over
874 // itself.
875 EXPECT_EQ(MOJO_RESULT_BUSY,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800876 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
877 kHelloSize, MakeUserPointer(&h_passing[0]), 1,
James Robinson646469d2014-10-03 15:33:28 -0700878 MOJO_WRITE_MESSAGE_FLAG_NONE));
879 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800880 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
881 kHelloSize, MakeUserPointer(&h_passing[1]), 1,
James Robinson646469d2014-10-03 15:33:28 -0700882 MOJO_WRITE_MESSAGE_FLAG_NONE));
883
884 MojoHandle h_passed[2];
885 EXPECT_EQ(MOJO_RESULT_OK,
886 core()->CreateMessagePipe(NullUserPointer(),
887 MakeUserPointer(&h_passed[0]),
888 MakeUserPointer(&h_passed[1])));
889
890 // Make sure that |h_passed[]| work properly.
891 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800892 core()->WriteMessage(h_passed[0], UserPointer<const void>(kHello),
893 kHelloSize, NullUserPointer(), 0,
James Robinson646469d2014-10-03 15:33:28 -0700894 MOJO_WRITE_MESSAGE_FLAG_NONE));
895 hss = kEmptyMojoHandleSignalsState;
896 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800897 core()->Wait(h_passed[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -0700898 MakeUserPointer(&hss)));
899 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
900 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700901 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
902 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
903 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700904 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -0700905 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -0700906 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800907 core()->ReadMessage(
908 h_passed[1], UserPointer<void>(buffer),
909 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
910 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700911 EXPECT_EQ(kHelloSize, num_bytes);
912 EXPECT_STREQ(kHello, buffer);
913 EXPECT_EQ(0u, num_handles);
914
915 // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|.
916 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800917 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld),
918 kWorldSize, MakeUserPointer(&h_passed[1]), 1,
James Robinson646469d2014-10-03 15:33:28 -0700919 MOJO_WRITE_MESSAGE_FLAG_NONE));
920 hss = kEmptyMojoHandleSignalsState;
921 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800922 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -0700923 MakeUserPointer(&hss)));
924 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
925 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700926 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
927 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
928 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700929 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -0700930 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -0700931 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800932 core()->ReadMessage(
933 h_passing[1], UserPointer<void>(buffer),
934 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
935 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700936 EXPECT_EQ(kWorldSize, num_bytes);
937 EXPECT_STREQ(kWorld, buffer);
938 EXPECT_EQ(1u, num_handles);
939 h_received = handles[0];
940 EXPECT_NE(h_received, MOJO_HANDLE_INVALID);
941 EXPECT_NE(h_received, h_passing[0]);
942 EXPECT_NE(h_received, h_passing[1]);
943 EXPECT_NE(h_received, h_passed[0]);
944
945 // Note: We rely on the Mojo system not re-using handle values very often.
946 EXPECT_NE(h_received, h_passed[1]);
947
948 // |h_passed[1]| should no longer be valid; check that trying to close it
949 // fails. See above note.
950 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1]));
951
952 // Write to |h_passed[0]|. Should receive on |h_received|.
953 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800954 core()->WriteMessage(h_passed[0], UserPointer<const void>(kHello),
955 kHelloSize, NullUserPointer(), 0,
James Robinson646469d2014-10-03 15:33:28 -0700956 MOJO_WRITE_MESSAGE_FLAG_NONE));
957 hss = kEmptyMojoHandleSignalsState;
958 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800959 core()->Wait(h_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -0700960 MakeUserPointer(&hss)));
961 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
962 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700963 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
964 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
965 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700966 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -0700967 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -0700968 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800969 core()->ReadMessage(
970 h_received, UserPointer<void>(buffer),
971 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
972 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700973 EXPECT_EQ(kHelloSize, num_bytes);
974 EXPECT_STREQ(kHello, buffer);
975 EXPECT_EQ(0u, num_handles);
976
977 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0]));
978 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1]));
979 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0]));
980 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received));
981}
982
983TEST_F(CoreTest, DataPipe) {
984 MojoHandle ph, ch; // p is for producer and c is for consumer.
985 MojoHandleSignalsState hss;
986
987 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800988 core()->CreateDataPipe(NullUserPointer(), MakeUserPointer(&ph),
989 MakeUserPointer(&ch)));
James Robinson646469d2014-10-03 15:33:28 -0700990 // Should get two distinct, valid handles.
991 EXPECT_NE(ph, MOJO_HANDLE_INVALID);
992 EXPECT_NE(ch, MOJO_HANDLE_INVALID);
993 EXPECT_NE(ph, ch);
994
995 // Producer should be never-readable, but already writable.
996 hss = kEmptyMojoHandleSignalsState;
997 EXPECT_EQ(
998 MOJO_RESULT_FAILED_PRECONDITION,
999 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1000 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
Benjamin Lerman33c84782014-11-27 10:07:33 +01001001 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1002 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001003 hss = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001004 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0,
1005 MakeUserPointer(&hss)));
James Robinson646469d2014-10-03 15:33:28 -07001006 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
Benjamin Lerman33c84782014-11-27 10:07:33 +01001007 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1008 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001009
1010 // Consumer should be never-writable, and not yet readable.
1011 hss = kFullMojoHandleSignalsState;
1012 EXPECT_EQ(
1013 MOJO_RESULT_FAILED_PRECONDITION,
1014 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0, MakeUserPointer(&hss)));
1015 EXPECT_EQ(0u, hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001016 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1017 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001018 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001019 hss = kFullMojoHandleSignalsState;
1020 EXPECT_EQ(
1021 MOJO_RESULT_DEADLINE_EXCEEDED,
1022 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1023 EXPECT_EQ(0u, hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001024 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1025 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001026 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001027
1028 // Write.
Benjamin Lermanf4583a82014-11-26 10:54:39 +01001029 signed char elements[2] = {'A', 'B'};
James Robinson646469d2014-10-03 15:33:28 -07001030 uint32_t num_bytes = 2u;
1031 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001032 core()->WriteData(ph, UserPointer<const void>(elements),
James Robinson646469d2014-10-03 15:33:28 -07001033 MakeUserPointer(&num_bytes),
1034 MOJO_WRITE_DATA_FLAG_NONE));
1035 EXPECT_EQ(2u, num_bytes);
1036
1037 // Consumer should now be readable.
1038 hss = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001039 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0,
1040 MakeUserPointer(&hss)));
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001041 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
1042 hss.satisfied_signals);
1043 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1044 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001045 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001046
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001047 // Peek one character.
1048 elements[0] = -1;
1049 elements[1] = -1;
1050 num_bytes = 1u;
1051 EXPECT_EQ(MOJO_RESULT_OK,
1052 core()->ReadData(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001053 ch, UserPointer<void>(elements), MakeUserPointer(&num_bytes),
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001054 MOJO_READ_DATA_FLAG_NONE | MOJO_READ_DATA_FLAG_PEEK));
1055 EXPECT_EQ('A', elements[0]);
1056 EXPECT_EQ(-1, elements[1]);
1057
James Robinson646469d2014-10-03 15:33:28 -07001058 // Read one character.
1059 elements[0] = -1;
1060 elements[1] = -1;
1061 num_bytes = 1u;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001062 EXPECT_EQ(MOJO_RESULT_OK, core()->ReadData(ch, UserPointer<void>(elements),
1063 MakeUserPointer(&num_bytes),
1064 MOJO_READ_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001065 EXPECT_EQ('A', elements[0]);
1066 EXPECT_EQ(-1, elements[1]);
1067
1068 // Two-phase write.
1069 void* write_ptr = nullptr;
1070 num_bytes = 0u;
1071 ASSERT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001072 core()->BeginWriteData(ph, MakeUserPointer(&write_ptr),
James Robinson646469d2014-10-03 15:33:28 -07001073 MakeUserPointer(&num_bytes),
1074 MOJO_WRITE_DATA_FLAG_NONE));
1075 // We count on the default options providing a decent buffer size.
1076 ASSERT_GE(num_bytes, 3u);
1077
1078 // Trying to do a normal write during a two-phase write should fail.
1079 elements[0] = 'X';
1080 num_bytes = 1u;
1081 EXPECT_EQ(MOJO_RESULT_BUSY,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001082 core()->WriteData(ph, UserPointer<const void>(elements),
James Robinson646469d2014-10-03 15:33:28 -07001083 MakeUserPointer(&num_bytes),
1084 MOJO_WRITE_DATA_FLAG_NONE));
1085
1086 // Actually write the data, and complete it now.
1087 static_cast<char*>(write_ptr)[0] = 'C';
1088 static_cast<char*>(write_ptr)[1] = 'D';
1089 static_cast<char*>(write_ptr)[2] = 'E';
1090 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u));
1091
1092 // Query how much data we have.
1093 num_bytes = 0;
1094 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001095 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
James Robinson646469d2014-10-03 15:33:28 -07001096 MOJO_READ_DATA_FLAG_QUERY));
1097 EXPECT_EQ(4u, num_bytes);
1098
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001099 // Try to query with peek. Should fail.
1100 num_bytes = 0;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001101 EXPECT_EQ(
1102 MOJO_RESULT_INVALID_ARGUMENT,
1103 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
1104 MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK));
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001105 EXPECT_EQ(0u, num_bytes);
1106
James Robinson646469d2014-10-03 15:33:28 -07001107 // Try to discard ten characters, in all-or-none mode. Should fail.
1108 num_bytes = 10;
1109 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
1110 core()->ReadData(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001111 ch, NullUserPointer(), MakeUserPointer(&num_bytes),
James Robinson646469d2014-10-03 15:33:28 -07001112 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
1113
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001114 // Try to discard two characters, in peek mode. Should fail.
1115 num_bytes = 2;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001116 EXPECT_EQ(
1117 MOJO_RESULT_INVALID_ARGUMENT,
1118 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
1119 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK));
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001120
James Robinson646469d2014-10-03 15:33:28 -07001121 // Discard two characters.
1122 num_bytes = 2;
1123 EXPECT_EQ(MOJO_RESULT_OK,
1124 core()->ReadData(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001125 ch, NullUserPointer(), MakeUserPointer(&num_bytes),
James Robinson646469d2014-10-03 15:33:28 -07001126 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
1127
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001128 // Try a two-phase read of the remaining two bytes with peek. Should fail.
James Robinson646469d2014-10-03 15:33:28 -07001129 const void* read_ptr = nullptr;
1130 num_bytes = 2;
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001131 ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001132 core()->BeginReadData(ch, MakeUserPointer(&read_ptr),
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001133 MakeUserPointer(&num_bytes),
1134 MOJO_READ_DATA_FLAG_PEEK));
1135
Viet-Trung Luu8b1ba572015-09-25 16:29:49 -07001136 // Read the remaining two characters, in two-phase mode.
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001137 num_bytes = 2;
James Robinson646469d2014-10-03 15:33:28 -07001138 ASSERT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001139 core()->BeginReadData(ch, MakeUserPointer(&read_ptr),
James Robinson646469d2014-10-03 15:33:28 -07001140 MakeUserPointer(&num_bytes),
Viet-Trung Luu8b1ba572015-09-25 16:29:49 -07001141 MOJO_READ_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001142 // Note: Count on still being able to do the contiguous read here.
1143 ASSERT_EQ(2u, num_bytes);
1144
1145 // Discarding right now should fail.
1146 num_bytes = 1;
1147 EXPECT_EQ(MOJO_RESULT_BUSY,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001148 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
James Robinson646469d2014-10-03 15:33:28 -07001149 MOJO_READ_DATA_FLAG_DISCARD));
1150
1151 // Actually check our data and end the two-phase read.
1152 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[0]);
1153 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[1]);
1154 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u));
1155
1156 // Consumer should now be no longer readable.
1157 hss = kFullMojoHandleSignalsState;
1158 EXPECT_EQ(
1159 MOJO_RESULT_DEADLINE_EXCEEDED,
1160 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1161 EXPECT_EQ(0u, hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001162 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1163 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001164 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001165
1166 // TODO(vtl): More.
1167
1168 // Close the producer.
1169 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
1170
1171 // The consumer should now be never-readable.
1172 hss = kFullMojoHandleSignalsState;
1173 EXPECT_EQ(
1174 MOJO_RESULT_FAILED_PRECONDITION,
1175 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
Benjamin Lerman33c84782014-11-27 10:07:33 +01001176 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
1177 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001178
1179 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
1180}
1181
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001182TEST_F(CoreTest, DataPipeSetGetConsumerOptions) {
1183 MojoCreateDataPipeOptions options = {
1184 sizeof(MojoCreateDataPipeOptions), // |struct_size|.
1185 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
1186 8, // |element_num_bytes|.
1187 800 // |capacity_num_bytes|.
1188 };
1189 MojoHandle ph, ch; // p is for producer and c is for consumer.
1190
1191 EXPECT_EQ(MOJO_RESULT_OK,
1192 core()->CreateDataPipe(MakeUserPointer(&options),
1193 MakeUserPointer(&ph), MakeUserPointer(&ch)));
1194 // Should get two distinct, valid handles.
1195 EXPECT_NE(ph, MOJO_HANDLE_INVALID);
1196 EXPECT_NE(ch, MOJO_HANDLE_INVALID);
1197 EXPECT_NE(ph, ch);
1198
1199 // Read it.
1200 MojoDataPipeConsumerOptions copts = {};
1201 const uint32_t kCoptsSize = static_cast<uint32_t>(sizeof(copts));
1202 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1203 ch, MakeUserPointer(&copts), kCoptsSize));
1204 EXPECT_EQ(kCoptsSize, copts.struct_size);
1205 EXPECT_EQ(0u, copts.read_threshold_num_bytes);
1206
1207 // Invalid read threshold.
1208 copts.struct_size = kCoptsSize;
1209 copts.read_threshold_num_bytes = 4;
1210 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
1211 core()->SetDataPipeConsumerOptions(ch, MakeUserPointer(&copts)));
1212 // The options shouldn't change.
1213 copts = MojoDataPipeConsumerOptions();
1214 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1215 ch, MakeUserPointer(&copts), kCoptsSize));
1216 EXPECT_EQ(kCoptsSize, copts.struct_size);
1217 EXPECT_EQ(0u, copts.read_threshold_num_bytes);
1218
1219 // Valid read threshold.
1220 copts.struct_size = kCoptsSize;
1221 copts.read_threshold_num_bytes = 8;
1222 EXPECT_EQ(MOJO_RESULT_OK,
1223 core()->SetDataPipeConsumerOptions(ch, MakeUserPointer(&copts)));
1224 copts = MojoDataPipeConsumerOptions();
1225 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1226 ch, MakeUserPointer(&copts), kCoptsSize));
1227 EXPECT_EQ(kCoptsSize, copts.struct_size);
1228 EXPECT_EQ(8u, copts.read_threshold_num_bytes);
1229
1230 // Invalid read threshold.
1231 copts.struct_size = kCoptsSize;
1232 copts.read_threshold_num_bytes = 9;
1233 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
1234 core()->SetDataPipeConsumerOptions(ch, MakeUserPointer(&copts)));
1235 // The options shouldn't change.
1236 copts = MojoDataPipeConsumerOptions();
1237 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1238 ch, MakeUserPointer(&copts), kCoptsSize));
1239 EXPECT_EQ(kCoptsSize, copts.struct_size);
1240 EXPECT_EQ(8u, copts.read_threshold_num_bytes);
1241
1242 // Valid read threshold.
1243 copts.struct_size = kCoptsSize;
1244 copts.read_threshold_num_bytes = 16;
1245 EXPECT_EQ(MOJO_RESULT_OK,
1246 core()->SetDataPipeConsumerOptions(ch, MakeUserPointer(&copts)));
1247 copts = MojoDataPipeConsumerOptions();
1248 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1249 ch, MakeUserPointer(&copts), kCoptsSize));
1250 EXPECT_EQ(kCoptsSize, copts.struct_size);
1251 EXPECT_EQ(16u, copts.read_threshold_num_bytes);
1252
Viet-Trung Luu833e71a2016-04-05 14:17:48 -07001253 // Can also set to default by passing null.
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001254 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu833e71a2016-04-05 14:17:48 -07001255 core()->SetDataPipeConsumerOptions(ch, NullUserPointer()));
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001256 copts = MojoDataPipeConsumerOptions();
1257 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1258 ch, MakeUserPointer(&copts), kCoptsSize));
1259 EXPECT_EQ(kCoptsSize, copts.struct_size);
1260 // Note: Should be reported as 0 ("default"), even if it means the element
1261 // struct_size.
1262 EXPECT_EQ(0u, copts.read_threshold_num_bytes);
1263
1264 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
1265 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
1266}
1267
James Robinson646469d2014-10-03 15:33:28 -07001268// Tests passing data pipe producer and consumer handles.
1269TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
1270 const char kHello[] = "hello";
1271 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
1272 const char kWorld[] = "world!!!";
1273 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
1274 char buffer[100];
1275 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
1276 uint32_t num_bytes;
1277 MojoHandle handles[10];
1278 uint32_t num_handles;
1279 MojoHandleSignalsState hss;
1280
1281 MojoHandle h_passing[2];
1282 EXPECT_EQ(MOJO_RESULT_OK,
1283 core()->CreateMessagePipe(NullUserPointer(),
1284 MakeUserPointer(&h_passing[0]),
1285 MakeUserPointer(&h_passing[1])));
1286
1287 MojoHandle ph, ch;
1288 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001289 core()->CreateDataPipe(NullUserPointer(), MakeUserPointer(&ph),
1290 MakeUserPointer(&ch)));
James Robinson646469d2014-10-03 15:33:28 -07001291
1292 // Send |ch| from |h_passing[0]| to |h_passing[1]|.
1293 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001294 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
1295 kHelloSize, MakeUserPointer(&ch), 1,
James Robinson646469d2014-10-03 15:33:28 -07001296 MOJO_WRITE_MESSAGE_FLAG_NONE));
1297 hss = kEmptyMojoHandleSignalsState;
1298 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001299 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001300 MakeUserPointer(&hss)));
1301 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1302 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001303 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1304 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1305 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001306 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -07001307 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -07001308 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001309 core()->ReadMessage(
1310 h_passing[1], UserPointer<void>(buffer),
1311 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
1312 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001313 EXPECT_EQ(kHelloSize, num_bytes);
1314 EXPECT_STREQ(kHello, buffer);
1315 EXPECT_EQ(1u, num_handles);
1316 MojoHandle ch_received = handles[0];
1317 EXPECT_NE(ch_received, MOJO_HANDLE_INVALID);
1318 EXPECT_NE(ch_received, h_passing[0]);
1319 EXPECT_NE(ch_received, h_passing[1]);
1320 EXPECT_NE(ch_received, ph);
1321
1322 // Note: We rely on the Mojo system not re-using handle values very often.
1323 EXPECT_NE(ch_received, ch);
1324
1325 // |ch| should no longer be valid; check that trying to close it fails. See
1326 // above note.
1327 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch));
1328
1329 // Write to |ph|. Should receive on |ch_received|.
1330 num_bytes = kWorldSize;
1331 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001332 core()->WriteData(ph, UserPointer<const void>(kWorld),
James Robinson646469d2014-10-03 15:33:28 -07001333 MakeUserPointer(&num_bytes),
1334 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
1335 hss = kEmptyMojoHandleSignalsState;
1336 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001337 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001338 MakeUserPointer(&hss)));
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001339 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
1340 hss.satisfied_signals);
1341 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1342 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001343 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001344 num_bytes = kBufferSize;
1345 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001346 core()->ReadData(ch_received, UserPointer<void>(buffer),
James Robinson646469d2014-10-03 15:33:28 -07001347 MakeUserPointer(&num_bytes),
1348 MOJO_READ_MESSAGE_FLAG_NONE));
1349 EXPECT_EQ(kWorldSize, num_bytes);
1350 EXPECT_STREQ(kWorld, buffer);
1351
1352 // Now pass |ph| in the same direction.
1353 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001354 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld),
1355 kWorldSize, MakeUserPointer(&ph), 1,
James Robinson646469d2014-10-03 15:33:28 -07001356 MOJO_WRITE_MESSAGE_FLAG_NONE));
1357 hss = kEmptyMojoHandleSignalsState;
1358 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001359 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001360 MakeUserPointer(&hss)));
1361 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1362 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001363 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1364 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1365 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001366 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -07001367 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -07001368 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001369 core()->ReadMessage(
1370 h_passing[1], UserPointer<void>(buffer),
1371 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
1372 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001373 EXPECT_EQ(kWorldSize, num_bytes);
1374 EXPECT_STREQ(kWorld, buffer);
1375 EXPECT_EQ(1u, num_handles);
1376 MojoHandle ph_received = handles[0];
1377 EXPECT_NE(ph_received, MOJO_HANDLE_INVALID);
1378 EXPECT_NE(ph_received, h_passing[0]);
1379 EXPECT_NE(ph_received, h_passing[1]);
1380 EXPECT_NE(ph_received, ch_received);
1381
1382 // Again, rely on the Mojo system not re-using handle values very often.
1383 EXPECT_NE(ph_received, ph);
1384
1385 // |ph| should no longer be valid; check that trying to close it fails. See
1386 // above note.
1387 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph));
1388
1389 // Write to |ph_received|. Should receive on |ch_received|.
1390 num_bytes = kHelloSize;
1391 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001392 core()->WriteData(ph_received, UserPointer<const void>(kHello),
James Robinson646469d2014-10-03 15:33:28 -07001393 MakeUserPointer(&num_bytes),
1394 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
1395 hss = kEmptyMojoHandleSignalsState;
1396 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001397 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001398 MakeUserPointer(&hss)));
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001399 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
1400 hss.satisfied_signals);
1401 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1402 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001403 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001404 num_bytes = kBufferSize;
1405 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001406 core()->ReadData(ch_received, UserPointer<void>(buffer),
James Robinson646469d2014-10-03 15:33:28 -07001407 MakeUserPointer(&num_bytes),
1408 MOJO_READ_MESSAGE_FLAG_NONE));
1409 EXPECT_EQ(kHelloSize, num_bytes);
1410 EXPECT_STREQ(kHello, buffer);
1411
1412 ph = ph_received;
1413 ph_received = MOJO_HANDLE_INVALID;
1414 ch = ch_received;
1415 ch_received = MOJO_HANDLE_INVALID;
1416
1417 // Make sure that |ph| can't be sent if it's in a two-phase write.
1418 void* write_ptr = nullptr;
1419 num_bytes = 0;
1420 ASSERT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001421 core()->BeginWriteData(ph, MakeUserPointer(&write_ptr),
James Robinson646469d2014-10-03 15:33:28 -07001422 MakeUserPointer(&num_bytes),
1423 MOJO_WRITE_DATA_FLAG_NONE));
1424 ASSERT_GE(num_bytes, 1u);
1425 EXPECT_EQ(MOJO_RESULT_BUSY,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001426 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
1427 kHelloSize, MakeUserPointer(&ph), 1,
James Robinson646469d2014-10-03 15:33:28 -07001428 MOJO_WRITE_MESSAGE_FLAG_NONE));
1429
1430 // But |ch| can, even if |ph| is in a two-phase write.
1431 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001432 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
1433 kHelloSize, MakeUserPointer(&ch), 1,
James Robinson646469d2014-10-03 15:33:28 -07001434 MOJO_WRITE_MESSAGE_FLAG_NONE));
1435 ch = MOJO_HANDLE_INVALID;
1436 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001437 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001438 NullUserPointer()));
1439 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -07001440 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -07001441 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001442 core()->ReadMessage(
1443 h_passing[1], UserPointer<void>(buffer),
1444 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
1445 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001446 EXPECT_EQ(kHelloSize, num_bytes);
1447 EXPECT_STREQ(kHello, buffer);
1448 EXPECT_EQ(1u, num_handles);
1449 ch = handles[0];
1450 EXPECT_NE(ch, MOJO_HANDLE_INVALID);
1451
1452 // Complete the two-phase write.
1453 static_cast<char*>(write_ptr)[0] = 'x';
1454 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1));
1455
1456 // Wait for |ch| to be readable.
1457 hss = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001458 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE,
1459 1000000000, MakeUserPointer(&hss)));
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001460 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
1461 hss.satisfied_signals);
1462 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1463 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001464 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001465
1466 // Make sure that |ch| can't be sent if it's in a two-phase read.
1467 const void* read_ptr = nullptr;
1468 num_bytes = 1;
1469 ASSERT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001470 core()->BeginReadData(ch, MakeUserPointer(&read_ptr),
James Robinson646469d2014-10-03 15:33:28 -07001471 MakeUserPointer(&num_bytes),
Viet-Trung Luu8b1ba572015-09-25 16:29:49 -07001472 MOJO_READ_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001473 EXPECT_EQ(MOJO_RESULT_BUSY,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001474 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
1475 kHelloSize, MakeUserPointer(&ch), 1,
James Robinson646469d2014-10-03 15:33:28 -07001476 MOJO_WRITE_MESSAGE_FLAG_NONE));
1477
1478 // But |ph| can, even if |ch| is in a two-phase read.
1479 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001480 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld),
1481 kWorldSize, MakeUserPointer(&ph), 1,
James Robinson646469d2014-10-03 15:33:28 -07001482 MOJO_WRITE_MESSAGE_FLAG_NONE));
1483 ph = MOJO_HANDLE_INVALID;
1484 hss = kEmptyMojoHandleSignalsState;
1485 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001486 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001487 MakeUserPointer(&hss)));
1488 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1489 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001490 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1491 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1492 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001493 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -07001494 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -07001495 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001496 core()->ReadMessage(
1497 h_passing[1], UserPointer<void>(buffer),
1498 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
1499 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001500 EXPECT_EQ(kWorldSize, num_bytes);
1501 EXPECT_STREQ(kWorld, buffer);
1502 EXPECT_EQ(1u, num_handles);
1503 ph = handles[0];
1504 EXPECT_NE(ph, MOJO_HANDLE_INVALID);
1505
1506 // Complete the two-phase read.
1507 EXPECT_EQ('x', static_cast<const char*>(read_ptr)[0]);
1508 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 1));
1509
1510 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0]));
1511 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1]));
1512 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
1513 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
1514}
1515
Hajime Morrita7ab59802014-12-12 15:30:26 -08001516struct TestAsyncWaiter {
1517 TestAsyncWaiter() : result(MOJO_RESULT_UNKNOWN) {}
1518
1519 void Awake(MojoResult r) { result = r; }
1520
1521 MojoResult result;
1522};
1523
1524TEST_F(CoreTest, AsyncWait) {
1525 TestAsyncWaiter waiter;
1526 MockHandleInfo info;
1527 MojoHandle h = CreateMockHandle(&info);
1528
1529 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luude5aba42015-11-10 17:06:17 -08001530 core()->AsyncWait(
1531 h, MOJO_HANDLE_SIGNAL_READABLE,
1532 [&waiter](MojoResult result) { waiter.Awake(result); }));
Hajime Morrita7ab59802014-12-12 15:30:26 -08001533 EXPECT_EQ(0u, info.GetAddedAwakableSize());
1534
1535 info.AllowAddAwakable(true);
Viet-Trung Luude5aba42015-11-10 17:06:17 -08001536 EXPECT_EQ(MOJO_RESULT_OK, core()->AsyncWait(h, MOJO_HANDLE_SIGNAL_READABLE,
1537 [&waiter](MojoResult result) {
1538 waiter.Awake(result);
1539 }));
Hajime Morrita7ab59802014-12-12 15:30:26 -08001540 EXPECT_EQ(1u, info.GetAddedAwakableSize());
1541
Viet-Trung Luu99579a22014-12-12 17:23:11 -08001542 EXPECT_FALSE(info.GetAddedAwakableAt(0)->Awake(MOJO_RESULT_BUSY, 0));
Hajime Morrita7ab59802014-12-12 15:30:26 -08001543 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result);
1544
1545 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
1546}
1547
James Robinson646469d2014-10-03 15:33:28 -07001548// TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|.
1549
1550} // namespace
1551} // namespace system
1552} // namespace mojo