@castana/cordova-plugin-ios-xhr
Version:
Cordova iOS 6+ File XHR Plugin
1,403 lines (1,185 loc) • 41.9 kB
JavaScript
/*
Copyright (c) 2014, 2016, Oracle and/or its affiliates.
The Universal Permissive License (UPL), Version 1.0
*/
/* jshint jasmine: true */
/* global Connection */
exports.defineAutoTests = function ()
{
var SECURE_TESTS_DOMAIN = "https://den01cxr.us.oracle.com:7102";
var NONSECURE_TESTS_DOMAIN = "http://den01cxr.us.oracle.com:7101";
var expects = {};
window.xhrCallback = function (id, result)
{
expects[id](result);
delete expects[id];
};
describe('FormData Polyfill:', function ()
{
it("basic API", function (done)
{
var fd = new FormData();
// set & get
fd.set("foo", "bar1");
expect(fd.get("foo")).toBe("bar1");
// append & get
fd.append("foo", "bar2");
expect(fd.get("foo")).toBe("bar1");
// getAll
var values = fd.getAll("foo");
expect(values).toContain("bar1");
expect(values).toContain("bar2");
// values
var vit = fd.values();
var e = vit.next();
expect(e.done).toBe(false);
expect(e.value).toBe("bar1");
var e = vit.next();
expect(e.done).toBe(false);
expect(e.value).toBe("bar2");
var e = vit.next();
expect(e.done).toBe(true);
// entries
var eit = fd.entries();
e = eit.next();
expect(e.done).toBe(false);
expect(e.value[0]).toBe("foo");
expect(e.value[1]).toBe("bar1");
e = eit.next();
expect(e.done).toBe(false);
expect(e.value[0]).toBe("foo");
expect(e.value[1]).toBe("bar2");
e = eit.next();
expect(e.done).toBe(true);
// has, get && delete
fd.set("bar", "foo");
expect(fd.get("bar")).toBe("foo");
expect(fd.has("bar")).toBe(true);
fd.delete("bar");
expect(fd.get("bar")).toBe(undefined);
expect(fd.has("bar")).toBe(false);
// keys
fd.set("bar", "foo");
var kit = fd.keys();
e = kit.next();
expect(e.done).toBe(false);
expect(e.value).toBe("foo");
e = kit.next();
expect(e.done).toBe(false);
expect(e.value).toBe("bar");
e = kit.next();
expect(e.done).toBe(true);
// forEach
var i = 0;
fd.forEach(function (value, key, fd)
{
expect(["bar1", "bar2", "foo"]).toContain(value);
expect(["foo", "bar"]).toContain(key);
expect(fd).toBeDefined();
expect(fd.set).toBeDefined();
expect(fd.get).toBeDefined();
i++;
});
expect(i).toBe(3);
// angularJS uses the toString in the $http service for isFormData check
expect(fd.toString()).toBe("[object FormData]");
done();
});
it("HtmlFormElement constructor", function (done)
{
function createForm()
{
var node = document.createElement("form");
return node;
}
function createInputText()
{
var node = document.createElement("input");
node.id = "in1";
node.name = "input1";
node.value = "value1";
return node;
}
function createSelectSingle()
{
var select = document.createElement("select");
select.id = "select1";
var option = document.createElement("option");
option.value = "option1";
select.appendChild(option);
option = document.createElement("option");
option.value = "option2";
option.selected = true;
select.appendChild(option);
return select;
}
function createCheckbox()
{
var node = document.createElement("input");
node.id = "checkbox1";
node.type = "checkbox";
node.value = "checked1";
node.checked = true;
return node;
}
var form = createForm();
form.appendChild(createInputText());
form.appendChild(createSelectSingle());
form.appendChild(createCheckbox());
document.body.appendChild(form);
var fd = new FormData(form);
expect(fd.get("input1")).toBe("value1");
expect(fd.get("select1")).toBe("option2");
expect(fd.get("checkbox1")).toBe("checked1");
document.body.removeChild(form);
done();
});
it("https:// mixed types document response", function (done)
{
var file3Content = btoa("Content of Blob 3");
function loadend(evt)
{
expect(this.readyState).toBe(this.DONE);
expect(this.status).toBe(200);
expect(this.response instanceof Document).toEqual(true);
expect(this.response.querySelector("#request-content-type").textContent)
.toContain("multipart/form-data");
expect(this.response.querySelector("#field1").textContent).toEqual("1");
expect(this.response.querySelector("#field2").textContent).toEqual("2");
expect(this.response.querySelector("#file1").textContent).toEqual("Content of Blob 1");
expect(this.response.querySelector("#file1").getAttribute("filename")).toEqual("file1.txt");
expect(this.response.querySelector("#file2").textContent).toEqual("Content of Blob 2");
expect(this.response.querySelector("#file2").getAttribute("filename")).toEqual("file2.txt");
expect(this.response.querySelector("#file3").textContent).toEqual(file3Content);
expect(this.response.querySelector("#file3").getAttribute("filename")).toEqual("file3.txt");
done();
}
var fd = new FormData();
fd.append("field1", "1");
fd.append("field2", "2");
var file1 = new Blob(["Content of Blob 1"], {type: "text/html"});
fd.append("file1", file1, "file1.txt");
var file2 = new Blob(["Content of Blob 2"], {type: "text/html"});
fd.append("file2", file2, "file2.txt");
var file3 = new Blob([file3Content]);
fd.append("file3", file3, "file3.txt");
var xhr = new XMLHttpRequest();
xhr.addEventListener("loadend", loadend);
xhr.open("POST",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/servletmultipart");
xhr.responseType = "document";
xhr.send(fd);
});
it("http:// mixed types document response", function (done)
{
// uses native FormData thru the Delegate to the native XMLHttpRequest
function loadend(evt)
{
expect(this.readyState).toBe(this.DONE);
expect(this.status).toBe(200);
expect(this.response instanceof Document).toEqual(true);
expect(this.response.querySelector("#request-content-type").textContent)
.toContain("multipart/form-data");
expect(this.response.querySelector("#field1").textContent).toEqual("1");
expect(this.response.querySelector("#field2").textContent).toEqual("2");
expect(this.response.querySelector("#file1").textContent).toEqual("Content of Blob 1");
expect(this.response.querySelector("#file1").getAttribute("filename")).toEqual("file1.txt");
expect(this.response.querySelector("#file2").textContent).toEqual("Content of Blob 2");
expect(this.response.querySelector("#file2").getAttribute("filename")).toEqual("file2.txt");
done();
}
var fd = new FormData();
fd.append("field1", "1");
fd.append("field2", "2");
var file1 = new Blob(["Content of Blob 1"], {type: "text/html"});
fd.append("file1", file1, "file1.txt");
var file2 = new Blob(["Content of Blob 2"], {type: "text/html"});
fd.append("file2", file2, "file2.txt");
var xhr = new XMLHttpRequest();
xhr.addEventListener("loadend", loadend);
xhr.open("POST",
NONSECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/servletmultipart");
xhr.responseType = "document";
xhr.send(fd);
});
it("download/upload/binary compare", function(done)
{
// 1) download an image as a blob
// 2) add the blob to a form data and send it back to the server as a multipart form
// 3) server performs a binary compare of the original file to the uploaded
// 4) returns a document response with the results of the compare
var downloadPromise = new Promise(function (resolve, reject)
{
var xhr = new XMLHttpRequest();
xhr.onloadend = function (event)
{
resolve(xhr.response);
};
xhr.onerror = function (event)
{
reject(xhr.response);
};
xhr.responseType = "blob";
xhr.open("GET", SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/servletmultipartplayback");
xhr.send();
});
downloadPromise.then(function (blob)
{
expect(blob).toBeDefined();
expect(blob instanceof Blob).toEqual(true);
expect(blob.type).toEqual("image/png");
var fd = new FormData();
fd.append("simple-test", blob, "simple-test.html");
var xhr = new XMLHttpRequest();
xhr.onloadend = function ()
{
expect(this.readyState).toBe(this.DONE);
expect(this.status).toBe(200);
expect(this.response instanceof Document).toEqual(true);
expect(this.response.querySelector("#are-same").textContent).toEqual("true");
done();
};
xhr.responseType = "document";
xhr.open("POST", SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/servletmultipartplayback");
xhr.send(fd);
});
}, 120000);
});
describe('http:// GET remote:', function ()
{
it("responseType text, loadend addEventListener", function (done)
{
function loadend(evt)
{
expect(this.readyState).toBe(this.DONE);
expect(this.status).toBe(200);
expect(this.responseText).toBeDefined();
expect(this.responseText).toContain("Hello World");
done();
}
var xhr = new XMLHttpRequest();
xhr.addEventListener("loadend", loadend);
xhr.open("GET",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/simple-test.html");
xhr.send();
});
it("responseType text, loadend onloadend", function (done)
{
function loadend(evt)
{
expect(this.readyState).toBe(this.DONE);
expect(this.status).toBe(200);
expect(this.responseText).toBeDefined();
expect(this.responseText).toContain("Hello World");
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/simple-test.html");
xhr.send();
});
it("responseType text, loadend onloadend", function (done)
{
function loadend(evt)
{
expect(this.readyState).toBe(this.DONE);
expect(this.status).toBe(200);
expect(this.responseText).toBeDefined();
expect(this.responseText).toContain("Hello World");
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/simple-test.html");
xhr.send();
});
it("responseType arraybuffer, loaded onloadend", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response instanceof ArrayBuffer).toEqual(true);
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/simple-test.png");
xhr.responseType = "arraybuffer";
xhr.send();
});
it("responseType blob, loaded onloadend", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response instanceof Blob).toEqual(true);
expect(this.response.type).toEqual("text/html");
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/simple-test.html");
xhr.responseType = "blob";
xhr.send();
});
it("responseType document, loaded onloadend", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response instanceof Document).toEqual(true);
expect(this.response.querySelector("h1").textContent).toEqual("Hello World");
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/simple-test.html");
xhr.responseType = "document";
xhr.send();
});
it("responseType json, loaded onloadend", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response.message).toEqual("Hello World");
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/simple-test.json");
xhr.responseType = "json";
xhr.send();
});
});
describe('http:// POST remote:', function ()
{
it("post HTML with responseType text, loadend addEventListener", function (done)
{
var html = "<html><body><h1>Hello World</h1></body></html>";
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response).toEqual(html);
done();
}
var xhr = new XMLHttpRequest();
xhr.addEventListener("loadend", loadend);
xhr.open("POST",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/playbackservlet");
xhr.responseType = "text";
xhr.send(html);
});
it("post ArrayBuffer with responseType ArrayBuffer, onloadend listener", function (done)
{
var bin = [];
bin.length = 1000;
bin.fill(0, 0, 1000);
var inBuff = new Int8Array(bin);
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response instanceof ArrayBuffer).toBeDefined();
// compare content
var outBuff = new Int8Array(this.response);
var bout = outBuff['slice'] ? outBuff.slice() : outBuff;
var isSame = true;
for (var i = 0; i < bout.length; i++)
{
if (bout[i] !== bin[i])
{
isSame = false;
break;
}
}
expect(isSame).toEqual(true);
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("POST",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/playbackservlet");
xhr.responseType = "arraybuffer";
xhr.send(inBuff);
});
it("post ArrayBuffer with responseType Blob, onloadend listener", function (done)
{
function toArrayBuffer(blob)
{
var reader = new FileReader();
var promise = new Promise(function (resolve, reject)
{
reader.onload = function ()
{
resolve(reader.result);
};
});
reader.readAsArrayBuffer(blob);
return promise;
}
var bin = [];
bin.length = 1000;
bin.fill(0, 0, 1000);
var inBuff = new Int8Array(bin);
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response instanceof Blob).toBeDefined();
toArrayBuffer(this.response).then(function (response)
{
// compare content
var outBuff = new Int8Array(response);
var bout = outBuff['slice'] ? outBuff.slice() : outBuff;
var isSame = true;
for (var i = 0; i < bout.length; i++)
{
if (bout[i] !== bin[i])
{
isSame = false;
break;
}
}
expect(isSame).toEqual(true);
done();
});
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("POST",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/playbackservlet");
xhr.responseType = "blob";
xhr.send(inBuff);
});
it("post FormData with responseType text, onloadend listener", function (done)
{
var fd = new FormData();
fd.append("param1", "1");
fd.append("param2", "2");
function loadend(event)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response).toContain('content-disposition: form-data; name="param1"');
expect(this.response).toContain('content-disposition: form-data; name="param2"');
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("POST",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/playbackservlet");
xhr.responseType = "text";
var runit = false;
xhr.send(fd);
});
it("post document with responseType document, onloadend listener", function (done)
{
function loadend(event)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response.title).toEqual(document.title);
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("POST",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/playbackservlet");
xhr.responseType = "document";
xhr.send(document);
});
it("post HTML test upload events", function (done)
{
var html = "<html><body><h1>Hello World</h1></body></html>";
var uploadEvents = [];
function captureUploadEvents(event)
{
uploadEvents.push(event.type);
}
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response).toEqual(html);
expect(uploadEvents).toContain("loadstart");
expect(uploadEvents).toContain("progress");
expect(uploadEvents).toContain("load");
expect(uploadEvents).toContain("loadend");
done();
}
var xhr = new XMLHttpRequest();
["ontimeout", "onloadstart", "onprogress", "onabort", "onerror", "onload", "onloadend"
].forEach(function (propName)
{
xhr.upload[propName] = captureUploadEvents;
});
xhr.onloadend = loadend;
xhr.open("POST",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/playbackservlet");
xhr.responseType = "text";
xhr.send(html);
});
});
describe('file:// GET:', function ()
{
_resolveUri = function (uri)
{
var resolver = document.createElement("a");
document.body.appendChild(resolver);
resolver.href = uri;
var absoluteUri = resolver.href;
resolver.parentNode.removeChild(resolver);
return absoluteUri;
};
it("responseType text, loadend addEventListener", function (done)
{
function loadend(evt)
{
expect(this.readyState).toBe(this.DONE);
expect(this.status).toBe(200);
expect(this.responseText).toBeDefined();
expect(this.responseText).toContain("folder.");
done();
}
var xhr = new XMLHttpRequest();
xhr.addEventListener("loadend", loadend);
xhr.open("GET", "wkwebview-file-xhr-tests/customers.html");
xhr.send();
});
it("responseType text, absolute URL, loadend addEventListener", function (done)
{
function loadend(evt)
{
expect(this.readyState).toBe(this.DONE);
expect(this.status).toBe(200);
expect(this.responseText).toBeDefined();
expect(this.responseText).toContain("folder.");
done();
}
var xhr = new XMLHttpRequest();
xhr.addEventListener("loadend", loadend);
var uri = _resolveUri("../wkwebview-file-xhr-tests/customers.html");
xhr.open("GET", uri);
xhr.send();
});
it("responseType text, loadend onloadend", function (done)
{
function loadend(evt)
{
expect(this.readyState).toBe(this.DONE);
expect(this.status).toBe(200);
expect(this.responseText).toBeDefined();
expect(this.responseText).toContain("folder.");
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET", "wkwebview-file-xhr-tests/customers.html");
xhr.send();
});
it("responseType text, loadend onloadend", function (done)
{
function loadend(evt)
{
expect(this.readyState).toBe(this.DONE);
expect(this.status).toBe(200);
expect(this.responseText).toBeDefined();
expect(this.responseText).toContain("folder.");
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET", "wkwebview-file-xhr-tests/customers.html");
xhr.send();
});
it("responseType arraybuffer, loaded onloadend", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response instanceof ArrayBuffer).toEqual(true);
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET", "wkwebview-file-xhr-tests/customers.html");
xhr.responseType = "arraybuffer";
xhr.send();
});
it("responseType blob, loaded onloadend", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response instanceof Blob).toEqual(true);
expect(this.response.type).toEqual("text/html");
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET", "wkwebview-file-xhr-tests/customers.html");
xhr.responseType = "blob";
xhr.send();
});
it("responseType document, loaded onloadend", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response instanceof Document).toEqual(true);
expect(this.response.getElementById("contentHeader").textContent).toEqual(
"Customers Content Area");
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET", "wkwebview-file-xhr-tests/customers.html");
xhr.responseType = "document";
xhr.send();
});
it("responseType json, loaded onloadend", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response.name).toEqual("anonymous");
expect(this.response.comment).toContain("Copyright (c) 2014, 2016");
done();
}
var xhr = new XMLHttpRequest();
xhr.onloadend = loadend;
xhr.open("GET", "wkwebview-file-xhr-tests/customers.json");
xhr.responseType = "json";
xhr.send();
});
});
describe('REST end-points:', function ()
{
it("GET Request", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
var products = this.response;
expect(products.length).toEqual(100);
expect(products[0].id).toEqual(0);
done();
}
var xhr = new XMLHttpRequest();
xhr.open("GET",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/rest/products/get");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Accept", "application/json");
xhr.onloadend = loadend;
xhr.responseType = "json";
xhr.send();
});
it("POST Request", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response.id).toEqual(99);
done();
}
var xhr = new XMLHttpRequest();
xhr.open("POST",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/rest/products/post");
xhr.onloadend = loadend;
xhr.responseType = "json";
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Accept", "application/json");
xhr.send(JSON.stringify({id: 99, name: "Product 99"}));
});
it("PUT Request", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response.id).toEqual(99);
done();
}
var xhr = new XMLHttpRequest();
xhr.open("PUT",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/rest/products/put");
xhr.onloadend = loadend;
xhr.responseType = "json";
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Accept", "application/json");
xhr.send(JSON.stringify({id: 99, name: "Product 99"}));
});
it("DELETE Request", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response.id).toEqual(99);
done();
}
var xhr = new XMLHttpRequest();
xhr.open("DELETE",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/rest/products/delete");
xhr.onloadend = loadend;
xhr.responseType = "json";
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Accept", "application/json");
xhr.send(JSON.stringify({id: 99, name: "Product 99"}));
});
it("POST 500 server error", function (done)
{
var events = [];
function logEvents(event)
{
events.push(event.type);
}
function loadend(evt)
{
expect(this.status).toBe(500);
expect(this.response).toBeDefined();
expect(events).toContain("loadstart");
expect(events).toContain("progress");
expect(events).not.toContain("error");
done();
}
var xhr = new XMLHttpRequest();
xhr.open("POST",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/exceptionservlet");
xhr.onloadend = loadend;
xhr.onloadstart = logEvents;
xhr.onprogress = logEvents;
xhr.onerror = logEvents;
xhr.send(" ");
});
it("POST timeout", function (done)
{
var events = [];
function logEvents(event)
{
events.push(event.type);
}
function loadend(evt)
{
expect(this.status).toBe(0);
expect(this.response).not.toBeDefined();
expect(events).toContain("loadstart");
expect(events).toContain("progress");
expect(events).toContain("timeout");
done();
}
var xhr = new XMLHttpRequest();
xhr.open("POST",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/rest/products/postTimeout");
xhr.onloadend = loadend;
xhr.onloadstart = logEvents;
xhr.onprogress = logEvents;
xhr.ontimeout = logEvents;
xhr.timeout = 1;
xhr.responseType = "json";
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Accept", "application/json");
xhr.send(JSON.stringify({timeout: 5000}));
});
it("GET utf-16", function (done)
{
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toEqual(unescape("nice tunes \u000E\u000E"));
expect(this.getResponseHeader("content-type")).toEqual("text/html;charset=utf-16");
expect(this.getResponseHeader("Content-Type")).toEqual("text/html;charset=utf-16");
done();
}
var xhr = new XMLHttpRequest();
xhr.open("GET",
SECURE_TESTS_DOMAIN +
"/RestApp-ViewController-context-root/rest/products/getspecialenc");
xhr.onloadend = loadend;
xhr.responseType = "text";
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Accept", "text/html");
xhr.send();
});
}, 10000);
describe('Cordova API:', function ()
{
it("CDVWKWebViewFileXhr readAsText no args", function (done)
{
function success()
{
// should not be called
expect(true).toEqual(false);
done();
}
function error()
{
expect(true).toEqual(true);
done();
}
var exec = require('cordova/exec');
// invoke readAsText with on arguments. expected outcome is an error
exec(success, error, "CDVWKWebViewFileXhr", "readAsText", []);
});
it("CDVWKWebViewFileXhr readAsArrayBuffer no args", function (done)
{
function success()
{
// should not be called
expect(true).toEqual(false);
done();
}
function error()
{
expect(true).toEqual(true);
done();
}
var exec = require('cordova/exec');
// invoke readAsArrayBuffer with on arguments. expected outcome is an error
exec(success, error, "CDVWKWebViewFileXhr", "readAsArrayBuffer", []);
});
it("CDVWKWebViewFileXhr readAsText relative path security 404", function (done)
{
function success()
{
// should not be called
expect(true).toEqual(false);
done();
}
function error(msg)
{
expect(true).toEqual(true);
done();
}
var exec = require('cordova/exec');
// invoke readAsArrayBuffer with on arguments. expected outcome is an error
exec(success, error, "CDVWKWebViewFileXhr", "readAsText", ["../cordova/Api.js"]);
});
});
describe('nativeXHR remote GET', function ()
{
it("nativeXHR GET Request", function (done)
{
expects["id1"] = function (result)
{
expect(result.response.statusCode).toBe(200);
expect(result.response.mimeType).toBe("application/json");
expect(result.response.localizedStatusCode).toBe("no error");
expect(result.response.allHeaderFields).toBeDefined();
expect(result.response.allHeaderFields["Content-Type"]).toBe("application/json");
expect(result.response.allHeaderFields["Content-Length"]).toBe("3881");
expect(result.response.mimeType).toBe("application/json");
expect(result.error).not.toBeDefined();
expect(result.data).toBeDefined();
done();
};
var xhr = {};
xhr.headers = {"Content-Type": "application/json", "Accept": "application/json"};
xhr.url = SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/rest/products/get";
xhr.id = "id1";
xhr.method = "GET";
xhr.callback = "xhrCallback";
window.webkit.messageHandlers.nativeXHR.postMessage(xhr);
});
it("nativeXHR GET Missing Resource Request", function (done)
{
expects["id2"] = function (result)
{
expect(result.response.statusCode).toBe(404);
expect(result.error).not.toBeDefined();
expect(result.data).toBeDefined();
done();
};
var xhr = {};
xhr.url = SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/rest/products/does-not-exist";
xhr.id = "id2";
xhr.callback = "xhrCallback";
window.webkit.messageHandlers.nativeXHR.postMessage(xhr);
});
it("nativeXHR GET Server Doesn't Exist", function (done)
{
expects["id3"] = function (result)
{
expect(result.response).not.toBeDefined();
expect(result.error).toBeDefined();
expect(result.data).not.toBeDefined();
done();
};
var xhr = {};
xhr.url = "http://i-am-not.a.validserver.us.oracle.com/";
xhr.id = "id3";
xhr.callback = "xhrCallback";
window.webkit.messageHandlers.nativeXHR.postMessage(xhr);
});
it("nativeXHR getConfig", function (done)
{
function success(result)
{
// should not be called
expect(result.InterceptRemoteRequests).toEqual("secureOnly");
expect(["none", "full"]).toContain(result.NativeXHRLogging);
done();
}
function error()
{
expect(false).toEqual(true);
done();
}
var exec = require('cordova/exec');
exec(success, error, "CDVWKWebViewFileXhr", "getConfig", []);
});
it("nativeXHR GET timeout", function (done)
{
expects["id4"] = function (result)
{
expect(result.response).not.toBeDefined();
expect(result.error).toBeDefined();
expect(result.error).toEqual("The request timed out.");
expect(result.underlyingErrorCode).toBeDefined();
expect(result.underlyingErrorCode).toEqual(-1001);
expect(result.data).not.toBeDefined();
done();
};
var xhr = {};
xhr.headers = {"Content-Type": "application/json", "Accept": "application/json"};
xhr.url = SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/rest/products/postTimeout";
xhr.id = "id4";
xhr.timeout = 1;
xhr.callback = "xhrCallback";
xhr.method = "POST"
xhr.body = btoa(JSON.stringify({timeout: 5000}));
window.webkit.messageHandlers.nativeXHR.postMessage(xhr);
});
describe('Custom Headers', function ()
{
it("normalize types", function (done)
{
var html = "<html><body><h1>Hello World</h1></body></html>";
var now = new Date();
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
expect(this.response).toEqual(html);
expect(this.getResponseHeader("x-custom-1")).toEqual("42");
expect(this.getResponseHeader("x-custom-2")).toEqual("1,2,3");
expect(this.getResponseHeader("x-custom-3")).toEqual(now.toString());
done();
}
var xhr = new XMLHttpRequest();
xhr.addEventListener("loadend", loadend);
xhr.setRequestHeader("x-custom-1", 42);
xhr.setRequestHeader("x-custom-2", [1, 2, 3]);
xhr.setRequestHeader("x-custom-3", now);
xhr.open("POST",
SECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/playbackservlet");
xhr.responseType = "text";
xhr.send(html);
});
});
/*
This test is disabled due to the endpoint. The application's config.xml must be configured with
the AllowUntrustedCerts = on preference to enable support for self signed certificates
*/
/*
it("nativeXHR testAllowUntrustedCerts", function (done)
{
expects["id5"] = function (result)
{
expect(result.response.statusCode).toEqual(200);
done();
};
var xhr = {};
xhr.url = "https://den02mkn.us.oracle.com:4443/serviceapi/entityModel/metadata/entityTypes?count=true";
xhr.headers = {"authorization": "Basic ZW1hYXN0ZXN0dGVuYW50MS5lbWNzYWRtaW46V2VsY29tZTEh",
"cache-control": "no-cache",
"x-user-identity-domain-name": "emaastesttenant1"};
xhr.id = "id5";
xhr.callback = "xhrCallback";
window.webkit.messageHandlers.nativeXHR.postMessage(xhr);
}, 30000);
*/
});
/*
// commented out the PSR tests as they take several minutes to run
describe('PSR Remote:', function ()
{
function getMbBuffer(numMbs)
{
if (isNaN(numMbs))
numMbs = 1;
var fillArray = [];
var bytes = numMbs * 1048576;
fillArray.length = bytes;
fillArray.fill(0, 0, bytes);
return new Int8Array(fillArray);
}
function getMbString(numMbs)
{
if (isNaN(numMbs))
numMbs = 1;
var fillArray = [];
var bytes = numMbs * 1048576;
fillArray.length = bytes;
fillArray.fill(0, 0, bytes);
return fillArray.join("");
}
var logSummary = [];
function logMeasure(test, buffsize, startTs)
{
var totalSecs = ((performance.now() - startTs) / 1000);
var totalMb = buffsize / 1048576;
var mbPerSecs = totalSecs / totalMb;
var msg = [test, "send/recieve", buffsize, "bytes in", +
totalSecs,
"sec(s)."].join(" ");
var tokens = test.split(" ");
logSummary.push(['"' + tokens[0] + '"',
'"' + tokens[1] + '"',
tokens[2],
totalMb,
totalSecs,
mbPerSecs].join(","));
console.log(msg);
}
function dumpLogSummary()
{
var xhr = new XMLHttpRequest();
xhr.open("POST",
SECURE_TESTS_DOMAIN +
"/RestApp-ViewController-context-root/rest/products/postPsrLog");
xhr.responseType = "text";
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Accept", "text/html");
xhr.send(logSummary.join("\n"));
logSummary = [];
}
function psrTest(description, sizeInMb, resonseType, xhr, resolve)
{
var buff;
if ("arraybuffer" === resonseType)
buff = getMbBuffer(sizeInMb);
else if ("text" === resonseType)
buff = getMbString(sizeInMb);
var startTs;
function loadend(evt)
{
expect(this.status).toBe(200);
expect(this.response).toBeDefined();
var size = Number.NaN;
if ("arraybuffer" === resonseType && this.response && !isNaN(this.response['byteLength']))
size = this.response.byteLength;
else if ("text" === resonseType && this.response && !isNaN(this.response['length']))
size = this.response.length;
logMeasure(description, size, startTs);
resolve(true);
}
xhr.onloadend = loadend;
xhr.open("POST",
NONSECURE_TESTS_DOMAIN + "/RestApp-ViewController-context-root/playbackservlet");
xhr.responseType = resonseType;
startTs = performance.now();
xhr.send(buff);
}
function sendXHR(description, sizeInMB, resonseType, xhr)
{
var execCallback = psrTest.bind(this, description, sizeInMB, resonseType, xhr);
return new Promise(execCallback);
}
var MAX_RETRIES = 3;
var MAX_MB = 5;
function forEach(responseType, xhrType, retry, sizeInMb)
{
if (isNaN(retry))
retry = 1;
if (isNaN(sizeInMb))
sizeInMb = 1;
var description = [xhrType, responseType, retry].join(" ");
var xhr;
if (xhrType === "NativeJS")
{
xhr = new window._XMLHttpRequest();
}
else if (xhrType === "DelegateNativeJS")
{
xhr = new XMLHttpRequest();
xhr.__setInterceptRemoteRequests("none");
}
else if (xhrType === "NativeIOS")
{
xhr = new XMLHttpRequest();
xhr.__setInterceptRemoteRequests("all");
}
return sendXHR(description, sizeInMb, responseType, xhr).then(function ()
{
if (MAX_RETRIES < ++retry)
{
retry = 1;
if (MAX_MB < ++sizeInMb)
return Promise.resolve(true);
}
return forEach(responseType, xhrType, retry, sizeInMb);
});
}
it("Native JS arraybuffer send/recieve", function (done)
{
forEach("arraybuffer", "NativeJS").then(function ()
{
done();
});
}, 240000);
it("Delegate Native JS arraybuffer send/recieve", function (done)
{
forEach("arraybuffer", "DelegateNativeJS").then(function ()
{
done();
});
}, 240000);
it("Native IOS arraybuffer send/recieve", function (done)
{
forEach("arraybuffer", "NativeIOS").then(function ()
{
done();
});
}, 240000);
it("Native JS text send/recieve", function (done)
{
forEach("text", "NativeJS").then(function ()
{
done();
});
}, 240000);
it("Delegate Native JS text send/recieve", function (done)
{
forEach("text", "DelegateNativeJS").then(function ()
{
done();
});
}, 240000);
it("Native IOS text send/recieve", function (done)
{
forEach("text", "NativeIOS").then(function ()
{
done();
dumpLogSummary();
});
}, 240000);
});
*/
};