Index: base/message_pump_glib_unittest.cc |
diff --git a/base/message_pump_glib_unittest.cc b/base/message_pump_glib_unittest.cc |
index 69fbb951b0cdef4db0784e0bedb44f69ca3b1e06..5d838a1c84f687c79652701f8ce2eac19196dbb6 100644 |
--- a/base/message_pump_glib_unittest.cc |
+++ b/base/message_pump_glib_unittest.cc |
@@ -9,6 +9,7 @@ |
#include <algorithm> |
#include <vector> |
+#include "base/callback.h" |
#include "base/memory/ref_counted.h" |
#include "base/message_loop.h" |
#include "base/threading/thread.h" |
@@ -57,24 +58,26 @@ class EventInjector { |
Event event = events_[0]; |
events_.erase(events_.begin()); |
++processed_events_; |
- if (event.task) { |
+ if (!event.callback.is_null()) { |
+ event.callback.Run(); |
+ } else if (event.task) { |
event.task->Run(); |
delete event.task; |
} |
} |
- // Adds an event to the queue. When "handled", executes |task|. |
+ // Adds an event to the queue. When "handled", executes |callback|. |
// delay_ms is relative to the last event if any, or to Now() otherwise. |
- void AddEvent(int delay_ms, Task* task) { |
- base::Time last_time; |
- if (!events_.empty()) { |
- last_time = (events_.end()-1)->time; |
- } else { |
- last_time = base::Time::NowFromSystemTime(); |
- } |
- base::Time future = last_time + base::TimeDelta::FromMilliseconds(delay_ms); |
- EventInjector::Event event = { future, task }; |
- events_.push_back(event); |
+ void AddEvent(int delay_ms, const base::Closure& callback) { |
+ AddEventHelper(delay_ms, callback, NULL); |
+ } |
+ |
+ void AddDummyEvent(int delay_ms) { |
+ AddEventHelper(delay_ms, base::Closure(), NULL); |
+ } |
+ |
+ void AddEventAsTask(int delay_ms, Task* task) { |
+ AddEventHelper(delay_ms, base::Closure(), task); |
} |
void Reset() { |
@@ -87,6 +90,7 @@ class EventInjector { |
private: |
struct Event { |
base::Time time; |
+ base::Closure callback; |
Task* task; |
}; |
@@ -94,6 +98,18 @@ class EventInjector { |
EventInjector* injector; |
}; |
+ void AddEventHelper(int delay_ms, const base::Closure& callback, Task* task) { |
+ base::Time last_time; |
+ if (!events_.empty()) { |
+ last_time = (events_.end()-1)->time; |
+ } else { |
+ last_time = base::Time::NowFromSystemTime(); |
+ } |
+ base::Time future = last_time + base::TimeDelta::FromMilliseconds(delay_ms); |
+ EventInjector::Event event = { future, callback, task }; |
+ events_.push_back(event); |
+ } |
+ |
static gboolean Prepare(GSource* source, gint* timeout_ms) { |
*timeout_ms = static_cast<Source*>(source)->injector->HandlePrepare(); |
return FALSE; |
@@ -137,16 +153,6 @@ void ExpectProcessedEvents(EventInjector* injector, int count) { |
EXPECT_EQ(injector->processed_events(), count); |
} |
-// Quits the current message loop. |
-void QuitMessageLoop() { |
- MessageLoop::current()->Quit(); |
-} |
- |
-// Returns a new task that quits the main loop. |
-Task* NewQuitTask() { |
- return NewRunnableFunction(QuitMessageLoop); |
-} |
- |
// Posts a task on the current message loop. |
void PostMessageLoopTask(const tracked_objects::Location& from_here, |
Task* task) { |
@@ -188,13 +194,13 @@ TEST_F(MessagePumpGLibTest, TestQuit) { |
// Checks that Quit works and that the basic infrastructure is working. |
// Quit from a task |
- loop()->PostTask(FROM_HERE, NewQuitTask()); |
+ loop()->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
loop()->Run(); |
EXPECT_EQ(0, injector()->processed_events()); |
injector()->Reset(); |
// Quit from an event |
- injector()->AddEvent(0, NewQuitTask()); |
+ injector()->AddEvent(0, MessageLoop::QuitClosure()); |
loop()->Run(); |
EXPECT_EQ(1, injector()->processed_events()); |
} |
@@ -207,23 +213,23 @@ TEST_F(MessagePumpGLibTest, TestEventTaskInterleave) { |
// If changes cause this test to fail, it is reasonable to change it, but |
// TestWorkWhileWaitingForEvents and TestEventsWhileWaitingForWork have to be |
// changed accordingly, otherwise they can become flaky. |
- injector()->AddEvent(0, NewRunnableFunction(DoNothing)); |
+ injector()->AddEventAsTask(0, NewRunnableFunction(DoNothing)); |
Task* check_task = NewRunnableFunction(ExpectProcessedEvents, injector(), 2); |
Task* posted_task = NewRunnableFunction(PostMessageLoopTask, |
FROM_HERE, check_task); |
- injector()->AddEvent(0, posted_task); |
- injector()->AddEvent(0, NewRunnableFunction(DoNothing)); |
- injector()->AddEvent(0, NewQuitTask()); |
+ injector()->AddEventAsTask(0, posted_task); |
+ injector()->AddEventAsTask(0, NewRunnableFunction(DoNothing)); |
+ injector()->AddEvent(0, MessageLoop::QuitClosure()); |
loop()->Run(); |
EXPECT_EQ(4, injector()->processed_events()); |
injector()->Reset(); |
- injector()->AddEvent(0, NewRunnableFunction(DoNothing)); |
+ injector()->AddEventAsTask(0, NewRunnableFunction(DoNothing)); |
check_task = NewRunnableFunction(ExpectProcessedEvents, injector(), 2); |
posted_task = NewRunnableFunction(PostMessageLoopTask, FROM_HERE, check_task); |
- injector()->AddEvent(0, posted_task); |
- injector()->AddEvent(10, NewRunnableFunction(DoNothing)); |
- injector()->AddEvent(0, NewQuitTask()); |
+ injector()->AddEventAsTask(0, posted_task); |
+ injector()->AddEventAsTask(10, NewRunnableFunction(DoNothing)); |
+ injector()->AddEvent(0, MessageLoop::QuitClosure()); |
loop()->Run(); |
EXPECT_EQ(4, injector()->processed_events()); |
} |
@@ -239,7 +245,7 @@ TEST_F(MessagePumpGLibTest, TestWorkWhileWaitingForEvents) { |
// quit. |
loop()->PostTask( |
FROM_HERE, NewRunnableMethod(injector(), &EventInjector::AddEvent, |
- 0, NewQuitTask())); |
+ 0, MessageLoop::QuitClosure())); |
loop()->Run(); |
ASSERT_EQ(10, task_count); |
EXPECT_EQ(1, injector()->processed_events()); |
@@ -257,7 +263,7 @@ TEST_F(MessagePumpGLibTest, TestWorkWhileWaitingForEvents) { |
// That is verified in message_loop_unittest.cc. |
loop()->PostDelayedTask( |
FROM_HERE, NewRunnableMethod(injector(), &EventInjector::AddEvent, |
- 10, NewQuitTask()), 150); |
+ 10, MessageLoop::QuitClosure()), 150); |
loop()->Run(); |
ASSERT_EQ(10, task_count); |
EXPECT_EQ(1, injector()->processed_events()); |
@@ -267,7 +273,7 @@ TEST_F(MessagePumpGLibTest, TestEventsWhileWaitingForWork) { |
// Tests that we process events while waiting for work. |
// The event queue is empty at first. |
for (int i = 0; i < 10; ++i) { |
- injector()->AddEvent(0, NULL); |
+ injector()->AddDummyEvent(0); |
} |
// After all the events have been processed, post a task that will check that |
// the events have been processed (note: the task executes after the event |
@@ -275,10 +281,10 @@ TEST_F(MessagePumpGLibTest, TestEventsWhileWaitingForWork) { |
Task* check_task = NewRunnableFunction(ExpectProcessedEvents, injector(), 11); |
Task* posted_task = NewRunnableFunction(PostMessageLoopTask, |
FROM_HERE, check_task); |
- injector()->AddEvent(10, posted_task); |
+ injector()->AddEventAsTask(10, posted_task); |
// And then quit (relies on the condition tested by TestEventTaskInterleave). |
- injector()->AddEvent(10, NewQuitTask()); |
+ injector()->AddEvent(10, MessageLoop::QuitClosure()); |
loop()->Run(); |
EXPECT_EQ(12, injector()->processed_events()); |
@@ -316,7 +322,7 @@ class ConcurrentHelper : public base::RefCounted<ConcurrentHelper> { |
if (task_count_ == 0 && event_count_ == 0) { |
MessageLoop::current()->Quit(); |
} else { |
- injector_->AddEvent( |
+ injector_->AddEventAsTask( |
0, NewRunnableMethod(this, &ConcurrentHelper::FromEvent)); |
} |
} |
@@ -349,9 +355,9 @@ TEST_F(MessagePumpGLibTest, TestConcurrentEventPostedTask) { |
// Add 2 events to the queue to make sure it is always full (when we remove |
// the event before processing it). |
- injector()->AddEvent( |
+ injector()->AddEventAsTask( |
0, NewRunnableMethod(helper.get(), &ConcurrentHelper::FromEvent)); |
- injector()->AddEvent( |
+ injector()->AddEventAsTask( |
0, NewRunnableMethod(helper.get(), &ConcurrentHelper::FromEvent)); |
// Similarly post 2 tasks. |
@@ -369,10 +375,10 @@ namespace { |
void AddEventsAndDrainGLib(EventInjector* injector) { |
// Add a couple of dummy events |
- injector->AddEvent(0, NULL); |
- injector->AddEvent(0, NULL); |
+ injector->AddDummyEvent(0); |
+ injector->AddDummyEvent(0); |
// Then add an event that will quit the main loop. |
- injector->AddEvent(0, NewQuitTask()); |
+ injector->AddEvent(0, MessageLoop::QuitClosure()); |
// Post a couple of dummy tasks |
MessageLoop::current()->PostTask(FROM_HERE, NewRunnableFunction(DoNothing)); |
@@ -401,10 +407,10 @@ namespace { |
#if defined(TOOLKIT_USES_GTK) |
void AddEventsAndDrainGtk(EventInjector* injector) { |
// Add a couple of dummy events |
- injector->AddEvent(0, NULL); |
- injector->AddEvent(0, NULL); |
+ injector->AddDummyEvent(0); |
+ injector->AddDummyEvent(0); |
// Then add an event that will quit the main loop. |
- injector->AddEvent(0, NewQuitTask()); |
+ injector->AddEvent(0, MessageLoop::QuitClosure()); |
// Post a couple of dummy tasks |
MessageLoop::current()->PostTask(FROM_HERE, NewRunnableFunction(DoNothing)); |
@@ -478,16 +484,16 @@ void TestGLibLoopInternal(EventInjector* injector) { |
int task_count = 0; |
// Add a couple of dummy events |
- injector->AddEvent(0, NULL); |
- injector->AddEvent(0, NULL); |
+ injector->AddDummyEvent(0); |
+ injector->AddDummyEvent(0); |
// Post a couple of dummy tasks |
MessageLoop::current()->PostTask( |
FROM_HERE, NewRunnableFunction(IncrementInt, &task_count)); |
MessageLoop::current()->PostTask( |
FROM_HERE, NewRunnableFunction(IncrementInt, &task_count)); |
// Delayed events |
- injector->AddEvent(10, NULL); |
- injector->AddEvent(10, NULL); |
+ injector->AddDummyEvent(10); |
+ injector->AddDummyEvent(10); |
// Delayed work |
MessageLoop::current()->PostDelayedTask( |
FROM_HERE, NewRunnableFunction(IncrementInt, &task_count), 30); |
@@ -509,16 +515,16 @@ void TestGtkLoopInternal(EventInjector* injector) { |
int task_count = 0; |
// Add a couple of dummy events |
- injector->AddEvent(0, NULL); |
- injector->AddEvent(0, NULL); |
+ injector->AddDummyEvent(0); |
+ injector->AddDummyEvent(0); |
// Post a couple of dummy tasks |
MessageLoop::current()->PostTask( |
FROM_HERE, NewRunnableFunction(IncrementInt, &task_count)); |
MessageLoop::current()->PostTask( |
FROM_HERE, NewRunnableFunction(IncrementInt, &task_count)); |
// Delayed events |
- injector->AddEvent(10, NULL); |
- injector->AddEvent(10, NULL); |
+ injector->AddDummyEvent(10); |
+ injector->AddDummyEvent(10); |
// Delayed work |
MessageLoop::current()->PostDelayedTask( |
FROM_HERE, NewRunnableFunction(IncrementInt, &task_count), 30); |