Index: base/message_loop_unittest.cc |
=================================================================== |
--- base/message_loop_unittest.cc (revision 75181) |
+++ base/message_loop_unittest.cc (working copy) |
@@ -768,6 +768,18 @@ |
bool is_reentrant_; |
}; |
+class RecursiveSlowTask : public RecursiveTask { |
+ public: |
+ RecursiveSlowTask(int depth, TaskList* order, int cookie, bool is_reentrant) |
+ : RecursiveTask(depth, order, cookie, is_reentrant) { |
+ } |
+ |
+ virtual void Run() { |
+ RecursiveTask::Run(); |
+ PlatformThread::Sleep(10); // milliseconds |
+ } |
+}; |
+ |
class QuitTask : public OrderedTasks { |
public: |
QuitTask(TaskList* order, int cookie) |
@@ -893,6 +905,42 @@ |
EXPECT_EQ(order[13], TaskItem(RECURSIVE, 2, false)); |
} |
+void RunTest_RecursiveDenial3(MessageLoop::Type message_loop_type) { |
+ MessageLoop loop(message_loop_type); |
+ |
+ EXPECT_TRUE(MessageLoop::current()->NestableTasksAllowed()); |
+ TaskList order; |
+ MessageLoop::current()->PostTask(FROM_HERE, |
+ new RecursiveSlowTask(2, &order, 1, false)); |
+ MessageLoop::current()->PostTask(FROM_HERE, |
+ new RecursiveSlowTask(2, &order, 2, false)); |
+ MessageLoop::current()->PostDelayedTask(FROM_HERE, |
+ new OrderedTasks(&order, 3), 5); |
+ MessageLoop::current()->PostDelayedTask(FROM_HERE, |
+ new QuitTask(&order, 4), 5); |
+ |
+ MessageLoop::current()->Run(); |
+ |
+ // FIFO order. |
+ ASSERT_EQ(16U, order.size()); |
+ EXPECT_EQ(order[ 0], TaskItem(RECURSIVE, 1, true)); |
+ EXPECT_EQ(order[ 1], TaskItem(RECURSIVE, 1, false)); |
+ EXPECT_EQ(order[ 2], TaskItem(RECURSIVE, 2, true)); |
+ EXPECT_EQ(order[ 3], TaskItem(RECURSIVE, 2, false)); |
+ EXPECT_EQ(order[ 4], TaskItem(RECURSIVE, 1, true)); |
+ EXPECT_EQ(order[ 5], TaskItem(RECURSIVE, 1, false)); |
+ EXPECT_EQ(order[ 6], TaskItem(ORDERERD, 3, true)); |
+ EXPECT_EQ(order[ 7], TaskItem(ORDERERD, 3, false)); |
+ EXPECT_EQ(order[ 8], TaskItem(RECURSIVE, 2, true)); |
+ EXPECT_EQ(order[ 9], TaskItem(RECURSIVE, 2, false)); |
+ EXPECT_EQ(order[10], TaskItem(QUITMESSAGELOOP, 4, true)); |
+ EXPECT_EQ(order[11], TaskItem(QUITMESSAGELOOP, 4, false)); |
+ EXPECT_EQ(order[12], TaskItem(RECURSIVE, 1, true)); |
+ EXPECT_EQ(order[13], TaskItem(RECURSIVE, 1, false)); |
+ EXPECT_EQ(order[14], TaskItem(RECURSIVE, 2, true)); |
+ EXPECT_EQ(order[15], TaskItem(RECURSIVE, 2, false)); |
+} |
+ |
void RunTest_RecursiveSupport1(MessageLoop::Type message_loop_type) { |
MessageLoop loop(message_loop_type); |
@@ -1426,6 +1474,12 @@ |
RunTest_RecursiveDenial1(MessageLoop::TYPE_IO); |
} |
+TEST(MessageLoopTest, RecursiveDenial3) { |
+ RunTest_RecursiveDenial3(MessageLoop::TYPE_DEFAULT); |
+ RunTest_RecursiveDenial3(MessageLoop::TYPE_UI); |
+ RunTest_RecursiveDenial3(MessageLoop::TYPE_IO); |
+} |
+ |
TEST(MessageLoopTest, RecursiveSupport1) { |
RunTest_RecursiveSupport1(MessageLoop::TYPE_DEFAULT); |
RunTest_RecursiveSupport1(MessageLoop::TYPE_UI); |