OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 // This file tests both |RemoteProducerDataPipeImpl| and | 5 // This file tests both |RemoteProducerDataPipeImpl| and |
6 // |RemoteConsumerDataPipeImpl|. | 6 // |RemoteConsumerDataPipeImpl|. |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <utility> | 10 #include <utility> |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 char read_buffer[100] = {}; | 167 char read_buffer[100] = {}; |
168 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 168 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
169 DispatcherVector read_dispatchers; | 169 DispatcherVector read_dispatchers; |
170 uint32_t read_num_dispatchers = 10; // Maximum to get. | 170 uint32_t read_num_dispatchers = 10; // Maximum to get. |
171 Waiter waiter; | 171 Waiter waiter; |
172 HandleSignalsState hss; | 172 HandleSignalsState hss; |
173 uint32_t context = 0; | 173 uint32_t context = 0; |
174 | 174 |
175 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); | 175 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); |
176 // This is the consumer dispatcher we'll send. | 176 // This is the consumer dispatcher we'll send. |
177 scoped_refptr<DataPipeConsumerDispatcher> consumer = | 177 auto consumer = DataPipeConsumerDispatcher::Create(); |
178 DataPipeConsumerDispatcher::Create(); | |
179 consumer->Init(dp.Clone()); | 178 consumer->Init(dp.Clone()); |
180 | 179 |
181 // Write to the producer and close it, before sending the consumer. | 180 // Write to the producer and close it, before sending the consumer. |
182 int32_t elements[10] = {123}; | 181 int32_t elements[10] = {123}; |
183 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 182 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
184 EXPECT_EQ(MOJO_RESULT_OK, | 183 EXPECT_EQ(MOJO_RESULT_OK, |
185 dp->ProducerWriteData(UserPointer<const void>(elements), | 184 dp->ProducerWriteData(UserPointer<const void>(elements), |
186 MakeUserPointer(&num_bytes), false)); | 185 MakeUserPointer(&num_bytes), false)); |
187 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); | 186 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); |
188 dp->ProducerClose(); | 187 dp->ProducerClose(); |
(...skipping 12 matching lines...) Expand all Loading... |
201 | 200 |
202 std::vector<DispatcherTransport> transports; | 201 std::vector<DispatcherTransport> transports; |
203 transports.push_back(transport); | 202 transports.push_back(transport); |
204 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( | 203 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( |
205 0, NullUserPointer(), 0, &transports, | 204 0, NullUserPointer(), 0, &transports, |
206 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 205 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
207 transport.End(); | 206 transport.End(); |
208 | 207 |
209 // |consumer| should have been closed. This is |DCHECK()|ed when it is | 208 // |consumer| should have been closed. This is |DCHECK()|ed when it is |
210 // destroyed. | 209 // destroyed. |
211 EXPECT_TRUE(consumer->HasOneRef()); | 210 consumer->AssertHasOneRef(); |
212 consumer = nullptr; | 211 consumer = nullptr; |
213 } | 212 } |
214 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); | 213 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); |
215 EXPECT_EQ(123u, context); | 214 EXPECT_EQ(123u, context); |
216 hss = HandleSignalsState(); | 215 hss = HandleSignalsState(); |
217 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); | 216 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); |
218 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 217 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
219 hss.satisfied_signals); | 218 hss.satisfied_signals); |
220 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 219 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
221 EXPECT_EQ(MOJO_RESULT_OK, | 220 EXPECT_EQ(MOJO_RESULT_OK, |
222 message_pipe(1)->ReadMessage( | 221 message_pipe(1)->ReadMessage( |
223 0, UserPointer<void>(read_buffer), | 222 0, UserPointer<void>(read_buffer), |
224 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 223 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
225 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); | 224 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); |
226 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); | 225 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); |
227 EXPECT_EQ(1u, read_dispatchers.size()); | 226 EXPECT_EQ(1u, read_dispatchers.size()); |
228 EXPECT_EQ(1u, read_num_dispatchers); | 227 EXPECT_EQ(1u, read_num_dispatchers); |
229 ASSERT_TRUE(read_dispatchers[0]); | 228 ASSERT_TRUE(read_dispatchers[0]); |
230 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); | 229 read_dispatchers[0]->AssertHasOneRef(); |
231 | 230 |
232 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, | 231 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, |
233 read_dispatchers[0]->GetType()); | 232 read_dispatchers[0]->GetType()); |
234 consumer = | 233 consumer = RefPtr<DataPipeConsumerDispatcher>( |
235 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get()); | 234 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get())); |
236 read_dispatchers.clear(); | 235 read_dispatchers.clear(); |
237 | 236 |
238 waiter.Init(); | 237 waiter.Init(); |
239 hss = HandleSignalsState(); | 238 hss = HandleSignalsState(); |
240 MojoResult result = | 239 MojoResult result = |
241 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, &hss); | 240 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, &hss); |
242 if (result == MOJO_RESULT_OK) { | 241 if (result == MOJO_RESULT_OK) { |
243 context = 0; | 242 context = 0; |
244 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); | 243 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); |
245 EXPECT_EQ(456u, context); | 244 EXPECT_EQ(456u, context); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 char read_buffer[100] = {}; | 284 char read_buffer[100] = {}; |
286 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 285 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
287 DispatcherVector read_dispatchers; | 286 DispatcherVector read_dispatchers; |
288 uint32_t read_num_dispatchers = 10; // Maximum to get. | 287 uint32_t read_num_dispatchers = 10; // Maximum to get. |
289 Waiter waiter; | 288 Waiter waiter; |
290 HandleSignalsState hss; | 289 HandleSignalsState hss; |
291 uint32_t context = 0; | 290 uint32_t context = 0; |
292 | 291 |
293 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); | 292 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); |
294 // This is the consumer dispatcher we'll send. | 293 // This is the consumer dispatcher we'll send. |
295 scoped_refptr<DataPipeConsumerDispatcher> consumer = | 294 auto consumer = DataPipeConsumerDispatcher::Create(); |
296 DataPipeConsumerDispatcher::Create(); | |
297 consumer->Init(dp.Clone()); | 295 consumer->Init(dp.Clone()); |
298 | 296 |
299 void* write_ptr = nullptr; | 297 void* write_ptr = nullptr; |
300 uint32_t num_bytes = 0u; | 298 uint32_t num_bytes = 0u; |
301 EXPECT_EQ(MOJO_RESULT_OK, | 299 EXPECT_EQ(MOJO_RESULT_OK, |
302 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 300 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
303 MakeUserPointer(&num_bytes))); | 301 MakeUserPointer(&num_bytes))); |
304 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); | 302 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); |
305 | 303 |
306 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). | 304 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). |
(...skipping 10 matching lines...) Expand all Loading... |
317 | 315 |
318 std::vector<DispatcherTransport> transports; | 316 std::vector<DispatcherTransport> transports; |
319 transports.push_back(transport); | 317 transports.push_back(transport); |
320 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( | 318 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( |
321 0, NullUserPointer(), 0, &transports, | 319 0, NullUserPointer(), 0, &transports, |
322 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 320 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
323 transport.End(); | 321 transport.End(); |
324 | 322 |
325 // |consumer| should have been closed. This is |DCHECK()|ed when it is | 323 // |consumer| should have been closed. This is |DCHECK()|ed when it is |
326 // destroyed. | 324 // destroyed. |
327 EXPECT_TRUE(consumer->HasOneRef()); | 325 consumer->AssertHasOneRef(); |
328 consumer = nullptr; | 326 consumer = nullptr; |
329 } | 327 } |
330 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); | 328 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); |
331 EXPECT_EQ(123u, context); | 329 EXPECT_EQ(123u, context); |
332 hss = HandleSignalsState(); | 330 hss = HandleSignalsState(); |
333 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); | 331 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); |
334 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 332 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
335 hss.satisfied_signals); | 333 hss.satisfied_signals); |
336 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 334 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
337 EXPECT_EQ(MOJO_RESULT_OK, | 335 EXPECT_EQ(MOJO_RESULT_OK, |
338 message_pipe(1)->ReadMessage( | 336 message_pipe(1)->ReadMessage( |
339 0, UserPointer<void>(read_buffer), | 337 0, UserPointer<void>(read_buffer), |
340 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 338 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
341 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); | 339 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); |
342 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); | 340 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); |
343 EXPECT_EQ(1u, read_dispatchers.size()); | 341 EXPECT_EQ(1u, read_dispatchers.size()); |
344 EXPECT_EQ(1u, read_num_dispatchers); | 342 EXPECT_EQ(1u, read_num_dispatchers); |
345 ASSERT_TRUE(read_dispatchers[0]); | 343 ASSERT_TRUE(read_dispatchers[0]); |
346 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); | 344 read_dispatchers[0]->AssertHasOneRef(); |
347 | 345 |
348 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, | 346 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, |
349 read_dispatchers[0]->GetType()); | 347 read_dispatchers[0]->GetType()); |
350 consumer = | 348 consumer = RefPtr<DataPipeConsumerDispatcher>( |
351 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get()); | 349 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get())); |
352 read_dispatchers.clear(); | 350 read_dispatchers.clear(); |
353 | 351 |
354 // Now actually write the data, complete the two-phase write, and close the | 352 // Now actually write the data, complete the two-phase write, and close the |
355 // producer. | 353 // producer. |
356 *static_cast<int32_t*>(write_ptr) = 123456; | 354 *static_cast<int32_t*>(write_ptr) = 123456; |
357 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( | 355 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( |
358 static_cast<uint32_t>(1u * sizeof(int32_t)))); | 356 static_cast<uint32_t>(1u * sizeof(int32_t)))); |
359 dp->ProducerClose(); | 357 dp->ProducerClose(); |
360 | 358 |
361 // Wait for the consumer to be readable. | 359 // Wait for the consumer to be readable. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 char read_buffer[100] = {}; | 393 char read_buffer[100] = {}; |
396 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 394 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
397 DispatcherVector read_dispatchers; | 395 DispatcherVector read_dispatchers; |
398 uint32_t read_num_dispatchers = 10; // Maximum to get. | 396 uint32_t read_num_dispatchers = 10; // Maximum to get. |
399 Waiter waiter; | 397 Waiter waiter; |
400 HandleSignalsState hss; | 398 HandleSignalsState hss; |
401 uint32_t context = 0; | 399 uint32_t context = 0; |
402 | 400 |
403 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); | 401 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); |
404 // This is the consumer dispatcher we'll send. | 402 // This is the consumer dispatcher we'll send. |
405 scoped_refptr<DataPipeConsumerDispatcher> consumer = | 403 auto consumer = DataPipeConsumerDispatcher::Create(); |
406 DataPipeConsumerDispatcher::Create(); | |
407 consumer->Init(dp.Clone()); | 404 consumer->Init(dp.Clone()); |
408 | 405 |
409 void* write_ptr = nullptr; | 406 void* write_ptr = nullptr; |
410 uint32_t num_bytes = 0u; | 407 uint32_t num_bytes = 0u; |
411 EXPECT_EQ(MOJO_RESULT_OK, | 408 EXPECT_EQ(MOJO_RESULT_OK, |
412 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 409 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
413 MakeUserPointer(&num_bytes))); | 410 MakeUserPointer(&num_bytes))); |
414 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); | 411 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); |
415 *static_cast<int32_t*>(write_ptr) = 123456; | 412 *static_cast<int32_t*>(write_ptr) = 123456; |
416 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( | 413 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( |
(...skipping 20 matching lines...) Expand all Loading... |
437 | 434 |
438 std::vector<DispatcherTransport> transports; | 435 std::vector<DispatcherTransport> transports; |
439 transports.push_back(transport); | 436 transports.push_back(transport); |
440 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( | 437 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( |
441 0, NullUserPointer(), 0, &transports, | 438 0, NullUserPointer(), 0, &transports, |
442 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 439 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
443 transport.End(); | 440 transport.End(); |
444 | 441 |
445 // |consumer| should have been closed. This is |DCHECK()|ed when it is | 442 // |consumer| should have been closed. This is |DCHECK()|ed when it is |
446 // destroyed. | 443 // destroyed. |
447 EXPECT_TRUE(consumer->HasOneRef()); | 444 consumer->AssertHasOneRef(); |
448 consumer = nullptr; | 445 consumer = nullptr; |
449 } | 446 } |
450 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); | 447 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); |
451 EXPECT_EQ(123u, context); | 448 EXPECT_EQ(123u, context); |
452 hss = HandleSignalsState(); | 449 hss = HandleSignalsState(); |
453 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); | 450 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); |
454 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 451 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
455 hss.satisfied_signals); | 452 hss.satisfied_signals); |
456 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 453 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
457 EXPECT_EQ(MOJO_RESULT_OK, | 454 EXPECT_EQ(MOJO_RESULT_OK, |
458 message_pipe(1)->ReadMessage( | 455 message_pipe(1)->ReadMessage( |
459 0, UserPointer<void>(read_buffer), | 456 0, UserPointer<void>(read_buffer), |
460 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 457 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
461 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); | 458 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); |
462 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); | 459 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); |
463 EXPECT_EQ(1u, read_dispatchers.size()); | 460 EXPECT_EQ(1u, read_dispatchers.size()); |
464 EXPECT_EQ(1u, read_num_dispatchers); | 461 EXPECT_EQ(1u, read_num_dispatchers); |
465 ASSERT_TRUE(read_dispatchers[0]); | 462 ASSERT_TRUE(read_dispatchers[0]); |
466 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); | 463 read_dispatchers[0]->AssertHasOneRef(); |
467 | 464 |
468 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, | 465 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, |
469 read_dispatchers[0]->GetType()); | 466 read_dispatchers[0]->GetType()); |
470 consumer = | 467 consumer = RefPtr<DataPipeConsumerDispatcher>( |
471 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get()); | 468 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get())); |
472 read_dispatchers.clear(); | 469 read_dispatchers.clear(); |
473 | 470 |
474 // Now actually write the data, complete the two-phase write, and close the | 471 // Now actually write the data, complete the two-phase write, and close the |
475 // producer. | 472 // producer. |
476 *static_cast<int32_t*>(write_ptr) = 789012; | 473 *static_cast<int32_t*>(write_ptr) = 789012; |
477 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( | 474 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( |
478 static_cast<uint32_t>(1u * sizeof(int32_t)))); | 475 static_cast<uint32_t>(1u * sizeof(int32_t)))); |
479 dp->ProducerClose(); | 476 dp->ProducerClose(); |
480 | 477 |
481 // Wait for the consumer to know that the producer is closed. | 478 // Wait for the consumer to know that the producer is closed. |
(...skipping 24 matching lines...) Expand all Loading... |
506 EXPECT_EQ(123456, elements[0]); | 503 EXPECT_EQ(123456, elements[0]); |
507 EXPECT_EQ(789012, elements[1]); | 504 EXPECT_EQ(789012, elements[1]); |
508 EXPECT_EQ(0, elements[2]); | 505 EXPECT_EQ(0, elements[2]); |
509 | 506 |
510 consumer->Close(); | 507 consumer->Close(); |
511 } | 508 } |
512 | 509 |
513 } // namespace | 510 } // namespace |
514 } // namespace system | 511 } // namespace system |
515 } // namespace mojo | 512 } // namespace mojo |
OLD | NEW |