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 |