| Index: base/message_loop_unittest.cc
|
| ===================================================================
|
| --- base/message_loop_unittest.cc (revision 1892)
|
| +++ base/message_loop_unittest.cc (working copy)
|
| @@ -290,6 +290,52 @@
|
| EXPECT_TRUE(run_time2 > run_time1);
|
| }
|
|
|
| +class RecordDeletionTask : public Task {
|
| + public:
|
| + RecordDeletionTask(Task* post_on_delete, bool* was_deleted)
|
| + : post_on_delete_(post_on_delete), was_deleted_(was_deleted) {
|
| + }
|
| + ~RecordDeletionTask() {
|
| + *was_deleted_ = true;
|
| + if (post_on_delete_)
|
| + MessageLoop::current()->PostTask(FROM_HERE, post_on_delete_);
|
| + }
|
| + virtual void Run() {}
|
| + private:
|
| + Task* post_on_delete_;
|
| + bool* was_deleted_;
|
| +};
|
| +
|
| +void RunTest_EnsureTaskDeletion(MessageLoop::Type message_loop_type) {
|
| + bool a_was_deleted = false;
|
| + bool b_was_deleted = false;
|
| + {
|
| + MessageLoop loop(message_loop_type);
|
| + loop.PostTask(
|
| + FROM_HERE, new RecordDeletionTask(NULL, &a_was_deleted));
|
| + loop.PostDelayedTask(
|
| + FROM_HERE, new RecordDeletionTask(NULL, &b_was_deleted), 1000);
|
| + }
|
| + EXPECT_TRUE(a_was_deleted);
|
| + EXPECT_TRUE(b_was_deleted);
|
| +}
|
| +
|
| +void RunTest_EnsureTaskDeletion_Chain(MessageLoop::Type message_loop_type) {
|
| + bool a_was_deleted = false;
|
| + bool b_was_deleted = false;
|
| + bool c_was_deleted = false;
|
| + {
|
| + MessageLoop loop(message_loop_type);
|
| + RecordDeletionTask* a = new RecordDeletionTask(NULL, &a_was_deleted);
|
| + RecordDeletionTask* b = new RecordDeletionTask(a, &b_was_deleted);
|
| + RecordDeletionTask* c = new RecordDeletionTask(b, &c_was_deleted);
|
| + loop.PostTask(FROM_HERE, c);
|
| + }
|
| + EXPECT_TRUE(a_was_deleted);
|
| + EXPECT_TRUE(b_was_deleted);
|
| + EXPECT_TRUE(c_was_deleted);
|
| +}
|
| +
|
| class NestingTest : public Task {
|
| public:
|
| explicit NestingTest(int* depth) : depth_(depth) {
|
| @@ -1049,6 +1095,18 @@
|
| RunTest_PostDelayedTask_InPostOrder_3(MessageLoop::TYPE_IO);
|
| }
|
|
|
| +TEST(MessageLoopTest, EnsureTaskDeletion) {
|
| + RunTest_EnsureTaskDeletion(MessageLoop::TYPE_DEFAULT);
|
| + RunTest_EnsureTaskDeletion(MessageLoop::TYPE_UI);
|
| + RunTest_EnsureTaskDeletion(MessageLoop::TYPE_IO);
|
| +}
|
| +
|
| +TEST(MessageLoopTest, EnsureTaskDeletion_Chain) {
|
| + RunTest_EnsureTaskDeletion_Chain(MessageLoop::TYPE_DEFAULT);
|
| + RunTest_EnsureTaskDeletion_Chain(MessageLoop::TYPE_UI);
|
| + RunTest_EnsureTaskDeletion_Chain(MessageLoop::TYPE_IO);
|
| +}
|
| +
|
| #if defined(OS_WIN)
|
| TEST(MessageLoopTest, Crasher) {
|
| RunTest_Crasher(MessageLoop::TYPE_DEFAULT);
|
|
|