Index: Tools/GardeningServer/scripts/net_unittests.js |
diff --git a/Tools/GardeningServer/scripts/net_unittests.js b/Tools/GardeningServer/scripts/net_unittests.js |
index 193d3d4f7ce944d53ecfd56c16bf9f6195211cd4..fdb7fd263fc22d2dfc4fffe5ce8b768c6e559a7e 100644 |
--- a/Tools/GardeningServer/scripts/net_unittests.js |
+++ b/Tools/GardeningServer/scripts/net_unittests.js |
@@ -29,6 +29,8 @@ function NetworkSimulator() |
this._pendingPromises = []; |
}; |
+NetworkSimulator._testInProgress = false; |
+ |
NetworkSimulator.prototype.schedulePromise = function(promise) { |
this._pendingPromises.push(promise); |
return promise; |
@@ -39,41 +41,62 @@ NetworkSimulator.prototype.resolvePromises = function() { |
return new Promise(function(resolve, reject) { |
var pendingPromises = self._pendingPromises; |
self._pendingPromises = []; |
- function all_resolved (results) { |
+ function allResolved(results) { |
if (self._pendingPromises.length) { |
resolve(self.resolvePromises()); |
return; |
} |
resolve(results); |
} |
- Promise.all(pendingPromises).then(all_resolved, all_resolved); |
+ Promise.all(pendingPromises).then(allResolved, allResolved); |
}); |
}; |
NetworkSimulator.prototype.runTest = function(testCase) |
{ |
+ if (NetworkSimulator._testInProgress) { |
+ ok(false, "runTest calls cannot be nested"); |
+ start(); |
+ return; |
+ } |
+ |
+ NetworkSimulator._testInProgress = true; |
+ |
var self = this; |
- var realNet = window.net; |
return new Promise(function(resolve, reject) { |
+ var realNet = window.net; |
+ |
+ function reset() { |
+ window.net = realNet; |
+ NetworkSimulator._testInProgress = false; |
+ } |
// All net.* methods should return promises. This watches all |
// promises generated by test-overridden methods. |
window.net = {}; |
['probe', 'jsonp', 'get', 'post', |
'ajax', 'json', 'xml'].forEach(function(method) { |
- if (method in self) { |
- net[method] = function() { |
- return self.schedulePromise(self[method].apply(self, arguments)); |
- }; |
- }; |
- }); |
+ if (method in self) { |
+ net[method] = function() { |
+ return self.schedulePromise(self[method].apply(self, arguments)); |
+ }; |
+ }; |
+ }); |
+ |
+ try { |
+ testCase(); |
+ } catch(e) { |
+ // Make sure errors thrown in the test case don't leave window.net in a bad state. |
+ reset(); |
+ ok(false, "Test case threw an error:" + e); |
+ } |
- testCase(); |
self.resolvePromises().then(function() { |
- window.net = realNet; |
+ reset(); |
equal(window.net, realNet); |
resolve(); |
}).catch(function(e) { |
+ reset(); |
ok(false, "Failed to finish test: " + e); |
}); |
}); |