| 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 contains tests that are shared between different implementations of | 5 // This file contains tests that are shared between different implementations of |
| 6 // |DataPipeImpl|. | 6 // |DataPipeImpl|. |
| 7 | 7 |
| 8 #include "mojo/edk/system/data_pipe_impl.h" | 8 #include "mojo/edk/system/data_pipe_impl.h" |
| 9 | 9 |
| 10 #include <stdint.h> | 10 #include <stdint.h> |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 } | 258 } |
| 259 | 259 |
| 260 void Create(const MojoCreateDataPipeOptions& validated_options) override { | 260 void Create(const MojoCreateDataPipeOptions& validated_options) override { |
| 261 CHECK(!dp_); | 261 CHECK(!dp_); |
| 262 dp_ = DataPipe::CreateLocal(validated_options); | 262 dp_ = DataPipe::CreateLocal(validated_options); |
| 263 } | 263 } |
| 264 | 264 |
| 265 bool IsStrictCircularBuffer() const override { return false; } | 265 bool IsStrictCircularBuffer() const override { return false; } |
| 266 | 266 |
| 267 protected: | 267 protected: |
| 268 void SendDispatcher(size_t source_i, | 268 // TODO(vtl): |to_receive| should be a |Handle*| too. |
| 269 RefPtr<Dispatcher> to_send, | 269 void SendHandle(size_t source_i, |
| 270 RefPtr<Dispatcher>* to_receive) { | 270 const Handle& to_send, |
| 271 RefPtr<Dispatcher>* to_receive) { |
| 271 DCHECK(source_i == 0 || source_i == 1); | 272 DCHECK(source_i == 0 || source_i == 1); |
| 272 size_t dest_i = source_i ^ 1; | 273 size_t dest_i = source_i ^ 1; |
| 273 | 274 |
| 274 // Write the dispatcher to MP |source_i| (port 0). Wait and receive on MP | 275 // Write the dispatcher to MP |source_i| (port 0). Wait and receive on MP |
| 275 // |dest_i| (port 0). (Add the waiter first, to avoid any handling the case | 276 // |dest_i| (port 0). (Add the waiter first, to avoid any handling the case |
| 276 // where it's already readable.) | 277 // where it's already readable.) |
| 277 Waiter waiter; | 278 Waiter waiter; |
| 278 waiter.Init(); | 279 waiter.Init(); |
| 279 ASSERT_EQ(MOJO_RESULT_OK, | 280 ASSERT_EQ(MOJO_RESULT_OK, |
| 280 message_pipe(dest_i)->AddAwakable( | 281 message_pipe(dest_i)->AddAwakable( |
| 281 0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 987, nullptr)); | 282 0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 987, nullptr)); |
| 282 { | 283 { |
| 283 DispatcherTransport transport( | 284 DispatcherTransport transport(test::HandleTryStartTransport(to_send)); |
| 284 test::DispatcherTryStartTransport(to_send.get())); | |
| 285 ASSERT_TRUE(transport.is_valid()); | 285 ASSERT_TRUE(transport.is_valid()); |
| 286 | 286 |
| 287 std::vector<DispatcherTransport> transports; | 287 std::vector<DispatcherTransport> transports; |
| 288 transports.push_back(transport); | 288 transports.push_back(transport); |
| 289 ASSERT_EQ(MOJO_RESULT_OK, message_pipe(source_i)->WriteMessage( | 289 ASSERT_EQ(MOJO_RESULT_OK, message_pipe(source_i)->WriteMessage( |
| 290 0, NullUserPointer(), 0, &transports, | 290 0, NullUserPointer(), 0, &transports, |
| 291 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 291 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 292 transport.End(); | 292 transport.End(); |
| 293 } | 293 } |
| 294 uint32_t context = 0; | 294 uint32_t context = 0; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 class RemoteProducerDataPipeImplTestHelper | 378 class RemoteProducerDataPipeImplTestHelper |
| 379 : public RemoteDataPipeImplTestHelper { | 379 : public RemoteDataPipeImplTestHelper { |
| 380 public: | 380 public: |
| 381 RemoteProducerDataPipeImplTestHelper() {} | 381 RemoteProducerDataPipeImplTestHelper() {} |
| 382 ~RemoteProducerDataPipeImplTestHelper() override {} | 382 ~RemoteProducerDataPipeImplTestHelper() override {} |
| 383 | 383 |
| 384 void DoTransfer() override { | 384 void DoTransfer() override { |
| 385 // This is the producer dispatcher we'll send. | 385 // This is the producer dispatcher we'll send. |
| 386 auto to_send = DataPipeProducerDispatcher::Create(); | 386 auto to_send = DataPipeProducerDispatcher::Create(); |
| 387 to_send->Init(dp()); | 387 to_send->Init(dp()); |
| 388 Handle handle_to_send(std::move(to_send), MOJO_HANDLE_RIGHT_TRANSFER | |
| 389 MOJO_HANDLE_RIGHT_READ | |
| 390 MOJO_HANDLE_RIGHT_WRITE); |
| 388 RefPtr<Dispatcher> to_receive; | 391 RefPtr<Dispatcher> to_receive; |
| 389 SendDispatcher(0, to_send, &to_receive); | 392 SendHandle(0, handle_to_send, &to_receive); |
| 390 // |to_send| should have been closed. This is |DCHECK()|ed when it is | 393 // |handle_to_send.dispatcher| should have been closed. This is |DCHECK()|ed |
| 391 // destroyed. | 394 // when it is destroyed. |
| 392 EXPECT_TRUE(to_send->HasOneRef()); | 395 EXPECT_TRUE(handle_to_send.dispatcher->HasOneRef()); |
| 393 to_send = nullptr; | 396 handle_to_send.reset(); |
| 394 | 397 |
| 395 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); | 398 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); |
| 396 producer_dispatcher_ = RefPtr<DataPipeProducerDispatcher>( | 399 producer_dispatcher_ = RefPtr<DataPipeProducerDispatcher>( |
| 397 static_cast<DataPipeProducerDispatcher*>(to_receive.get())); | 400 static_cast<DataPipeProducerDispatcher*>(to_receive.get())); |
| 398 } | 401 } |
| 399 | 402 |
| 400 DataPipe* DataPipeForProducer() override { | 403 DataPipe* DataPipeForProducer() override { |
| 401 if (producer_dispatcher_) | 404 if (producer_dispatcher_) |
| 402 return producer_dispatcher_->GetDataPipeForTest(); | 405 return producer_dispatcher_->GetDataPipeForTest(); |
| 403 return dp().get(); | 406 return dp().get(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 427 class RemoteConsumerDataPipeImplTestHelper | 430 class RemoteConsumerDataPipeImplTestHelper |
| 428 : public RemoteDataPipeImplTestHelper { | 431 : public RemoteDataPipeImplTestHelper { |
| 429 public: | 432 public: |
| 430 RemoteConsumerDataPipeImplTestHelper() {} | 433 RemoteConsumerDataPipeImplTestHelper() {} |
| 431 ~RemoteConsumerDataPipeImplTestHelper() override {} | 434 ~RemoteConsumerDataPipeImplTestHelper() override {} |
| 432 | 435 |
| 433 void DoTransfer() override { | 436 void DoTransfer() override { |
| 434 // This is the consumer dispatcher we'll send. | 437 // This is the consumer dispatcher we'll send. |
| 435 auto to_send = DataPipeConsumerDispatcher::Create(); | 438 auto to_send = DataPipeConsumerDispatcher::Create(); |
| 436 to_send->Init(dp()); | 439 to_send->Init(dp()); |
| 440 Handle handle_to_send(std::move(to_send), MOJO_HANDLE_RIGHT_TRANSFER | |
| 441 MOJO_HANDLE_RIGHT_READ | |
| 442 MOJO_HANDLE_RIGHT_WRITE); |
| 437 RefPtr<Dispatcher> to_receive; | 443 RefPtr<Dispatcher> to_receive; |
| 438 SendDispatcher(0, to_send, &to_receive); | 444 SendHandle(0, handle_to_send, &to_receive); |
| 439 // |to_send| should have been closed. This is |DCHECK()|ed when it is | 445 // |handle_to_send.dispatcher| should have been closed. This is |DCHECK()|ed |
| 440 // destroyed. | 446 // when it is destroyed. |
| 441 EXPECT_TRUE(to_send->HasOneRef()); | 447 EXPECT_TRUE(handle_to_send.dispatcher->HasOneRef()); |
| 442 to_send = nullptr; | 448 handle_to_send.reset(); |
| 443 | 449 |
| 444 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); | 450 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); |
| 445 consumer_dispatcher_ = RefPtr<DataPipeConsumerDispatcher>( | 451 consumer_dispatcher_ = RefPtr<DataPipeConsumerDispatcher>( |
| 446 static_cast<DataPipeConsumerDispatcher*>(to_receive.get())); | 452 static_cast<DataPipeConsumerDispatcher*>(to_receive.get())); |
| 447 } | 453 } |
| 448 | 454 |
| 449 DataPipe* DataPipeForProducer() override { return dp().get(); } | 455 DataPipe* DataPipeForProducer() override { return dp().get(); } |
| 450 DataPipe* DataPipeForConsumer() override { | 456 DataPipe* DataPipeForConsumer() override { |
| 451 if (consumer_dispatcher_) | 457 if (consumer_dispatcher_) |
| 452 return consumer_dispatcher_->GetDataPipeForTest(); | 458 return consumer_dispatcher_->GetDataPipeForTest(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 481 class RemoteProducerDataPipeImplTestHelper2 | 487 class RemoteProducerDataPipeImplTestHelper2 |
| 482 : public RemoteProducerDataPipeImplTestHelper { | 488 : public RemoteProducerDataPipeImplTestHelper { |
| 483 public: | 489 public: |
| 484 RemoteProducerDataPipeImplTestHelper2() {} | 490 RemoteProducerDataPipeImplTestHelper2() {} |
| 485 ~RemoteProducerDataPipeImplTestHelper2() override {} | 491 ~RemoteProducerDataPipeImplTestHelper2() override {} |
| 486 | 492 |
| 487 void DoTransfer() override { | 493 void DoTransfer() override { |
| 488 // This is the producer dispatcher we'll send. | 494 // This is the producer dispatcher we'll send. |
| 489 auto to_send = DataPipeProducerDispatcher::Create(); | 495 auto to_send = DataPipeProducerDispatcher::Create(); |
| 490 to_send->Init(dp()); | 496 to_send->Init(dp()); |
| 497 Handle handle_to_send(std::move(to_send), MOJO_HANDLE_RIGHT_TRANSFER | |
| 498 MOJO_HANDLE_RIGHT_READ | |
| 499 MOJO_HANDLE_RIGHT_WRITE); |
| 491 RefPtr<Dispatcher> to_receive; | 500 RefPtr<Dispatcher> to_receive; |
| 492 SendDispatcher(0, to_send, &to_receive); | 501 SendHandle(0, handle_to_send, &to_receive); |
| 493 // |to_send| should have been closed. This is |DCHECK()|ed when it is | 502 // |handle_to_send.dispatcher| should have been closed. This is |DCHECK()|ed |
| 494 // destroyed. | 503 // when it is destroyed. |
| 495 EXPECT_TRUE(to_send->HasOneRef()); | 504 EXPECT_TRUE(handle_to_send.dispatcher->HasOneRef()); |
| 496 to_send = nullptr; | 505 handle_to_send.reset(); |
| 497 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); | 506 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); |
| 498 to_send = RefPtr<DataPipeProducerDispatcher>( | 507 handle_to_send = Handle(std::move(to_receive), MOJO_HANDLE_RIGHT_TRANSFER | |
| 499 static_cast<DataPipeProducerDispatcher*>(to_receive.get())); | 508 MOJO_HANDLE_RIGHT_READ | |
| 500 to_receive = nullptr; | 509 MOJO_HANDLE_RIGHT_WRITE); |
| 501 | 510 |
| 502 // Now send it back the other way. | 511 // Now send it back the other way. |
| 503 SendDispatcher(1, to_send, &to_receive); | 512 SendHandle(1, handle_to_send, &to_receive); |
| 504 // |producer_dispatcher_| should have been closed. This is |DCHECK()|ed when | 513 // |handle_to_send.dispatcher| should have been closed. This is |DCHECK()|ed |
| 505 // it is destroyed. | 514 // when it is destroyed. |
| 506 EXPECT_TRUE(to_send->HasOneRef()); | 515 EXPECT_TRUE(handle_to_send.dispatcher->HasOneRef()); |
| 507 to_send = nullptr; | 516 handle_to_send.reset(); |
| 508 | 517 |
| 509 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); | 518 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); |
| 510 producer_dispatcher_ = RefPtr<DataPipeProducerDispatcher>( | 519 producer_dispatcher_ = RefPtr<DataPipeProducerDispatcher>( |
| 511 static_cast<DataPipeProducerDispatcher*>(to_receive.get())); | 520 static_cast<DataPipeProducerDispatcher*>(to_receive.get())); |
| 512 } | 521 } |
| 513 | 522 |
| 514 private: | 523 private: |
| 515 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteProducerDataPipeImplTestHelper2); | 524 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteProducerDataPipeImplTestHelper2); |
| 516 }; | 525 }; |
| 517 | 526 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 528 class RemoteConsumerDataPipeImplTestHelper2 | 537 class RemoteConsumerDataPipeImplTestHelper2 |
| 529 : public RemoteConsumerDataPipeImplTestHelper { | 538 : public RemoteConsumerDataPipeImplTestHelper { |
| 530 public: | 539 public: |
| 531 RemoteConsumerDataPipeImplTestHelper2() {} | 540 RemoteConsumerDataPipeImplTestHelper2() {} |
| 532 ~RemoteConsumerDataPipeImplTestHelper2() override {} | 541 ~RemoteConsumerDataPipeImplTestHelper2() override {} |
| 533 | 542 |
| 534 void DoTransfer() override { | 543 void DoTransfer() override { |
| 535 // This is the consumer dispatcher we'll send. | 544 // This is the consumer dispatcher we'll send. |
| 536 auto to_send = DataPipeConsumerDispatcher::Create(); | 545 auto to_send = DataPipeConsumerDispatcher::Create(); |
| 537 to_send->Init(dp()); | 546 to_send->Init(dp()); |
| 547 Handle handle_to_send(std::move(to_send), MOJO_HANDLE_RIGHT_TRANSFER | |
| 548 MOJO_HANDLE_RIGHT_READ | |
| 549 MOJO_HANDLE_RIGHT_WRITE); |
| 538 RefPtr<Dispatcher> to_receive; | 550 RefPtr<Dispatcher> to_receive; |
| 539 SendDispatcher(0, to_send, &to_receive); | 551 SendHandle(0, handle_to_send, &to_receive); |
| 540 // |to_send| should have been closed. This is |DCHECK()|ed when it is | 552 // |handle_to_send.dispatcher| should have been closed. This is |DCHECK()|ed |
| 541 // destroyed. | 553 // when it is destroyed. |
| 542 EXPECT_TRUE(to_send->HasOneRef()); | 554 EXPECT_TRUE(handle_to_send.dispatcher->HasOneRef()); |
| 543 to_send = nullptr; | 555 handle_to_send.reset(); |
| 544 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); | 556 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); |
| 545 to_send = RefPtr<DataPipeConsumerDispatcher>( | 557 handle_to_send = Handle(std::move(to_receive), MOJO_HANDLE_RIGHT_TRANSFER | |
| 546 static_cast<DataPipeConsumerDispatcher*>(to_receive.get())); | 558 MOJO_HANDLE_RIGHT_READ | |
| 547 to_receive = nullptr; | 559 MOJO_HANDLE_RIGHT_WRITE); |
| 548 | 560 |
| 549 // Now send it back the other way. | 561 // Now send it back the other way. |
| 550 SendDispatcher(1, to_send, &to_receive); | 562 SendHandle(1, handle_to_send, &to_receive); |
| 551 // |consumer_dispatcher_| should have been closed. This is |DCHECK()|ed when | 563 // |handle_to_send.dispatcher| should have been closed. This is |DCHECK()|ed |
| 552 // it is destroyed. | 564 // when it is destroyed. |
| 553 EXPECT_TRUE(to_send->HasOneRef()); | 565 EXPECT_TRUE(handle_to_send.dispatcher->HasOneRef()); |
| 554 to_send = nullptr; | 566 handle_to_send.reset(); |
| 555 | 567 |
| 556 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); | 568 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); |
| 557 consumer_dispatcher_ = RefPtr<DataPipeConsumerDispatcher>( | 569 consumer_dispatcher_ = RefPtr<DataPipeConsumerDispatcher>( |
| 558 static_cast<DataPipeConsumerDispatcher*>(to_receive.get())); | 570 static_cast<DataPipeConsumerDispatcher*>(to_receive.get())); |
| 559 } | 571 } |
| 560 | 572 |
| 561 private: | 573 private: |
| 562 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteConsumerDataPipeImplTestHelper2); | 574 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteConsumerDataPipeImplTestHelper2); |
| 563 }; | 575 }; |
| 564 | 576 |
| (...skipping 2364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2929 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 0, &hss)); | 2941 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 0, &hss)); |
| 2930 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 2942 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 2931 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 2943 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 2932 | 2944 |
| 2933 this->ConsumerClose(); | 2945 this->ConsumerClose(); |
| 2934 } | 2946 } |
| 2935 | 2947 |
| 2936 } // namespace | 2948 } // namespace |
| 2937 } // namespace system | 2949 } // namespace system |
| 2938 } // namespace mojo | 2950 } // namespace mojo |
| OLD | NEW |