test_message.js (6520B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 const { error } = ChromeUtils.importESModule( 6 "chrome://remote/content/shared/webdriver/Errors.sys.mjs" 7 ); 8 const { Command, Message, Response } = ChromeUtils.importESModule( 9 "chrome://remote/content/marionette/message.sys.mjs" 10 ); 11 12 add_task(function test_Message_Origin() { 13 equal(0, Message.Origin.Client); 14 equal(1, Message.Origin.Server); 15 }); 16 17 add_task(function test_Message_fromPacket() { 18 let cmd = new Command(4, "foo"); 19 let resp = new Response(5, () => {}); 20 resp.error = "foo"; 21 22 ok(Message.fromPacket(cmd.toPacket()) instanceof Command); 23 ok(Message.fromPacket(resp.toPacket()) instanceof Response); 24 Assert.throws( 25 () => Message.fromPacket([3, 4, 5, 6]), 26 /Unrecognised message type in packet/ 27 ); 28 }); 29 30 add_task(function test_Command() { 31 let cmd = new Command(42, "foo", { bar: "baz" }); 32 equal(42, cmd.id); 33 equal("foo", cmd.name); 34 deepEqual({ bar: "baz" }, cmd.parameters); 35 equal(null, cmd.onerror); 36 equal(null, cmd.onresult); 37 equal(Message.Origin.Client, cmd.origin); 38 equal(false, cmd.sent); 39 }); 40 41 add_task(function test_Command_onresponse() { 42 let onerrorOk = false; 43 let onresultOk = false; 44 45 let cmd = new Command(7, "foo"); 46 cmd.onerror = () => (onerrorOk = true); 47 cmd.onresult = () => (onresultOk = true); 48 49 let errorResp = new Response(8, () => {}); 50 errorResp.error = new error.WebDriverError("foo"); 51 52 let bodyResp = new Response(9, () => {}); 53 bodyResp.body = "bar"; 54 55 cmd.onresponse(errorResp); 56 equal(true, onerrorOk); 57 equal(false, onresultOk); 58 59 cmd.onresponse(bodyResp); 60 equal(true, onresultOk); 61 }); 62 63 add_task(function test_Command_ctor() { 64 let cmd = new Command(42, "bar", { bar: "baz" }); 65 let msg = cmd.toPacket(); 66 67 equal(Command.Type, msg[0]); 68 equal(cmd.id, msg[1]); 69 equal(cmd.name, msg[2]); 70 equal(cmd.parameters, msg[3]); 71 }); 72 73 add_task(function test_Command_toString() { 74 let cmd = new Command(42, "foo", { bar: "baz" }); 75 equal(JSON.stringify(cmd.toPacket()), cmd.toString()); 76 }); 77 78 add_task(function test_Command_fromPacket() { 79 let c1 = new Command(42, "foo", { bar: "baz" }); 80 81 let msg = c1.toPacket(); 82 let c2 = Command.fromPacket(msg); 83 84 equal(c1.id, c2.id); 85 equal(c1.name, c2.name); 86 equal(c1.parameters, c2.parameters); 87 88 Assert.throws( 89 () => Command.fromPacket([null, 2, "foo", {}]), 90 /InvalidArgumentError/ 91 ); 92 Assert.throws( 93 () => Command.fromPacket([1, 2, "foo", {}]), 94 /InvalidArgumentError/ 95 ); 96 Assert.throws( 97 () => Command.fromPacket([0, null, "foo", {}]), 98 /InvalidArgumentError/ 99 ); 100 Assert.throws( 101 () => Command.fromPacket([0, 2, null, {}]), 102 /InvalidArgumentError/ 103 ); 104 Assert.throws( 105 () => Command.fromPacket([0, 2, "foo", false]), 106 /InvalidArgumentError/ 107 ); 108 109 let nullParams = Command.fromPacket([0, 2, "foo", null]); 110 equal( 111 "[object Object]", 112 Object.prototype.toString.call(nullParams.parameters) 113 ); 114 }); 115 116 add_task(function test_Command_Type() { 117 equal(0, Command.Type); 118 }); 119 120 add_task(function test_Response_ctor() { 121 let handler = () => { 122 throw new Error("foo"); 123 }; 124 125 let resp = new Response(42, handler); 126 equal(42, resp.id); 127 equal(null, resp.error); 128 ok("origin" in resp); 129 equal(Message.Origin.Server, resp.origin); 130 equal(false, resp.sent); 131 equal(handler, resp.respHandler_); 132 }); 133 134 add_task(function test_Response_sendConditionally() { 135 let fired = false; 136 let resp = new Response(42, () => (fired = true)); 137 resp.sendConditionally(() => false); 138 equal(false, resp.sent); 139 equal(false, fired); 140 resp.sendConditionally(() => true); 141 equal(true, resp.sent); 142 equal(true, fired); 143 }); 144 145 add_task(function test_Response_send() { 146 let fired = false; 147 let resp = new Response(42, () => (fired = true)); 148 resp.send(); 149 equal(true, resp.sent); 150 equal(true, fired); 151 }); 152 153 add_task(function test_Response_sendError_sent() { 154 let resp = new Response(42, r => equal(false, r.sent)); 155 resp.sendError(new error.WebDriverError()); 156 ok(resp.sent); 157 Assert.throws(() => resp.send(), /already been sent/); 158 }); 159 160 add_task(function test_Response_sendError_body() { 161 let resp = new Response(42, r => equal(null, r.body)); 162 resp.sendError(new error.WebDriverError()); 163 }); 164 165 add_task(function test_Response_sendError_errorSerialisation() { 166 let err1 = new error.WebDriverError(); 167 let resp1 = new Response(42); 168 resp1.sendError(err1); 169 equal(err1.status, resp1.error.error); 170 deepEqual(err1.toJSON(), resp1.error); 171 172 let err2 = new error.InvalidArgumentError(); 173 let resp2 = new Response(43); 174 resp2.sendError(err2); 175 equal(err2.status, resp2.error.error); 176 deepEqual(err2.toJSON(), resp2.error); 177 }); 178 179 add_task(function test_Response_sendError_wrapInternalError() { 180 let err = new ReferenceError("foo"); 181 182 // errors that originate from JavaScript (i.e. Marionette implementation 183 // issues) should be converted to UnknownError for transport 184 let resp = new Response(42, r => { 185 equal("unknown error", r.error.error); 186 equal(false, resp.sent); 187 }); 188 189 // they should also throw after being sent 190 Assert.throws(() => resp.sendError(err), /foo/); 191 equal(true, resp.sent); 192 }); 193 194 add_task(function test_Response_toPacket() { 195 let resp = new Response(42, () => {}); 196 let msg = resp.toPacket(); 197 198 equal(Response.Type, msg[0]); 199 equal(resp.id, msg[1]); 200 equal(resp.error, msg[2]); 201 equal(resp.body, msg[3]); 202 }); 203 204 add_task(function test_Response_toString() { 205 let resp = new Response(42, () => {}); 206 resp.error = "foo"; 207 resp.body = "bar"; 208 209 equal(JSON.stringify(resp.toPacket()), resp.toString()); 210 }); 211 212 add_task(function test_Response_fromPacket() { 213 let r1 = new Response(42, () => {}); 214 r1.error = "foo"; 215 r1.body = "bar"; 216 217 let msg = r1.toPacket(); 218 let r2 = Response.fromPacket(msg); 219 220 equal(r1.id, r2.id); 221 equal(r1.error, r2.error); 222 equal(r1.body, r2.body); 223 224 Assert.throws( 225 () => Response.fromPacket([null, 2, "foo", {}]), 226 /InvalidArgumentError/ 227 ); 228 Assert.throws( 229 () => Response.fromPacket([0, 2, "foo", {}]), 230 /InvalidArgumentError/ 231 ); 232 Assert.throws( 233 () => Response.fromPacket([1, null, "foo", {}]), 234 /InvalidArgumentError/ 235 ); 236 Assert.throws( 237 () => Response.fromPacket([1, 2, null, {}]), 238 /InvalidArgumentError/ 239 ); 240 Response.fromPacket([1, 2, "foo", null]); 241 }); 242 243 add_task(function test_Response_Type() { 244 equal(1, Response.Type); 245 });