| 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 #include <utility> |
| 7 | 8 |
| 8 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
| 9 #include "mojo/message_pump/message_pump_mojo.h" | 10 #include "mojo/message_pump/message_pump_mojo.h" |
| 10 #include "mojo/public/cpp/bindings/lib/connector.h" | 11 #include "mojo/public/cpp/bindings/lib/connector.h" |
| 11 #include "mojo/public/cpp/bindings/lib/message_builder.h" | 12 #include "mojo/public/cpp/bindings/lib/message_builder.h" |
| 12 #include "mojo/public/cpp/bindings/tests/message_queue.h" | 13 #include "mojo/public/cpp/bindings/tests/message_queue.h" |
| 13 #include "mojo/public/cpp/system/macros.h" | 14 #include "mojo/public/cpp/system/macros.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 16 |
| 16 namespace mojo { | 17 namespace mojo { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 | 94 |
| 94 protected: | 95 protected: |
| 95 ScopedMessagePipeHandle handle0_; | 96 ScopedMessagePipeHandle handle0_; |
| 96 ScopedMessagePipeHandle handle1_; | 97 ScopedMessagePipeHandle handle1_; |
| 97 | 98 |
| 98 private: | 99 private: |
| 99 base::MessageLoop loop_; | 100 base::MessageLoop loop_; |
| 100 }; | 101 }; |
| 101 | 102 |
| 102 TEST_F(ConnectorTest, Basic) { | 103 TEST_F(ConnectorTest, Basic) { |
| 103 internal::Connector connector0(handle0_.Pass(), | 104 internal::Connector connector0(std::move(handle0_), |
| 104 internal::Connector::SINGLE_THREADED_SEND); | 105 internal::Connector::SINGLE_THREADED_SEND); |
| 105 internal::Connector connector1(handle1_.Pass(), | 106 internal::Connector connector1(std::move(handle1_), |
| 106 internal::Connector::SINGLE_THREADED_SEND); | 107 internal::Connector::SINGLE_THREADED_SEND); |
| 107 | 108 |
| 108 const char kText[] = "hello world"; | 109 const char kText[] = "hello world"; |
| 109 | 110 |
| 110 Message message; | 111 Message message; |
| 111 AllocMessage(kText, &message); | 112 AllocMessage(kText, &message); |
| 112 | 113 |
| 113 connector0.Accept(&message); | 114 connector0.Accept(&message); |
| 114 | 115 |
| 115 MessageAccumulator accumulator; | 116 MessageAccumulator accumulator; |
| 116 connector1.set_incoming_receiver(&accumulator); | 117 connector1.set_incoming_receiver(&accumulator); |
| 117 | 118 |
| 118 PumpMessages(); | 119 PumpMessages(); |
| 119 | 120 |
| 120 ASSERT_FALSE(accumulator.IsEmpty()); | 121 ASSERT_FALSE(accumulator.IsEmpty()); |
| 121 | 122 |
| 122 Message message_received; | 123 Message message_received; |
| 123 accumulator.Pop(&message_received); | 124 accumulator.Pop(&message_received); |
| 124 | 125 |
| 125 EXPECT_EQ( | 126 EXPECT_EQ( |
| 126 std::string(kText), | 127 std::string(kText), |
| 127 std::string(reinterpret_cast<const char*>(message_received.payload()))); | 128 std::string(reinterpret_cast<const char*>(message_received.payload()))); |
| 128 } | 129 } |
| 129 | 130 |
| 130 TEST_F(ConnectorTest, Basic_Synchronous) { | 131 TEST_F(ConnectorTest, Basic_Synchronous) { |
| 131 internal::Connector connector0(handle0_.Pass(), | 132 internal::Connector connector0(std::move(handle0_), |
| 132 internal::Connector::SINGLE_THREADED_SEND); | 133 internal::Connector::SINGLE_THREADED_SEND); |
| 133 internal::Connector connector1(handle1_.Pass(), | 134 internal::Connector connector1(std::move(handle1_), |
| 134 internal::Connector::SINGLE_THREADED_SEND); | 135 internal::Connector::SINGLE_THREADED_SEND); |
| 135 | 136 |
| 136 const char kText[] = "hello world"; | 137 const char kText[] = "hello world"; |
| 137 | 138 |
| 138 Message message; | 139 Message message; |
| 139 AllocMessage(kText, &message); | 140 AllocMessage(kText, &message); |
| 140 | 141 |
| 141 connector0.Accept(&message); | 142 connector0.Accept(&message); |
| 142 | 143 |
| 143 MessageAccumulator accumulator; | 144 MessageAccumulator accumulator; |
| 144 connector1.set_incoming_receiver(&accumulator); | 145 connector1.set_incoming_receiver(&accumulator); |
| 145 | 146 |
| 146 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); | 147 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); |
| 147 | 148 |
| 148 ASSERT_FALSE(accumulator.IsEmpty()); | 149 ASSERT_FALSE(accumulator.IsEmpty()); |
| 149 | 150 |
| 150 Message message_received; | 151 Message message_received; |
| 151 accumulator.Pop(&message_received); | 152 accumulator.Pop(&message_received); |
| 152 | 153 |
| 153 EXPECT_EQ( | 154 EXPECT_EQ( |
| 154 std::string(kText), | 155 std::string(kText), |
| 155 std::string(reinterpret_cast<const char*>(message_received.payload()))); | 156 std::string(reinterpret_cast<const char*>(message_received.payload()))); |
| 156 } | 157 } |
| 157 | 158 |
| 158 TEST_F(ConnectorTest, Basic_EarlyIncomingReceiver) { | 159 TEST_F(ConnectorTest, Basic_EarlyIncomingReceiver) { |
| 159 internal::Connector connector0(handle0_.Pass(), | 160 internal::Connector connector0(std::move(handle0_), |
| 160 internal::Connector::SINGLE_THREADED_SEND); | 161 internal::Connector::SINGLE_THREADED_SEND); |
| 161 internal::Connector connector1(handle1_.Pass(), | 162 internal::Connector connector1(std::move(handle1_), |
| 162 internal::Connector::SINGLE_THREADED_SEND); | 163 internal::Connector::SINGLE_THREADED_SEND); |
| 163 | 164 |
| 164 MessageAccumulator accumulator; | 165 MessageAccumulator accumulator; |
| 165 connector1.set_incoming_receiver(&accumulator); | 166 connector1.set_incoming_receiver(&accumulator); |
| 166 | 167 |
| 167 const char kText[] = "hello world"; | 168 const char kText[] = "hello world"; |
| 168 | 169 |
| 169 Message message; | 170 Message message; |
| 170 AllocMessage(kText, &message); | 171 AllocMessage(kText, &message); |
| 171 | 172 |
| 172 connector0.Accept(&message); | 173 connector0.Accept(&message); |
| 173 | 174 |
| 174 PumpMessages(); | 175 PumpMessages(); |
| 175 | 176 |
| 176 ASSERT_FALSE(accumulator.IsEmpty()); | 177 ASSERT_FALSE(accumulator.IsEmpty()); |
| 177 | 178 |
| 178 Message message_received; | 179 Message message_received; |
| 179 accumulator.Pop(&message_received); | 180 accumulator.Pop(&message_received); |
| 180 | 181 |
| 181 EXPECT_EQ( | 182 EXPECT_EQ( |
| 182 std::string(kText), | 183 std::string(kText), |
| 183 std::string(reinterpret_cast<const char*>(message_received.payload()))); | 184 std::string(reinterpret_cast<const char*>(message_received.payload()))); |
| 184 } | 185 } |
| 185 | 186 |
| 186 TEST_F(ConnectorTest, Basic_TwoMessages) { | 187 TEST_F(ConnectorTest, Basic_TwoMessages) { |
| 187 internal::Connector connector0(handle0_.Pass(), | 188 internal::Connector connector0(std::move(handle0_), |
| 188 internal::Connector::SINGLE_THREADED_SEND); | 189 internal::Connector::SINGLE_THREADED_SEND); |
| 189 internal::Connector connector1(handle1_.Pass(), | 190 internal::Connector connector1(std::move(handle1_), |
| 190 internal::Connector::SINGLE_THREADED_SEND); | 191 internal::Connector::SINGLE_THREADED_SEND); |
| 191 | 192 |
| 192 const char* kText[] = {"hello", "world"}; | 193 const char* kText[] = {"hello", "world"}; |
| 193 | 194 |
| 194 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { | 195 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { |
| 195 Message message; | 196 Message message; |
| 196 AllocMessage(kText[i], &message); | 197 AllocMessage(kText[i], &message); |
| 197 | 198 |
| 198 connector0.Accept(&message); | 199 connector0.Accept(&message); |
| 199 } | 200 } |
| 200 | 201 |
| 201 MessageAccumulator accumulator; | 202 MessageAccumulator accumulator; |
| 202 connector1.set_incoming_receiver(&accumulator); | 203 connector1.set_incoming_receiver(&accumulator); |
| 203 | 204 |
| 204 PumpMessages(); | 205 PumpMessages(); |
| 205 | 206 |
| 206 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { | 207 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { |
| 207 ASSERT_FALSE(accumulator.IsEmpty()); | 208 ASSERT_FALSE(accumulator.IsEmpty()); |
| 208 | 209 |
| 209 Message message_received; | 210 Message message_received; |
| 210 accumulator.Pop(&message_received); | 211 accumulator.Pop(&message_received); |
| 211 | 212 |
| 212 EXPECT_EQ( | 213 EXPECT_EQ( |
| 213 std::string(kText[i]), | 214 std::string(kText[i]), |
| 214 std::string(reinterpret_cast<const char*>(message_received.payload()))); | 215 std::string(reinterpret_cast<const char*>(message_received.payload()))); |
| 215 } | 216 } |
| 216 } | 217 } |
| 217 | 218 |
| 218 TEST_F(ConnectorTest, Basic_TwoMessages_Synchronous) { | 219 TEST_F(ConnectorTest, Basic_TwoMessages_Synchronous) { |
| 219 internal::Connector connector0(handle0_.Pass(), | 220 internal::Connector connector0(std::move(handle0_), |
| 220 internal::Connector::SINGLE_THREADED_SEND); | 221 internal::Connector::SINGLE_THREADED_SEND); |
| 221 internal::Connector connector1(handle1_.Pass(), | 222 internal::Connector connector1(std::move(handle1_), |
| 222 internal::Connector::SINGLE_THREADED_SEND); | 223 internal::Connector::SINGLE_THREADED_SEND); |
| 223 | 224 |
| 224 const char* kText[] = {"hello", "world"}; | 225 const char* kText[] = {"hello", "world"}; |
| 225 | 226 |
| 226 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { | 227 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { |
| 227 Message message; | 228 Message message; |
| 228 AllocMessage(kText[i], &message); | 229 AllocMessage(kText[i], &message); |
| 229 | 230 |
| 230 connector0.Accept(&message); | 231 connector0.Accept(&message); |
| 231 } | 232 } |
| 232 | 233 |
| 233 MessageAccumulator accumulator; | 234 MessageAccumulator accumulator; |
| 234 connector1.set_incoming_receiver(&accumulator); | 235 connector1.set_incoming_receiver(&accumulator); |
| 235 | 236 |
| 236 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); | 237 connector1.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); |
| 237 | 238 |
| 238 ASSERT_FALSE(accumulator.IsEmpty()); | 239 ASSERT_FALSE(accumulator.IsEmpty()); |
| 239 | 240 |
| 240 Message message_received; | 241 Message message_received; |
| 241 accumulator.Pop(&message_received); | 242 accumulator.Pop(&message_received); |
| 242 | 243 |
| 243 EXPECT_EQ( | 244 EXPECT_EQ( |
| 244 std::string(kText[0]), | 245 std::string(kText[0]), |
| 245 std::string(reinterpret_cast<const char*>(message_received.payload()))); | 246 std::string(reinterpret_cast<const char*>(message_received.payload()))); |
| 246 | 247 |
| 247 ASSERT_TRUE(accumulator.IsEmpty()); | 248 ASSERT_TRUE(accumulator.IsEmpty()); |
| 248 } | 249 } |
| 249 | 250 |
| 250 TEST_F(ConnectorTest, WriteToClosedPipe) { | 251 TEST_F(ConnectorTest, WriteToClosedPipe) { |
| 251 internal::Connector connector0(handle0_.Pass(), | 252 internal::Connector connector0(std::move(handle0_), |
| 252 internal::Connector::SINGLE_THREADED_SEND); | 253 internal::Connector::SINGLE_THREADED_SEND); |
| 253 | 254 |
| 254 const char kText[] = "hello world"; | 255 const char kText[] = "hello world"; |
| 255 | 256 |
| 256 Message message; | 257 Message message; |
| 257 AllocMessage(kText, &message); | 258 AllocMessage(kText, &message); |
| 258 | 259 |
| 259 // Close the other end of the pipe. | 260 // Close the other end of the pipe. |
| 260 handle1_.reset(); | 261 handle1_.reset(); |
| 261 | 262 |
| 262 // Not observed yet because we haven't spun the message loop yet. | 263 // Not observed yet because we haven't spun the message loop yet. |
| 263 EXPECT_FALSE(connector0.encountered_error()); | 264 EXPECT_FALSE(connector0.encountered_error()); |
| 264 | 265 |
| 265 // Write failures are not reported. | 266 // Write failures are not reported. |
| 266 bool ok = connector0.Accept(&message); | 267 bool ok = connector0.Accept(&message); |
| 267 EXPECT_TRUE(ok); | 268 EXPECT_TRUE(ok); |
| 268 | 269 |
| 269 // Still not observed. | 270 // Still not observed. |
| 270 EXPECT_FALSE(connector0.encountered_error()); | 271 EXPECT_FALSE(connector0.encountered_error()); |
| 271 | 272 |
| 272 // Spin the message loop, and then we should start observing the closed pipe. | 273 // Spin the message loop, and then we should start observing the closed pipe. |
| 273 PumpMessages(); | 274 PumpMessages(); |
| 274 | 275 |
| 275 EXPECT_TRUE(connector0.encountered_error()); | 276 EXPECT_TRUE(connector0.encountered_error()); |
| 276 } | 277 } |
| 277 | 278 |
| 278 TEST_F(ConnectorTest, MessageWithHandles) { | 279 TEST_F(ConnectorTest, MessageWithHandles) { |
| 279 internal::Connector connector0(handle0_.Pass(), | 280 internal::Connector connector0(std::move(handle0_), |
| 280 internal::Connector::SINGLE_THREADED_SEND); | 281 internal::Connector::SINGLE_THREADED_SEND); |
| 281 internal::Connector connector1(handle1_.Pass(), | 282 internal::Connector connector1(std::move(handle1_), |
| 282 internal::Connector::SINGLE_THREADED_SEND); | 283 internal::Connector::SINGLE_THREADED_SEND); |
| 283 | 284 |
| 284 const char kText[] = "hello world"; | 285 const char kText[] = "hello world"; |
| 285 | 286 |
| 286 Message message1; | 287 Message message1; |
| 287 AllocMessage(kText, &message1); | 288 AllocMessage(kText, &message1); |
| 288 | 289 |
| 289 MessagePipe pipe; | 290 MessagePipe pipe; |
| 290 message1.mutable_handles()->push_back(pipe.handle0.release()); | 291 message1.mutable_handles()->push_back(pipe.handle0.release()); |
| 291 | 292 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 311 | 312 |
| 312 // Now send a message to the transferred handle and confirm it's sent through | 313 // Now send a message to the transferred handle and confirm it's sent through |
| 313 // to the orginal pipe. | 314 // to the orginal pipe. |
| 314 // TODO(vtl): Do we need a better way of "downcasting" the handle types? | 315 // TODO(vtl): Do we need a better way of "downcasting" the handle types? |
| 315 ScopedMessagePipeHandle smph; | 316 ScopedMessagePipeHandle smph; |
| 316 smph.reset(MessagePipeHandle(message_received.handles()->front().value())); | 317 smph.reset(MessagePipeHandle(message_received.handles()->front().value())); |
| 317 message_received.mutable_handles()->front() = Handle(); | 318 message_received.mutable_handles()->front() = Handle(); |
| 318 // |smph| now owns this handle. | 319 // |smph| now owns this handle. |
| 319 | 320 |
| 320 internal::Connector connector_received( | 321 internal::Connector connector_received( |
| 321 smph.Pass(), internal::Connector::SINGLE_THREADED_SEND); | 322 std::move(smph), internal::Connector::SINGLE_THREADED_SEND); |
| 322 internal::Connector connector_original( | 323 internal::Connector connector_original( |
| 323 pipe.handle1.Pass(), internal::Connector::SINGLE_THREADED_SEND); | 324 std::move(pipe.handle1), internal::Connector::SINGLE_THREADED_SEND); |
| 324 | 325 |
| 325 Message message2; | 326 Message message2; |
| 326 AllocMessage(kText, &message2); | 327 AllocMessage(kText, &message2); |
| 327 | 328 |
| 328 connector_received.Accept(&message2); | 329 connector_received.Accept(&message2); |
| 329 connector_original.set_incoming_receiver(&accumulator); | 330 connector_original.set_incoming_receiver(&accumulator); |
| 330 PumpMessages(); | 331 PumpMessages(); |
| 331 | 332 |
| 332 ASSERT_FALSE(accumulator.IsEmpty()); | 333 ASSERT_FALSE(accumulator.IsEmpty()); |
| 333 | 334 |
| 334 accumulator.Pop(&message_received); | 335 accumulator.Pop(&message_received); |
| 335 | 336 |
| 336 EXPECT_EQ( | 337 EXPECT_EQ( |
| 337 std::string(kText), | 338 std::string(kText), |
| 338 std::string(reinterpret_cast<const char*>(message_received.payload()))); | 339 std::string(reinterpret_cast<const char*>(message_received.payload()))); |
| 339 } | 340 } |
| 340 | 341 |
| 341 TEST_F(ConnectorTest, WaitForIncomingMessageWithError) { | 342 TEST_F(ConnectorTest, WaitForIncomingMessageWithError) { |
| 342 internal::Connector connector0(handle0_.Pass(), | 343 internal::Connector connector0(std::move(handle0_), |
| 343 internal::Connector::SINGLE_THREADED_SEND); | 344 internal::Connector::SINGLE_THREADED_SEND); |
| 344 // Close the other end of the pipe. | 345 // Close the other end of the pipe. |
| 345 handle1_.reset(); | 346 handle1_.reset(); |
| 346 ASSERT_FALSE(connector0.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE)); | 347 ASSERT_FALSE(connector0.WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE)); |
| 347 } | 348 } |
| 348 | 349 |
| 349 TEST_F(ConnectorTest, WaitForIncomingMessageWithDeletion) { | 350 TEST_F(ConnectorTest, WaitForIncomingMessageWithDeletion) { |
| 350 internal::Connector connector0(handle0_.Pass(), | 351 internal::Connector connector0(std::move(handle0_), |
| 351 internal::Connector::SINGLE_THREADED_SEND); | 352 internal::Connector::SINGLE_THREADED_SEND); |
| 352 internal::Connector* connector1 = new internal::Connector( | 353 internal::Connector* connector1 = new internal::Connector( |
| 353 handle1_.Pass(), internal::Connector::SINGLE_THREADED_SEND); | 354 std::move(handle1_), internal::Connector::SINGLE_THREADED_SEND); |
| 354 | 355 |
| 355 const char kText[] = "hello world"; | 356 const char kText[] = "hello world"; |
| 356 | 357 |
| 357 Message message; | 358 Message message; |
| 358 AllocMessage(kText, &message); | 359 AllocMessage(kText, &message); |
| 359 | 360 |
| 360 connector0.Accept(&message); | 361 connector0.Accept(&message); |
| 361 | 362 |
| 362 ConnectorDeletingMessageAccumulator accumulator(&connector1); | 363 ConnectorDeletingMessageAccumulator accumulator(&connector1); |
| 363 connector1->set_incoming_receiver(&accumulator); | 364 connector1->set_incoming_receiver(&accumulator); |
| 364 | 365 |
| 365 connector1->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); | 366 connector1->WaitForIncomingMessage(MOJO_DEADLINE_INDEFINITE); |
| 366 | 367 |
| 367 ASSERT_FALSE(connector1); | 368 ASSERT_FALSE(connector1); |
| 368 ASSERT_FALSE(accumulator.IsEmpty()); | 369 ASSERT_FALSE(accumulator.IsEmpty()); |
| 369 | 370 |
| 370 Message message_received; | 371 Message message_received; |
| 371 accumulator.Pop(&message_received); | 372 accumulator.Pop(&message_received); |
| 372 | 373 |
| 373 EXPECT_EQ( | 374 EXPECT_EQ( |
| 374 std::string(kText), | 375 std::string(kText), |
| 375 std::string(reinterpret_cast<const char*>(message_received.payload()))); | 376 std::string(reinterpret_cast<const char*>(message_received.payload()))); |
| 376 } | 377 } |
| 377 | 378 |
| 378 TEST_F(ConnectorTest, WaitForIncomingMessageWithReentrancy) { | 379 TEST_F(ConnectorTest, WaitForIncomingMessageWithReentrancy) { |
| 379 internal::Connector connector0(handle0_.Pass(), | 380 internal::Connector connector0(std::move(handle0_), |
| 380 internal::Connector::SINGLE_THREADED_SEND); | 381 internal::Connector::SINGLE_THREADED_SEND); |
| 381 internal::Connector connector1(handle1_.Pass(), | 382 internal::Connector connector1(std::move(handle1_), |
| 382 internal::Connector::SINGLE_THREADED_SEND); | 383 internal::Connector::SINGLE_THREADED_SEND); |
| 383 | 384 |
| 384 const char* kText[] = {"hello", "world"}; | 385 const char* kText[] = {"hello", "world"}; |
| 385 | 386 |
| 386 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { | 387 for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) { |
| 387 Message message; | 388 Message message; |
| 388 AllocMessage(kText[i], &message); | 389 AllocMessage(kText[i], &message); |
| 389 | 390 |
| 390 connector0.Accept(&message); | 391 connector0.Accept(&message); |
| 391 } | 392 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 403 | 404 |
| 404 EXPECT_EQ( | 405 EXPECT_EQ( |
| 405 std::string(kText[i]), | 406 std::string(kText[i]), |
| 406 std::string(reinterpret_cast<const char*>(message_received.payload()))); | 407 std::string(reinterpret_cast<const char*>(message_received.payload()))); |
| 407 } | 408 } |
| 408 | 409 |
| 409 ASSERT_EQ(2, accumulator.number_of_calls()); | 410 ASSERT_EQ(2, accumulator.number_of_calls()); |
| 410 } | 411 } |
| 411 | 412 |
| 412 TEST_F(ConnectorTest, RaiseError) { | 413 TEST_F(ConnectorTest, RaiseError) { |
| 413 internal::Connector connector0(handle0_.Pass(), | 414 internal::Connector connector0(std::move(handle0_), |
| 414 internal::Connector::SINGLE_THREADED_SEND); | 415 internal::Connector::SINGLE_THREADED_SEND); |
| 415 bool error_handler_called0 = false; | 416 bool error_handler_called0 = false; |
| 416 connector0.set_connection_error_handler( | 417 connector0.set_connection_error_handler( |
| 417 [&error_handler_called0]() { error_handler_called0 = true; }); | 418 [&error_handler_called0]() { error_handler_called0 = true; }); |
| 418 | 419 |
| 419 internal::Connector connector1(handle1_.Pass(), | 420 internal::Connector connector1(std::move(handle1_), |
| 420 internal::Connector::SINGLE_THREADED_SEND); | 421 internal::Connector::SINGLE_THREADED_SEND); |
| 421 bool error_handler_called1 = false; | 422 bool error_handler_called1 = false; |
| 422 connector1.set_connection_error_handler( | 423 connector1.set_connection_error_handler( |
| 423 [&error_handler_called1]() { error_handler_called1 = true; }); | 424 [&error_handler_called1]() { error_handler_called1 = true; }); |
| 424 | 425 |
| 425 const char kText[] = "hello world"; | 426 const char kText[] = "hello world"; |
| 426 | 427 |
| 427 Message message; | 428 Message message; |
| 428 AllocMessage(kText, &message); | 429 AllocMessage(kText, &message); |
| 429 | 430 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 456 EXPECT_TRUE(connector1.encountered_error()); | 457 EXPECT_TRUE(connector1.encountered_error()); |
| 457 | 458 |
| 458 // The message pipe handle is valid at both sides. | 459 // The message pipe handle is valid at both sides. |
| 459 EXPECT_TRUE(connector0.is_valid()); | 460 EXPECT_TRUE(connector0.is_valid()); |
| 460 EXPECT_TRUE(connector1.is_valid()); | 461 EXPECT_TRUE(connector1.is_valid()); |
| 461 } | 462 } |
| 462 | 463 |
| 463 } // namespace | 464 } // namespace |
| 464 } // namespace test | 465 } // namespace test |
| 465 } // namespace mojo | 466 } // namespace mojo |
| OLD | NEW |