| 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 "base/message_loop/message_loop_test.h" | 5 #include "base/message_loop/message_loop_test.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/memory/ref_counted.h" | 13 #include "base/memory/ref_counted.h" |
| 14 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
| 15 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
| 16 #include "base/synchronization/waitable_event.h" | 16 #include "base/synchronization/waitable_event.h" |
| 17 #include "base/threading/thread.h" | 17 #include "base/threading/thread.h" |
| 18 #include "base/threading/thread_task_runner_handle.h" |
| 18 | 19 |
| 19 namespace base { | 20 namespace base { |
| 20 namespace test { | 21 namespace test { |
| 21 | 22 |
| 22 namespace { | 23 namespace { |
| 23 | 24 |
| 24 class Foo : public RefCounted<Foo> { | 25 class Foo : public RefCounted<Foo> { |
| 25 public: | 26 public: |
| 26 Foo() : test_count_(0) { | 27 Foo() : test_count_(0) { |
| 27 } | 28 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 } | 91 } |
| 91 | 92 |
| 92 } // namespace | 93 } // namespace |
| 93 | 94 |
| 94 void RunTest_PostTask(MessagePumpFactory factory) { | 95 void RunTest_PostTask(MessagePumpFactory factory) { |
| 95 std::unique_ptr<MessagePump> pump(factory()); | 96 std::unique_ptr<MessagePump> pump(factory()); |
| 96 MessageLoop loop(std::move(pump)); | 97 MessageLoop loop(std::move(pump)); |
| 97 // Add tests to message loop | 98 // Add tests to message loop |
| 98 scoped_refptr<Foo> foo(new Foo()); | 99 scoped_refptr<Foo> foo(new Foo()); |
| 99 std::string a("a"), b("b"), c("c"), d("d"); | 100 std::string a("a"), b("b"), c("c"), d("d"); |
| 100 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 101 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, Bind(&Foo::Test0, foo)); |
| 101 Bind(&Foo::Test0, foo)); | 102 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 102 MessageLoop::current()->task_runner()->PostTask( | 103 Bind(&Foo::Test1ConstRef, foo, a)); |
| 103 FROM_HERE, Bind(&Foo::Test1ConstRef, foo, a)); | 104 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 104 MessageLoop::current()->task_runner()->PostTask( | 105 Bind(&Foo::Test1Ptr, foo, &b)); |
| 105 FROM_HERE, Bind(&Foo::Test1Ptr, foo, &b)); | 106 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 106 MessageLoop::current()->task_runner()->PostTask( | 107 Bind(&Foo::Test1Int, foo, 100)); |
| 107 FROM_HERE, Bind(&Foo::Test1Int, foo, 100)); | 108 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 108 MessageLoop::current()->task_runner()->PostTask( | 109 Bind(&Foo::Test2Ptr, foo, &a, &c)); |
| 109 FROM_HERE, Bind(&Foo::Test2Ptr, foo, &a, &c)); | 110 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 110 MessageLoop::current()->task_runner()->PostTask( | 111 Bind(&Foo::Test2Mixed, foo, a, &d)); |
| 111 FROM_HERE, Bind(&Foo::Test2Mixed, foo, a, &d)); | |
| 112 // After all tests, post a message that will shut down the message loop | 112 // After all tests, post a message that will shut down the message loop |
| 113 MessageLoop::current()->task_runner()->PostTask( | 113 ThreadTaskRunnerHandle::Get()->PostTask( |
| 114 FROM_HERE, | 114 FROM_HERE, |
| 115 Bind(&MessageLoop::QuitWhenIdle, Unretained(MessageLoop::current()))); | 115 Bind(&MessageLoop::QuitWhenIdle, Unretained(MessageLoop::current()))); |
| 116 | 116 |
| 117 // Now kick things off | 117 // Now kick things off |
| 118 RunLoop().Run(); | 118 RunLoop().Run(); |
| 119 | 119 |
| 120 EXPECT_EQ(foo->test_count(), 105); | 120 EXPECT_EQ(foo->test_count(), 105); |
| 121 EXPECT_EQ(foo->result(), "abacad"); | 121 EXPECT_EQ(foo->result(), "abacad"); |
| 122 } | 122 } |
| 123 | 123 |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 : post_on_delete_(post_on_delete), was_deleted_(was_deleted) { | 295 : post_on_delete_(post_on_delete), was_deleted_(was_deleted) { |
| 296 } | 296 } |
| 297 void Run() {} | 297 void Run() {} |
| 298 | 298 |
| 299 private: | 299 private: |
| 300 friend class RefCounted<RecordDeletionProbe>; | 300 friend class RefCounted<RecordDeletionProbe>; |
| 301 | 301 |
| 302 ~RecordDeletionProbe() { | 302 ~RecordDeletionProbe() { |
| 303 *was_deleted_ = true; | 303 *was_deleted_ = true; |
| 304 if (post_on_delete_.get()) | 304 if (post_on_delete_.get()) |
| 305 MessageLoop::current()->task_runner()->PostTask( | 305 ThreadTaskRunnerHandle::Get()->PostTask( |
| 306 FROM_HERE, Bind(&RecordDeletionProbe::Run, post_on_delete_)); | 306 FROM_HERE, Bind(&RecordDeletionProbe::Run, post_on_delete_)); |
| 307 } | 307 } |
| 308 | 308 |
| 309 scoped_refptr<RecordDeletionProbe> post_on_delete_; | 309 scoped_refptr<RecordDeletionProbe> post_on_delete_; |
| 310 bool* was_deleted_; | 310 bool* was_deleted_; |
| 311 }; | 311 }; |
| 312 | 312 |
| 313 void RunTest_EnsureDeletion(MessagePumpFactory factory) { | 313 void RunTest_EnsureDeletion(MessagePumpFactory factory) { |
| 314 bool a_was_deleted = false; | 314 bool a_was_deleted = false; |
| 315 bool b_was_deleted = false; | 315 bool b_was_deleted = false; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 344 loop.task_runner()->PostTask(FROM_HERE, Bind(&RecordDeletionProbe::Run, c)); | 344 loop.task_runner()->PostTask(FROM_HERE, Bind(&RecordDeletionProbe::Run, c)); |
| 345 } | 345 } |
| 346 EXPECT_TRUE(a_was_deleted); | 346 EXPECT_TRUE(a_was_deleted); |
| 347 EXPECT_TRUE(b_was_deleted); | 347 EXPECT_TRUE(b_was_deleted); |
| 348 EXPECT_TRUE(c_was_deleted); | 348 EXPECT_TRUE(c_was_deleted); |
| 349 } | 349 } |
| 350 | 350 |
| 351 void NestingFunc(int* depth) { | 351 void NestingFunc(int* depth) { |
| 352 if (*depth > 0) { | 352 if (*depth > 0) { |
| 353 *depth -= 1; | 353 *depth -= 1; |
| 354 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 354 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 355 Bind(&NestingFunc, depth)); | 355 Bind(&NestingFunc, depth)); |
| 356 | 356 |
| 357 MessageLoop::current()->SetNestableTasksAllowed(true); | 357 MessageLoop::current()->SetNestableTasksAllowed(true); |
| 358 RunLoop().Run(); | 358 RunLoop().Run(); |
| 359 } | 359 } |
| 360 MessageLoop::current()->QuitWhenIdle(); | 360 MessageLoop::current()->QuitWhenIdle(); |
| 361 } | 361 } |
| 362 | 362 |
| 363 void RunTest_Nesting(MessagePumpFactory factory) { | 363 void RunTest_Nesting(MessagePumpFactory factory) { |
| 364 std::unique_ptr<MessagePump> pump(factory()); | 364 std::unique_ptr<MessagePump> pump(factory()); |
| 365 MessageLoop loop(std::move(pump)); | 365 MessageLoop loop(std::move(pump)); |
| 366 | 366 |
| 367 int depth = 100; | 367 int depth = 100; |
| 368 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 368 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 369 Bind(&NestingFunc, &depth)); | 369 Bind(&NestingFunc, &depth)); |
| 370 RunLoop().Run(); | 370 RunLoop().Run(); |
| 371 EXPECT_EQ(depth, 0); | 371 EXPECT_EQ(depth, 0); |
| 372 } | 372 } |
| 373 | 373 |
| 374 // A NestingObserver that tracks the number of nested message loop starts it | 374 // A NestingObserver that tracks the number of nested message loop starts it |
| 375 // has seen. | 375 // has seen. |
| 376 class TestNestingObserver : public MessageLoop::NestingObserver { | 376 class TestNestingObserver : public MessageLoop::NestingObserver { |
| 377 public: | 377 public: |
| 378 TestNestingObserver() {} | 378 TestNestingObserver() {} |
| 379 ~TestNestingObserver() override {} | 379 ~TestNestingObserver() override {} |
| (...skipping 16 matching lines...) Expand all Loading... |
| 396 // Starts a nested message loop. | 396 // Starts a nested message loop. |
| 397 void RunNestedLoop(TestNestingObserver* observer, | 397 void RunNestedLoop(TestNestingObserver* observer, |
| 398 const Closure& quit_outer_loop) { | 398 const Closure& quit_outer_loop) { |
| 399 // The nested loop hasn't started yet. | 399 // The nested loop hasn't started yet. |
| 400 EXPECT_EQ(0, observer->begin_nested_loop_count()); | 400 EXPECT_EQ(0, observer->begin_nested_loop_count()); |
| 401 | 401 |
| 402 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); | 402 MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); |
| 403 RunLoop nested_loop; | 403 RunLoop nested_loop; |
| 404 // Verify that by the time the first task is run the observer has seen the | 404 // Verify that by the time the first task is run the observer has seen the |
| 405 // message loop begin. | 405 // message loop begin. |
| 406 MessageLoop::current()->task_runner()->PostTask( | 406 ThreadTaskRunnerHandle::Get()->PostTask( |
| 407 FROM_HERE, Bind(&ExpectOneBeginNestedLoop, observer)); | 407 FROM_HERE, Bind(&ExpectOneBeginNestedLoop, observer)); |
| 408 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 408 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, nested_loop.QuitClosure()); |
| 409 nested_loop.QuitClosure()); | |
| 410 nested_loop.Run(); | 409 nested_loop.Run(); |
| 411 | 410 |
| 412 // Quitting message loops doesn't change the begin count. | 411 // Quitting message loops doesn't change the begin count. |
| 413 EXPECT_EQ(1, observer->begin_nested_loop_count()); | 412 EXPECT_EQ(1, observer->begin_nested_loop_count()); |
| 414 | 413 |
| 415 quit_outer_loop.Run(); | 414 quit_outer_loop.Run(); |
| 416 } | 415 } |
| 417 | 416 |
| 418 // Tests that a NestingObserver is notified when a nested message loop begins. | 417 // Tests that a NestingObserver is notified when a nested message loop begins. |
| 419 void RunTest_NestingObserver(MessagePumpFactory factory) { | 418 void RunTest_NestingObserver(MessagePumpFactory factory) { |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 private: | 510 private: |
| 512 std::vector<TaskItem> task_list_; | 511 std::vector<TaskItem> task_list_; |
| 513 }; | 512 }; |
| 514 | 513 |
| 515 void RecursiveFunc(TaskList* order, int cookie, int depth, | 514 void RecursiveFunc(TaskList* order, int cookie, int depth, |
| 516 bool is_reentrant) { | 515 bool is_reentrant) { |
| 517 order->RecordStart(RECURSIVE, cookie); | 516 order->RecordStart(RECURSIVE, cookie); |
| 518 if (depth > 0) { | 517 if (depth > 0) { |
| 519 if (is_reentrant) | 518 if (is_reentrant) |
| 520 MessageLoop::current()->SetNestableTasksAllowed(true); | 519 MessageLoop::current()->SetNestableTasksAllowed(true); |
| 521 MessageLoop::current()->task_runner()->PostTask( | 520 ThreadTaskRunnerHandle::Get()->PostTask( |
| 522 FROM_HERE, | 521 FROM_HERE, |
| 523 Bind(&RecursiveFunc, order, cookie, depth - 1, is_reentrant)); | 522 Bind(&RecursiveFunc, order, cookie, depth - 1, is_reentrant)); |
| 524 } | 523 } |
| 525 order->RecordEnd(RECURSIVE, cookie); | 524 order->RecordEnd(RECURSIVE, cookie); |
| 526 } | 525 } |
| 527 | 526 |
| 528 void QuitFunc(TaskList* order, int cookie) { | 527 void QuitFunc(TaskList* order, int cookie) { |
| 529 order->RecordStart(QUITMESSAGELOOP, cookie); | 528 order->RecordStart(QUITMESSAGELOOP, cookie); |
| 530 MessageLoop::current()->QuitWhenIdle(); | 529 MessageLoop::current()->QuitWhenIdle(); |
| 531 order->RecordEnd(QUITMESSAGELOOP, cookie); | 530 order->RecordEnd(QUITMESSAGELOOP, cookie); |
| 532 } | 531 } |
| 533 void RunTest_RecursiveDenial1(MessagePumpFactory factory) { | 532 void RunTest_RecursiveDenial1(MessagePumpFactory factory) { |
| 534 std::unique_ptr<MessagePump> pump(factory()); | 533 std::unique_ptr<MessagePump> pump(factory()); |
| 535 MessageLoop loop(std::move(pump)); | 534 MessageLoop loop(std::move(pump)); |
| 536 | 535 |
| 537 EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed()); | 536 EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed()); |
| 538 TaskList order; | 537 TaskList order; |
| 539 MessageLoop::current()->task_runner()->PostTask( | 538 ThreadTaskRunnerHandle::Get()->PostTask( |
| 540 FROM_HERE, Bind(&RecursiveFunc, &order, 1, 2, false)); | 539 FROM_HERE, Bind(&RecursiveFunc, &order, 1, 2, false)); |
| 541 MessageLoop::current()->task_runner()->PostTask( | 540 ThreadTaskRunnerHandle::Get()->PostTask( |
| 542 FROM_HERE, Bind(&RecursiveFunc, &order, 2, 2, false)); | 541 FROM_HERE, Bind(&RecursiveFunc, &order, 2, 2, false)); |
| 543 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 542 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 544 Bind(&QuitFunc, &order, 3)); | 543 Bind(&QuitFunc, &order, 3)); |
| 545 | 544 |
| 546 RunLoop().Run(); | 545 RunLoop().Run(); |
| 547 | 546 |
| 548 // FIFO order. | 547 // FIFO order. |
| 549 ASSERT_EQ(14U, order.Size()); | 548 ASSERT_EQ(14U, order.Size()); |
| 550 EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true)); | 549 EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true)); |
| 551 EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false)); | 550 EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false)); |
| 552 EXPECT_EQ(order.Get(2), TaskItem(RECURSIVE, 2, true)); | 551 EXPECT_EQ(order.Get(2), TaskItem(RECURSIVE, 2, true)); |
| 553 EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 2, false)); | 552 EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 2, false)); |
| 554 EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true)); | 553 EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 573 order->RecordStart(ORDERED, cookie); | 572 order->RecordStart(ORDERED, cookie); |
| 574 order->RecordEnd(ORDERED, cookie); | 573 order->RecordEnd(ORDERED, cookie); |
| 575 } | 574 } |
| 576 | 575 |
| 577 void RunTest_RecursiveDenial3(MessagePumpFactory factory) { | 576 void RunTest_RecursiveDenial3(MessagePumpFactory factory) { |
| 578 std::unique_ptr<MessagePump> pump(factory()); | 577 std::unique_ptr<MessagePump> pump(factory()); |
| 579 MessageLoop loop(std::move(pump)); | 578 MessageLoop loop(std::move(pump)); |
| 580 | 579 |
| 581 EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed()); | 580 EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed()); |
| 582 TaskList order; | 581 TaskList order; |
| 583 MessageLoop::current()->task_runner()->PostTask( | 582 ThreadTaskRunnerHandle::Get()->PostTask( |
| 584 FROM_HERE, Bind(&RecursiveSlowFunc, &order, 1, 2, false)); | 583 FROM_HERE, Bind(&RecursiveSlowFunc, &order, 1, 2, false)); |
| 585 MessageLoop::current()->task_runner()->PostTask( | 584 ThreadTaskRunnerHandle::Get()->PostTask( |
| 586 FROM_HERE, Bind(&RecursiveSlowFunc, &order, 2, 2, false)); | 585 FROM_HERE, Bind(&RecursiveSlowFunc, &order, 2, 2, false)); |
| 587 MessageLoop::current()->task_runner()->PostDelayedTask( | 586 ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 588 FROM_HERE, Bind(&OrderedFunc, &order, 3), TimeDelta::FromMilliseconds(5)); | 587 FROM_HERE, Bind(&OrderedFunc, &order, 3), TimeDelta::FromMilliseconds(5)); |
| 589 MessageLoop::current()->task_runner()->PostDelayedTask( | 588 ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 590 FROM_HERE, Bind(&QuitFunc, &order, 4), TimeDelta::FromMilliseconds(5)); | 589 FROM_HERE, Bind(&QuitFunc, &order, 4), TimeDelta::FromMilliseconds(5)); |
| 591 | 590 |
| 592 RunLoop().Run(); | 591 RunLoop().Run(); |
| 593 | 592 |
| 594 // FIFO order. | 593 // FIFO order. |
| 595 ASSERT_EQ(16U, order.Size()); | 594 ASSERT_EQ(16U, order.Size()); |
| 596 EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true)); | 595 EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true)); |
| 597 EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false)); | 596 EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false)); |
| 598 EXPECT_EQ(order.Get(2), TaskItem(RECURSIVE, 2, true)); | 597 EXPECT_EQ(order.Get(2), TaskItem(RECURSIVE, 2, true)); |
| 599 EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 2, false)); | 598 EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 2, false)); |
| 600 EXPECT_EQ(order.Get(4), TaskItem(RECURSIVE, 1, true)); | 599 EXPECT_EQ(order.Get(4), TaskItem(RECURSIVE, 1, true)); |
| 601 EXPECT_EQ(order.Get(5), TaskItem(RECURSIVE, 1, false)); | 600 EXPECT_EQ(order.Get(5), TaskItem(RECURSIVE, 1, false)); |
| 602 EXPECT_EQ(order.Get(6), TaskItem(ORDERED, 3, true)); | 601 EXPECT_EQ(order.Get(6), TaskItem(ORDERED, 3, true)); |
| 603 EXPECT_EQ(order.Get(7), TaskItem(ORDERED, 3, false)); | 602 EXPECT_EQ(order.Get(7), TaskItem(ORDERED, 3, false)); |
| 604 EXPECT_EQ(order.Get(8), TaskItem(RECURSIVE, 2, true)); | 603 EXPECT_EQ(order.Get(8), TaskItem(RECURSIVE, 2, true)); |
| 605 EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false)); | 604 EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false)); |
| 606 EXPECT_EQ(order.Get(10), TaskItem(QUITMESSAGELOOP, 4, true)); | 605 EXPECT_EQ(order.Get(10), TaskItem(QUITMESSAGELOOP, 4, true)); |
| 607 EXPECT_EQ(order.Get(11), TaskItem(QUITMESSAGELOOP, 4, false)); | 606 EXPECT_EQ(order.Get(11), TaskItem(QUITMESSAGELOOP, 4, false)); |
| 608 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 1, true)); | 607 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 1, true)); |
| 609 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 1, false)); | 608 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 1, false)); |
| 610 EXPECT_EQ(order.Get(14), TaskItem(RECURSIVE, 2, true)); | 609 EXPECT_EQ(order.Get(14), TaskItem(RECURSIVE, 2, true)); |
| 611 EXPECT_EQ(order.Get(15), TaskItem(RECURSIVE, 2, false)); | 610 EXPECT_EQ(order.Get(15), TaskItem(RECURSIVE, 2, false)); |
| 612 } | 611 } |
| 613 | 612 |
| 614 void RunTest_RecursiveSupport1(MessagePumpFactory factory) { | 613 void RunTest_RecursiveSupport1(MessagePumpFactory factory) { |
| 615 std::unique_ptr<MessagePump> pump(factory()); | 614 std::unique_ptr<MessagePump> pump(factory()); |
| 616 MessageLoop loop(std::move(pump)); | 615 MessageLoop loop(std::move(pump)); |
| 617 | 616 |
| 618 TaskList order; | 617 TaskList order; |
| 619 MessageLoop::current()->task_runner()->PostTask( | 618 ThreadTaskRunnerHandle::Get()->PostTask( |
| 620 FROM_HERE, Bind(&RecursiveFunc, &order, 1, 2, true)); | 619 FROM_HERE, Bind(&RecursiveFunc, &order, 1, 2, true)); |
| 621 MessageLoop::current()->task_runner()->PostTask( | 620 ThreadTaskRunnerHandle::Get()->PostTask( |
| 622 FROM_HERE, Bind(&RecursiveFunc, &order, 2, 2, true)); | 621 FROM_HERE, Bind(&RecursiveFunc, &order, 2, 2, true)); |
| 623 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 622 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 624 Bind(&QuitFunc, &order, 3)); | 623 Bind(&QuitFunc, &order, 3)); |
| 625 | 624 |
| 626 RunLoop().Run(); | 625 RunLoop().Run(); |
| 627 | 626 |
| 628 // FIFO order. | 627 // FIFO order. |
| 629 ASSERT_EQ(14U, order.Size()); | 628 ASSERT_EQ(14U, order.Size()); |
| 630 EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true)); | 629 EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true)); |
| 631 EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false)); | 630 EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false)); |
| 632 EXPECT_EQ(order.Get(2), TaskItem(RECURSIVE, 2, true)); | 631 EXPECT_EQ(order.Get(2), TaskItem(RECURSIVE, 2, true)); |
| 633 EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 2, false)); | 632 EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 2, false)); |
| 634 EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true)); | 633 EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true)); |
| 635 EXPECT_EQ(order.Get(5), TaskItem(QUITMESSAGELOOP, 3, false)); | 634 EXPECT_EQ(order.Get(5), TaskItem(QUITMESSAGELOOP, 3, false)); |
| 636 EXPECT_EQ(order.Get(6), TaskItem(RECURSIVE, 1, true)); | 635 EXPECT_EQ(order.Get(6), TaskItem(RECURSIVE, 1, true)); |
| 637 EXPECT_EQ(order.Get(7), TaskItem(RECURSIVE, 1, false)); | 636 EXPECT_EQ(order.Get(7), TaskItem(RECURSIVE, 1, false)); |
| 638 EXPECT_EQ(order.Get(8), TaskItem(RECURSIVE, 2, true)); | 637 EXPECT_EQ(order.Get(8), TaskItem(RECURSIVE, 2, true)); |
| 639 EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false)); | 638 EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false)); |
| 640 EXPECT_EQ(order.Get(10), TaskItem(RECURSIVE, 1, true)); | 639 EXPECT_EQ(order.Get(10), TaskItem(RECURSIVE, 1, true)); |
| 641 EXPECT_EQ(order.Get(11), TaskItem(RECURSIVE, 1, false)); | 640 EXPECT_EQ(order.Get(11), TaskItem(RECURSIVE, 1, false)); |
| 642 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 2, true)); | 641 EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 2, true)); |
| 643 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 2, false)); | 642 EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 2, false)); |
| 644 } | 643 } |
| 645 | 644 |
| 646 // Tests that non nestable tasks run in FIFO if there are no nested loops. | 645 // Tests that non nestable tasks run in FIFO if there are no nested loops. |
| 647 void RunTest_NonNestableWithNoNesting(MessagePumpFactory factory) { | 646 void RunTest_NonNestableWithNoNesting(MessagePumpFactory factory) { |
| 648 std::unique_ptr<MessagePump> pump(factory()); | 647 std::unique_ptr<MessagePump> pump(factory()); |
| 649 MessageLoop loop(std::move(pump)); | 648 MessageLoop loop(std::move(pump)); |
| 650 | 649 |
| 651 TaskList order; | 650 TaskList order; |
| 652 | 651 |
| 653 MessageLoop::current()->task_runner()->PostNonNestableTask( | 652 ThreadTaskRunnerHandle::Get()->PostNonNestableTask( |
| 654 FROM_HERE, | 653 FROM_HERE, Bind(&OrderedFunc, &order, 1)); |
| 655 Bind(&OrderedFunc, &order, 1)); | 654 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 656 MessageLoop::current()->task_runner()->PostTask( | 655 Bind(&OrderedFunc, &order, 2)); |
| 657 FROM_HERE, | 656 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 658 Bind(&OrderedFunc, &order, 2)); | 657 Bind(&QuitFunc, &order, 3)); |
| 659 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | |
| 660 Bind(&QuitFunc, &order, 3)); | |
| 661 RunLoop().Run(); | 658 RunLoop().Run(); |
| 662 | 659 |
| 663 // FIFO order. | 660 // FIFO order. |
| 664 ASSERT_EQ(6U, order.Size()); | 661 ASSERT_EQ(6U, order.Size()); |
| 665 EXPECT_EQ(order.Get(0), TaskItem(ORDERED, 1, true)); | 662 EXPECT_EQ(order.Get(0), TaskItem(ORDERED, 1, true)); |
| 666 EXPECT_EQ(order.Get(1), TaskItem(ORDERED, 1, false)); | 663 EXPECT_EQ(order.Get(1), TaskItem(ORDERED, 1, false)); |
| 667 EXPECT_EQ(order.Get(2), TaskItem(ORDERED, 2, true)); | 664 EXPECT_EQ(order.Get(2), TaskItem(ORDERED, 2, true)); |
| 668 EXPECT_EQ(order.Get(3), TaskItem(ORDERED, 2, false)); | 665 EXPECT_EQ(order.Get(3), TaskItem(ORDERED, 2, false)); |
| 669 EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true)); | 666 EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true)); |
| 670 EXPECT_EQ(order.Get(5), TaskItem(QUITMESSAGELOOP, 3, false)); | 667 EXPECT_EQ(order.Get(5), TaskItem(QUITMESSAGELOOP, 3, false)); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 685 order->RecordEnd(SLEEP, cookie); | 682 order->RecordEnd(SLEEP, cookie); |
| 686 } | 683 } |
| 687 | 684 |
| 688 // Tests that non nestable tasks don't run when there's code in the call stack. | 685 // Tests that non nestable tasks don't run when there's code in the call stack. |
| 689 void RunTest_NonNestableInNestedLoop(MessagePumpFactory factory) { | 686 void RunTest_NonNestableInNestedLoop(MessagePumpFactory factory) { |
| 690 std::unique_ptr<MessagePump> pump(factory()); | 687 std::unique_ptr<MessagePump> pump(factory()); |
| 691 MessageLoop loop(std::move(pump)); | 688 MessageLoop loop(std::move(pump)); |
| 692 | 689 |
| 693 TaskList order; | 690 TaskList order; |
| 694 | 691 |
| 695 MessageLoop::current()->task_runner()->PostTask( | 692 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 696 FROM_HERE, | 693 Bind(&FuncThatPumps, &order, 1)); |
| 697 Bind(&FuncThatPumps, &order, 1)); | 694 ThreadTaskRunnerHandle::Get()->PostNonNestableTask( |
| 698 MessageLoop::current()->task_runner()->PostNonNestableTask( | 695 FROM_HERE, Bind(&OrderedFunc, &order, 2)); |
| 699 FROM_HERE, | 696 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 700 Bind(&OrderedFunc, &order, 2)); | 697 Bind(&OrderedFunc, &order, 3)); |
| 701 MessageLoop::current()->task_runner()->PostTask( | 698 ThreadTaskRunnerHandle::Get()->PostTask( |
| 702 FROM_HERE, | 699 FROM_HERE, Bind(&SleepFunc, &order, 4, TimeDelta::FromMilliseconds(50))); |
| 703 Bind(&OrderedFunc, &order, 3)); | 700 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 704 MessageLoop::current()->task_runner()->PostTask( | 701 Bind(&OrderedFunc, &order, 5)); |
| 705 FROM_HERE, | 702 ThreadTaskRunnerHandle::Get()->PostNonNestableTask( |
| 706 Bind(&SleepFunc, &order, 4, TimeDelta::FromMilliseconds(50))); | 703 FROM_HERE, Bind(&QuitFunc, &order, 6)); |
| 707 MessageLoop::current()->task_runner()->PostTask( | |
| 708 FROM_HERE, | |
| 709 Bind(&OrderedFunc, &order, 5)); | |
| 710 MessageLoop::current()->task_runner()->PostNonNestableTask( | |
| 711 FROM_HERE, | |
| 712 Bind(&QuitFunc, &order, 6)); | |
| 713 | 704 |
| 714 RunLoop().Run(); | 705 RunLoop().Run(); |
| 715 | 706 |
| 716 // FIFO order. | 707 // FIFO order. |
| 717 ASSERT_EQ(12U, order.Size()); | 708 ASSERT_EQ(12U, order.Size()); |
| 718 EXPECT_EQ(order.Get(0), TaskItem(PUMPS, 1, true)); | 709 EXPECT_EQ(order.Get(0), TaskItem(PUMPS, 1, true)); |
| 719 EXPECT_EQ(order.Get(1), TaskItem(ORDERED, 3, true)); | 710 EXPECT_EQ(order.Get(1), TaskItem(ORDERED, 3, true)); |
| 720 EXPECT_EQ(order.Get(2), TaskItem(ORDERED, 3, false)); | 711 EXPECT_EQ(order.Get(2), TaskItem(ORDERED, 3, false)); |
| 721 EXPECT_EQ(order.Get(3), TaskItem(SLEEP, 4, true)); | 712 EXPECT_EQ(order.Get(3), TaskItem(SLEEP, 4, true)); |
| 722 EXPECT_EQ(order.Get(4), TaskItem(SLEEP, 4, false)); | 713 EXPECT_EQ(order.Get(4), TaskItem(SLEEP, 4, false)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 743 } | 734 } |
| 744 // Tests RunLoopQuit only quits the corresponding MessageLoop::Run. | 735 // Tests RunLoopQuit only quits the corresponding MessageLoop::Run. |
| 745 void RunTest_QuitNow(MessagePumpFactory factory) { | 736 void RunTest_QuitNow(MessagePumpFactory factory) { |
| 746 std::unique_ptr<MessagePump> pump(factory()); | 737 std::unique_ptr<MessagePump> pump(factory()); |
| 747 MessageLoop loop(std::move(pump)); | 738 MessageLoop loop(std::move(pump)); |
| 748 | 739 |
| 749 TaskList order; | 740 TaskList order; |
| 750 | 741 |
| 751 RunLoop run_loop; | 742 RunLoop run_loop; |
| 752 | 743 |
| 753 MessageLoop::current()->task_runner()->PostTask( | 744 ThreadTaskRunnerHandle::Get()->PostTask( |
| 754 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&run_loop))); | 745 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&run_loop))); |
| 755 MessageLoop::current()->task_runner()->PostTask( | 746 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 756 FROM_HERE, Bind(&OrderedFunc, &order, 2)); | 747 Bind(&OrderedFunc, &order, 2)); |
| 757 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 748 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, Bind(&FuncThatQuitsNow)); |
| 758 Bind(&FuncThatQuitsNow)); | 749 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 759 MessageLoop::current()->task_runner()->PostTask( | 750 Bind(&OrderedFunc, &order, 3)); |
| 760 FROM_HERE, Bind(&OrderedFunc, &order, 3)); | 751 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, Bind(&FuncThatQuitsNow)); |
| 761 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 752 ThreadTaskRunnerHandle::Get()->PostTask( |
| 762 Bind(&FuncThatQuitsNow)); | |
| 763 MessageLoop::current()->task_runner()->PostTask( | |
| 764 FROM_HERE, Bind(&OrderedFunc, &order, 4)); // never runs | 753 FROM_HERE, Bind(&OrderedFunc, &order, 4)); // never runs |
| 765 | 754 |
| 766 RunLoop().Run(); | 755 RunLoop().Run(); |
| 767 | 756 |
| 768 ASSERT_EQ(6U, order.Size()); | 757 ASSERT_EQ(6U, order.Size()); |
| 769 int task_index = 0; | 758 int task_index = 0; |
| 770 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); | 759 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 771 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); | 760 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); |
| 772 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); | 761 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); |
| 773 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); | 762 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); |
| 774 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, true)); | 763 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, true)); |
| 775 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, false)); | 764 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, false)); |
| 776 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); | 765 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 777 } | 766 } |
| 778 | 767 |
| 779 // Tests RunLoopQuit only quits the corresponding MessageLoop::Run. | 768 // Tests RunLoopQuit only quits the corresponding MessageLoop::Run. |
| 780 void RunTest_RunLoopQuitTop(MessagePumpFactory factory) { | 769 void RunTest_RunLoopQuitTop(MessagePumpFactory factory) { |
| 781 std::unique_ptr<MessagePump> pump(factory()); | 770 std::unique_ptr<MessagePump> pump(factory()); |
| 782 MessageLoop loop(std::move(pump)); | 771 MessageLoop loop(std::move(pump)); |
| 783 | 772 |
| 784 TaskList order; | 773 TaskList order; |
| 785 | 774 |
| 786 RunLoop outer_run_loop; | 775 RunLoop outer_run_loop; |
| 787 RunLoop nested_run_loop; | 776 RunLoop nested_run_loop; |
| 788 | 777 |
| 789 MessageLoop::current()->task_runner()->PostTask( | 778 ThreadTaskRunnerHandle::Get()->PostTask( |
| 790 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop))); | 779 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop))); |
| 791 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 780 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 792 outer_run_loop.QuitClosure()); | 781 outer_run_loop.QuitClosure()); |
| 793 MessageLoop::current()->task_runner()->PostTask( | 782 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 794 FROM_HERE, Bind(&OrderedFunc, &order, 2)); | 783 Bind(&OrderedFunc, &order, 2)); |
| 795 MessageLoop::current()->task_runner()->PostTask( | 784 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 796 FROM_HERE, nested_run_loop.QuitClosure()); | 785 nested_run_loop.QuitClosure()); |
| 797 | 786 |
| 798 outer_run_loop.Run(); | 787 outer_run_loop.Run(); |
| 799 | 788 |
| 800 ASSERT_EQ(4U, order.Size()); | 789 ASSERT_EQ(4U, order.Size()); |
| 801 int task_index = 0; | 790 int task_index = 0; |
| 802 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); | 791 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 803 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); | 792 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); |
| 804 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); | 793 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); |
| 805 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); | 794 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); |
| 806 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); | 795 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 807 } | 796 } |
| 808 | 797 |
| 809 // Tests RunLoopQuit only quits the corresponding MessageLoop::Run. | 798 // Tests RunLoopQuit only quits the corresponding MessageLoop::Run. |
| 810 void RunTest_RunLoopQuitNested(MessagePumpFactory factory) { | 799 void RunTest_RunLoopQuitNested(MessagePumpFactory factory) { |
| 811 std::unique_ptr<MessagePump> pump(factory()); | 800 std::unique_ptr<MessagePump> pump(factory()); |
| 812 MessageLoop loop(std::move(pump)); | 801 MessageLoop loop(std::move(pump)); |
| 813 | 802 |
| 814 TaskList order; | 803 TaskList order; |
| 815 | 804 |
| 816 RunLoop outer_run_loop; | 805 RunLoop outer_run_loop; |
| 817 RunLoop nested_run_loop; | 806 RunLoop nested_run_loop; |
| 818 | 807 |
| 819 MessageLoop::current()->task_runner()->PostTask( | 808 ThreadTaskRunnerHandle::Get()->PostTask( |
| 820 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop))); | 809 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop))); |
| 821 MessageLoop::current()->task_runner()->PostTask( | 810 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 822 FROM_HERE, nested_run_loop.QuitClosure()); | 811 nested_run_loop.QuitClosure()); |
| 823 MessageLoop::current()->task_runner()->PostTask( | 812 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 824 FROM_HERE, Bind(&OrderedFunc, &order, 2)); | 813 Bind(&OrderedFunc, &order, 2)); |
| 825 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 814 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 826 outer_run_loop.QuitClosure()); | 815 outer_run_loop.QuitClosure()); |
| 827 | 816 |
| 828 outer_run_loop.Run(); | 817 outer_run_loop.Run(); |
| 829 | 818 |
| 830 ASSERT_EQ(4U, order.Size()); | 819 ASSERT_EQ(4U, order.Size()); |
| 831 int task_index = 0; | 820 int task_index = 0; |
| 832 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); | 821 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 833 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); | 822 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); |
| 834 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); | 823 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); |
| 835 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); | 824 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); |
| 836 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); | 825 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 837 } | 826 } |
| 838 | 827 |
| 839 // Tests RunLoopQuit only quits the corresponding MessageLoop::Run. | 828 // Tests RunLoopQuit only quits the corresponding MessageLoop::Run. |
| 840 void RunTest_RunLoopQuitBogus(MessagePumpFactory factory) { | 829 void RunTest_RunLoopQuitBogus(MessagePumpFactory factory) { |
| 841 std::unique_ptr<MessagePump> pump(factory()); | 830 std::unique_ptr<MessagePump> pump(factory()); |
| 842 MessageLoop loop(std::move(pump)); | 831 MessageLoop loop(std::move(pump)); |
| 843 | 832 |
| 844 TaskList order; | 833 TaskList order; |
| 845 | 834 |
| 846 RunLoop outer_run_loop; | 835 RunLoop outer_run_loop; |
| 847 RunLoop nested_run_loop; | 836 RunLoop nested_run_loop; |
| 848 RunLoop bogus_run_loop; | 837 RunLoop bogus_run_loop; |
| 849 | 838 |
| 850 MessageLoop::current()->task_runner()->PostTask( | 839 ThreadTaskRunnerHandle::Get()->PostTask( |
| 851 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop))); | 840 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop))); |
| 852 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 841 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 853 bogus_run_loop.QuitClosure()); | 842 bogus_run_loop.QuitClosure()); |
| 854 MessageLoop::current()->task_runner()->PostTask( | 843 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 855 FROM_HERE, Bind(&OrderedFunc, &order, 2)); | 844 Bind(&OrderedFunc, &order, 2)); |
| 856 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 845 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 857 outer_run_loop.QuitClosure()); | 846 outer_run_loop.QuitClosure()); |
| 858 MessageLoop::current()->task_runner()->PostTask( | 847 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 859 FROM_HERE, nested_run_loop.QuitClosure()); | 848 nested_run_loop.QuitClosure()); |
| 860 | 849 |
| 861 outer_run_loop.Run(); | 850 outer_run_loop.Run(); |
| 862 | 851 |
| 863 ASSERT_EQ(4U, order.Size()); | 852 ASSERT_EQ(4U, order.Size()); |
| 864 int task_index = 0; | 853 int task_index = 0; |
| 865 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); | 854 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 866 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); | 855 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); |
| 867 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); | 856 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); |
| 868 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); | 857 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); |
| 869 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); | 858 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 870 } | 859 } |
| 871 | 860 |
| 872 // Tests RunLoopQuit only quits the corresponding MessageLoop::Run. | 861 // Tests RunLoopQuit only quits the corresponding MessageLoop::Run. |
| 873 void RunTest_RunLoopQuitDeep(MessagePumpFactory factory) { | 862 void RunTest_RunLoopQuitDeep(MessagePumpFactory factory) { |
| 874 std::unique_ptr<MessagePump> pump(factory()); | 863 std::unique_ptr<MessagePump> pump(factory()); |
| 875 MessageLoop loop(std::move(pump)); | 864 MessageLoop loop(std::move(pump)); |
| 876 | 865 |
| 877 TaskList order; | 866 TaskList order; |
| 878 | 867 |
| 879 RunLoop outer_run_loop; | 868 RunLoop outer_run_loop; |
| 880 RunLoop nested_loop1; | 869 RunLoop nested_loop1; |
| 881 RunLoop nested_loop2; | 870 RunLoop nested_loop2; |
| 882 RunLoop nested_loop3; | 871 RunLoop nested_loop3; |
| 883 RunLoop nested_loop4; | 872 RunLoop nested_loop4; |
| 884 | 873 |
| 885 MessageLoop::current()->task_runner()->PostTask( | 874 ThreadTaskRunnerHandle::Get()->PostTask( |
| 886 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_loop1))); | 875 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&nested_loop1))); |
| 887 MessageLoop::current()->task_runner()->PostTask( | 876 ThreadTaskRunnerHandle::Get()->PostTask( |
| 888 FROM_HERE, Bind(&FuncThatRuns, &order, 2, Unretained(&nested_loop2))); | 877 FROM_HERE, Bind(&FuncThatRuns, &order, 2, Unretained(&nested_loop2))); |
| 889 MessageLoop::current()->task_runner()->PostTask( | 878 ThreadTaskRunnerHandle::Get()->PostTask( |
| 890 FROM_HERE, Bind(&FuncThatRuns, &order, 3, Unretained(&nested_loop3))); | 879 FROM_HERE, Bind(&FuncThatRuns, &order, 3, Unretained(&nested_loop3))); |
| 891 MessageLoop::current()->task_runner()->PostTask( | 880 ThreadTaskRunnerHandle::Get()->PostTask( |
| 892 FROM_HERE, Bind(&FuncThatRuns, &order, 4, Unretained(&nested_loop4))); | 881 FROM_HERE, Bind(&FuncThatRuns, &order, 4, Unretained(&nested_loop4))); |
| 893 MessageLoop::current()->task_runner()->PostTask( | 882 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 894 FROM_HERE, Bind(&OrderedFunc, &order, 5)); | 883 Bind(&OrderedFunc, &order, 5)); |
| 895 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 884 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 896 outer_run_loop.QuitClosure()); | 885 outer_run_loop.QuitClosure()); |
| 897 MessageLoop::current()->task_runner()->PostTask( | 886 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 898 FROM_HERE, Bind(&OrderedFunc, &order, 6)); | 887 Bind(&OrderedFunc, &order, 6)); |
| 899 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 888 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 900 nested_loop1.QuitClosure()); | 889 nested_loop1.QuitClosure()); |
| 901 MessageLoop::current()->task_runner()->PostTask( | 890 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 902 FROM_HERE, Bind(&OrderedFunc, &order, 7)); | 891 Bind(&OrderedFunc, &order, 7)); |
| 903 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 892 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 904 nested_loop2.QuitClosure()); | 893 nested_loop2.QuitClosure()); |
| 905 MessageLoop::current()->task_runner()->PostTask( | 894 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 906 FROM_HERE, Bind(&OrderedFunc, &order, 8)); | 895 Bind(&OrderedFunc, &order, 8)); |
| 907 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 896 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 908 nested_loop3.QuitClosure()); | 897 nested_loop3.QuitClosure()); |
| 909 MessageLoop::current()->task_runner()->PostTask( | 898 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 910 FROM_HERE, Bind(&OrderedFunc, &order, 9)); | 899 Bind(&OrderedFunc, &order, 9)); |
| 911 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 900 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 912 nested_loop4.QuitClosure()); | 901 nested_loop4.QuitClosure()); |
| 913 MessageLoop::current()->task_runner()->PostTask( | 902 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 914 FROM_HERE, Bind(&OrderedFunc, &order, 10)); | 903 Bind(&OrderedFunc, &order, 10)); |
| 915 | 904 |
| 916 outer_run_loop.Run(); | 905 outer_run_loop.Run(); |
| 917 | 906 |
| 918 ASSERT_EQ(18U, order.Size()); | 907 ASSERT_EQ(18U, order.Size()); |
| 919 int task_index = 0; | 908 int task_index = 0; |
| 920 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); | 909 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 921 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 2, true)); | 910 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 2, true)); |
| 922 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 3, true)); | 911 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 3, true)); |
| 923 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 4, true)); | 912 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 4, true)); |
| 924 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 5, true)); | 913 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 5, true)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 942 void RunTest_RunLoopQuitOrderBefore(MessagePumpFactory factory) { | 931 void RunTest_RunLoopQuitOrderBefore(MessagePumpFactory factory) { |
| 943 std::unique_ptr<MessagePump> pump(factory()); | 932 std::unique_ptr<MessagePump> pump(factory()); |
| 944 MessageLoop loop(std::move(pump)); | 933 MessageLoop loop(std::move(pump)); |
| 945 | 934 |
| 946 TaskList order; | 935 TaskList order; |
| 947 | 936 |
| 948 RunLoop run_loop; | 937 RunLoop run_loop; |
| 949 | 938 |
| 950 run_loop.Quit(); | 939 run_loop.Quit(); |
| 951 | 940 |
| 952 MessageLoop::current()->task_runner()->PostTask( | 941 ThreadTaskRunnerHandle::Get()->PostTask( |
| 953 FROM_HERE, Bind(&OrderedFunc, &order, 1)); // never runs | 942 FROM_HERE, Bind(&OrderedFunc, &order, 1)); // never runs |
| 954 MessageLoop::current()->task_runner()->PostTask( | 943 ThreadTaskRunnerHandle::Get()->PostTask( |
| 955 FROM_HERE, Bind(&FuncThatQuitsNow)); // never runs | 944 FROM_HERE, Bind(&FuncThatQuitsNow)); // never runs |
| 956 | 945 |
| 957 run_loop.Run(); | 946 run_loop.Run(); |
| 958 | 947 |
| 959 ASSERT_EQ(0U, order.Size()); | 948 ASSERT_EQ(0U, order.Size()); |
| 960 } | 949 } |
| 961 | 950 |
| 962 // Tests RunLoopQuit works during RunWithID. | 951 // Tests RunLoopQuit works during RunWithID. |
| 963 void RunTest_RunLoopQuitOrderDuring(MessagePumpFactory factory) { | 952 void RunTest_RunLoopQuitOrderDuring(MessagePumpFactory factory) { |
| 964 std::unique_ptr<MessagePump> pump(factory()); | 953 std::unique_ptr<MessagePump> pump(factory()); |
| 965 MessageLoop loop(std::move(pump)); | 954 MessageLoop loop(std::move(pump)); |
| 966 | 955 |
| 967 TaskList order; | 956 TaskList order; |
| 968 | 957 |
| 969 RunLoop run_loop; | 958 RunLoop run_loop; |
| 970 | 959 |
| 971 MessageLoop::current()->task_runner()->PostTask( | 960 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 972 FROM_HERE, Bind(&OrderedFunc, &order, 1)); | 961 Bind(&OrderedFunc, &order, 1)); |
| 973 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 962 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, run_loop.QuitClosure()); |
| 974 run_loop.QuitClosure()); | 963 ThreadTaskRunnerHandle::Get()->PostTask( |
| 975 MessageLoop::current()->task_runner()->PostTask( | |
| 976 FROM_HERE, Bind(&OrderedFunc, &order, 2)); // never runs | 964 FROM_HERE, Bind(&OrderedFunc, &order, 2)); // never runs |
| 977 MessageLoop::current()->task_runner()->PostTask( | 965 ThreadTaskRunnerHandle::Get()->PostTask( |
| 978 FROM_HERE, Bind(&FuncThatQuitsNow)); // never runs | 966 FROM_HERE, Bind(&FuncThatQuitsNow)); // never runs |
| 979 | 967 |
| 980 run_loop.Run(); | 968 run_loop.Run(); |
| 981 | 969 |
| 982 ASSERT_EQ(2U, order.Size()); | 970 ASSERT_EQ(2U, order.Size()); |
| 983 int task_index = 0; | 971 int task_index = 0; |
| 984 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 1, true)); | 972 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 1, true)); |
| 985 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 1, false)); | 973 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 1, false)); |
| 986 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); | 974 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 987 } | 975 } |
| 988 | 976 |
| 989 // Tests RunLoopQuit works after RunWithID. | 977 // Tests RunLoopQuit works after RunWithID. |
| 990 void RunTest_RunLoopQuitOrderAfter(MessagePumpFactory factory) { | 978 void RunTest_RunLoopQuitOrderAfter(MessagePumpFactory factory) { |
| 991 std::unique_ptr<MessagePump> pump(factory()); | 979 std::unique_ptr<MessagePump> pump(factory()); |
| 992 MessageLoop loop(std::move(pump)); | 980 MessageLoop loop(std::move(pump)); |
| 993 | 981 |
| 994 TaskList order; | 982 TaskList order; |
| 995 | 983 |
| 996 RunLoop run_loop; | 984 RunLoop run_loop; |
| 997 | 985 |
| 998 MessageLoop::current()->task_runner()->PostTask( | 986 ThreadTaskRunnerHandle::Get()->PostTask( |
| 999 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&run_loop))); | 987 FROM_HERE, Bind(&FuncThatRuns, &order, 1, Unretained(&run_loop))); |
| 1000 MessageLoop::current()->task_runner()->PostTask( | 988 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 1001 FROM_HERE, Bind(&OrderedFunc, &order, 2)); | 989 Bind(&OrderedFunc, &order, 2)); |
| 1002 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 990 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, Bind(&FuncThatQuitsNow)); |
| 1003 Bind(&FuncThatQuitsNow)); | 991 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 1004 MessageLoop::current()->task_runner()->PostTask( | 992 Bind(&OrderedFunc, &order, 3)); |
| 1005 FROM_HERE, Bind(&OrderedFunc, &order, 3)); | 993 ThreadTaskRunnerHandle::Get()->PostTask( |
| 1006 MessageLoop::current()->task_runner()->PostTask( | |
| 1007 FROM_HERE, run_loop.QuitClosure()); // has no affect | 994 FROM_HERE, run_loop.QuitClosure()); // has no affect |
| 1008 MessageLoop::current()->task_runner()->PostTask( | 995 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 1009 FROM_HERE, Bind(&OrderedFunc, &order, 4)); | 996 Bind(&OrderedFunc, &order, 4)); |
| 1010 MessageLoop::current()->task_runner()->PostTask(FROM_HERE, | 997 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, Bind(&FuncThatQuitsNow)); |
| 1011 Bind(&FuncThatQuitsNow)); | |
| 1012 | 998 |
| 1013 RunLoop outer_run_loop; | 999 RunLoop outer_run_loop; |
| 1014 outer_run_loop.Run(); | 1000 outer_run_loop.Run(); |
| 1015 | 1001 |
| 1016 ASSERT_EQ(8U, order.Size()); | 1002 ASSERT_EQ(8U, order.Size()); |
| 1017 int task_index = 0; | 1003 int task_index = 0; |
| 1018 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); | 1004 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true)); |
| 1019 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); | 1005 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true)); |
| 1020 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); | 1006 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false)); |
| 1021 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); | 1007 EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false)); |
| 1022 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, true)); | 1008 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, true)); |
| 1023 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, false)); | 1009 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, false)); |
| 1024 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 4, true)); | 1010 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 4, true)); |
| 1025 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 4, false)); | 1011 EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 4, false)); |
| 1026 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); | 1012 EXPECT_EQ(static_cast<size_t>(task_index), order.Size()); |
| 1027 } | 1013 } |
| 1028 | 1014 |
| 1029 void PostNTasksThenQuit(int posts_remaining) { | 1015 void PostNTasksThenQuit(int posts_remaining) { |
| 1030 if (posts_remaining > 1) { | 1016 if (posts_remaining > 1) { |
| 1031 MessageLoop::current()->task_runner()->PostTask( | 1017 ThreadTaskRunnerHandle::Get()->PostTask( |
| 1032 FROM_HERE, Bind(&PostNTasksThenQuit, posts_remaining - 1)); | 1018 FROM_HERE, Bind(&PostNTasksThenQuit, posts_remaining - 1)); |
| 1033 } else { | 1019 } else { |
| 1034 MessageLoop::current()->QuitWhenIdle(); | 1020 MessageLoop::current()->QuitWhenIdle(); |
| 1035 } | 1021 } |
| 1036 } | 1022 } |
| 1037 | 1023 |
| 1038 // There was a bug in the MessagePumpGLib where posting tasks recursively | 1024 // There was a bug in the MessagePumpGLib where posting tasks recursively |
| 1039 // caused the message loop to hang, due to the buffer of the internal pipe | 1025 // caused the message loop to hang, due to the buffer of the internal pipe |
| 1040 // becoming full. Test all MessageLoop types to ensure this issue does not | 1026 // becoming full. Test all MessageLoop types to ensure this issue does not |
| 1041 // exist in other MessagePumps. | 1027 // exist in other MessagePumps. |
| 1042 // | 1028 // |
| 1043 // On Linux, the pipe buffer size is 64KiB by default. The bug caused one | 1029 // On Linux, the pipe buffer size is 64KiB by default. The bug caused one |
| 1044 // byte accumulated in the pipe per two posts, so we should repeat 128K | 1030 // byte accumulated in the pipe per two posts, so we should repeat 128K |
| 1045 // times to reproduce the bug. | 1031 // times to reproduce the bug. |
| 1046 void RunTest_RecursivePosts(MessagePumpFactory factory) { | 1032 void RunTest_RecursivePosts(MessagePumpFactory factory) { |
| 1047 const int kNumTimes = 1 << 17; | 1033 const int kNumTimes = 1 << 17; |
| 1048 std::unique_ptr<MessagePump> pump(factory()); | 1034 std::unique_ptr<MessagePump> pump(factory()); |
| 1049 MessageLoop loop(std::move(pump)); | 1035 MessageLoop loop(std::move(pump)); |
| 1050 loop.task_runner()->PostTask(FROM_HERE, Bind(&PostNTasksThenQuit, kNumTimes)); | 1036 loop.task_runner()->PostTask(FROM_HERE, Bind(&PostNTasksThenQuit, kNumTimes)); |
| 1051 RunLoop().Run(); | 1037 RunLoop().Run(); |
| 1052 } | 1038 } |
| 1053 | 1039 |
| 1054 } // namespace test | 1040 } // namespace test |
| 1055 } // namespace base | 1041 } // namespace base |
| OLD | NEW |