| 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.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" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 96 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 97 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING, | 97 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING, |
| 98 MOJO_DEADLINE_INDEFINITE)); | 98 MOJO_DEADLINE_INDEFINITE)); |
| 99 EXPECT_EQ(1u, info.GetAddWaiterCallCount()); | 99 EXPECT_EQ(1u, info.GetAddWaiterCallCount()); |
| 100 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 100 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 101 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING, 0)); | 101 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING, 0)); |
| 102 EXPECT_EQ(2u, info.GetAddWaiterCallCount()); | 102 EXPECT_EQ(2u, info.GetAddWaiterCallCount()); |
| 103 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 103 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 104 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING, 10 * 1000)); | 104 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING, 10 * 1000)); |
| 105 EXPECT_EQ(3u, info.GetAddWaiterCallCount()); | 105 EXPECT_EQ(3u, info.GetAddWaiterCallCount()); |
| 106 MojoWaitFlags wait_flags = MOJO_WAIT_FLAG_EVERYTHING; | 106 MojoHandleSignals handle_signals = MOJO_WAIT_FLAG_EVERYTHING; |
| 107 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 107 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 108 core()->WaitMany(&h, &wait_flags, 1, MOJO_DEADLINE_INDEFINITE)); | 108 core()->WaitMany(&h, &handle_signals, 1, MOJO_DEADLINE_INDEFINITE)); |
| 109 EXPECT_EQ(4u, info.GetAddWaiterCallCount()); | 109 EXPECT_EQ(4u, info.GetAddWaiterCallCount()); |
| 110 | 110 |
| 111 EXPECT_EQ(0u, info.GetDtorCallCount()); | 111 EXPECT_EQ(0u, info.GetDtorCallCount()); |
| 112 EXPECT_EQ(0u, info.GetCloseCallCount()); | 112 EXPECT_EQ(0u, info.GetCloseCallCount()); |
| 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 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 141 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 141 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 142 core()->Wait(MOJO_HANDLE_INVALID, MOJO_WAIT_FLAG_EVERYTHING, | 142 core()->Wait(MOJO_HANDLE_INVALID, MOJO_WAIT_FLAG_EVERYTHING, |
| 143 MOJO_DEADLINE_INDEFINITE)); | 143 MOJO_DEADLINE_INDEFINITE)); |
| 144 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 144 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 145 core()->Wait(10, MOJO_WAIT_FLAG_EVERYTHING, | 145 core()->Wait(10, MOJO_WAIT_FLAG_EVERYTHING, |
| 146 MOJO_DEADLINE_INDEFINITE)); | 146 MOJO_DEADLINE_INDEFINITE)); |
| 147 } | 147 } |
| 148 | 148 |
| 149 // |WaitMany()|: | 149 // |WaitMany()|: |
| 150 { | 150 { |
| 151 MojoHandle handles[2] = { MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID }; | 151 MojoHandle handles[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; |
| 152 MojoWaitFlags flags[2] = { MOJO_WAIT_FLAG_EVERYTHING, | 152 MojoHandleSignals signals[2] = {MOJO_WAIT_FLAG_EVERYTHING, |
| 153 MOJO_WAIT_FLAG_EVERYTHING }; | 153 MOJO_WAIT_FLAG_EVERYTHING}; |
| 154 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 154 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 155 core()->WaitMany(handles, flags, 0, MOJO_DEADLINE_INDEFINITE)); | 155 core()->WaitMany(handles, signals, 0, MOJO_DEADLINE_INDEFINITE)); |
| 156 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 156 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 157 core()->WaitMany(NULL, flags, 0, MOJO_DEADLINE_INDEFINITE)); | 157 core()->WaitMany(NULL, signals, 0, MOJO_DEADLINE_INDEFINITE)); |
| 158 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 158 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 159 core()->WaitMany(handles, NULL, 0, MOJO_DEADLINE_INDEFINITE)); | 159 core()->WaitMany(handles, NULL, 0, MOJO_DEADLINE_INDEFINITE)); |
| 160 | 160 |
| 161 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 161 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 162 core()->WaitMany(NULL, flags, 1, MOJO_DEADLINE_INDEFINITE)); | 162 core()->WaitMany(NULL, signals, 1, MOJO_DEADLINE_INDEFINITE)); |
| 163 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 163 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 164 core()->WaitMany(handles, NULL, 1, MOJO_DEADLINE_INDEFINITE)); | 164 core()->WaitMany(handles, NULL, 1, MOJO_DEADLINE_INDEFINITE)); |
| 165 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 165 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 166 core()->WaitMany(handles, flags, 1, MOJO_DEADLINE_INDEFINITE)); | 166 core()->WaitMany(handles, signals, 1, MOJO_DEADLINE_INDEFINITE)); |
| 167 | 167 |
| 168 MockHandleInfo info[2]; | 168 MockHandleInfo info[2]; |
| 169 handles[0] = CreateMockHandle(&info[0]); | 169 handles[0] = CreateMockHandle(&info[0]); |
| 170 | 170 |
| 171 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 171 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 172 core()->WaitMany(handles, flags, 1, MOJO_DEADLINE_INDEFINITE)); | 172 core()->WaitMany(handles, signals, 1, MOJO_DEADLINE_INDEFINITE)); |
| 173 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 173 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 174 core()->WaitMany(handles, flags, 2, MOJO_DEADLINE_INDEFINITE)); | 174 core()->WaitMany(handles, signals, 2, MOJO_DEADLINE_INDEFINITE)); |
| 175 handles[1] = handles[0] + 1; // Invalid handle. | 175 handles[1] = handles[0] + 1; // Invalid handle. |
| 176 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 176 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 177 core()->WaitMany(handles, flags, 2, MOJO_DEADLINE_INDEFINITE)); | 177 core()->WaitMany(handles, signals, 2, MOJO_DEADLINE_INDEFINITE)); |
| 178 handles[1] = CreateMockHandle(&info[1]); | 178 handles[1] = CreateMockHandle(&info[1]); |
| 179 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 179 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 180 core()->WaitMany(handles, flags, 2, MOJO_DEADLINE_INDEFINITE)); | 180 core()->WaitMany(handles, signals, 2, MOJO_DEADLINE_INDEFINITE)); |
| 181 | 181 |
| 182 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0])); | 182 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0])); |
| 183 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1])); | 183 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1])); |
| 184 } | 184 } |
| 185 | 185 |
| 186 // |CreateMessagePipe()|: | 186 // |CreateMessagePipe()|: |
| 187 { | 187 { |
| 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, NULL)); | 190 core()->CreateMessagePipe(NULL, NULL, NULL)); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 MOJO_READ_MESSAGE_FLAG_NONE)); | 313 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 314 // Checked by |Core|, 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 signals) |
| 324 | 324 |
| 325 TEST_F(CoreTest, MessagePipe) { | 325 TEST_F(CoreTest, MessagePipe) { |
| 326 MojoHandle h[2]; | 326 MojoHandle h[2]; |
| 327 | 327 |
| 328 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateMessagePipe(NULL, &h[0], &h[1])); | 328 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateMessagePipe(NULL, &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 MojoHandleSignals signals[2] = {MOJO_WAIT_FLAG_READABLE, |
| 336 MOJO_WAIT_FLAG_READABLE}; |
| 336 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 337 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
| 337 core()->WaitMany(h, flags, 2, 0)); | 338 core()->WaitMany(h, signals, 2, 0)); |
| 338 | 339 |
| 339 // Try to read anyway. | 340 // Try to read anyway. |
| 340 char buffer[1] = { 'a' }; | 341 char buffer[1] = { 'a' }; |
| 341 uint32_t buffer_size = 1; | 342 uint32_t buffer_size = 1; |
| 342 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 343 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
| 343 core()->ReadMessage(h[0], buffer, &buffer_size, NULL, NULL, | 344 core()->ReadMessage(h[0], buffer, &buffer_size, NULL, NULL, |
| 344 MOJO_READ_MESSAGE_FLAG_NONE)); | 345 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 345 // Check that it left its inputs alone. | 346 // Check that it left its inputs alone. |
| 346 EXPECT_EQ('a', buffer[0]); | 347 EXPECT_EQ('a', buffer[0]); |
| 347 EXPECT_EQ(1u, buffer_size); | 348 EXPECT_EQ(1u, buffer_size); |
| 348 | 349 |
| 349 // Both should be writable. | 350 // Both should be writable. |
| 350 EXPECT_EQ(MOJO_RESULT_OK, | 351 EXPECT_EQ(MOJO_RESULT_OK, |
| 351 core()->Wait(h[0], MOJO_WAIT_FLAG_WRITABLE, 1000000000)); | 352 core()->Wait(h[0], MOJO_WAIT_FLAG_WRITABLE, 1000000000)); |
| 352 EXPECT_EQ(MOJO_RESULT_OK, | 353 EXPECT_EQ(MOJO_RESULT_OK, |
| 353 core()->Wait(h[1], MOJO_WAIT_FLAG_WRITABLE, 1000000000)); | 354 core()->Wait(h[1], MOJO_WAIT_FLAG_WRITABLE, 1000000000)); |
| 354 | 355 |
| 355 // Also check that |h[1]| is writable using |WaitMany()|. | 356 // Also check that |h[1]| is writable using |WaitMany()|. |
| 356 flags[0] = MOJO_WAIT_FLAG_READABLE; | 357 signals[0] = MOJO_WAIT_FLAG_READABLE; |
| 357 flags[1] = MOJO_WAIT_FLAG_WRITABLE; | 358 signals[1] = MOJO_WAIT_FLAG_WRITABLE; |
| 358 EXPECT_EQ(1, core()->WaitMany(h, flags, 2, MOJO_DEADLINE_INDEFINITE)); | 359 EXPECT_EQ(1, core()->WaitMany(h, signals, 2, MOJO_DEADLINE_INDEFINITE)); |
| 359 | 360 |
| 360 // Write to |h[1]|. | 361 // Write to |h[1]|. |
| 361 buffer[0] = 'b'; | 362 buffer[0] = 'b'; |
| 362 EXPECT_EQ(MOJO_RESULT_OK, | 363 EXPECT_EQ(MOJO_RESULT_OK, |
| 363 core()->WriteMessage(h[1], buffer, 1, NULL, 0, | 364 core()->WriteMessage(h[1], buffer, 1, NULL, 0, |
| 364 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 365 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 365 | 366 |
| 366 // Check that |h[0]| is now readable. | 367 // Check that |h[0]| is now readable. |
| 367 flags[0] = MOJO_WAIT_FLAG_READABLE; | 368 signals[0] = MOJO_WAIT_FLAG_READABLE; |
| 368 flags[1] = MOJO_WAIT_FLAG_READABLE; | 369 signals[1] = MOJO_WAIT_FLAG_READABLE; |
| 369 EXPECT_EQ(0, core()->WaitMany(h, flags, 2, MOJO_DEADLINE_INDEFINITE)); | 370 EXPECT_EQ(0, core()->WaitMany(h, signals, 2, MOJO_DEADLINE_INDEFINITE)); |
| 370 | 371 |
| 371 // Read from |h[0]|. | 372 // Read from |h[0]|. |
| 372 // First, get only the size. | 373 // First, get only the size. |
| 373 buffer_size = 0; | 374 buffer_size = 0; |
| 374 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, | 375 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED, |
| 375 core()->ReadMessage(h[0], NULL, &buffer_size, NULL, NULL, | 376 core()->ReadMessage(h[0], NULL, &buffer_size, NULL, NULL, |
| 376 MOJO_READ_MESSAGE_FLAG_NONE)); | 377 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 377 EXPECT_EQ(1u, buffer_size); | 378 EXPECT_EQ(1u, buffer_size); |
| 378 // Then actually read it. | 379 // Then actually read it. |
| 379 buffer[0] = 'c'; | 380 buffer[0] = 'c'; |
| (...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 872 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); | 873 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(ph)); |
| 874 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); | 875 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); |
| 875 } | 876 } |
| 876 | 877 |
| 877 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. | 878 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. |
| 878 | 879 |
| 879 } // namespace | 880 } // namespace |
| 880 } // namespace system | 881 } // namespace system |
| 881 } // namespace mojo | 882 } // namespace mojo |
| OLD | NEW |