Skip to content

Commit 3a2ad87

Browse files
committed
test: make harder for flaky test to fail
1 parent d0afd1e commit 3a2ad87

1 file changed

Lines changed: 27 additions & 26 deletions

File tree

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
11
describe("Runtime exposes", function () {
22
it("__time a low overhead, high resolution, time in ms.", function () {
3-
// Try to get the times using Date.now and __time and compare the results, expect them to be somewhat "close".
4-
// Sometimes GC hits after Date.now is captured but before __time or the vice-versa and the test fails,
5-
// so we are giving it several attempts.
6-
for (var i = 0; i < 5; i++) {
7-
try {
8-
var dateTimeStart = Date.now();
9-
var timeStart = __time();
10-
var acc = 0;
11-
var s = android.os.SystemClock.elapsedRealtime();
12-
for (var i = 0; i < 1000; i++) {
13-
var c = android.os.SystemClock.elapsedRealtime();
14-
acc += c - s;
15-
s = c;
16-
}
17-
var dateTimeEnd = Date.now();
18-
var timeEnd = __time();
19-
var dateDelta = dateTimeEnd - dateTimeStart;
20-
var timeDelta = timeEnd - timeStart;
21-
var tolerance = Math.max(10, dateDelta * 0.5);
22-
expect(timeDelta > 0).toBe(true);
23-
expect(Math.abs(dateDelta - timeDelta) < tolerance).toBe(true);
24-
break;
25-
} catch (e) {
26-
if (i == 4) {
27-
throw e;
28-
}
3+
// Compare the Date.now and __time deltas over the same interval and expect
4+
// them to be somewhat "close". A GC pause or scheduler preemption landing
5+
// between the capture of the two clocks skews a single measurement, so the
6+
// window is kept wide enough for the proportional tolerance to absorb
7+
// realistic pauses, and the measurement is retried a few times with the
8+
// expectation only recorded once (jasmine expectations don't throw, so a
9+
// try/catch based retry would record the failed attempts anyway).
10+
var attempts = 5;
11+
var dateDelta, timeDelta, tolerance;
12+
var ok = false;
13+
14+
for (var attempt = 0; attempt < attempts && !ok; attempt++) {
15+
var dateTimeStart = Date.now();
16+
var timeStart = __time();
17+
18+
while (Date.now() - dateTimeStart < 50) {
19+
// busy-wait to widen the measured interval
2920
}
21+
22+
var dateTimeEnd = Date.now();
23+
var timeEnd = __time();
24+
25+
dateDelta = dateTimeEnd - dateTimeStart;
26+
timeDelta = timeEnd - timeStart;
27+
tolerance = Math.max(10, dateDelta * 0.5);
28+
ok = timeDelta > 0 && Math.abs(dateDelta - timeDelta) < tolerance;
3029
}
30+
31+
expect(ok).toBe(true, "__time delta " + timeDelta + "ms diverged from Date.now delta " + dateDelta + "ms (tolerance " + tolerance + "ms) on all " + attempts + " attempts");
3132
});
3233
});

0 commit comments

Comments
 (0)