Chromium Code Reviews| Index: Tools/GardeningServer/scripts/network_simulator.js |
| diff --git a/Tools/GardeningServer/scripts/network_simulator.js b/Tools/GardeningServer/scripts/network_simulator.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..f572b6480832632e90a28ff9b28bc6809c37570f |
| --- /dev/null |
| +++ b/Tools/GardeningServer/scripts/network_simulator.js |
| @@ -0,0 +1,83 @@ |
| +/* |
|
ojan
2014/08/12 02:01:18
This should be an html file so we can pull it in w
michaelpg
2014/08/14 00:46:02
Done.
|
| + * Copyright 2014 The Chromium Authors. All rights reserved. |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| + |
| +function NetworkSimulator(assert, done) { |
| + this._assert = assert; |
| + this._done = done; |
| + this._pendingPromises = []; |
| +} |
| + |
| +NetworkSimulator._testInProgress = false; |
| + |
| +NetworkSimulator.prototype.schedulePromise = function(promise) { |
| + this._pendingPromises.push(promise); |
| + return promise; |
| +}; |
| + |
| +NetworkSimulator.prototype.resolvePromises = function() { |
| + var self = this; |
| + return new Promise(function(resolve, reject) { |
| + var pendingPromises = self._pendingPromises; |
| + self._pendingPromises = []; |
| + function allResolved(results) { |
| + if (self._pendingPromises.length) { |
| + resolve(self.resolvePromises()); |
| + return; |
| + } |
| + resolve(results); |
| + } |
| + Promise.all(pendingPromises).then(allResolved, allResolved); |
| + }); |
| +}; |
| + |
| +NetworkSimulator.prototype.runTest = function(testCase) { |
| + if (NetworkSimulator._testInProgress) { |
| + this._assert(false, "runTest calls cannot be nested"); |
| + this._done(); |
| + return; |
| + } |
| + |
| + NetworkSimulator._testInProgress = true; |
| + |
| + var self = this; |
| + 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)); |
| + }; |
| + }; |
| + }); |
| + |
| + try { |
| + testCase(); |
| + } catch(e) { |
| + // Make sure errors thrown in the test case don't leave window.net in a bad state. |
| + reset(); |
| + self._assert(false, "Test case threw an error:" + e); |
| + } |
| + |
| + self.resolvePromises().then(function() { |
| + reset(); |
| + self._assert(window.net == realNet); |
| + resolve(); |
| + }).catch(function(e) { |
| + reset(); |
| + self._assert(false, "Failed to finish test: " + e); |
| + }); |
| + }); |
| +}; |