summaryrefslogtreecommitdiffstats
path: root/devtools/shared/tests/xpcshell/test_debugger_client.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/shared/tests/xpcshell/test_debugger_client.js')
-rw-r--r--devtools/shared/tests/xpcshell/test_debugger_client.js69
1 files changed, 69 insertions, 0 deletions
diff --git a/devtools/shared/tests/xpcshell/test_debugger_client.js b/devtools/shared/tests/xpcshell/test_debugger_client.js
new file mode 100644
index 0000000000..d908ddfb27
--- /dev/null
+++ b/devtools/shared/tests/xpcshell/test_debugger_client.js
@@ -0,0 +1,69 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// DevToolsClient tests
+
+const {
+ DevToolsServer,
+} = require("resource://devtools/server/devtools-server.js");
+const {
+ DevToolsClient,
+} = require("resource://devtools/client/devtools-client.js");
+
+add_task(async function () {
+ await testCloseLoops();
+ await fakeTransportShutdown();
+});
+
+function createClient() {
+ DevToolsServer.init();
+ DevToolsServer.registerAllActors();
+ const client = new DevToolsClient(DevToolsServer.connectPipe());
+ return client;
+}
+
+// Ensure that closing the client while it is closing doesn't loop
+async function testCloseLoops() {
+ const client = createClient();
+ await client.connect();
+
+ await new Promise(resolve => {
+ let called = false;
+ client.on("closed", async () => {
+ dump(">> CLOSED\n");
+ if (called) {
+ ok(
+ false,
+ "Calling client.close from closed event listener introduce loops"
+ );
+ return;
+ }
+ called = true;
+ await client.close();
+ resolve();
+ });
+ client.close();
+ });
+}
+
+// Check that, if we fake a transport shutdown (like if a device is unplugged)
+// the client is automatically closed, and we can still call client.close.
+async function fakeTransportShutdown() {
+ const client = createClient();
+ await client.connect();
+
+ await new Promise(resolve => {
+ const onClosed = async function () {
+ client.off("closed", onClosed);
+ ok(true, "Client emitted 'closed' event");
+ resolve();
+ };
+ client.on("closed", onClosed);
+ client.transport.close();
+ });
+
+ await client.close();
+ ok(true, "client.close() successfully resolves");
+}