summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorSam Roberts <vieuxtech@gmail.com>2017-05-25 19:00:24 -0700
committerSam Roberts <vieuxtech@gmail.com>2017-06-06 14:41:17 -0700
commit2791b360c11324f7c9ed83350f264c500ade4fe8 (patch)
tree32c398bc37f0d864d294cc629167aa577c30f08c /test
parentdcfbbacba8c22613b956c1a3b9d958676e5d5e87 (diff)
downloadandroid-node-v8-2791b360c11324f7c9ed83350f264c500ade4fe8.tar.gz
android-node-v8-2791b360c11324f7c9ed83350f264c500ade4fe8.tar.bz2
android-node-v8-2791b360c11324f7c9ed83350f264c500ade4fe8.zip
inspector: allow --inspect=host:port from js
PR-URL: https://github.com/nodejs/node/pull/13228 Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com> Reviewed-By: Refael Ackermann <refack@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'test')
-rw-r--r--test/parallel/test-inspector-open.js104
1 files changed, 104 insertions, 0 deletions
diff --git a/test/parallel/test-inspector-open.js b/test/parallel/test-inspector-open.js
new file mode 100644
index 0000000000..bc7d15a554
--- /dev/null
+++ b/test/parallel/test-inspector-open.js
@@ -0,0 +1,104 @@
+'use strict';
+const common = require('../common');
+
+// Test inspector open()/close()/url() API. It uses ephemeral ports so can be
+// run safely in parallel.
+
+const assert = require('assert');
+const fork = require('child_process').fork;
+const net = require('net');
+const url = require('url');
+
+common.skipIfInspectorDisabled();
+
+if (process.env.BE_CHILD)
+ return beChild();
+
+const child = fork(__filename, {env: {BE_CHILD: 1}});
+
+child.once('message', common.mustCall((msg) => {
+ assert.strictEqual(msg.cmd, 'started');
+
+ child.send({cmd: 'open', args: [0]});
+ child.once('message', common.mustCall(firstOpen));
+}));
+
+let firstPort;
+
+function firstOpen(msg) {
+ assert.strictEqual(msg.cmd, 'url');
+ const port = url.parse(msg.url).port;
+ ping(port, (err) => {
+ assert.ifError(err);
+ // Inspector is already open, and won't be reopened, so args don't matter.
+ child.send({cmd: 'open', args: []});
+ child.once('message', common.mustCall(tryToOpenWhenOpen));
+ firstPort = port;
+ });
+}
+
+function tryToOpenWhenOpen(msg) {
+ assert.strictEqual(msg.cmd, 'url');
+ const port = url.parse(msg.url).port;
+ // Reopen didn't do anything, the port was already open, and has not changed.
+ assert.strictEqual(port, firstPort);
+ ping(port, (err) => {
+ assert.ifError(err);
+ child.send({cmd: 'close'});
+ child.once('message', common.mustCall(closeWhenOpen));
+ });
+}
+
+function closeWhenOpen(msg) {
+ assert.strictEqual(msg.cmd, 'url');
+ assert.strictEqual(msg.url, undefined);
+ ping(firstPort, (err) => {
+ assert(err);
+ child.send({cmd: 'close'});
+ child.once('message', common.mustCall(tryToCloseWhenClosed));
+ });
+}
+
+function tryToCloseWhenClosed(msg) {
+ assert.strictEqual(msg.cmd, 'url');
+ assert.strictEqual(msg.url, undefined);
+ child.send({cmd: 'open', args: []});
+ child.once('message', common.mustCall(reopenAfterClose));
+}
+
+function reopenAfterClose(msg) {
+ assert.strictEqual(msg.cmd, 'url');
+ const port = url.parse(msg.url).port;
+ assert.notStrictEqual(port, firstPort);
+ ping(port, (err) => {
+ assert.ifError(err);
+ process.exit();
+ });
+}
+
+function ping(port, callback) {
+ net.connect(port)
+ .on('connect', function() { close(this); })
+ .on('error', function(err) { close(this, err); });
+
+ function close(self, err) {
+ self.end();
+ self.on('close', () => callback(err));
+ }
+}
+
+function beChild() {
+ const inspector = require('inspector');
+
+ process.send({cmd: 'started'});
+
+ process.on('message', (msg) => {
+ if (msg.cmd === 'open') {
+ inspector.open(...msg.args);
+ }
+ if (msg.cmd === 'close') {
+ inspector.close();
+ }
+ process.send({cmd: 'url', url: inspector.url()});
+ });
+}