test_queue.js (5054B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 /** 7 * This test verifies that the transport's queue operates correctly when various 8 * packets are scheduled simultaneously. 9 */ 10 11 var { FileUtils } = ChromeUtils.importESModule( 12 "resource://gre/modules/FileUtils.sys.mjs" 13 ); 14 15 function run_test() { 16 initTestDevToolsServer(); 17 18 add_task(async function () { 19 await test_transport(socket_transport); 20 await test_transport(local_transport); 21 DevToolsServer.destroy(); 22 }); 23 24 run_next_test(); 25 } 26 27 /*** Tests ***/ 28 29 var test_transport = async function (transportFactory) { 30 let clientResolve; 31 const clientDeferred = new Promise(resolve => { 32 clientResolve = resolve; 33 }); 34 35 let serverResolve; 36 const serverDeferred = new Promise(resolve => { 37 serverResolve = resolve; 38 }); 39 40 // Ensure test files are not present from a failed run 41 cleanup_files(); 42 const reallyLong = really_long(); 43 writeTestTempFile("bulk-input", reallyLong); 44 45 Assert.equal(Object.keys(DevToolsServer._connections).length, 0); 46 47 const transport = await transportFactory(); 48 49 // Sending from client to server 50 function write_data({ copyFrom }) { 51 NetUtil.asyncFetch( 52 { 53 uri: NetUtil.newURI(getTestTempFile("bulk-input")), 54 loadUsingSystemPrincipal: true, 55 }, 56 function (input) { 57 copyFrom(input).then(() => { 58 input.close(); 59 }); 60 } 61 ); 62 } 63 64 // Receiving on server from client 65 function on_bulk_packet({ actor, type, length, copyTo }) { 66 Assert.equal(actor, "root"); 67 Assert.equal(type, "file-stream"); 68 Assert.equal(length, reallyLong.length); 69 70 const outputFile = getTestTempFile("bulk-output", true); 71 outputFile.create(Ci.nsIFile.NORMAL_FILE_TYPE, parseInt("666", 8)); 72 73 const output = FileUtils.openSafeFileOutputStream(outputFile); 74 75 copyTo(output) 76 .then(() => { 77 FileUtils.closeSafeFileOutputStream(output); 78 return verify(); 79 }) 80 .then(() => { 81 // It's now safe to close 82 transport.hooks.onTransportClosed = () => { 83 clientResolve(); 84 }; 85 transport.close(); 86 }); 87 } 88 89 // Client 90 91 function send_packets() { 92 // Specifically, we want to ensure that multiple send()s proceed without 93 // causing the transport to die. 94 transport.send({ 95 actor: "root", 96 type: "explode", 97 }); 98 99 transport 100 .startBulkSend({ 101 actor: "root", 102 type: "file-stream", 103 length: reallyLong.length, 104 }) 105 .then(write_data); 106 } 107 108 transport.hooks = { 109 onPacket(packet) { 110 if (packet.error) { 111 transport.hooks.onError(packet); 112 } else if (packet.applicationType) { 113 transport.hooks.onServerHello(packet); 114 } else { 115 do_throw("Unexpected server reply"); 116 } 117 }, 118 119 onServerHello(packet) { 120 // We've received the initial start up packet 121 Assert.equal(packet.from, "root"); 122 Assert.equal(packet.applicationType, "xpcshell-tests"); 123 124 // Server 125 Assert.equal(Object.keys(DevToolsServer._connections).length, 1); 126 info(Object.keys(DevToolsServer._connections)); 127 for (const connId in DevToolsServer._connections) { 128 DevToolsServer._connections[connId].onBulkPacket = on_bulk_packet; 129 } 130 131 DevToolsServer.on("connectionchange", type => { 132 if (type === "closed") { 133 serverResolve(); 134 } 135 }); 136 137 send_packets(); 138 }, 139 140 onError(packet) { 141 // The explode actor doesn't exist 142 Assert.equal(packet.from, "root"); 143 Assert.equal(packet.error, "noSuchActor"); 144 }, 145 146 onTransportClosed() { 147 do_throw("Transport closed before we expected"); 148 }, 149 }; 150 151 transport.ready(); 152 153 return Promise.all([clientDeferred, serverDeferred]); 154 }; 155 156 /*** Test Utils ***/ 157 158 function verify() { 159 const reallyLong = really_long(); 160 161 const inputFile = getTestTempFile("bulk-input"); 162 const outputFile = getTestTempFile("bulk-output"); 163 164 Assert.equal(inputFile.fileSize, reallyLong.length); 165 Assert.equal(outputFile.fileSize, reallyLong.length); 166 167 // Ensure output file contents actually match 168 return new Promise(resolve => { 169 NetUtil.asyncFetch( 170 { 171 uri: NetUtil.newURI(getTestTempFile("bulk-output")), 172 loadUsingSystemPrincipal: true, 173 }, 174 input => { 175 const outputData = NetUtil.readInputStreamToString( 176 input, 177 reallyLong.length 178 ); 179 // Avoid Assert.strictEqual here so we don't log the contents 180 // eslint-disable-next-line mozilla/no-comparison-or-assignment-inside-ok 181 Assert.ok(outputData === reallyLong); 182 input.close(); 183 resolve(); 184 } 185 ); 186 }).then(cleanup_files); 187 } 188 189 function cleanup_files() { 190 const inputFile = getTestTempFile("bulk-input", true); 191 if (inputFile.exists()) { 192 inputFile.remove(false); 193 } 194 195 const outputFile = getTestTempFile("bulk-output", true); 196 if (outputFile.exists()) { 197 outputFile.remove(false); 198 } 199 }