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

[Tests]: System time tampering effects on _.throttle and _.debounce methods #2913

Merged
Merged
Changes from 1 commit
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
116 changes: 102 additions & 14 deletions test/functions.js
Original file line number Diff line number Diff line change
Expand Up @@ -390,22 +390,66 @@
var counter = 0;
var incr = function(){ counter++; };
var throttledIncr = _.throttle(incr, 100);
var origNowFunc = _.now;
var originalNowFunc = Date.now;
var originalGetTimeFunc = Date.prototype.getTime;

throttledIncr();
assert.strictEqual(counter, 1);
_.now = function() {
return new Date(2013, 0, 1, 1, 1, 1);
};
assert.strictEqual(counter, 1, '_.throttle: incr was called immediately');
Copy link
Collaborator

Choose a reason for hiding this comment

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

Yes, good to add a comment to the assertion. Much clearer if it fails. 👍


Date.prototype.getTime = function() {
return +(new Date(2013, 0, 1, 1, 1, 1));
}
Date.now = function() {
return +(new Date(2013, 0, 1, 1, 1, 1));
}

_.delay(function() {
throttledIncr();
assert.strictEqual(counter, 2);
assert.strictEqual(counter, 2, '_.throttle: incr was called successfully, with tampered system time');
done();
_.now = origNowFunc;
Date.now = originalNowFunc;
Date.prototype.getTime = originalGetTimeFunc;
}, 200);
});

QUnit.test('throttle continues to function after system time is not accessible (or in invalid format)', function(assert) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Wow!

assert.expect(3);
var done = assert.async();
var counter = 0;
var incr = function(){ counter++; };
var throttledIncr = _.throttle(incr, 100);
var originalNowFunc = Date.now;
var originalGetTimeFunc = Date.prototype.getTime;
var originalValueOfFunc = Date.prototype.valueOf;

throttledIncr();
assert.strictEqual(counter, 1, '_.throttle: incr was called immediately');

Date.prototype.valueOf = function() {
return null;
}
Date.prototype.getTime = function() {
return null;
}
Date.now = function() {
return null;
}

_.delay(function() {
throttledIncr();
assert.strictEqual(counter, 2, '_.throttle: incr was debounced successfully, with tampered system time');
Copy link
Collaborator

Choose a reason for hiding this comment

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

Throttling and debouncing are subtly different things, so to prevent confusion, I'd rather avoid the word "debounce" here. There is no convention to prefix all assertion comments with a qualified function name (at least not as far as I'm aware) and I don't think such a convention is necessary, either, so I suggest just changing it to this:

Suggested change
assert.strictEqual(counter, 2, '_.throttle: incr was debounced successfully, with tampered system time');
assert.strictEqual(counter, 2, 'incr was throttled successfully, with tampered system time');

Date.now = originalNowFunc;
Date.prototype.getTime = originalGetTimeFunc;
Date.prototype.valueOf = originalValueOfFunc;
}, 200);

_.delay(function() {
throttledIncr();
assert.strictEqual(counter, 3, '_.throttle: incr was debounced successfully, after system time method restoration');
Copy link
Collaborator

Choose a reason for hiding this comment

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

likewise

Suggested change
assert.strictEqual(counter, 3, '_.throttle: incr was debounced successfully, after system time method restoration');
assert.strictEqual(counter, 3, 'incr was throttled successfully, after system time method restoration');

done();
}, 400);
});

QUnit.test('throttle re-entrant', function(assert) {
assert.expect(2);
var done = assert.async();
Expand Down Expand Up @@ -542,24 +586,68 @@
assert.expect(2);
var done = assert.async();
var counter = 0;
var origNowFunc = _.now;
var debouncedIncr = _.debounce(function(){
counter++;
}, 100, true);
var originalNowFunc = Date.now;
var originalGetTimeFunc = Date.prototype.getTime;

debouncedIncr();
assert.strictEqual(counter, 1, 'incr was called immediately');
assert.strictEqual(counter, 1, '_.debounce: incr was called immediately');

_.now = function() {
return new Date(2013, 0, 1, 1, 1, 1);
};
Date.prototype.getTime = function() {
return +(new Date(2013, 0, 1, 1, 1, 1));
}
Date.now = function() {
return +(new Date(2013, 0, 1, 1, 1, 1));
}

_.delay(function() {
debouncedIncr();
assert.strictEqual(counter, 2, 'incr was debounced successfully');
assert.strictEqual(counter, 2, '_.debounce: incr was debounced successfully, with tampered system time');
Copy link
Collaborator

Choose a reason for hiding this comment

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

for brevity

Suggested change
assert.strictEqual(counter, 2, '_.debounce: incr was debounced successfully, with tampered system time');
assert.strictEqual(counter, 2, 'incr was debounced successfully, with tampered system time');

done();
_.now = origNowFunc;
Date.now = originalNowFunc;
Date.prototype.getTime = originalGetTimeFunc;
}, 200);
});

QUnit.test('debounce after system time is is not accessible (or in invalid format)', function(assert) {
assert.expect(3);
var done = assert.async();
var counter = 0;
var debouncedIncr = _.debounce(function(){
counter++;
}, 100, true);
var originalNowFunc = Date.now;
var originalGetTimeFunc = Date.prototype.getTime;
var originalValueOfFunc = Date.prototype.valueOf;

debouncedIncr();
assert.strictEqual(counter, 1, '_.debounce: incr was called immediately');

Date.prototype.valueOf = function() {
return null;
};
Date.prototype.getTime = function() {
return null;
};
Date.now = function() {
return null;
};

_.delay(function() {
debouncedIncr();
assert.strictEqual(counter, 2, '_.debounce: incr was debounced successfully, with tampered system time');
Copy link
Collaborator

Choose a reason for hiding this comment

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

again for brevity

Suggested change
assert.strictEqual(counter, 2, '_.debounce: incr was debounced successfully, with tampered system time');
assert.strictEqual(counter, 2, 'incr was debounced successfully, with tampered system time');

Date.now = originalNowFunc;
Date.prototype.getTime = originalGetTimeFunc;
Date.prototype.valueOf = originalValueOfFunc;
}, 200);

_.delay(function() {
debouncedIncr();
assert.strictEqual(counter, 3, '_.debounce: incr was debounced successfully, after system time method restoration');
Copy link
Collaborator

Choose a reason for hiding this comment

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

and one last time.

Suggested change
assert.strictEqual(counter, 3, '_.debounce: incr was debounced successfully, after system time method restoration');
assert.strictEqual(counter, 3, 'incr was debounced successfully, after system time method restoration');

done();
}, 400);
});

QUnit.test('debounce re-entrant', function(assert) {
Expand Down