54 lines
1.8 KiB
JavaScript
54 lines
1.8 KiB
JavaScript
|
|
"use strict";
|
||
|
|
|
||
|
|
const test = require("node:test");
|
||
|
|
const assert = require("node:assert/strict");
|
||
|
|
const { EventEmitter } = require("node:events");
|
||
|
|
const { _execSshCommandCancellableForTests } = require("./transferBridge.cjs");
|
||
|
|
|
||
|
|
test("same-host copy can cancel before SSH exec opens and closes a late stream", async () => {
|
||
|
|
let callback;
|
||
|
|
const sshClient = { exec(_command, next) { callback = next; } };
|
||
|
|
const transfer = { cancelled: false, abort: null };
|
||
|
|
const result = _execSshCommandCancellableForTests(sshClient, "cp", transfer);
|
||
|
|
transfer.cancelled = true;
|
||
|
|
transfer.abort();
|
||
|
|
await assert.rejects(result, /Transfer cancelled/);
|
||
|
|
|
||
|
|
const stream = new EventEmitter();
|
||
|
|
stream.stderr = new EventEmitter();
|
||
|
|
let closed = 0;
|
||
|
|
stream.close = () => { closed += 1; };
|
||
|
|
callback(null, stream);
|
||
|
|
assert.ok(closed > 0);
|
||
|
|
assert.equal(transfer.abort, null);
|
||
|
|
});
|
||
|
|
|
||
|
|
test("same-host copy rejects output floods and SSH stream errors", async () => {
|
||
|
|
{
|
||
|
|
const stream = new EventEmitter();
|
||
|
|
stream.stderr = new EventEmitter();
|
||
|
|
stream.close = () => {};
|
||
|
|
stream.destroy = () => {};
|
||
|
|
const result = _execSshCommandCancellableForTests(
|
||
|
|
{ exec(_command, next) { next(null, stream); } },
|
||
|
|
"cp",
|
||
|
|
{ cancelled: false, abort: null },
|
||
|
|
);
|
||
|
|
stream.stderr.emit("data", Buffer.alloc(64 * 1024 + 1));
|
||
|
|
await assert.rejects(result, /output exceeded/);
|
||
|
|
}
|
||
|
|
{
|
||
|
|
const stream = new EventEmitter();
|
||
|
|
stream.stderr = new EventEmitter();
|
||
|
|
stream.close = () => {};
|
||
|
|
stream.destroy = () => {};
|
||
|
|
const result = _execSshCommandCancellableForTests(
|
||
|
|
{ exec(_command, next) { next(null, stream); } },
|
||
|
|
"cp",
|
||
|
|
{ cancelled: false, abort: null },
|
||
|
|
);
|
||
|
|
stream.emit("error", new Error("copy stream failed"));
|
||
|
|
await assert.rejects(result, /copy stream failed/);
|
||
|
|
}
|
||
|
|
});
|