Add an extension override bubble and warning box for proxy extensions. (2nd attempt...
[chromium-blink-merge.git] / mojo / system / core_unittest.cc
blob8fab233b4ef801fb70d137b74d3b75ea09dc6310
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"
7 #include <limits>
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"
14 namespace mojo {
15 namespace system {
16 namespace {
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) {
32 MockHandleInfo info;
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());
55 num_bytes = 1;
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) {
124 // |Close()|:
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.
131 MockHandleInfo info;
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());
139 // |Wait()|:
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));
149 // |WaitMany()|:
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()|:
188 MojoHandle h;
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));
197 // |WriteMessage()|:
198 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
199 // |num_handles|.
201 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
202 core()->WriteMessage(MOJO_HANDLE_INVALID, NULL, 0, NULL, 0,
203 MOJO_WRITE_MESSAGE_FLAG_NONE));
205 MockHandleInfo info;
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
220 // not.
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() /
231 sizeof(handles[0]),
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.
248 handles[0] = h;
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.
258 handles[0] = h2;
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|.
271 handles[1] = h;
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.
278 handles[1] = h2;
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
285 // still be valid.
286 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h2));
288 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
291 // |ReadMessage()|:
292 // Only check arguments checked by |Core|, namely |handle|, |handles|, and
293 // |num_handles|.
295 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
296 core()->ReadMessage(MOJO_HANDLE_INVALID, NULL, NULL, NULL, NULL,
297 MOJO_READ_MESSAGE_FLAG_NONE));
299 MockHandleInfo info;
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());
309 // Okay.
310 handle_count = 0;
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) {
326 MojoHandle h[2];
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));
360 // Write to |h[1]|.
361 buffer[0] = 'b';
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));
371 // Read from |h[0]|.
372 // First, get only the size.
373 buffer_size = 0;
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.
379 buffer[0] = 'c';
380 buffer_size = 1;
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));
391 // Write to |h[0]|.
392 buffer[0] = 'd';
393 EXPECT_EQ(MOJO_RESULT_OK,
394 core()->WriteMessage(h[0], buffer, 1, NULL, 0,
395 MOJO_WRITE_MESSAGE_FLAG_NONE));
397 // Close |h[0]|.
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]|.
418 buffer[0] = 'e';
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));
432 char buffer[100];
433 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
434 uint32_t num_bytes;
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],
446 kHello, kHelloSize,
447 NULL, 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],
455 buffer, &num_bytes,
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
463 // itself.
464 EXPECT_EQ(MOJO_RESULT_BUSY,
465 core()->WriteMessage(h_passing[0],
466 kHello, kHelloSize,
467 &h_passing[0], 1,
468 MOJO_WRITE_MESSAGE_FLAG_NONE));
469 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
470 core()->WriteMessage(h_passing[0],
471 kHello, kHelloSize,
472 &h_passing[1], 1,
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],
482 kHello, kHelloSize,
483 NULL, 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],
491 buffer, &num_bytes,
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],
501 kWorld, kWorldSize,
502 &h_passed[1], 1,
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],
510 buffer, &num_bytes,
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],
532 kHello, kHelloSize,
533 NULL, 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,
541 buffer, &num_bytes,
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);
561 EXPECT_NE(ph, ch);
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));
575 // Write.
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.
588 elements[0] = -1;
589 elements[1] = -1;
590 num_bytes = 1u;
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]);
597 // Two-phase write.
598 void* write_ptr = NULL;
599 num_bytes = 0u;
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.
607 elements[0] = 'X';
608 num_bytes = 1u;
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.
620 num_bytes = 0;
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.
626 num_bytes = 10;
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.
633 num_bytes = 2;
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;
641 num_bytes = 2;
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.
649 num_bytes = 1;
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));
663 // TODO(vtl): More.
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));
681 char buffer[100];
682 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer));
683 uint32_t num_bytes;
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]));
691 MojoHandle ph, ch;
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],
698 kHello, kHelloSize,
699 &ch, 1,
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],
707 buffer, &num_bytes,
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
723 // above note.
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],
743 kWorld, kWorldSize,
744 &ph, 1,
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],
752 buffer, &num_bytes,
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
768 // above note.
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);
785 ph = ph_received;
786 ph_received = MOJO_HANDLE_INVALID;
787 ch = ch_received;
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;
792 num_bytes = 0;
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],
799 kHello, kHelloSize,
800 &ph, 1,
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],
806 kHello, kHelloSize,
807 &ch, 1,
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],
816 buffer, &num_bytes,
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);
822 ch = handles[0];
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;
835 num_bytes = 1;
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],
841 kHello, kHelloSize,
842 &ch, 1,
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],
848 kWorld, kWorldSize,
849 &ph, 1,
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],
858 buffer, &num_bytes,
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);
864 ph = handles[0];
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()|.
879 } // namespace
880 } // namespace system
881 } // namespace mojo