Index: tests/lib/async/timer_repeat_test.dart |
diff --git a/tests/lib/async/timer_repeat_test.dart b/tests/lib/async/timer_repeat_test.dart |
index e963c5aef01f09c320b935844bfae9689cb7aa50..1ed5139652f8213462268cead79ba64f9306cc95 100644 |
--- a/tests/lib/async/timer_repeat_test.dart |
+++ b/tests/lib/async/timer_repeat_test.dart |
@@ -11,16 +11,24 @@ const Duration TIMEOUT = const Duration(milliseconds: 500); |
const int ITERATIONS = 5; |
Timer timer; |
-int startTime; |
+Stopwatch stopwatch = new Stopwatch(); |
int iteration; |
+// Some browsers (Firefox and IE so far) can trigger too early. Add a safety |
+// margin. We use identical(1, 1.0) as an easy way to know if the test is |
+// compiled by dart2js. |
+int get safetyMargin => identical(1, 1.0) ? 100 : 0; |
+ |
void timeoutHandler(Timer timer) { |
- int endTime = (new DateTime.now()).millisecondsSinceEpoch; |
iteration++; |
- if (iteration < ITERATIONS) { |
- startTime = (new DateTime.now()).millisecondsSinceEpoch; |
- } else { |
- expect(iteration, ITERATIONS); |
+ expect(iteration, lessThanOrEqualTo(ITERATIONS)); |
+ if (iteration == ITERATIONS) { |
+ // When we are done with all of the iterations, we expect a |
+ // certain amount of time to have passed. Checking the time on |
+ // each iteration doesn't work because the timeoutHandler runs |
+ // concurrently with the periodic timer. |
+ expect(stopwatch.elapsedMilliseconds + safetyMargin, |
+ greaterThanOrEqualTo(ITERATIONS * TIMEOUT.inMilliseconds)); |
timer.cancel(); |
} |
} |
@@ -28,7 +36,7 @@ void timeoutHandler(Timer timer) { |
main() { |
test("timer_repeat", () { |
iteration = 0; |
- startTime = new DateTime.now().millisecondsSinceEpoch; |
+ stopwatch.start(); |
timer = new Timer.periodic(TIMEOUT, |
expectAsync(timeoutHandler, count: ITERATIONS)); |
}); |