blob: 005dede1c62d15160a4dc3f8205f2c0701faf8d2 [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
Viet-Trung Luue5ace232016-05-19 14:54:48 -070023const MojoHandleRights kDefaultMessagePipeHandleRights =
24 MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
25 MOJO_HANDLE_RIGHT_WRITE | MOJO_HANDLE_RIGHT_GET_OPTIONS |
26 MOJO_HANDLE_RIGHT_SET_OPTIONS;
27const MojoHandleRights kDefaultDataPipeProducerHandleRights =
28 MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_WRITE |
29 MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
30const MojoHandleRights kDefaultDataPipeConsumerHandleRights =
31 MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ |
32 MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS;
33
James Robinson646469d2014-10-03 15:33:28 -070034const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u};
35const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u};
36
Viet-Trung Luu9acf1aa2015-05-22 11:24:40 -070037using CoreTest = test::CoreTestBase;
James Robinson646469d2014-10-03 15:33:28 -070038
39TEST_F(CoreTest, GetTimeTicksNow) {
40 const MojoTimeTicks start = core()->GetTimeTicksNow();
41 EXPECT_NE(static_cast<MojoTimeTicks>(0), start)
42 << "GetTimeTicksNow should return nonzero value";
Viet-Trung Luu25fa8922016-01-26 16:32:06 -080043 ThreadSleep(test::DeadlineFromMilliseconds(15u));
James Robinson646469d2014-10-03 15:33:28 -070044 const MojoTimeTicks finish = core()->GetTimeTicksNow();
45 // Allow for some fuzz in sleep.
46 EXPECT_GE((finish - start), static_cast<MojoTimeTicks>(8000))
47 << "Sleeping should result in increasing time ticks";
48}
49
50TEST_F(CoreTest, Basic) {
51 MockHandleInfo info;
52
53 EXPECT_EQ(0u, info.GetCtorCallCount());
54 MojoHandle h = CreateMockHandle(&info);
55 EXPECT_EQ(1u, info.GetCtorCallCount());
56 EXPECT_NE(h, MOJO_HANDLE_INVALID);
57
Viet-Trung Luue5ace232016-05-19 14:54:48 -070058 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -070059 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h, MakeUserPointer(&rights)));
60 EXPECT_EQ(kDefaultMockHandleRights, rights);
61
Viet-Trung Luu11b99342016-05-23 12:13:23 -070062 MojoHandle h_dup = MOJO_HANDLE_INVALID;
63 EXPECT_EQ(MOJO_RESULT_OK,
64 core()->DuplicateHandleWithReducedRights(
65 h, MOJO_HANDLE_RIGHT_DUPLICATE, MakeUserPointer(&h_dup)));
66 EXPECT_EQ(1u, info.GetDuplicateDispatcherCallCount());
67 EXPECT_NE(h_dup, MOJO_HANDLE_INVALID);
68 EXPECT_NE(h_dup, h);
69 rights = MOJO_HANDLE_RIGHT_NONE;
70 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h_dup, MakeUserPointer(&rights)));
71 EXPECT_EQ(kDefaultMockHandleRights & ~MOJO_HANDLE_RIGHT_DUPLICATE, rights);
72 MojoHandle h_denied = MOJO_HANDLE_INVALID;
73 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED,
74 core()->DuplicateHandleWithReducedRights(
75 h_dup, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied)));
76 EXPECT_EQ(1u, info.GetDuplicateDispatcherCallCount());
77 EXPECT_EQ(MOJO_HANDLE_INVALID, h_denied);
78
79 EXPECT_EQ(0u, info.GetDtorCallCount());
80 EXPECT_EQ(0u, info.GetCloseCallCount());
81 EXPECT_EQ(0u, info.GetCancelAllAwakablesCallCount());
82 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_dup));
83 EXPECT_EQ(1u, info.GetDtorCallCount());
84 EXPECT_EQ(1u, info.GetCloseCallCount());
85 EXPECT_EQ(1u, info.GetCancelAllAwakablesCallCount());
86
James Robinson646469d2014-10-03 15:33:28 -070087 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
88 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -080089 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 0,
James Robinson646469d2014-10-03 15:33:28 -070090 MOJO_WRITE_MESSAGE_FLAG_NONE));
91 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
92
93 EXPECT_EQ(0u, info.GetReadMessageCallCount());
94 uint32_t num_bytes = 0;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -080095 EXPECT_EQ(
96 MOJO_RESULT_OK,
97 core()->ReadMessage(h, NullUserPointer(), MakeUserPointer(&num_bytes),
98 NullUserPointer(), NullUserPointer(),
99 MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700100 EXPECT_EQ(1u, info.GetReadMessageCallCount());
101 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800102 core()->ReadMessage(h, NullUserPointer(), NullUserPointer(),
103 NullUserPointer(), NullUserPointer(),
James Robinson646469d2014-10-03 15:33:28 -0700104 MOJO_READ_MESSAGE_FLAG_NONE));
105 EXPECT_EQ(2u, info.GetReadMessageCallCount());
106
107 EXPECT_EQ(0u, info.GetWriteDataCallCount());
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800108 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
109 core()->WriteData(h, NullUserPointer(), NullUserPointer(),
110 MOJO_WRITE_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700111 EXPECT_EQ(1u, info.GetWriteDataCallCount());
112
113 EXPECT_EQ(0u, info.GetBeginWriteDataCallCount());
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800114 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
115 core()->BeginWriteData(h, NullUserPointer(), NullUserPointer(),
116 MOJO_WRITE_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700117 EXPECT_EQ(1u, info.GetBeginWriteDataCallCount());
118
119 EXPECT_EQ(0u, info.GetEndWriteDataCallCount());
120 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndWriteData(h, 0));
121 EXPECT_EQ(1u, info.GetEndWriteDataCallCount());
122
123 EXPECT_EQ(0u, info.GetReadDataCallCount());
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800124 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
125 core()->ReadData(h, NullUserPointer(), NullUserPointer(),
126 MOJO_READ_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700127 EXPECT_EQ(1u, info.GetReadDataCallCount());
128
129 EXPECT_EQ(0u, info.GetBeginReadDataCallCount());
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800130 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
131 core()->BeginReadData(h, NullUserPointer(), NullUserPointer(),
132 MOJO_READ_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700133 EXPECT_EQ(1u, info.GetBeginReadDataCallCount());
134
135 EXPECT_EQ(0u, info.GetEndReadDataCallCount());
136 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0));
137 EXPECT_EQ(1u, info.GetEndReadDataCallCount());
138
Viet-Trung Luu1484e832016-03-08 14:08:48 -0800139 EXPECT_EQ(0u, info.GetDuplicateBufferHandleCallCount());
140 EXPECT_EQ(
141 MOJO_RESULT_UNIMPLEMENTED,
142 core()->DuplicateBufferHandle(h, NullUserPointer(), NullUserPointer()));
143 EXPECT_EQ(1u, info.GetDuplicateBufferHandleCallCount());
144
145 EXPECT_EQ(0u, info.GetGetBufferInformationCallCount());
146 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
147 core()->GetBufferInformation(h, NullUserPointer(), 0));
148 EXPECT_EQ(1u, info.GetGetBufferInformationCallCount());
149
150 EXPECT_EQ(0u, info.GetMapBufferCallCount());
151 EXPECT_EQ(
152 MOJO_RESULT_UNIMPLEMENTED,
153 core()->MapBuffer(h, 0, 0, NullUserPointer(), MOJO_MAP_BUFFER_FLAG_NONE));
154 EXPECT_EQ(1u, info.GetMapBufferCallCount());
155
Hajime Morrita096decd2014-12-03 16:17:52 -0800156 EXPECT_EQ(0u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700157 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800158 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE,
James Robinson646469d2014-10-03 15:33:28 -0700159 NullUserPointer()));
Hajime Morrita096decd2014-12-03 16:17:52 -0800160 EXPECT_EQ(1u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700161 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
162 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0, NullUserPointer()));
Hajime Morrita096decd2014-12-03 16:17:52 -0800163 EXPECT_EQ(2u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700164 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
165 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800166 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE,
James Robinson646469d2014-10-03 15:33:28 -0700167 MakeUserPointer(&hss)));
Hajime Morrita096decd2014-12-03 16:17:52 -0800168 EXPECT_EQ(3u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700169 EXPECT_EQ(0u, hss.satisfied_signals);
170 EXPECT_EQ(0u, hss.satisfiable_signals);
171 EXPECT_EQ(
172 MOJO_RESULT_FAILED_PRECONDITION,
173 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, NullUserPointer()));
Hajime Morrita096decd2014-12-03 16:17:52 -0800174 EXPECT_EQ(4u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700175 hss = kFullMojoHandleSignalsState;
176 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800177 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000,
178 MakeUserPointer(&hss)));
Hajime Morrita096decd2014-12-03 16:17:52 -0800179 EXPECT_EQ(5u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700180 EXPECT_EQ(0u, hss.satisfied_signals);
181 EXPECT_EQ(0u, hss.satisfiable_signals);
182
183 MojoHandleSignals handle_signals = ~MOJO_HANDLE_SIGNAL_NONE;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800184 EXPECT_EQ(
185 MOJO_RESULT_FAILED_PRECONDITION,
186 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1,
187 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
188 NullUserPointer()));
Hajime Morrita096decd2014-12-03 16:17:52 -0800189 EXPECT_EQ(6u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700190 uint32_t result_index = static_cast<uint32_t>(-1);
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800191 EXPECT_EQ(
192 MOJO_RESULT_FAILED_PRECONDITION,
193 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1,
194 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
195 NullUserPointer()));
Hajime Morrita096decd2014-12-03 16:17:52 -0800196 EXPECT_EQ(7u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700197 EXPECT_EQ(0u, result_index);
198 hss = kFullMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800199 EXPECT_EQ(
200 MOJO_RESULT_FAILED_PRECONDITION,
201 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1,
202 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
203 MakeUserPointer(&hss)));
Hajime Morrita096decd2014-12-03 16:17:52 -0800204 EXPECT_EQ(8u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700205 EXPECT_EQ(0u, hss.satisfied_signals);
206 EXPECT_EQ(0u, hss.satisfiable_signals);
207 result_index = static_cast<uint32_t>(-1);
208 hss = kFullMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800209 EXPECT_EQ(
210 MOJO_RESULT_FAILED_PRECONDITION,
211 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1,
212 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
213 MakeUserPointer(&hss)));
Hajime Morrita096decd2014-12-03 16:17:52 -0800214 EXPECT_EQ(9u, info.GetAddAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700215 EXPECT_EQ(0u, result_index);
216 EXPECT_EQ(0u, hss.satisfied_signals);
217 EXPECT_EQ(0u, hss.satisfiable_signals);
218
Viet-Trung Luu11b99342016-05-23 12:13:23 -0700219 // |h| shares |info| with |h_dup|, which was closed above.
James Robinson646469d2014-10-03 15:33:28 -0700220 EXPECT_EQ(1u, info.GetDtorCallCount());
Viet-Trung Luu11b99342016-05-23 12:13:23 -0700221 EXPECT_EQ(1u, info.GetCloseCallCount());
222 EXPECT_EQ(1u, info.GetCancelAllAwakablesCallCount());
223 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
224 EXPECT_EQ(2u, info.GetDtorCallCount());
225 EXPECT_EQ(2u, info.GetCloseCallCount());
226 EXPECT_EQ(2u, info.GetCancelAllAwakablesCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700227
Hajime Morrita096decd2014-12-03 16:17:52 -0800228 // No awakables should ever have ever been added.
229 EXPECT_EQ(0u, info.GetRemoveAwakableCallCount());
James Robinson646469d2014-10-03 15:33:28 -0700230}
231
232TEST_F(CoreTest, InvalidArguments) {
233 // |Close()|:
234 {
235 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(MOJO_HANDLE_INVALID));
236 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(10));
237 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(1000000000));
238
239 // Test a double-close.
240 MockHandleInfo info;
241 MojoHandle h = CreateMockHandle(&info);
242 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
243 EXPECT_EQ(1u, info.GetCloseCallCount());
244 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h));
245 EXPECT_EQ(1u, info.GetCloseCallCount());
246 }
247
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -0700248 // |GetRights()|:
249 {
Viet-Trung Luue5ace232016-05-19 14:54:48 -0700250 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -0700251 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
252 core()->GetRights(MOJO_HANDLE_INVALID, MakeUserPointer(&rights)));
253 EXPECT_EQ(0u, rights);
254 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
255 core()->GetRights(10, MakeUserPointer(&rights)));
256 EXPECT_EQ(0u, rights);
257 }
258
Viet-Trung Luu11b99342016-05-23 12:13:23 -0700259 // |DuplicateHandleWithReducedRights()|:
260 {
261 MojoHandle h = MOJO_HANDLE_INVALID;
262 EXPECT_EQ(
263 MOJO_RESULT_INVALID_ARGUMENT,
264 core()->DuplicateHandleWithReducedRights(
265 MOJO_HANDLE_INVALID, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h)));
266 EXPECT_EQ(MOJO_HANDLE_INVALID, h);
267 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
268 core()->DuplicateHandleWithReducedRights(
269 10, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h)));
270 EXPECT_EQ(MOJO_HANDLE_INVALID, h);
271 }
272
James Robinson646469d2014-10-03 15:33:28 -0700273 // |Wait()|:
274 {
275 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800276 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE,
277 MOJO_DEADLINE_INDEFINITE, NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700278 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800279 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE,
280 MOJO_DEADLINE_INDEFINITE, NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700281
282 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
283 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800284 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE,
285 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&hss)));
James Robinson646469d2014-10-03 15:33:28 -0700286 // On invalid argument, it shouldn't modify the handle signals state.
287 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
288 hss.satisfied_signals);
289 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
290 hss.satisfiable_signals);
291 hss = kFullMojoHandleSignalsState;
292 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800293 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE,
294 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&hss)));
James Robinson646469d2014-10-03 15:33:28 -0700295 // On invalid argument, it shouldn't modify the handle signals state.
296 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
297 hss.satisfied_signals);
298 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
299 hss.satisfiable_signals);
300 }
301
302 // |WaitMany()|:
303 {
304 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
305 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE,
306 ~MOJO_HANDLE_SIGNAL_NONE};
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800307 EXPECT_EQ(
308 MOJO_RESULT_INVALID_ARGUMENT,
309 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 0,
310 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
311 NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700312 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800313 core()->WaitMany(NullUserPointer(), MakeUserPointer(signals), 0,
314 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
James Robinson646469d2014-10-03 15:33:28 -0700315 NullUserPointer()));
316 // If |num_handles| is invalid, it should leave |result_index| and
317 // |signals_states| alone.
318 // (We use -1 internally; make sure that doesn't leak.)
319 uint32_t result_index = 123;
320 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
321 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800322 core()->WaitMany(NullUserPointer(), MakeUserPointer(signals), 0,
James Robinson646469d2014-10-03 15:33:28 -0700323 MOJO_DEADLINE_INDEFINITE,
324 MakeUserPointer(&result_index),
325 MakeUserPointer(&hss)));
326 EXPECT_EQ(123u, result_index);
327 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
328 hss.satisfied_signals);
329 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
330 hss.satisfiable_signals);
331
332 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800333 core()->WaitMany(MakeUserPointer(handles), NullUserPointer(), 0,
334 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
James Robinson646469d2014-10-03 15:33:28 -0700335 NullUserPointer()));
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800336 EXPECT_EQ(
337 MOJO_RESULT_INVALID_ARGUMENT,
338 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 1,
339 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
340 NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700341 // But if a handle is bad, then it should set |result_index| but still leave
342 // |signals_states| alone.
343 result_index = static_cast<uint32_t>(-1);
344 hss = kFullMojoHandleSignalsState;
345 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800346 core()->WaitMany(
347 MakeUserPointer(handles), MakeUserPointer(signals), 1,
348 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
349 MakeUserPointer(&hss)));
James Robinson646469d2014-10-03 15:33:28 -0700350 EXPECT_EQ(0u, result_index);
351 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
352 hss.satisfied_signals);
353 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
354 hss.satisfiable_signals);
355
356 MockHandleInfo info[2];
357 handles[0] = CreateMockHandle(&info[0]);
358
359 result_index = static_cast<uint32_t>(-1);
360 hss = kFullMojoHandleSignalsState;
361 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800362 core()->WaitMany(
363 MakeUserPointer(handles), MakeUserPointer(signals), 1,
364 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
365 MakeUserPointer(&hss)));
James Robinson646469d2014-10-03 15:33:28 -0700366 EXPECT_EQ(0u, result_index);
367 EXPECT_EQ(0u, hss.satisfied_signals);
368 EXPECT_EQ(0u, hss.satisfiable_signals);
369
370 // On invalid argument, it'll leave |signals_states| alone.
371 result_index = static_cast<uint32_t>(-1);
372 hss = kFullMojoHandleSignalsState;
373 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800374 core()->WaitMany(
375 MakeUserPointer(handles), MakeUserPointer(signals), 2,
376 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
377 MakeUserPointer(&hss)));
James Robinson646469d2014-10-03 15:33:28 -0700378 EXPECT_EQ(1u, result_index);
379 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
380 hss.satisfied_signals);
381 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
382 hss.satisfiable_signals);
383 handles[1] = handles[0] + 1; // Invalid handle.
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800384 EXPECT_EQ(
385 MOJO_RESULT_INVALID_ARGUMENT,
386 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 2,
387 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
388 NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700389 handles[1] = CreateMockHandle(&info[1]);
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800390 EXPECT_EQ(
391 MOJO_RESULT_FAILED_PRECONDITION,
392 core()->WaitMany(MakeUserPointer(handles), MakeUserPointer(signals), 2,
393 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
394 NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700395
396 // TODO(vtl): Test one where we get "failed precondition" only for the
397 // second handle (and the first one is valid to wait on).
398
399 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0]));
400 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1]));
401 }
402
Viet-Trung Luu1484e832016-03-08 14:08:48 -0800403 // |CreateMessagePipe()|:
404 {
405 // Invalid options: unknown flag.
406 const MojoCreateMessagePipeOptions kOptions = {
407 static_cast<uint32_t>(sizeof(MojoCreateMessagePipeOptions)),
408 ~MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_NONE};
409 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
410 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
411 core()->CreateMessagePipe(MakeUserPointer(&kOptions),
412 MakeUserPointer(&handles[0]),
413 MakeUserPointer(&handles[1])));
414 EXPECT_EQ(MOJO_HANDLE_INVALID, handles[0]);
415 EXPECT_EQ(MOJO_HANDLE_INVALID, handles[1]);
416 }
James Robinson646469d2014-10-03 15:33:28 -0700417
418 // |WriteMessage()|:
419 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
420 // |num_handles|.
421 {
422 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800423 core()->WriteMessage(MOJO_HANDLE_INVALID, NullUserPointer(), 0,
424 NullUserPointer(), 0,
James Robinson646469d2014-10-03 15:33:28 -0700425 MOJO_WRITE_MESSAGE_FLAG_NONE));
426
427 MockHandleInfo info;
428 MojoHandle h = CreateMockHandle(&info);
429 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
430
431 // Huge handle count (implausibly big on some systems -- more than can be
432 // stored in a 32-bit address space).
433 // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or
434 // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or
435 // not.
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800436 EXPECT_NE(
437 MOJO_RESULT_OK,
438 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
439 std::numeric_limits<uint32_t>::max(),
440 MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700441 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
442
443 // Huge handle count (plausibly big).
444 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
445 core()->WriteMessage(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800446 h, NullUserPointer(), 0, MakeUserPointer(handles),
James Robinson646469d2014-10-03 15:33:28 -0700447 std::numeric_limits<uint32_t>::max() / sizeof(handles[0]),
448 MOJO_WRITE_MESSAGE_FLAG_NONE));
449 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
450
451 // Invalid handle in |handles|.
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800452 EXPECT_EQ(
453 MOJO_RESULT_INVALID_ARGUMENT,
454 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
455 1, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700456 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
457
458 // Two invalid handles in |handles|.
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800459 EXPECT_EQ(
460 MOJO_RESULT_INVALID_ARGUMENT,
461 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
462 2, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700463 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
464
465 // Can't send a handle over itself.
466 handles[0] = h;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800467 EXPECT_EQ(
468 MOJO_RESULT_BUSY,
469 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
470 1, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700471 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
472
473 MockHandleInfo info2;
474 MojoHandle h2 = CreateMockHandle(&info2);
475
476 // This is "okay", but |MockDispatcher| doesn't implement it.
477 handles[0] = h2;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800478 EXPECT_EQ(
479 MOJO_RESULT_UNIMPLEMENTED,
480 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
481 1, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700482 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
483
484 // One of the |handles| is still invalid.
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800485 EXPECT_EQ(
486 MOJO_RESULT_INVALID_ARGUMENT,
487 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
488 2, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700489 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
490
491 // One of the |handles| is the same as |handle|.
492 handles[1] = h;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800493 EXPECT_EQ(
494 MOJO_RESULT_BUSY,
495 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
496 2, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700497 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
498
499 // Can't send a handle twice in the same message.
500 handles[1] = h2;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800501 EXPECT_EQ(
502 MOJO_RESULT_BUSY,
503 core()->WriteMessage(h, NullUserPointer(), 0, MakeUserPointer(handles),
504 2, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700505 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
506
507 // Note: Since we never successfully sent anything with it, |h2| should
508 // still be valid.
509 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h2));
510
511 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
512 }
513
514 // |ReadMessage()|:
515 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
516 // |num_handles|.
517 {
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800518 EXPECT_EQ(
519 MOJO_RESULT_INVALID_ARGUMENT,
520 core()->ReadMessage(MOJO_HANDLE_INVALID, NullUserPointer(),
521 NullUserPointer(), NullUserPointer(),
522 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700523
524 MockHandleInfo info;
525 MojoHandle h = CreateMockHandle(&info);
526
527 // Okay.
528 uint32_t handle_count = 0;
529 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800530 core()->ReadMessage(
531 h, NullUserPointer(), NullUserPointer(), NullUserPointer(),
532 MakeUserPointer(&handle_count), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700533 // Checked by |Core|, shouldn't go through to the dispatcher.
534 EXPECT_EQ(1u, info.GetReadMessageCallCount());
535
536 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
537 }
Viet-Trung Luu1484e832016-03-08 14:08:48 -0800538
539 // |CreateDataPipe()|:
540 {
541 // Invalid options: unknown flag.
542 const MojoCreateDataPipeOptions kOptions = {
543 static_cast<uint32_t>(sizeof(MojoCreateDataPipeOptions)),
544 ~MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, 1u, 0u};
545 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
546 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
547 core()->CreateDataPipe(MakeUserPointer(&kOptions),
548 MakeUserPointer(&handles[0]),
549 MakeUserPointer(&handles[1])));
550 EXPECT_EQ(MOJO_HANDLE_INVALID, handles[0]);
551 EXPECT_EQ(MOJO_HANDLE_INVALID, handles[1]);
552 }
553
554 // |WriteData()|:
555 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
556 core()->WriteData(MOJO_HANDLE_INVALID, NullUserPointer(),
557 NullUserPointer(), MOJO_WRITE_DATA_FLAG_NONE));
558
559 // |BeginWriteData()|:
560 EXPECT_EQ(
561 MOJO_RESULT_INVALID_ARGUMENT,
562 core()->BeginWriteData(MOJO_HANDLE_INVALID, NullUserPointer(),
563 NullUserPointer(), MOJO_WRITE_DATA_FLAG_NONE));
564
565 // |EndWriteData()|:
566 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
567 core()->EndWriteData(MOJO_HANDLE_INVALID, 0u));
568
569 // |ReadData()|:
570 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
571 core()->ReadData(MOJO_HANDLE_INVALID, NullUserPointer(),
572 NullUserPointer(), MOJO_READ_DATA_FLAG_NONE));
573
574 // |BeginReadData()|:
575 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
576 core()->BeginReadData(MOJO_HANDLE_INVALID, NullUserPointer(),
577 NullUserPointer(), MOJO_READ_DATA_FLAG_NONE));
578
579 // |EndReadData()|:
580 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
581 core()->EndReadData(MOJO_HANDLE_INVALID, 0u));
582
583 // |CreateSharedBuffer()|:
584 {
585 // Invalid options: unknown flag.
586 const MojoCreateSharedBufferOptions kOptions = {
587 static_cast<uint32_t>(sizeof(MojoCreateSharedBufferOptions)),
588 ~MOJO_CREATE_SHARED_BUFFER_OPTIONS_FLAG_NONE};
589 MojoHandle handle = MOJO_HANDLE_INVALID;
590 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
591 core()->CreateSharedBuffer(MakeUserPointer(&kOptions), 4096u,
592 MakeUserPointer(&handle)));
593 EXPECT_EQ(MOJO_HANDLE_INVALID, handle);
594 }
595
596 // |DuplicateBufferHandle()|:
597 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
598 core()->DuplicateBufferHandle(
599 MOJO_HANDLE_INVALID, NullUserPointer(), NullUserPointer()));
600
601 // |GetBufferInformation()|:
602 EXPECT_EQ(
603 MOJO_RESULT_INVALID_ARGUMENT,
604 core()->GetBufferInformation(MOJO_HANDLE_INVALID, NullUserPointer(), 0u));
605
606 // |MapBuffer()|:
607 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
608 core()->MapBuffer(MOJO_HANDLE_INVALID, 0u, 0u, NullUserPointer(),
609 MOJO_MAP_BUFFER_FLAG_NONE));
610
611 // |UnmapBuffer()|:
612 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
613 core()->UnmapBuffer(NullUserPointer()));
James Robinson646469d2014-10-03 15:33:28 -0700614}
615
616// These test invalid arguments that should cause death if we're being paranoid
617// about checking arguments (which we would want to do if, e.g., we were in a
618// true "kernel" situation, but we might not want to do otherwise for
619// performance reasons). Probably blatant errors like passing in null pointers
620// (for required pointer arguments) will still cause death, but perhaps not
621// predictably.
622TEST_F(CoreTest, InvalidArgumentsDeath) {
623 const char kMemoryCheckFailedRegex[] = "Check failed";
624
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -0700625 // |GetRights()|:
626 {
627 MockHandleInfo info;
628 MojoHandle h = CreateMockHandle(&info);
629 EXPECT_DEATH_IF_SUPPORTED(core()->GetRights(h, NullUserPointer()),
630 kMemoryCheckFailedRegex);
631
632 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
633 }
634
Viet-Trung Luu11b99342016-05-23 12:13:23 -0700635 // |DuplicateHandleWithReducedRights()|:
636 {
637 MockHandleInfo info;
638 MojoHandle h = CreateMockHandle(&info);
639 EXPECT_DEATH_IF_SUPPORTED(core()->DuplicateHandleWithReducedRights(
640 h, MOJO_HANDLE_RIGHT_NONE, NullUserPointer()),
641 kMemoryCheckFailedRegex);
642
643 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
644 }
645
James Robinson646469d2014-10-03 15:33:28 -0700646 // |WaitMany()|:
647 {
648 MojoHandle handle = MOJO_HANDLE_INVALID;
649 MojoHandleSignals signals = ~MOJO_HANDLE_SIGNAL_NONE;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800650 EXPECT_DEATH_IF_SUPPORTED(
651 core()->WaitMany(NullUserPointer(), MakeUserPointer(&signals), 1,
652 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
653 NullUserPointer()),
654 kMemoryCheckFailedRegex);
655 EXPECT_DEATH_IF_SUPPORTED(
656 core()->WaitMany(MakeUserPointer(&handle), NullUserPointer(), 1,
657 MOJO_DEADLINE_INDEFINITE, NullUserPointer(),
658 NullUserPointer()),
659 kMemoryCheckFailedRegex);
James Robinson646469d2014-10-03 15:33:28 -0700660 // TODO(vtl): |result_index| and |signals_states| are optional. Test them
661 // with non-null invalid pointers?
662 }
663
664 // |CreateMessagePipe()|:
665 {
666 MojoHandle h;
667 EXPECT_DEATH_IF_SUPPORTED(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800668 core()->CreateMessagePipe(NullUserPointer(), NullUserPointer(),
669 NullUserPointer()),
James Robinson646469d2014-10-03 15:33:28 -0700670 kMemoryCheckFailedRegex);
671 EXPECT_DEATH_IF_SUPPORTED(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800672 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h),
673 NullUserPointer()),
James Robinson646469d2014-10-03 15:33:28 -0700674 kMemoryCheckFailedRegex);
675 EXPECT_DEATH_IF_SUPPORTED(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800676 core()->CreateMessagePipe(NullUserPointer(), NullUserPointer(),
677 MakeUserPointer(&h)),
James Robinson646469d2014-10-03 15:33:28 -0700678 kMemoryCheckFailedRegex);
679 }
680
681 // |WriteMessage()|:
682 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
683 // |num_handles|.
684 {
685 MockHandleInfo info;
686 MojoHandle h = CreateMockHandle(&info);
687
688 // Null |handles| with nonzero |num_handles|.
689 EXPECT_DEATH_IF_SUPPORTED(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800690 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 1,
James Robinson646469d2014-10-03 15:33:28 -0700691 MOJO_WRITE_MESSAGE_FLAG_NONE),
692 kMemoryCheckFailedRegex);
693
694 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
695 }
696
697 // |ReadMessage()|:
698 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
699 // |num_handles|.
700 {
701 MockHandleInfo info;
702 MojoHandle h = CreateMockHandle(&info);
703
704 uint32_t handle_count = 1;
705 EXPECT_DEATH_IF_SUPPORTED(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800706 core()->ReadMessage(h, NullUserPointer(), NullUserPointer(),
707 NullUserPointer(), MakeUserPointer(&handle_count),
James Robinson646469d2014-10-03 15:33:28 -0700708 MOJO_READ_MESSAGE_FLAG_NONE),
709 kMemoryCheckFailedRegex);
710
711 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
712 }
Viet-Trung Luu1484e832016-03-08 14:08:48 -0800713
714 // TODO(vtl): Missing a bunch here.
James Robinson646469d2014-10-03 15:33:28 -0700715}
716
717// TODO(vtl): test |Wait()| and |WaitMany()| properly
718// - including |WaitMany()| with the same handle more than once (with
719// same/different signals)
720
721TEST_F(CoreTest, MessagePipe) {
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -0700722 MojoHandle h[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
James Robinson646469d2014-10-03 15:33:28 -0700723 MojoHandleSignalsState hss[2];
724 uint32_t result_index;
725
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800726 EXPECT_EQ(MOJO_RESULT_OK,
727 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h[0]),
728 MakeUserPointer(&h[1])));
James Robinson646469d2014-10-03 15:33:28 -0700729 // Should get two distinct, valid handles.
730 EXPECT_NE(h[0], MOJO_HANDLE_INVALID);
731 EXPECT_NE(h[1], MOJO_HANDLE_INVALID);
732 EXPECT_NE(h[0], h[1]);
733
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -0700734 // Both should have the correct rights.
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -0700735 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
736 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[0], MakeUserPointer(&rights)));
Viet-Trung Luue5ace232016-05-19 14:54:48 -0700737 EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -0700738 rights = MOJO_HANDLE_RIGHT_NONE;
739 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[1], MakeUserPointer(&rights)));
Viet-Trung Luue5ace232016-05-19 14:54:48 -0700740 EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -0700741
Viet-Trung Luu11b99342016-05-23 12:13:23 -0700742 // Neither should be duplicatable.
743 MojoHandle h_denied = MOJO_HANDLE_INVALID;
744 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED,
745 core()->DuplicateHandleWithReducedRights(
746 h[0], MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied)));
747 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED,
748 core()->DuplicateHandleWithReducedRights(
749 h[1], MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied)));
750 EXPECT_EQ(MOJO_HANDLE_INVALID, h_denied);
751
James Robinson646469d2014-10-03 15:33:28 -0700752 // Neither should be readable.
753 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
754 MOJO_HANDLE_SIGNAL_READABLE};
755 result_index = static_cast<uint32_t>(-1);
756 hss[0] = kEmptyMojoHandleSignalsState;
757 hss[1] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800758 EXPECT_EQ(
759 MOJO_RESULT_DEADLINE_EXCEEDED,
760 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 0,
761 MakeUserPointer(&result_index), MakeUserPointer(hss)));
James Robinson646469d2014-10-03 15:33:28 -0700762 EXPECT_EQ(static_cast<uint32_t>(-1), result_index);
763 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700764 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
765 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
766 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700767 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700768 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
769 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
770 hss[1].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700771
772 // Try to read anyway.
773 char buffer[1] = {'a'};
774 uint32_t buffer_size = 1;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800775 EXPECT_EQ(
776 MOJO_RESULT_SHOULD_WAIT,
777 core()->ReadMessage(h[0], UserPointer<void>(buffer),
778 MakeUserPointer(&buffer_size), NullUserPointer(),
779 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700780 // Check that it left its inputs alone.
781 EXPECT_EQ('a', buffer[0]);
782 EXPECT_EQ(1u, buffer_size);
783
784 // Both should be writable.
785 hss[0] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800786 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[0], MOJO_HANDLE_SIGNAL_WRITABLE,
787 1000000000, MakeUserPointer(&hss[0])));
James Robinson646469d2014-10-03 15:33:28 -0700788 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700789 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
790 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
791 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700792 hss[0] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800793 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE,
794 1000000000, MakeUserPointer(&hss[0])));
James Robinson646469d2014-10-03 15:33:28 -0700795 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700796 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
797 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
798 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700799
800 // Also check that |h[1]| is writable using |WaitMany()|.
801 signals[0] = MOJO_HANDLE_SIGNAL_READABLE;
802 signals[1] = MOJO_HANDLE_SIGNAL_WRITABLE;
803 result_index = static_cast<uint32_t>(-1);
804 hss[0] = kEmptyMojoHandleSignalsState;
805 hss[1] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800806 EXPECT_EQ(
807 MOJO_RESULT_OK,
808 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2,
809 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
810 MakeUserPointer(hss)));
James Robinson646469d2014-10-03 15:33:28 -0700811 EXPECT_EQ(1u, result_index);
812 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700813 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
814 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
815 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700816 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700817 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
818 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
819 hss[1].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700820
821 // Write to |h[1]|.
822 buffer[0] = 'b';
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800823 EXPECT_EQ(
824 MOJO_RESULT_OK,
825 core()->WriteMessage(h[1], UserPointer<const void>(buffer), 1,
826 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700827
828 // Check that |h[0]| is now readable.
829 signals[0] = MOJO_HANDLE_SIGNAL_READABLE;
830 signals[1] = MOJO_HANDLE_SIGNAL_READABLE;
831 result_index = static_cast<uint32_t>(-1);
832 hss[0] = kEmptyMojoHandleSignalsState;
833 hss[1] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800834 EXPECT_EQ(
835 MOJO_RESULT_OK,
836 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2,
837 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index),
838 MakeUserPointer(hss)));
James Robinson646469d2014-10-03 15:33:28 -0700839 EXPECT_EQ(0u, result_index);
840 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
841 hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700842 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
843 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
844 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700845 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700846 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
847 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
848 hss[1].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700849
850 // Read from |h[0]|.
851 // First, get only the size.
852 buffer_size = 0;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800853 EXPECT_EQ(
854 MOJO_RESULT_RESOURCE_EXHAUSTED,
855 core()->ReadMessage(h[0], NullUserPointer(),
856 MakeUserPointer(&buffer_size), NullUserPointer(),
857 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700858 EXPECT_EQ(1u, buffer_size);
859 // Then actually read it.
860 buffer[0] = 'c';
861 buffer_size = 1;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800862 EXPECT_EQ(
863 MOJO_RESULT_OK,
864 core()->ReadMessage(h[0], UserPointer<void>(buffer),
865 MakeUserPointer(&buffer_size), NullUserPointer(),
866 NullUserPointer(), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700867 EXPECT_EQ('b', buffer[0]);
868 EXPECT_EQ(1u, buffer_size);
869
870 // |h[0]| should no longer be readable.
871 hss[0] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800872 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
873 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_READABLE, 0,
874 MakeUserPointer(&hss[0])));
James Robinson646469d2014-10-03 15:33:28 -0700875 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700876 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
877 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
878 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700879
880 // Write to |h[0]|.
881 buffer[0] = 'd';
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800882 EXPECT_EQ(
883 MOJO_RESULT_OK,
884 core()->WriteMessage(h[0], UserPointer<const void>(buffer), 1,
885 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700886
887 // Close |h[0]|.
888 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0]));
889
890 // Check that |h[1]| is no longer writable (and will never be).
891 hss[0] = kEmptyMojoHandleSignalsState;
892 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800893 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -0700894 MakeUserPointer(&hss[0])));
Benjamin Lerman33c84782014-11-27 10:07:33 +0100895 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
896 hss[0].satisfied_signals);
897 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
898 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700899
900 // Check that |h[1]| is still readable (for the moment).
901 hss[0] = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800902 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE,
903 1000000000, MakeUserPointer(&hss[0])));
Benjamin Lerman33c84782014-11-27 10:07:33 +0100904 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
905 hss[0].satisfied_signals);
906 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
907 hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700908
909 // Discard a message from |h[1]|.
910 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800911 core()->ReadMessage(h[1], NullUserPointer(), NullUserPointer(),
912 NullUserPointer(), NullUserPointer(),
James Robinson646469d2014-10-03 15:33:28 -0700913 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD));
914
915 // |h[1]| is no longer readable (and will never be).
916 hss[0] = kFullMojoHandleSignalsState;
917 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800918 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -0700919 MakeUserPointer(&hss[0])));
Benjamin Lerman33c84782014-11-27 10:07:33 +0100920 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[0].satisfied_signals);
921 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss[0].satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700922
923 // Try writing to |h[1]|.
924 buffer[0] = 'e';
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800925 EXPECT_EQ(
926 MOJO_RESULT_FAILED_PRECONDITION,
927 core()->WriteMessage(h[1], UserPointer<const void>(buffer), 1,
928 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700929
930 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1]));
931}
932
933// Tests passing a message pipe handle.
934TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
935 const char kHello[] = "hello";
936 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
937 const char kWorld[] = "world!!!";
938 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
939 char buffer[100];
940 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
941 uint32_t num_bytes;
942 MojoHandle handles[10];
943 uint32_t num_handles;
944 MojoHandleSignalsState hss;
945 MojoHandle h_received;
946
947 MojoHandle h_passing[2];
948 EXPECT_EQ(MOJO_RESULT_OK,
949 core()->CreateMessagePipe(NullUserPointer(),
950 MakeUserPointer(&h_passing[0]),
951 MakeUserPointer(&h_passing[1])));
952
953 // Make sure that |h_passing[]| work properly.
954 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800955 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
956 kHelloSize, NullUserPointer(), 0,
James Robinson646469d2014-10-03 15:33:28 -0700957 MOJO_WRITE_MESSAGE_FLAG_NONE));
958 hss = kEmptyMojoHandleSignalsState;
959 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800960 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -0700961 MakeUserPointer(&hss)));
962 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
963 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -0700964 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
965 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
966 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -0700967 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -0700968 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -0700969 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800970 core()->ReadMessage(
971 h_passing[1], UserPointer<void>(buffer),
972 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
973 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700974 EXPECT_EQ(kHelloSize, num_bytes);
975 EXPECT_STREQ(kHello, buffer);
976 EXPECT_EQ(0u, num_handles);
977
Viet-Trung Luu406a5c12016-05-03 13:27:24 -0700978 // Make sure that you can't pass a message pipe handle over itself.
James Robinson646469d2014-10-03 15:33:28 -0700979 EXPECT_EQ(MOJO_RESULT_BUSY,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800980 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
981 kHelloSize, MakeUserPointer(&h_passing[0]), 1,
James Robinson646469d2014-10-03 15:33:28 -0700982 MOJO_WRITE_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -0700983
984 MojoHandle h_passed[2];
985 EXPECT_EQ(MOJO_RESULT_OK,
986 core()->CreateMessagePipe(NullUserPointer(),
987 MakeUserPointer(&h_passed[0]),
988 MakeUserPointer(&h_passed[1])));
989
990 // Make sure that |h_passed[]| work properly.
991 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800992 core()->WriteMessage(h_passed[0], UserPointer<const void>(kHello),
993 kHelloSize, NullUserPointer(), 0,
James Robinson646469d2014-10-03 15:33:28 -0700994 MOJO_WRITE_MESSAGE_FLAG_NONE));
995 hss = kEmptyMojoHandleSignalsState;
996 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -0800997 core()->Wait(h_passed[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -0700998 MakeUserPointer(&hss)));
999 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1000 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001001 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1002 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1003 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001004 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -07001005 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -07001006 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001007 core()->ReadMessage(
1008 h_passed[1], UserPointer<void>(buffer),
1009 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
1010 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001011 EXPECT_EQ(kHelloSize, num_bytes);
1012 EXPECT_STREQ(kHello, buffer);
1013 EXPECT_EQ(0u, num_handles);
1014
1015 // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|.
1016 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001017 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld),
1018 kWorldSize, MakeUserPointer(&h_passed[1]), 1,
James Robinson646469d2014-10-03 15:33:28 -07001019 MOJO_WRITE_MESSAGE_FLAG_NONE));
1020 hss = kEmptyMojoHandleSignalsState;
1021 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001022 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001023 MakeUserPointer(&hss)));
1024 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1025 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001026 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1027 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1028 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001029 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -07001030 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -07001031 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001032 core()->ReadMessage(
1033 h_passing[1], UserPointer<void>(buffer),
1034 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
1035 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001036 EXPECT_EQ(kWorldSize, num_bytes);
1037 EXPECT_STREQ(kWorld, buffer);
1038 EXPECT_EQ(1u, num_handles);
1039 h_received = handles[0];
1040 EXPECT_NE(h_received, MOJO_HANDLE_INVALID);
1041 EXPECT_NE(h_received, h_passing[0]);
1042 EXPECT_NE(h_received, h_passing[1]);
1043 EXPECT_NE(h_received, h_passed[0]);
1044
1045 // Note: We rely on the Mojo system not re-using handle values very often.
1046 EXPECT_NE(h_received, h_passed[1]);
1047
1048 // |h_passed[1]| should no longer be valid; check that trying to close it
1049 // fails. See above note.
1050 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1]));
1051
Viet-Trung Luue5ace232016-05-19 14:54:48 -07001052 // Check that |h_received| still has the expected rights.
1053 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
1054 EXPECT_EQ(MOJO_RESULT_OK,
1055 core()->GetRights(h_received, MakeUserPointer(&rights)));
1056 EXPECT_EQ(kDefaultMessagePipeHandleRights, rights);
1057
James Robinson646469d2014-10-03 15:33:28 -07001058 // Write to |h_passed[0]|. Should receive on |h_received|.
1059 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001060 core()->WriteMessage(h_passed[0], UserPointer<const void>(kHello),
1061 kHelloSize, NullUserPointer(), 0,
James Robinson646469d2014-10-03 15:33:28 -07001062 MOJO_WRITE_MESSAGE_FLAG_NONE));
1063 hss = kEmptyMojoHandleSignalsState;
1064 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001065 core()->Wait(h_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001066 MakeUserPointer(&hss)));
1067 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1068 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001069 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1070 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1071 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001072 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -07001073 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -07001074 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001075 core()->ReadMessage(
1076 h_received, UserPointer<void>(buffer),
1077 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
1078 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001079 EXPECT_EQ(kHelloSize, num_bytes);
1080 EXPECT_STREQ(kHello, buffer);
1081 EXPECT_EQ(0u, num_handles);
1082
1083 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0]));
1084 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1]));
1085 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0]));
1086 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received));
1087}
1088
1089TEST_F(CoreTest, DataPipe) {
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -07001090 // p is for producer and c is for consumer.
1091 MojoHandle ph = MOJO_HANDLE_INVALID;
1092 MojoHandle ch = MOJO_HANDLE_INVALID;
James Robinson646469d2014-10-03 15:33:28 -07001093 MojoHandleSignalsState hss;
1094
1095 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001096 core()->CreateDataPipe(NullUserPointer(), MakeUserPointer(&ph),
1097 MakeUserPointer(&ch)));
James Robinson646469d2014-10-03 15:33:28 -07001098 // Should get two distinct, valid handles.
1099 EXPECT_NE(ph, MOJO_HANDLE_INVALID);
1100 EXPECT_NE(ch, MOJO_HANDLE_INVALID);
1101 EXPECT_NE(ph, ch);
1102
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -07001103 // Both should have the correct rights.
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -07001104 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
1105 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ph, MakeUserPointer(&rights)));
Viet-Trung Luue5ace232016-05-19 14:54:48 -07001106 EXPECT_EQ(kDefaultDataPipeProducerHandleRights, rights);
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -07001107 rights = MOJO_HANDLE_RIGHT_NONE;
1108 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ch, MakeUserPointer(&rights)));
Viet-Trung Luue5ace232016-05-19 14:54:48 -07001109 EXPECT_EQ(kDefaultDataPipeConsumerHandleRights, rights);
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -07001110
Viet-Trung Luu11b99342016-05-23 12:13:23 -07001111 // Neither should be duplicatable.
1112 MojoHandle h_denied = MOJO_HANDLE_INVALID;
1113 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED,
1114 core()->DuplicateHandleWithReducedRights(
1115 ph, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied)));
1116 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED,
1117 core()->DuplicateHandleWithReducedRights(
1118 ch, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied)));
1119 EXPECT_EQ(MOJO_HANDLE_INVALID, h_denied);
1120
James Robinson646469d2014-10-03 15:33:28 -07001121 // Producer should be never-readable, but already writable.
1122 hss = kEmptyMojoHandleSignalsState;
1123 EXPECT_EQ(
1124 MOJO_RESULT_FAILED_PRECONDITION,
1125 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
Viet-Trung Luu2e398982016-04-12 23:00:49 -07001126 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
1127 hss.satisfied_signals);
1128 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1129 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001130 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001131 hss = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001132 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0,
1133 MakeUserPointer(&hss)));
Viet-Trung Luu2e398982016-04-12 23:00:49 -07001134 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
1135 hss.satisfied_signals);
1136 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1137 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001138 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001139
1140 // Consumer should be never-writable, and not yet readable.
1141 hss = kFullMojoHandleSignalsState;
1142 EXPECT_EQ(
1143 MOJO_RESULT_FAILED_PRECONDITION,
1144 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0, MakeUserPointer(&hss)));
1145 EXPECT_EQ(0u, hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001146 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1147 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001148 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001149 hss = kFullMojoHandleSignalsState;
1150 EXPECT_EQ(
1151 MOJO_RESULT_DEADLINE_EXCEEDED,
1152 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1153 EXPECT_EQ(0u, hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001154 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1155 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001156 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001157
1158 // Write.
Benjamin Lermanf4583a82014-11-26 10:54:39 +01001159 signed char elements[2] = {'A', 'B'};
James Robinson646469d2014-10-03 15:33:28 -07001160 uint32_t num_bytes = 2u;
1161 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001162 core()->WriteData(ph, UserPointer<const void>(elements),
James Robinson646469d2014-10-03 15:33:28 -07001163 MakeUserPointer(&num_bytes),
1164 MOJO_WRITE_DATA_FLAG_NONE));
1165 EXPECT_EQ(2u, num_bytes);
1166
1167 // Consumer should now be readable.
1168 hss = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001169 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0,
1170 MakeUserPointer(&hss)));
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001171 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
1172 hss.satisfied_signals);
1173 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1174 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001175 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001176
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001177 // Peek one character.
1178 elements[0] = -1;
1179 elements[1] = -1;
1180 num_bytes = 1u;
1181 EXPECT_EQ(MOJO_RESULT_OK,
1182 core()->ReadData(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001183 ch, UserPointer<void>(elements), MakeUserPointer(&num_bytes),
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001184 MOJO_READ_DATA_FLAG_NONE | MOJO_READ_DATA_FLAG_PEEK));
1185 EXPECT_EQ('A', elements[0]);
1186 EXPECT_EQ(-1, elements[1]);
1187
James Robinson646469d2014-10-03 15:33:28 -07001188 // Read one character.
1189 elements[0] = -1;
1190 elements[1] = -1;
1191 num_bytes = 1u;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001192 EXPECT_EQ(MOJO_RESULT_OK, core()->ReadData(ch, UserPointer<void>(elements),
1193 MakeUserPointer(&num_bytes),
1194 MOJO_READ_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001195 EXPECT_EQ('A', elements[0]);
1196 EXPECT_EQ(-1, elements[1]);
1197
1198 // Two-phase write.
1199 void* write_ptr = nullptr;
1200 num_bytes = 0u;
1201 ASSERT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001202 core()->BeginWriteData(ph, MakeUserPointer(&write_ptr),
James Robinson646469d2014-10-03 15:33:28 -07001203 MakeUserPointer(&num_bytes),
1204 MOJO_WRITE_DATA_FLAG_NONE));
1205 // We count on the default options providing a decent buffer size.
1206 ASSERT_GE(num_bytes, 3u);
1207
1208 // Trying to do a normal write during a two-phase write should fail.
1209 elements[0] = 'X';
1210 num_bytes = 1u;
1211 EXPECT_EQ(MOJO_RESULT_BUSY,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001212 core()->WriteData(ph, UserPointer<const void>(elements),
James Robinson646469d2014-10-03 15:33:28 -07001213 MakeUserPointer(&num_bytes),
1214 MOJO_WRITE_DATA_FLAG_NONE));
1215
1216 // Actually write the data, and complete it now.
1217 static_cast<char*>(write_ptr)[0] = 'C';
1218 static_cast<char*>(write_ptr)[1] = 'D';
1219 static_cast<char*>(write_ptr)[2] = 'E';
1220 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u));
1221
1222 // Query how much data we have.
1223 num_bytes = 0;
1224 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001225 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
James Robinson646469d2014-10-03 15:33:28 -07001226 MOJO_READ_DATA_FLAG_QUERY));
1227 EXPECT_EQ(4u, num_bytes);
1228
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001229 // Try to query with peek. Should fail.
1230 num_bytes = 0;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001231 EXPECT_EQ(
1232 MOJO_RESULT_INVALID_ARGUMENT,
1233 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
1234 MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK));
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001235 EXPECT_EQ(0u, num_bytes);
1236
James Robinson646469d2014-10-03 15:33:28 -07001237 // Try to discard ten characters, in all-or-none mode. Should fail.
1238 num_bytes = 10;
1239 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
1240 core()->ReadData(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001241 ch, NullUserPointer(), MakeUserPointer(&num_bytes),
James Robinson646469d2014-10-03 15:33:28 -07001242 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
1243
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001244 // Try to discard two characters, in peek mode. Should fail.
1245 num_bytes = 2;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001246 EXPECT_EQ(
1247 MOJO_RESULT_INVALID_ARGUMENT,
1248 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
1249 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK));
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001250
James Robinson646469d2014-10-03 15:33:28 -07001251 // Discard two characters.
1252 num_bytes = 2;
1253 EXPECT_EQ(MOJO_RESULT_OK,
1254 core()->ReadData(
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001255 ch, NullUserPointer(), MakeUserPointer(&num_bytes),
James Robinson646469d2014-10-03 15:33:28 -07001256 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
1257
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001258 // Try a two-phase read of the remaining two bytes with peek. Should fail.
James Robinson646469d2014-10-03 15:33:28 -07001259 const void* read_ptr = nullptr;
1260 num_bytes = 2;
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001261 ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001262 core()->BeginReadData(ch, MakeUserPointer(&read_ptr),
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001263 MakeUserPointer(&num_bytes),
1264 MOJO_READ_DATA_FLAG_PEEK));
1265
Viet-Trung Luu8b1ba572015-09-25 16:29:49 -07001266 // Read the remaining two characters, in two-phase mode.
Anand K. Mistry0bb2d532014-11-05 11:29:57 +11001267 num_bytes = 2;
James Robinson646469d2014-10-03 15:33:28 -07001268 ASSERT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001269 core()->BeginReadData(ch, MakeUserPointer(&read_ptr),
James Robinson646469d2014-10-03 15:33:28 -07001270 MakeUserPointer(&num_bytes),
Viet-Trung Luu8b1ba572015-09-25 16:29:49 -07001271 MOJO_READ_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001272 // Note: Count on still being able to do the contiguous read here.
1273 ASSERT_EQ(2u, num_bytes);
1274
1275 // Discarding right now should fail.
1276 num_bytes = 1;
1277 EXPECT_EQ(MOJO_RESULT_BUSY,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001278 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
James Robinson646469d2014-10-03 15:33:28 -07001279 MOJO_READ_DATA_FLAG_DISCARD));
1280
1281 // Actually check our data and end the two-phase read.
1282 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[0]);
1283 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[1]);
1284 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u));
1285
1286 // Consumer should now be no longer readable.
1287 hss = kFullMojoHandleSignalsState;
1288 EXPECT_EQ(
1289 MOJO_RESULT_DEADLINE_EXCEEDED,
1290 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1291 EXPECT_EQ(0u, hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001292 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1293 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001294 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001295
1296 // TODO(vtl): More.
1297
1298 // Close the producer.
1299 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
1300
1301 // The consumer should now be never-readable.
1302 hss = kFullMojoHandleSignalsState;
1303 EXPECT_EQ(
1304 MOJO_RESULT_FAILED_PRECONDITION,
1305 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
Benjamin Lerman33c84782014-11-27 10:07:33 +01001306 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
1307 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001308
1309 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
1310}
1311
Viet-Trung Luu2e398982016-04-12 23:00:49 -07001312TEST_F(CoreTest, DataPipeSetGetProducerOptions) {
1313 MojoCreateDataPipeOptions options = {
1314 sizeof(MojoCreateDataPipeOptions), // |struct_size|.
1315 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
1316 8, // |element_num_bytes|.
1317 800 // |capacity_num_bytes|.
1318 };
1319 MojoHandle ph, ch; // p is for producer and c is for consumer.
1320
1321 EXPECT_EQ(MOJO_RESULT_OK,
1322 core()->CreateDataPipe(MakeUserPointer(&options),
1323 MakeUserPointer(&ph), MakeUserPointer(&ch)));
1324 // Should get two distinct, valid handles.
1325 EXPECT_NE(ph, MOJO_HANDLE_INVALID);
1326 EXPECT_NE(ch, MOJO_HANDLE_INVALID);
1327 EXPECT_NE(ph, ch);
1328
1329 // Get it.
1330 MojoDataPipeProducerOptions popts = {};
1331 const uint32_t kPoptsSize = static_cast<uint32_t>(sizeof(popts));
1332 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions(
1333 ph, MakeUserPointer(&popts), kPoptsSize));
1334 EXPECT_EQ(kPoptsSize, popts.struct_size);
1335 EXPECT_EQ(0u, popts.write_threshold_num_bytes);
1336
1337 // Invalid write threshold.
1338 popts.struct_size = kPoptsSize;
1339 popts.write_threshold_num_bytes = 4;
1340 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
1341 core()->SetDataPipeProducerOptions(ph, MakeUserPointer(&popts)));
1342 // The options shouldn't change.
1343 popts = MojoDataPipeProducerOptions();
1344 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions(
1345 ph, MakeUserPointer(&popts), kPoptsSize));
1346 EXPECT_EQ(kPoptsSize, popts.struct_size);
1347 EXPECT_EQ(0u, popts.write_threshold_num_bytes);
1348
1349 // Valid write threshold.
1350 popts.struct_size = kPoptsSize;
1351 popts.write_threshold_num_bytes = 8;
1352 EXPECT_EQ(MOJO_RESULT_OK,
1353 core()->SetDataPipeProducerOptions(ph, MakeUserPointer(&popts)));
1354 popts = MojoDataPipeProducerOptions();
1355 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions(
1356 ph, MakeUserPointer(&popts), kPoptsSize));
1357 EXPECT_EQ(kPoptsSize, popts.struct_size);
1358 EXPECT_EQ(8u, popts.write_threshold_num_bytes);
1359
1360 // Invalid write threshold.
1361 popts.struct_size = kPoptsSize;
1362 popts.write_threshold_num_bytes = 9;
1363 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
1364 core()->SetDataPipeProducerOptions(ph, MakeUserPointer(&popts)));
1365 // The options shouldn't change.
1366 popts = MojoDataPipeProducerOptions();
1367 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions(
1368 ph, MakeUserPointer(&popts), kPoptsSize));
1369 EXPECT_EQ(kPoptsSize, popts.struct_size);
1370 EXPECT_EQ(8u, popts.write_threshold_num_bytes);
1371
1372 // Valid write threshold.
1373 popts.struct_size = kPoptsSize;
1374 popts.write_threshold_num_bytes = 16;
1375 EXPECT_EQ(MOJO_RESULT_OK,
1376 core()->SetDataPipeProducerOptions(ph, MakeUserPointer(&popts)));
1377 popts = MojoDataPipeProducerOptions();
1378 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions(
1379 ph, MakeUserPointer(&popts), kPoptsSize));
1380 EXPECT_EQ(kPoptsSize, popts.struct_size);
1381 EXPECT_EQ(16u, popts.write_threshold_num_bytes);
1382
1383 // Can also set to default by passing null.
1384 EXPECT_EQ(MOJO_RESULT_OK,
1385 core()->SetDataPipeProducerOptions(ph, NullUserPointer()));
1386 popts = MojoDataPipeProducerOptions();
1387 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeProducerOptions(
1388 ph, MakeUserPointer(&popts), kPoptsSize));
1389 EXPECT_EQ(kPoptsSize, popts.struct_size);
1390 // Note: Should be reported as 0 ("default"), even if it means the element
1391 // struct_size.
1392 EXPECT_EQ(0u, popts.write_threshold_num_bytes);
1393
1394 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
1395 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
1396}
1397
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001398TEST_F(CoreTest, DataPipeSetGetConsumerOptions) {
1399 MojoCreateDataPipeOptions options = {
1400 sizeof(MojoCreateDataPipeOptions), // |struct_size|.
1401 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
1402 8, // |element_num_bytes|.
1403 800 // |capacity_num_bytes|.
1404 };
1405 MojoHandle ph, ch; // p is for producer and c is for consumer.
1406
1407 EXPECT_EQ(MOJO_RESULT_OK,
1408 core()->CreateDataPipe(MakeUserPointer(&options),
1409 MakeUserPointer(&ph), MakeUserPointer(&ch)));
1410 // Should get two distinct, valid handles.
1411 EXPECT_NE(ph, MOJO_HANDLE_INVALID);
1412 EXPECT_NE(ch, MOJO_HANDLE_INVALID);
1413 EXPECT_NE(ph, ch);
1414
Viet-Trung Luu2e398982016-04-12 23:00:49 -07001415 // Get it.
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001416 MojoDataPipeConsumerOptions copts = {};
1417 const uint32_t kCoptsSize = static_cast<uint32_t>(sizeof(copts));
1418 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1419 ch, MakeUserPointer(&copts), kCoptsSize));
1420 EXPECT_EQ(kCoptsSize, copts.struct_size);
1421 EXPECT_EQ(0u, copts.read_threshold_num_bytes);
1422
1423 // Invalid read threshold.
1424 copts.struct_size = kCoptsSize;
1425 copts.read_threshold_num_bytes = 4;
1426 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
1427 core()->SetDataPipeConsumerOptions(ch, MakeUserPointer(&copts)));
1428 // The options shouldn't change.
1429 copts = MojoDataPipeConsumerOptions();
1430 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1431 ch, MakeUserPointer(&copts), kCoptsSize));
1432 EXPECT_EQ(kCoptsSize, copts.struct_size);
1433 EXPECT_EQ(0u, copts.read_threshold_num_bytes);
1434
1435 // Valid read threshold.
1436 copts.struct_size = kCoptsSize;
1437 copts.read_threshold_num_bytes = 8;
1438 EXPECT_EQ(MOJO_RESULT_OK,
1439 core()->SetDataPipeConsumerOptions(ch, MakeUserPointer(&copts)));
1440 copts = MojoDataPipeConsumerOptions();
1441 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1442 ch, MakeUserPointer(&copts), kCoptsSize));
1443 EXPECT_EQ(kCoptsSize, copts.struct_size);
1444 EXPECT_EQ(8u, copts.read_threshold_num_bytes);
1445
1446 // Invalid read threshold.
1447 copts.struct_size = kCoptsSize;
1448 copts.read_threshold_num_bytes = 9;
1449 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
1450 core()->SetDataPipeConsumerOptions(ch, MakeUserPointer(&copts)));
1451 // The options shouldn't change.
1452 copts = MojoDataPipeConsumerOptions();
1453 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1454 ch, MakeUserPointer(&copts), kCoptsSize));
1455 EXPECT_EQ(kCoptsSize, copts.struct_size);
1456 EXPECT_EQ(8u, copts.read_threshold_num_bytes);
1457
1458 // Valid read threshold.
1459 copts.struct_size = kCoptsSize;
1460 copts.read_threshold_num_bytes = 16;
1461 EXPECT_EQ(MOJO_RESULT_OK,
1462 core()->SetDataPipeConsumerOptions(ch, MakeUserPointer(&copts)));
1463 copts = MojoDataPipeConsumerOptions();
1464 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1465 ch, MakeUserPointer(&copts), kCoptsSize));
1466 EXPECT_EQ(kCoptsSize, copts.struct_size);
1467 EXPECT_EQ(16u, copts.read_threshold_num_bytes);
1468
Viet-Trung Luu833e71a2016-04-05 14:17:48 -07001469 // Can also set to default by passing null.
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001470 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu833e71a2016-04-05 14:17:48 -07001471 core()->SetDataPipeConsumerOptions(ch, NullUserPointer()));
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001472 copts = MojoDataPipeConsumerOptions();
1473 EXPECT_EQ(MOJO_RESULT_OK, core()->GetDataPipeConsumerOptions(
1474 ch, MakeUserPointer(&copts), kCoptsSize));
1475 EXPECT_EQ(kCoptsSize, copts.struct_size);
1476 // Note: Should be reported as 0 ("default"), even if it means the element
1477 // struct_size.
1478 EXPECT_EQ(0u, copts.read_threshold_num_bytes);
1479
1480 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
1481 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
1482}
1483
James Robinson646469d2014-10-03 15:33:28 -07001484// Tests passing data pipe producer and consumer handles.
1485TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
1486 const char kHello[] = "hello";
1487 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
1488 const char kWorld[] = "world!!!";
1489 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
1490 char buffer[100];
1491 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
1492 uint32_t num_bytes;
1493 MojoHandle handles[10];
1494 uint32_t num_handles;
1495 MojoHandleSignalsState hss;
1496
1497 MojoHandle h_passing[2];
1498 EXPECT_EQ(MOJO_RESULT_OK,
1499 core()->CreateMessagePipe(NullUserPointer(),
1500 MakeUserPointer(&h_passing[0]),
1501 MakeUserPointer(&h_passing[1])));
1502
1503 MojoHandle ph, ch;
1504 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001505 core()->CreateDataPipe(NullUserPointer(), MakeUserPointer(&ph),
1506 MakeUserPointer(&ch)));
James Robinson646469d2014-10-03 15:33:28 -07001507
1508 // Send |ch| from |h_passing[0]| to |h_passing[1]|.
1509 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001510 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
1511 kHelloSize, MakeUserPointer(&ch), 1,
James Robinson646469d2014-10-03 15:33:28 -07001512 MOJO_WRITE_MESSAGE_FLAG_NONE));
1513 hss = kEmptyMojoHandleSignalsState;
1514 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001515 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001516 MakeUserPointer(&hss)));
1517 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1518 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001519 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1520 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1521 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001522 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -07001523 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -07001524 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001525 core()->ReadMessage(
1526 h_passing[1], UserPointer<void>(buffer),
1527 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
1528 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001529 EXPECT_EQ(kHelloSize, num_bytes);
1530 EXPECT_STREQ(kHello, buffer);
1531 EXPECT_EQ(1u, num_handles);
1532 MojoHandle ch_received = handles[0];
1533 EXPECT_NE(ch_received, MOJO_HANDLE_INVALID);
1534 EXPECT_NE(ch_received, h_passing[0]);
1535 EXPECT_NE(ch_received, h_passing[1]);
1536 EXPECT_NE(ch_received, ph);
1537
1538 // Note: We rely on the Mojo system not re-using handle values very often.
1539 EXPECT_NE(ch_received, ch);
1540
1541 // |ch| should no longer be valid; check that trying to close it fails. See
1542 // above note.
1543 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch));
1544
Viet-Trung Luue5ace232016-05-19 14:54:48 -07001545 // Check that |ch_received| still has the expected rights.
1546 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE;
1547 EXPECT_EQ(MOJO_RESULT_OK,
1548 core()->GetRights(ch_received, MakeUserPointer(&rights)));
1549 EXPECT_EQ(kDefaultDataPipeConsumerHandleRights, rights);
1550
James Robinson646469d2014-10-03 15:33:28 -07001551 // Write to |ph|. Should receive on |ch_received|.
1552 num_bytes = kWorldSize;
1553 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001554 core()->WriteData(ph, UserPointer<const void>(kWorld),
James Robinson646469d2014-10-03 15:33:28 -07001555 MakeUserPointer(&num_bytes),
1556 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
1557 hss = kEmptyMojoHandleSignalsState;
1558 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001559 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001560 MakeUserPointer(&hss)));
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001561 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
1562 hss.satisfied_signals);
1563 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1564 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001565 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001566 num_bytes = kBufferSize;
1567 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001568 core()->ReadData(ch_received, UserPointer<void>(buffer),
James Robinson646469d2014-10-03 15:33:28 -07001569 MakeUserPointer(&num_bytes),
1570 MOJO_READ_MESSAGE_FLAG_NONE));
1571 EXPECT_EQ(kWorldSize, num_bytes);
1572 EXPECT_STREQ(kWorld, buffer);
1573
1574 // Now pass |ph| in the same direction.
1575 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001576 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld),
1577 kWorldSize, MakeUserPointer(&ph), 1,
James Robinson646469d2014-10-03 15:33:28 -07001578 MOJO_WRITE_MESSAGE_FLAG_NONE));
1579 hss = kEmptyMojoHandleSignalsState;
1580 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001581 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001582 MakeUserPointer(&hss)));
1583 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1584 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001585 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1586 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1587 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001588 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -07001589 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -07001590 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001591 core()->ReadMessage(
1592 h_passing[1], UserPointer<void>(buffer),
1593 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
1594 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001595 EXPECT_EQ(kWorldSize, num_bytes);
1596 EXPECT_STREQ(kWorld, buffer);
1597 EXPECT_EQ(1u, num_handles);
1598 MojoHandle ph_received = handles[0];
1599 EXPECT_NE(ph_received, MOJO_HANDLE_INVALID);
1600 EXPECT_NE(ph_received, h_passing[0]);
1601 EXPECT_NE(ph_received, h_passing[1]);
1602 EXPECT_NE(ph_received, ch_received);
1603
1604 // Again, rely on the Mojo system not re-using handle values very often.
1605 EXPECT_NE(ph_received, ph);
1606
1607 // |ph| should no longer be valid; check that trying to close it fails. See
1608 // above note.
1609 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph));
1610
Viet-Trung Luue5ace232016-05-19 14:54:48 -07001611 // Check that |ph_received| still has the expected rights.
1612 rights = MOJO_HANDLE_RIGHT_NONE;
1613 EXPECT_EQ(MOJO_RESULT_OK,
1614 core()->GetRights(ph_received, MakeUserPointer(&rights)));
1615 EXPECT_EQ(kDefaultDataPipeProducerHandleRights, rights);
1616
James Robinson646469d2014-10-03 15:33:28 -07001617 // Write to |ph_received|. Should receive on |ch_received|.
1618 num_bytes = kHelloSize;
1619 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001620 core()->WriteData(ph_received, UserPointer<const void>(kHello),
James Robinson646469d2014-10-03 15:33:28 -07001621 MakeUserPointer(&num_bytes),
1622 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
1623 hss = kEmptyMojoHandleSignalsState;
1624 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001625 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001626 MakeUserPointer(&hss)));
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001627 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
1628 hss.satisfied_signals);
1629 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1630 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001631 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001632 num_bytes = kBufferSize;
1633 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001634 core()->ReadData(ch_received, UserPointer<void>(buffer),
James Robinson646469d2014-10-03 15:33:28 -07001635 MakeUserPointer(&num_bytes),
1636 MOJO_READ_MESSAGE_FLAG_NONE));
1637 EXPECT_EQ(kHelloSize, num_bytes);
1638 EXPECT_STREQ(kHello, buffer);
1639
1640 ph = ph_received;
1641 ph_received = MOJO_HANDLE_INVALID;
1642 ch = ch_received;
1643 ch_received = MOJO_HANDLE_INVALID;
1644
1645 // Make sure that |ph| can't be sent if it's in a two-phase write.
1646 void* write_ptr = nullptr;
1647 num_bytes = 0;
1648 ASSERT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001649 core()->BeginWriteData(ph, MakeUserPointer(&write_ptr),
James Robinson646469d2014-10-03 15:33:28 -07001650 MakeUserPointer(&num_bytes),
1651 MOJO_WRITE_DATA_FLAG_NONE));
1652 ASSERT_GE(num_bytes, 1u);
1653 EXPECT_EQ(MOJO_RESULT_BUSY,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001654 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
1655 kHelloSize, MakeUserPointer(&ph), 1,
James Robinson646469d2014-10-03 15:33:28 -07001656 MOJO_WRITE_MESSAGE_FLAG_NONE));
1657
1658 // But |ch| can, even if |ph| is in a two-phase write.
1659 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001660 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
1661 kHelloSize, MakeUserPointer(&ch), 1,
James Robinson646469d2014-10-03 15:33:28 -07001662 MOJO_WRITE_MESSAGE_FLAG_NONE));
1663 ch = MOJO_HANDLE_INVALID;
1664 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001665 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001666 NullUserPointer()));
1667 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -07001668 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -07001669 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001670 core()->ReadMessage(
1671 h_passing[1], UserPointer<void>(buffer),
1672 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
1673 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001674 EXPECT_EQ(kHelloSize, num_bytes);
1675 EXPECT_STREQ(kHello, buffer);
1676 EXPECT_EQ(1u, num_handles);
1677 ch = handles[0];
1678 EXPECT_NE(ch, MOJO_HANDLE_INVALID);
1679
1680 // Complete the two-phase write.
1681 static_cast<char*>(write_ptr)[0] = 'x';
1682 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1));
1683
1684 // Wait for |ch| to be readable.
1685 hss = kEmptyMojoHandleSignalsState;
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001686 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE,
1687 1000000000, MakeUserPointer(&hss)));
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001688 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
1689 hss.satisfied_signals);
1690 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1691 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
Benjamin Lerman33c84782014-11-27 10:07:33 +01001692 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001693
1694 // Make sure that |ch| can't be sent if it's in a two-phase read.
1695 const void* read_ptr = nullptr;
1696 num_bytes = 1;
1697 ASSERT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001698 core()->BeginReadData(ch, MakeUserPointer(&read_ptr),
James Robinson646469d2014-10-03 15:33:28 -07001699 MakeUserPointer(&num_bytes),
Viet-Trung Luu8b1ba572015-09-25 16:29:49 -07001700 MOJO_READ_DATA_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001701 EXPECT_EQ(MOJO_RESULT_BUSY,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001702 core()->WriteMessage(h_passing[0], UserPointer<const void>(kHello),
1703 kHelloSize, MakeUserPointer(&ch), 1,
James Robinson646469d2014-10-03 15:33:28 -07001704 MOJO_WRITE_MESSAGE_FLAG_NONE));
1705
1706 // But |ph| can, even if |ch| is in a two-phase read.
1707 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001708 core()->WriteMessage(h_passing[0], UserPointer<const void>(kWorld),
1709 kWorldSize, MakeUserPointer(&ph), 1,
James Robinson646469d2014-10-03 15:33:28 -07001710 MOJO_WRITE_MESSAGE_FLAG_NONE));
1711 ph = MOJO_HANDLE_INVALID;
1712 hss = kEmptyMojoHandleSignalsState;
1713 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001714 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
James Robinson646469d2014-10-03 15:33:28 -07001715 MakeUserPointer(&hss)));
1716 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1717 hss.satisfied_signals);
Viet-Trung Luuafe76722016-04-05 12:14:39 -07001718 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE |
1719 MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1720 hss.satisfiable_signals);
James Robinson646469d2014-10-03 15:33:28 -07001721 num_bytes = kBufferSize;
Viet-Trung Luu7d5ced22015-06-24 15:21:39 -07001722 num_handles = MOJO_ARRAYSIZE(handles);
James Robinson646469d2014-10-03 15:33:28 -07001723 EXPECT_EQ(MOJO_RESULT_OK,
Viet-Trung Luu6dd61fa2014-11-12 13:40:01 -08001724 core()->ReadMessage(
1725 h_passing[1], UserPointer<void>(buffer),
1726 MakeUserPointer(&num_bytes), MakeUserPointer(handles),
1727 MakeUserPointer(&num_handles), MOJO_READ_MESSAGE_FLAG_NONE));
James Robinson646469d2014-10-03 15:33:28 -07001728 EXPECT_EQ(kWorldSize, num_bytes);
1729 EXPECT_STREQ(kWorld, buffer);
1730 EXPECT_EQ(1u, num_handles);
1731 ph = handles[0];
1732 EXPECT_NE(ph, MOJO_HANDLE_INVALID);
1733
1734 // Complete the two-phase read.
1735 EXPECT_EQ('x', static_cast<const char*>(read_ptr)[0]);
1736 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 1));
1737
1738 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0]));
1739 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1]));
1740 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
1741 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
1742}
1743
Viet-Trung Luu406a5c12016-05-03 13:27:24 -07001744// Tests "faux leak" message pipe handle passing situations.
1745TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing3) {
1746 {
1747 MojoHandle h0 = MOJO_HANDLE_INVALID;
1748 MojoHandle h1 = MOJO_HANDLE_INVALID;
1749 EXPECT_EQ(MOJO_RESULT_OK,
1750 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h0),
1751 MakeUserPointer(&h1)));
1752
1753 // You can send a message pipe's peer handle over itself (and nothing bad
1754 // happens).
1755 EXPECT_EQ(
1756 MOJO_RESULT_OK,
1757 core()->WriteMessage(h0, NullUserPointer(), 0, MakeUserPointer(&h1), 1,
1758 MOJO_WRITE_MESSAGE_FLAG_NONE));
1759
1760 // Of course, there's nothing to do afterwards except close the handle you
1761 // have left.
1762 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h0));
1763 }
1764
1765 {
1766 MojoHandle h0 = MOJO_HANDLE_INVALID;
1767 MojoHandle h1 = MOJO_HANDLE_INVALID;
1768 EXPECT_EQ(MOJO_RESULT_OK,
1769 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h0),
1770 MakeUserPointer(&h1)));
1771
1772 MojoHandle h_passed[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
1773 EXPECT_EQ(MOJO_RESULT_OK,
1774 core()->CreateMessagePipe(NullUserPointer(),
1775 MakeUserPointer(&h_passed[0]),
1776 MakeUserPointer(&h_passed[1])));
1777
1778 // You can also write |h1| into some other message pipe.
1779 EXPECT_EQ(MOJO_RESULT_OK,
1780 core()->WriteMessage(h_passed[0], NullUserPointer(), 0,
1781 MakeUserPointer(&h1), 1,
1782 MOJO_WRITE_MESSAGE_FLAG_NONE));
1783
1784 // And then write both ends of that message pipe to |h0|.
1785 EXPECT_EQ(MOJO_RESULT_OK,
1786 core()->WriteMessage(h0, NullUserPointer(), 0,
1787 MakeUserPointer(h_passed), 2,
1788 MOJO_WRITE_MESSAGE_FLAG_NONE));
1789
1790 // Again, nothing bad happens, but again you can only close |h0|.
1791 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h0));
1792 }
1793}
1794
Hajime Morrita7ab59802014-12-12 15:30:26 -08001795struct TestAsyncWaiter {
1796 TestAsyncWaiter() : result(MOJO_RESULT_UNKNOWN) {}
1797
1798 void Awake(MojoResult r) { result = r; }
1799
1800 MojoResult result;
1801};
1802
1803TEST_F(CoreTest, AsyncWait) {
1804 TestAsyncWaiter waiter;
1805 MockHandleInfo info;
1806 MojoHandle h = CreateMockHandle(&info);
1807
1808 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
Viet-Trung Luude5aba42015-11-10 17:06:17 -08001809 core()->AsyncWait(
1810 h, MOJO_HANDLE_SIGNAL_READABLE,
1811 [&waiter](MojoResult result) { waiter.Awake(result); }));
Hajime Morrita7ab59802014-12-12 15:30:26 -08001812 EXPECT_EQ(0u, info.GetAddedAwakableSize());
1813
1814 info.AllowAddAwakable(true);
Viet-Trung Luude5aba42015-11-10 17:06:17 -08001815 EXPECT_EQ(MOJO_RESULT_OK, core()->AsyncWait(h, MOJO_HANDLE_SIGNAL_READABLE,
1816 [&waiter](MojoResult result) {
1817 waiter.Awake(result);
1818 }));
Hajime Morrita7ab59802014-12-12 15:30:26 -08001819 EXPECT_EQ(1u, info.GetAddedAwakableSize());
1820
Viet-Trung Luu99579a22014-12-12 17:23:11 -08001821 EXPECT_FALSE(info.GetAddedAwakableAt(0)->Awake(MOJO_RESULT_BUSY, 0));
Hajime Morrita7ab59802014-12-12 15:30:26 -08001822 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result);
1823
1824 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
1825}
1826
Viet-Trung Luu3d068bd2016-05-19 13:04:34 -07001827// TODO(vtl): Test |CreateSharedBuffer()|, |DuplicateBufferHandle()|, and
1828// |MapBuffer()|.
James Robinson646469d2014-10-03 15:33:28 -07001829
1830} // namespace
1831} // namespace system
1832} // namespace mojo