OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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 #include <stdlib.h> | 5 #include <stdlib.h> |
6 #include <string.h> | 6 #include <string.h> |
7 | 7 |
8 #include "mojo/public/bindings/lib/bindings_support.h" | 8 #include "mojo/public/bindings/lib/bindings_support.h" |
9 #include "mojo/public/bindings/lib/connector.h" | 9 #include "mojo/public/bindings/lib/connector.h" |
10 #include "mojo/public/bindings/lib/message_queue.h" | 10 #include "mojo/public/bindings/lib/message_queue.h" |
11 #include "mojo/public/system/macros.h" | 11 #include "mojo/public/system/macros.h" |
12 #include "mojo/public/tests/simple_bindings_support.h" | 12 #include "mojo/public/tests/bindings/simple_bindings_support.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
14 | 14 |
15 namespace mojo { | 15 namespace mojo { |
16 namespace test { | 16 namespace test { |
17 | 17 |
18 class MessageAccumulator : public MessageReceiver { | 18 class MessageAccumulator : public MessageReceiver { |
19 public: | 19 public: |
20 MessageAccumulator() { | 20 MessageAccumulator() { |
21 } | 21 } |
22 | 22 |
23 virtual bool Accept(Message* message) MOJO_OVERRIDE { | 23 virtual bool Accept(Message* message) MOJO_OVERRIDE { |
24 queue_.Push(message); | 24 queue_.Push(message); |
25 return true; | 25 return true; |
26 } | 26 } |
27 | 27 |
28 bool IsEmpty() const { | 28 bool IsEmpty() const { |
29 return queue_.IsEmpty(); | 29 return queue_.IsEmpty(); |
30 } | 30 } |
31 | 31 |
32 void Pop(Message* message) { | 32 void Pop(Message* message) { |
33 queue_.Pop(message); | 33 queue_.Pop(message); |
34 } | 34 } |
35 | 35 |
36 private: | 36 private: |
37 MessageQueue queue_; | 37 MessageQueue queue_; |
38 }; | 38 }; |
39 | 39 |
40 class BindingsConnectorTest : public testing::Test { | 40 class ConnectorTest : public testing::Test { |
41 public: | 41 public: |
42 BindingsConnectorTest() { | 42 ConnectorTest() { |
43 } | 43 } |
44 | 44 |
45 virtual void SetUp() MOJO_OVERRIDE { | 45 virtual void SetUp() MOJO_OVERRIDE { |
46 CreateMessagePipe(&handle0_, &handle1_); | 46 CreateMessagePipe(&handle0_, &handle1_); |
47 } | 47 } |
48 | 48 |
49 virtual void TearDown() MOJO_OVERRIDE { | 49 virtual void TearDown() MOJO_OVERRIDE { |
50 } | 50 } |
51 | 51 |
52 void AllocMessage(const char* text, Message* message) { | 52 void AllocMessage(const char* text, Message* message) { |
(...skipping 10 matching lines...) Expand all Loading... |
63 } | 63 } |
64 | 64 |
65 protected: | 65 protected: |
66 ScopedMessagePipeHandle handle0_; | 66 ScopedMessagePipeHandle handle0_; |
67 ScopedMessagePipeHandle handle1_; | 67 ScopedMessagePipeHandle handle1_; |
68 | 68 |
69 private: | 69 private: |
70 SimpleBindingsSupport bindings_support_; | 70 SimpleBindingsSupport bindings_support_; |
71 }; | 71 }; |
72 | 72 |
73 TEST_F(BindingsConnectorTest, Basic) { | 73 TEST_F(ConnectorTest, Basic) { |
74 internal::Connector connector0(handle0_.Pass()); | 74 internal::Connector connector0(handle0_.Pass()); |
75 internal::Connector connector1(handle1_.Pass()); | 75 internal::Connector connector1(handle1_.Pass()); |
76 | 76 |
77 const char kText[] = "hello world"; | 77 const char kText[] = "hello world"; |
78 | 78 |
79 Message message; | 79 Message message; |
80 AllocMessage(kText, &message); | 80 AllocMessage(kText, &message); |
81 | 81 |
82 connector0.Accept(&message); | 82 connector0.Accept(&message); |
83 | 83 |
84 MessageAccumulator accumulator; | 84 MessageAccumulator accumulator; |
85 connector1.SetIncomingReceiver(&accumulator); | 85 connector1.SetIncomingReceiver(&accumulator); |
86 | 86 |
87 PumpMessages(); | 87 PumpMessages(); |
88 | 88 |
89 ASSERT_FALSE(accumulator.IsEmpty()); | 89 ASSERT_FALSE(accumulator.IsEmpty()); |
90 | 90 |
91 Message message_received; | 91 Message message_received; |
92 accumulator.Pop(&message_received); | 92 accumulator.Pop(&message_received); |
93 | 93 |
94 EXPECT_EQ(std::string(kText), | 94 EXPECT_EQ(std::string(kText), |
95 std::string( | 95 std::string( |
96 reinterpret_cast<char*>(message_received.data->payload))); | 96 reinterpret_cast<char*>(message_received.data->payload))); |
97 } | 97 } |
98 | 98 |
99 TEST_F(BindingsConnectorTest, Basic_EarlyIncomingReceiver) { | 99 TEST_F(ConnectorTest, Basic_EarlyIncomingReceiver) { |
100 internal::Connector connector0(handle0_.Pass()); | 100 internal::Connector connector0(handle0_.Pass()); |
101 internal::Connector connector1(handle1_.Pass()); | 101 internal::Connector connector1(handle1_.Pass()); |
102 | 102 |
103 MessageAccumulator accumulator; | 103 MessageAccumulator accumulator; |
104 connector1.SetIncomingReceiver(&accumulator); | 104 connector1.SetIncomingReceiver(&accumulator); |
105 | 105 |
106 const char kText[] = "hello world"; | 106 const char kText[] = "hello world"; |
107 | 107 |
108 Message message; | 108 Message message; |
109 AllocMessage(kText, &message); | 109 AllocMessage(kText, &message); |
110 | 110 |
111 connector0.Accept(&message); | 111 connector0.Accept(&message); |
112 | 112 |
113 PumpMessages(); | 113 PumpMessages(); |
114 | 114 |
115 ASSERT_FALSE(accumulator.IsEmpty()); | 115 ASSERT_FALSE(accumulator.IsEmpty()); |
116 | 116 |
117 Message message_received; | 117 Message message_received; |
118 accumulator.Pop(&message_received); | 118 accumulator.Pop(&message_received); |
119 | 119 |
120 EXPECT_EQ(std::string(kText), | 120 EXPECT_EQ(std::string(kText), |
121 std::string( | 121 std::string( |
122 reinterpret_cast<char*>(message_received.data->payload))); | 122 reinterpret_cast<char*>(message_received.data->payload))); |
123 } | 123 } |
124 | 124 |
125 TEST_F(BindingsConnectorTest, Basic_TwoMessages) { | 125 TEST_F(ConnectorTest, Basic_TwoMessages) { |
126 internal::Connector connector0(handle0_.Pass()); | 126 internal::Connector connector0(handle0_.Pass()); |
127 internal::Connector connector1(handle1_.Pass()); | 127 internal::Connector connector1(handle1_.Pass()); |
128 | 128 |
129 const char* kText[] = { "hello", "world" }; | 129 const char* kText[] = { "hello", "world" }; |
130 | 130 |
131 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { | 131 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { |
132 Message message; | 132 Message message; |
133 AllocMessage(kText[i], &message); | 133 AllocMessage(kText[i], &message); |
134 | 134 |
135 connector0.Accept(&message); | 135 connector0.Accept(&message); |
136 } | 136 } |
137 | 137 |
138 MessageAccumulator accumulator; | 138 MessageAccumulator accumulator; |
139 connector1.SetIncomingReceiver(&accumulator); | 139 connector1.SetIncomingReceiver(&accumulator); |
140 | 140 |
141 PumpMessages(); | 141 PumpMessages(); |
142 | 142 |
143 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { | 143 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { |
144 ASSERT_FALSE(accumulator.IsEmpty()); | 144 ASSERT_FALSE(accumulator.IsEmpty()); |
145 | 145 |
146 Message message_received; | 146 Message message_received; |
147 accumulator.Pop(&message_received); | 147 accumulator.Pop(&message_received); |
148 | 148 |
149 EXPECT_EQ(std::string(kText[i]), | 149 EXPECT_EQ(std::string(kText[i]), |
150 std::string( | 150 std::string( |
151 reinterpret_cast<char*>(message_received.data->payload))); | 151 reinterpret_cast<char*>(message_received.data->payload))); |
152 } | 152 } |
153 } | 153 } |
154 | 154 |
155 TEST_F(BindingsConnectorTest, WriteToClosedPipe) { | 155 TEST_F(ConnectorTest, WriteToClosedPipe) { |
156 // Leak this, so the closed handle isn't closed again. | 156 // Leak this, so the closed handle isn't closed again. |
157 MojoHandle mojo_handle = handle0_.get().value(); | 157 MojoHandle mojo_handle = handle0_.get().value(); |
158 internal::Connector* connector0 = new internal::Connector(handle0_.Pass()); | 158 internal::Connector* connector0 = new internal::Connector(handle0_.Pass()); |
159 | 159 |
160 const char kText[] = "hello world"; | 160 const char kText[] = "hello world"; |
161 | 161 |
162 Message message; | 162 Message message; |
163 AllocMessage(kText, &message); | 163 AllocMessage(kText, &message); |
164 | 164 |
165 // Close handle out from under the connection | 165 // Close handle out from under the connection |
166 MojoClose(mojo_handle); | 166 MojoClose(mojo_handle); |
167 | 167 |
168 bool ok = connector0->Accept(&message); | 168 bool ok = connector0->Accept(&message); |
169 EXPECT_FALSE(ok); | 169 EXPECT_FALSE(ok); |
170 | 170 |
171 EXPECT_TRUE(connector0->encountered_error()); | 171 EXPECT_TRUE(connector0->encountered_error()); |
172 } | 172 } |
173 | 173 |
174 // Enable this test once MojoWriteMessage supports passing handles. | 174 // Enable this test once MojoWriteMessage supports passing handles. |
175 TEST_F(BindingsConnectorTest, MessageWithHandles) { | 175 TEST_F(ConnectorTest, MessageWithHandles) { |
176 internal::Connector connector0(handle0_.Pass()); | 176 internal::Connector connector0(handle0_.Pass()); |
177 internal::Connector connector1(handle1_.Pass()); | 177 internal::Connector connector1(handle1_.Pass()); |
178 | 178 |
179 const char kText[] = "hello world"; | 179 const char kText[] = "hello world"; |
180 | 180 |
181 Message message; | 181 Message message; |
182 AllocMessage(kText, &message); | 182 AllocMessage(kText, &message); |
183 | 183 |
184 ScopedMessagePipeHandle handles[2]; | 184 ScopedMessagePipeHandle handles[2]; |
185 CreateMessagePipe(&handles[0], &handles[1]); | 185 CreateMessagePipe(&handles[0], &handles[1]); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 | 225 |
226 accumulator.Pop(&message_received); | 226 accumulator.Pop(&message_received); |
227 | 227 |
228 EXPECT_EQ(std::string(kText), | 228 EXPECT_EQ(std::string(kText), |
229 std::string( | 229 std::string( |
230 reinterpret_cast<char*>(message_received.data->payload))); | 230 reinterpret_cast<char*>(message_received.data->payload))); |
231 } | 231 } |
232 | 232 |
233 } // namespace test | 233 } // namespace test |
234 } // namespace mojo | 234 } // namespace mojo |
OLD | NEW |