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 contains tests that are shared between different implementations of | 5 // This file contains tests that are shared between different implementations of |
6 // |DataPipeImpl|. | 6 // |DataPipeImpl|. |
7 | 7 |
8 #include "mojo/edk/system/data_pipe_impl.h" | 8 #include "mojo/edk/system/data_pipe_impl.h" |
9 | 9 |
10 #include <stdint.h> | 10 #include <stdint.h> |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 | 248 |
249 void Create(const MojoCreateDataPipeOptions& validated_options) override { | 249 void Create(const MojoCreateDataPipeOptions& validated_options) override { |
250 CHECK(!dp_); | 250 CHECK(!dp_); |
251 dp_ = DataPipe::CreateLocal(validated_options); | 251 dp_ = DataPipe::CreateLocal(validated_options); |
252 } | 252 } |
253 | 253 |
254 bool IsStrictCircularBuffer() const override { return false; } | 254 bool IsStrictCircularBuffer() const override { return false; } |
255 | 255 |
256 protected: | 256 protected: |
257 void SendDispatcher(size_t source_i, | 257 void SendDispatcher(size_t source_i, |
258 scoped_refptr<Dispatcher> to_send, | 258 RefPtr<Dispatcher> to_send, |
259 scoped_refptr<Dispatcher>* to_receive) { | 259 RefPtr<Dispatcher>* to_receive) { |
260 DCHECK(source_i == 0 || source_i == 1); | 260 DCHECK(source_i == 0 || source_i == 1); |
261 size_t dest_i = source_i ^ 1; | 261 size_t dest_i = source_i ^ 1; |
262 | 262 |
263 // Write the dispatcher to MP |source_i| (port 0). Wait and receive on MP | 263 // Write the dispatcher to MP |source_i| (port 0). Wait and receive on MP |
264 // |dest_i| (port 0). (Add the waiter first, to avoid any handling the case | 264 // |dest_i| (port 0). (Add the waiter first, to avoid any handling the case |
265 // where it's already readable.) | 265 // where it's already readable.) |
266 Waiter waiter; | 266 Waiter waiter; |
267 waiter.Init(); | 267 waiter.Init(); |
268 ASSERT_EQ(MOJO_RESULT_OK, | 268 ASSERT_EQ(MOJO_RESULT_OK, |
269 message_pipe(dest_i)->AddAwakable( | 269 message_pipe(dest_i)->AddAwakable( |
(...skipping 24 matching lines...) Expand all Loading... |
294 uint32_t read_num_dispatchers = 10; // Maximum to get. | 294 uint32_t read_num_dispatchers = 10; // Maximum to get. |
295 ASSERT_EQ(MOJO_RESULT_OK, | 295 ASSERT_EQ(MOJO_RESULT_OK, |
296 message_pipe(dest_i)->ReadMessage( | 296 message_pipe(dest_i)->ReadMessage( |
297 0, UserPointer<void>(read_buffer), | 297 0, UserPointer<void>(read_buffer), |
298 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 298 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
299 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); | 299 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); |
300 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); | 300 EXPECT_EQ(0u, static_cast<size_t>(read_buffer_size)); |
301 ASSERT_EQ(1u, read_dispatchers.size()); | 301 ASSERT_EQ(1u, read_dispatchers.size()); |
302 ASSERT_EQ(1u, read_num_dispatchers); | 302 ASSERT_EQ(1u, read_num_dispatchers); |
303 ASSERT_TRUE(read_dispatchers[0]); | 303 ASSERT_TRUE(read_dispatchers[0]); |
304 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); | 304 read_dispatchers[0]->AssertHasOneRef(); |
305 | 305 |
306 *to_receive = read_dispatchers[0]; | 306 *to_receive = read_dispatchers[0]; |
307 } | 307 } |
308 | 308 |
309 RefPtr<MessagePipe> message_pipe(size_t i) { return message_pipes_[i]; } | 309 RefPtr<MessagePipe> message_pipe(size_t i) { return message_pipes_[i]; } |
310 RefPtr<DataPipe> dp() { return dp_; } | 310 RefPtr<DataPipe> dp() { return dp_; } |
311 | 311 |
312 private: | 312 private: |
313 void EnsureMessagePipeClosed(size_t i) { | 313 void EnsureMessagePipeClosed(size_t i) { |
314 if (!message_pipes_[i]) | 314 if (!message_pipes_[i]) |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 // i.e., |dp_| will have a |RemoteProducerDataPipeImpl|. The remote side, of | 361 // i.e., |dp_| will have a |RemoteProducerDataPipeImpl|. The remote side, of |
362 // course, will have a |RemoteConsumerDataPipeImpl|. | 362 // course, will have a |RemoteConsumerDataPipeImpl|. |
363 class RemoteProducerDataPipeImplTestHelper | 363 class RemoteProducerDataPipeImplTestHelper |
364 : public RemoteDataPipeImplTestHelper { | 364 : public RemoteDataPipeImplTestHelper { |
365 public: | 365 public: |
366 RemoteProducerDataPipeImplTestHelper() {} | 366 RemoteProducerDataPipeImplTestHelper() {} |
367 ~RemoteProducerDataPipeImplTestHelper() override {} | 367 ~RemoteProducerDataPipeImplTestHelper() override {} |
368 | 368 |
369 void DoTransfer() override { | 369 void DoTransfer() override { |
370 // This is the producer dispatcher we'll send. | 370 // This is the producer dispatcher we'll send. |
371 scoped_refptr<DataPipeProducerDispatcher> to_send = | 371 auto to_send = DataPipeProducerDispatcher::Create(); |
372 DataPipeProducerDispatcher::Create(); | |
373 to_send->Init(dp()); | 372 to_send->Init(dp()); |
374 scoped_refptr<Dispatcher> to_receive; | 373 RefPtr<Dispatcher> to_receive; |
375 SendDispatcher(0, to_send, &to_receive); | 374 SendDispatcher(0, to_send, &to_receive); |
376 // |to_send| should have been closed. This is |DCHECK()|ed when it is | 375 // |to_send| should have been closed. This is |DCHECK()|ed when it is |
377 // destroyed. | 376 // destroyed. |
378 EXPECT_TRUE(to_send->HasOneRef()); | 377 to_send->AssertHasOneRef(); |
379 to_send = nullptr; | 378 to_send = nullptr; |
380 | 379 |
381 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); | 380 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); |
382 producer_dispatcher_ = | 381 producer_dispatcher_ = RefPtr<DataPipeProducerDispatcher>( |
383 static_cast<DataPipeProducerDispatcher*>(to_receive.get()); | 382 static_cast<DataPipeProducerDispatcher*>(to_receive.get())); |
384 } | 383 } |
385 | 384 |
386 DataPipe* DataPipeForProducer() override { | 385 DataPipe* DataPipeForProducer() override { |
387 if (producer_dispatcher_) | 386 if (producer_dispatcher_) |
388 return producer_dispatcher_->GetDataPipeForTest(); | 387 return producer_dispatcher_->GetDataPipeForTest(); |
389 return dp().get(); | 388 return dp().get(); |
390 } | 389 } |
391 DataPipe* DataPipeForConsumer() override { return dp().get(); } | 390 DataPipe* DataPipeForConsumer() override { return dp().get(); } |
392 | 391 |
393 void ProducerClose() override { | 392 void ProducerClose() override { |
394 if (producer_dispatcher_) | 393 if (producer_dispatcher_) |
395 ASSERT_EQ(MOJO_RESULT_OK, producer_dispatcher_->Close()); | 394 ASSERT_EQ(MOJO_RESULT_OK, producer_dispatcher_->Close()); |
396 else | 395 else |
397 dp()->ProducerClose(); | 396 dp()->ProducerClose(); |
398 } | 397 } |
399 void ConsumerClose() override { dp()->ConsumerClose(); } | 398 void ConsumerClose() override { dp()->ConsumerClose(); } |
400 | 399 |
401 protected: | 400 protected: |
402 scoped_refptr<DataPipeProducerDispatcher> producer_dispatcher_; | 401 RefPtr<DataPipeProducerDispatcher> producer_dispatcher_; |
403 | 402 |
404 private: | 403 private: |
405 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteProducerDataPipeImplTestHelper); | 404 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteProducerDataPipeImplTestHelper); |
406 }; | 405 }; |
407 | 406 |
408 // RemoteConsumerDataPipeImplTestHelper ---------------------------------------- | 407 // RemoteConsumerDataPipeImplTestHelper ---------------------------------------- |
409 | 408 |
410 // Note about naming confusion: This class is named after the "local" class, | 409 // Note about naming confusion: This class is named after the "local" class, |
411 // i.e., |dp_| will have a |RemoteConsumerDataPipeImpl|. The remote side, of | 410 // i.e., |dp_| will have a |RemoteConsumerDataPipeImpl|. The remote side, of |
412 // course, will have a |RemoteProducerDataPipeImpl|. | 411 // course, will have a |RemoteProducerDataPipeImpl|. |
413 class RemoteConsumerDataPipeImplTestHelper | 412 class RemoteConsumerDataPipeImplTestHelper |
414 : public RemoteDataPipeImplTestHelper { | 413 : public RemoteDataPipeImplTestHelper { |
415 public: | 414 public: |
416 RemoteConsumerDataPipeImplTestHelper() {} | 415 RemoteConsumerDataPipeImplTestHelper() {} |
417 ~RemoteConsumerDataPipeImplTestHelper() override {} | 416 ~RemoteConsumerDataPipeImplTestHelper() override {} |
418 | 417 |
419 void DoTransfer() override { | 418 void DoTransfer() override { |
420 // This is the consumer dispatcher we'll send. | 419 // This is the consumer dispatcher we'll send. |
421 scoped_refptr<DataPipeConsumerDispatcher> to_send = | 420 auto to_send = DataPipeConsumerDispatcher::Create(); |
422 DataPipeConsumerDispatcher::Create(); | |
423 to_send->Init(dp()); | 421 to_send->Init(dp()); |
424 scoped_refptr<Dispatcher> to_receive; | 422 RefPtr<Dispatcher> to_receive; |
425 SendDispatcher(0, to_send, &to_receive); | 423 SendDispatcher(0, to_send, &to_receive); |
426 // |to_send| should have been closed. This is |DCHECK()|ed when it is | 424 // |to_send| should have been closed. This is |DCHECK()|ed when it is |
427 // destroyed. | 425 // destroyed. |
428 EXPECT_TRUE(to_send->HasOneRef()); | 426 to_send->AssertHasOneRef(); |
429 to_send = nullptr; | 427 to_send = nullptr; |
430 | 428 |
431 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); | 429 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); |
432 consumer_dispatcher_ = | 430 consumer_dispatcher_ = RefPtr<DataPipeConsumerDispatcher>( |
433 static_cast<DataPipeConsumerDispatcher*>(to_receive.get()); | 431 static_cast<DataPipeConsumerDispatcher*>(to_receive.get())); |
434 } | 432 } |
435 | 433 |
436 DataPipe* DataPipeForProducer() override { return dp().get(); } | 434 DataPipe* DataPipeForProducer() override { return dp().get(); } |
437 DataPipe* DataPipeForConsumer() override { | 435 DataPipe* DataPipeForConsumer() override { |
438 if (consumer_dispatcher_) | 436 if (consumer_dispatcher_) |
439 return consumer_dispatcher_->GetDataPipeForTest(); | 437 return consumer_dispatcher_->GetDataPipeForTest(); |
440 return dp().get(); | 438 return dp().get(); |
441 } | 439 } |
442 | 440 |
443 void ProducerClose() override { dp()->ProducerClose(); } | 441 void ProducerClose() override { dp()->ProducerClose(); } |
444 void ConsumerClose() override { | 442 void ConsumerClose() override { |
445 if (consumer_dispatcher_) | 443 if (consumer_dispatcher_) |
446 ASSERT_EQ(MOJO_RESULT_OK, consumer_dispatcher_->Close()); | 444 ASSERT_EQ(MOJO_RESULT_OK, consumer_dispatcher_->Close()); |
447 else | 445 else |
448 dp()->ConsumerClose(); | 446 dp()->ConsumerClose(); |
449 } | 447 } |
450 | 448 |
451 protected: | 449 protected: |
452 scoped_refptr<DataPipeConsumerDispatcher> consumer_dispatcher_; | 450 RefPtr<DataPipeConsumerDispatcher> consumer_dispatcher_; |
453 | 451 |
454 private: | 452 private: |
455 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteConsumerDataPipeImplTestHelper); | 453 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteConsumerDataPipeImplTestHelper); |
456 }; | 454 }; |
457 | 455 |
458 // RemoteProducerDataPipeImplTestHelper2 --------------------------------------- | 456 // RemoteProducerDataPipeImplTestHelper2 --------------------------------------- |
459 | 457 |
460 // This is like |RemoteProducerDataPipeImplTestHelper|, but |DoTransfer()| does | 458 // This is like |RemoteProducerDataPipeImplTestHelper|, but |DoTransfer()| does |
461 // a second transfer. This thus tests passing a producer handle twice, and in | 459 // a second transfer. This thus tests passing a producer handle twice, and in |
462 // particular tests (some of) |RemoteConsumerDataPipeImpl|'s | 460 // particular tests (some of) |RemoteConsumerDataPipeImpl|'s |
463 // |ProducerEndSerialize()| (instead of |LocalDataPipeImpl|'s). | 461 // |ProducerEndSerialize()| (instead of |LocalDataPipeImpl|'s). |
464 // | 462 // |
465 // Note about naming confusion: This class is named after the "local" class, | 463 // Note about naming confusion: This class is named after the "local" class, |
466 // i.e., |dp_| will have a |RemoteProducerDataPipeImpl|. The remote side, of | 464 // i.e., |dp_| will have a |RemoteProducerDataPipeImpl|. The remote side, of |
467 // course, will have a |RemoteConsumerDataPipeImpl|. | 465 // course, will have a |RemoteConsumerDataPipeImpl|. |
468 class RemoteProducerDataPipeImplTestHelper2 | 466 class RemoteProducerDataPipeImplTestHelper2 |
469 : public RemoteProducerDataPipeImplTestHelper { | 467 : public RemoteProducerDataPipeImplTestHelper { |
470 public: | 468 public: |
471 RemoteProducerDataPipeImplTestHelper2() {} | 469 RemoteProducerDataPipeImplTestHelper2() {} |
472 ~RemoteProducerDataPipeImplTestHelper2() override {} | 470 ~RemoteProducerDataPipeImplTestHelper2() override {} |
473 | 471 |
474 void DoTransfer() override { | 472 void DoTransfer() override { |
475 // This is the producer dispatcher we'll send. | 473 // This is the producer dispatcher we'll send. |
476 scoped_refptr<DataPipeProducerDispatcher> to_send = | 474 auto to_send = DataPipeProducerDispatcher::Create(); |
477 DataPipeProducerDispatcher::Create(); | |
478 to_send->Init(dp()); | 475 to_send->Init(dp()); |
479 scoped_refptr<Dispatcher> to_receive; | 476 RefPtr<Dispatcher> to_receive; |
480 SendDispatcher(0, to_send, &to_receive); | 477 SendDispatcher(0, to_send, &to_receive); |
481 // |to_send| should have been closed. This is |DCHECK()|ed when it is | 478 // |to_send| should have been closed. This is |DCHECK()|ed when it is |
482 // destroyed. | 479 // destroyed. |
483 EXPECT_TRUE(to_send->HasOneRef()); | 480 to_send->AssertHasOneRef(); |
484 to_send = nullptr; | 481 to_send = nullptr; |
485 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); | 482 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); |
486 to_send = static_cast<DataPipeProducerDispatcher*>(to_receive.get()); | 483 to_send = RefPtr<DataPipeProducerDispatcher>( |
| 484 static_cast<DataPipeProducerDispatcher*>(to_receive.get())); |
487 to_receive = nullptr; | 485 to_receive = nullptr; |
488 | 486 |
489 // Now send it back the other way. | 487 // Now send it back the other way. |
490 SendDispatcher(1, to_send, &to_receive); | 488 SendDispatcher(1, to_send, &to_receive); |
491 // |producer_dispatcher_| should have been closed. This is |DCHECK()|ed when | 489 // |producer_dispatcher_| should have been closed. This is |DCHECK()|ed when |
492 // it is destroyed. | 490 // it is destroyed. |
493 EXPECT_TRUE(to_send->HasOneRef()); | 491 to_send->AssertHasOneRef(); |
494 to_send = nullptr; | 492 to_send = nullptr; |
495 | 493 |
496 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); | 494 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType()); |
497 producer_dispatcher_ = | 495 producer_dispatcher_ = RefPtr<DataPipeProducerDispatcher>( |
498 static_cast<DataPipeProducerDispatcher*>(to_receive.get()); | 496 static_cast<DataPipeProducerDispatcher*>(to_receive.get())); |
499 } | 497 } |
500 | 498 |
501 private: | 499 private: |
502 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteProducerDataPipeImplTestHelper2); | 500 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteProducerDataPipeImplTestHelper2); |
503 }; | 501 }; |
504 | 502 |
505 // RemoteConsumerDataPipeImplTestHelper2 --------------------------------------- | 503 // RemoteConsumerDataPipeImplTestHelper2 --------------------------------------- |
506 | 504 |
507 // This is like |RemoteConsumerDataPipeImplTestHelper|, but |DoTransfer()| does | 505 // This is like |RemoteConsumerDataPipeImplTestHelper|, but |DoTransfer()| does |
508 // a second transfer. This thus tests passing a consumer handle twice, and in | 506 // a second transfer. This thus tests passing a consumer handle twice, and in |
509 // particular tests (some of) |RemoteProducerDataPipeImpl|'s | 507 // particular tests (some of) |RemoteProducerDataPipeImpl|'s |
510 // |ConsumerEndSerialize()| (instead of |LocalDataPipeImpl|'s). | 508 // |ConsumerEndSerialize()| (instead of |LocalDataPipeImpl|'s). |
511 // | 509 // |
512 // Note about naming confusion: This class is named after the "local" class, | 510 // Note about naming confusion: This class is named after the "local" class, |
513 // i.e., |dp_| will have a |RemoteConsumerDataPipeImpl|. The remote side, of | 511 // i.e., |dp_| will have a |RemoteConsumerDataPipeImpl|. The remote side, of |
514 // course, will have a |RemoteProducerDataPipeImpl|. | 512 // course, will have a |RemoteProducerDataPipeImpl|. |
515 class RemoteConsumerDataPipeImplTestHelper2 | 513 class RemoteConsumerDataPipeImplTestHelper2 |
516 : public RemoteConsumerDataPipeImplTestHelper { | 514 : public RemoteConsumerDataPipeImplTestHelper { |
517 public: | 515 public: |
518 RemoteConsumerDataPipeImplTestHelper2() {} | 516 RemoteConsumerDataPipeImplTestHelper2() {} |
519 ~RemoteConsumerDataPipeImplTestHelper2() override {} | 517 ~RemoteConsumerDataPipeImplTestHelper2() override {} |
520 | 518 |
521 void DoTransfer() override { | 519 void DoTransfer() override { |
522 // This is the consumer dispatcher we'll send. | 520 // This is the consumer dispatcher we'll send. |
523 scoped_refptr<DataPipeConsumerDispatcher> to_send = | 521 auto to_send = DataPipeConsumerDispatcher::Create(); |
524 DataPipeConsumerDispatcher::Create(); | |
525 to_send->Init(dp()); | 522 to_send->Init(dp()); |
526 scoped_refptr<Dispatcher> to_receive; | 523 RefPtr<Dispatcher> to_receive; |
527 SendDispatcher(0, to_send, &to_receive); | 524 SendDispatcher(0, to_send, &to_receive); |
528 // |to_send| should have been closed. This is |DCHECK()|ed when it is | 525 // |to_send| should have been closed. This is |DCHECK()|ed when it is |
529 // destroyed. | 526 // destroyed. |
530 EXPECT_TRUE(to_send->HasOneRef()); | 527 to_send->AssertHasOneRef(); |
531 to_send = nullptr; | 528 to_send = nullptr; |
532 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); | 529 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); |
533 to_send = static_cast<DataPipeConsumerDispatcher*>(to_receive.get()); | 530 to_send = RefPtr<DataPipeConsumerDispatcher>( |
| 531 static_cast<DataPipeConsumerDispatcher*>(to_receive.get())); |
534 to_receive = nullptr; | 532 to_receive = nullptr; |
535 | 533 |
536 // Now send it back the other way. | 534 // Now send it back the other way. |
537 SendDispatcher(1, to_send, &to_receive); | 535 SendDispatcher(1, to_send, &to_receive); |
538 // |consumer_dispatcher_| should have been closed. This is |DCHECK()|ed when | 536 // |consumer_dispatcher_| should have been closed. This is |DCHECK()|ed when |
539 // it is destroyed. | 537 // it is destroyed. |
540 EXPECT_TRUE(to_send->HasOneRef()); | 538 to_send->AssertHasOneRef(); |
541 to_send = nullptr; | 539 to_send = nullptr; |
542 | 540 |
543 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); | 541 ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType()); |
544 consumer_dispatcher_ = | 542 consumer_dispatcher_ = RefPtr<DataPipeConsumerDispatcher>( |
545 static_cast<DataPipeConsumerDispatcher*>(to_receive.get()); | 543 static_cast<DataPipeConsumerDispatcher*>(to_receive.get())); |
546 } | 544 } |
547 | 545 |
548 private: | 546 private: |
549 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteConsumerDataPipeImplTestHelper2); | 547 MOJO_DISALLOW_COPY_AND_ASSIGN(RemoteConsumerDataPipeImplTestHelper2); |
550 }; | 548 }; |
551 | 549 |
552 // Test case instantiation ----------------------------------------------------- | 550 // Test case instantiation ----------------------------------------------------- |
553 | 551 |
554 using HelperTypes = testing::Types<LocalDataPipeImplTestHelper, | 552 using HelperTypes = testing::Types<LocalDataPipeImplTestHelper, |
555 RemoteProducerDataPipeImplTestHelper, | 553 RemoteProducerDataPipeImplTestHelper, |
(...skipping 1939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2495 test::Sleep(10u); | 2493 test::Sleep(10u); |
2496 | 2494 |
2497 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(num_bytes)); | 2495 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(num_bytes)); |
2498 | 2496 |
2499 this->ConsumerClose(); | 2497 this->ConsumerClose(); |
2500 } | 2498 } |
2501 | 2499 |
2502 } // namespace | 2500 } // namespace |
2503 } // namespace system | 2501 } // namespace system |
2504 } // namespace mojo | 2502 } // namespace mojo |
OLD | NEW |