| Index: mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
|
| diff --git a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
|
| index 7df6db6e02b13748a6be731c712e329b39822a05..2cbd789b4411cc8d2b6532c66636efa0a28bec84 100644
|
| --- a/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
|
| +++ b/mojo/public/cpp/bindings/tests/handle_passing_unittest.cc
|
| @@ -3,7 +3,6 @@
|
| // found in the LICENSE file.
|
|
|
| #include "mojo/public/cpp/bindings/allocation_scope.h"
|
| -#include "mojo/public/cpp/bindings/remote_ptr.h"
|
| #include "mojo/public/cpp/environment/environment.h"
|
| #include "mojo/public/cpp/test_support/test_utils.h"
|
| #include "mojo/public/cpp/utility/run_loop.h"
|
| @@ -17,10 +16,14 @@ namespace {
|
| const char kText1[] = "hello";
|
| const char kText2[] = "world";
|
|
|
| -class SampleFactoryImpl : public sample::Factory {
|
| +class SampleFactoryImpl : public InterfaceImpl<sample::Factory> {
|
| public:
|
| - explicit SampleFactoryImpl(sample::ScopedFactoryClientHandle handle)
|
| - : client_(handle.Pass(), this) {
|
| + virtual void OnConnectionError() MOJO_OVERRIDE {
|
| + delete this;
|
| + }
|
| +
|
| + virtual void SetClient(sample::FactoryClient* client) MOJO_OVERRIDE {
|
| + client_ = client;
|
| }
|
|
|
| virtual void DoStuff(const sample::Request& request,
|
| @@ -70,69 +73,17 @@ class SampleFactoryImpl : public sample::Factory {
|
| }
|
|
|
| private:
|
| - RemotePtr<sample::FactoryClient> client_;
|
| + sample::FactoryClient* client_;
|
| ScopedMessagePipeHandle pipe1_;
|
| };
|
|
|
| class SampleFactoryClientImpl : public sample::FactoryClient {
|
| public:
|
| - explicit SampleFactoryClientImpl(sample::ScopedFactoryHandle handle)
|
| - : factory_(handle.Pass(), this),
|
| - got_response_(false) {
|
| - }
|
| -
|
| - void Start() {
|
| - expected_text_reply_ = kText1;
|
| -
|
| - ScopedMessagePipeHandle pipe0;
|
| - CreateMessagePipe(&pipe0, &pipe1_);
|
| -
|
| - EXPECT_TRUE(WriteTextMessage(pipe1_.get(), kText1));
|
| -
|
| - ScopedMessagePipeHandle pipe2;
|
| - CreateMessagePipe(&pipe2, &pipe3_);
|
| -
|
| - EXPECT_TRUE(WriteTextMessage(pipe3_.get(), kText2));
|
| -
|
| - AllocationScope scope;
|
| - sample::Request::Builder request;
|
| - request.set_x(1);
|
| - request.set_pipe(pipe2.Pass());
|
| - factory_->DoStuff(request.Finish(), pipe0.Pass());
|
| - }
|
| -
|
| - void StartNoPipes() {
|
| - expected_text_reply_.clear();
|
| -
|
| - AllocationScope scope;
|
| - sample::Request::Builder request;
|
| - request.set_x(1);
|
| - factory_->DoStuff(request.Finish(), ScopedMessagePipeHandle().Pass());
|
| + SampleFactoryClientImpl() : got_response_(false) {
|
| }
|
|
|
| - // Writes a string to a data pipe and passes the data pipe (consumer) to the
|
| - // factory.
|
| - void StartDataPipe() {
|
| - expected_text_reply_.clear();
|
| -
|
| - ScopedDataPipeProducerHandle producer_handle;
|
| - ScopedDataPipeConsumerHandle consumer_handle;
|
| - MojoCreateDataPipeOptions options = {
|
| - sizeof(MojoCreateDataPipeOptions),
|
| - MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
|
| - 1,
|
| - 1024};
|
| - ASSERT_EQ(MOJO_RESULT_OK,
|
| - CreateDataPipe(&options, &producer_handle, &consumer_handle));
|
| - expected_text_reply_ = "got it";
|
| - // +1 for \0.
|
| - uint32_t data_size = static_cast<uint32_t>(expected_text_reply_.size() + 1);
|
| - ASSERT_EQ(MOJO_RESULT_OK,
|
| - WriteDataRaw(producer_handle.get(), expected_text_reply_.c_str(),
|
| - &data_size, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
|
| -
|
| - AllocationScope scope;
|
| - factory_->DoStuff2(consumer_handle.Pass());
|
| + void set_expected_text_reply(const std::string& expected_text_reply) {
|
| + expected_text_reply_ = expected_text_reply;
|
| }
|
|
|
| bool got_response() const {
|
| @@ -167,7 +118,6 @@ class SampleFactoryClientImpl : public sample::FactoryClient {
|
| }
|
|
|
| private:
|
| - RemotePtr<sample::Factory> factory_;
|
| ScopedMessagePipeHandle pipe1_;
|
| ScopedMessagePipeHandle pipe3_;
|
| std::string expected_text_reply_;
|
| @@ -176,6 +126,10 @@ class SampleFactoryClientImpl : public sample::FactoryClient {
|
|
|
| class HandlePassingTest : public testing::Test {
|
| public:
|
| + virtual void TearDown() {
|
| + PumpMessages();
|
| + }
|
| +
|
| void PumpMessages() {
|
| loop_.RunUntilIdle();
|
| }
|
| @@ -186,12 +140,31 @@ class HandlePassingTest : public testing::Test {
|
| };
|
|
|
| TEST_F(HandlePassingTest, Basic) {
|
| - InterfacePipe<sample::Factory> pipe;
|
| + sample::FactoryPtr factory;
|
| + BindToProxy(new SampleFactoryImpl(), &factory);
|
| +
|
| + SampleFactoryClientImpl factory_client;
|
| + factory_client.set_expected_text_reply(kText1);
|
| +
|
| + factory->SetClient(&factory_client);
|
| +
|
| + ScopedMessagePipeHandle pipe0, pipe1;
|
| + CreateMessagePipe(&pipe0, &pipe1);
|
| +
|
| + EXPECT_TRUE(WriteTextMessage(pipe1.get(), kText1));
|
| +
|
| + ScopedMessagePipeHandle pipe2, pipe3;
|
| + CreateMessagePipe(&pipe2, &pipe3);
|
|
|
| - SampleFactoryImpl factory(pipe.handle_to_peer.Pass());
|
| - SampleFactoryClientImpl factory_client(pipe.handle_to_self.Pass());
|
| + EXPECT_TRUE(WriteTextMessage(pipe3.get(), kText2));
|
|
|
| - factory_client.Start();
|
| + {
|
| + AllocationScope scope;
|
| + sample::Request::Builder request;
|
| + request.set_x(1);
|
| + request.set_pipe(pipe2.Pass());
|
| + factory->DoStuff(request.Finish(), pipe0.Pass());
|
| + }
|
|
|
| EXPECT_FALSE(factory_client.got_response());
|
|
|
| @@ -201,12 +174,18 @@ TEST_F(HandlePassingTest, Basic) {
|
| }
|
|
|
| TEST_F(HandlePassingTest, PassInvalid) {
|
| - InterfacePipe<sample::Factory> pipe;
|
| + sample::FactoryPtr factory;
|
| + BindToProxy(new SampleFactoryImpl(), &factory);
|
|
|
| - SampleFactoryImpl factory(pipe.handle_to_peer.Pass());
|
| - SampleFactoryClientImpl factory_client(pipe.handle_to_self.Pass());
|
| + SampleFactoryClientImpl factory_client;
|
| + factory->SetClient(&factory_client);
|
|
|
| - factory_client.StartNoPipes();
|
| + {
|
| + AllocationScope scope;
|
| + sample::Request::Builder request;
|
| + request.set_x(1);
|
| + factory->DoStuff(request.Finish(), ScopedMessagePipeHandle().Pass());
|
| + }
|
|
|
| EXPECT_FALSE(factory_client.got_response());
|
|
|
| @@ -217,12 +196,35 @@ TEST_F(HandlePassingTest, PassInvalid) {
|
|
|
| // Verifies DataPipeConsumer can be passed and read from.
|
| TEST_F(HandlePassingTest, DataPipe) {
|
| - InterfacePipe<sample::Factory> pipe;
|
| + sample::FactoryPtr factory;
|
| + BindToProxy(new SampleFactoryImpl(), &factory);
|
| +
|
| + SampleFactoryClientImpl factory_client;
|
| + factory->SetClient(&factory_client);
|
|
|
| - SampleFactoryImpl factory(pipe.handle_to_peer.Pass());
|
| - SampleFactoryClientImpl factory_client(pipe.handle_to_self.Pass());
|
| + // Writes a string to a data pipe and passes the data pipe (consumer) to the
|
| + // factory.
|
| + ScopedDataPipeProducerHandle producer_handle;
|
| + ScopedDataPipeConsumerHandle consumer_handle;
|
| + MojoCreateDataPipeOptions options = {
|
| + sizeof(MojoCreateDataPipeOptions),
|
| + MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,
|
| + 1,
|
| + 1024};
|
| + ASSERT_EQ(MOJO_RESULT_OK,
|
| + CreateDataPipe(&options, &producer_handle, &consumer_handle));
|
| + std::string expected_text_reply = "got it";
|
| + factory_client.set_expected_text_reply(expected_text_reply);
|
| + // +1 for \0.
|
| + uint32_t data_size = static_cast<uint32_t>(expected_text_reply.size() + 1);
|
| + ASSERT_EQ(MOJO_RESULT_OK,
|
| + WriteDataRaw(producer_handle.get(), expected_text_reply.c_str(),
|
| + &data_size, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));
|
|
|
| - ASSERT_NO_FATAL_FAILURE(factory_client.StartDataPipe());
|
| + {
|
| + AllocationScope scope;
|
| + factory->DoStuff2(consumer_handle.Pass());
|
| + }
|
|
|
| EXPECT_FALSE(factory_client.got_response());
|
|
|
| @@ -232,8 +234,11 @@ TEST_F(HandlePassingTest, DataPipe) {
|
| }
|
|
|
| TEST_F(HandlePassingTest, PipesAreClosed) {
|
| - InterfacePipe<sample::Factory> pipe;
|
| - RemotePtr<sample::Factory> factory(pipe.handle_to_self.Pass(), NULL);
|
| + sample::FactoryPtr factory;
|
| + BindToProxy(new SampleFactoryImpl(), &factory);
|
| +
|
| + SampleFactoryClientImpl factory_client;
|
| + factory->SetClient(&factory_client);
|
|
|
| MessagePipe extra_pipe;
|
|
|
|
|