| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 // This file tests both |RemoteProducerDataPipeImpl| and | 5 // This file tests both |RemoteProducerDataPipeImpl| and |
| 6 // |RemoteConsumerDataPipeImpl|. | 6 // |RemoteConsumerDataPipeImpl|. |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 char read_buffer[100] = {}; | 134 char read_buffer[100] = {}; |
| 135 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 135 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 136 Waiter waiter; | 136 Waiter waiter; |
| 137 HandleSignalsState hss; | 137 HandleSignalsState hss; |
| 138 uint64_t context = 0; | 138 uint64_t context = 0; |
| 139 | 139 |
| 140 // Write on MP 0 (port 0). Wait and receive on MP 1 (port 0). (Add the waiter | 140 // Write on MP 0 (port 0). Wait and receive on MP 1 (port 0). (Add the waiter |
| 141 // first, to avoid any handling the case where it's already readable.) | 141 // first, to avoid any handling the case where it's already readable.) |
| 142 waiter.Init(); | 142 waiter.Init(); |
| 143 ASSERT_EQ(MOJO_RESULT_OK, | 143 ASSERT_EQ(MOJO_RESULT_OK, |
| 144 message_pipe(1)->AddAwakable( | 144 message_pipe(1)->AddAwakable(0, &waiter, 123, false, |
| 145 0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 123, nullptr)); | 145 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 146 EXPECT_EQ(MOJO_RESULT_OK, | 146 EXPECT_EQ(MOJO_RESULT_OK, |
| 147 message_pipe(0)->WriteMessage(0, UserPointer<const void>(kHello), | 147 message_pipe(0)->WriteMessage(0, UserPointer<const void>(kHello), |
| 148 sizeof(kHello), nullptr, | 148 sizeof(kHello), nullptr, |
| 149 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 149 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 150 EXPECT_EQ(MOJO_RESULT_OK, | 150 EXPECT_EQ(MOJO_RESULT_OK, |
| 151 waiter.Wait(test::ActionTimeout(), &context, nullptr)); | 151 waiter.Wait(test::ActionTimeout(), &context, nullptr)); |
| 152 EXPECT_EQ(123u, context); | 152 EXPECT_EQ(123u, context); |
| 153 hss = HandleSignalsState(); | 153 hss = HandleSignalsState(); |
| 154 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); | 154 message_pipe(1)->RemoveAwakable(0, false, &waiter, 0, &hss); |
| 155 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 155 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 156 hss.satisfied_signals); | 156 hss.satisfied_signals); |
| 157 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 157 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 158 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 158 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 159 hss.satisfiable_signals); | 159 hss.satisfiable_signals); |
| 160 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(1)->ReadMessage( | 160 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(1)->ReadMessage( |
| 161 0, UserPointer<void>(read_buffer), | 161 0, UserPointer<void>(read_buffer), |
| 162 MakeUserPointer(&read_buffer_size), nullptr, | 162 MakeUserPointer(&read_buffer_size), nullptr, |
| 163 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); | 163 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); |
| 164 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); | 164 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 188 dp->ProducerWriteData(UserPointer<const void>(elements), | 188 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 189 MakeUserPointer(&num_bytes), false)); | 189 MakeUserPointer(&num_bytes), false)); |
| 190 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); | 190 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); |
| 191 dp->ProducerClose(); | 191 dp->ProducerClose(); |
| 192 | 192 |
| 193 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). | 193 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). |
| 194 // (Add the waiter first, to avoid any handling the case where it's already | 194 // (Add the waiter first, to avoid any handling the case where it's already |
| 195 // readable.) | 195 // readable.) |
| 196 waiter.Init(); | 196 waiter.Init(); |
| 197 ASSERT_EQ(MOJO_RESULT_OK, | 197 ASSERT_EQ(MOJO_RESULT_OK, |
| 198 message_pipe(1)->AddAwakable( | 198 message_pipe(1)->AddAwakable(0, &waiter, 123, false, |
| 199 0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 123, nullptr)); | 199 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 200 { | 200 { |
| 201 HandleTransport transport(test::HandleTryStartTransport(consumer_handle)); | 201 HandleTransport transport(test::HandleTryStartTransport(consumer_handle)); |
| 202 EXPECT_TRUE(transport.is_valid()); | 202 EXPECT_TRUE(transport.is_valid()); |
| 203 | 203 |
| 204 std::vector<HandleTransport> transports; | 204 std::vector<HandleTransport> transports; |
| 205 transports.push_back(transport); | 205 transports.push_back(transport); |
| 206 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( | 206 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( |
| 207 0, NullUserPointer(), 0, &transports, | 207 0, NullUserPointer(), 0, &transports, |
| 208 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 208 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 209 transport.End(); | 209 transport.End(); |
| 210 | 210 |
| 211 // |consumer_handle.dispatcher| should have been closed. This is | 211 // |consumer_handle.dispatcher| should have been closed. This is |
| 212 // |DCHECK()|ed when it is destroyed. | 212 // |DCHECK()|ed when it is destroyed. |
| 213 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef()); | 213 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef()); |
| 214 consumer_handle.reset(); | 214 consumer_handle.reset(); |
| 215 } | 215 } |
| 216 EXPECT_EQ(MOJO_RESULT_OK, | 216 EXPECT_EQ(MOJO_RESULT_OK, |
| 217 waiter.Wait(test::ActionTimeout(), &context, nullptr)); | 217 waiter.Wait(test::ActionTimeout(), &context, nullptr)); |
| 218 EXPECT_EQ(123u, context); | 218 EXPECT_EQ(123u, context); |
| 219 hss = HandleSignalsState(); | 219 hss = HandleSignalsState(); |
| 220 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); | 220 message_pipe(1)->RemoveAwakable(0, false, &waiter, 0, &hss); |
| 221 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 221 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 222 hss.satisfied_signals); | 222 hss.satisfied_signals); |
| 223 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 223 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 224 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 224 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 225 hss.satisfiable_signals); | 225 hss.satisfiable_signals); |
| 226 EXPECT_EQ(MOJO_RESULT_OK, | 226 EXPECT_EQ(MOJO_RESULT_OK, |
| 227 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer), | 227 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer), |
| 228 MakeUserPointer(&read_buffer_size), | 228 MakeUserPointer(&read_buffer_size), |
| 229 &read_handles, &read_num_handles, | 229 &read_handles, &read_num_handles, |
| 230 MOJO_READ_MESSAGE_FLAG_NONE)); | 230 MOJO_READ_MESSAGE_FLAG_NONE)); |
| 231 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); | 231 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); |
| 232 EXPECT_EQ(1u, read_handles.size()); | 232 EXPECT_EQ(1u, read_handles.size()); |
| 233 EXPECT_EQ(1u, read_num_handles); | 233 EXPECT_EQ(1u, read_num_handles); |
| 234 ASSERT_TRUE(read_handles[0]); | 234 ASSERT_TRUE(read_handles[0]); |
| 235 EXPECT_TRUE(read_handles[0].dispatcher->HasOneRef()); | 235 EXPECT_TRUE(read_handles[0].dispatcher->HasOneRef()); |
| 236 | 236 |
| 237 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, | 237 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, |
| 238 read_handles[0].dispatcher->GetType()); | 238 read_handles[0].dispatcher->GetType()); |
| 239 EXPECT_EQ(DataPipeConsumerDispatcher::kDefaultHandleRights, | 239 EXPECT_EQ(DataPipeConsumerDispatcher::kDefaultHandleRights, |
| 240 read_handles[0].rights); | 240 read_handles[0].rights); |
| 241 consumer = RefPtr<DataPipeConsumerDispatcher>( | 241 consumer = RefPtr<DataPipeConsumerDispatcher>( |
| 242 static_cast<DataPipeConsumerDispatcher*>( | 242 static_cast<DataPipeConsumerDispatcher*>( |
| 243 read_handles[0].dispatcher.get())); | 243 read_handles[0].dispatcher.get())); |
| 244 read_handles.clear(); | 244 read_handles.clear(); |
| 245 | 245 |
| 246 waiter.Init(); | 246 waiter.Init(); |
| 247 hss = HandleSignalsState(); | 247 hss = HandleSignalsState(); |
| 248 MojoResult result = | 248 MojoResult result = consumer->AddAwakable(&waiter, 456, false, |
| 249 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, &hss); | 249 MOJO_HANDLE_SIGNAL_READABLE, &hss); |
| 250 if (result == MOJO_RESULT_OK) { | 250 if (result == MOJO_RESULT_OK) { |
| 251 context = 0; | 251 context = 0; |
| 252 EXPECT_EQ(MOJO_RESULT_OK, | 252 EXPECT_EQ(MOJO_RESULT_OK, |
| 253 waiter.Wait(test::ActionTimeout(), &context, nullptr)); | 253 waiter.Wait(test::ActionTimeout(), &context, nullptr)); |
| 254 EXPECT_EQ(456u, context); | 254 EXPECT_EQ(456u, context); |
| 255 consumer->RemoveAwakable(&waiter, &hss); | 255 consumer->RemoveAwakable(false, &waiter, 0, &hss); |
| 256 } else { | 256 } else { |
| 257 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); | 257 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); |
| 258 } | 258 } |
| 259 // We don't know if the fact that the producer has been closed is known yet. | 259 // We don't know if the fact that the producer has been closed is known yet. |
| 260 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 260 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 261 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); | 261 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); |
| 262 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 262 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 263 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); | 263 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); |
| 264 | 264 |
| 265 // Read one element. | 265 // Read one element. |
| 266 elements[0] = -1; | 266 elements[0] = -1; |
| 267 elements[1] = -1; | 267 elements[1] = -1; |
| 268 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 268 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 269 EXPECT_EQ(MOJO_RESULT_OK, consumer->ReadData(UserPointer<void>(elements), | 269 EXPECT_EQ(MOJO_RESULT_OK, consumer->ReadData(UserPointer<void>(elements), |
| 270 MakeUserPointer(&num_bytes), | 270 MakeUserPointer(&num_bytes), |
| 271 MOJO_READ_DATA_FLAG_NONE)); | 271 MOJO_READ_DATA_FLAG_NONE)); |
| 272 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); | 272 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); |
| 273 EXPECT_EQ(123, elements[0]); | 273 EXPECT_EQ(123, elements[0]); |
| 274 EXPECT_EQ(-1, elements[1]); | 274 EXPECT_EQ(-1, elements[1]); |
| 275 | 275 |
| 276 waiter.Init(); | 276 waiter.Init(); |
| 277 hss = HandleSignalsState(); | 277 hss = HandleSignalsState(); |
| 278 result = | 278 result = consumer->AddAwakable(&waiter, 789, false, |
| 279 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, &hss); | 279 MOJO_HANDLE_SIGNAL_READABLE, &hss); |
| 280 if (result == MOJO_RESULT_OK) { | 280 if (result == MOJO_RESULT_OK) { |
| 281 context = 0; | 281 context = 0; |
| 282 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 282 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
| 283 waiter.Wait(test::ActionTimeout(), &context, nullptr)); | 283 waiter.Wait(test::ActionTimeout(), &context, nullptr)); |
| 284 EXPECT_EQ(789u, context); | 284 EXPECT_EQ(789u, context); |
| 285 consumer->RemoveAwakable(&waiter, &hss); | 285 consumer->RemoveAwakable(false, &waiter, 0, &hss); |
| 286 } else { | 286 } else { |
| 287 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); | 287 ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result); |
| 288 } | 288 } |
| 289 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); | 289 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); |
| 290 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); | 290 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); |
| 291 | 291 |
| 292 consumer->Close(); | 292 consumer->Close(); |
| 293 } | 293 } |
| 294 | 294 |
| 295 TEST_F(RemoteDataPipeImplTest, SendConsumerDuringTwoPhaseWrite) { | 295 TEST_F(RemoteDataPipeImplTest, SendConsumerDuringTwoPhaseWrite) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 313 EXPECT_EQ(MOJO_RESULT_OK, | 313 EXPECT_EQ(MOJO_RESULT_OK, |
| 314 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 314 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 315 MakeUserPointer(&num_bytes))); | 315 MakeUserPointer(&num_bytes))); |
| 316 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); | 316 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); |
| 317 | 317 |
| 318 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). | 318 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). |
| 319 // (Add the waiter first, to avoid any handling the case where it's already | 319 // (Add the waiter first, to avoid any handling the case where it's already |
| 320 // readable.) | 320 // readable.) |
| 321 waiter.Init(); | 321 waiter.Init(); |
| 322 ASSERT_EQ(MOJO_RESULT_OK, | 322 ASSERT_EQ(MOJO_RESULT_OK, |
| 323 message_pipe(1)->AddAwakable( | 323 message_pipe(1)->AddAwakable(0, &waiter, 123, false, |
| 324 0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 123, nullptr)); | 324 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 325 { | 325 { |
| 326 HandleTransport transport(test::HandleTryStartTransport(consumer_handle)); | 326 HandleTransport transport(test::HandleTryStartTransport(consumer_handle)); |
| 327 EXPECT_TRUE(transport.is_valid()); | 327 EXPECT_TRUE(transport.is_valid()); |
| 328 | 328 |
| 329 std::vector<HandleTransport> transports; | 329 std::vector<HandleTransport> transports; |
| 330 transports.push_back(transport); | 330 transports.push_back(transport); |
| 331 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( | 331 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( |
| 332 0, NullUserPointer(), 0, &transports, | 332 0, NullUserPointer(), 0, &transports, |
| 333 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 333 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 334 transport.End(); | 334 transport.End(); |
| 335 | 335 |
| 336 // |consumer_handle.dispatcher| should have been closed. This is | 336 // |consumer_handle.dispatcher| should have been closed. This is |
| 337 // |DCHECK()|ed when it is destroyed. | 337 // |DCHECK()|ed when it is destroyed. |
| 338 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef()); | 338 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef()); |
| 339 consumer_handle.reset(); | 339 consumer_handle.reset(); |
| 340 } | 340 } |
| 341 EXPECT_EQ(MOJO_RESULT_OK, | 341 EXPECT_EQ(MOJO_RESULT_OK, |
| 342 waiter.Wait(test::ActionTimeout(), &context, nullptr)); | 342 waiter.Wait(test::ActionTimeout(), &context, nullptr)); |
| 343 EXPECT_EQ(123u, context); | 343 EXPECT_EQ(123u, context); |
| 344 hss = HandleSignalsState(); | 344 hss = HandleSignalsState(); |
| 345 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); | 345 message_pipe(1)->RemoveAwakable(0, false, &waiter, 0, &hss); |
| 346 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 346 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 347 hss.satisfied_signals); | 347 hss.satisfied_signals); |
| 348 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 348 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 349 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 349 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 350 hss.satisfiable_signals); | 350 hss.satisfiable_signals); |
| 351 EXPECT_EQ(MOJO_RESULT_OK, | 351 EXPECT_EQ(MOJO_RESULT_OK, |
| 352 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer), | 352 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer), |
| 353 MakeUserPointer(&read_buffer_size), | 353 MakeUserPointer(&read_buffer_size), |
| 354 &read_handles, &read_num_handles, | 354 &read_handles, &read_num_handles, |
| 355 MOJO_READ_MESSAGE_FLAG_NONE)); | 355 MOJO_READ_MESSAGE_FLAG_NONE)); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 371 // Now actually write the data, complete the two-phase write, and close the | 371 // Now actually write the data, complete the two-phase write, and close the |
| 372 // producer. | 372 // producer. |
| 373 *static_cast<int32_t*>(write_ptr) = 123456; | 373 *static_cast<int32_t*>(write_ptr) = 123456; |
| 374 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( | 374 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( |
| 375 static_cast<uint32_t>(1u * sizeof(int32_t)))); | 375 static_cast<uint32_t>(1u * sizeof(int32_t)))); |
| 376 dp->ProducerClose(); | 376 dp->ProducerClose(); |
| 377 | 377 |
| 378 // Wait for the consumer to be readable. | 378 // Wait for the consumer to be readable. |
| 379 waiter.Init(); | 379 waiter.Init(); |
| 380 hss = HandleSignalsState(); | 380 hss = HandleSignalsState(); |
| 381 MojoResult result = | 381 MojoResult result = consumer->AddAwakable(&waiter, 456, false, |
| 382 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, &hss); | 382 MOJO_HANDLE_SIGNAL_READABLE, &hss); |
| 383 if (result == MOJO_RESULT_OK) { | 383 if (result == MOJO_RESULT_OK) { |
| 384 context = 0; | 384 context = 0; |
| 385 EXPECT_EQ(MOJO_RESULT_OK, | 385 EXPECT_EQ(MOJO_RESULT_OK, |
| 386 waiter.Wait(test::ActionTimeout(), &context, nullptr)); | 386 waiter.Wait(test::ActionTimeout(), &context, nullptr)); |
| 387 EXPECT_EQ(456u, context); | 387 EXPECT_EQ(456u, context); |
| 388 consumer->RemoveAwakable(&waiter, &hss); | 388 consumer->RemoveAwakable(false, &waiter, 0, &hss); |
| 389 } else { | 389 } else { |
| 390 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); | 390 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); |
| 391 } | 391 } |
| 392 // We don't know if the fact that the producer has been closed is known yet. | 392 // We don't know if the fact that the producer has been closed is known yet. |
| 393 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 393 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 394 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); | 394 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); |
| 395 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | 395 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); |
| 396 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); | 396 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READ_THRESHOLD)); |
| 397 | 397 |
| 398 // Read one element. | 398 // Read one element. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 EXPECT_EQ(MOJO_RESULT_OK, | 442 EXPECT_EQ(MOJO_RESULT_OK, |
| 443 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 443 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 444 MakeUserPointer(&num_bytes))); | 444 MakeUserPointer(&num_bytes))); |
| 445 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); | 445 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); |
| 446 | 446 |
| 447 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). | 447 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). |
| 448 // (Add the waiter first, to avoid any handling the case where it's already | 448 // (Add the waiter first, to avoid any handling the case where it's already |
| 449 // readable.) | 449 // readable.) |
| 450 waiter.Init(); | 450 waiter.Init(); |
| 451 ASSERT_EQ(MOJO_RESULT_OK, | 451 ASSERT_EQ(MOJO_RESULT_OK, |
| 452 message_pipe(1)->AddAwakable( | 452 message_pipe(1)->AddAwakable(0, &waiter, 123, false, |
| 453 0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, false, 123, nullptr)); | 453 MOJO_HANDLE_SIGNAL_READABLE, nullptr)); |
| 454 { | 454 { |
| 455 HandleTransport transport(test::HandleTryStartTransport(consumer_handle)); | 455 HandleTransport transport(test::HandleTryStartTransport(consumer_handle)); |
| 456 EXPECT_TRUE(transport.is_valid()); | 456 EXPECT_TRUE(transport.is_valid()); |
| 457 | 457 |
| 458 std::vector<HandleTransport> transports; | 458 std::vector<HandleTransport> transports; |
| 459 transports.push_back(transport); | 459 transports.push_back(transport); |
| 460 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( | 460 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( |
| 461 0, NullUserPointer(), 0, &transports, | 461 0, NullUserPointer(), 0, &transports, |
| 462 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 462 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 463 transport.End(); | 463 transport.End(); |
| 464 | 464 |
| 465 // |consumer_handle.dispatcher| should have been closed. This is | 465 // |consumer_handle.dispatcher| should have been closed. This is |
| 466 // |DCHECK()|ed when it is destroyed. | 466 // |DCHECK()|ed when it is destroyed. |
| 467 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef()); | 467 EXPECT_TRUE(consumer_handle.dispatcher->HasOneRef()); |
| 468 consumer_handle.reset(); | 468 consumer_handle.reset(); |
| 469 } | 469 } |
| 470 EXPECT_EQ(MOJO_RESULT_OK, | 470 EXPECT_EQ(MOJO_RESULT_OK, |
| 471 waiter.Wait(test::ActionTimeout(), &context, nullptr)); | 471 waiter.Wait(test::ActionTimeout(), &context, nullptr)); |
| 472 EXPECT_EQ(123u, context); | 472 EXPECT_EQ(123u, context); |
| 473 hss = HandleSignalsState(); | 473 hss = HandleSignalsState(); |
| 474 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); | 474 message_pipe(1)->RemoveAwakable(0, false, &waiter, 0, &hss); |
| 475 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 475 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 476 hss.satisfied_signals); | 476 hss.satisfied_signals); |
| 477 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | | 477 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 478 MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 478 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 479 hss.satisfiable_signals); | 479 hss.satisfiable_signals); |
| 480 EXPECT_EQ(MOJO_RESULT_OK, | 480 EXPECT_EQ(MOJO_RESULT_OK, |
| 481 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer), | 481 message_pipe(1)->ReadMessage(0, UserPointer<void>(read_buffer), |
| 482 MakeUserPointer(&read_buffer_size), | 482 MakeUserPointer(&read_buffer_size), |
| 483 &read_handles, &read_num_handles, | 483 &read_handles, &read_num_handles, |
| 484 MOJO_READ_MESSAGE_FLAG_NONE)); | 484 MOJO_READ_MESSAGE_FLAG_NONE)); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 500 // Now actually write the data, complete the two-phase write, and close the | 500 // Now actually write the data, complete the two-phase write, and close the |
| 501 // producer. | 501 // producer. |
| 502 *static_cast<int32_t*>(write_ptr) = 789012; | 502 *static_cast<int32_t*>(write_ptr) = 789012; |
| 503 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( | 503 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( |
| 504 static_cast<uint32_t>(1u * sizeof(int32_t)))); | 504 static_cast<uint32_t>(1u * sizeof(int32_t)))); |
| 505 dp->ProducerClose(); | 505 dp->ProducerClose(); |
| 506 | 506 |
| 507 // Wait for the consumer to know that the producer is closed. | 507 // Wait for the consumer to know that the producer is closed. |
| 508 waiter.Init(); | 508 waiter.Init(); |
| 509 hss = HandleSignalsState(); | 509 hss = HandleSignalsState(); |
| 510 MojoResult result = | 510 MojoResult result = consumer->AddAwakable( |
| 511 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 456, &hss); | 511 &waiter, 456, false, MOJO_HANDLE_SIGNAL_PEER_CLOSED, &hss); |
| 512 if (result == MOJO_RESULT_OK) { | 512 if (result == MOJO_RESULT_OK) { |
| 513 context = 0; | 513 context = 0; |
| 514 EXPECT_EQ(MOJO_RESULT_OK, | 514 EXPECT_EQ(MOJO_RESULT_OK, |
| 515 waiter.Wait(test::ActionTimeout(), &context, nullptr)); | 515 waiter.Wait(test::ActionTimeout(), &context, nullptr)); |
| 516 EXPECT_EQ(456u, context); | 516 EXPECT_EQ(456u, context); |
| 517 consumer->RemoveAwakable(&waiter, &hss); | 517 consumer->RemoveAwakable(false, &waiter, 0, &hss); |
| 518 } else { | 518 } else { |
| 519 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); | 519 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS, result); |
| 520 } | 520 } |
| 521 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 521 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 522 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 522 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 523 hss.satisfied_signals); | 523 hss.satisfied_signals); |
| 524 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 524 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
| 525 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, | 525 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, |
| 526 hss.satisfiable_signals); | 526 hss.satisfiable_signals); |
| 527 | 527 |
| 528 // Read some elements. | 528 // Read some elements. |
| 529 int32_t elements[10] = {}; | 529 int32_t elements[10] = {}; |
| 530 num_bytes = static_cast<uint32_t>(sizeof(elements)); | 530 num_bytes = static_cast<uint32_t>(sizeof(elements)); |
| 531 EXPECT_EQ(MOJO_RESULT_OK, consumer->ReadData(UserPointer<void>(elements), | 531 EXPECT_EQ(MOJO_RESULT_OK, consumer->ReadData(UserPointer<void>(elements), |
| 532 MakeUserPointer(&num_bytes), | 532 MakeUserPointer(&num_bytes), |
| 533 MOJO_READ_DATA_FLAG_NONE)); | 533 MOJO_READ_DATA_FLAG_NONE)); |
| 534 EXPECT_EQ(2u * sizeof(elements[0]), num_bytes); | 534 EXPECT_EQ(2u * sizeof(elements[0]), num_bytes); |
| 535 EXPECT_EQ(123456, elements[0]); | 535 EXPECT_EQ(123456, elements[0]); |
| 536 EXPECT_EQ(789012, elements[1]); | 536 EXPECT_EQ(789012, elements[1]); |
| 537 EXPECT_EQ(0, elements[2]); | 537 EXPECT_EQ(0, elements[2]); |
| 538 | 538 |
| 539 consumer->Close(); | 539 consumer->Close(); |
| 540 } | 540 } |
| 541 | 541 |
| 542 } // namespace | 542 } // namespace |
| 543 } // namespace system | 543 } // namespace system |
| 544 } // namespace mojo | 544 } // namespace mojo |
| OLD | NEW |