test_debugger_client.js (1731B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 // DevToolsClient tests 7 8 const { 9 DevToolsServer, 10 } = require("resource://devtools/server/devtools-server.js"); 11 const { 12 DevToolsClient, 13 } = require("resource://devtools/client/devtools-client.js"); 14 15 add_task(async function () { 16 await testCloseLoops(); 17 await fakeTransportShutdown(); 18 }); 19 20 function createClient() { 21 DevToolsServer.init(); 22 DevToolsServer.registerAllActors(); 23 const client = new DevToolsClient(DevToolsServer.connectPipe()); 24 return client; 25 } 26 27 // Ensure that closing the client while it is closing doesn't loop 28 async function testCloseLoops() { 29 const client = createClient(); 30 await client.connect(); 31 32 await new Promise(resolve => { 33 let called = false; 34 client.on("closed", async () => { 35 dump(">> CLOSED\n"); 36 if (called) { 37 ok( 38 false, 39 "Calling client.close from closed event listener introduce loops" 40 ); 41 return; 42 } 43 called = true; 44 await client.close(); 45 resolve(); 46 }); 47 client.close(); 48 }); 49 } 50 51 // Check that, if we fake a transport shutdown (like if a device is unplugged) 52 // the client is automatically closed, and we can still call client.close. 53 async function fakeTransportShutdown() { 54 const client = createClient(); 55 await client.connect(); 56 57 await new Promise(resolve => { 58 const onClosed = async function () { 59 client.off("closed", onClosed); 60 ok(true, "Client emitted 'closed' event"); 61 resolve(); 62 }; 63 client.on("closed", onClosed); 64 client.transport.close(); 65 }); 66 67 await client.close(); 68 ok(true, "client.close() successfully resolves"); 69 }