Procházet zdrojové kódy

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.
davidot před 2 roky
rodič
revize
cf0d30add6

+ 12 - 6
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);

+ 6 - 6
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);

+ 23 - 0
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!`
+        );
+    };
 })();