[Finishes #45476285] Add timeout support to async tests

This commit is contained in:
Colin O'Byrne and JR Boyens
2013-07-23 16:43:42 -07:00
parent 9609aba25f
commit 8f5d0beb8c
6 changed files with 95 additions and 8 deletions

View File

@@ -1,13 +1,14 @@
getJasmineRequireObj().Env = function(j$) {
function Env(options) {
options = options || {};
var self = this;
var global = options.global || j$.getGlobal();
var catchExceptions = true;
var realSetTimeout = j$.getGlobal().setTimeout;
var realClearTimeout = j$.getGlobal().clearTimeout;
this.clock = new j$.Clock(global, new j$.DelayedFunctionScheduler());
var spies = [];
@@ -120,9 +121,13 @@ getJasmineRequireObj().Env = function(j$) {
}
}
var asyncSpecTimeout = 60000;
var queueRunnerFactory = function(options) {
options.catchException = self.catchException;
options.clearStack = options.clearStack || clearStack;
options.realTimer = { setTimeout: realSetTimeout, clearTimeout: realClearTimeout };
options.asyncSpecTimeout = asyncSpecTimeout;
new j$.QueueRunner(options).run(options.fns, 0);
};

View File

@@ -6,6 +6,11 @@ getJasmineRequireObj().QueueRunner = function() {
this.clearStack = attrs.clearStack || function(fn) {fn();};
this.onException = attrs.onException || function() {};
this.catchException = attrs.catchException || function() { return true; };
this.timer = attrs.realTimer;
this.asyncSpecTimeout = attrs.asyncSpecTimeout || 60000;
this.leaf = attrs.leaf || false;
}
QueueRunner.prototype.execute = function() {
@@ -16,16 +21,23 @@ getJasmineRequireObj().QueueRunner = function() {
var length = fns.length,
self = this,
iterativeIndex;
var nextIteration = function(currentIteration) {
return function() {
self.run(fns, currentIteration + 1);
};
};
for(iterativeIndex = recursiveIndex; iterativeIndex < length; iterativeIndex++) {
var fn = fns[iterativeIndex];
if (fn.length > 0) {
var attemptSuccessful = attempt(function() {
fn.call(self, function() { self.run(fns, iterativeIndex + 1); });
});
var attemptSuccessful = attempt(fn, nextIteration(iterativeIndex));
if(attemptSuccessful) {
return;
} else {
// TODO cleanup the timeout ?
}
} else {
attempt(function() { fn.call(self); });
@@ -38,9 +50,24 @@ getJasmineRequireObj().QueueRunner = function() {
this.clearStack(this.onComplete);
}
function attempt(fn) {
function attempt(fn, done) {
var timeout;
try {
fn();
if (self.leaf) {
timeout = self.timer.setTimeout(function() {
self.onException(new Error("timeout"));
done();
}, self.asyncSpecTimeout);
}
var next = function() {
if (self.leaf) { self.timer.clearTimeout(timeout); }
done();
};
fn.call(self, next);
return true;
} catch (e) {
self.onException(e);

View File

@@ -57,6 +57,7 @@ getJasmineRequireObj().Spec = function() {
this.queueRunner({
fns: allFns,
leaf: true,
onException: function(e) {
if (Spec.isPendingSpecException(e)) {
self.pend();