blob: d0a940a6360a71ad1831d1178a3fffbde18fc3e2 [file] [log] [blame]
/*jslint evil: true, browser: true, immed: true, passfail: true, undef: true, newcap: true*/
/*global easyTest, easyXDM, window, modules*/
var REMOTE = (function(){
var remote = location.href;
switch (location.host) {
case "provider.easyxdm.net":
location.href = remote.replace("provider", "consumer");
break;
case "easyxdm.net":
remote = remote.replace("easyxdm.net", "consumer.easyxdm.net");
break;
case "consumer.easyxdm.net":
remote = remote.replace("consumer", "provider");
break;
case "xdm1":
remote = remote.replace("xdm1", "xdm2");
break;
}
return remote.substring(0, remote.lastIndexOf("/"));
}());
var LOCAL = location.protocol + "//" + location.host + location.pathname.substring(0, location.pathname.lastIndexOf("/"));
function runTests(){
var i = 0;
easyTest.test([/**Tests for the presence of namespaces and classes*/{
name: "Check that the library is complete",
steps: [{
name: "check for the presence of easyXDM",
run: function(){
if (this.Assert.isObject(easyXDM) && this.Assert.isString(easyXDM.version)) {
this.log("found easyXDM, version=" + easyXDM.version);
return true;
}
return false;
}
}, {
name: "check for the presence of easyXDM.DomHelper",
run: function(){
return this.Assert.isObject(easyXDM.DomHelper);
}
}, {
name: "check for the presence of easyXDM.Socket",
run: function(){
return this.Assert.isFunction(easyXDM.Socket);
}
}, {
name: "check for the presence of easyXDM.Rpc",
run: function(){
return this.Assert.isFunction(easyXDM.Rpc);
}
}, {
name: "check for the presence of easyXDM.stack",
run: function(){
return this.Assert.isObject(easyXDM.stack);
}
}, {
name: "check for the presence of easyXDM.stack.SameOriginTransport",
run: function(){
return this.Assert.isFunction(easyXDM.stack.SameOriginTransport);
}
}, {
name: "check for the presence of easyXDM.stack.PostMessageTransport",
run: function(){
return this.Assert.isFunction(easyXDM.stack.PostMessageTransport);
}
}, {
name: "check for the presence of easyXDM.stack.FlashTransport",
run: function(){
return this.Assert.isFunction(easyXDM.stack.FlashTransport);
}
}, {
name: "check for the presence of easyXDM.stack.NameTransport",
run: function(){
return this.Assert.isFunction(easyXDM.stack.NameTransport);
}
}, {
name: "check for the presence of easyXDM.stack.HashTransport",
run: function(){
return this.Assert.isFunction(easyXDM.stack.HashTransport);
}
}, {
name: "check for the presence of easyXDM.stack.ReliableBehavior",
run: function(){
return this.Assert.isFunction(easyXDM.stack.ReliableBehavior);
}
}, {
name: "check for the presence of easyXDM.stack.QueueBehavior",
run: function(){
return this.Assert.isFunction(easyXDM.stack.QueueBehavior);
}
}, {
name: "check for the presence of easyXDM.stack.VerifyBehavior",
run: function(){
return this.Assert.isFunction(easyXDM.stack.VerifyBehavior);
}
}, {
name: "check for the presence of easyXDM.stack.RpcBehavior",
run: function(){
return this.Assert.isFunction(easyXDM.stack.RpcBehavior);
}
}]
}, {
name: "Check helper functions",
runIf: function(){
if (location.href.indexOf("/src/") == -1) {
return "This can only be run in development.";
}
},
setUp: function(){
this.url1 = "http://foo.bar/a/b/c?d=e#f";
this.url2 = "http://foo.bar:80/a/b/c?d=e#f";
this.url3 = "http://foo.bar:88/a/b/c?d=e#f";
this.url4 = "hTtp://Foo.Bar:88/a/b/c?d=e#f";
},
steps: [{
name: "getDomainName",
run: function(){
return easyXDM.getDomainName(this.url1) === "foo.bar";
}
}, {
name: "getLocation",
run: function(){
return easyXDM.getLocation(this.url1) === "http://foo.bar";
}
}, {
name: "getLocation with standard port",
run: function(){
return easyXDM.getLocation(this.url2) === "http://foo.bar";
}
}, {
name: "getLocation with non-standard port",
run: function(){
return easyXDM.getLocation(this.url3) === "http://foo.bar:88";
}
}, {
name: "getLocation with capitals",
run: function(){
return easyXDM.getLocation(this.url4) === "http://foo.bar:88";
}
}, {
name: "appendQueryParameters",
run: function(){
return easyXDM.appendQueryParameters(this.url2, {
g: "h"
}) ===
"http://foo.bar:80/a/b/c?d=e&g=h#f";
}
}]
}, {
name: "Check the ACL feature",
runIf: function(){
if (location.href.indexOf("/src/") == -1) {
return "This can only be run in development.";
}
},
setUp: function(){
this.acl = ["http://www.domain.invalid", "*.domaina.com", "http://dom?inb.com", "^http://domc{3}ain\\.com$"];
},
steps: [{
name: "Match complete string",
run: function(){
return easyXDM.checkAcl(this.acl, "http://www.domain.invalid");
}
}, {
name: "Match *",
run: function(){
return easyXDM.checkAcl(this.acl, "http://www.domaina.com");
}
}, {
name: "Match ?",
run: function(){
return easyXDM.checkAcl(this.acl, "http://domainb.com");
}
}, {
name: "Match RegExp",
run: function(){
return easyXDM.checkAcl(this.acl, "http://domcccain.com");
}
}, {
name: "No match",
run: function(){
return !easyXDM.checkAcl(this.acl, "http://foo.com");
}
}]
}, {
name: "test easyXDM.Socket{SameOriginTransport}",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
var messages = 0;
this.transport = new easyXDM.Socket({
protocol: "4",
remote: LOCAL + "/test_transport.html",
onMessage: function(message, origin){
if (scope.expectedMessage === message) {
if (++messages === 2) {
scope.notifyResult(true);
}
}
},
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
this.transport.postMessage(this.expectedMessage);
}
}, {
name: "destroy",
run: function(){
this.transport.destroy();
return ((document.getElementsByTagName("iframe").length === 0));
}
}]
}, {
name: "test easyXDM.Socket{PostMessageTransport}",
runIf: function(){
if (!("postMessage" in window || "postMessage" in document)) {
return "This test requires the HTML5 postMessage interface.";
}
},
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
var messages = 0;
this.transport = new easyXDM.Socket({
protocol: "1",
local: "../name.html",
remote: REMOTE + "/test_transport.html",
onMessage: function(message, origin){
if (scope.expectedMessage === message) {
if (++messages === 2) {
scope.notifyResult(true);
}
}
},
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
this.transport.postMessage(this.expectedMessage);
}
}, {
name: "destroy",
run: function(){
this.transport.destroy();
return ((document.getElementsByTagName("iframe").length === 0));
}
}]
}, {
name: "test easyXDM.Socket{FlashTransport}",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
var messages = 0;
this.transport = new easyXDM.Socket({
protocol: "6",
remote: REMOTE + "/test_transport.html",
swf: REMOTE + "/../easyxdm.swf",
onMessage: function(message, origin){
if (scope.expectedMessage === message) {
if (++messages === 2) {
scope.notifyResult(true);
}
}
},
container: "embedded",
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
this.transport.postMessage(this.expectedMessage);
}
}, {
name: "destroy",
run: function(){
this.transport.destroy();
return ((document.getElementsByTagName("iframe").length === 0));
}
}]
}, {
name: "test easyXDM.Socket{FrameElementTransport}",
runIf: function(){
if (!(navigator.product === "Gecko" && "frameElement" in window && !("postMessage" in window) && navigator.userAgent.indexOf('WebKit') == -1)) {
return "This test requires an older Gecko browser and the presence of the frameElement object";
}
},
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
var messages = 0;
this.transport = new easyXDM.Socket({
protocol: "5",
remote: REMOTE + "/test_transport.html",
onMessage: function(message, origin){
if (scope.expectedMessage === message) {
if (++messages === 2) {
scope.notifyResult(true);
}
}
},
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
this.transport.postMessage(this.expectedMessage);
}
}, {
name: "destroy",
run: function(){
this.transport.destroy();
return ((document.getElementsByTagName("iframe").length === 0));
}
}]
}, {
name: "test easyXDM.Socket{NameTransport}",
failedMessage: "This might fail in modern browsers due to restrictions in referencing existing windows",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
tearDown: function(){
this.transport.destroy();
if (document.getElementsByTagName("iframe").length !== 0) {
throw new Error("iframe still present");
}
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
var messages = 0;
this.transport = new easyXDM.Socket({
protocol: "2", // This is just to override the automatic selection
local: "../name.html",
remote: REMOTE + "/test_transport.html",
remoteHelper: REMOTE + "/../name.html",
onMessage: function(message, origin){
if (scope.expectedMessage === message) {
if (++messages === 2) {
scope.notifyResult(true);
}
}
},
container: document.getElementById("embedded"),
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
this.transport.postMessage(this.expectedMessage);
}
}]
}, {
name: "test easyXDM.Socket{HashTransport} using window",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
tearDown: function(){
this.transport.destroy();
if (document.getElementsByTagName("iframe").length !== 0) {
throw new Error("iframe still present");
}
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
var messages = 0;
this.transport = new easyXDM.Socket({
protocol: "0", // This is just to override the automatic selection
local: window,
remote: REMOTE + "/test_transport.html",
onMessage: function(message, origin){
if (scope.expectedMessage === message) {
if (++messages === 2) {
scope.notifyResult(true);
}
}
},
container: document.getElementById("embedded"),
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
this.transport.postMessage(this.expectedMessage);
}
}]
}, {
name: "test easyXDM.Socket{HashTransport} with no blank local, available image and resize",
failedMessage: "This might fail in modern browsers due to restrictions in referencing existing windows",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
this.img = document.createElement("img");
this.img.src = "s.gif";
document.body.appendChild(this.img);
},
tearDown: function(){
document.body.removeChild(this.img);
this.transport.destroy();
if (document.getElementsByTagName("iframe").length !== 0) {
throw new Error("iframe still present");
}
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
var messages = 0;
this.transport = new easyXDM.Socket({
protocol: "0", // This is just to override the automatic selection
remote: REMOTE + "/test_transport.html",
onMessage: function(message, origin){
if (++messages === 2) {
scope.notifyResult(true);
}
},
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
this.transport.postMessage(this.expectedMessage);
}
}]
}, {
name: "test easyXDM.Socket{HashTransport} with s.gif and polling",
failedMessage: "This might fail in modern browsers due to restrictions in referencing existing windows",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
tearDown: function(){
this.transport.destroy();
if (document.getElementsByTagName("iframe").length !== 0) {
throw new Error("iframe still present");
}
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
var messages = 0;
this.transport = new easyXDM.Socket({
protocol: "0", // This is just to override the automatic selection
local: "s.gif",
remote: REMOTE + "/test_transport.html",
onMessage: function(message, origin){
if (++messages === 2) {
scope.notifyResult(true);
}
},
container: document.getElementById("embedded"),
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
this.transport.postMessage(this.expectedMessage);
}
}]
}, {
name: "test easyXDM.Socket{HashTransport} with fragmentation (8192)",
failedMessage: "This might fail in modern browsers due to restrictions in referencing existing windows",
setUp: function(){
var i = 11;
this.expectedMessage = "aaaa";
while (i--) {
this.expectedMessage += this.expectedMessage;
}
},
tearDown: function(){
this.transport.destroy();
if (document.getElementsByTagName("iframe").length !== 0) {
throw new Error("iframe still present");
}
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
this.transport = new easyXDM.Socket({
protocol: "0", // This is just to override the automatic selection
local: "../name.html",
remote: REMOTE + "/test_transport.html",
onMessage: function(message, origin){
scope.notifyResult(scope.expectedMessage === message);
},
container: document.getElementById("embedded"),
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
}
}]
}, {
name: "test easyXDM.noConflict {SameOriginTransport}",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
steps: [{
name: "window.easyXDM is released {namespace}",
timeout: 5000,
run: function(){
this.notifyResult(window.easyXDM._test_global && !modules.easyXDM._test_global);
}
}, {
name: "onReady is fired {namespace}",
timeout: 5000,
run: function(){
var scope = this;
var messages = 0;
this.transport = new modules.easyXDM.Socket({
protocol: "4",
remote: LOCAL + "/test_namespace.html",
onMessage: function(message, origin){
if (scope.expectedMessage === message) {
if (++messages === 2) {
scope.notifyResult(true);
}
}
},
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back {namespace}",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
this.transport.postMessage(this.expectedMessage);
}
}, {
name: "destroy {namespace}",
run: function(){
this.transport.destroy();
return ((document.getElementsByTagName("iframe").length === 0));
}
}]
}, {
name: "test easyXDM.Socket{}",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
tearDown: function(){
this.transport.destroy();
if (document.getElementsByTagName("iframe").length !== 0) {
throw new Error("iframe still present");
}
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
this.transport = new easyXDM.Socket({
local: "../name.html",
swf: REMOTE + "/../easyxdm.swf",
remote: REMOTE + "/test_transport.html",
onMessage: function(message, origin){
scope.notifyResult((scope.expectedMessage === message));
},
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
}
}]
}, {
name: "test easyXDM.Socket{} using hash for passing data",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
tearDown: function(){
this.transport.destroy();
if (document.getElementsByTagName("iframe").length !== 0) {
throw new Error("iframe still present");
}
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
this.transport = new easyXDM.Socket({
local: "../name.html",
swf: REMOTE + "/../easyxdm.swf",
remote: REMOTE + "/test_transport.html?foo=bar",
hash: true,
onMessage: function(message, origin){
scope.notifyResult((scope.expectedMessage === message));
},
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
}
}]
}, {
name: "test easyXDM.Socket{} with buffering",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
tearDown: function(){
this.transport.destroy();
if (document.getElementsByTagName("iframe").length !== 0) {
throw new Error("iframe still present");
}
},
steps: [{
name: "Buffered messages are sent",
timeout: 5000,
run: function(){
var scope = this;
this.transport = new easyXDM.Socket({
local: "../name.html",
swf: REMOTE + "/../easyxdm.swf",
remote: REMOTE + "/test_transport.html",
onMessage: function(message, origin){
scope.notifyResult((scope.expectedMessage === message));
}
});
this.transport.postMessage(this.expectedMessage);
}
}]
}, {
name: "test easyXDM.Socket{} with query parameters",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
tearDown: function(){
this.transport.destroy();
if (document.getElementsByTagName("iframe").length !== 0) {
throw new Error("iframe still present");
}
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
this.transport = new easyXDM.Socket({
local: "../name.html",
swf: REMOTE + "/../easyxdm.swf",
remote: REMOTE + "/test_transport.html?a=b&c=d#foo,faa",
onMessage: function(message, origin){
scope.notifyResult((scope.expectedMessage === message));
},
onReady: function(){
scope.notifyResult(true);
}
});
}
}, {
name: "message is echoed back",
timeout: 5000,
run: function(){
this.transport.postMessage(this.expectedMessage);
}
}]
}, {
name: "test easyXDM.Rpc",
setUp: function(){
this.expectedMessage = ++i + "_abcd1234%@¤/";
},
tearDown: function(){
this.remote.destroy();
if (document.getElementsByTagName("iframe").length !== 0) {
throw new Error("iframe still present");
}
},
steps: [{
name: "onReady is fired",
timeout: 5000,
run: function(){
var scope = this;
this.remote = new easyXDM.Rpc({
local: "../name.html",
swf: REMOTE + "/../easyxdm.swf",
remote: REMOTE + "/test_rpc.html",
remoteHelper: REMOTE + "/../name.html",
container: document.getElementById("embedded"),
onReady: function(){
scope.notifyResult(true);
}
}, {
remote: {
voidMethod: {},
asyncMethod: {},
method: {},
error: {},
nonexistent: {},
namedParamsMethod: {
namedParams: true
}
},
local: {
voidCallback: {
method: function(message){
scope.notifyResult((scope.expectedMessage === message));
}
}
}
});
}
}, {
name: "void method",
timeout: 5000,
run: function(){
this.remote.voidMethod(this.expectedMessage);
}
}, {
name: "async method",
timeout: 5000,
run: function(){
var scope = this;
this.remote.asyncMethod(this.expectedMessage, function(message){
scope.notifyResult((scope.expectedMessage === message));
});
}
}, {
name: "regular method",
timeout: 5000,
run: function(){
var scope = this;
this.remote.method(this.expectedMessage, function(message){
scope.notifyResult((scope.expectedMessage === message));
});
}
}, {
name: "with error",
timeout: 5000,
run: function(){
var scope = this;
this.remote.error(this.expectedMessage, function(){
this.notifyResult(false, "success handler called");
}, function(message){
scope.notifyResult(true);
});
}
}, {
name: "calling nonexistent method",
timeout: 5000,
run: function(){
var scope = this;
this.remote.nonexistent(this.expectedMessage, function(){
this.notifyResult(false, "success handler called");
}, function(message){
scope.notifyResult(true);
});
}
}, {
name: "using named parameters",
timeout: 5000,
run: function(){
var scope = this;
this.remote.namedParamsMethod({
msg: this.expectedMessage
}, function(message){
scope.notifyResult((scope.expectedMessage === message));
});
}
}]
}]);
}