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 |