Repository URL to install this package:
Version:
0.6.0 ▾
|
'use strict';
const assert = require('assert');
const { inspect } = require('util');
const {
mustCall,
mustCallAtLeast,
setupSimple,
} = require('./common.js');
const DEBUG = false;
const setup = setupSimple.bind(undefined, DEBUG);
{
const { client, server } = setup('Simple exec()');
const COMMAND = 'foo --bar';
const STDOUT_DATA = 'stdout data!\n';
const STDERR_DATA = 'stderr data!\n';
server.on('connection', mustCall((conn) => {
conn.on('ready', mustCall(() => {
conn.on('session', mustCall((accept, reject) => {
accept().on('exec', mustCall((accept, reject, info) => {
assert(info.command === COMMAND,
`Wrong exec command: ${info.command}`);
const stream = accept();
stream.stderr.write(STDERR_DATA);
stream.write(STDOUT_DATA);
stream.exit(100);
stream.end();
conn.end();
}));
}));
}));
}));
client.on('ready', mustCall(() => {
let out = '';
let outErr = '';
const events = [];
const EXPECTED_EVENTS = [ 'exit', 'close' ];
const EXPECTED_EXIT_CLOSE_ARGS = [ 100 ];
client.on('close', mustCall(() => {
assert(out === STDOUT_DATA, `Wrong stdout data: ${inspect(out)}`);
assert(outErr === STDERR_DATA, `Wrong stderr data: ${inspect(outErr)}`);
assert.deepStrictEqual(
events,
EXPECTED_EVENTS,
`Wrong command event order: ${events}`
);
})).exec(COMMAND, mustCall((err, stream) => {
assert(!err, `Unexpected exec error: ${err}`);
stream.on('data', mustCallAtLeast((d) => {
out += d;
})).on('exit', mustCall((...args) => {
assert.deepStrictEqual(args,
EXPECTED_EXIT_CLOSE_ARGS,
`Wrong exit args: ${inspect(args)}`);
events.push('exit');
})).on('close', mustCall((...args) => {
assert.deepStrictEqual(args,
EXPECTED_EXIT_CLOSE_ARGS,
`Wrong close args: ${inspect(args)}`);
events.push('close');
})).stderr.on('data', mustCallAtLeast((d) => {
outErr += d;
}));
}));
}));
}
{
const { client, server } = setup('Simple exec() (exit signal)');
const COMMAND = 'foo --bar';
const STDOUT_DATA = 'stdout data!\n';
const STDERR_DATA = 'stderr data!\n';
server.on('connection', mustCall((conn) => {
conn.on('ready', mustCall(() => {
conn.on('session', mustCall((accept, reject) => {
accept().on('exec', mustCall((accept, reject, info) => {
assert(info.command === COMMAND,
`Wrong exec command: ${info.command}`);
const stream = accept();
stream.stderr.write(STDERR_DATA);
stream.write(STDOUT_DATA);
assert.throws(() => stream.exit('SIGFAKE'));
stream.exit('SIGKILL');
stream.end();
conn.end();
}));
}));
}));
}));
client.on('ready', mustCall(() => {
let out = '';
let outErr = '';
const events = [];
const EXPECTED_EVENTS = [ 'exit', 'close' ];
const EXPECTED_EXIT_CLOSE_ARGS = [ null, 'SIGKILL', false, '' ];
client.on('close', mustCall(() => {
assert(out === STDOUT_DATA, `Wrong stdout data: ${inspect(out)}`);
assert(outErr === STDERR_DATA, `Wrong stderr data: ${inspect(outErr)}`);
assert.deepStrictEqual(
events,
EXPECTED_EVENTS,
`Wrong command event order: ${events}`
);
})).exec(COMMAND, mustCall((err, stream) => {
assert(!err, `Unexpected exec error: ${err}`);
stream.on('data', mustCallAtLeast((d) => {
out += d;
})).on('exit', mustCall((...args) => {
assert.deepStrictEqual(args,
EXPECTED_EXIT_CLOSE_ARGS,
`Wrong exit args: ${inspect(args)}`);
events.push('exit');
})).on('close', mustCall((...args) => {
assert.deepStrictEqual(args,
EXPECTED_EXIT_CLOSE_ARGS,
`Wrong close args: ${inspect(args)}`);
events.push('close');
})).stderr.on('data', mustCallAtLeast((d) => {
outErr += d;
}));
}));
}));
}
{
const { client, server } = setup('Simple exec() (exit signal -- no "SIG")');
const COMMAND = 'foo --bar';
const STDOUT_DATA = 'stdout data!\n';
const STDERR_DATA = 'stderr data!\n';
server.on('connection', mustCall((conn) => {
conn.on('ready', mustCall(() => {
conn.on('session', mustCall((accept, reject) => {
accept().on('exec', mustCall((accept, reject, info) => {
assert(info.command === COMMAND,
`Wrong exec command: ${info.command}`);
const stream = accept();
stream.stderr.write(STDERR_DATA);
stream.write(STDOUT_DATA);
assert.throws(() => stream.exit('FAKE'));
stream.exit('KILL');
stream.end();
conn.end();
}));
}));
}));
}));
client.on('ready', mustCall(() => {
let out = '';
let outErr = '';
const events = [];
const EXPECTED_EVENTS = [ 'exit', 'close' ];
const EXPECTED_EXIT_CLOSE_ARGS = [ null, 'SIGKILL', false, '' ];
client.on('close', mustCall(() => {
assert(out === STDOUT_DATA, `Wrong stdout data: ${inspect(out)}`);
assert(outErr === STDERR_DATA, `Wrong stderr data: ${inspect(outErr)}`);
assert.deepStrictEqual(
events,
EXPECTED_EVENTS,
`Wrong command event order: ${events}`
);
})).exec(COMMAND, mustCall((err, stream) => {
assert(!err, `Unexpected exec error: ${err}`);
stream.on('data', mustCallAtLeast((d) => {
out += d;
})).on('exit', mustCall((...args) => {
assert.deepStrictEqual(args,
EXPECTED_EXIT_CLOSE_ARGS,
`Wrong exit args: ${inspect(args)}`);
events.push('exit');
})).on('close', mustCall((...args) => {
assert.deepStrictEqual(args,
EXPECTED_EXIT_CLOSE_ARGS,
`Wrong close args: ${inspect(args)}`);
events.push('close');
})).stderr.on('data', mustCallAtLeast((d) => {
outErr += d;
}));
}));
}));
}
{
const { client, server } = setup('Exec with signal()');
const COMMAND = 'foo --bar';
const STDOUT_DATA = 'stdout data!\n';
const STDERR_DATA = 'stderr data!\n';
server.on('connection', mustCall((conn) => {
conn.on('ready', mustCall(() => {
conn.on('session', mustCall((accept, reject) => {
let stream;
accept().on('exec', mustCall((accept, reject, info) => {
assert(info.command === COMMAND,
`Wrong exec command: ${info.command}`);
stream = accept();
stream.stderr.write(STDERR_DATA);
stream.write(STDOUT_DATA);
})).on('signal', mustCall((accept, reject, info) => {
assert(info.name === 'INT', `Wrong client signal name: ${info.name}`);
stream.exit(100);
stream.end();
conn.end();
}));
}));
}));
}));
client.on('ready', mustCall(() => {
let out = '';
let outErr = '';
const events = [];
const EXPECTED_EVENTS = [ 'exit', 'close' ];
const EXPECTED_EXIT_CLOSE_ARGS = [ 100 ];
client.on('close', mustCall(() => {
assert(out === STDOUT_DATA, `Wrong stdout data: ${inspect(out)}`);
assert(outErr === STDERR_DATA, `Wrong stderr data: ${inspect(outErr)}`);
assert.deepStrictEqual(
events,
EXPECTED_EVENTS,
`Wrong command event order: ${events}`
);
})).exec(COMMAND, mustCall((err, stream) => {
assert(!err, `Unexpected exec error: ${err}`);
const sendSignal = (() => {
let sent = false;
return () => {
if (sent)
return;
sent = true;
assert.throws(() => stream.signal('FAKE'));
assert.throws(() => stream.signal('SIGFAKE'));
stream.signal('SIGINT');
};
})();
stream.on('data', mustCallAtLeast((d) => {
out += d;
sendSignal();
})).on('exit', mustCall((...args) => {
assert.deepStrictEqual(args,
EXPECTED_EXIT_CLOSE_ARGS,
`Wrong exit args: ${inspect(args)}`);
events.push('exit');
})).on('close', mustCall((...args) => {
assert.deepStrictEqual(args,
EXPECTED_EXIT_CLOSE_ARGS,
`Wrong close args: ${inspect(args)}`);
events.push('close');
})).stderr.on('data', mustCallAtLeast((d) => {
outErr += d;
}));
}));
}));
}
{
const { client, server } = setup('Exec with signal() -- no "SIG"');
const COMMAND = 'foo --bar';
const STDOUT_DATA = 'stdout data!\n';
const STDERR_DATA = 'stderr data!\n';
server.on('connection', mustCall((conn) => {
conn.on('ready', mustCall(() => {
conn.on('session', mustCall((accept, reject) => {
let stream;
accept().on('exec', mustCall((accept, reject, info) => {
assert(info.command === COMMAND,
`Wrong exec command: ${info.command}`);
stream = accept();
stream.stderr.write(STDERR_DATA);
stream.write(STDOUT_DATA);
})).on('signal', mustCall((accept, reject, info) => {
assert(info.name === 'INT', `Wrong client signal name: ${info.name}`);
stream.exit(100);
stream.end();
conn.end();
}));
}));
}));
}));
client.on('ready', mustCall(() => {
let out = '';
let outErr = '';
const events = [];
const EXPECTED_EVENTS = [ 'exit', 'close' ];
const EXPECTED_EXIT_CLOSE_ARGS = [ 100 ];
client.on('close', mustCall(() => {
assert(out === STDOUT_DATA, `Wrong stdout data: ${inspect(out)}`);
assert(outErr === STDERR_DATA, `Wrong stderr data: ${inspect(outErr)}`);
assert.deepStrictEqual(
events,
EXPECTED_EVENTS,
`Wrong command event order: ${events}`
);
})).exec(COMMAND, mustCall((err, stream) => {
assert(!err, `Unexpected exec error: ${err}`);
const sendSignal = (() => {
let sent = false;
return () => {
if (sent)
return;
sent = true;
stream.signal('INT');
};
})();
stream.on('data', mustCallAtLeast((d) => {
out += d;
sendSignal();
})).on('exit', mustCall((...args) => {
assert.deepStrictEqual(args,
EXPECTED_EXIT_CLOSE_ARGS,
`Wrong exit args: ${inspect(args)}`);
events.push('exit');
})).on('close', mustCall((...args) => {
assert.deepStrictEqual(args,
EXPECTED_EXIT_CLOSE_ARGS,
`Wrong close args: ${inspect(args)}`);
events.push('close');
})).stderr.on('data', mustCallAtLeast((d) => {
outErr += d;
}));
}));
}));
}
{
const { client, server } = setup('Exec with environment set');
const env = { SSH2NODETEST: 'foo' };
server.on('connection', mustCall((conn) => {
conn.on('ready', mustCall(() => {
conn.on('session', mustCall((accept, reject) => {
accept().on('env', mustCall((accept, reject, info) => {
accept && accept();
assert(info.key === Object.keys(env)[0],
'Wrong env key');
assert(info.val === Object.values(env)[0],
'Wrong env value');
})).on('exec', mustCall((accept, reject, info) => {
assert(info.command === 'foo --bar',
`Wrong exec command: ${info.command}`);
const stream = accept();
stream.exit(100);
stream.end();
conn.end();
}));
}));
}));
}));
client.on('ready', mustCall(() => {
client.exec('foo --bar', { env }, mustCall((err, stream) => {
assert(!err, `Unexpected exec error: ${err}`);
stream.resume();
}));
}));
}
{
const { client, server } = setup('Exec with setWindow()');
const dimensions = {
rows: 60,
cols: 115,
height: 480,
width: 640,
};
server.on('connection', mustCall((conn) => {
conn.on('ready', mustCall(() => {
conn.on('session', mustCall((accept, reject) => {
accept().on('window-change', mustCall((accept, reject, info) => {
accept && accept();
assert.deepStrictEqual(info, dimensions, 'Wrong dimensions');
})).on('exec', mustCall((accept, reject, info) => {
assert(info.command === 'foo --bar',
`Wrong exec command: ${info.command}`);
const stream = accept();
stream.exit(100);
stream.end();
conn.end();
}));
}));
}));
}));
client.on('ready', mustCall(() => {
client.exec('foo --bar', mustCall((err, stream) => {
assert(!err, `Unexpected exec error: ${err}`);
stream.setWindow(...Object.values(dimensions));
stream.resume();
}));
}));
}
{
const { client, server } = setup('Exec with pty set');
const pty = {
rows: 2,
cols: 4,
width: 0,
height: 0,
term: 'vt220',
modes: {},
};
server.on('connection', mustCall((conn) => {
conn.on('ready', mustCall(() => {
conn.on('session', mustCall((accept, reject) => {
let sawPty = false;
accept().on('pty', mustCall((accept, reject, info) => {
assert.deepStrictEqual(info, pty, 'Wrong pty info');
sawPty = true;
accept && accept();
})).on('exec', mustCall((accept, reject, info) => {
assert(sawPty, 'Expected pty to be set up');
assert(info.command === 'foo --bar',
`Wrong exec command: ${info.command}`);
const stream = accept();
stream.exit(100);
stream.end();
conn.end();
}));
}));
}));
}));
client.on('ready', mustCall(() => {
client.exec('foo --bar', { pty }, mustCall((err, stream) => {
assert(!err, `Unexpected exec error: ${err}`);
stream.resume();
}));
}));
}
{
const { client, server } = setup('Exec with X11 forwarding');
server.on('connection', mustCall((conn) => {
conn.on('ready', mustCall(() => {
conn.on('session', mustCall((accept, reject) => {
let sawX11 = false;
accept().on('x11', mustCall((accept, reject, info) => {
assert.strictEqual(info.single,
false,
`Wrong x11 single: ${info.single}`);
assert.strictEqual(info.screen,
0,
`Wrong x11 screen: ${info.screen}`);
assert.strictEqual(info.protocol,
'MIT-MAGIC-COOKIE-1',
`Wrong x11 protocol: ${info.protocol}`);
assert(Buffer.isBuffer(info.cookie), 'Expected cookie Buffer');
assert.strictEqual(
info.cookie.length,
32,
`Invalid x11 cookie length: ${info.cookie.length}`
);
sawX11 = true;
accept && accept();
})).on('exec', mustCall((accept, reject, info) => {
assert(sawX11, 'Expected x11 before exec');
assert(info.command === 'foo --bar',
`Wrong exec command: ${info.command}`);
const stream = accept();
conn.x11('127.0.0.1', 4321, mustCall((err, xstream) => {
assert(!err, `Unexpected x11() error: ${err}`);
xstream.resume();
xstream.on('end', mustCall(() => {
stream.exit(100);
stream.end();
conn.end();
})).end();
}));
}));
}));
}));
}));
client.on('ready', mustCall(() => {
client.on('x11', mustCall((info, accept, reject) => {
assert.strictEqual(info.srcIP,
'127.0.0.1',
`Invalid x11 srcIP: ${info.srcIP}`);
assert.strictEqual(info.srcPort,
4321,
`Invalid x11 srcPort: ${info.srcPort}`);
accept();
})).exec('foo --bar', { x11: true }, mustCall((err, stream) => {
assert(!err, `Unexpected exec error: ${err}`);
stream.resume();
}));
}));
}
{
const { client, server } = setup(
'Exec with X11 forwarding (custom X11 settings)'
);
const x11 = {
single: true,
screen: 1234,
protocol: 'YUMMY-MAGIC-COOKIE-1',
cookie: '00112233445566778899001122334455',
};
server.on('connection', mustCall((conn) => {
conn.on('ready', mustCall(() => {
conn.on('session', mustCall((accept, reject) => {
let sawX11 = false;
accept().on('x11', mustCall((accept, reject, info) => {
assert.strictEqual(info.single,
x11.single,
`Wrong x11 single: ${info.single}`);
assert.strictEqual(info.screen,
x11.screen,
`Wrong x11 screen: ${info.screen}`);
assert.strictEqual(info.protocol,
x11.protocol,
`Wrong x11 protocol: ${info.protocol}`);
assert(Buffer.isBuffer(info.cookie), 'Expected cookie Buffer');
assert.strictEqual(info.cookie.toString(),
x11.cookie,
`Wrong x11 cookie: ${info.cookie}`);
sawX11 = true;
accept && accept();
})).on('exec', mustCall((accept, reject, info) => {
assert(sawX11, 'Expected x11 before exec');
assert(info.command === 'foo --bar',
`Wrong exec command: ${info.command}`);
const stream = accept();
conn.x11('127.0.0.1', 4321, mustCall((err, xstream) => {
assert(!err, `Unexpected x11() error: ${err}`);
xstream.resume();
xstream.on('end', mustCall(() => {
stream.exit(100);
stream.end();
conn.end();
})).end();
}));
}));
}));
}));
}));
client.on('ready', mustCall(() => {
client.on('x11', mustCall((info, accept, reject) => {
assert.strictEqual(info.srcIP,
'127.0.0.1',
`Invalid x11 srcIP: ${info.srcIP}`);
assert.strictEqual(info.srcPort,
4321,
`Invalid x11 srcPort: ${info.srcPort}`);
accept();
})).exec('foo --bar', { x11 }, mustCall((err, stream) => {
assert(!err, `Unexpected exec error: ${err}`);
stream.resume();
}));
}));
}