OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/edk/embedder/embedder.h" | 5 #include "mojo/edk/embedder/embedder.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/macros.h" | 12 #include "base/macros.h" |
13 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
14 #include "base/synchronization/waitable_event.h" | 14 #include "base/synchronization/waitable_event.h" |
15 #include "base/test/test_io_thread.h" | 15 #include "base/test/test_io_thread.h" |
16 #include "mojo/edk/embedder/platform_channel_pair.h" | 16 #include "mojo/edk/embedder/platform_channel_pair.h" |
17 #include "mojo/edk/embedder/test_embedder.h" | 17 #include "mojo/edk/embedder/test_embedder.h" |
18 #include "mojo/edk/system/test_utils.h" | 18 #include "mojo/edk/system/test_utils.h" |
19 #include "mojo/edk/test/multiprocess_test_helper.h" | 19 #include "mojo/edk/test/multiprocess_test_helper.h" |
20 #include "mojo/public/c/system/core.h" | 20 #include "mojo/public/c/system/core.h" |
21 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
22 | 22 |
23 namespace mojo { | 23 namespace mojo { |
24 namespace embedder { | 24 namespace embedder { |
25 namespace { | 25 namespace { |
26 | 26 |
| 27 const MojoHandleSignals kSignalReadadableWritable = |
| 28 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE; |
| 29 |
| 30 const MojoHandleSignals kSignalAll = MOJO_HANDLE_SIGNAL_READABLE | |
| 31 MOJO_HANDLE_SIGNAL_WRITABLE | |
| 32 MOJO_HANDLE_SIGNAL_PEER_CLOSED; |
| 33 |
27 class ScopedTestChannel { | 34 class ScopedTestChannel { |
28 public: | 35 public: |
29 // Creates a channel that lives on a given I/O thread (determined by the given | 36 // Creates a channel that lives on a given I/O thread (determined by the given |
30 // |TaskRunner|) attached to the given |platform_handle|. After construction, | 37 // |TaskRunner|) attached to the given |platform_handle|. After construction, |
31 // |bootstrap_message_pipe()| gives the Mojo handle for the bootstrap message | 38 // |bootstrap_message_pipe()| gives the Mojo handle for the bootstrap message |
32 // pipe on this channel; it is up to the caller to close this handle. | 39 // pipe on this channel; it is up to the caller to close this handle. |
33 // Note: The I/O thread must outlive this object (and its message loop must | 40 // Note: The I/O thread must outlive this object (and its message loop must |
34 // continue pumping messages while this object is alive). | 41 // continue pumping messages while this object is alive). |
35 ScopedTestChannel(scoped_refptr<base::TaskRunner> io_thread_task_runner, | 42 ScopedTestChannel(scoped_refptr<base::TaskRunner> io_thread_task_runner, |
36 ScopedPlatformHandle platform_handle) | 43 ScopedPlatformHandle platform_handle) |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 EXPECT_NE(client_mp, MOJO_HANDLE_INVALID); | 123 EXPECT_NE(client_mp, MOJO_HANDLE_INVALID); |
117 | 124 |
118 // We can write to a message pipe handle immediately. | 125 // We can write to a message pipe handle immediately. |
119 const char kHello[] = "hello"; | 126 const char kHello[] = "hello"; |
120 EXPECT_EQ(MOJO_RESULT_OK, | 127 EXPECT_EQ(MOJO_RESULT_OK, |
121 MojoWriteMessage(server_mp, kHello, | 128 MojoWriteMessage(server_mp, kHello, |
122 static_cast<uint32_t>(sizeof(kHello)), nullptr, | 129 static_cast<uint32_t>(sizeof(kHello)), nullptr, |
123 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 130 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
124 | 131 |
125 // Now wait for the other side to become readable. | 132 // Now wait for the other side to become readable. |
126 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE, | 133 MojoHandleSignalsState state; |
127 MOJO_DEADLINE_INDEFINITE)); | 134 EXPECT_EQ(MOJO_RESULT_OK, |
| 135 MojoNewWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE, |
| 136 MOJO_DEADLINE_INDEFINITE, &state)); |
| 137 EXPECT_EQ(kSignalReadadableWritable, state.satisfied_signals); |
| 138 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
128 | 139 |
129 char buffer[1000] = {}; | 140 char buffer[1000] = {}; |
130 uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 141 uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
131 EXPECT_EQ(MOJO_RESULT_OK, | 142 EXPECT_EQ(MOJO_RESULT_OK, |
132 MojoReadMessage(client_mp, buffer, &num_bytes, nullptr, nullptr, | 143 MojoReadMessage(client_mp, buffer, &num_bytes, nullptr, nullptr, |
133 MOJO_READ_MESSAGE_FLAG_NONE)); | 144 MOJO_READ_MESSAGE_FLAG_NONE)); |
134 EXPECT_EQ(sizeof(kHello), num_bytes); | 145 EXPECT_EQ(sizeof(kHello), num_bytes); |
135 EXPECT_STREQ(kHello, buffer); | 146 EXPECT_STREQ(kHello, buffer); |
136 | 147 |
137 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(server_mp)); | 148 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(server_mp)); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 192 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
182 h1 = MOJO_HANDLE_INVALID; | 193 h1 = MOJO_HANDLE_INVALID; |
183 | 194 |
184 // Write another message to |h0|. | 195 // Write another message to |h0|. |
185 const char kFoo[] = "foo"; | 196 const char kFoo[] = "foo"; |
186 EXPECT_EQ(MOJO_RESULT_OK, | 197 EXPECT_EQ(MOJO_RESULT_OK, |
187 MojoWriteMessage(h0, kFoo, static_cast<uint32_t>(sizeof(kFoo)), | 198 MojoWriteMessage(h0, kFoo, static_cast<uint32_t>(sizeof(kFoo)), |
188 nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 199 nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
189 | 200 |
190 // Wait for |client_mp| to become readable. | 201 // Wait for |client_mp| to become readable. |
191 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE, | 202 MojoHandleSignalsState state; |
192 MOJO_DEADLINE_INDEFINITE)); | 203 EXPECT_EQ(MOJO_RESULT_OK, |
| 204 MojoNewWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE, |
| 205 MOJO_DEADLINE_INDEFINITE, &state)); |
| 206 EXPECT_EQ(kSignalReadadableWritable, state.satisfied_signals); |
| 207 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
193 | 208 |
194 // Read a message from |client_mp|. | 209 // Read a message from |client_mp|. |
195 char buffer[1000] = {}; | 210 char buffer[1000] = {}; |
196 uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 211 uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
197 MojoHandle handles[10] = {}; | 212 MojoHandle handles[10] = {}; |
198 uint32_t num_handles = arraysize(handles); | 213 uint32_t num_handles = arraysize(handles); |
199 EXPECT_EQ(MOJO_RESULT_OK, | 214 EXPECT_EQ(MOJO_RESULT_OK, |
200 MojoReadMessage(client_mp, buffer, &num_bytes, handles, | 215 MojoReadMessage(client_mp, buffer, &num_bytes, handles, |
201 &num_handles, MOJO_READ_MESSAGE_FLAG_NONE)); | 216 &num_handles, MOJO_READ_MESSAGE_FLAG_NONE)); |
202 EXPECT_EQ(sizeof(kWorld), num_bytes); | 217 EXPECT_EQ(sizeof(kWorld), num_bytes); |
203 EXPECT_STREQ(kWorld, buffer); | 218 EXPECT_STREQ(kWorld, buffer); |
204 EXPECT_EQ(1u, num_handles); | 219 EXPECT_EQ(1u, num_handles); |
205 EXPECT_NE(handles[0], MOJO_HANDLE_INVALID); | 220 EXPECT_NE(handles[0], MOJO_HANDLE_INVALID); |
206 h1 = handles[0]; | 221 h1 = handles[0]; |
207 | 222 |
208 // Wait for |h1| to become readable. | 223 // Wait for |h1| to become readable. |
209 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(h1, MOJO_HANDLE_SIGNAL_READABLE, | 224 EXPECT_EQ(MOJO_RESULT_OK, MojoNewWait(h1, MOJO_HANDLE_SIGNAL_READABLE, |
210 MOJO_DEADLINE_INDEFINITE)); | 225 MOJO_DEADLINE_INDEFINITE, &state)); |
| 226 EXPECT_EQ(kSignalReadadableWritable, state.satisfied_signals); |
| 227 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
211 | 228 |
212 // Read a message from |h1|. | 229 // Read a message from |h1|. |
213 memset(buffer, 0, sizeof(buffer)); | 230 memset(buffer, 0, sizeof(buffer)); |
214 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 231 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
215 memset(handles, 0, sizeof(handles)); | 232 memset(handles, 0, sizeof(handles)); |
216 num_handles = arraysize(handles); | 233 num_handles = arraysize(handles); |
217 EXPECT_EQ(MOJO_RESULT_OK, | 234 EXPECT_EQ(MOJO_RESULT_OK, |
218 MojoReadMessage(h1, buffer, &num_bytes, handles, &num_handles, | 235 MojoReadMessage(h1, buffer, &num_bytes, handles, &num_handles, |
219 MOJO_READ_MESSAGE_FLAG_NONE)); | 236 MOJO_READ_MESSAGE_FLAG_NONE)); |
220 EXPECT_EQ(sizeof(kHello), num_bytes); | 237 EXPECT_EQ(sizeof(kHello), num_bytes); |
221 EXPECT_STREQ(kHello, buffer); | 238 EXPECT_STREQ(kHello, buffer); |
222 EXPECT_EQ(0u, num_handles); | 239 EXPECT_EQ(0u, num_handles); |
223 | 240 |
224 // Wait for |h1| to become readable (again). | 241 // Wait for |h1| to become readable (again). |
225 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(h1, MOJO_HANDLE_SIGNAL_READABLE, | 242 EXPECT_EQ(MOJO_RESULT_OK, MojoNewWait(h1, MOJO_HANDLE_SIGNAL_READABLE, |
226 MOJO_DEADLINE_INDEFINITE)); | 243 MOJO_DEADLINE_INDEFINITE, &state)); |
| 244 EXPECT_EQ(kSignalReadadableWritable, state.satisfied_signals); |
| 245 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
227 | 246 |
228 // Read the second message from |h1|. | 247 // Read the second message from |h1|. |
229 memset(buffer, 0, sizeof(buffer)); | 248 memset(buffer, 0, sizeof(buffer)); |
230 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 249 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
231 EXPECT_EQ(MOJO_RESULT_OK, | 250 EXPECT_EQ(MOJO_RESULT_OK, |
232 MojoReadMessage(h1, buffer, &num_bytes, nullptr, nullptr, | 251 MojoReadMessage(h1, buffer, &num_bytes, nullptr, nullptr, |
233 MOJO_READ_MESSAGE_FLAG_NONE)); | 252 MOJO_READ_MESSAGE_FLAG_NONE)); |
234 EXPECT_EQ(sizeof(kFoo), num_bytes); | 253 EXPECT_EQ(sizeof(kFoo), num_bytes); |
235 EXPECT_STREQ(kFoo, buffer); | 254 EXPECT_STREQ(kFoo, buffer); |
236 | 255 |
237 // Write a message to |h1|. | 256 // Write a message to |h1|. |
238 const char kBarBaz[] = "barbaz"; | 257 const char kBarBaz[] = "barbaz"; |
239 EXPECT_EQ( | 258 EXPECT_EQ( |
240 MOJO_RESULT_OK, | 259 MOJO_RESULT_OK, |
241 MojoWriteMessage(h1, kBarBaz, static_cast<uint32_t>(sizeof(kBarBaz)), | 260 MojoWriteMessage(h1, kBarBaz, static_cast<uint32_t>(sizeof(kBarBaz)), |
242 nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 261 nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
243 | 262 |
244 // Wait for |h0| to become readable. | 263 // Wait for |h0| to become readable. |
245 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(h0, MOJO_HANDLE_SIGNAL_READABLE, | 264 EXPECT_EQ(MOJO_RESULT_OK, MojoNewWait(h0, MOJO_HANDLE_SIGNAL_READABLE, |
246 MOJO_DEADLINE_INDEFINITE)); | 265 MOJO_DEADLINE_INDEFINITE, &state)); |
| 266 EXPECT_EQ(kSignalReadadableWritable, state.satisfied_signals); |
| 267 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
247 | 268 |
248 // Read a message from |h0|. | 269 // Read a message from |h0|. |
249 memset(buffer, 0, sizeof(buffer)); | 270 memset(buffer, 0, sizeof(buffer)); |
250 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 271 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
251 EXPECT_EQ(MOJO_RESULT_OK, | 272 EXPECT_EQ(MOJO_RESULT_OK, |
252 MojoReadMessage(h0, buffer, &num_bytes, nullptr, nullptr, | 273 MojoReadMessage(h0, buffer, &num_bytes, nullptr, nullptr, |
253 MOJO_READ_MESSAGE_FLAG_NONE)); | 274 MOJO_READ_MESSAGE_FLAG_NONE)); |
254 EXPECT_EQ(sizeof(kBarBaz), num_bytes); | 275 EXPECT_EQ(sizeof(kBarBaz), num_bytes); |
255 EXPECT_STREQ(kBarBaz, buffer); | 276 EXPECT_STREQ(kBarBaz, buffer); |
256 | 277 |
(...skipping 18 matching lines...) Expand all Loading... |
275 // 3. "FOO" | 296 // 3. "FOO" |
276 // 4. "Bar"+mp1 | 297 // 4. "Bar"+mp1 |
277 // 5. (close) | 298 // 5. (close) |
278 // 6. (close) | 299 // 6. (close) |
279 // 7. "baz" | 300 // 7. "baz" |
280 // 8. (closed) | 301 // 8. (closed) |
281 // 9. "quux"+mp2 | 302 // 9. "quux"+mp2 |
282 // 10. (close) | 303 // 10. (close) |
283 // 11. (wait/cl.) | 304 // 11. (wait/cl.) |
284 // 12. (wait/cl.) | 305 // 12. (wait/cl.) |
| 306 |
285 #if defined(OS_ANDROID) | 307 #if defined(OS_ANDROID) |
286 // Android multi-process tests are not executing the new process. This is flaky. | 308 // Android multi-process tests are not executing the new process. This is flaky. |
287 #define MAYBE_MultiprocessChannels DISABLED_MultiprocessChannels | 309 #define MAYBE_MultiprocessChannels DISABLED_MultiprocessChannels |
288 #else | 310 #else |
289 #define MAYBE_MultiprocessChannels MultiprocessChannels | 311 #define MAYBE_MultiprocessChannels MultiprocessChannels |
290 #endif // defined(OS_ANDROID) | 312 #endif // defined(OS_ANDROID) |
291 TEST_F(EmbedderTest, MAYBE_MultiprocessChannels) { | 313 TEST_F(EmbedderTest, MAYBE_MultiprocessChannels) { |
292 mojo::embedder::test::InitWithSimplePlatformSupport(); | 314 mojo::embedder::test::InitWithSimplePlatformSupport(); |
293 mojo::test::MultiprocessTestHelper multiprocess_test_helper; | 315 mojo::test::MultiprocessTestHelper multiprocess_test_helper; |
294 multiprocess_test_helper.StartChild("MultiprocessChannelsClient"); | 316 multiprocess_test_helper.StartChild("MultiprocessChannelsClient"); |
(...skipping 11 matching lines...) Expand all Loading... |
306 const char kHello[] = "hello"; | 328 const char kHello[] = "hello"; |
307 EXPECT_EQ(MOJO_RESULT_OK, | 329 EXPECT_EQ(MOJO_RESULT_OK, |
308 MojoWriteMessage(server_mp, kHello, | 330 MojoWriteMessage(server_mp, kHello, |
309 static_cast<uint32_t>(sizeof(kHello)), nullptr, | 331 static_cast<uint32_t>(sizeof(kHello)), nullptr, |
310 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 332 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
311 | 333 |
312 // TODO(vtl): If the scope were ended immediately here (maybe after closing | 334 // TODO(vtl): If the scope were ended immediately here (maybe after closing |
313 // |server_mp|), we die with a fatal error in |Channel::HandleLocalError()|. | 335 // |server_mp|), we die with a fatal error in |Channel::HandleLocalError()|. |
314 | 336 |
315 // 2. Read a message from |server_mp|. | 337 // 2. Read a message from |server_mp|. |
316 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(server_mp, MOJO_HANDLE_SIGNAL_READABLE, | 338 MojoHandleSignalsState state; |
317 MOJO_DEADLINE_INDEFINITE)); | 339 EXPECT_EQ(MOJO_RESULT_OK, |
| 340 MojoNewWait(server_mp, MOJO_HANDLE_SIGNAL_READABLE, |
| 341 MOJO_DEADLINE_INDEFINITE, &state)); |
| 342 EXPECT_EQ(kSignalReadadableWritable, state.satisfied_signals); |
| 343 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
| 344 |
318 char buffer[1000] = {}; | 345 char buffer[1000] = {}; |
319 uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 346 uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
320 EXPECT_EQ(MOJO_RESULT_OK, | 347 EXPECT_EQ(MOJO_RESULT_OK, |
321 MojoReadMessage(server_mp, buffer, &num_bytes, nullptr, nullptr, | 348 MojoReadMessage(server_mp, buffer, &num_bytes, nullptr, nullptr, |
322 MOJO_READ_MESSAGE_FLAG_NONE)); | 349 MOJO_READ_MESSAGE_FLAG_NONE)); |
323 const char kWorld[] = "world!"; | 350 const char kWorld[] = "world!"; |
324 EXPECT_EQ(sizeof(kWorld), num_bytes); | 351 EXPECT_EQ(sizeof(kWorld), num_bytes); |
325 EXPECT_STREQ(kWorld, buffer); | 352 EXPECT_STREQ(kWorld, buffer); |
326 | 353 |
327 // Create a new message pipe (endpoints |mp0| and |mp1|). | 354 // Create a new message pipe (endpoints |mp0| and |mp1|). |
(...skipping 11 matching lines...) Expand all Loading... |
339 EXPECT_EQ( | 366 EXPECT_EQ( |
340 MOJO_RESULT_OK, | 367 MOJO_RESULT_OK, |
341 MojoWriteMessage(server_mp, kBar, static_cast<uint32_t>(sizeof(kBar)), | 368 MojoWriteMessage(server_mp, kBar, static_cast<uint32_t>(sizeof(kBar)), |
342 &mp1, 1, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 369 &mp1, 1, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
343 mp1 = MOJO_HANDLE_INVALID; | 370 mp1 = MOJO_HANDLE_INVALID; |
344 | 371 |
345 // 5. Close |server_mp|. | 372 // 5. Close |server_mp|. |
346 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(server_mp)); | 373 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(server_mp)); |
347 | 374 |
348 // 9. Read a message from |mp0|, which should have |mp2| attached. | 375 // 9. Read a message from |mp0|, which should have |mp2| attached. |
349 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(mp0, MOJO_HANDLE_SIGNAL_READABLE, | 376 EXPECT_EQ(MOJO_RESULT_OK, MojoNewWait(mp0, MOJO_HANDLE_SIGNAL_READABLE, |
350 MOJO_DEADLINE_INDEFINITE)); | 377 MOJO_DEADLINE_INDEFINITE, &state)); |
| 378 EXPECT_EQ(kSignalReadadableWritable, state.satisfied_signals); |
| 379 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
| 380 |
351 memset(buffer, 0, sizeof(buffer)); | 381 memset(buffer, 0, sizeof(buffer)); |
352 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 382 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
353 MojoHandle mp2 = MOJO_HANDLE_INVALID; | 383 MojoHandle mp2 = MOJO_HANDLE_INVALID; |
354 uint32_t num_handles = 1; | 384 uint32_t num_handles = 1; |
355 EXPECT_EQ(MOJO_RESULT_OK, | 385 EXPECT_EQ(MOJO_RESULT_OK, |
356 MojoReadMessage(mp0, buffer, &num_bytes, &mp2, &num_handles, | 386 MojoReadMessage(mp0, buffer, &num_bytes, &mp2, &num_handles, |
357 MOJO_READ_MESSAGE_FLAG_NONE)); | 387 MOJO_READ_MESSAGE_FLAG_NONE)); |
358 const char kQuux[] = "quux"; | 388 const char kQuux[] = "quux"; |
359 EXPECT_EQ(sizeof(kQuux), num_bytes); | 389 EXPECT_EQ(sizeof(kQuux), num_bytes); |
360 EXPECT_STREQ(kQuux, buffer); | 390 EXPECT_STREQ(kQuux, buffer); |
361 EXPECT_EQ(1u, num_handles); | 391 EXPECT_EQ(1u, num_handles); |
362 EXPECT_NE(mp2, MOJO_HANDLE_INVALID); | 392 EXPECT_NE(mp2, MOJO_HANDLE_INVALID); |
363 | 393 |
364 // 7. Read a message from |mp2|. | 394 // 7. Read a message from |mp2|. |
365 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(mp2, MOJO_HANDLE_SIGNAL_READABLE, | 395 EXPECT_EQ(MOJO_RESULT_OK, MojoNewWait(mp2, MOJO_HANDLE_SIGNAL_READABLE, |
366 MOJO_DEADLINE_INDEFINITE)); | 396 MOJO_DEADLINE_INDEFINITE, &state)); |
| 397 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 398 state.satisfied_signals); |
| 399 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 400 state.satisfiable_signals); |
| 401 |
367 memset(buffer, 0, sizeof(buffer)); | 402 memset(buffer, 0, sizeof(buffer)); |
368 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 403 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
369 EXPECT_EQ(MOJO_RESULT_OK, | 404 EXPECT_EQ(MOJO_RESULT_OK, |
370 MojoReadMessage(mp2, buffer, &num_bytes, nullptr, nullptr, | 405 MojoReadMessage(mp2, buffer, &num_bytes, nullptr, nullptr, |
371 MOJO_READ_MESSAGE_FLAG_NONE)); | 406 MOJO_READ_MESSAGE_FLAG_NONE)); |
372 const char kBaz[] = "baz"; | 407 const char kBaz[] = "baz"; |
373 EXPECT_EQ(sizeof(kBaz), num_bytes); | 408 EXPECT_EQ(sizeof(kBaz), num_bytes); |
374 EXPECT_STREQ(kBaz, buffer); | 409 EXPECT_STREQ(kBaz, buffer); |
375 | 410 |
376 // 10. Close |mp0|. | 411 // 10. Close |mp0|. |
377 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mp0)); | 412 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mp0)); |
378 | 413 |
379 // 12. Wait on |mp2| (which should eventually fail) and then close it. | 414 // 12. Wait on |mp2| (which should eventually fail) and then close it. |
380 // TODO(vtl): crbug.com/351768 | 415 // TODO(vtl): crbug.com/351768 |
381 #if 0 | 416 #if 0 |
382 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 417 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
383 MojoWait(mp2, MOJO_HANDLE_SIGNAL_READABLE, | 418 MojoNewWait(mp2, MOJO_HANDLE_SIGNAL_READABLE, |
384 MOJO_DEADLINE_INDEFINITE)); | 419 MOJO_DEADLINE_INDEFINITE, |
| 420 &state)); |
| 421 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, state.satisfied_signals); |
| 422 EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, state.satisfiable_signals); |
385 #endif | 423 #endif |
386 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mp2)); | 424 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mp2)); |
387 } | 425 } |
388 | 426 |
389 EXPECT_TRUE(multiprocess_test_helper.WaitForChildTestShutdown()); | 427 EXPECT_TRUE(multiprocess_test_helper.WaitForChildTestShutdown()); |
390 EXPECT_TRUE(test::Shutdown()); | 428 EXPECT_TRUE(test::Shutdown()); |
391 } | 429 } |
392 | 430 |
393 MOJO_MULTIPROCESS_TEST_CHILD_TEST(MultiprocessChannelsClient) { | 431 MOJO_MULTIPROCESS_TEST_CHILD_TEST(MultiprocessChannelsClient) { |
394 ScopedPlatformHandle client_platform_handle = | 432 ScopedPlatformHandle client_platform_handle = |
395 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); | 433 mojo::test::MultiprocessTestHelper::client_platform_handle.Pass(); |
396 EXPECT_TRUE(client_platform_handle.is_valid()); | 434 EXPECT_TRUE(client_platform_handle.is_valid()); |
397 | 435 |
398 base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart); | 436 base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart); |
399 mojo::embedder::test::InitWithSimplePlatformSupport(); | 437 mojo::embedder::test::InitWithSimplePlatformSupport(); |
400 | 438 |
401 { | 439 { |
402 ScopedTestChannel client_channel(test_io_thread.task_runner(), | 440 ScopedTestChannel client_channel(test_io_thread.task_runner(), |
403 client_platform_handle.Pass()); | 441 client_platform_handle.Pass()); |
404 MojoHandle client_mp = client_channel.bootstrap_message_pipe(); | 442 MojoHandle client_mp = client_channel.bootstrap_message_pipe(); |
405 EXPECT_NE(client_mp, MOJO_HANDLE_INVALID); | 443 EXPECT_NE(client_mp, MOJO_HANDLE_INVALID); |
406 client_channel.WaitForChannelCreationCompletion(); | 444 client_channel.WaitForChannelCreationCompletion(); |
407 CHECK(client_channel.channel_info() != nullptr); | 445 CHECK(client_channel.channel_info() != nullptr); |
408 | 446 |
409 // 1. Read the first message from |client_mp|. | 447 // 1. Read the first message from |client_mp|. |
410 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE, | 448 MojoHandleSignalsState state; |
411 MOJO_DEADLINE_INDEFINITE)); | 449 EXPECT_EQ(MOJO_RESULT_OK, |
| 450 MojoNewWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE, |
| 451 MOJO_DEADLINE_INDEFINITE, &state)); |
| 452 EXPECT_EQ(kSignalReadadableWritable, state.satisfied_signals); |
| 453 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
| 454 |
412 char buffer[1000] = {}; | 455 char buffer[1000] = {}; |
413 uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 456 uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
414 EXPECT_EQ(MOJO_RESULT_OK, | 457 EXPECT_EQ(MOJO_RESULT_OK, |
415 MojoReadMessage(client_mp, buffer, &num_bytes, nullptr, nullptr, | 458 MojoReadMessage(client_mp, buffer, &num_bytes, nullptr, nullptr, |
416 MOJO_READ_MESSAGE_FLAG_NONE)); | 459 MOJO_READ_MESSAGE_FLAG_NONE)); |
417 const char kHello[] = "hello"; | 460 const char kHello[] = "hello"; |
418 EXPECT_EQ(sizeof(kHello), num_bytes); | 461 EXPECT_EQ(sizeof(kHello), num_bytes); |
419 EXPECT_STREQ(kHello, buffer); | 462 EXPECT_STREQ(kHello, buffer); |
420 | 463 |
421 // 2. Write a message to |client_mp| (attaching nothing). | 464 // 2. Write a message to |client_mp| (attaching nothing). |
422 const char kWorld[] = "world!"; | 465 const char kWorld[] = "world!"; |
423 EXPECT_EQ(MOJO_RESULT_OK, | 466 EXPECT_EQ(MOJO_RESULT_OK, |
424 MojoWriteMessage(client_mp, kWorld, | 467 MojoWriteMessage(client_mp, kWorld, |
425 static_cast<uint32_t>(sizeof(kWorld)), nullptr, | 468 static_cast<uint32_t>(sizeof(kWorld)), nullptr, |
426 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 469 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
427 | 470 |
428 // 4. Read a message from |client_mp|, which should have |mp1| attached. | 471 // 4. Read a message from |client_mp|, which should have |mp1| attached. |
429 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE, | 472 EXPECT_EQ(MOJO_RESULT_OK, |
430 MOJO_DEADLINE_INDEFINITE)); | 473 MojoNewWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE, |
| 474 MOJO_DEADLINE_INDEFINITE, &state)); |
| 475 // The other end of the handle may or may not be closed at this point, so we |
| 476 // can't test MOJO_HANDLE_SIGNAL_WRITABLE or MOJO_HANDLE_SIGNAL_PEER_CLOSED. |
| 477 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, |
| 478 state.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE); |
| 479 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, |
| 480 state.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE); |
431 // TODO(vtl): If the scope were to end here (and |client_mp| closed), we'd | 481 // TODO(vtl): If the scope were to end here (and |client_mp| closed), we'd |
432 // die (again due to |Channel::HandleLocalError()|). | 482 // die (again due to |Channel::HandleLocalError()|). |
433 memset(buffer, 0, sizeof(buffer)); | 483 memset(buffer, 0, sizeof(buffer)); |
434 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 484 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
435 MojoHandle mp1 = MOJO_HANDLE_INVALID; | 485 MojoHandle mp1 = MOJO_HANDLE_INVALID; |
436 uint32_t num_handles = 1; | 486 uint32_t num_handles = 1; |
437 EXPECT_EQ(MOJO_RESULT_OK, | 487 EXPECT_EQ(MOJO_RESULT_OK, |
438 MojoReadMessage(client_mp, buffer, &num_bytes, &mp1, &num_handles, | 488 MojoReadMessage(client_mp, buffer, &num_bytes, &mp1, &num_handles, |
439 MOJO_READ_MESSAGE_FLAG_NONE)); | 489 MOJO_READ_MESSAGE_FLAG_NONE)); |
440 const char kBar[] = "Bar"; | 490 const char kBar[] = "Bar"; |
(...skipping 22 matching lines...) Expand all Loading... |
463 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mp3)); | 513 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mp3)); |
464 | 514 |
465 // 9. Write a message to |mp1|, attaching |mp2|. | 515 // 9. Write a message to |mp1|, attaching |mp2|. |
466 const char kQuux[] = "quux"; | 516 const char kQuux[] = "quux"; |
467 EXPECT_EQ(MOJO_RESULT_OK, | 517 EXPECT_EQ(MOJO_RESULT_OK, |
468 MojoWriteMessage(mp1, kQuux, static_cast<uint32_t>(sizeof(kQuux)), | 518 MojoWriteMessage(mp1, kQuux, static_cast<uint32_t>(sizeof(kQuux)), |
469 &mp2, 1, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 519 &mp2, 1, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
470 mp2 = MOJO_HANDLE_INVALID; | 520 mp2 = MOJO_HANDLE_INVALID; |
471 | 521 |
472 // 3. Read a message from |mp1|. | 522 // 3. Read a message from |mp1|. |
473 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(mp1, MOJO_HANDLE_SIGNAL_READABLE, | 523 EXPECT_EQ(MOJO_RESULT_OK, MojoNewWait(mp1, MOJO_HANDLE_SIGNAL_READABLE, |
474 MOJO_DEADLINE_INDEFINITE)); | 524 MOJO_DEADLINE_INDEFINITE, &state)); |
| 525 EXPECT_EQ(kSignalReadadableWritable, state.satisfied_signals); |
| 526 EXPECT_EQ(kSignalAll, state.satisfiable_signals); |
| 527 |
475 memset(buffer, 0, sizeof(buffer)); | 528 memset(buffer, 0, sizeof(buffer)); |
476 num_bytes = static_cast<uint32_t>(sizeof(buffer)); | 529 num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
477 EXPECT_EQ(MOJO_RESULT_OK, | 530 EXPECT_EQ(MOJO_RESULT_OK, |
478 MojoReadMessage(mp1, buffer, &num_bytes, nullptr, nullptr, | 531 MojoReadMessage(mp1, buffer, &num_bytes, nullptr, nullptr, |
479 MOJO_READ_MESSAGE_FLAG_NONE)); | 532 MOJO_READ_MESSAGE_FLAG_NONE)); |
480 const char kFoo[] = "FOO"; | 533 const char kFoo[] = "FOO"; |
481 EXPECT_EQ(sizeof(kFoo), num_bytes); | 534 EXPECT_EQ(sizeof(kFoo), num_bytes); |
482 EXPECT_STREQ(kFoo, buffer); | 535 EXPECT_STREQ(kFoo, buffer); |
483 | 536 |
484 // 11. Wait on |mp1| (which should eventually fail) and then close it. | 537 // 11. Wait on |mp1| (which should eventually fail) and then close it. |
485 EXPECT_EQ( | 538 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
486 MOJO_RESULT_FAILED_PRECONDITION, | 539 MojoNewWait(mp1, MOJO_HANDLE_SIGNAL_READABLE, |
487 MojoWait(mp1, MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE)); | 540 MOJO_DEADLINE_INDEFINITE, &state)); |
| 541 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals); |
| 542 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals); |
488 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mp1)); | 543 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(mp1)); |
489 } | 544 } |
490 | 545 |
491 EXPECT_TRUE(test::Shutdown()); | 546 EXPECT_TRUE(test::Shutdown()); |
492 } | 547 } |
493 | 548 |
494 // TODO(vtl): Test immediate write & close. | 549 // TODO(vtl): Test immediate write & close. |
495 // TODO(vtl): Test broken-connection cases. | 550 // TODO(vtl): Test broken-connection cases. |
496 | 551 |
497 } // namespace | 552 } // namespace |
498 } // namespace embedder | 553 } // namespace embedder |
499 } // namespace mojo | 554 } // namespace mojo |
OLD | NEW |