110 lines
3.1 KiB
JavaScript
110 lines
3.1 KiB
JavaScript
'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 shell()');
|
|
|
|
const OUTPUT = 'shell output!\n';
|
|
|
|
server.on('connection', mustCall((conn) => {
|
|
conn.on('ready', mustCall(() => {
|
|
conn.on('session', mustCall((accept, reject) => {
|
|
const session = accept();
|
|
session.on('pty', mustCall((accept, reject, info) => {
|
|
accept();
|
|
session.on('shell', mustCall((accept, reject) => {
|
|
let input = '';
|
|
const stream = accept();
|
|
stream.write(OUTPUT);
|
|
stream.on('data', mustCallAtLeast((data) => {
|
|
input += data;
|
|
if (input === 'exit\n') {
|
|
stream.end();
|
|
conn.end();
|
|
}
|
|
}));
|
|
}));
|
|
}));
|
|
}));
|
|
}));
|
|
}));
|
|
|
|
client.on('ready', mustCall(() => {
|
|
let output = '';
|
|
client.on('close', mustCall(() => {
|
|
assert(output === OUTPUT, `Wrong shell output: ${inspect(output)}`);
|
|
})).shell(mustCall((err, stream) => {
|
|
assert(!err, `Unexpected shell error: ${err}`);
|
|
stream.write('exit\n');
|
|
stream.on('data', mustCallAtLeast((d) => {
|
|
output += d;
|
|
})).on('close', mustCall(() => {}));
|
|
}));
|
|
}));
|
|
}
|
|
|
|
{
|
|
const { client, server } = setup('Shell with environment set');
|
|
|
|
const OUTPUT = 'shell output!\n';
|
|
const clientEnv = { SSH2NODETEST: 'foo' };
|
|
|
|
server.on('connection', mustCall((conn) => {
|
|
conn.on('ready', mustCall(() => {
|
|
conn.on('session', mustCall((accept, reject) => {
|
|
let pty = false;
|
|
let env = false;
|
|
accept().on('pty', mustCall((accept, reject, info) => {
|
|
accept();
|
|
pty = true;
|
|
})).on('env', mustCall((accept, reject, info) => {
|
|
accept && accept();
|
|
env = true;
|
|
assert(info.key === Object.keys(clientEnv)[0],
|
|
`Wrong env key: ${inspect(info.key)}`);
|
|
assert(info.val === Object.values(clientEnv)[0],
|
|
`Wrong env value: ${inspect(info.val)}`);
|
|
})).on('shell', mustCall((accept, reject) => {
|
|
assert(pty, 'Expected pty before shell');
|
|
assert(env, 'Expected env before shell');
|
|
let input = '';
|
|
const stream = accept();
|
|
stream.write(OUTPUT);
|
|
stream.on('data', mustCallAtLeast((data) => {
|
|
input += data;
|
|
if (input === 'exit\n') {
|
|
stream.end();
|
|
conn.end();
|
|
}
|
|
}));
|
|
}));
|
|
}));
|
|
}));
|
|
}));
|
|
|
|
client.on('ready', mustCall(() => {
|
|
let output = '';
|
|
client.on('close', mustCall(() => {
|
|
assert(output === OUTPUT, `Wrong shell output: ${inspect(output)}`);
|
|
})).shell({ env: clientEnv }, mustCall((err, stream) => {
|
|
assert(!err, `Unexpected shell error: ${err}`);
|
|
stream.write('exit\n');
|
|
stream.on('data', mustCallAtLeast((d) => {
|
|
output += d;
|
|
})).on('close', mustCall(() => {}));
|
|
}));
|
|
}));
|
|
}
|