Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Return empty arrays for performance.getEntries, other relevant methods #240

Merged
merged 3 commits into from
May 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/lolex-src.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ function withGlobal(_global) {
// see https://github.com/cjohansen/Sinon.JS/pull/436

var NOOP = function () { return undefined; };
var NOOP_ARRAY = function () { return []; };
var timeoutResult = _global.setTimeout(NOOP, 0);
var addTimerReturnsObject = typeof timeoutResult === "object";
var hrtimePresent = (_global.process && typeof _global.process.hrtime === "function");
Expand Down Expand Up @@ -849,7 +850,12 @@ function withGlobal(_global) {
Object
.getOwnPropertyNames(proto)
.forEach(function (name) {
clock.performance[name] = NOOP;
if (name.indexOf("getEntries") === 0) {
// match expected return type for getEntries functions
clock.performance[name] = NOOP_ARRAY;
} else {
clock.performance[name] = NOOP;
}
});
}

Expand Down
22 changes: 22 additions & 0 deletions test/lolex-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2084,6 +2084,28 @@ describe("lolex", function () {
delete Performance.prototype.someFunc2;
delete Performance.prototype.someFunc3;
});

it("should replace the getEntries, getEntriesByX methods with noops that return []", function () {
Performance.prototype.getEntries =
Performance.prototype.getEntriesByName =
Performance.prototype.getEntriesByType = function () { return ["foo"]; };

this.clock = lolex.install();

assert.equals(performance.getEntries(), []);
assert.equals(performance.getEntriesByName(), []);
assert.equals(performance.getEntriesByType(), []);

this.clock.uninstall();

assert.equals(performance.getEntries(), ["foo"]);
assert.equals(performance.getEntriesByName(), ["foo"]);
assert.equals(performance.getEntriesByType(), ["foo"]);

delete Performance.prototype.getEntries;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am just wondering about the cleanup bit. Will the original functions now be "restored"?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just added a test that the original functions are restored, it does appear to work.

I also have a test for Cypress that runs in actual Chrome that shows the restoration working IRL: https://github.com/cypress-io/cypress/pull/4108/files#diff-c0a131a0b58412db68e166e9d7a16383R75

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think he asked about the restoration within tests since you override and delete from prototype

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, I don't see what you mean. Is there something else that needs to be tested?

Copy link
Member

@SimenB SimenB May 5, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dunno, maybe something like

const origGetEntries = Performance.prototype.getEntries;
const origGetEntriesByName = Performance.prototype.getEntriesByName;
const origGetEntriesByType = Performance.prototype.getEntriesByType; =

then restore them instead of the delete? not sure. If the Performance object is already a fake, then it doesn't matter and I probably misunderstood 🙂

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I could be wrong, but it looks like lolex just uses the prototype to know what methods to override on the global performance, so I don't think anything additional needs to be tested here.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@fatso83 is this ready?

Copy link
Contributor

@fatso83 fatso83 May 13, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure. If you and Ben thinks this is fine, go ahead. I didn't mean to be a blocker (too busy these days with 👶)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine :]

delete Performance.prototype.getEntriesByName;
delete Performance.prototype.getEntriesByTime;
});
}

if (Object.getPrototypeOf(global)) {
Expand Down