blob: fdb7fd263fc22d2dfc4fffe5ce8b768c6e559a7e [file] [log] [blame]
/*
* Copyright (C) 2011 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
// Export NetworkSimulator for use by other unittests.
function NetworkSimulator()
{
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) {
ok(false, "runTest calls cannot be nested");
start();
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();
ok(false, "Test case threw an error:" + e);
}
self.resolvePromises().then(function() {
reset();
equal(window.net, realNet);
resolve();
}).catch(function(e) {
reset();
ok(false, "Failed to finish test: " + e);
});
});
};
(function () {
module("net");
test("parseJSONP", 6, function() {
deepEqual(net._parseJSONP(""), {});
deepEqual(net._parseJSONP('p({"key": "value"})'), {"key": "value"});
deepEqual(net._parseJSONP('ADD_RESULTS({"dummy":"data"});'), {"dummy":"data"});
deepEqual(net._parseJSONP('{"dummy":"data"}'), {"dummy":"data"});
deepEqual(net._parseJSONP('ADD_RESULTS({"builder(1)":"data"});'), {"builder(1)":"data"});
deepEqual(net._parseJSONP('{"builder(1)":"data"}'), {"builder(1)":"data"});
});
})();