mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 09:24:57 +00:00
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.
This commit is contained in:
parent
146d45a652
commit
cf0d30add6
3 changed files with 41 additions and 12 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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!`
|
||||
);
|
||||
};
|
||||
})();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue