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
3 // found in the LICENSE file.
5 #include "mojo/system/core.h"
9 #include "base/basictypes.h"
10 #include "base/threading/platform_thread.h"
11 #include "base/time/time.h"
12 #include "mojo/system/core_test_base.h"
18 typedef test::CoreTestBase CoreTest
;
20 TEST_F(CoreTest
, GetTimeTicksNow
) {
21 const MojoTimeTicks start
= core()->GetTimeTicksNow();
22 EXPECT_NE(static_cast<MojoTimeTicks
>(0), start
)
23 << "GetTimeTicksNow should return nonzero value";
24 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(15));
25 const MojoTimeTicks finish
= core()->GetTimeTicksNow();
26 // Allow for some fuzz in sleep.
27 EXPECT_GE((finish
- start
), static_cast<MojoTimeTicks
>(8000))
28 << "Sleeping should result in increasing time ticks";
31 TEST_F(CoreTest
, Basic
) {
34 EXPECT_EQ(0u, info
.GetCtorCallCount());
35 MojoHandle h
= CreateMockHandle(&info
);
36 EXPECT_EQ(1u, info
.GetCtorCallCount());
37 EXPECT_NE(h
, MOJO_HANDLE_INVALID
);
39 EXPECT_EQ(0u, info
.GetWriteMessageCallCount());
40 EXPECT_EQ(MOJO_RESULT_OK
,
41 core()->WriteMessage(h
, NULL
, 0, NULL
, 0,
42 MOJO_WRITE_MESSAGE_FLAG_NONE
));
43 EXPECT_EQ(1u, info
.GetWriteMessageCallCount());
44 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
45 core()->WriteMessage(h
, NULL
, 1, NULL
, 0,
46 MOJO_WRITE_MESSAGE_FLAG_NONE
));
47 EXPECT_EQ(2u, info
.GetWriteMessageCallCount());
49 EXPECT_EQ(0u, info
.GetReadMessageCallCount());
50 uint32_t num_bytes
= 0;
51 EXPECT_EQ(MOJO_RESULT_OK
,
52 core()->ReadMessage(h
, NULL
, &num_bytes
, NULL
, NULL
,
53 MOJO_READ_MESSAGE_FLAG_NONE
));
54 EXPECT_EQ(1u, info
.GetReadMessageCallCount());
56 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
57 core()->ReadMessage(h
, NULL
, &num_bytes
, NULL
, NULL
,
58 MOJO_READ_MESSAGE_FLAG_NONE
));
59 EXPECT_EQ(2u, info
.GetReadMessageCallCount());
60 EXPECT_EQ(MOJO_RESULT_OK
,
61 core()->ReadMessage(h
, NULL
, NULL
, NULL
, NULL
,
62 MOJO_READ_MESSAGE_FLAG_NONE
));
63 EXPECT_EQ(3u, info
.GetReadMessageCallCount());
65 EXPECT_EQ(0u, info
.GetWriteDataCallCount());
66 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED
,
67 core()->WriteData(h
, NULL
, NULL
, MOJO_WRITE_DATA_FLAG_NONE
));
68 EXPECT_EQ(1u, info
.GetWriteDataCallCount());
70 EXPECT_EQ(0u, info
.GetBeginWriteDataCallCount());
71 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED
,
72 core()->BeginWriteData(h
, NULL
, NULL
, MOJO_WRITE_DATA_FLAG_NONE
));
73 EXPECT_EQ(1u, info
.GetBeginWriteDataCallCount());
75 EXPECT_EQ(0u, info
.GetEndWriteDataCallCount());
76 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED
,
77 core()->EndWriteData(h
, 0));
78 EXPECT_EQ(1u, info
.GetEndWriteDataCallCount());
80 EXPECT_EQ(0u, info
.GetReadDataCallCount());
81 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED
,
82 core()->ReadData(h
, NULL
, NULL
, MOJO_READ_DATA_FLAG_NONE
));
83 EXPECT_EQ(1u, info
.GetReadDataCallCount());
85 EXPECT_EQ(0u, info
.GetBeginReadDataCallCount());
86 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED
,
87 core()->BeginReadData(h
, NULL
, NULL
, MOJO_READ_DATA_FLAG_NONE
));
88 EXPECT_EQ(1u, info
.GetBeginReadDataCallCount());
90 EXPECT_EQ(0u, info
.GetEndReadDataCallCount());
91 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED
,
92 core()->EndReadData(h
, 0));
93 EXPECT_EQ(1u, info
.GetEndReadDataCallCount());
95 EXPECT_EQ(0u, info
.GetAddWaiterCallCount());
96 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
97 core()->Wait(h
, MOJO_WAIT_FLAG_EVERYTHING
,
98 MOJO_DEADLINE_INDEFINITE
));
99 EXPECT_EQ(1u, info
.GetAddWaiterCallCount());
100 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
101 core()->Wait(h
, MOJO_WAIT_FLAG_EVERYTHING
, 0));
102 EXPECT_EQ(2u, info
.GetAddWaiterCallCount());
103 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
104 core()->Wait(h
, MOJO_WAIT_FLAG_EVERYTHING
, 10 * 1000));
105 EXPECT_EQ(3u, info
.GetAddWaiterCallCount());
106 MojoWaitFlags wait_flags
= MOJO_WAIT_FLAG_EVERYTHING
;
107 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
108 core()->WaitMany(&h
, &wait_flags
, 1, MOJO_DEADLINE_INDEFINITE
));
109 EXPECT_EQ(4u, info
.GetAddWaiterCallCount());
111 EXPECT_EQ(0u, info
.GetDtorCallCount());
112 EXPECT_EQ(0u, info
.GetCloseCallCount());
113 EXPECT_EQ(0u, info
.GetCancelAllWaitersCallCount());
114 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h
));
115 EXPECT_EQ(1u, info
.GetCancelAllWaitersCallCount());
116 EXPECT_EQ(1u, info
.GetCloseCallCount());
117 EXPECT_EQ(1u, info
.GetDtorCallCount());
119 // No waiters should ever have ever been added.
120 EXPECT_EQ(0u, info
.GetRemoveWaiterCallCount());
123 TEST_F(CoreTest
, InvalidArguments
) {
126 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
, core()->Close(MOJO_HANDLE_INVALID
));
127 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
, core()->Close(10));
128 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
, core()->Close(1000000000));
130 // Test a double-close.
132 MojoHandle h
= CreateMockHandle(&info
);
133 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h
));
134 EXPECT_EQ(1u, info
.GetCloseCallCount());
135 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
, core()->Close(h
));
136 EXPECT_EQ(1u, info
.GetCloseCallCount());
141 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
142 core()->Wait(MOJO_HANDLE_INVALID
, MOJO_WAIT_FLAG_EVERYTHING
,
143 MOJO_DEADLINE_INDEFINITE
));
144 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
145 core()->Wait(10, MOJO_WAIT_FLAG_EVERYTHING
,
146 MOJO_DEADLINE_INDEFINITE
));
151 MojoHandle handles
[2] = { MOJO_HANDLE_INVALID
, MOJO_HANDLE_INVALID
};
152 MojoWaitFlags flags
[2] = { MOJO_WAIT_FLAG_EVERYTHING
,
153 MOJO_WAIT_FLAG_EVERYTHING
};
154 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
155 core()->WaitMany(handles
, flags
, 0, MOJO_DEADLINE_INDEFINITE
));
156 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
157 core()->WaitMany(NULL
, flags
, 0, MOJO_DEADLINE_INDEFINITE
));
158 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
159 core()->WaitMany(handles
, NULL
, 0, MOJO_DEADLINE_INDEFINITE
));
161 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
162 core()->WaitMany(NULL
, flags
, 1, MOJO_DEADLINE_INDEFINITE
));
163 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
164 core()->WaitMany(handles
, NULL
, 1, MOJO_DEADLINE_INDEFINITE
));
165 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
166 core()->WaitMany(handles
, flags
, 1, MOJO_DEADLINE_INDEFINITE
));
168 MockHandleInfo info
[2];
169 handles
[0] = CreateMockHandle(&info
[0]);
171 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
172 core()->WaitMany(handles
, flags
, 1, MOJO_DEADLINE_INDEFINITE
));
173 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
174 core()->WaitMany(handles
, flags
, 2, MOJO_DEADLINE_INDEFINITE
));
175 handles
[1] = handles
[0] + 1; // Invalid handle.
176 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
177 core()->WaitMany(handles
, flags
, 2, MOJO_DEADLINE_INDEFINITE
));
178 handles
[1] = CreateMockHandle(&info
[1]);
179 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
180 core()->WaitMany(handles
, flags
, 2, MOJO_DEADLINE_INDEFINITE
));
182 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(handles
[0]));
183 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(handles
[1]));
186 // |CreateMessagePipe()|:
189 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
190 core()->CreateMessagePipe(NULL
, NULL
));
191 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
192 core()->CreateMessagePipe(&h
, NULL
));
193 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
194 core()->CreateMessagePipe(NULL
, &h
));
198 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
201 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
202 core()->WriteMessage(MOJO_HANDLE_INVALID
, NULL
, 0, NULL
, 0,
203 MOJO_WRITE_MESSAGE_FLAG_NONE
));
206 MojoHandle h
= CreateMockHandle(&info
);
207 MojoHandle handles
[2] = { MOJO_HANDLE_INVALID
, MOJO_HANDLE_INVALID
};
209 // Null |handles| with nonzero |num_handles|.
210 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
211 core()->WriteMessage(h
, NULL
, 0, NULL
, 1,
212 MOJO_WRITE_MESSAGE_FLAG_NONE
));
213 // Checked by |Core|, shouldn't go through to the dispatcher.
214 EXPECT_EQ(0u, info
.GetWriteMessageCallCount());
216 // Huge handle count (implausibly big on some systems -- more than can be
217 // stored in a 32-bit address space).
218 // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or
219 // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or
221 EXPECT_NE(MOJO_RESULT_OK
,
222 core()->WriteMessage(h
, NULL
, 0, handles
,
223 std::numeric_limits
<uint32_t>::max(),
224 MOJO_WRITE_MESSAGE_FLAG_NONE
));
225 EXPECT_EQ(0u, info
.GetWriteMessageCallCount());
227 // Huge handle count (plausibly big).
228 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED
,
229 core()->WriteMessage(h
, NULL
, 0, handles
,
230 std::numeric_limits
<uint32_t>::max() /
232 MOJO_WRITE_MESSAGE_FLAG_NONE
));
233 EXPECT_EQ(0u, info
.GetWriteMessageCallCount());
235 // Invalid handle in |handles|.
236 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
237 core()->WriteMessage(h
, NULL
, 0, handles
, 1,
238 MOJO_WRITE_MESSAGE_FLAG_NONE
));
239 EXPECT_EQ(0u, info
.GetWriteMessageCallCount());
241 // Two invalid handles in |handles|.
242 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
243 core()->WriteMessage(h
, NULL
, 0, handles
, 2,
244 MOJO_WRITE_MESSAGE_FLAG_NONE
));
245 EXPECT_EQ(0u, info
.GetWriteMessageCallCount());
247 // Can't send a handle over itself.
249 EXPECT_EQ(MOJO_RESULT_BUSY
,
250 core()->WriteMessage(h
, NULL
, 0, handles
, 1,
251 MOJO_WRITE_MESSAGE_FLAG_NONE
));
252 EXPECT_EQ(0u, info
.GetWriteMessageCallCount());
254 MockHandleInfo info2
;
255 MojoHandle h2
= CreateMockHandle(&info2
);
257 // This is "okay", but |MockDispatcher| doesn't implement it.
259 EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED
,
260 core()->WriteMessage(h
, NULL
, 0, handles
, 1,
261 MOJO_WRITE_MESSAGE_FLAG_NONE
));
262 EXPECT_EQ(1u, info
.GetWriteMessageCallCount());
264 // One of the |handles| is still invalid.
265 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
266 core()->WriteMessage(h
, NULL
, 0, handles
, 2,
267 MOJO_WRITE_MESSAGE_FLAG_NONE
));
268 EXPECT_EQ(1u, info
.GetWriteMessageCallCount());
270 // One of the |handles| is the same as |handle|.
272 EXPECT_EQ(MOJO_RESULT_BUSY
,
273 core()->WriteMessage(h
, NULL
, 0, handles
, 2,
274 MOJO_WRITE_MESSAGE_FLAG_NONE
));
275 EXPECT_EQ(1u, info
.GetWriteMessageCallCount());
277 // Can't send a handle twice in the same message.
279 EXPECT_EQ(MOJO_RESULT_BUSY
,
280 core()->WriteMessage(h
, NULL
, 0, handles
, 2,
281 MOJO_WRITE_MESSAGE_FLAG_NONE
));
282 EXPECT_EQ(1u, info
.GetWriteMessageCallCount());
284 // Note: Since we never successfully sent anything with it, |h2| should
286 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h2
));
288 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h
));
292 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
295 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
296 core()->ReadMessage(MOJO_HANDLE_INVALID
, NULL
, NULL
, NULL
, NULL
,
297 MOJO_READ_MESSAGE_FLAG_NONE
));
300 MojoHandle h
= CreateMockHandle(&info
);
302 uint32_t handle_count
= 1;
303 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
304 core()->ReadMessage(h
, NULL
, NULL
, NULL
, &handle_count
,
305 MOJO_READ_MESSAGE_FLAG_NONE
));
306 // Checked by |Core|, shouldn't go through to the dispatcher.
307 EXPECT_EQ(0u, info
.GetReadMessageCallCount());
311 EXPECT_EQ(MOJO_RESULT_OK
,
312 core()->ReadMessage(h
, NULL
, NULL
, NULL
, &handle_count
,
313 MOJO_READ_MESSAGE_FLAG_NONE
));
314 // Checked by |Core|, shouldn't go through to the dispatcher.
315 EXPECT_EQ(1u, info
.GetReadMessageCallCount());
317 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h
));
321 // TODO(vtl): test |Wait()| and |WaitMany()| properly
322 // - including |WaitMany()| with the same handle more than once (with
323 // same/different flags)
325 TEST_F(CoreTest
, MessagePipe
) {
328 EXPECT_EQ(MOJO_RESULT_OK
, core()->CreateMessagePipe(&h
[0], &h
[1]));
329 // Should get two distinct, valid handles.
330 EXPECT_NE(h
[0], MOJO_HANDLE_INVALID
);
331 EXPECT_NE(h
[1], MOJO_HANDLE_INVALID
);
332 EXPECT_NE(h
[0], h
[1]);
334 // Neither should be readable.
335 MojoWaitFlags flags
[2] = { MOJO_WAIT_FLAG_READABLE
, MOJO_WAIT_FLAG_READABLE
};
336 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED
,
337 core()->WaitMany(h
, flags
, 2, 0));
339 // Try to read anyway.
340 char buffer
[1] = { 'a' };
341 uint32_t buffer_size
= 1;
342 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT
,
343 core()->ReadMessage(h
[0], buffer
, &buffer_size
, NULL
, NULL
,
344 MOJO_READ_MESSAGE_FLAG_NONE
));
345 // Check that it left its inputs alone.
346 EXPECT_EQ('a', buffer
[0]);
347 EXPECT_EQ(1u, buffer_size
);
349 // Both should be writable.
350 EXPECT_EQ(MOJO_RESULT_OK
,
351 core()->Wait(h
[0], MOJO_WAIT_FLAG_WRITABLE
, 1000000000));
352 EXPECT_EQ(MOJO_RESULT_OK
,
353 core()->Wait(h
[1], MOJO_WAIT_FLAG_WRITABLE
, 1000000000));
355 // Also check that |h[1]| is writable using |WaitMany()|.
356 flags
[0] = MOJO_WAIT_FLAG_READABLE
;
357 flags
[1] = MOJO_WAIT_FLAG_WRITABLE
;
358 EXPECT_EQ(1, core()->WaitMany(h
, flags
, 2, MOJO_DEADLINE_INDEFINITE
));
362 EXPECT_EQ(MOJO_RESULT_OK
,
363 core()->WriteMessage(h
[1], buffer
, 1, NULL
, 0,
364 MOJO_WRITE_MESSAGE_FLAG_NONE
));
366 // Check that |h[0]| is now readable.
367 flags
[0] = MOJO_WAIT_FLAG_READABLE
;
368 flags
[1] = MOJO_WAIT_FLAG_READABLE
;
369 EXPECT_EQ(0, core()->WaitMany(h
, flags
, 2, MOJO_DEADLINE_INDEFINITE
));
372 // First, get only the size.
374 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED
,
375 core()->ReadMessage(h
[0], NULL
, &buffer_size
, NULL
, NULL
,
376 MOJO_READ_MESSAGE_FLAG_NONE
));
377 EXPECT_EQ(1u, buffer_size
);
378 // Then actually read it.
381 EXPECT_EQ(MOJO_RESULT_OK
,
382 core()->ReadMessage(h
[0], buffer
, &buffer_size
, NULL
, NULL
,
383 MOJO_READ_MESSAGE_FLAG_NONE
));
384 EXPECT_EQ('b', buffer
[0]);
385 EXPECT_EQ(1u, buffer_size
);
387 // |h[0]| should no longer be readable.
388 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED
,
389 core()->Wait(h
[0], MOJO_WAIT_FLAG_READABLE
, 0));
393 EXPECT_EQ(MOJO_RESULT_OK
,
394 core()->WriteMessage(h
[0], buffer
, 1, NULL
, 0,
395 MOJO_WRITE_MESSAGE_FLAG_NONE
));
398 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h
[0]));
400 // Check that |h[1]| is no longer writable (and will never be).
401 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
402 core()->Wait(h
[1], MOJO_WAIT_FLAG_WRITABLE
, 1000000000));
404 // Check that |h[1]| is still readable (for the moment).
405 EXPECT_EQ(MOJO_RESULT_OK
,
406 core()->Wait(h
[1], MOJO_WAIT_FLAG_READABLE
, 1000000000));
408 // Discard a message from |h[1]|.
409 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED
,
410 core()->ReadMessage(h
[1], NULL
, NULL
, NULL
, NULL
,
411 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD
));
413 // |h[1]| is no longer readable (and will never be).
414 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
415 core()->Wait(h
[1], MOJO_WAIT_FLAG_READABLE
, 1000000000));
417 // Try writing to |h[1]|.
419 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
420 core()->WriteMessage(h
[1], buffer
, 1, NULL
, 0,
421 MOJO_WRITE_MESSAGE_FLAG_NONE
));
423 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h
[1]));
426 // Tests passing a message pipe handle.
427 TEST_F(CoreTest
, MessagePipeBasicLocalHandlePassing1
) {
428 const char kHello
[] = "hello";
429 const uint32_t kHelloSize
= static_cast<uint32_t>(sizeof(kHello
));
430 const char kWorld
[] = "world!!!";
431 const uint32_t kWorldSize
= static_cast<uint32_t>(sizeof(kWorld
));
433 const uint32_t kBufferSize
= static_cast<uint32_t>(sizeof(buffer
));
435 MojoHandle handles
[10];
436 uint32_t num_handles
;
437 MojoHandle h_received
;
439 MojoHandle h_passing
[2];
440 EXPECT_EQ(MOJO_RESULT_OK
,
441 core()->CreateMessagePipe(&h_passing
[0], &h_passing
[1]));
443 // Make sure that |h_passing[]| work properly.
444 EXPECT_EQ(MOJO_RESULT_OK
,
445 core()->WriteMessage(h_passing
[0],
448 MOJO_WRITE_MESSAGE_FLAG_NONE
));
449 EXPECT_EQ(MOJO_RESULT_OK
,
450 core()->Wait(h_passing
[1], MOJO_WAIT_FLAG_READABLE
, 1000000000));
451 num_bytes
= kBufferSize
;
452 num_handles
= arraysize(handles
);
453 EXPECT_EQ(MOJO_RESULT_OK
,
454 core()->ReadMessage(h_passing
[1],
456 handles
, &num_handles
,
457 MOJO_READ_MESSAGE_FLAG_NONE
));
458 EXPECT_EQ(kHelloSize
, num_bytes
);
459 EXPECT_STREQ(kHello
, buffer
);
460 EXPECT_EQ(0u, num_handles
);
462 // Make sure that you can't pass either of the message pipe's handles over
464 EXPECT_EQ(MOJO_RESULT_BUSY
,
465 core()->WriteMessage(h_passing
[0],
468 MOJO_WRITE_MESSAGE_FLAG_NONE
));
469 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
,
470 core()->WriteMessage(h_passing
[0],
473 MOJO_WRITE_MESSAGE_FLAG_NONE
));
475 MojoHandle h_passed
[2];
476 EXPECT_EQ(MOJO_RESULT_OK
,
477 core()->CreateMessagePipe(&h_passed
[0], &h_passed
[1]));
479 // Make sure that |h_passed[]| work properly.
480 EXPECT_EQ(MOJO_RESULT_OK
,
481 core()->WriteMessage(h_passed
[0],
484 MOJO_WRITE_MESSAGE_FLAG_NONE
));
485 EXPECT_EQ(MOJO_RESULT_OK
,
486 core()->Wait(h_passed
[1], MOJO_WAIT_FLAG_READABLE
, 1000000000));
487 num_bytes
= kBufferSize
;
488 num_handles
= arraysize(handles
);
489 EXPECT_EQ(MOJO_RESULT_OK
,
490 core()->ReadMessage(h_passed
[1],
492 handles
, &num_handles
,
493 MOJO_READ_MESSAGE_FLAG_NONE
));
494 EXPECT_EQ(kHelloSize
, num_bytes
);
495 EXPECT_STREQ(kHello
, buffer
);
496 EXPECT_EQ(0u, num_handles
);
498 // Send |h_passed[1]| from |h_passing[0]| to |h_passing[1]|.
499 EXPECT_EQ(MOJO_RESULT_OK
,
500 core()->WriteMessage(h_passing
[0],
503 MOJO_WRITE_MESSAGE_FLAG_NONE
));
504 EXPECT_EQ(MOJO_RESULT_OK
,
505 core()->Wait(h_passing
[1], MOJO_WAIT_FLAG_READABLE
, 1000000000));
506 num_bytes
= kBufferSize
;
507 num_handles
= arraysize(handles
);
508 EXPECT_EQ(MOJO_RESULT_OK
,
509 core()->ReadMessage(h_passing
[1],
511 handles
, &num_handles
,
512 MOJO_READ_MESSAGE_FLAG_NONE
));
513 EXPECT_EQ(kWorldSize
, num_bytes
);
514 EXPECT_STREQ(kWorld
, buffer
);
515 EXPECT_EQ(1u, num_handles
);
516 h_received
= handles
[0];
517 EXPECT_NE(h_received
, MOJO_HANDLE_INVALID
);
518 EXPECT_NE(h_received
, h_passing
[0]);
519 EXPECT_NE(h_received
, h_passing
[1]);
520 EXPECT_NE(h_received
, h_passed
[0]);
522 // Note: We rely on the Mojo system not re-using handle values very often.
523 EXPECT_NE(h_received
, h_passed
[1]);
525 // |h_passed[1]| should no longer be valid; check that trying to close it
526 // fails. See above note.
527 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
, core()->Close(h_passed
[1]));
529 // Write to |h_passed[0]|. Should receive on |h_received|.
530 EXPECT_EQ(MOJO_RESULT_OK
,
531 core()->WriteMessage(h_passed
[0],
534 MOJO_WRITE_MESSAGE_FLAG_NONE
));
535 EXPECT_EQ(MOJO_RESULT_OK
,
536 core()->Wait(h_received
, MOJO_WAIT_FLAG_READABLE
, 1000000000));
537 num_bytes
= kBufferSize
;
538 num_handles
= arraysize(handles
);
539 EXPECT_EQ(MOJO_RESULT_OK
,
540 core()->ReadMessage(h_received
,
542 handles
, &num_handles
,
543 MOJO_READ_MESSAGE_FLAG_NONE
));
544 EXPECT_EQ(kHelloSize
, num_bytes
);
545 EXPECT_STREQ(kHello
, buffer
);
546 EXPECT_EQ(0u, num_handles
);
548 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h_passing
[0]));
549 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h_passing
[1]));
550 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h_passed
[0]));
551 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h_received
));
554 TEST_F(CoreTest
, DataPipe
) {
555 MojoHandle ph
, ch
; // p is for producer and c is for consumer.
557 EXPECT_EQ(MOJO_RESULT_OK
, core()->CreateDataPipe(NULL
, &ph
, &ch
));
558 // Should get two distinct, valid handles.
559 EXPECT_NE(ph
, MOJO_HANDLE_INVALID
);
560 EXPECT_NE(ch
, MOJO_HANDLE_INVALID
);
563 // Producer should be never-readable, but already writable.
564 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
565 core()->Wait(ph
, MOJO_WAIT_FLAG_READABLE
, 0));
566 EXPECT_EQ(MOJO_RESULT_OK
,
567 core()->Wait(ph
, MOJO_WAIT_FLAG_WRITABLE
, 0));
569 // Consumer should be never-writable, and not yet readable.
570 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
571 core()->Wait(ch
, MOJO_WAIT_FLAG_WRITABLE
, 0));
572 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED
,
573 core()->Wait(ch
, MOJO_WAIT_FLAG_READABLE
, 0));
576 char elements
[2] = { 'A', 'B' };
577 uint32_t num_bytes
= 2u;
578 EXPECT_EQ(MOJO_RESULT_OK
,
579 core()->WriteData(ph
, elements
, &num_bytes
,
580 MOJO_WRITE_DATA_FLAG_NONE
));
581 EXPECT_EQ(2u, num_bytes
);
583 // Consumer should now be readable.
584 EXPECT_EQ(MOJO_RESULT_OK
,
585 core()->Wait(ch
, MOJO_WAIT_FLAG_READABLE
, 0));
587 // Read one character.
591 EXPECT_EQ(MOJO_RESULT_OK
,
592 core()->ReadData(ch
, elements
, &num_bytes
,
593 MOJO_READ_DATA_FLAG_NONE
));
594 EXPECT_EQ('A', elements
[0]);
595 EXPECT_EQ(-1, elements
[1]);
598 void* write_ptr
= NULL
;
600 ASSERT_EQ(MOJO_RESULT_OK
,
601 core()->BeginWriteData(ph
, &write_ptr
, &num_bytes
,
602 MOJO_WRITE_DATA_FLAG_NONE
));
603 // We count on the default options providing a decent buffer size.
604 ASSERT_GE(num_bytes
, 3u);
606 // Trying to do a normal write during a two-phase write should fail.
609 EXPECT_EQ(MOJO_RESULT_BUSY
,
610 core()->WriteData(ph
, elements
, &num_bytes
,
611 MOJO_WRITE_DATA_FLAG_NONE
));
613 // Actually write the data, and complete it now.
614 static_cast<char*>(write_ptr
)[0] = 'C';
615 static_cast<char*>(write_ptr
)[1] = 'D';
616 static_cast<char*>(write_ptr
)[2] = 'E';
617 EXPECT_EQ(MOJO_RESULT_OK
, core()->EndWriteData(ph
, 3u));
619 // Query how much data we have.
621 EXPECT_EQ(MOJO_RESULT_OK
,
622 core()->ReadData(ch
, NULL
, &num_bytes
, MOJO_READ_DATA_FLAG_QUERY
));
623 EXPECT_EQ(4u, num_bytes
);
625 // Try to discard ten characters, in all-or-none mode. Should fail.
627 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE
,
628 core()->ReadData(ch
, NULL
, &num_bytes
,
629 MOJO_READ_DATA_FLAG_DISCARD
|
630 MOJO_READ_DATA_FLAG_ALL_OR_NONE
));
632 // Discard two characters.
634 EXPECT_EQ(MOJO_RESULT_OK
,
635 core()->ReadData(ch
, NULL
, &num_bytes
,
636 MOJO_READ_DATA_FLAG_DISCARD
|
637 MOJO_READ_DATA_FLAG_ALL_OR_NONE
));
639 // Read the remaining two characters, in two-phase mode (all-or-none).
640 const void* read_ptr
= NULL
;
642 ASSERT_EQ(MOJO_RESULT_OK
,
643 core()->BeginReadData(ch
, &read_ptr
, &num_bytes
,
644 MOJO_READ_DATA_FLAG_ALL_OR_NONE
));
645 // Note: Count on still being able to do the contiguous read here.
646 ASSERT_EQ(2u, num_bytes
);
648 // Discarding right now should fail.
650 EXPECT_EQ(MOJO_RESULT_BUSY
,
651 core()->ReadData(ch
, NULL
, &num_bytes
,
652 MOJO_READ_DATA_FLAG_DISCARD
));
654 // Actually check our data and end the two-phase read.
655 EXPECT_EQ('D', static_cast<const char*>(read_ptr
)[0]);
656 EXPECT_EQ('E', static_cast<const char*>(read_ptr
)[1]);
657 EXPECT_EQ(MOJO_RESULT_OK
, core()->EndReadData(ch
, 2u));
659 // Consumer should now be no longer readable.
660 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED
,
661 core()->Wait(ch
, MOJO_WAIT_FLAG_READABLE
, 0));
665 // Close the producer.
666 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(ph
));
668 // The consumer should now be never-readable.
669 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION
,
670 core()->Wait(ch
, MOJO_WAIT_FLAG_READABLE
, 0));
672 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(ch
));
675 // Tests passing data pipe producer and consumer handles.
676 TEST_F(CoreTest
, MessagePipeBasicLocalHandlePassing2
) {
677 const char kHello
[] = "hello";
678 const uint32_t kHelloSize
= static_cast<uint32_t>(sizeof(kHello
));
679 const char kWorld
[] = "world!!!";
680 const uint32_t kWorldSize
= static_cast<uint32_t>(sizeof(kWorld
));
682 const uint32_t kBufferSize
= static_cast<uint32_t>(sizeof(buffer
));
684 MojoHandle handles
[10];
685 uint32_t num_handles
;
687 MojoHandle h_passing
[2];
688 EXPECT_EQ(MOJO_RESULT_OK
,
689 core()->CreateMessagePipe(&h_passing
[0], &h_passing
[1]));
692 EXPECT_EQ(MOJO_RESULT_OK
,
693 core()->CreateDataPipe(NULL
, &ph
, &ch
));
695 // Send |ch| from |h_passing[0]| to |h_passing[1]|.
696 EXPECT_EQ(MOJO_RESULT_OK
,
697 core()->WriteMessage(h_passing
[0],
700 MOJO_WRITE_MESSAGE_FLAG_NONE
));
701 EXPECT_EQ(MOJO_RESULT_OK
,
702 core()->Wait(h_passing
[1], MOJO_WAIT_FLAG_READABLE
, 1000000000));
703 num_bytes
= kBufferSize
;
704 num_handles
= arraysize(handles
);
705 EXPECT_EQ(MOJO_RESULT_OK
,
706 core()->ReadMessage(h_passing
[1],
708 handles
, &num_handles
,
709 MOJO_READ_MESSAGE_FLAG_NONE
));
710 EXPECT_EQ(kHelloSize
, num_bytes
);
711 EXPECT_STREQ(kHello
, buffer
);
712 EXPECT_EQ(1u, num_handles
);
713 MojoHandle ch_received
= handles
[0];
714 EXPECT_NE(ch_received
, MOJO_HANDLE_INVALID
);
715 EXPECT_NE(ch_received
, h_passing
[0]);
716 EXPECT_NE(ch_received
, h_passing
[1]);
717 EXPECT_NE(ch_received
, ph
);
719 // Note: We rely on the Mojo system not re-using handle values very often.
720 EXPECT_NE(ch_received
, ch
);
722 // |ch| should no longer be valid; check that trying to close it fails. See
724 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
, core()->Close(ch
));
726 // Write to |ph|. Should receive on |ch_received|.
727 num_bytes
= kWorldSize
;
728 EXPECT_EQ(MOJO_RESULT_OK
,
729 core()->WriteData(ph
, kWorld
, &num_bytes
,
730 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE
));
731 EXPECT_EQ(MOJO_RESULT_OK
,
732 core()->Wait(ch_received
, MOJO_WAIT_FLAG_READABLE
, 1000000000));
733 num_bytes
= kBufferSize
;
734 EXPECT_EQ(MOJO_RESULT_OK
,
735 core()->ReadData(ch_received
, buffer
, &num_bytes
,
736 MOJO_READ_MESSAGE_FLAG_NONE
));
737 EXPECT_EQ(kWorldSize
, num_bytes
);
738 EXPECT_STREQ(kWorld
, buffer
);
740 // Now pass |ph| in the same direction.
741 EXPECT_EQ(MOJO_RESULT_OK
,
742 core()->WriteMessage(h_passing
[0],
745 MOJO_WRITE_MESSAGE_FLAG_NONE
));
746 EXPECT_EQ(MOJO_RESULT_OK
,
747 core()->Wait(h_passing
[1], MOJO_WAIT_FLAG_READABLE
, 1000000000));
748 num_bytes
= kBufferSize
;
749 num_handles
= arraysize(handles
);
750 EXPECT_EQ(MOJO_RESULT_OK
,
751 core()->ReadMessage(h_passing
[1],
753 handles
, &num_handles
,
754 MOJO_READ_MESSAGE_FLAG_NONE
));
755 EXPECT_EQ(kWorldSize
, num_bytes
);
756 EXPECT_STREQ(kWorld
, buffer
);
757 EXPECT_EQ(1u, num_handles
);
758 MojoHandle ph_received
= handles
[0];
759 EXPECT_NE(ph_received
, MOJO_HANDLE_INVALID
);
760 EXPECT_NE(ph_received
, h_passing
[0]);
761 EXPECT_NE(ph_received
, h_passing
[1]);
762 EXPECT_NE(ph_received
, ch_received
);
764 // Again, rely on the Mojo system not re-using handle values very often.
765 EXPECT_NE(ph_received
, ph
);
767 // |ph| should no longer be valid; check that trying to close it fails. See
769 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT
, core()->Close(ph
));
771 // Write to |ph_received|. Should receive on |ch_received|.
772 num_bytes
= kHelloSize
;
773 EXPECT_EQ(MOJO_RESULT_OK
,
774 core()->WriteData(ph_received
, kHello
, &num_bytes
,
775 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE
));
776 EXPECT_EQ(MOJO_RESULT_OK
,
777 core()->Wait(ch_received
, MOJO_WAIT_FLAG_READABLE
, 1000000000));
778 num_bytes
= kBufferSize
;
779 EXPECT_EQ(MOJO_RESULT_OK
,
780 core()->ReadData(ch_received
, buffer
, &num_bytes
,
781 MOJO_READ_MESSAGE_FLAG_NONE
));
782 EXPECT_EQ(kHelloSize
, num_bytes
);
783 EXPECT_STREQ(kHello
, buffer
);
786 ph_received
= MOJO_HANDLE_INVALID
;
788 ch_received
= MOJO_HANDLE_INVALID
;
790 // Make sure that |ph| can't be sent if it's in a two-phase write.
791 void* write_ptr
= NULL
;
793 ASSERT_EQ(MOJO_RESULT_OK
,
794 core()->BeginWriteData(ph
, &write_ptr
, &num_bytes
,
795 MOJO_WRITE_DATA_FLAG_NONE
));
796 ASSERT_GE(num_bytes
, 1u);
797 EXPECT_EQ(MOJO_RESULT_BUSY
,
798 core()->WriteMessage(h_passing
[0],
801 MOJO_WRITE_MESSAGE_FLAG_NONE
));
803 // But |ch| can, even if |ph| is in a two-phase write.
804 EXPECT_EQ(MOJO_RESULT_OK
,
805 core()->WriteMessage(h_passing
[0],
808 MOJO_WRITE_MESSAGE_FLAG_NONE
));
809 ch
= MOJO_HANDLE_INVALID
;
810 EXPECT_EQ(MOJO_RESULT_OK
,
811 core()->Wait(h_passing
[1], MOJO_WAIT_FLAG_READABLE
, 1000000000));
812 num_bytes
= kBufferSize
;
813 num_handles
= arraysize(handles
);
814 EXPECT_EQ(MOJO_RESULT_OK
,
815 core()->ReadMessage(h_passing
[1],
817 handles
, &num_handles
,
818 MOJO_READ_MESSAGE_FLAG_NONE
));
819 EXPECT_EQ(kHelloSize
, num_bytes
);
820 EXPECT_STREQ(kHello
, buffer
);
821 EXPECT_EQ(1u, num_handles
);
823 EXPECT_NE(ch
, MOJO_HANDLE_INVALID
);
825 // Complete the two-phase write.
826 static_cast<char*>(write_ptr
)[0] = 'x';
827 EXPECT_EQ(MOJO_RESULT_OK
, core()->EndWriteData(ph
, 1));
829 // Wait for |ch| to be readable.
830 EXPECT_EQ(MOJO_RESULT_OK
,
831 core()->Wait(ch
, MOJO_WAIT_FLAG_READABLE
, 1000000000));
833 // Make sure that |ch| can't be sent if it's in a two-phase read.
834 const void* read_ptr
= NULL
;
836 ASSERT_EQ(MOJO_RESULT_OK
,
837 core()->BeginReadData(ch
, &read_ptr
, &num_bytes
,
838 MOJO_READ_DATA_FLAG_ALL_OR_NONE
));
839 EXPECT_EQ(MOJO_RESULT_BUSY
,
840 core()->WriteMessage(h_passing
[0],
843 MOJO_WRITE_MESSAGE_FLAG_NONE
));
845 // But |ph| can, even if |ch| is in a two-phase read.
846 EXPECT_EQ(MOJO_RESULT_OK
,
847 core()->WriteMessage(h_passing
[0],
850 MOJO_WRITE_MESSAGE_FLAG_NONE
));
851 ph
= MOJO_HANDLE_INVALID
;
852 EXPECT_EQ(MOJO_RESULT_OK
,
853 core()->Wait(h_passing
[1], MOJO_WAIT_FLAG_READABLE
, 1000000000));
854 num_bytes
= kBufferSize
;
855 num_handles
= arraysize(handles
);
856 EXPECT_EQ(MOJO_RESULT_OK
,
857 core()->ReadMessage(h_passing
[1],
859 handles
, &num_handles
,
860 MOJO_READ_MESSAGE_FLAG_NONE
));
861 EXPECT_EQ(kWorldSize
, num_bytes
);
862 EXPECT_STREQ(kWorld
, buffer
);
863 EXPECT_EQ(1u, num_handles
);
865 EXPECT_NE(ph
, MOJO_HANDLE_INVALID
);
867 // Complete the two-phase read.
868 EXPECT_EQ('x', static_cast<const char*>(read_ptr
)[0]);
869 EXPECT_EQ(MOJO_RESULT_OK
, core()->EndReadData(ch
, 1));
871 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h_passing
[0]));
872 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(h_passing
[1]));
873 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(ph
));
874 EXPECT_EQ(MOJO_RESULT_OK
, core()->Close(ch
));
877 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|.
880 } // namespace system