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/cpp/bindings/lib/connector.h" | 8 #include "mojo/public/cpp/bindings/lib/connector.h" |
9 #include "mojo/public/cpp/bindings/lib/message_builder.h" | 9 #include "mojo/public/cpp/bindings/lib/message_builder.h" |
10 #include "mojo/public/cpp/bindings/lib/message_queue.h" | 10 #include "mojo/public/cpp/bindings/lib/message_queue.h" |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 | 173 |
174 // Still not observed. | 174 // Still not observed. |
175 EXPECT_FALSE(connector0.encountered_error()); | 175 EXPECT_FALSE(connector0.encountered_error()); |
176 | 176 |
177 // Spin the RunLoop, and then we should start observing the closed pipe. | 177 // Spin the RunLoop, and then we should start observing the closed pipe. |
178 PumpMessages(); | 178 PumpMessages(); |
179 | 179 |
180 EXPECT_TRUE(connector0.encountered_error()); | 180 EXPECT_TRUE(connector0.encountered_error()); |
181 } | 181 } |
182 | 182 |
183 // Enable this test once MojoWriteMessage supports passing handles. | |
184 TEST_F(ConnectorTest, MessageWithHandles) { | 183 TEST_F(ConnectorTest, MessageWithHandles) { |
185 internal::Connector connector0(handle0_.Pass()); | 184 internal::Connector connector0(handle0_.Pass()); |
186 internal::Connector connector1(handle1_.Pass()); | 185 internal::Connector connector1(handle1_.Pass()); |
187 | 186 |
188 const char kText[] = "hello world"; | 187 const char kText[] = "hello world"; |
189 | 188 |
190 Message message1; | 189 Message message1; |
191 AllocMessage(kText, &message1); | 190 AllocMessage(kText, &message1); |
192 | 191 |
193 ScopedMessagePipeHandle handles[2]; | 192 MessagePipe pipe; |
194 CreateMessagePipe(&handles[0], &handles[1]); | 193 message1.mutable_handles()->push_back(pipe.handle0.release()); |
195 message1.mutable_handles()->push_back(handles[0].release()); | |
196 | 194 |
197 connector0.Accept(&message1); | 195 connector0.Accept(&message1); |
198 | 196 |
199 // The message should have been transferred, releasing the handles. | 197 // The message should have been transferred, releasing the handles. |
200 EXPECT_TRUE(message1.handles()->empty()); | 198 EXPECT_TRUE(message1.handles()->empty()); |
201 | 199 |
202 MessageAccumulator accumulator; | 200 MessageAccumulator accumulator; |
203 connector1.set_incoming_receiver(&accumulator); | 201 connector1.set_incoming_receiver(&accumulator); |
204 | 202 |
205 PumpMessages(); | 203 PumpMessages(); |
(...skipping 10 matching lines...) Expand all Loading... |
216 | 214 |
217 // Now send a message to the transferred handle and confirm it's sent through | 215 // Now send a message to the transferred handle and confirm it's sent through |
218 // to the orginal pipe. | 216 // to the orginal pipe. |
219 // TODO(vtl): Do we need a better way of "downcasting" the handle types? | 217 // TODO(vtl): Do we need a better way of "downcasting" the handle types? |
220 ScopedMessagePipeHandle smph; | 218 ScopedMessagePipeHandle smph; |
221 smph.reset(MessagePipeHandle(message_received.handles()->front().value())); | 219 smph.reset(MessagePipeHandle(message_received.handles()->front().value())); |
222 message_received.mutable_handles()->front() = Handle(); | 220 message_received.mutable_handles()->front() = Handle(); |
223 // |smph| now owns this handle. | 221 // |smph| now owns this handle. |
224 | 222 |
225 internal::Connector connector_received(smph.Pass()); | 223 internal::Connector connector_received(smph.Pass()); |
226 internal::Connector connector_original(handles[1].Pass()); | 224 internal::Connector connector_original(pipe.handle1.Pass()); |
227 | 225 |
228 Message message2; | 226 Message message2; |
229 AllocMessage(kText, &message2); | 227 AllocMessage(kText, &message2); |
230 | 228 |
231 connector_received.Accept(&message2); | 229 connector_received.Accept(&message2); |
232 connector_original.set_incoming_receiver(&accumulator); | 230 connector_original.set_incoming_receiver(&accumulator); |
233 PumpMessages(); | 231 PumpMessages(); |
234 | 232 |
235 ASSERT_FALSE(accumulator.IsEmpty()); | 233 ASSERT_FALSE(accumulator.IsEmpty()); |
236 | 234 |
237 accumulator.Pop(&message_received); | 235 accumulator.Pop(&message_received); |
238 | 236 |
239 EXPECT_EQ( | 237 EXPECT_EQ( |
240 std::string(kText), | 238 std::string(kText), |
241 std::string(reinterpret_cast<const char*>(message_received.payload()))); | 239 std::string(reinterpret_cast<const char*>(message_received.payload()))); |
242 } | 240 } |
243 | 241 |
244 } // namespace | 242 } // namespace |
245 } // namespace test | 243 } // namespace test |
246 } // namespace mojo | 244 } // namespace mojo |
OLD | NEW |