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

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

Issue 454603002: Mojo: Plumb new Wait/WaitMany API out to Core. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mojo/system/core.cc ('k') | mojo/system/entrypoints.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/system/core.h" 5 #include "mojo/system/core.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <limits> 9 #include <limits>
10 10
11 #include "base/threading/platform_thread.h" 11 #include "base/threading/platform_thread.h"
12 #include "base/time/time.h" 12 #include "base/time/time.h"
13 #include "mojo/system/core_test_base.h" 13 #include "mojo/system/core_test_base.h"
14 14
15 namespace mojo { 15 namespace mojo {
16 namespace system { 16 namespace system {
17 namespace { 17 namespace {
18 18
19 const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u};
20 const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u};
21
19 typedef test::CoreTestBase CoreTest; 22 typedef test::CoreTestBase CoreTest;
20 23
21 TEST_F(CoreTest, GetTimeTicksNow) { 24 TEST_F(CoreTest, GetTimeTicksNow) {
22 const MojoTimeTicks start = core()->GetTimeTicksNow(); 25 const MojoTimeTicks start = core()->GetTimeTicksNow();
23 EXPECT_NE(static_cast<MojoTimeTicks>(0), start) 26 EXPECT_NE(static_cast<MojoTimeTicks>(0), start)
24 << "GetTimeTicksNow should return nonzero value"; 27 << "GetTimeTicksNow should return nonzero value";
25 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(15)); 28 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(15));
26 const MojoTimeTicks finish = core()->GetTimeTicksNow(); 29 const MojoTimeTicks finish = core()->GetTimeTicksNow();
27 // Allow for some fuzz in sleep. 30 // Allow for some fuzz in sleep.
28 EXPECT_GE((finish - start), static_cast<MojoTimeTicks>(8000)) 31 EXPECT_GE((finish - start), static_cast<MojoTimeTicks>(8000))
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 MOJO_RESULT_UNIMPLEMENTED, 99 MOJO_RESULT_UNIMPLEMENTED,
97 core()->BeginReadData( 100 core()->BeginReadData(
98 h, NullUserPointer(), NullUserPointer(), MOJO_READ_DATA_FLAG_NONE)); 101 h, NullUserPointer(), NullUserPointer(), MOJO_READ_DATA_FLAG_NONE));
99 EXPECT_EQ(1u, info.GetBeginReadDataCallCount()); 102 EXPECT_EQ(1u, info.GetBeginReadDataCallCount());
100 103
101 EXPECT_EQ(0u, info.GetEndReadDataCallCount()); 104 EXPECT_EQ(0u, info.GetEndReadDataCallCount());
102 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0)); 105 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED, core()->EndReadData(h, 0));
103 EXPECT_EQ(1u, info.GetEndReadDataCallCount()); 106 EXPECT_EQ(1u, info.GetEndReadDataCallCount());
104 107
105 EXPECT_EQ(0u, info.GetAddWaiterCallCount()); 108 EXPECT_EQ(0u, info.GetAddWaiterCallCount());
109 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
110 core()->Wait(h,
111 ~MOJO_HANDLE_SIGNAL_NONE,
112 MOJO_DEADLINE_INDEFINITE,
113 NullUserPointer()));
114 EXPECT_EQ(1u, info.GetAddWaiterCallCount());
115 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
116 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0, NullUserPointer()));
117 EXPECT_EQ(2u, info.GetAddWaiterCallCount());
118 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
119 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
120 core()->Wait(h,
121 ~MOJO_HANDLE_SIGNAL_NONE,
122 MOJO_DEADLINE_INDEFINITE,
123 MakeUserPointer(&hss)));
124 EXPECT_EQ(3u, info.GetAddWaiterCallCount());
125 EXPECT_EQ(0u, hss.satisfied_signals);
126 EXPECT_EQ(0u, hss.satisfiable_signals);
106 EXPECT_EQ( 127 EXPECT_EQ(
107 MOJO_RESULT_FAILED_PRECONDITION, 128 MOJO_RESULT_FAILED_PRECONDITION,
108 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE)); 129 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, NullUserPointer()));
109 EXPECT_EQ(1u, info.GetAddWaiterCallCount()); 130 EXPECT_EQ(4u, info.GetAddWaiterCallCount());
131 hss = kFullMojoHandleSignalsState;
110 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 132 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
111 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 0)); 133 core()->Wait(
112 EXPECT_EQ(2u, info.GetAddWaiterCallCount()); 134 h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000, MakeUserPointer(&hss)));
113 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 135 EXPECT_EQ(5u, info.GetAddWaiterCallCount());
114 core()->Wait(h, ~MOJO_HANDLE_SIGNAL_NONE, 10 * 1000)); 136 EXPECT_EQ(0u, hss.satisfied_signals);
115 EXPECT_EQ(3u, info.GetAddWaiterCallCount()); 137 EXPECT_EQ(0u, hss.satisfiable_signals);
138
116 MojoHandleSignals handle_signals = ~MOJO_HANDLE_SIGNAL_NONE; 139 MojoHandleSignals handle_signals = ~MOJO_HANDLE_SIGNAL_NONE;
117 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 140 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
118 core()->WaitMany(MakeUserPointer(&h), 141 core()->WaitMany(MakeUserPointer(&h),
119 MakeUserPointer(&handle_signals), 142 MakeUserPointer(&handle_signals),
120 1, 143 1,
121 MOJO_DEADLINE_INDEFINITE)); 144 MOJO_DEADLINE_INDEFINITE,
122 EXPECT_EQ(4u, info.GetAddWaiterCallCount()); 145 NullUserPointer(),
146 NullUserPointer()));
147 EXPECT_EQ(6u, info.GetAddWaiterCallCount());
148 uint32_t result_index = static_cast<uint32_t>(-1);
149 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
150 core()->WaitMany(MakeUserPointer(&h),
151 MakeUserPointer(&handle_signals),
152 1,
153 MOJO_DEADLINE_INDEFINITE,
154 MakeUserPointer(&result_index),
155 NullUserPointer()));
156 EXPECT_EQ(7u, info.GetAddWaiterCallCount());
157 EXPECT_EQ(0u, result_index);
158 hss = kFullMojoHandleSignalsState;
159 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
160 core()->WaitMany(MakeUserPointer(&h),
161 MakeUserPointer(&handle_signals),
162 1,
163 MOJO_DEADLINE_INDEFINITE,
164 NullUserPointer(),
165 MakeUserPointer(&hss)));
166 EXPECT_EQ(8u, info.GetAddWaiterCallCount());
167 EXPECT_EQ(0u, hss.satisfied_signals);
168 EXPECT_EQ(0u, hss.satisfiable_signals);
169 result_index = static_cast<uint32_t>(-1);
170 hss = kFullMojoHandleSignalsState;
171 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
172 core()->WaitMany(MakeUserPointer(&h),
173 MakeUserPointer(&handle_signals),
174 1,
175 MOJO_DEADLINE_INDEFINITE,
176 MakeUserPointer(&result_index),
177 MakeUserPointer(&hss)));
178 EXPECT_EQ(9u, info.GetAddWaiterCallCount());
179 EXPECT_EQ(0u, result_index);
180 EXPECT_EQ(0u, hss.satisfied_signals);
181 EXPECT_EQ(0u, hss.satisfiable_signals);
123 182
124 EXPECT_EQ(0u, info.GetDtorCallCount()); 183 EXPECT_EQ(0u, info.GetDtorCallCount());
125 EXPECT_EQ(0u, info.GetCloseCallCount()); 184 EXPECT_EQ(0u, info.GetCloseCallCount());
126 EXPECT_EQ(0u, info.GetCancelAllWaitersCallCount()); 185 EXPECT_EQ(0u, info.GetCancelAllWaitersCallCount());
127 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); 186 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
128 EXPECT_EQ(1u, info.GetCancelAllWaitersCallCount()); 187 EXPECT_EQ(1u, info.GetCancelAllWaitersCallCount());
129 EXPECT_EQ(1u, info.GetCloseCallCount()); 188 EXPECT_EQ(1u, info.GetCloseCallCount());
130 EXPECT_EQ(1u, info.GetDtorCallCount()); 189 EXPECT_EQ(1u, info.GetDtorCallCount());
131 190
132 // No waiters should ever have ever been added. 191 // No waiters should ever have ever been added.
(...skipping 14 matching lines...) Expand all
147 EXPECT_EQ(1u, info.GetCloseCallCount()); 206 EXPECT_EQ(1u, info.GetCloseCallCount());
148 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h)); 207 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h));
149 EXPECT_EQ(1u, info.GetCloseCallCount()); 208 EXPECT_EQ(1u, info.GetCloseCallCount());
150 } 209 }
151 210
152 // |Wait()|: 211 // |Wait()|:
153 { 212 {
154 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 213 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
155 core()->Wait(MOJO_HANDLE_INVALID, 214 core()->Wait(MOJO_HANDLE_INVALID,
156 ~MOJO_HANDLE_SIGNAL_NONE, 215 ~MOJO_HANDLE_SIGNAL_NONE,
157 MOJO_DEADLINE_INDEFINITE)); 216 MOJO_DEADLINE_INDEFINITE,
158 EXPECT_EQ( 217 NullUserPointer()));
159 MOJO_RESULT_INVALID_ARGUMENT, 218 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
160 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE, MOJO_DEADLINE_INDEFINITE)); 219 core()->Wait(10,
220 ~MOJO_HANDLE_SIGNAL_NONE,
221 MOJO_DEADLINE_INDEFINITE,
222 NullUserPointer()));
223
224 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
225 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
226 core()->Wait(MOJO_HANDLE_INVALID,
227 ~MOJO_HANDLE_SIGNAL_NONE,
228 MOJO_DEADLINE_INDEFINITE,
229 MakeUserPointer(&hss)));
230 // On invalid argument, it shouldn't modify the handle signals state.
231 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
232 hss.satisfied_signals);
233 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
234 hss.satisfiable_signals);
235 hss = kFullMojoHandleSignalsState;
236 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
237 core()->Wait(10,
238 ~MOJO_HANDLE_SIGNAL_NONE,
239 MOJO_DEADLINE_INDEFINITE,
240 MakeUserPointer(&hss)));
241 // On invalid argument, it shouldn't modify the handle signals state.
242 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
243 hss.satisfied_signals);
244 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
245 hss.satisfiable_signals);
161 } 246 }
162 247
163 // |WaitMany()|: 248 // |WaitMany()|:
164 { 249 {
165 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; 250 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID};
166 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE, 251 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE,
167 ~MOJO_HANDLE_SIGNAL_NONE}; 252 ~MOJO_HANDLE_SIGNAL_NONE};
168 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 253 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
169 core()->WaitMany(MakeUserPointer(handles), 254 core()->WaitMany(MakeUserPointer(handles),
170 MakeUserPointer(signals), 255 MakeUserPointer(signals),
171 0, 256 0,
172 MOJO_DEADLINE_INDEFINITE)); 257 MOJO_DEADLINE_INDEFINITE,
258 NullUserPointer(),
259 NullUserPointer()));
173 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 260 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
174 core()->WaitMany(NullUserPointer(), 261 core()->WaitMany(NullUserPointer(),
175 MakeUserPointer(signals), 262 MakeUserPointer(signals),
176 0, 263 0,
177 MOJO_DEADLINE_INDEFINITE)); 264 MOJO_DEADLINE_INDEFINITE,
265 NullUserPointer(),
266 NullUserPointer()));
267 // If |num_handles| is invalid, it should leave |result_index| and
268 // |signals_states| alone.
269 // (We use -1 internally; make sure that doesn't leak.)
270 uint32_t result_index = 123;
271 MojoHandleSignalsState hss = kFullMojoHandleSignalsState;
272 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
273 core()->WaitMany(NullUserPointer(),
274 MakeUserPointer(signals),
275 0,
276 MOJO_DEADLINE_INDEFINITE,
277 MakeUserPointer(&result_index),
278 MakeUserPointer(&hss)));
279 EXPECT_EQ(123u, result_index);
280 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
281 hss.satisfied_signals);
282 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
283 hss.satisfiable_signals);
284
178 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 285 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
179 core()->WaitMany(MakeUserPointer(handles), 286 core()->WaitMany(MakeUserPointer(handles),
180 NullUserPointer(), 287 NullUserPointer(),
181 0, 288 0,
182 MOJO_DEADLINE_INDEFINITE)); 289 MOJO_DEADLINE_INDEFINITE,
290 NullUserPointer(),
291 NullUserPointer()));
183 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 292 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
184 core()->WaitMany(MakeUserPointer(handles), 293 core()->WaitMany(MakeUserPointer(handles),
185 MakeUserPointer(signals), 294 MakeUserPointer(signals),
186 1, 295 1,
187 MOJO_DEADLINE_INDEFINITE)); 296 MOJO_DEADLINE_INDEFINITE,
297 NullUserPointer(),
298 NullUserPointer()));
299 // But if a handle is bad, then it should set |result_index| but still leave
300 // |signals_states| alone.
301 result_index = static_cast<uint32_t>(-1);
302 hss = kFullMojoHandleSignalsState;
303 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
304 core()->WaitMany(MakeUserPointer(handles),
305 MakeUserPointer(signals),
306 1,
307 MOJO_DEADLINE_INDEFINITE,
308 MakeUserPointer(&result_index),
309 MakeUserPointer(&hss)));
310 EXPECT_EQ(0u, result_index);
311 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
312 hss.satisfied_signals);
313 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
314 hss.satisfiable_signals);
188 315
189 MockHandleInfo info[2]; 316 MockHandleInfo info[2];
190 handles[0] = CreateMockHandle(&info[0]); 317 handles[0] = CreateMockHandle(&info[0]);
191 318
319 result_index = static_cast<uint32_t>(-1);
320 hss = kFullMojoHandleSignalsState;
192 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 321 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
193 core()->WaitMany(MakeUserPointer(handles), 322 core()->WaitMany(MakeUserPointer(handles),
194 MakeUserPointer(signals), 323 MakeUserPointer(signals),
195 1, 324 1,
196 MOJO_DEADLINE_INDEFINITE)); 325 MOJO_DEADLINE_INDEFINITE,
326 MakeUserPointer(&result_index),
327 MakeUserPointer(&hss)));
328 EXPECT_EQ(0u, result_index);
329 EXPECT_EQ(0u, hss.satisfied_signals);
330 EXPECT_EQ(0u, hss.satisfiable_signals);
331
332 // On invalid argument, it'll leave |signals_states| alone.
333 result_index = static_cast<uint32_t>(-1);
334 hss = kFullMojoHandleSignalsState;
197 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 335 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
198 core()->WaitMany(MakeUserPointer(handles), 336 core()->WaitMany(MakeUserPointer(handles),
199 MakeUserPointer(signals), 337 MakeUserPointer(signals),
200 2, 338 2,
201 MOJO_DEADLINE_INDEFINITE)); 339 MOJO_DEADLINE_INDEFINITE,
340 MakeUserPointer(&result_index),
341 MakeUserPointer(&hss)));
342 EXPECT_EQ(1u, result_index);
343 EXPECT_EQ(kFullMojoHandleSignalsState.satisfied_signals,
344 hss.satisfied_signals);
345 EXPECT_EQ(kFullMojoHandleSignalsState.satisfiable_signals,
346 hss.satisfiable_signals);
202 handles[1] = handles[0] + 1; // Invalid handle. 347 handles[1] = handles[0] + 1; // Invalid handle.
203 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 348 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
204 core()->WaitMany(MakeUserPointer(handles), 349 core()->WaitMany(MakeUserPointer(handles),
205 MakeUserPointer(signals), 350 MakeUserPointer(signals),
206 2, 351 2,
207 MOJO_DEADLINE_INDEFINITE)); 352 MOJO_DEADLINE_INDEFINITE,
353 NullUserPointer(),
354 NullUserPointer()));
208 handles[1] = CreateMockHandle(&info[1]); 355 handles[1] = CreateMockHandle(&info[1]);
209 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 356 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
210 core()->WaitMany(MakeUserPointer(handles), 357 core()->WaitMany(MakeUserPointer(handles),
211 MakeUserPointer(signals), 358 MakeUserPointer(signals),
212 2, 359 2,
213 MOJO_DEADLINE_INDEFINITE)); 360 MOJO_DEADLINE_INDEFINITE,
361 NullUserPointer(),
362 NullUserPointer()));
363
364 // TODO(vtl): Test one where we get "failed precondition" only for the
365 // second handle (and the first one is valid to wait on).
214 366
215 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0])); 367 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0]));
216 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1])); 368 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1]));
217 } 369 }
218 370
219 // |CreateMessagePipe()|: Nothing to check (apart from things that cause 371 // |CreateMessagePipe()|: Nothing to check (apart from things that cause
220 // death). 372 // death).
221 373
222 // |WriteMessage()|: 374 // |WriteMessage()|:
223 // Only check arguments checked by |Core|, namely |handle|, |handles|, and 375 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 // about checking arguments (which we would want to do if, e.g., we were in a 531 // about checking arguments (which we would want to do if, e.g., we were in a
380 // true "kernel" situation, but we might not want to do otherwise for 532 // true "kernel" situation, but we might not want to do otherwise for
381 // performance reasons). Probably blatant errors like passing in null pointers 533 // performance reasons). Probably blatant errors like passing in null pointers
382 // (for required pointer arguments) will still cause death, but perhaps not 534 // (for required pointer arguments) will still cause death, but perhaps not
383 // predictably. 535 // predictably.
384 TEST_F(CoreTest, InvalidArgumentsDeath) { 536 TEST_F(CoreTest, InvalidArgumentsDeath) {
385 const char kMemoryCheckFailedRegex[] = "Check failed"; 537 const char kMemoryCheckFailedRegex[] = "Check failed";
386 538
387 // |WaitMany()|: 539 // |WaitMany()|:
388 { 540 {
389 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; 541 MojoHandle handle = MOJO_HANDLE_INVALID;
390 MojoHandleSignals signals[2] = {~MOJO_HANDLE_SIGNAL_NONE, 542 MojoHandleSignals signals = ~MOJO_HANDLE_SIGNAL_NONE;
391 ~MOJO_HANDLE_SIGNAL_NONE};
392 EXPECT_DEATH_IF_SUPPORTED(core()->WaitMany(NullUserPointer(), 543 EXPECT_DEATH_IF_SUPPORTED(core()->WaitMany(NullUserPointer(),
393 MakeUserPointer(signals), 544 MakeUserPointer(&signals),
394 1, 545 1,
395 MOJO_DEADLINE_INDEFINITE), 546 MOJO_DEADLINE_INDEFINITE,
547 NullUserPointer(),
548 NullUserPointer()),
396 kMemoryCheckFailedRegex); 549 kMemoryCheckFailedRegex);
397 EXPECT_DEATH_IF_SUPPORTED(core()->WaitMany(MakeUserPointer(handles), 550 EXPECT_DEATH_IF_SUPPORTED(core()->WaitMany(MakeUserPointer(&handle),
398 NullUserPointer(), 551 NullUserPointer(),
399 1, 552 1,
400 MOJO_DEADLINE_INDEFINITE), 553 MOJO_DEADLINE_INDEFINITE,
554 NullUserPointer(),
555 NullUserPointer()),
401 kMemoryCheckFailedRegex); 556 kMemoryCheckFailedRegex);
557 // TODO(vtl): |result_index| and |signals_states| are optional. Test them
558 // with non-null invalid pointers?
402 } 559 }
403 560
404 // |CreateMessagePipe()|: 561 // |CreateMessagePipe()|:
405 { 562 {
406 MojoHandle h; 563 MojoHandle h;
407 EXPECT_DEATH_IF_SUPPORTED( 564 EXPECT_DEATH_IF_SUPPORTED(
408 core()->CreateMessagePipe( 565 core()->CreateMessagePipe(
409 NullUserPointer(), NullUserPointer(), NullUserPointer()), 566 NullUserPointer(), NullUserPointer(), NullUserPointer()),
410 kMemoryCheckFailedRegex); 567 kMemoryCheckFailedRegex);
411 EXPECT_DEATH_IF_SUPPORTED( 568 EXPECT_DEATH_IF_SUPPORTED(
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); 615 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
459 } 616 }
460 } 617 }
461 618
462 // TODO(vtl): test |Wait()| and |WaitMany()| properly 619 // TODO(vtl): test |Wait()| and |WaitMany()| properly
463 // - including |WaitMany()| with the same handle more than once (with 620 // - including |WaitMany()| with the same handle more than once (with
464 // same/different signals) 621 // same/different signals)
465 622
466 TEST_F(CoreTest, MessagePipe) { 623 TEST_F(CoreTest, MessagePipe) {
467 MojoHandle h[2]; 624 MojoHandle h[2];
625 MojoHandleSignalsState hss[2];
626 uint32_t result_index;
468 627
469 EXPECT_EQ( 628 EXPECT_EQ(
470 MOJO_RESULT_OK, 629 MOJO_RESULT_OK,
471 core()->CreateMessagePipe( 630 core()->CreateMessagePipe(
472 NullUserPointer(), MakeUserPointer(&h[0]), MakeUserPointer(&h[1]))); 631 NullUserPointer(), MakeUserPointer(&h[0]), MakeUserPointer(&h[1])));
473 // Should get two distinct, valid handles. 632 // Should get two distinct, valid handles.
474 EXPECT_NE(h[0], MOJO_HANDLE_INVALID); 633 EXPECT_NE(h[0], MOJO_HANDLE_INVALID);
475 EXPECT_NE(h[1], MOJO_HANDLE_INVALID); 634 EXPECT_NE(h[1], MOJO_HANDLE_INVALID);
476 EXPECT_NE(h[0], h[1]); 635 EXPECT_NE(h[0], h[1]);
477 636
478 // Neither should be readable. 637 // Neither should be readable.
479 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, 638 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE,
480 MOJO_HANDLE_SIGNAL_READABLE}; 639 MOJO_HANDLE_SIGNAL_READABLE};
481 EXPECT_EQ( 640 result_index = static_cast<uint32_t>(-1);
482 MOJO_RESULT_DEADLINE_EXCEEDED, 641 hss[0] = kEmptyMojoHandleSignalsState;
483 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 0)); 642 hss[1] = kEmptyMojoHandleSignalsState;
643 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
644 core()->WaitMany(MakeUserPointer(h),
645 MakeUserPointer(signals),
646 2,
647 0,
648 MakeUserPointer(&result_index),
649 MakeUserPointer(hss)));
650 EXPECT_EQ(static_cast<uint32_t>(-1), result_index);
651 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
652 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
653 hss[0].satisfiable_signals);
654 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
655 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
656 hss[1].satisfiable_signals);
484 657
485 // Try to read anyway. 658 // Try to read anyway.
486 char buffer[1] = {'a'}; 659 char buffer[1] = {'a'};
487 uint32_t buffer_size = 1; 660 uint32_t buffer_size = 1;
488 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, 661 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT,
489 core()->ReadMessage(h[0], 662 core()->ReadMessage(h[0],
490 UserPointer<void>(buffer), 663 UserPointer<void>(buffer),
491 MakeUserPointer(&buffer_size), 664 MakeUserPointer(&buffer_size),
492 NullUserPointer(), 665 NullUserPointer(),
493 NullUserPointer(), 666 NullUserPointer(),
494 MOJO_READ_MESSAGE_FLAG_NONE)); 667 MOJO_READ_MESSAGE_FLAG_NONE));
495 // Check that it left its inputs alone. 668 // Check that it left its inputs alone.
496 EXPECT_EQ('a', buffer[0]); 669 EXPECT_EQ('a', buffer[0]);
497 EXPECT_EQ(1u, buffer_size); 670 EXPECT_EQ(1u, buffer_size);
498 671
499 // Both should be writable. 672 // Both should be writable.
673 hss[0] = kEmptyMojoHandleSignalsState;
500 EXPECT_EQ(MOJO_RESULT_OK, 674 EXPECT_EQ(MOJO_RESULT_OK,
501 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); 675 core()->Wait(h[0],
676 MOJO_HANDLE_SIGNAL_WRITABLE,
677 1000000000,
678 MakeUserPointer(&hss[0])));
679 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
680 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
681 hss[0].satisfiable_signals);
682 hss[0] = kEmptyMojoHandleSignalsState;
502 EXPECT_EQ(MOJO_RESULT_OK, 683 EXPECT_EQ(MOJO_RESULT_OK,
503 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); 684 core()->Wait(h[1],
685 MOJO_HANDLE_SIGNAL_WRITABLE,
686 1000000000,
687 MakeUserPointer(&hss[0])));
688 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
689 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
690 hss[0].satisfiable_signals);
504 691
505 // Also check that |h[1]| is writable using |WaitMany()|. 692 // Also check that |h[1]| is writable using |WaitMany()|.
506 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; 693 signals[0] = MOJO_HANDLE_SIGNAL_READABLE;
507 signals[1] = MOJO_HANDLE_SIGNAL_WRITABLE; 694 signals[1] = MOJO_HANDLE_SIGNAL_WRITABLE;
508 EXPECT_EQ(1, 695 result_index = static_cast<uint32_t>(-1);
696 hss[0] = kEmptyMojoHandleSignalsState;
697 hss[1] = kEmptyMojoHandleSignalsState;
698 EXPECT_EQ(MOJO_RESULT_OK,
509 core()->WaitMany(MakeUserPointer(h), 699 core()->WaitMany(MakeUserPointer(h),
510 MakeUserPointer(signals), 700 MakeUserPointer(signals),
511 2, 701 2,
512 MOJO_DEADLINE_INDEFINITE)); 702 MOJO_DEADLINE_INDEFINITE,
703 MakeUserPointer(&result_index),
704 MakeUserPointer(hss)));
705 EXPECT_EQ(1u, result_index);
706 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
707 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
708 hss[0].satisfiable_signals);
709 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
710 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
711 hss[1].satisfiable_signals);
513 712
514 // Write to |h[1]|. 713 // Write to |h[1]|.
515 buffer[0] = 'b'; 714 buffer[0] = 'b';
516 EXPECT_EQ(MOJO_RESULT_OK, 715 EXPECT_EQ(MOJO_RESULT_OK,
517 core()->WriteMessage(h[1], 716 core()->WriteMessage(h[1],
518 UserPointer<const void>(buffer), 717 UserPointer<const void>(buffer),
519 1, 718 1,
520 NullUserPointer(), 719 NullUserPointer(),
521 0, 720 0,
522 MOJO_WRITE_MESSAGE_FLAG_NONE)); 721 MOJO_WRITE_MESSAGE_FLAG_NONE));
523 722
524 // Check that |h[0]| is now readable. 723 // Check that |h[0]| is now readable.
525 signals[0] = MOJO_HANDLE_SIGNAL_READABLE; 724 signals[0] = MOJO_HANDLE_SIGNAL_READABLE;
526 signals[1] = MOJO_HANDLE_SIGNAL_READABLE; 725 signals[1] = MOJO_HANDLE_SIGNAL_READABLE;
527 EXPECT_EQ(0, 726 result_index = static_cast<uint32_t>(-1);
727 hss[0] = kEmptyMojoHandleSignalsState;
728 hss[1] = kEmptyMojoHandleSignalsState;
729 EXPECT_EQ(MOJO_RESULT_OK,
528 core()->WaitMany(MakeUserPointer(h), 730 core()->WaitMany(MakeUserPointer(h),
529 MakeUserPointer(signals), 731 MakeUserPointer(signals),
530 2, 732 2,
531 MOJO_DEADLINE_INDEFINITE)); 733 MOJO_DEADLINE_INDEFINITE,
734 MakeUserPointer(&result_index),
735 MakeUserPointer(hss)));
736 EXPECT_EQ(0u, result_index);
737 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
738 hss[0].satisfied_signals);
739 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
740 hss[0].satisfiable_signals);
741 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[1].satisfied_signals);
742 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
743 hss[1].satisfiable_signals);
532 744
533 // Read from |h[0]|. 745 // Read from |h[0]|.
534 // First, get only the size. 746 // First, get only the size.
535 buffer_size = 0; 747 buffer_size = 0;
536 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, 748 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
537 core()->ReadMessage(h[0], 749 core()->ReadMessage(h[0],
538 NullUserPointer(), 750 NullUserPointer(),
539 MakeUserPointer(&buffer_size), 751 MakeUserPointer(&buffer_size),
540 NullUserPointer(), 752 NullUserPointer(),
541 NullUserPointer(), 753 NullUserPointer(),
542 MOJO_READ_MESSAGE_FLAG_NONE)); 754 MOJO_READ_MESSAGE_FLAG_NONE));
543 EXPECT_EQ(1u, buffer_size); 755 EXPECT_EQ(1u, buffer_size);
544 // Then actually read it. 756 // Then actually read it.
545 buffer[0] = 'c'; 757 buffer[0] = 'c';
546 buffer_size = 1; 758 buffer_size = 1;
547 EXPECT_EQ(MOJO_RESULT_OK, 759 EXPECT_EQ(MOJO_RESULT_OK,
548 core()->ReadMessage(h[0], 760 core()->ReadMessage(h[0],
549 UserPointer<void>(buffer), 761 UserPointer<void>(buffer),
550 MakeUserPointer(&buffer_size), 762 MakeUserPointer(&buffer_size),
551 NullUserPointer(), 763 NullUserPointer(),
552 NullUserPointer(), 764 NullUserPointer(),
553 MOJO_READ_MESSAGE_FLAG_NONE)); 765 MOJO_READ_MESSAGE_FLAG_NONE));
554 EXPECT_EQ('b', buffer[0]); 766 EXPECT_EQ('b', buffer[0]);
555 EXPECT_EQ(1u, buffer_size); 767 EXPECT_EQ(1u, buffer_size);
556 768
557 // |h[0]| should no longer be readable. 769 // |h[0]| should no longer be readable.
558 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, 770 hss[0] = kEmptyMojoHandleSignalsState;
559 core()->Wait(h[0], MOJO_HANDLE_SIGNAL_READABLE, 0)); 771 EXPECT_EQ(
772 MOJO_RESULT_DEADLINE_EXCEEDED,
773 core()->Wait(
774 h[0], MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss[0])));
775 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss[0].satisfied_signals);
776 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
777 hss[0].satisfiable_signals);
560 778
561 // Write to |h[0]|. 779 // Write to |h[0]|.
562 buffer[0] = 'd'; 780 buffer[0] = 'd';
563 EXPECT_EQ(MOJO_RESULT_OK, 781 EXPECT_EQ(MOJO_RESULT_OK,
564 core()->WriteMessage(h[0], 782 core()->WriteMessage(h[0],
565 UserPointer<const void>(buffer), 783 UserPointer<const void>(buffer),
566 1, 784 1,
567 NullUserPointer(), 785 NullUserPointer(),
568 0, 786 0,
569 MOJO_WRITE_MESSAGE_FLAG_NONE)); 787 MOJO_WRITE_MESSAGE_FLAG_NONE));
570 788
571 // Close |h[0]|. 789 // Close |h[0]|.
572 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0])); 790 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0]));
573 791
574 // Check that |h[1]| is no longer writable (and will never be). 792 // Check that |h[1]| is no longer writable (and will never be).
793 hss[0] = kEmptyMojoHandleSignalsState;
575 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 794 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
576 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000)); 795 core()->Wait(h[1],
796 MOJO_HANDLE_SIGNAL_WRITABLE,
797 1000000000,
798 MakeUserPointer(&hss[0])));
799 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfied_signals);
800 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfiable_signals);
577 801
578 // Check that |h[1]| is still readable (for the moment). 802 // Check that |h[1]| is still readable (for the moment).
803 hss[0] = kEmptyMojoHandleSignalsState;
579 EXPECT_EQ(MOJO_RESULT_OK, 804 EXPECT_EQ(MOJO_RESULT_OK,
580 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 805 core()->Wait(h[1],
806 MOJO_HANDLE_SIGNAL_READABLE,
807 1000000000,
808 MakeUserPointer(&hss[0])));
809 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfied_signals);
810 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss[0].satisfiable_signals);
581 811
582 // Discard a message from |h[1]|. 812 // Discard a message from |h[1]|.
583 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, 813 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
584 core()->ReadMessage(h[1], 814 core()->ReadMessage(h[1],
585 NullUserPointer(), 815 NullUserPointer(),
586 NullUserPointer(), 816 NullUserPointer(),
587 NullUserPointer(), 817 NullUserPointer(),
588 NullUserPointer(), 818 NullUserPointer(),
589 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD)); 819 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD));
590 820
591 // |h[1]| is no longer readable (and will never be). 821 // |h[1]| is no longer readable (and will never be).
822 hss[0] = kFullMojoHandleSignalsState;
592 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 823 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
593 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 824 core()->Wait(h[1],
825 MOJO_HANDLE_SIGNAL_READABLE,
826 1000000000,
827 MakeUserPointer(&hss[0])));
828 EXPECT_EQ(0u, hss[0].satisfied_signals);
829 EXPECT_EQ(0u, hss[0].satisfiable_signals);
594 830
595 // Try writing to |h[1]|. 831 // Try writing to |h[1]|.
596 buffer[0] = 'e'; 832 buffer[0] = 'e';
597 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 833 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
598 core()->WriteMessage(h[1], 834 core()->WriteMessage(h[1],
599 UserPointer<const void>(buffer), 835 UserPointer<const void>(buffer),
600 1, 836 1,
601 NullUserPointer(), 837 NullUserPointer(),
602 0, 838 0,
603 MOJO_WRITE_MESSAGE_FLAG_NONE)); 839 MOJO_WRITE_MESSAGE_FLAG_NONE));
604 840
605 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1])); 841 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1]));
606 } 842 }
607 843
608 // Tests passing a message pipe handle. 844 // Tests passing a message pipe handle.
609 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) { 845 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) {
610 const char kHello[] = "hello"; 846 const char kHello[] = "hello";
611 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); 847 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
612 const char kWorld[] = "world!!!"; 848 const char kWorld[] = "world!!!";
613 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); 849 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
614 char buffer[100]; 850 char buffer[100];
615 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 851 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
616 uint32_t num_bytes; 852 uint32_t num_bytes;
617 MojoHandle handles[10]; 853 MojoHandle handles[10];
618 uint32_t num_handles; 854 uint32_t num_handles;
855 MojoHandleSignalsState hss;
619 MojoHandle h_received; 856 MojoHandle h_received;
620 857
621 MojoHandle h_passing[2]; 858 MojoHandle h_passing[2];
622 EXPECT_EQ(MOJO_RESULT_OK, 859 EXPECT_EQ(MOJO_RESULT_OK,
623 core()->CreateMessagePipe(NullUserPointer(), 860 core()->CreateMessagePipe(NullUserPointer(),
624 MakeUserPointer(&h_passing[0]), 861 MakeUserPointer(&h_passing[0]),
625 MakeUserPointer(&h_passing[1]))); 862 MakeUserPointer(&h_passing[1])));
626 863
627 // Make sure that |h_passing[]| work properly. 864 // Make sure that |h_passing[]| work properly.
628 EXPECT_EQ(MOJO_RESULT_OK, 865 EXPECT_EQ(MOJO_RESULT_OK,
629 core()->WriteMessage(h_passing[0], 866 core()->WriteMessage(h_passing[0],
630 UserPointer<const void>(kHello), 867 UserPointer<const void>(kHello),
631 kHelloSize, 868 kHelloSize,
632 NullUserPointer(), 869 NullUserPointer(),
633 0, 870 0,
634 MOJO_WRITE_MESSAGE_FLAG_NONE)); 871 MOJO_WRITE_MESSAGE_FLAG_NONE));
635 EXPECT_EQ( 872 hss = kEmptyMojoHandleSignalsState;
636 MOJO_RESULT_OK, 873 EXPECT_EQ(MOJO_RESULT_OK,
637 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 874 core()->Wait(h_passing[1],
875 MOJO_HANDLE_SIGNAL_READABLE,
876 1000000000,
877 MakeUserPointer(&hss)));
878 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
879 hss.satisfied_signals);
880 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
881 hss.satisfiable_signals);
638 num_bytes = kBufferSize; 882 num_bytes = kBufferSize;
639 num_handles = arraysize(handles); 883 num_handles = arraysize(handles);
640 EXPECT_EQ(MOJO_RESULT_OK, 884 EXPECT_EQ(MOJO_RESULT_OK,
641 core()->ReadMessage(h_passing[1], 885 core()->ReadMessage(h_passing[1],
642 UserPointer<void>(buffer), 886 UserPointer<void>(buffer),
643 MakeUserPointer(&num_bytes), 887 MakeUserPointer(&num_bytes),
644 MakeUserPointer(handles), 888 MakeUserPointer(handles),
645 MakeUserPointer(&num_handles), 889 MakeUserPointer(&num_handles),
646 MOJO_READ_MESSAGE_FLAG_NONE)); 890 MOJO_READ_MESSAGE_FLAG_NONE));
647 EXPECT_EQ(kHelloSize, num_bytes); 891 EXPECT_EQ(kHelloSize, num_bytes);
(...skipping 24 matching lines...) Expand all
672 MakeUserPointer(&h_passed[1]))); 916 MakeUserPointer(&h_passed[1])));
673 917
674 // Make sure that |h_passed[]| work properly. 918 // Make sure that |h_passed[]| work properly.
675 EXPECT_EQ(MOJO_RESULT_OK, 919 EXPECT_EQ(MOJO_RESULT_OK,
676 core()->WriteMessage(h_passed[0], 920 core()->WriteMessage(h_passed[0],
677 UserPointer<const void>(kHello), 921 UserPointer<const void>(kHello),
678 kHelloSize, 922 kHelloSize,
679 NullUserPointer(), 923 NullUserPointer(),
680 0, 924 0,
681 MOJO_WRITE_MESSAGE_FLAG_NONE)); 925 MOJO_WRITE_MESSAGE_FLAG_NONE));
926 hss = kEmptyMojoHandleSignalsState;
682 EXPECT_EQ(MOJO_RESULT_OK, 927 EXPECT_EQ(MOJO_RESULT_OK,
683 core()->Wait(h_passed[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 928 core()->Wait(h_passed[1],
929 MOJO_HANDLE_SIGNAL_READABLE,
930 1000000000,
931 MakeUserPointer(&hss)));
932 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
933 hss.satisfied_signals);
934 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
935 hss.satisfiable_signals);
684 num_bytes = kBufferSize; 936 num_bytes = kBufferSize;
685 num_handles = arraysize(handles); 937 num_handles = arraysize(handles);
686 EXPECT_EQ(MOJO_RESULT_OK, 938 EXPECT_EQ(MOJO_RESULT_OK,
687 core()->ReadMessage(h_passed[1], 939 core()->ReadMessage(h_passed[1],
688 UserPointer<void>(buffer), 940 UserPointer<void>(buffer),
689 MakeUserPointer(&num_bytes), 941 MakeUserPointer(&num_bytes),
690 MakeUserPointer(handles), 942 MakeUserPointer(handles),
691 MakeUserPointer(&num_handles), 943 MakeUserPointer(&num_handles),
692 MOJO_READ_MESSAGE_FLAG_NONE)); 944 MOJO_READ_MESSAGE_FLAG_NONE));
693 EXPECT_EQ(kHelloSize, num_bytes); 945 EXPECT_EQ(kHelloSize, num_bytes);
694 EXPECT_STREQ(kHello, buffer); 946 EXPECT_STREQ(kHello, buffer);
695 EXPECT_EQ(0u, num_handles); 947 EXPECT_EQ(0u, num_handles);
696 948
697 // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|. 949 // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|.
698 EXPECT_EQ(MOJO_RESULT_OK, 950 EXPECT_EQ(MOJO_RESULT_OK,
699 core()->WriteMessage(h_passing[0], 951 core()->WriteMessage(h_passing[0],
700 UserPointer<const void>(kWorld), 952 UserPointer<const void>(kWorld),
701 kWorldSize, 953 kWorldSize,
702 MakeUserPointer(&h_passed[1]), 954 MakeUserPointer(&h_passed[1]),
703 1, 955 1,
704 MOJO_WRITE_MESSAGE_FLAG_NONE)); 956 MOJO_WRITE_MESSAGE_FLAG_NONE));
705 EXPECT_EQ( 957 hss = kEmptyMojoHandleSignalsState;
706 MOJO_RESULT_OK, 958 EXPECT_EQ(MOJO_RESULT_OK,
707 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 959 core()->Wait(h_passing[1],
960 MOJO_HANDLE_SIGNAL_READABLE,
961 1000000000,
962 MakeUserPointer(&hss)));
963 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
964 hss.satisfied_signals);
965 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
966 hss.satisfiable_signals);
708 num_bytes = kBufferSize; 967 num_bytes = kBufferSize;
709 num_handles = arraysize(handles); 968 num_handles = arraysize(handles);
710 EXPECT_EQ(MOJO_RESULT_OK, 969 EXPECT_EQ(MOJO_RESULT_OK,
711 core()->ReadMessage(h_passing[1], 970 core()->ReadMessage(h_passing[1],
712 UserPointer<void>(buffer), 971 UserPointer<void>(buffer),
713 MakeUserPointer(&num_bytes), 972 MakeUserPointer(&num_bytes),
714 MakeUserPointer(handles), 973 MakeUserPointer(handles),
715 MakeUserPointer(&num_handles), 974 MakeUserPointer(&num_handles),
716 MOJO_READ_MESSAGE_FLAG_NONE)); 975 MOJO_READ_MESSAGE_FLAG_NONE));
717 EXPECT_EQ(kWorldSize, num_bytes); 976 EXPECT_EQ(kWorldSize, num_bytes);
(...skipping 13 matching lines...) Expand all
731 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1])); 990 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h_passed[1]));
732 991
733 // Write to |h_passed[0]|. Should receive on |h_received|. 992 // Write to |h_passed[0]|. Should receive on |h_received|.
734 EXPECT_EQ(MOJO_RESULT_OK, 993 EXPECT_EQ(MOJO_RESULT_OK,
735 core()->WriteMessage(h_passed[0], 994 core()->WriteMessage(h_passed[0],
736 UserPointer<const void>(kHello), 995 UserPointer<const void>(kHello),
737 kHelloSize, 996 kHelloSize,
738 NullUserPointer(), 997 NullUserPointer(),
739 0, 998 0,
740 MOJO_WRITE_MESSAGE_FLAG_NONE)); 999 MOJO_WRITE_MESSAGE_FLAG_NONE));
1000 hss = kEmptyMojoHandleSignalsState;
741 EXPECT_EQ(MOJO_RESULT_OK, 1001 EXPECT_EQ(MOJO_RESULT_OK,
742 core()->Wait(h_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 1002 core()->Wait(h_received,
1003 MOJO_HANDLE_SIGNAL_READABLE,
1004 1000000000,
1005 MakeUserPointer(&hss)));
1006 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1007 hss.satisfied_signals);
1008 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1009 hss.satisfiable_signals);
743 num_bytes = kBufferSize; 1010 num_bytes = kBufferSize;
744 num_handles = arraysize(handles); 1011 num_handles = arraysize(handles);
745 EXPECT_EQ(MOJO_RESULT_OK, 1012 EXPECT_EQ(MOJO_RESULT_OK,
746 core()->ReadMessage(h_received, 1013 core()->ReadMessage(h_received,
747 UserPointer<void>(buffer), 1014 UserPointer<void>(buffer),
748 MakeUserPointer(&num_bytes), 1015 MakeUserPointer(&num_bytes),
749 MakeUserPointer(handles), 1016 MakeUserPointer(handles),
750 MakeUserPointer(&num_handles), 1017 MakeUserPointer(&num_handles),
751 MOJO_READ_MESSAGE_FLAG_NONE)); 1018 MOJO_READ_MESSAGE_FLAG_NONE));
752 EXPECT_EQ(kHelloSize, num_bytes); 1019 EXPECT_EQ(kHelloSize, num_bytes);
753 EXPECT_STREQ(kHello, buffer); 1020 EXPECT_STREQ(kHello, buffer);
754 EXPECT_EQ(0u, num_handles); 1021 EXPECT_EQ(0u, num_handles);
755 1022
756 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); 1023 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0]));
757 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); 1024 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1]));
758 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0])); 1025 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0]));
759 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received)); 1026 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received));
760 } 1027 }
761 1028
762 TEST_F(CoreTest, DataPipe) { 1029 TEST_F(CoreTest, DataPipe) {
763 MojoHandle ph, ch; // p is for producer and c is for consumer. 1030 MojoHandle ph, ch; // p is for producer and c is for consumer.
1031 MojoHandleSignalsState hss;
764 1032
765 EXPECT_EQ(MOJO_RESULT_OK, 1033 EXPECT_EQ(MOJO_RESULT_OK,
766 core()->CreateDataPipe( 1034 core()->CreateDataPipe(
767 NullUserPointer(), MakeUserPointer(&ph), MakeUserPointer(&ch))); 1035 NullUserPointer(), MakeUserPointer(&ph), MakeUserPointer(&ch)));
768 // Should get two distinct, valid handles. 1036 // Should get two distinct, valid handles.
769 EXPECT_NE(ph, MOJO_HANDLE_INVALID); 1037 EXPECT_NE(ph, MOJO_HANDLE_INVALID);
770 EXPECT_NE(ch, MOJO_HANDLE_INVALID); 1038 EXPECT_NE(ch, MOJO_HANDLE_INVALID);
771 EXPECT_NE(ph, ch); 1039 EXPECT_NE(ph, ch);
772 1040
773 // Producer should be never-readable, but already writable. 1041 // Producer should be never-readable, but already writable.
774 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 1042 hss = kEmptyMojoHandleSignalsState;
775 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0)); 1043 EXPECT_EQ(
776 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); 1044 MOJO_RESULT_FAILED_PRECONDITION,
1045 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1046 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
1047 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
1048 hss = kEmptyMojoHandleSignalsState;
1049 EXPECT_EQ(
1050 MOJO_RESULT_OK,
1051 core()->Wait(ph, MOJO_HANDLE_SIGNAL_WRITABLE, 0, MakeUserPointer(&hss)));
1052 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
1053 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals);
777 1054
778 // Consumer should be never-writable, and not yet readable. 1055 // Consumer should be never-writable, and not yet readable.
779 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 1056 hss = kFullMojoHandleSignalsState;
780 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); 1057 EXPECT_EQ(
781 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, 1058 MOJO_RESULT_FAILED_PRECONDITION,
782 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); 1059 core()->Wait(ch, MOJO_HANDLE_SIGNAL_WRITABLE, 0, MakeUserPointer(&hss)));
1060 EXPECT_EQ(0u, hss.satisfied_signals);
1061 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
1062 hss = kFullMojoHandleSignalsState;
1063 EXPECT_EQ(
1064 MOJO_RESULT_DEADLINE_EXCEEDED,
1065 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1066 EXPECT_EQ(0u, hss.satisfied_signals);
1067 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
783 1068
784 // Write. 1069 // Write.
785 char elements[2] = {'A', 'B'}; 1070 char elements[2] = {'A', 'B'};
786 uint32_t num_bytes = 2u; 1071 uint32_t num_bytes = 2u;
787 EXPECT_EQ(MOJO_RESULT_OK, 1072 EXPECT_EQ(MOJO_RESULT_OK,
788 core()->WriteData(ph, 1073 core()->WriteData(ph,
789 UserPointer<const void>(elements), 1074 UserPointer<const void>(elements),
790 MakeUserPointer(&num_bytes), 1075 MakeUserPointer(&num_bytes),
791 MOJO_WRITE_DATA_FLAG_NONE)); 1076 MOJO_WRITE_DATA_FLAG_NONE));
792 EXPECT_EQ(2u, num_bytes); 1077 EXPECT_EQ(2u, num_bytes);
793 1078
794 // Consumer should now be readable. 1079 // Consumer should now be readable.
795 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); 1080 hss = kEmptyMojoHandleSignalsState;
1081 EXPECT_EQ(
1082 MOJO_RESULT_OK,
1083 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1084 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
1085 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
796 1086
797 // Read one character. 1087 // Read one character.
798 elements[0] = -1; 1088 elements[0] = -1;
799 elements[1] = -1; 1089 elements[1] = -1;
800 num_bytes = 1u; 1090 num_bytes = 1u;
801 EXPECT_EQ(MOJO_RESULT_OK, 1091 EXPECT_EQ(MOJO_RESULT_OK,
802 core()->ReadData(ch, 1092 core()->ReadData(ch,
803 UserPointer<void>(elements), 1093 UserPointer<void>(elements),
804 MakeUserPointer(&num_bytes), 1094 MakeUserPointer(&num_bytes),
805 MOJO_READ_DATA_FLAG_NONE)); 1095 MOJO_READ_DATA_FLAG_NONE));
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
877 NullUserPointer(), 1167 NullUserPointer(),
878 MakeUserPointer(&num_bytes), 1168 MakeUserPointer(&num_bytes),
879 MOJO_READ_DATA_FLAG_DISCARD)); 1169 MOJO_READ_DATA_FLAG_DISCARD));
880 1170
881 // Actually check our data and end the two-phase read. 1171 // Actually check our data and end the two-phase read.
882 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[0]); 1172 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[0]);
883 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[1]); 1173 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[1]);
884 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u)); 1174 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u));
885 1175
886 // Consumer should now be no longer readable. 1176 // Consumer should now be no longer readable.
887 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, 1177 hss = kFullMojoHandleSignalsState;
888 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); 1178 EXPECT_EQ(
1179 MOJO_RESULT_DEADLINE_EXCEEDED,
1180 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1181 EXPECT_EQ(0u, hss.satisfied_signals);
1182 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
889 1183
890 // TODO(vtl): More. 1184 // TODO(vtl): More.
891 1185
892 // Close the producer. 1186 // Close the producer.
893 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); 1187 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
894 1188
895 // The consumer should now be never-readable. 1189 // The consumer should now be never-readable.
896 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 1190 hss = kFullMojoHandleSignalsState;
897 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0)); 1191 EXPECT_EQ(
1192 MOJO_RESULT_FAILED_PRECONDITION,
1193 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1194 EXPECT_EQ(0u, hss.satisfied_signals);
1195 EXPECT_EQ(0u, hss.satisfiable_signals);
898 1196
899 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); 1197 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
900 } 1198 }
901 1199
902 // Tests passing data pipe producer and consumer handles. 1200 // Tests passing data pipe producer and consumer handles.
903 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) { 1201 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) {
904 const char kHello[] = "hello"; 1202 const char kHello[] = "hello";
905 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); 1203 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello));
906 const char kWorld[] = "world!!!"; 1204 const char kWorld[] = "world!!!";
907 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); 1205 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld));
908 char buffer[100]; 1206 char buffer[100];
909 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); 1207 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
910 uint32_t num_bytes; 1208 uint32_t num_bytes;
911 MojoHandle handles[10]; 1209 MojoHandle handles[10];
912 uint32_t num_handles; 1210 uint32_t num_handles;
1211 MojoHandleSignalsState hss;
913 1212
914 MojoHandle h_passing[2]; 1213 MojoHandle h_passing[2];
915 EXPECT_EQ(MOJO_RESULT_OK, 1214 EXPECT_EQ(MOJO_RESULT_OK,
916 core()->CreateMessagePipe(NullUserPointer(), 1215 core()->CreateMessagePipe(NullUserPointer(),
917 MakeUserPointer(&h_passing[0]), 1216 MakeUserPointer(&h_passing[0]),
918 MakeUserPointer(&h_passing[1]))); 1217 MakeUserPointer(&h_passing[1])));
919 1218
920 MojoHandle ph, ch; 1219 MojoHandle ph, ch;
921 EXPECT_EQ(MOJO_RESULT_OK, 1220 EXPECT_EQ(MOJO_RESULT_OK,
922 core()->CreateDataPipe( 1221 core()->CreateDataPipe(
923 NullUserPointer(), MakeUserPointer(&ph), MakeUserPointer(&ch))); 1222 NullUserPointer(), MakeUserPointer(&ph), MakeUserPointer(&ch)));
924 1223
925 // Send |ch| from |h_passing[0]| to |h_passing[1]|. 1224 // Send |ch| from |h_passing[0]| to |h_passing[1]|.
926 EXPECT_EQ(MOJO_RESULT_OK, 1225 EXPECT_EQ(MOJO_RESULT_OK,
927 core()->WriteMessage(h_passing[0], 1226 core()->WriteMessage(h_passing[0],
928 UserPointer<const void>(kHello), 1227 UserPointer<const void>(kHello),
929 kHelloSize, 1228 kHelloSize,
930 MakeUserPointer(&ch), 1229 MakeUserPointer(&ch),
931 1, 1230 1,
932 MOJO_WRITE_MESSAGE_FLAG_NONE)); 1231 MOJO_WRITE_MESSAGE_FLAG_NONE));
933 EXPECT_EQ( 1232 hss = kEmptyMojoHandleSignalsState;
934 MOJO_RESULT_OK, 1233 EXPECT_EQ(MOJO_RESULT_OK,
935 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 1234 core()->Wait(h_passing[1],
1235 MOJO_HANDLE_SIGNAL_READABLE,
1236 1000000000,
1237 MakeUserPointer(&hss)));
1238 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1239 hss.satisfied_signals);
1240 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1241 hss.satisfiable_signals);
936 num_bytes = kBufferSize; 1242 num_bytes = kBufferSize;
937 num_handles = arraysize(handles); 1243 num_handles = arraysize(handles);
938 EXPECT_EQ(MOJO_RESULT_OK, 1244 EXPECT_EQ(MOJO_RESULT_OK,
939 core()->ReadMessage(h_passing[1], 1245 core()->ReadMessage(h_passing[1],
940 UserPointer<void>(buffer), 1246 UserPointer<void>(buffer),
941 MakeUserPointer(&num_bytes), 1247 MakeUserPointer(&num_bytes),
942 MakeUserPointer(handles), 1248 MakeUserPointer(handles),
943 MakeUserPointer(&num_handles), 1249 MakeUserPointer(&num_handles),
944 MOJO_READ_MESSAGE_FLAG_NONE)); 1250 MOJO_READ_MESSAGE_FLAG_NONE));
945 EXPECT_EQ(kHelloSize, num_bytes); 1251 EXPECT_EQ(kHelloSize, num_bytes);
(...skipping 12 matching lines...) Expand all
958 // above note. 1264 // above note.
959 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch)); 1265 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ch));
960 1266
961 // Write to |ph|. Should receive on |ch_received|. 1267 // Write to |ph|. Should receive on |ch_received|.
962 num_bytes = kWorldSize; 1268 num_bytes = kWorldSize;
963 EXPECT_EQ(MOJO_RESULT_OK, 1269 EXPECT_EQ(MOJO_RESULT_OK,
964 core()->WriteData(ph, 1270 core()->WriteData(ph,
965 UserPointer<const void>(kWorld), 1271 UserPointer<const void>(kWorld),
966 MakeUserPointer(&num_bytes), 1272 MakeUserPointer(&num_bytes),
967 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); 1273 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
1274 hss = kEmptyMojoHandleSignalsState;
968 EXPECT_EQ(MOJO_RESULT_OK, 1275 EXPECT_EQ(MOJO_RESULT_OK,
969 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 1276 core()->Wait(ch_received,
1277 MOJO_HANDLE_SIGNAL_READABLE,
1278 1000000000,
1279 MakeUserPointer(&hss)));
1280 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
1281 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
970 num_bytes = kBufferSize; 1282 num_bytes = kBufferSize;
971 EXPECT_EQ(MOJO_RESULT_OK, 1283 EXPECT_EQ(MOJO_RESULT_OK,
972 core()->ReadData(ch_received, 1284 core()->ReadData(ch_received,
973 UserPointer<void>(buffer), 1285 UserPointer<void>(buffer),
974 MakeUserPointer(&num_bytes), 1286 MakeUserPointer(&num_bytes),
975 MOJO_READ_MESSAGE_FLAG_NONE)); 1287 MOJO_READ_MESSAGE_FLAG_NONE));
976 EXPECT_EQ(kWorldSize, num_bytes); 1288 EXPECT_EQ(kWorldSize, num_bytes);
977 EXPECT_STREQ(kWorld, buffer); 1289 EXPECT_STREQ(kWorld, buffer);
978 1290
979 // Now pass |ph| in the same direction. 1291 // Now pass |ph| in the same direction.
980 EXPECT_EQ(MOJO_RESULT_OK, 1292 EXPECT_EQ(MOJO_RESULT_OK,
981 core()->WriteMessage(h_passing[0], 1293 core()->WriteMessage(h_passing[0],
982 UserPointer<const void>(kWorld), 1294 UserPointer<const void>(kWorld),
983 kWorldSize, 1295 kWorldSize,
984 MakeUserPointer(&ph), 1296 MakeUserPointer(&ph),
985 1, 1297 1,
986 MOJO_WRITE_MESSAGE_FLAG_NONE)); 1298 MOJO_WRITE_MESSAGE_FLAG_NONE));
987 EXPECT_EQ( 1299 hss = kEmptyMojoHandleSignalsState;
988 MOJO_RESULT_OK, 1300 EXPECT_EQ(MOJO_RESULT_OK,
989 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 1301 core()->Wait(h_passing[1],
1302 MOJO_HANDLE_SIGNAL_READABLE,
1303 1000000000,
1304 MakeUserPointer(&hss)));
1305 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1306 hss.satisfied_signals);
1307 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1308 hss.satisfiable_signals);
990 num_bytes = kBufferSize; 1309 num_bytes = kBufferSize;
991 num_handles = arraysize(handles); 1310 num_handles = arraysize(handles);
992 EXPECT_EQ(MOJO_RESULT_OK, 1311 EXPECT_EQ(MOJO_RESULT_OK,
993 core()->ReadMessage(h_passing[1], 1312 core()->ReadMessage(h_passing[1],
994 UserPointer<void>(buffer), 1313 UserPointer<void>(buffer),
995 MakeUserPointer(&num_bytes), 1314 MakeUserPointer(&num_bytes),
996 MakeUserPointer(handles), 1315 MakeUserPointer(handles),
997 MakeUserPointer(&num_handles), 1316 MakeUserPointer(&num_handles),
998 MOJO_READ_MESSAGE_FLAG_NONE)); 1317 MOJO_READ_MESSAGE_FLAG_NONE));
999 EXPECT_EQ(kWorldSize, num_bytes); 1318 EXPECT_EQ(kWorldSize, num_bytes);
(...skipping 12 matching lines...) Expand all
1012 // above note. 1331 // above note.
1013 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph)); 1332 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(ph));
1014 1333
1015 // Write to |ph_received|. Should receive on |ch_received|. 1334 // Write to |ph_received|. Should receive on |ch_received|.
1016 num_bytes = kHelloSize; 1335 num_bytes = kHelloSize;
1017 EXPECT_EQ(MOJO_RESULT_OK, 1336 EXPECT_EQ(MOJO_RESULT_OK,
1018 core()->WriteData(ph_received, 1337 core()->WriteData(ph_received,
1019 UserPointer<const void>(kHello), 1338 UserPointer<const void>(kHello),
1020 MakeUserPointer(&num_bytes), 1339 MakeUserPointer(&num_bytes),
1021 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE)); 1340 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
1341 hss = kEmptyMojoHandleSignalsState;
1022 EXPECT_EQ(MOJO_RESULT_OK, 1342 EXPECT_EQ(MOJO_RESULT_OK,
1023 core()->Wait(ch_received, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 1343 core()->Wait(ch_received,
1344 MOJO_HANDLE_SIGNAL_READABLE,
1345 1000000000,
1346 MakeUserPointer(&hss)));
1347 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
1348 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
1024 num_bytes = kBufferSize; 1349 num_bytes = kBufferSize;
1025 EXPECT_EQ(MOJO_RESULT_OK, 1350 EXPECT_EQ(MOJO_RESULT_OK,
1026 core()->ReadData(ch_received, 1351 core()->ReadData(ch_received,
1027 UserPointer<void>(buffer), 1352 UserPointer<void>(buffer),
1028 MakeUserPointer(&num_bytes), 1353 MakeUserPointer(&num_bytes),
1029 MOJO_READ_MESSAGE_FLAG_NONE)); 1354 MOJO_READ_MESSAGE_FLAG_NONE));
1030 EXPECT_EQ(kHelloSize, num_bytes); 1355 EXPECT_EQ(kHelloSize, num_bytes);
1031 EXPECT_STREQ(kHello, buffer); 1356 EXPECT_STREQ(kHello, buffer);
1032 1357
1033 ph = ph_received; 1358 ph = ph_received;
(...skipping 20 matching lines...) Expand all
1054 1379
1055 // But |ch| can, even if |ph| is in a two-phase write. 1380 // But |ch| can, even if |ph| is in a two-phase write.
1056 EXPECT_EQ(MOJO_RESULT_OK, 1381 EXPECT_EQ(MOJO_RESULT_OK,
1057 core()->WriteMessage(h_passing[0], 1382 core()->WriteMessage(h_passing[0],
1058 UserPointer<const void>(kHello), 1383 UserPointer<const void>(kHello),
1059 kHelloSize, 1384 kHelloSize,
1060 MakeUserPointer(&ch), 1385 MakeUserPointer(&ch),
1061 1, 1386 1,
1062 MOJO_WRITE_MESSAGE_FLAG_NONE)); 1387 MOJO_WRITE_MESSAGE_FLAG_NONE));
1063 ch = MOJO_HANDLE_INVALID; 1388 ch = MOJO_HANDLE_INVALID;
1064 EXPECT_EQ( 1389 EXPECT_EQ(MOJO_RESULT_OK,
1065 MOJO_RESULT_OK, 1390 core()->Wait(h_passing[1],
1066 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 1391 MOJO_HANDLE_SIGNAL_READABLE,
1392 1000000000,
1393 NullUserPointer()));
1067 num_bytes = kBufferSize; 1394 num_bytes = kBufferSize;
1068 num_handles = arraysize(handles); 1395 num_handles = arraysize(handles);
1069 EXPECT_EQ(MOJO_RESULT_OK, 1396 EXPECT_EQ(MOJO_RESULT_OK,
1070 core()->ReadMessage(h_passing[1], 1397 core()->ReadMessage(h_passing[1],
1071 UserPointer<void>(buffer), 1398 UserPointer<void>(buffer),
1072 MakeUserPointer(&num_bytes), 1399 MakeUserPointer(&num_bytes),
1073 MakeUserPointer(handles), 1400 MakeUserPointer(handles),
1074 MakeUserPointer(&num_handles), 1401 MakeUserPointer(&num_handles),
1075 MOJO_READ_MESSAGE_FLAG_NONE)); 1402 MOJO_READ_MESSAGE_FLAG_NONE));
1076 EXPECT_EQ(kHelloSize, num_bytes); 1403 EXPECT_EQ(kHelloSize, num_bytes);
1077 EXPECT_STREQ(kHello, buffer); 1404 EXPECT_STREQ(kHello, buffer);
1078 EXPECT_EQ(1u, num_handles); 1405 EXPECT_EQ(1u, num_handles);
1079 ch = handles[0]; 1406 ch = handles[0];
1080 EXPECT_NE(ch, MOJO_HANDLE_INVALID); 1407 EXPECT_NE(ch, MOJO_HANDLE_INVALID);
1081 1408
1082 // Complete the two-phase write. 1409 // Complete the two-phase write.
1083 static_cast<char*>(write_ptr)[0] = 'x'; 1410 static_cast<char*>(write_ptr)[0] = 'x';
1084 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1)); 1411 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 1));
1085 1412
1086 // Wait for |ch| to be readable. 1413 // Wait for |ch| to be readable.
1087 EXPECT_EQ(MOJO_RESULT_OK, 1414 hss = kEmptyMojoHandleSignalsState;
1088 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 1415 EXPECT_EQ(
1416 MOJO_RESULT_OK,
1417 core()->Wait(
1418 ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000, MakeUserPointer(&hss)));
1419 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
1420 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals);
1089 1421
1090 // Make sure that |ch| can't be sent if it's in a two-phase read. 1422 // Make sure that |ch| can't be sent if it's in a two-phase read.
1091 const void* read_ptr = NULL; 1423 const void* read_ptr = NULL;
1092 num_bytes = 1; 1424 num_bytes = 1;
1093 ASSERT_EQ(MOJO_RESULT_OK, 1425 ASSERT_EQ(MOJO_RESULT_OK,
1094 core()->BeginReadData(ch, 1426 core()->BeginReadData(ch,
1095 MakeUserPointer(&read_ptr), 1427 MakeUserPointer(&read_ptr),
1096 MakeUserPointer(&num_bytes), 1428 MakeUserPointer(&num_bytes),
1097 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); 1429 MOJO_READ_DATA_FLAG_ALL_OR_NONE));
1098 EXPECT_EQ(MOJO_RESULT_BUSY, 1430 EXPECT_EQ(MOJO_RESULT_BUSY,
1099 core()->WriteMessage(h_passing[0], 1431 core()->WriteMessage(h_passing[0],
1100 UserPointer<const void>(kHello), 1432 UserPointer<const void>(kHello),
1101 kHelloSize, 1433 kHelloSize,
1102 MakeUserPointer(&ch), 1434 MakeUserPointer(&ch),
1103 1, 1435 1,
1104 MOJO_WRITE_MESSAGE_FLAG_NONE)); 1436 MOJO_WRITE_MESSAGE_FLAG_NONE));
1105 1437
1106 // But |ph| can, even if |ch| is in a two-phase read. 1438 // But |ph| can, even if |ch| is in a two-phase read.
1107 EXPECT_EQ(MOJO_RESULT_OK, 1439 EXPECT_EQ(MOJO_RESULT_OK,
1108 core()->WriteMessage(h_passing[0], 1440 core()->WriteMessage(h_passing[0],
1109 UserPointer<const void>(kWorld), 1441 UserPointer<const void>(kWorld),
1110 kWorldSize, 1442 kWorldSize,
1111 MakeUserPointer(&ph), 1443 MakeUserPointer(&ph),
1112 1, 1444 1,
1113 MOJO_WRITE_MESSAGE_FLAG_NONE)); 1445 MOJO_WRITE_MESSAGE_FLAG_NONE));
1114 ph = MOJO_HANDLE_INVALID; 1446 ph = MOJO_HANDLE_INVALID;
1115 EXPECT_EQ( 1447 hss = kEmptyMojoHandleSignalsState;
1116 MOJO_RESULT_OK, 1448 EXPECT_EQ(MOJO_RESULT_OK,
1117 core()->Wait(h_passing[1], MOJO_HANDLE_SIGNAL_READABLE, 1000000000)); 1449 core()->Wait(h_passing[1],
1450 MOJO_HANDLE_SIGNAL_READABLE,
1451 1000000000,
1452 MakeUserPointer(&hss)));
1453 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1454 hss.satisfied_signals);
1455 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE,
1456 hss.satisfiable_signals);
1118 num_bytes = kBufferSize; 1457 num_bytes = kBufferSize;
1119 num_handles = arraysize(handles); 1458 num_handles = arraysize(handles);
1120 EXPECT_EQ(MOJO_RESULT_OK, 1459 EXPECT_EQ(MOJO_RESULT_OK,
1121 core()->ReadMessage(h_passing[1], 1460 core()->ReadMessage(h_passing[1],
1122 UserPointer<void>(buffer), 1461 UserPointer<void>(buffer),
1123 MakeUserPointer(&num_bytes), 1462 MakeUserPointer(&num_bytes),
1124 MakeUserPointer(handles), 1463 MakeUserPointer(handles),
1125 MakeUserPointer(&num_handles), 1464 MakeUserPointer(&num_handles),
1126 MOJO_READ_MESSAGE_FLAG_NONE)); 1465 MOJO_READ_MESSAGE_FLAG_NONE));
1127 EXPECT_EQ(kWorldSize, num_bytes); 1466 EXPECT_EQ(kWorldSize, num_bytes);
(...skipping 10 matching lines...) Expand all
1138 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); 1477 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1]));
1139 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); 1478 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
1140 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); 1479 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
1141 } 1480 }
1142 1481
1143 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. 1482 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|.
1144 1483
1145 } // namespace 1484 } // namespace
1146 } // namespace system 1485 } // namespace system
1147 } // namespace mojo 1486 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/system/core.cc ('k') | mojo/system/entrypoints.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698