Index: base/idletimer_unittest.cc |
=================================================================== |
--- base/idletimer_unittest.cc (revision 4457) |
+++ base/idletimer_unittest.cc (working copy) |
@@ -10,6 +10,13 @@ |
using base::TimeDelta; |
using base::IdleTimer; |
+ |
+// If the timers fire too quickly, it can be tricky to make timer tests |
+// reliable on all buildbots. This constant sets a minimum timer delta where |
+// we expect that we should be able to reliably count timers without problems |
+// due to slight clock/scheduling variances. |
+const int kSafeTestIntervalMs = 500; |
+ |
namespace { |
// We Mock the GetLastInputInfo function to return |
@@ -27,7 +34,7 @@ |
class TestIdleTask : public IdleTimer { |
public: |
TestIdleTask(bool repeat) |
- : IdleTimer(TimeDelta::FromMilliseconds(100), repeat), |
+ : IdleTimer(TimeDelta::FromMilliseconds(kSafeTestIntervalMs), repeat), |
idle_counter_(0) { |
set_idle_time_source(MockIdleTimeSource); |
} |
@@ -72,7 +79,7 @@ |
// then will not fire again unless it goes non-idle first. |
TEST_F(IdleTimerTest, NoRepeatIdle) { |
- // Create an IdleTimer, which should fire once after 100ms. |
+ // Create an IdleTimer, which should fire once after 500ms. |
// Create a Quit timer which will fire after 1s. |
// Verify that we fired exactly once. |
@@ -81,7 +88,8 @@ |
TestFinishedTask finish_task; |
base::OneShotTimer<TestFinishedTask> timer; |
- timer.Start(TimeDelta::FromSeconds(1), &finish_task, &TestFinishedTask::Run); |
+ timer.Start(TimeDelta::FromMilliseconds(2 * kSafeTestIntervalMs), |
+ &finish_task, &TestFinishedTask::Run); |
test_task.Start(); |
MessageLoop::current()->Run(); |
@@ -90,9 +98,9 @@ |
} |
TEST_F(IdleTimerTest, NoRepeatFlipIdleOnce) { |
- // Create an IdleTimer, which should fire once after 100ms. |
- // Create a Quit timer which will fire after 1s. |
- // Create a timer to reset once, idle after 500ms. |
+ // Create an IdleTimer, which should fire once after 500ms. |
+ // Create a Quit timer which will fire after 5s. |
+ // Create a timer to reset once, idle after 2s. |
// Verify that we fired exactly twice. |
mock_timer_started = Time::Now(); |
@@ -102,11 +110,11 @@ |
ResetIdleTask reset_task; |
base::OneShotTimer<TestFinishedTask> t1; |
- t1.Start(TimeDelta::FromMilliseconds(1000), &finish_task, |
+ t1.Start(TimeDelta::FromMilliseconds(10 * kSafeTestIntervalMs), &finish_task, |
&TestFinishedTask::Run); |
base::OneShotTimer<ResetIdleTask> t2; |
- t2.Start(TimeDelta::FromMilliseconds(500), &reset_task, |
+ t2.Start(TimeDelta::FromMilliseconds(4 * kSafeTestIntervalMs), &reset_task, |
&ResetIdleTask::Run); |
test_task.Start(); |
@@ -116,8 +124,8 @@ |
} |
TEST_F(IdleTimerTest, NoRepeatNotIdle) { |
- // Create an IdleTimer, which should fire once after 100ms. |
- // Create a Quit timer which will fire after 1s. |
+ // Create an IdleTimer, which should fire once after 500ms. |
+ // Create a Quit timer which will fire after 5s. |
// Create a timer to reset idle every 50ms. |
// Verify that we never fired. |
@@ -128,7 +136,7 @@ |
ResetIdleTask reset_task; |
base::OneShotTimer<TestFinishedTask> t; |
- t.Start(TimeDelta::FromMilliseconds(1000), &finish_task, |
+ t.Start(TimeDelta::FromMilliseconds(10 * kSafeTestIntervalMs), &finish_task, |
&TestFinishedTask::Run); |
base::RepeatingTimer<ResetIdleTask> reset_timer; |
@@ -151,34 +159,33 @@ |
// firing over and over. |
TEST_F(IdleTimerTest, Repeat) { |
- // Create an IdleTimer, which should fire repeatedly after 100ms. |
- // Create a Quit timer which will fire after 1.05s. |
- // Verify that we fired 10 times. |
+ // Create an IdleTimer, which should fire repeatedly after 500ms. |
+ // Create a Quit timer which will fire after 1.5s. |
+ // Verify that we fired 2-3 times. |
mock_timer_started = Time::Now(); |
TestIdleTask test_task(true); |
TestFinishedTask finish_task; |
base::OneShotTimer<TestFinishedTask> t; |
- t.Start(TimeDelta::FromMilliseconds(1050), &finish_task, |
+ t.Start(TimeDelta::FromMilliseconds(kSafeTestIntervalMs * 3), &finish_task, |
&TestFinishedTask::Run); |
test_task.Start(); |
MessageLoop::current()->Run(); |
- // In a perfect world, the idle_counter should be 10. However, |
- // since timers aren't guaranteed to fire perfectly, this can |
- // be less. Just expect more than 5 and no more than 10. |
- EXPECT_GT(test_task.get_idle_counter(), 5); |
- EXPECT_LE(test_task.get_idle_counter(), 10); |
+ // In a perfect world, the idle_counter should be 2. However, |
+ // due to timer 'slop', accept 2 or 3. |
+ EXPECT_GE(test_task.get_idle_counter(), 2); |
+ EXPECT_LE(test_task.get_idle_counter(), 3); |
} |
// TODO(darin): http://code.google.com/p/chromium/issues/detail?id=3780 |
-TEST_F(IdleTimerTest, DISABLED_RepeatIdleReset) { |
- // Create an IdleTimer, which should fire repeatedly after 100ms. |
- // Create a Quit timer which will fire after 1s. |
- // Create a reset timer, which fires after 550ms |
- // Verify that we fired 9 times. |
+TEST_F(IdleTimerTest, RepeatIdleReset) { |
+ // Create an IdleTimer, which should fire repeatedly after 500ms. |
+ // Create a Quit timer which will fire after 5s. |
+ // Create a reset timer, which fires after 2500ms |
+ // Verify that we fired 8-10 times. |
mock_timer_started = Time::Now(); |
TestIdleTask test_task(true); |
@@ -186,11 +193,11 @@ |
TestFinishedTask finish_task; |
base::OneShotTimer<TestFinishedTask> t1; |
- t1.Start(TimeDelta::FromMilliseconds(1000), &finish_task, |
+ t1.Start(TimeDelta::FromMilliseconds(10 * kSafeTestIntervalMs), &finish_task, |
&TestFinishedTask::Run); |
base::OneShotTimer<ResetIdleTask> t2; |
- t2.Start(TimeDelta::FromMilliseconds(550), &reset_task, |
+ t2.Start(TimeDelta::FromMilliseconds(5 * kSafeTestIntervalMs), &reset_task, |
&ResetIdleTask::Run); |
test_task.Start(); |
@@ -198,14 +205,14 @@ |
// In a perfect world, the idle_counter should be 9. However, |
// since timers aren't guaranteed to fire perfectly, this can |
- // be less. Just expect more than 5 and no more than 9. |
- EXPECT_GT(test_task.get_idle_counter(), 5); |
- EXPECT_LE(test_task.get_idle_counter(), 9); |
+ // be less. Accept 8-10. |
+ EXPECT_GE(test_task.get_idle_counter(), 8); |
+ EXPECT_LE(test_task.get_idle_counter(), 10); |
} |
TEST_F(IdleTimerTest, RepeatNotIdle) { |
- // Create an IdleTimer, which should fire repeatedly after 100ms. |
- // Create a Quit timer which will fire after 1s. |
+ // Create an IdleTimer, which should fire repeatedly after 500ms. |
+ // Create a Quit timer which will fire after 4s. |
// Create a timer to reset idle every 50ms. |
// Verify that we never fired. |
@@ -216,7 +223,7 @@ |
ResetIdleTask reset_task; |
base::OneShotTimer<TestFinishedTask> t; |
- t.Start(TimeDelta::FromMilliseconds(1000), &finish_task, |
+ t.Start(TimeDelta::FromMilliseconds(8 * kSafeTestIntervalMs), &finish_task, |
&TestFinishedTask::Run); |
base::RepeatingTimer<ResetIdleTask> reset_timer; |