From cf0d30add65716fae8a386da24973caa05b8db5e Mon Sep 17 00:00:00 2001 From: davidot Date: Fri, 2 Dec 2022 17:25:40 +0100 Subject: [PATCH] LibJS: Add a function to ensure calls are made within the same second Before these tests could be flaky if they happened to be called around the edge of a second. Now we try up to 5 times to execute the tests while staying within the same second. --- .../Temporal/Now/Now.plainDateTime.js | 18 ++++++++++----- .../Temporal/Now/Now.plainDateTimeISO.js | 12 +++++----- Userland/Libraries/LibJS/Tests/test-common.js | 23 +++++++++++++++++++ 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/Userland/Libraries/LibJS/Tests/builtins/Temporal/Now/Now.plainDateTime.js b/Userland/Libraries/LibJS/Tests/builtins/Temporal/Now/Now.plainDateTime.js index 65ba7fbf3ae..5b1c26115f5 100644 --- a/Userland/Libraries/LibJS/Tests/builtins/Temporal/Now/Now.plainDateTime.js +++ b/Userland/Libraries/LibJS/Tests/builtins/Temporal/Now/Now.plainDateTime.js @@ -37,12 +37,15 @@ describe("correct behavior", () => { }, }; - const plainDateTime = Temporal.Now.plainDateTime(calendar, "UTC"); - const plainDateTimeWithOffset = Temporal.Now.plainDateTime(calendar, timeZone); + const [plainDateTime, plainDateTimeWithOffset] = withinSameSecond(() => { + return [ + Temporal.Now.plainDateTime(calendar, "UTC"), + Temporal.Now.plainDateTime(calendar, timeZone), + ]; + }); if (plainDateTime.year !== plainDateTimeWithOffset.year) return; - // Let's hope the duration between the above two lines is less than a second :^) const differenceSeconds = plainDateTimeToEpochSeconds(plainDateTimeWithOffset) - plainDateTimeToEpochSeconds(plainDateTime); @@ -58,12 +61,15 @@ describe("correct behavior", () => { }, }; - const plainDateTime = Temporal.Now.plainDateTime(calendar, "UTC"); - const plainDateTimeWithOffset = Temporal.Now.plainDateTime(calendar, timeZone); + const [plainDateTime, plainDateTimeWithOffset] = withinSameSecond(() => { + return [ + Temporal.Now.plainDateTime(calendar, "UTC"), + Temporal.Now.plainDateTime(calendar, timeZone), + ]; + }); if (plainDateTime.year !== plainDateTimeWithOffset.year) return; - // Let's hope the duration between the above two lines is less than a second :^) const differenceSeconds = plainDateTimeToEpochSeconds(plainDateTimeWithOffset) - plainDateTimeToEpochSeconds(plainDateTime); diff --git a/Userland/Libraries/LibJS/Tests/builtins/Temporal/Now/Now.plainDateTimeISO.js b/Userland/Libraries/LibJS/Tests/builtins/Temporal/Now/Now.plainDateTimeISO.js index 587deb2f29c..a9f49ff3571 100644 --- a/Userland/Libraries/LibJS/Tests/builtins/Temporal/Now/Now.plainDateTimeISO.js +++ b/Userland/Libraries/LibJS/Tests/builtins/Temporal/Now/Now.plainDateTimeISO.js @@ -35,12 +35,12 @@ describe("correct behavior", () => { }, }; - const plainDateTime = Temporal.Now.plainDateTimeISO("UTC"); - const plainDateTimeWithOffset = Temporal.Now.plainDateTimeISO(timeZone); + const [plainDateTime, plainDateTimeWithOffset] = withinSameSecond(() => { + return [Temporal.Now.plainDateTimeISO("UTC"), Temporal.Now.plainDateTimeISO(timeZone)]; + }); if (plainDateTime.year !== plainDateTimeWithOffset.year) return; - // Let's hope the duration between the above two lines is less than a second :^) const differenceSeconds = plainDateTimeToEpochSeconds(plainDateTimeWithOffset) - plainDateTimeToEpochSeconds(plainDateTime); @@ -55,12 +55,12 @@ describe("correct behavior", () => { }, }; - const plainDateTime = Temporal.Now.plainDateTimeISO("UTC"); - const plainDateTimeWithOffset = Temporal.Now.plainDateTimeISO(timeZone); + const [plainDateTime, plainDateTimeWithOffset] = withinSameSecond(() => { + return [Temporal.Now.plainDateTimeISO("UTC"), Temporal.Now.plainDateTimeISO(timeZone)]; + }); if (plainDateTime.year !== plainDateTimeWithOffset.year) return; - // Let's hope the duration between the above two lines is less than a second :^) const differenceSeconds = plainDateTimeToEpochSeconds(plainDateTimeWithOffset) - plainDateTimeToEpochSeconds(plainDateTime); diff --git a/Userland/Libraries/LibJS/Tests/test-common.js b/Userland/Libraries/LibJS/Tests/test-common.js index 8d1ea280a05..0c177e72808 100644 --- a/Userland/Libraries/LibJS/Tests/test-common.js +++ b/Userland/Libraries/LibJS/Tests/test-common.js @@ -1,6 +1,7 @@ var describe; var test; var expect; +var withinSameSecond; // Stores the results of each test and suite. Has a terrible // name to avoid name collision. @@ -611,4 +612,26 @@ class ExpectationError extends Error { duration: 0, }; }; + + withinSameSecond = callback => { + let callbackDuration; + for (let tries = 0; tries < 5; tries++) { + const start = Temporal.Now.instant(); + const result = callback(); + const end = Temporal.Now.instant(); + if (start.epochSeconds !== end.epochSeconds) { + callbackDuration = start.until(end); + continue; + } + return result; + } + throw new ExpectationError( + `Tried to execute callback '${callback}' 5 times within the same second but ` + + `failed. Make sure the callback does as little work as possible (the last run ` + + `took ${callbackDuration.total( + "milliseconds" + )} ms) and the machine is not overloaded. If you see this ` + + `error appearing in the CI it is most likely a flaky failure!` + ); + }; })();