/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
const { error } = ChromeUtils.importESModule(
"chrome://remote/content/shared/webdriver/Errors.sys.mjs"
);
const { Command, Message, Response } = ChromeUtils.importESModule(
"chrome://remote/content/marionette/message.sys.mjs"
);
add_task(
function test_Message_Origin() {
equal(0, Message.Origin.Client);
equal(1, Message.Origin.Server);
});
add_task(
function test_Message_fromPacket() {
let cmd =
new Command(4,
"foo");
let resp =
new Response(5, () => {});
resp.error =
"foo";
ok(Message.fromPacket(cmd.toPacket())
instanceof Command);
ok(Message.fromPacket(resp.toPacket())
instanceof Response);
Assert.
throws(
() => Message.fromPacket([3, 4, 5, 6]),
/Unrecognised message type in packet/
);
});
add_task(
function test_Command() {
let cmd =
new Command(42,
"foo", { bar:
"baz" });
equal(42, cmd.id);
equal(
"foo", cmd.name);
deepEqual({ bar:
"baz" }, cmd.parameters);
equal(
null, cmd.onerror);
equal(
null, cmd.onresult);
equal(Message.Origin.Client, cmd.origin);
equal(
false, cmd.sent);
});
add_task(
function test_Command_onresponse() {
let onerrorOk =
false;
let onresultOk =
false;
let cmd =
new Command(7,
"foo");
cmd.onerror = () => (onerrorOk =
true);
cmd.onresult = () => (onresultOk =
true);
let errorResp =
new Response(8, () => {});
errorResp.error =
new error.WebDriverError(
"foo");
let bodyResp =
new Response(9, () => {});
bodyResp.body =
"bar";
cmd.onresponse(errorResp);
equal(
true, onerrorOk);
equal(
false, onresultOk);
cmd.onresponse(bodyResp);
equal(
true, onresultOk);
});
add_task(
function test_Command_ctor() {
let cmd =
new Command(42,
"bar", { bar:
"baz" });
let msg = cmd.toPacket();
equal(Command.Type, msg[0]);
equal(cmd.id, msg[1]);
equal(cmd.name, msg[2]);
equal(cmd.parameters, msg[3]);
});
add_task(
function test_Command_toString() {
let cmd =
new Command(42,
"foo", { bar:
"baz" });
equal(JSON.stringify(cmd.toPacket()), cmd.toString());
});
add_task(
function test_Command_fromPacket() {
let c1 =
new Command(42,
"foo", { bar:
"baz" });
let msg = c1.toPacket();
let c2 = Command.fromPacket(msg);
equal(c1.id, c2.id);
equal(c1.name, c2.name);
equal(c1.parameters, c2.parameters);
Assert.
throws(
() => Command.fromPacket([
null, 2,
"foo", {}]),
/InvalidArgumentError/
);
Assert.
throws(
() => Command.fromPacket([1, 2,
"foo", {}]),
/InvalidArgumentError/
);
Assert.
throws(
() => Command.fromPacket([0,
null,
"foo", {}]),
/InvalidArgumentError/
);
Assert.
throws(
() => Command.fromPacket([0, 2,
null, {}]),
/InvalidArgumentError/
);
Assert.
throws(
() => Command.fromPacket([0, 2,
"foo",
false]),
/InvalidArgumentError/
);
let nullParams = Command.fromPacket([0, 2,
"foo",
null]);
equal(
"[object Object]",
Object.prototype.toString.call(nullParams.parameters)
);
});
add_task(
function test_Command_Type() {
equal(0, Command.Type);
});
add_task(
function test_Response_ctor() {
let handler = () => {
throw new Error(
"foo");
};
let resp =
new Response(42, handler);
equal(42, resp.id);
equal(
null, resp.error);
ok(
"origin" in resp);
equal(Message.Origin.Server, resp.origin);
equal(
false, resp.sent);
equal(handler, resp.respHandler_);
});
add_task(
function test_Response_sendConditionally() {
let fired =
false;
let resp =
new Response(42, () => (fired =
true));
resp.sendConditionally(() =>
false);
equal(
false, resp.sent);
equal(
false, fired);
resp.sendConditionally(() =>
true);
equal(
true, resp.sent);
equal(
true, fired);
});
add_task(
function test_Response_send() {
let fired =
false;
let resp =
new Response(42, () => (fired =
true));
resp.send();
equal(
true, resp.sent);
equal(
true, fired);
});
add_task(
function test_Response_sendError_sent() {
let resp =
new Response(42, r => equal(
false, r.sent));
resp.sendError(
new error.WebDriverError());
ok(resp.sent);
Assert.
throws(() => resp.send(), /already been sent/);
});
add_task(
function test_Response_sendError_body() {
let resp =
new Response(42, r => equal(
null, r.body));
resp.sendError(
new error.WebDriverError());
});
add_task(
function test_Response_sendError_errorSerialisation() {
let err1 =
new error.WebDriverError();
let resp1 =
new Response(42);
resp1.sendError(err1);
equal(err1.status, resp1.error.error);
deepEqual(err1.toJSON(), resp1.error);
let err2 =
new error.InvalidArgumentError();
let resp2 =
new Response(43);
resp2.sendError(err2);
equal(err2.status, resp2.error.error);
deepEqual(err2.toJSON(), resp2.error);
});
add_task(
function test_Response_sendError_wrapInternalError() {
let err =
new ReferenceError(
"foo");
// errors that originate from JavaScript (i.e. Marionette implementation
// issues) should be converted to UnknownError for transport
let resp =
new Response(42, r => {
equal(
"unknown error", r.error.error);
equal(
false, resp.sent);
});
// they should also throw after being sent
Assert.
throws(() => resp.sendError(err), /foo/);
equal(
true, resp.sent);
});
add_task(
function test_Response_toPacket() {
let resp =
new Response(42, () => {});
let msg = resp.toPacket();
equal(Response.Type, msg[0]);
equal(resp.id, msg[1]);
equal(resp.error, msg[2]);
equal(resp.body, msg[3]);
});
add_task(
function test_Response_toString() {
let resp =
new Response(42, () => {});
resp.error =
"foo";
resp.body =
"bar";
equal(JSON.stringify(resp.toPacket()), resp.toString());
});
add_task(
function test_Response_fromPacket() {
let r1 =
new Response(42, () => {});
r1.error =
"foo";
r1.body =
"bar";
let msg = r1.toPacket();
let r2 = Response.fromPacket(msg);
equal(r1.id, r2.id);
equal(r1.error, r2.error);
equal(r1.body, r2.body);
Assert.
throws(
() => Response.fromPacket([
null, 2,
"foo", {}]),
/InvalidArgumentError/
);
Assert.
throws(
() => Response.fromPacket([0, 2,
"foo", {}]),
/InvalidArgumentError/
);
Assert.
throws(
() => Response.fromPacket([1,
null,
"foo", {}]),
/InvalidArgumentError/
);
Assert.
throws(
() => Response.fromPacket([1, 2,
null, {}]),
/InvalidArgumentError/
);
Response.fromPacket([1, 2,
"foo",
null]);
});
add_task(
function test_Response_Type() {
equal(1, Response.Type);
});