| 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 <stdint.h> | 5 #include <stdint.h> |
| 6 #include <stdio.h> | 6 #include <stdio.h> |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 CHECK_EQ(hss.satisfied_signals, 0u); | 65 CHECK_EQ(hss.satisfied_signals, 0u); |
| 66 CHECK_EQ(hss.satisfiable_signals, 0u); | 66 CHECK_EQ(hss.satisfiable_signals, 0u); |
| 67 break; | 67 break; |
| 68 } else { | 68 } else { |
| 69 CHECK((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 69 CHECK((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 70 CHECK((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 70 CHECK((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 71 } | 71 } |
| 72 | 72 |
| 73 std::string read_buffer(1000, '\0'); | 73 std::string read_buffer(1000, '\0'); |
| 74 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); | 74 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); |
| 75 CHECK_EQ(mp->ReadMessage(0, | 75 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 76 UserPointer<void>(&read_buffer[0]), | 76 MakeUserPointer(&read_buffer_size), nullptr, |
| 77 MakeUserPointer(&read_buffer_size), | 77 nullptr, MOJO_READ_MESSAGE_FLAG_NONE), |
| 78 nullptr, | |
| 79 nullptr, | |
| 80 MOJO_READ_MESSAGE_FLAG_NONE), | |
| 81 MOJO_RESULT_OK); | 78 MOJO_RESULT_OK); |
| 82 read_buffer.resize(read_buffer_size); | 79 read_buffer.resize(read_buffer_size); |
| 83 VLOG(2) << "Child got: " << read_buffer; | 80 VLOG(2) << "Child got: " << read_buffer; |
| 84 | 81 |
| 85 if (read_buffer == quitquitquit) { | 82 if (read_buffer == quitquitquit) { |
| 86 VLOG(2) << "Child quitting."; | 83 VLOG(2) << "Child quitting."; |
| 87 break; | 84 break; |
| 88 } | 85 } |
| 89 | 86 |
| 90 std::string write_buffer = read_buffer + read_buffer; | 87 std::string write_buffer = read_buffer + read_buffer; |
| 91 CHECK_EQ(mp->WriteMessage(0, | 88 CHECK_EQ(mp->WriteMessage(0, UserPointer<const void>(write_buffer.data()), |
| 92 UserPointer<const void>(write_buffer.data()), | |
| 93 static_cast<uint32_t>(write_buffer.size()), | 89 static_cast<uint32_t>(write_buffer.size()), |
| 94 nullptr, | 90 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE), |
| 95 MOJO_WRITE_MESSAGE_FLAG_NONE), | |
| 96 MOJO_RESULT_OK); | 91 MOJO_RESULT_OK); |
| 97 } | 92 } |
| 98 | 93 |
| 99 mp->Close(0); | 94 mp->Close(0); |
| 100 return rv; | 95 return rv; |
| 101 } | 96 } |
| 102 | 97 |
| 103 // Sends "hello" to child, and expects "hellohello" back. | 98 // Sends "hello" to child, and expects "hellohello" back. |
| 104 TEST_F(MultiprocessMessagePipeTest, Basic) { | 99 TEST_F(MultiprocessMessagePipeTest, Basic) { |
| 105 helper()->StartChild("EchoEcho"); | 100 helper()->StartChild("EchoEcho"); |
| 106 | 101 |
| 107 scoped_refptr<ChannelEndpoint> ep; | 102 scoped_refptr<ChannelEndpoint> ep; |
| 108 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); | 103 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); |
| 109 Init(ep); | 104 Init(ep); |
| 110 | 105 |
| 111 std::string hello("hello"); | 106 std::string hello("hello"); |
| 112 EXPECT_EQ(MOJO_RESULT_OK, | 107 EXPECT_EQ(MOJO_RESULT_OK, |
| 113 mp->WriteMessage(0, | 108 mp->WriteMessage(0, UserPointer<const void>(hello.data()), |
| 114 UserPointer<const void>(hello.data()), | 109 static_cast<uint32_t>(hello.size()), nullptr, |
| 115 static_cast<uint32_t>(hello.size()), | |
| 116 nullptr, | |
| 117 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 110 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 118 | 111 |
| 119 HandleSignalsState hss; | 112 HandleSignalsState hss; |
| 120 EXPECT_EQ(MOJO_RESULT_OK, | 113 EXPECT_EQ(MOJO_RESULT_OK, |
| 121 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 114 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 122 // The child may or may not have closed its end of the message pipe and died | 115 // The child may or may not have closed its end of the message pipe and died |
| 123 // (and we may or may not know it yet), so our end may or may not appear as | 116 // (and we may or may not know it yet), so our end may or may not appear as |
| 124 // writable. | 117 // writable. |
| 125 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 118 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 126 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 119 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 127 | 120 |
| 128 std::string read_buffer(1000, '\0'); | 121 std::string read_buffer(1000, '\0'); |
| 129 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); | 122 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); |
| 130 CHECK_EQ(mp->ReadMessage(0, | 123 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 131 UserPointer<void>(&read_buffer[0]), | 124 MakeUserPointer(&read_buffer_size), nullptr, nullptr, |
| 132 MakeUserPointer(&read_buffer_size), | |
| 133 nullptr, | |
| 134 nullptr, | |
| 135 MOJO_READ_MESSAGE_FLAG_NONE), | 125 MOJO_READ_MESSAGE_FLAG_NONE), |
| 136 MOJO_RESULT_OK); | 126 MOJO_RESULT_OK); |
| 137 read_buffer.resize(read_buffer_size); | 127 read_buffer.resize(read_buffer_size); |
| 138 VLOG(2) << "Parent got: " << read_buffer; | 128 VLOG(2) << "Parent got: " << read_buffer; |
| 139 EXPECT_EQ(hello + hello, read_buffer); | 129 EXPECT_EQ(hello + hello, read_buffer); |
| 140 | 130 |
| 141 mp->Close(0); | 131 mp->Close(0); |
| 142 | 132 |
| 143 // We sent one message. | 133 // We sent one message. |
| 144 EXPECT_EQ(1 % 100, helper()->WaitForChildShutdown()); | 134 EXPECT_EQ(1 % 100, helper()->WaitForChildShutdown()); |
| 145 } | 135 } |
| 146 | 136 |
| 147 // Sends a bunch of messages to the child. Expects them "repeated" back. Waits | 137 // Sends a bunch of messages to the child. Expects them "repeated" back. Waits |
| 148 // for the child to close its end before quitting. | 138 // for the child to close its end before quitting. |
| 149 TEST_F(MultiprocessMessagePipeTest, QueueMessages) { | 139 TEST_F(MultiprocessMessagePipeTest, QueueMessages) { |
| 150 helper()->StartChild("EchoEcho"); | 140 helper()->StartChild("EchoEcho"); |
| 151 | 141 |
| 152 scoped_refptr<ChannelEndpoint> ep; | 142 scoped_refptr<ChannelEndpoint> ep; |
| 153 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); | 143 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); |
| 154 Init(ep); | 144 Init(ep); |
| 155 | 145 |
| 156 static const size_t kNumMessages = 1001; | 146 static const size_t kNumMessages = 1001; |
| 157 for (size_t i = 0; i < kNumMessages; i++) { | 147 for (size_t i = 0; i < kNumMessages; i++) { |
| 158 std::string write_buffer(i, 'A' + (i % 26)); | 148 std::string write_buffer(i, 'A' + (i % 26)); |
| 159 EXPECT_EQ(MOJO_RESULT_OK, | 149 EXPECT_EQ(MOJO_RESULT_OK, |
| 160 mp->WriteMessage(0, | 150 mp->WriteMessage(0, UserPointer<const void>(write_buffer.data()), |
| 161 UserPointer<const void>(write_buffer.data()), | |
| 162 static_cast<uint32_t>(write_buffer.size()), | 151 static_cast<uint32_t>(write_buffer.size()), |
| 163 nullptr, | 152 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 164 MOJO_WRITE_MESSAGE_FLAG_NONE)); | |
| 165 } | 153 } |
| 166 | 154 |
| 167 const std::string quitquitquit("quitquitquit"); | 155 const std::string quitquitquit("quitquitquit"); |
| 168 EXPECT_EQ(MOJO_RESULT_OK, | 156 EXPECT_EQ(MOJO_RESULT_OK, |
| 169 mp->WriteMessage(0, | 157 mp->WriteMessage(0, UserPointer<const void>(quitquitquit.data()), |
| 170 UserPointer<const void>(quitquitquit.data()), | |
| 171 static_cast<uint32_t>(quitquitquit.size()), | 158 static_cast<uint32_t>(quitquitquit.size()), |
| 172 nullptr, | 159 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 173 MOJO_WRITE_MESSAGE_FLAG_NONE)); | |
| 174 | 160 |
| 175 for (size_t i = 0; i < kNumMessages; i++) { | 161 for (size_t i = 0; i < kNumMessages; i++) { |
| 176 HandleSignalsState hss; | 162 HandleSignalsState hss; |
| 177 EXPECT_EQ(MOJO_RESULT_OK, | 163 EXPECT_EQ(MOJO_RESULT_OK, |
| 178 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 164 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 179 // The child may or may not have closed its end of the message pipe and died | 165 // The child may or may not have closed its end of the message pipe and died |
| 180 // (and we may or may not know it yet), so our end may or may not appear as | 166 // (and we may or may not know it yet), so our end may or may not appear as |
| 181 // writable. | 167 // writable. |
| 182 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 168 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 183 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 169 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 184 | 170 |
| 185 std::string read_buffer(kNumMessages * 2, '\0'); | 171 std::string read_buffer(kNumMessages * 2, '\0'); |
| 186 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); | 172 uint32_t read_buffer_size = static_cast<uint32_t>(read_buffer.size()); |
| 187 CHECK_EQ(mp->ReadMessage(0, | 173 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 188 UserPointer<void>(&read_buffer[0]), | 174 MakeUserPointer(&read_buffer_size), nullptr, |
| 189 MakeUserPointer(&read_buffer_size), | 175 nullptr, MOJO_READ_MESSAGE_FLAG_NONE), |
| 190 nullptr, | |
| 191 nullptr, | |
| 192 MOJO_READ_MESSAGE_FLAG_NONE), | |
| 193 MOJO_RESULT_OK); | 176 MOJO_RESULT_OK); |
| 194 read_buffer.resize(read_buffer_size); | 177 read_buffer.resize(read_buffer_size); |
| 195 | 178 |
| 196 EXPECT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer); | 179 EXPECT_EQ(std::string(i * 2, 'A' + (i % 26)), read_buffer); |
| 197 } | 180 } |
| 198 | 181 |
| 199 // Wait for it to become readable, which should fail (since we sent | 182 // Wait for it to become readable, which should fail (since we sent |
| 200 // "quitquitquit"). | 183 // "quitquitquit"). |
| 201 HandleSignalsState hss; | 184 HandleSignalsState hss; |
| 202 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 185 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 229 CHECK_EQ(hss.satisfied_signals, | 212 CHECK_EQ(hss.satisfied_signals, |
| 230 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 213 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 231 CHECK_EQ(hss.satisfiable_signals, | 214 CHECK_EQ(hss.satisfiable_signals, |
| 232 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 215 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 233 | 216 |
| 234 // It should have a shared buffer. | 217 // It should have a shared buffer. |
| 235 std::string read_buffer(100, '\0'); | 218 std::string read_buffer(100, '\0'); |
| 236 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); | 219 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); |
| 237 DispatcherVector dispatchers; | 220 DispatcherVector dispatchers; |
| 238 uint32_t num_dispatchers = 10; // Maximum number to receive. | 221 uint32_t num_dispatchers = 10; // Maximum number to receive. |
| 239 CHECK_EQ(mp->ReadMessage(0, | 222 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 240 UserPointer<void>(&read_buffer[0]), | 223 MakeUserPointer(&num_bytes), &dispatchers, |
| 241 MakeUserPointer(&num_bytes), | 224 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), |
| 242 &dispatchers, | |
| 243 &num_dispatchers, | |
| 244 MOJO_READ_MESSAGE_FLAG_NONE), | |
| 245 MOJO_RESULT_OK); | 225 MOJO_RESULT_OK); |
| 246 read_buffer.resize(num_bytes); | 226 read_buffer.resize(num_bytes); |
| 247 CHECK_EQ(read_buffer, std::string("go 1")); | 227 CHECK_EQ(read_buffer, std::string("go 1")); |
| 248 CHECK_EQ(num_dispatchers, 1u); | 228 CHECK_EQ(num_dispatchers, 1u); |
| 249 | 229 |
| 250 CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::kTypeSharedBuffer); | 230 CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::kTypeSharedBuffer); |
| 251 | 231 |
| 252 scoped_refptr<SharedBufferDispatcher> dispatcher( | 232 scoped_refptr<SharedBufferDispatcher> dispatcher( |
| 253 static_cast<SharedBufferDispatcher*>(dispatchers[0].get())); | 233 static_cast<SharedBufferDispatcher*>(dispatchers[0].get())); |
| 254 | 234 |
| 255 // Make a mapping. | 235 // Make a mapping. |
| 256 scoped_ptr<embedder::PlatformSharedBufferMapping> mapping; | 236 scoped_ptr<embedder::PlatformSharedBufferMapping> mapping; |
| 257 CHECK_EQ(dispatcher->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping), | 237 CHECK_EQ(dispatcher->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping), |
| 258 MOJO_RESULT_OK); | 238 MOJO_RESULT_OK); |
| 259 CHECK(mapping); | 239 CHECK(mapping); |
| 260 CHECK(mapping->GetBase()); | 240 CHECK(mapping->GetBase()); |
| 261 CHECK_EQ(mapping->GetLength(), 100u); | 241 CHECK_EQ(mapping->GetLength(), 100u); |
| 262 | 242 |
| 263 // Write some stuff to the shared buffer. | 243 // Write some stuff to the shared buffer. |
| 264 static const char kHello[] = "hello"; | 244 static const char kHello[] = "hello"; |
| 265 memcpy(mapping->GetBase(), kHello, sizeof(kHello)); | 245 memcpy(mapping->GetBase(), kHello, sizeof(kHello)); |
| 266 | 246 |
| 267 // We should be able to close the dispatcher now. | 247 // We should be able to close the dispatcher now. |
| 268 dispatcher->Close(); | 248 dispatcher->Close(); |
| 269 | 249 |
| 270 // And send a message to signal that we've written stuff. | 250 // And send a message to signal that we've written stuff. |
| 271 const std::string go2("go 2"); | 251 const std::string go2("go 2"); |
| 272 CHECK_EQ(mp->WriteMessage(0, | 252 CHECK_EQ(mp->WriteMessage(0, UserPointer<const void>(&go2[0]), |
| 273 UserPointer<const void>(&go2[0]), | 253 static_cast<uint32_t>(go2.size()), nullptr, |
| 274 static_cast<uint32_t>(go2.size()), | |
| 275 nullptr, | |
| 276 MOJO_WRITE_MESSAGE_FLAG_NONE), | 254 MOJO_WRITE_MESSAGE_FLAG_NONE), |
| 277 MOJO_RESULT_OK); | 255 MOJO_RESULT_OK); |
| 278 | 256 |
| 279 // Now wait for our parent to send us a message. | 257 // Now wait for our parent to send us a message. |
| 280 hss = HandleSignalsState(); | 258 hss = HandleSignalsState(); |
| 281 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), | 259 CHECK_EQ(test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss), |
| 282 MOJO_RESULT_OK); | 260 MOJO_RESULT_OK); |
| 283 CHECK_EQ(hss.satisfied_signals, | 261 CHECK_EQ(hss.satisfied_signals, |
| 284 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 262 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 285 CHECK_EQ(hss.satisfiable_signals, | 263 CHECK_EQ(hss.satisfiable_signals, |
| 286 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 264 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 287 | 265 |
| 288 read_buffer = std::string(100, '\0'); | 266 read_buffer = std::string(100, '\0'); |
| 289 num_bytes = static_cast<uint32_t>(read_buffer.size()); | 267 num_bytes = static_cast<uint32_t>(read_buffer.size()); |
| 290 CHECK_EQ(mp->ReadMessage(0, | 268 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 291 UserPointer<void>(&read_buffer[0]), | 269 MakeUserPointer(&num_bytes), nullptr, nullptr, |
| 292 MakeUserPointer(&num_bytes), | |
| 293 nullptr, | |
| 294 nullptr, | |
| 295 MOJO_READ_MESSAGE_FLAG_NONE), | 270 MOJO_READ_MESSAGE_FLAG_NONE), |
| 296 MOJO_RESULT_OK); | 271 MOJO_RESULT_OK); |
| 297 read_buffer.resize(num_bytes); | 272 read_buffer.resize(num_bytes); |
| 298 CHECK_EQ(read_buffer, std::string("go 3")); | 273 CHECK_EQ(read_buffer, std::string("go 3")); |
| 299 | 274 |
| 300 // It should have written something to the shared buffer. | 275 // It should have written something to the shared buffer. |
| 301 static const char kWorld[] = "world!!!"; | 276 static const char kWorld[] = "world!!!"; |
| 302 CHECK_EQ(memcmp(mapping->GetBase(), kWorld, sizeof(kWorld)), 0); | 277 CHECK_EQ(memcmp(mapping->GetBase(), kWorld, sizeof(kWorld)), 0); |
| 303 | 278 |
| 304 // And we're done. | 279 // And we're done. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 315 #endif | 290 #endif |
| 316 TEST_F(MultiprocessMessagePipeTest, MAYBE_SharedBufferPassing) { | 291 TEST_F(MultiprocessMessagePipeTest, MAYBE_SharedBufferPassing) { |
| 317 helper()->StartChild("CheckSharedBuffer"); | 292 helper()->StartChild("CheckSharedBuffer"); |
| 318 | 293 |
| 319 scoped_refptr<ChannelEndpoint> ep; | 294 scoped_refptr<ChannelEndpoint> ep; |
| 320 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); | 295 scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep)); |
| 321 Init(ep); | 296 Init(ep); |
| 322 | 297 |
| 323 // Make a shared buffer. | 298 // Make a shared buffer. |
| 324 scoped_refptr<SharedBufferDispatcher> dispatcher; | 299 scoped_refptr<SharedBufferDispatcher> dispatcher; |
| 325 EXPECT_EQ(MOJO_RESULT_OK, | 300 EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::Create( |
| 326 SharedBufferDispatcher::Create( | 301 platform_support(), |
| 327 platform_support(), | 302 SharedBufferDispatcher::kDefaultCreateOptions, |
| 328 SharedBufferDispatcher::kDefaultCreateOptions, | 303 100, &dispatcher)); |
| 329 100, | |
| 330 &dispatcher)); | |
| 331 ASSERT_TRUE(dispatcher.get()); | 304 ASSERT_TRUE(dispatcher.get()); |
| 332 | 305 |
| 333 // Make a mapping. | 306 // Make a mapping. |
| 334 scoped_ptr<embedder::PlatformSharedBufferMapping> mapping; | 307 scoped_ptr<embedder::PlatformSharedBufferMapping> mapping; |
| 335 EXPECT_EQ(MOJO_RESULT_OK, | 308 EXPECT_EQ(MOJO_RESULT_OK, |
| 336 dispatcher->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); | 309 dispatcher->MapBuffer(0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping)); |
| 337 ASSERT_TRUE(mapping); | 310 ASSERT_TRUE(mapping); |
| 338 ASSERT_TRUE(mapping->GetBase()); | 311 ASSERT_TRUE(mapping->GetBase()); |
| 339 ASSERT_EQ(100u, mapping->GetLength()); | 312 ASSERT_EQ(100u, mapping->GetLength()); |
| 340 | 313 |
| 341 // Send the shared buffer. | 314 // Send the shared buffer. |
| 342 const std::string go1("go 1"); | 315 const std::string go1("go 1"); |
| 343 DispatcherTransport transport( | 316 DispatcherTransport transport( |
| 344 test::DispatcherTryStartTransport(dispatcher.get())); | 317 test::DispatcherTryStartTransport(dispatcher.get())); |
| 345 ASSERT_TRUE(transport.is_valid()); | 318 ASSERT_TRUE(transport.is_valid()); |
| 346 | 319 |
| 347 std::vector<DispatcherTransport> transports; | 320 std::vector<DispatcherTransport> transports; |
| 348 transports.push_back(transport); | 321 transports.push_back(transport); |
| 349 EXPECT_EQ(MOJO_RESULT_OK, | 322 EXPECT_EQ(MOJO_RESULT_OK, |
| 350 mp->WriteMessage(0, | 323 mp->WriteMessage(0, UserPointer<const void>(&go1[0]), |
| 351 UserPointer<const void>(&go1[0]), | 324 static_cast<uint32_t>(go1.size()), &transports, |
| 352 static_cast<uint32_t>(go1.size()), | |
| 353 &transports, | |
| 354 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 325 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 355 transport.End(); | 326 transport.End(); |
| 356 | 327 |
| 357 EXPECT_TRUE(dispatcher->HasOneRef()); | 328 EXPECT_TRUE(dispatcher->HasOneRef()); |
| 358 dispatcher = nullptr; | 329 dispatcher = nullptr; |
| 359 | 330 |
| 360 // Wait for a message from the child. | 331 // Wait for a message from the child. |
| 361 HandleSignalsState hss; | 332 HandleSignalsState hss; |
| 362 EXPECT_EQ(MOJO_RESULT_OK, | 333 EXPECT_EQ(MOJO_RESULT_OK, |
| 363 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 334 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 364 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 335 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 365 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 336 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 366 | 337 |
| 367 std::string read_buffer(100, '\0'); | 338 std::string read_buffer(100, '\0'); |
| 368 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); | 339 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); |
| 369 EXPECT_EQ(MOJO_RESULT_OK, | 340 EXPECT_EQ(MOJO_RESULT_OK, |
| 370 mp->ReadMessage(0, | 341 mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 371 UserPointer<void>(&read_buffer[0]), | 342 MakeUserPointer(&num_bytes), nullptr, nullptr, |
| 372 MakeUserPointer(&num_bytes), | |
| 373 nullptr, | |
| 374 nullptr, | |
| 375 MOJO_READ_MESSAGE_FLAG_NONE)); | 343 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 376 read_buffer.resize(num_bytes); | 344 read_buffer.resize(num_bytes); |
| 377 EXPECT_EQ(std::string("go 2"), read_buffer); | 345 EXPECT_EQ(std::string("go 2"), read_buffer); |
| 378 | 346 |
| 379 // After we get it, the child should have written something to the shared | 347 // After we get it, the child should have written something to the shared |
| 380 // buffer. | 348 // buffer. |
| 381 static const char kHello[] = "hello"; | 349 static const char kHello[] = "hello"; |
| 382 EXPECT_EQ(0, memcmp(mapping->GetBase(), kHello, sizeof(kHello))); | 350 EXPECT_EQ(0, memcmp(mapping->GetBase(), kHello, sizeof(kHello))); |
| 383 | 351 |
| 384 // Now we'll write some stuff to the shared buffer. | 352 // Now we'll write some stuff to the shared buffer. |
| 385 static const char kWorld[] = "world!!!"; | 353 static const char kWorld[] = "world!!!"; |
| 386 memcpy(mapping->GetBase(), kWorld, sizeof(kWorld)); | 354 memcpy(mapping->GetBase(), kWorld, sizeof(kWorld)); |
| 387 | 355 |
| 388 // And send a message to signal that we've written stuff. | 356 // And send a message to signal that we've written stuff. |
| 389 const std::string go3("go 3"); | 357 const std::string go3("go 3"); |
| 390 EXPECT_EQ(MOJO_RESULT_OK, | 358 EXPECT_EQ(MOJO_RESULT_OK, |
| 391 mp->WriteMessage(0, | 359 mp->WriteMessage(0, UserPointer<const void>(&go3[0]), |
| 392 UserPointer<const void>(&go3[0]), | 360 static_cast<uint32_t>(go3.size()), nullptr, |
| 393 static_cast<uint32_t>(go3.size()), | |
| 394 nullptr, | |
| 395 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 361 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 396 | 362 |
| 397 // Wait for |mp| to become readable, which should fail. | 363 // Wait for |mp| to become readable, which should fail. |
| 398 hss = HandleSignalsState(); | 364 hss = HandleSignalsState(); |
| 399 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 365 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 400 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 366 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 401 EXPECT_EQ(0u, hss.satisfied_signals); | 367 EXPECT_EQ(0u, hss.satisfied_signals); |
| 402 EXPECT_EQ(0u, hss.satisfiable_signals); | 368 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 403 | 369 |
| 404 mp->Close(0); | 370 mp->Close(0); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 421 MOJO_RESULT_OK); | 387 MOJO_RESULT_OK); |
| 422 CHECK_EQ(hss.satisfied_signals, | 388 CHECK_EQ(hss.satisfied_signals, |
| 423 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 389 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 424 CHECK_EQ(hss.satisfiable_signals, | 390 CHECK_EQ(hss.satisfiable_signals, |
| 425 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); | 391 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE); |
| 426 | 392 |
| 427 std::string read_buffer(100, '\0'); | 393 std::string read_buffer(100, '\0'); |
| 428 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); | 394 uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size()); |
| 429 DispatcherVector dispatchers; | 395 DispatcherVector dispatchers; |
| 430 uint32_t num_dispatchers = 10; // Maximum number to receive. | 396 uint32_t num_dispatchers = 10; // Maximum number to receive. |
| 431 CHECK_EQ(mp->ReadMessage(0, | 397 CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]), |
| 432 UserPointer<void>(&read_buffer[0]), | 398 MakeUserPointer(&num_bytes), &dispatchers, |
| 433 MakeUserPointer(&num_bytes), | 399 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), |
| 434 &dispatchers, | |
| 435 &num_dispatchers, | |
| 436 MOJO_READ_MESSAGE_FLAG_NONE), | |
| 437 MOJO_RESULT_OK); | 400 MOJO_RESULT_OK); |
| 438 mp->Close(0); | 401 mp->Close(0); |
| 439 | 402 |
| 440 read_buffer.resize(num_bytes); | 403 read_buffer.resize(num_bytes); |
| 441 CHECK_EQ(read_buffer, std::string("hello")); | 404 CHECK_EQ(read_buffer, std::string("hello")); |
| 442 CHECK_EQ(num_dispatchers, 1u); | 405 CHECK_EQ(num_dispatchers, 1u); |
| 443 | 406 |
| 444 CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::kTypePlatformHandle); | 407 CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::kTypePlatformHandle); |
| 445 | 408 |
| 446 scoped_refptr<PlatformHandleDispatcher> dispatcher( | 409 scoped_refptr<PlatformHandleDispatcher> dispatcher( |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 new PlatformHandleDispatcher(h.Pass())); | 452 new PlatformHandleDispatcher(h.Pass())); |
| 490 | 453 |
| 491 const std::string hello("hello"); | 454 const std::string hello("hello"); |
| 492 DispatcherTransport transport( | 455 DispatcherTransport transport( |
| 493 test::DispatcherTryStartTransport(dispatcher.get())); | 456 test::DispatcherTryStartTransport(dispatcher.get())); |
| 494 ASSERT_TRUE(transport.is_valid()); | 457 ASSERT_TRUE(transport.is_valid()); |
| 495 | 458 |
| 496 std::vector<DispatcherTransport> transports; | 459 std::vector<DispatcherTransport> transports; |
| 497 transports.push_back(transport); | 460 transports.push_back(transport); |
| 498 EXPECT_EQ(MOJO_RESULT_OK, | 461 EXPECT_EQ(MOJO_RESULT_OK, |
| 499 mp->WriteMessage(0, | 462 mp->WriteMessage(0, UserPointer<const void>(&hello[0]), |
| 500 UserPointer<const void>(&hello[0]), | 463 static_cast<uint32_t>(hello.size()), &transports, |
| 501 static_cast<uint32_t>(hello.size()), | |
| 502 &transports, | |
| 503 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 464 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 504 transport.End(); | 465 transport.End(); |
| 505 | 466 |
| 506 EXPECT_TRUE(dispatcher->HasOneRef()); | 467 EXPECT_TRUE(dispatcher->HasOneRef()); |
| 507 dispatcher = nullptr; | 468 dispatcher = nullptr; |
| 508 | 469 |
| 509 // Wait for it to become readable, which should fail. | 470 // Wait for it to become readable, which should fail. |
| 510 HandleSignalsState hss; | 471 HandleSignalsState hss; |
| 511 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 472 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 512 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); | 473 test::WaitIfNecessary(mp, MOJO_HANDLE_SIGNAL_READABLE, &hss)); |
| 513 EXPECT_EQ(0u, hss.satisfied_signals); | 474 EXPECT_EQ(0u, hss.satisfied_signals); |
| 514 EXPECT_EQ(0u, hss.satisfiable_signals); | 475 EXPECT_EQ(0u, hss.satisfiable_signals); |
| 515 | 476 |
| 516 mp->Close(0); | 477 mp->Close(0); |
| 517 | 478 |
| 518 EXPECT_EQ(0, helper()->WaitForChildShutdown()); | 479 EXPECT_EQ(0, helper()->WaitForChildShutdown()); |
| 519 } | 480 } |
| 520 | 481 |
| 521 } // namespace | 482 } // namespace |
| 522 } // namespace system | 483 } // namespace system |
| 523 } // namespace mojo | 484 } // namespace mojo |
| OLD | NEW |