OLD | NEW |
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_impl.h" | 5 #include "mojo/system/core.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/threading/platform_thread.h" | 10 #include "base/threading/platform_thread.h" |
11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
12 #include "mojo/system/core_test_base.h" | 12 #include "mojo/system/core_test_base.h" |
13 | 13 |
14 namespace mojo { | 14 namespace mojo { |
15 namespace system { | 15 namespace system { |
16 namespace { | 16 namespace { |
17 | 17 |
18 typedef test::CoreTestBase CoreImplTest; | 18 typedef test::CoreTestBase CoreTest; |
19 | 19 |
20 TEST_F(CoreImplTest, GetTimeTicksNow) { | 20 TEST_F(CoreTest, GetTimeTicksNow) { |
21 const MojoTimeTicks start = core()->GetTimeTicksNow(); | 21 const MojoTimeTicks start = core()->GetTimeTicksNow(); |
22 EXPECT_NE(static_cast<MojoTimeTicks>(0), start) | 22 EXPECT_NE(static_cast<MojoTimeTicks>(0), start) |
23 << "GetTimeTicksNow should return nonzero value"; | 23 << "GetTimeTicksNow should return nonzero value"; |
24 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(15)); | 24 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(15)); |
25 const MojoTimeTicks finish = core()->GetTimeTicksNow(); | 25 const MojoTimeTicks finish = core()->GetTimeTicksNow(); |
26 // Allow for some fuzz in sleep. | 26 // Allow for some fuzz in sleep. |
27 EXPECT_GE((finish - start), static_cast<MojoTimeTicks>(8000)) | 27 EXPECT_GE((finish - start), static_cast<MojoTimeTicks>(8000)) |
28 << "Sleeping should result in increasing time ticks"; | 28 << "Sleeping should result in increasing time ticks"; |
29 } | 29 } |
30 | 30 |
31 TEST_F(CoreImplTest, Basic) { | 31 TEST_F(CoreTest, Basic) { |
32 MockHandleInfo info; | 32 MockHandleInfo info; |
33 | 33 |
34 EXPECT_EQ(0u, info.GetCtorCallCount()); | 34 EXPECT_EQ(0u, info.GetCtorCallCount()); |
35 MojoHandle h = CreateMockHandle(&info); | 35 MojoHandle h = CreateMockHandle(&info); |
36 EXPECT_EQ(1u, info.GetCtorCallCount()); | 36 EXPECT_EQ(1u, info.GetCtorCallCount()); |
37 EXPECT_NE(h, MOJO_HANDLE_INVALID); | 37 EXPECT_NE(h, MOJO_HANDLE_INVALID); |
38 | 38 |
39 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); | 39 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
40 EXPECT_EQ(MOJO_RESULT_OK, | 40 EXPECT_EQ(MOJO_RESULT_OK, |
41 core()->WriteMessage(h, NULL, 0, NULL, 0, | 41 core()->WriteMessage(h, NULL, 0, NULL, 0, |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 EXPECT_EQ(0u, info.GetCancelAllWaitersCallCount()); | 113 EXPECT_EQ(0u, info.GetCancelAllWaitersCallCount()); |
114 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 114 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
115 EXPECT_EQ(1u, info.GetCancelAllWaitersCallCount()); | 115 EXPECT_EQ(1u, info.GetCancelAllWaitersCallCount()); |
116 EXPECT_EQ(1u, info.GetCloseCallCount()); | 116 EXPECT_EQ(1u, info.GetCloseCallCount()); |
117 EXPECT_EQ(1u, info.GetDtorCallCount()); | 117 EXPECT_EQ(1u, info.GetDtorCallCount()); |
118 | 118 |
119 // No waiters should ever have ever been added. | 119 // No waiters should ever have ever been added. |
120 EXPECT_EQ(0u, info.GetRemoveWaiterCallCount()); | 120 EXPECT_EQ(0u, info.GetRemoveWaiterCallCount()); |
121 } | 121 } |
122 | 122 |
123 TEST_F(CoreImplTest, InvalidArguments) { | 123 TEST_F(CoreTest, InvalidArguments) { |
124 // |Close()|: | 124 // |Close()|: |
125 { | 125 { |
126 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(MOJO_HANDLE_INVALID)); | 126 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(MOJO_HANDLE_INVALID)); |
127 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(10)); | 127 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(10)); |
128 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(1000000000)); | 128 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(1000000000)); |
129 | 129 |
130 // Test a double-close. | 130 // Test a double-close. |
131 MockHandleInfo info; | 131 MockHandleInfo info; |
132 MojoHandle h = CreateMockHandle(&info); | 132 MojoHandle h = CreateMockHandle(&info); |
133 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 133 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 MojoHandle h; | 188 MojoHandle h; |
189 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 189 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
190 core()->CreateMessagePipe(NULL, NULL)); | 190 core()->CreateMessagePipe(NULL, NULL)); |
191 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 191 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
192 core()->CreateMessagePipe(&h, NULL)); | 192 core()->CreateMessagePipe(&h, NULL)); |
193 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 193 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
194 core()->CreateMessagePipe(NULL, &h)); | 194 core()->CreateMessagePipe(NULL, &h)); |
195 } | 195 } |
196 | 196 |
197 // |WriteMessage()|: | 197 // |WriteMessage()|: |
198 // Only check arguments checked by |CoreImpl|, namely |handle|, |handles|, and | 198 // Only check arguments checked by |Core|, namely |handle|, |handles|, and |
199 // |num_handles|. | 199 // |num_handles|. |
200 { | 200 { |
201 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 201 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
202 core()->WriteMessage(MOJO_HANDLE_INVALID, NULL, 0, NULL, 0, | 202 core()->WriteMessage(MOJO_HANDLE_INVALID, NULL, 0, NULL, 0, |
203 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 203 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
204 | 204 |
205 MockHandleInfo info; | 205 MockHandleInfo info; |
206 MojoHandle h = CreateMockHandle(&info); | 206 MojoHandle h = CreateMockHandle(&info); |
207 MojoHandle handles[2] = { MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID }; | 207 MojoHandle handles[2] = { MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID }; |
208 | 208 |
209 // Null |handles| with nonzero |num_handles|. | 209 // Null |handles| with nonzero |num_handles|. |
210 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 210 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
211 core()->WriteMessage(h, NULL, 0, NULL, 1, | 211 core()->WriteMessage(h, NULL, 0, NULL, 1, |
212 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 212 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
213 // Checked by |CoreImpl|, shouldn't go through to the dispatcher. | 213 // Checked by |Core|, shouldn't go through to the dispatcher. |
214 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); | 214 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
215 | 215 |
216 // Huge handle count (implausibly big on some systems -- more than can be | 216 // Huge handle count (implausibly big on some systems -- more than can be |
217 // stored in a 32-bit address space). | 217 // stored in a 32-bit address space). |
218 // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or | 218 // Note: This may return either |MOJO_RESULT_INVALID_ARGUMENT| or |
219 // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or | 219 // |MOJO_RESULT_RESOURCE_EXHAUSTED|, depending on whether it's plausible or |
220 // not. | 220 // not. |
221 EXPECT_NE(MOJO_RESULT_OK, | 221 EXPECT_NE(MOJO_RESULT_OK, |
222 core()->WriteMessage(h, NULL, 0, handles, | 222 core()->WriteMessage(h, NULL, 0, handles, |
223 std::numeric_limits<uint32_t>::max(), | 223 std::numeric_limits<uint32_t>::max(), |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); | 282 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
283 | 283 |
284 // Note: Since we never successfully sent anything with it, |h2| should | 284 // Note: Since we never successfully sent anything with it, |h2| should |
285 // still be valid. | 285 // still be valid. |
286 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h2)); | 286 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h2)); |
287 | 287 |
288 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 288 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
289 } | 289 } |
290 | 290 |
291 // |ReadMessage()|: | 291 // |ReadMessage()|: |
292 // Only check arguments checked by |CoreImpl|, namely |handle|, |handles|, and | 292 // Only check arguments checked by |Core|, namely |handle|, |handles|, and |
293 // |num_handles|. | 293 // |num_handles|. |
294 { | 294 { |
295 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 295 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
296 core()->ReadMessage(MOJO_HANDLE_INVALID, NULL, NULL, NULL, NULL, | 296 core()->ReadMessage(MOJO_HANDLE_INVALID, NULL, NULL, NULL, NULL, |
297 MOJO_READ_MESSAGE_FLAG_NONE)); | 297 MOJO_READ_MESSAGE_FLAG_NONE)); |
298 | 298 |
299 MockHandleInfo info; | 299 MockHandleInfo info; |
300 MojoHandle h = CreateMockHandle(&info); | 300 MojoHandle h = CreateMockHandle(&info); |
301 | 301 |
302 uint32_t handle_count = 1; | 302 uint32_t handle_count = 1; |
303 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 303 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
304 core()->ReadMessage(h, NULL, NULL, NULL, &handle_count, | 304 core()->ReadMessage(h, NULL, NULL, NULL, &handle_count, |
305 MOJO_READ_MESSAGE_FLAG_NONE)); | 305 MOJO_READ_MESSAGE_FLAG_NONE)); |
306 // Checked by |CoreImpl|, shouldn't go through to the dispatcher. | 306 // Checked by |Core|, shouldn't go through to the dispatcher. |
307 EXPECT_EQ(0u, info.GetReadMessageCallCount()); | 307 EXPECT_EQ(0u, info.GetReadMessageCallCount()); |
308 | 308 |
309 // Okay. | 309 // Okay. |
310 handle_count = 0; | 310 handle_count = 0; |
311 EXPECT_EQ(MOJO_RESULT_OK, | 311 EXPECT_EQ(MOJO_RESULT_OK, |
312 core()->ReadMessage(h, NULL, NULL, NULL, &handle_count, | 312 core()->ReadMessage(h, NULL, NULL, NULL, &handle_count, |
313 MOJO_READ_MESSAGE_FLAG_NONE)); | 313 MOJO_READ_MESSAGE_FLAG_NONE)); |
314 // Checked by |CoreImpl|, shouldn't go through to the dispatcher. | 314 // Checked by |Core|, shouldn't go through to the dispatcher. |
315 EXPECT_EQ(1u, info.GetReadMessageCallCount()); | 315 EXPECT_EQ(1u, info.GetReadMessageCallCount()); |
316 | 316 |
317 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 317 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
318 } | 318 } |
319 } | 319 } |
320 | 320 |
321 // TODO(vtl): test |Wait()| and |WaitMany()| properly | 321 // TODO(vtl): test |Wait()| and |WaitMany()| properly |
322 // - including |WaitMany()| with the same handle more than once (with | 322 // - including |WaitMany()| with the same handle more than once (with |
323 // same/different flags) | 323 // same/different flags) |
324 | 324 |
325 TEST_F(CoreImplTest, MessagePipe) { | 325 TEST_F(CoreTest, MessagePipe) { |
326 MojoHandle h[2]; | 326 MojoHandle h[2]; |
327 | 327 |
328 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateMessagePipe(&h[0], &h[1])); | 328 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateMessagePipe(&h[0], &h[1])); |
329 // Should get two distinct, valid handles. | 329 // Should get two distinct, valid handles. |
330 EXPECT_NE(h[0], MOJO_HANDLE_INVALID); | 330 EXPECT_NE(h[0], MOJO_HANDLE_INVALID); |
331 EXPECT_NE(h[1], MOJO_HANDLE_INVALID); | 331 EXPECT_NE(h[1], MOJO_HANDLE_INVALID); |
332 EXPECT_NE(h[0], h[1]); | 332 EXPECT_NE(h[0], h[1]); |
333 | 333 |
334 // Neither should be readable. | 334 // Neither should be readable. |
335 MojoWaitFlags flags[2] = { MOJO_WAIT_FLAG_READABLE, MOJO_WAIT_FLAG_READABLE }; | 335 MojoWaitFlags flags[2] = { MOJO_WAIT_FLAG_READABLE, MOJO_WAIT_FLAG_READABLE }; |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 // Try writing to |h[1]|. | 417 // Try writing to |h[1]|. |
418 buffer[0] = 'e'; | 418 buffer[0] = 'e'; |
419 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 419 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
420 core()->WriteMessage(h[1], buffer, 1, NULL, 0, | 420 core()->WriteMessage(h[1], buffer, 1, NULL, 0, |
421 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 421 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
422 | 422 |
423 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1])); | 423 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1])); |
424 } | 424 } |
425 | 425 |
426 // Tests passing a message pipe handle. | 426 // Tests passing a message pipe handle. |
427 TEST_F(CoreImplTest, MessagePipeBasicLocalHandlePassing1) { | 427 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing1) { |
428 const char kHello[] = "hello"; | 428 const char kHello[] = "hello"; |
429 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 429 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
430 const char kWorld[] = "world!!!"; | 430 const char kWorld[] = "world!!!"; |
431 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 431 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
432 char buffer[100]; | 432 char buffer[100]; |
433 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 433 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
434 uint32_t num_bytes; | 434 uint32_t num_bytes; |
435 MojoHandle handles[10]; | 435 MojoHandle handles[10]; |
436 uint32_t num_handles; | 436 uint32_t num_handles; |
437 MojoHandle h_received; | 437 MojoHandle h_received; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 EXPECT_EQ(kHelloSize, num_bytes); | 544 EXPECT_EQ(kHelloSize, num_bytes); |
545 EXPECT_STREQ(kHello, buffer); | 545 EXPECT_STREQ(kHello, buffer); |
546 EXPECT_EQ(0u, num_handles); | 546 EXPECT_EQ(0u, num_handles); |
547 | 547 |
548 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); | 548 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); |
549 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); | 549 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); |
550 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0])); | 550 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0])); |
551 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received)); | 551 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received)); |
552 } | 552 } |
553 | 553 |
554 TEST_F(CoreImplTest, DataPipe) { | 554 TEST_F(CoreTest, DataPipe) { |
555 MojoHandle ph, ch; // p is for producer and c is for consumer. | 555 MojoHandle ph, ch; // p is for producer and c is for consumer. |
556 | 556 |
557 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateDataPipe(NULL, &ph, &ch)); | 557 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateDataPipe(NULL, &ph, &ch)); |
558 // Should get two distinct, valid handles. | 558 // Should get two distinct, valid handles. |
559 EXPECT_NE(ph, MOJO_HANDLE_INVALID); | 559 EXPECT_NE(ph, MOJO_HANDLE_INVALID); |
560 EXPECT_NE(ch, MOJO_HANDLE_INVALID); | 560 EXPECT_NE(ch, MOJO_HANDLE_INVALID); |
561 EXPECT_NE(ph, ch); | 561 EXPECT_NE(ph, ch); |
562 | 562 |
563 // Producer should be never-readable, but already writable. | 563 // Producer should be never-readable, but already writable. |
564 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 564 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); | 666 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); |
667 | 667 |
668 // The consumer should now be never-readable. | 668 // The consumer should now be never-readable. |
669 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 669 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
670 core()->Wait(ch, MOJO_WAIT_FLAG_READABLE, 0)); | 670 core()->Wait(ch, MOJO_WAIT_FLAG_READABLE, 0)); |
671 | 671 |
672 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); | 672 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); |
673 } | 673 } |
674 | 674 |
675 // Tests passing data pipe producer and consumer handles. | 675 // Tests passing data pipe producer and consumer handles. |
676 TEST_F(CoreImplTest, MessagePipeBasicLocalHandlePassing2) { | 676 TEST_F(CoreTest, MessagePipeBasicLocalHandlePassing2) { |
677 const char kHello[] = "hello"; | 677 const char kHello[] = "hello"; |
678 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); | 678 const uint32_t kHelloSize = static_cast<uint32_t>(sizeof(kHello)); |
679 const char kWorld[] = "world!!!"; | 679 const char kWorld[] = "world!!!"; |
680 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); | 680 const uint32_t kWorldSize = static_cast<uint32_t>(sizeof(kWorld)); |
681 char buffer[100]; | 681 char buffer[100]; |
682 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); | 682 const uint32_t kBufferSize = static_cast<uint32_t>(sizeof(buffer)); |
683 uint32_t num_bytes; | 683 uint32_t num_bytes; |
684 MojoHandle handles[10]; | 684 MojoHandle handles[10]; |
685 uint32_t num_handles; | 685 uint32_t num_handles; |
686 | 686 |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
872 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); | 872 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); |
873 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); | 873 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); |
874 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); | 874 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); |
875 } | 875 } |
876 | 876 |
877 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. | 877 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. |
878 | 878 |
879 } // namespace | 879 } // namespace |
880 } // namespace system | 880 } // namespace system |
881 } // namespace mojo | 881 } // namespace mojo |
OLD | NEW |