OLD | NEW |
(Empty) | |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <stdlib.h> |
| 6 #include <string.h> |
| 7 |
| 8 #include "mojo/public/bindings/lib/bindings_support.h" |
| 9 #include "mojo/public/bindings/lib/connector.h" |
| 10 #include "mojo/public/bindings/lib/message_queue.h" |
| 11 #include "mojo/public/tests/simple_bindings_support.h" |
| 12 #include "mojo/public/tests/test_support.h" |
| 13 |
| 14 namespace mojo { |
| 15 namespace test { |
| 16 |
| 17 class MessageAccumulator : public MessageReceiver { |
| 18 public: |
| 19 MessageAccumulator() { |
| 20 } |
| 21 |
| 22 virtual bool Accept(Message* message) MOJO_OVERRIDE { |
| 23 queue_.Push(message); |
| 24 return true; |
| 25 } |
| 26 |
| 27 bool IsEmpty() const { |
| 28 return queue_.IsEmpty(); |
| 29 } |
| 30 |
| 31 void Pop(Message* message) { |
| 32 queue_.Pop(message); |
| 33 } |
| 34 |
| 35 private: |
| 36 MessageQueue queue_; |
| 37 }; |
| 38 |
| 39 class BindingsConnectorTest : public TestBase { |
| 40 public: |
| 41 BindingsConnectorTest() |
| 42 : handle0_(kInvalidHandle), |
| 43 handle1_(kInvalidHandle) { |
| 44 } |
| 45 |
| 46 virtual void SetUp() OVERRIDE { |
| 47 CreateMessagePipe(&handle0_, &handle1_); |
| 48 } |
| 49 |
| 50 virtual void TearDown() OVERRIDE { |
| 51 Close(handle0_); |
| 52 Close(handle1_); |
| 53 } |
| 54 |
| 55 void AllocMessage(const char* text, Message* message) { |
| 56 size_t payload_size = strlen(text) + 1; // Plus null terminator. |
| 57 size_t num_bytes = sizeof(MessageHeader) + payload_size; |
| 58 message->data = static_cast<MessageData*>(malloc(num_bytes)); |
| 59 message->data->header.num_bytes = num_bytes; |
| 60 message->data->header.name = 1; |
| 61 memcpy(message->data->payload, text, payload_size); |
| 62 } |
| 63 |
| 64 void PumpMessages() { |
| 65 bindings_support_.Process(); |
| 66 } |
| 67 |
| 68 protected: |
| 69 Handle handle0_; |
| 70 Handle handle1_; |
| 71 |
| 72 private: |
| 73 SimpleBindingsSupport bindings_support_; |
| 74 }; |
| 75 |
| 76 TEST_F(BindingsConnectorTest, Basic) { |
| 77 Connector connector0(handle0_); |
| 78 Connector connector1(handle1_); |
| 79 |
| 80 const char kText[] = "hello world"; |
| 81 |
| 82 Message message; |
| 83 AllocMessage(kText, &message); |
| 84 |
| 85 connector0.Accept(&message); |
| 86 |
| 87 MessageAccumulator accumulator; |
| 88 connector1.SetIncomingReceiver(&accumulator); |
| 89 |
| 90 PumpMessages(); |
| 91 |
| 92 ASSERT_FALSE(accumulator.IsEmpty()); |
| 93 |
| 94 Message message_received; |
| 95 accumulator.Pop(&message_received); |
| 96 |
| 97 EXPECT_EQ(std::string(kText), |
| 98 std::string( |
| 99 reinterpret_cast<char*>(message_received.data->payload))); |
| 100 } |
| 101 |
| 102 TEST_F(BindingsConnectorTest, Basic_EarlyIncomingReceiver) { |
| 103 Connector connector0(handle0_); |
| 104 Connector connector1(handle1_); |
| 105 |
| 106 MessageAccumulator accumulator; |
| 107 connector1.SetIncomingReceiver(&accumulator); |
| 108 |
| 109 const char kText[] = "hello world"; |
| 110 |
| 111 Message message; |
| 112 AllocMessage(kText, &message); |
| 113 |
| 114 connector0.Accept(&message); |
| 115 |
| 116 PumpMessages(); |
| 117 |
| 118 ASSERT_FALSE(accumulator.IsEmpty()); |
| 119 |
| 120 Message message_received; |
| 121 accumulator.Pop(&message_received); |
| 122 |
| 123 EXPECT_EQ(std::string(kText), |
| 124 std::string( |
| 125 reinterpret_cast<char*>(message_received.data->payload))); |
| 126 } |
| 127 |
| 128 TEST_F(BindingsConnectorTest, Basic_TwoMessages) { |
| 129 Connector connector0(handle0_); |
| 130 Connector connector1(handle1_); |
| 131 |
| 132 const char* kText[] = { "hello", "world" }; |
| 133 |
| 134 for (size_t i = 0; i < arraysize(kText); ++i) { |
| 135 Message message; |
| 136 AllocMessage(kText[i], &message); |
| 137 |
| 138 connector0.Accept(&message); |
| 139 } |
| 140 |
| 141 MessageAccumulator accumulator; |
| 142 connector1.SetIncomingReceiver(&accumulator); |
| 143 |
| 144 PumpMessages(); |
| 145 |
| 146 for (size_t i = 0; i < arraysize(kText); ++i) { |
| 147 ASSERT_FALSE(accumulator.IsEmpty()); |
| 148 |
| 149 Message message_received; |
| 150 accumulator.Pop(&message_received); |
| 151 |
| 152 EXPECT_EQ(std::string(kText[i]), |
| 153 std::string( |
| 154 reinterpret_cast<char*>(message_received.data->payload))); |
| 155 } |
| 156 } |
| 157 |
| 158 TEST_F(BindingsConnectorTest, WriteToClosedPipe) { |
| 159 Connector connector0(handle0_); |
| 160 |
| 161 const char kText[] = "hello world"; |
| 162 |
| 163 Message message; |
| 164 AllocMessage(kText, &message); |
| 165 |
| 166 Close(handle0_); // Close the handle before writing to it. |
| 167 |
| 168 bool ok = connector0.Accept(&message); |
| 169 EXPECT_FALSE(ok); |
| 170 |
| 171 EXPECT_TRUE(connector0.EncounteredError()); |
| 172 } |
| 173 |
| 174 } // namespace test |
| 175 } // namespace mojo |
OLD | NEW |