Index: base/timer/timer_unittest.cc |
diff --git a/base/timer/timer_unittest.cc b/base/timer/timer_unittest.cc |
index 0fb2b454ad764f7497dca7878910bee3ca701238..1cbccd1626d558d912a267212325856aa3eff86c 100644 |
--- a/base/timer/timer_unittest.cc |
+++ b/base/timer/timer_unittest.cc |
@@ -4,10 +4,12 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/message_loop/message_loop.h" |
+#include "base/test/test_simple_task_runner.h" |
#include "base/timer/timer.h" |
#include "testing/gtest/include/gtest/gtest.h" |
using base::TimeDelta; |
+using base::SingleThreadTaskRunner; |
namespace { |
@@ -26,20 +28,32 @@ class OneShotTimerTester { |
public: |
explicit OneShotTimerTester(bool* did_run, unsigned milliseconds = 10) |
: did_run_(did_run), |
- delay_ms_(milliseconds) { |
+ delay_ms_(milliseconds), |
+ quit_message_loop_(true) { |
} |
+ |
void Start() { |
timer_.Start(FROM_HERE, TimeDelta::FromMilliseconds(delay_ms_), this, |
&OneShotTimerTester::Run); |
} |
+ |
+ void SetTaskRunner(scoped_refptr<SingleThreadTaskRunner> task_runner) { |
+ quit_message_loop_ = false; |
+ timer_.SetTaskRunner(task_runner); |
+ } |
+ |
private: |
void Run() { |
*did_run_ = true; |
- base::MessageLoop::current()->QuitWhenIdle(); |
+ if (quit_message_loop_) { |
+ base::MessageLoop::current()->QuitWhenIdle(); |
+ } |
} |
+ |
bool* did_run_; |
base::OneShotTimer<OneShotTimerTester> timer_; |
const unsigned delay_ms_; |
+ bool quit_message_loop_; |
}; |
class OneShotSelfDeletingTimerTester { |
@@ -48,16 +62,19 @@ class OneShotSelfDeletingTimerTester { |
did_run_(did_run), |
timer_(new base::OneShotTimer<OneShotSelfDeletingTimerTester>()) { |
} |
+ |
void Start() { |
timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(10), this, |
&OneShotSelfDeletingTimerTester::Run); |
} |
+ |
private: |
void Run() { |
*did_run_ = true; |
timer_.reset(); |
base::MessageLoop::current()->QuitWhenIdle(); |
} |
+ |
bool* did_run_; |
scoped_ptr<base::OneShotTimer<OneShotSelfDeletingTimerTester> > timer_; |
}; |
@@ -71,6 +88,7 @@ class RepeatingTimerTester { |
void Start() { |
timer_.Start(FROM_HERE, delay_, this, &RepeatingTimerTester::Run); |
} |
+ |
private: |
void Run() { |
if (--counter_ == 0) { |
@@ -79,6 +97,7 @@ class RepeatingTimerTester { |
base::MessageLoop::current()->QuitWhenIdle(); |
} |
} |
+ |
bool* did_run_; |
int counter_; |
TimeDelta delay_; |
@@ -310,6 +329,20 @@ TEST(TimerTest, OneShotSelfDeletingTimer) { |
} |
} |
+TEST(TimerTest, OneShotTimer_CustomTaskRunner) { |
+ scoped_refptr<base::TestSimpleTaskRunner> task_runner = |
+ new base::TestSimpleTaskRunner(); |
+ |
+ bool did_run = false; |
+ OneShotTimerTester f(&did_run); |
+ f.SetTaskRunner(task_runner); |
+ f.Start(); |
+ |
+ EXPECT_FALSE(did_run); |
+ task_runner->RunUntilIdle(); |
+ EXPECT_TRUE(did_run); |
+} |
+ |
TEST(TimerTest, RepeatingTimer) { |
for (int i = 0; i < kNumTestingMessageLoops; i++) { |
RunTest_RepeatingTimer(testing_message_loops[i], |