| 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 <utility> | 10 #include <utility> |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 char read_buffer[100] = {}; | 167 char read_buffer[100] = {}; |
| 168 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 168 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 169 DispatcherVector read_dispatchers; | 169 DispatcherVector read_dispatchers; |
| 170 uint32_t read_num_dispatchers = 10; // Maximum to get. | 170 uint32_t read_num_dispatchers = 10; // Maximum to get. |
| 171 Waiter waiter; | 171 Waiter waiter; |
| 172 HandleSignalsState hss; | 172 HandleSignalsState hss; |
| 173 uint32_t context = 0; | 173 uint32_t context = 0; |
| 174 | 174 |
| 175 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); | 175 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); |
| 176 // This is the consumer dispatcher we'll send. | 176 // This is the consumer dispatcher we'll send. |
| 177 scoped_refptr<DataPipeConsumerDispatcher> consumer = | 177 auto consumer = DataPipeConsumerDispatcher::Create(); |
| 178 DataPipeConsumerDispatcher::Create(); | |
| 179 consumer->Init(dp.Clone()); | 178 consumer->Init(dp.Clone()); |
| 180 | 179 |
| 181 // Write to the producer and close it, before sending the consumer. | 180 // Write to the producer and close it, before sending the consumer. |
| 182 int32_t elements[10] = {123}; | 181 int32_t elements[10] = {123}; |
| 183 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); | 182 uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
| 184 EXPECT_EQ(MOJO_RESULT_OK, | 183 EXPECT_EQ(MOJO_RESULT_OK, |
| 185 dp->ProducerWriteData(UserPointer<const void>(elements), | 184 dp->ProducerWriteData(UserPointer<const void>(elements), |
| 186 MakeUserPointer(&num_bytes), false)); | 185 MakeUserPointer(&num_bytes), false)); |
| 187 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); | 186 EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); |
| 188 dp->ProducerClose(); | 187 dp->ProducerClose(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 201 | 200 |
| 202 std::vector<DispatcherTransport> transports; | 201 std::vector<DispatcherTransport> transports; |
| 203 transports.push_back(transport); | 202 transports.push_back(transport); |
| 204 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( | 203 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( |
| 205 0, NullUserPointer(), 0, &transports, | 204 0, NullUserPointer(), 0, &transports, |
| 206 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 205 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 207 transport.End(); | 206 transport.End(); |
| 208 | 207 |
| 209 // |consumer| should have been closed. This is |DCHECK()|ed when it is | 208 // |consumer| should have been closed. This is |DCHECK()|ed when it is |
| 210 // destroyed. | 209 // destroyed. |
| 211 EXPECT_TRUE(consumer->HasOneRef()); | 210 consumer->AssertHasOneRef(); |
| 212 consumer = nullptr; | 211 consumer = nullptr; |
| 213 } | 212 } |
| 214 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); | 213 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); |
| 215 EXPECT_EQ(123u, context); | 214 EXPECT_EQ(123u, context); |
| 216 hss = HandleSignalsState(); | 215 hss = HandleSignalsState(); |
| 217 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); | 216 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); |
| 218 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 217 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 219 hss.satisfied_signals); | 218 hss.satisfied_signals); |
| 220 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 219 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 221 EXPECT_EQ(MOJO_RESULT_OK, | 220 EXPECT_EQ(MOJO_RESULT_OK, |
| 222 message_pipe(1)->ReadMessage( | 221 message_pipe(1)->ReadMessage( |
| 223 0, UserPointer<void>(read_buffer), | 222 0, UserPointer<void>(read_buffer), |
| 224 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 223 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
| 225 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); | 224 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); |
| 226 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); | 225 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); |
| 227 EXPECT_EQ(1u, read_dispatchers.size()); | 226 EXPECT_EQ(1u, read_dispatchers.size()); |
| 228 EXPECT_EQ(1u, read_num_dispatchers); | 227 EXPECT_EQ(1u, read_num_dispatchers); |
| 229 ASSERT_TRUE(read_dispatchers[0]); | 228 ASSERT_TRUE(read_dispatchers[0]); |
| 230 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); | 229 read_dispatchers[0]->AssertHasOneRef(); |
| 231 | 230 |
| 232 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, | 231 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, |
| 233 read_dispatchers[0]->GetType()); | 232 read_dispatchers[0]->GetType()); |
| 234 consumer = | 233 consumer = RefPtr<DataPipeConsumerDispatcher>( |
| 235 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get()); | 234 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get())); |
| 236 read_dispatchers.clear(); | 235 read_dispatchers.clear(); |
| 237 | 236 |
| 238 waiter.Init(); | 237 waiter.Init(); |
| 239 hss = HandleSignalsState(); | 238 hss = HandleSignalsState(); |
| 240 MojoResult result = | 239 MojoResult result = |
| 241 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, &hss); | 240 consumer->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, &hss); |
| 242 if (result == MOJO_RESULT_OK) { | 241 if (result == MOJO_RESULT_OK) { |
| 243 context = 0; | 242 context = 0; |
| 244 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); | 243 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); |
| 245 EXPECT_EQ(456u, context); | 244 EXPECT_EQ(456u, context); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 char read_buffer[100] = {}; | 284 char read_buffer[100] = {}; |
| 286 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 285 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 287 DispatcherVector read_dispatchers; | 286 DispatcherVector read_dispatchers; |
| 288 uint32_t read_num_dispatchers = 10; // Maximum to get. | 287 uint32_t read_num_dispatchers = 10; // Maximum to get. |
| 289 Waiter waiter; | 288 Waiter waiter; |
| 290 HandleSignalsState hss; | 289 HandleSignalsState hss; |
| 291 uint32_t context = 0; | 290 uint32_t context = 0; |
| 292 | 291 |
| 293 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); | 292 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); |
| 294 // This is the consumer dispatcher we'll send. | 293 // This is the consumer dispatcher we'll send. |
| 295 scoped_refptr<DataPipeConsumerDispatcher> consumer = | 294 auto consumer = DataPipeConsumerDispatcher::Create(); |
| 296 DataPipeConsumerDispatcher::Create(); | |
| 297 consumer->Init(dp.Clone()); | 295 consumer->Init(dp.Clone()); |
| 298 | 296 |
| 299 void* write_ptr = nullptr; | 297 void* write_ptr = nullptr; |
| 300 uint32_t num_bytes = 0u; | 298 uint32_t num_bytes = 0u; |
| 301 EXPECT_EQ(MOJO_RESULT_OK, | 299 EXPECT_EQ(MOJO_RESULT_OK, |
| 302 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 300 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 303 MakeUserPointer(&num_bytes))); | 301 MakeUserPointer(&num_bytes))); |
| 304 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); | 302 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); |
| 305 | 303 |
| 306 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). | 304 // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0). |
| (...skipping 10 matching lines...) Expand all Loading... |
| 317 | 315 |
| 318 std::vector<DispatcherTransport> transports; | 316 std::vector<DispatcherTransport> transports; |
| 319 transports.push_back(transport); | 317 transports.push_back(transport); |
| 320 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( | 318 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( |
| 321 0, NullUserPointer(), 0, &transports, | 319 0, NullUserPointer(), 0, &transports, |
| 322 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 320 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 323 transport.End(); | 321 transport.End(); |
| 324 | 322 |
| 325 // |consumer| should have been closed. This is |DCHECK()|ed when it is | 323 // |consumer| should have been closed. This is |DCHECK()|ed when it is |
| 326 // destroyed. | 324 // destroyed. |
| 327 EXPECT_TRUE(consumer->HasOneRef()); | 325 consumer->AssertHasOneRef(); |
| 328 consumer = nullptr; | 326 consumer = nullptr; |
| 329 } | 327 } |
| 330 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); | 328 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); |
| 331 EXPECT_EQ(123u, context); | 329 EXPECT_EQ(123u, context); |
| 332 hss = HandleSignalsState(); | 330 hss = HandleSignalsState(); |
| 333 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); | 331 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); |
| 334 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 332 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 335 hss.satisfied_signals); | 333 hss.satisfied_signals); |
| 336 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 334 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 337 EXPECT_EQ(MOJO_RESULT_OK, | 335 EXPECT_EQ(MOJO_RESULT_OK, |
| 338 message_pipe(1)->ReadMessage( | 336 message_pipe(1)->ReadMessage( |
| 339 0, UserPointer<void>(read_buffer), | 337 0, UserPointer<void>(read_buffer), |
| 340 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 338 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
| 341 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); | 339 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); |
| 342 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); | 340 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); |
| 343 EXPECT_EQ(1u, read_dispatchers.size()); | 341 EXPECT_EQ(1u, read_dispatchers.size()); |
| 344 EXPECT_EQ(1u, read_num_dispatchers); | 342 EXPECT_EQ(1u, read_num_dispatchers); |
| 345 ASSERT_TRUE(read_dispatchers[0]); | 343 ASSERT_TRUE(read_dispatchers[0]); |
| 346 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); | 344 read_dispatchers[0]->AssertHasOneRef(); |
| 347 | 345 |
| 348 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, | 346 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, |
| 349 read_dispatchers[0]->GetType()); | 347 read_dispatchers[0]->GetType()); |
| 350 consumer = | 348 consumer = RefPtr<DataPipeConsumerDispatcher>( |
| 351 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get()); | 349 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get())); |
| 352 read_dispatchers.clear(); | 350 read_dispatchers.clear(); |
| 353 | 351 |
| 354 // Now actually write the data, complete the two-phase write, and close the | 352 // Now actually write the data, complete the two-phase write, and close the |
| 355 // producer. | 353 // producer. |
| 356 *static_cast<int32_t*>(write_ptr) = 123456; | 354 *static_cast<int32_t*>(write_ptr) = 123456; |
| 357 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( | 355 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( |
| 358 static_cast<uint32_t>(1u * sizeof(int32_t)))); | 356 static_cast<uint32_t>(1u * sizeof(int32_t)))); |
| 359 dp->ProducerClose(); | 357 dp->ProducerClose(); |
| 360 | 358 |
| 361 // Wait for the consumer to be readable. | 359 // Wait for the consumer to be readable. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 char read_buffer[100] = {}; | 393 char read_buffer[100] = {}; |
| 396 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 394 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
| 397 DispatcherVector read_dispatchers; | 395 DispatcherVector read_dispatchers; |
| 398 uint32_t read_num_dispatchers = 10; // Maximum to get. | 396 uint32_t read_num_dispatchers = 10; // Maximum to get. |
| 399 Waiter waiter; | 397 Waiter waiter; |
| 400 HandleSignalsState hss; | 398 HandleSignalsState hss; |
| 401 uint32_t context = 0; | 399 uint32_t context = 0; |
| 402 | 400 |
| 403 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); | 401 RefPtr<DataPipe> dp(CreateLocal(sizeof(int32_t), 1000)); |
| 404 // This is the consumer dispatcher we'll send. | 402 // This is the consumer dispatcher we'll send. |
| 405 scoped_refptr<DataPipeConsumerDispatcher> consumer = | 403 auto consumer = DataPipeConsumerDispatcher::Create(); |
| 406 DataPipeConsumerDispatcher::Create(); | |
| 407 consumer->Init(dp.Clone()); | 404 consumer->Init(dp.Clone()); |
| 408 | 405 |
| 409 void* write_ptr = nullptr; | 406 void* write_ptr = nullptr; |
| 410 uint32_t num_bytes = 0u; | 407 uint32_t num_bytes = 0u; |
| 411 EXPECT_EQ(MOJO_RESULT_OK, | 408 EXPECT_EQ(MOJO_RESULT_OK, |
| 412 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), | 409 dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr), |
| 413 MakeUserPointer(&num_bytes))); | 410 MakeUserPointer(&num_bytes))); |
| 414 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); | 411 ASSERT_GE(num_bytes, 1u * sizeof(int32_t)); |
| 415 *static_cast<int32_t*>(write_ptr) = 123456; | 412 *static_cast<int32_t*>(write_ptr) = 123456; |
| 416 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( | 413 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( |
| (...skipping 20 matching lines...) Expand all Loading... |
| 437 | 434 |
| 438 std::vector<DispatcherTransport> transports; | 435 std::vector<DispatcherTransport> transports; |
| 439 transports.push_back(transport); | 436 transports.push_back(transport); |
| 440 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( | 437 EXPECT_EQ(MOJO_RESULT_OK, message_pipe(0)->WriteMessage( |
| 441 0, NullUserPointer(), 0, &transports, | 438 0, NullUserPointer(), 0, &transports, |
| 442 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 439 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
| 443 transport.End(); | 440 transport.End(); |
| 444 | 441 |
| 445 // |consumer| should have been closed. This is |DCHECK()|ed when it is | 442 // |consumer| should have been closed. This is |DCHECK()|ed when it is |
| 446 // destroyed. | 443 // destroyed. |
| 447 EXPECT_TRUE(consumer->HasOneRef()); | 444 consumer->AssertHasOneRef(); |
| 448 consumer = nullptr; | 445 consumer = nullptr; |
| 449 } | 446 } |
| 450 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); | 447 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::ActionDeadline(), &context)); |
| 451 EXPECT_EQ(123u, context); | 448 EXPECT_EQ(123u, context); |
| 452 hss = HandleSignalsState(); | 449 hss = HandleSignalsState(); |
| 453 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); | 450 message_pipe(1)->RemoveAwakable(0, &waiter, &hss); |
| 454 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 451 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
| 455 hss.satisfied_signals); | 452 hss.satisfied_signals); |
| 456 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 453 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); |
| 457 EXPECT_EQ(MOJO_RESULT_OK, | 454 EXPECT_EQ(MOJO_RESULT_OK, |
| 458 message_pipe(1)->ReadMessage( | 455 message_pipe(1)->ReadMessage( |
| 459 0, UserPointer<void>(read_buffer), | 456 0, UserPointer<void>(read_buffer), |
| 460 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 457 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
| 461 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); | 458 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); |
| 462 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); | 459 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); |
| 463 EXPECT_EQ(1u, read_dispatchers.size()); | 460 EXPECT_EQ(1u, read_dispatchers.size()); |
| 464 EXPECT_EQ(1u, read_num_dispatchers); | 461 EXPECT_EQ(1u, read_num_dispatchers); |
| 465 ASSERT_TRUE(read_dispatchers[0]); | 462 ASSERT_TRUE(read_dispatchers[0]); |
| 466 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); | 463 read_dispatchers[0]->AssertHasOneRef(); |
| 467 | 464 |
| 468 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, | 465 EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, |
| 469 read_dispatchers[0]->GetType()); | 466 read_dispatchers[0]->GetType()); |
| 470 consumer = | 467 consumer = RefPtr<DataPipeConsumerDispatcher>( |
| 471 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get()); | 468 static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get())); |
| 472 read_dispatchers.clear(); | 469 read_dispatchers.clear(); |
| 473 | 470 |
| 474 // Now actually write the data, complete the two-phase write, and close the | 471 // Now actually write the data, complete the two-phase write, and close the |
| 475 // producer. | 472 // producer. |
| 476 *static_cast<int32_t*>(write_ptr) = 789012; | 473 *static_cast<int32_t*>(write_ptr) = 789012; |
| 477 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( | 474 EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData( |
| 478 static_cast<uint32_t>(1u * sizeof(int32_t)))); | 475 static_cast<uint32_t>(1u * sizeof(int32_t)))); |
| 479 dp->ProducerClose(); | 476 dp->ProducerClose(); |
| 480 | 477 |
| 481 // Wait for the consumer to know that the producer is closed. | 478 // Wait for the consumer to know that the producer is closed. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 506 EXPECT_EQ(123456, elements[0]); | 503 EXPECT_EQ(123456, elements[0]); |
| 507 EXPECT_EQ(789012, elements[1]); | 504 EXPECT_EQ(789012, elements[1]); |
| 508 EXPECT_EQ(0, elements[2]); | 505 EXPECT_EQ(0, elements[2]); |
| 509 | 506 |
| 510 consumer->Close(); | 507 consumer->Close(); |
| 511 } | 508 } |
| 512 | 509 |
| 513 } // namespace | 510 } // namespace |
| 514 } // namespace system | 511 } // namespace system |
| 515 } // namespace mojo | 512 } // namespace mojo |
| OLD | NEW |