Skip to content

Commit

Permalink
LibJS: Add a function to ensure calls are made within the same second
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
davidot authored and linusg committed Dec 3, 2022
1 parent 146d45a commit cf0d30a
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
23 changes: 23 additions & 0 deletions Userland/Libraries/LibJS/Tests/test-common.js
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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!`
);
};
})();

0 comments on commit cf0d30a

Please sign in to comment.