Chromium Code Reviews| Index: mojo/public/tests/bindings_connector_unittest.cc |
| diff --git a/mojo/public/tests/bindings_connector_unittest.cc b/mojo/public/tests/bindings_connector_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a9e53e13f60c3da1584a37a0ff74e21c2c4392d7 |
| --- /dev/null |
| +++ b/mojo/public/tests/bindings_connector_unittest.cc |
| @@ -0,0 +1,175 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include <stdlib.h> |
| +#include <string.h> |
| + |
| +#include <list> |
|
viettrungluu
2013/11/05 22:45:29
<queue> instead?
|
| + |
| +#include "mojo/public/bindings/lib/bindings_support.h" |
| +#include "mojo/public/bindings/lib/connector.h" |
| +#include "mojo/public/tests/simple_bindings_support.h" |
| +#include "mojo/public/tests/test_support.h" |
| + |
| +namespace mojo { |
| +namespace test { |
| + |
| +class MessageQueue : public MessageReceiver { |
| + public: |
| + virtual bool Accept(Message* message) MOJO_OVERRIDE { |
| + queue_.push(Message()); |
| + queue_.back().Swap(message); |
| + return true; |
| + } |
| + |
| + bool IsEmpty() const { |
| + return queue_.empty(); |
| + } |
| + |
| + void Pop(Message* message) { |
| + queue_.front().Swap(message); |
|
viettrungluu
2013/11/05 22:45:29
assert nonempty?
|
| + queue_.pop(); |
| + } |
| + |
| + private: |
| + std::queue<Message> queue_; |
| +}; |
| + |
| +class BindingsConnectorTest : public TestBase { |
| + public: |
| + BindingsConnectorTest() |
| + : handle0_(kInvalidHandle), |
| + handle1_(kInvalidHandle) { |
| + } |
| + |
| + virtual void SetUp() OVERRIDE { |
| + CreateMessagePipe(&handle0_, &handle1_); |
| + } |
| + |
| + virtual void TearDown() OVERRIDE { |
| + Close(handle0_); |
| + Close(handle1_); |
| + } |
| + |
| + void AllocMessage(const char* text, Message* message) { |
| + size_t payload_size = strlen(text) + 1; // Plus null terminator. |
| + size_t num_bytes = sizeof(MessageHeader) + payload_size; |
| + message->data = static_cast<MessageData*>(malloc(num_bytes)); |
| + message->data->header.num_bytes = num_bytes; |
| + message->data->header.name = 1; |
| + memcpy(message->data->payload, text, payload_size); |
| + } |
| + |
| + void PumpMessages() { |
| + bindings_support_.Process(); |
| + } |
| + |
| + protected: |
| + Handle handle0_; |
| + Handle handle1_; |
| + |
| + private: |
| + SimpleBindingsSupport bindings_support_; |
| +}; |
| + |
| +TEST_F(BindingsConnectorTest, Basic) { |
| + Connector connector0(handle0_); |
| + Connector connector1(handle1_); |
| + |
| + const char kText[] = "hello world"; |
| + |
| + Message message; |
| + AllocMessage(kText, &message); |
| + |
| + connector0.Accept(&message); |
| + |
| + MessageQueue message_queue; |
| + connector1.SetIncomingReceiver(&message_queue); |
| + |
| + PumpMessages(); |
| + |
| + ASSERT_FALSE(message_queue.IsEmpty()); |
| + |
| + Message message_received; |
| + message_queue.Pop(&message_received); |
| + |
| + EXPECT_EQ(std::string(kText), |
| + std::string( |
| + reinterpret_cast<char*>(message_received.data->payload))); |
| +} |
| + |
| +TEST_F(BindingsConnectorTest, Basic_EarlyIncomingReceiver) { |
| + Connector connector0(handle0_); |
| + Connector connector1(handle1_); |
| + |
| + MessageQueue message_queue; |
| + connector1.SetIncomingReceiver(&message_queue); |
| + |
| + const char kText[] = "hello world"; |
| + |
| + Message message; |
| + AllocMessage(kText, &message); |
| + |
| + connector0.Accept(&message); |
| + |
| + PumpMessages(); |
| + |
| + ASSERT_FALSE(message_queue.IsEmpty()); |
| + |
| + Message message_received; |
| + message_queue.Pop(&message_received); |
| + |
| + EXPECT_EQ(std::string(kText), |
| + std::string( |
| + reinterpret_cast<char*>(message_received.data->payload))); |
| +} |
| + |
| +TEST_F(BindingsConnectorTest, Basic_TwoMessages) { |
| + Connector connector0(handle0_); |
| + Connector connector1(handle1_); |
| + |
| + const char* kText[] = { "hello", "world" }; |
| + |
| + for (size_t i = 0; i < arraysize(kText); ++i) { |
| + Message message; |
| + AllocMessage(kText[i], &message); |
| + |
| + connector0.Accept(&message); |
| + } |
| + |
| + MessageQueue message_queue; |
| + connector1.SetIncomingReceiver(&message_queue); |
| + |
| + PumpMessages(); |
| + |
| + for (size_t i = 0; i < arraysize(kText); ++i) { |
| + ASSERT_FALSE(message_queue.IsEmpty()); |
| + |
| + Message message_received; |
| + message_queue.Pop(&message_received); |
| + |
| + EXPECT_EQ(std::string(kText[i]), |
| + std::string( |
| + reinterpret_cast<char*>(message_received.data->payload))); |
| + } |
| +} |
| + |
| +TEST_F(BindingsConnectorTest, WriteToClosedPipe) { |
| + Connector connector0(handle0_); |
| + |
| + const char kText[] = "hello world"; |
| + |
| + Message message; |
| + AllocMessage(kText, &message); |
| + |
| + Close(handle0_); // Close the handle before writing to it. |
| + |
| + bool ok = connector0.Accept(&message); |
| + EXPECT_FALSE(ok); |
| + |
| + EXPECT_TRUE(connector0.EncounteredError()); |
| +} |
| + |
| +} // namespace test |
| +} // namespace mojo |