[Init] Initial commit - NetMesh terminal manager
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
This commit is contained in:
166
application/state/sftp/dedicatedStreamSessionPolicy.test.ts
Normal file
166
application/state/sftp/dedicatedStreamSessionPolicy.test.ts
Normal file
@@ -0,0 +1,166 @@
|
||||
import assert from "node:assert/strict";
|
||||
import test from "node:test";
|
||||
|
||||
import {
|
||||
compressedUploadRequiresDedicatedSession,
|
||||
remoteEndpointRequiresPool,
|
||||
resolveDedicatedStreamEndpointIds,
|
||||
resolveUploadStreamTargetSftpId,
|
||||
} from "../../../domain/sftpDedicatedStreamPolicy.ts";
|
||||
import { runWithCompressedUploadSession } from "./compressedUploadSession.ts";
|
||||
|
||||
test("compressed folder uploads hold a dedicated session for the whole job", async () => {
|
||||
const calls: Array<[string, string]> = [];
|
||||
const lease = {
|
||||
sftpId: "dedicated-compressed",
|
||||
poolKey: "host-1",
|
||||
release: () => {},
|
||||
discard: () => {},
|
||||
};
|
||||
|
||||
const result = await runWithCompressedUploadSession({
|
||||
enabled: true,
|
||||
hasDirectory: true,
|
||||
isLocal: false,
|
||||
hostId: "host-1",
|
||||
jobId: "compressed-job-1",
|
||||
prepSftpId: "browse-session",
|
||||
acquire: async (hostId, jobId) => {
|
||||
calls.push([hostId, jobId]);
|
||||
return lease;
|
||||
},
|
||||
shouldDiscard: () => false,
|
||||
run: async (sftpId) => sftpId,
|
||||
});
|
||||
|
||||
assert.equal(result, "dedicated-compressed");
|
||||
assert.deepEqual(calls, [["host-1", "compressed-job-1"]]);
|
||||
});
|
||||
|
||||
test("compressed upload refuses a page-owned fallback when a dedicated session is required", async () => {
|
||||
await assert.rejects(
|
||||
runWithCompressedUploadSession({
|
||||
enabled: true,
|
||||
hasDirectory: true,
|
||||
isLocal: false,
|
||||
hostId: "host-1",
|
||||
jobId: "compressed-job-2",
|
||||
prepSftpId: "browse-session",
|
||||
shouldDiscard: () => false,
|
||||
run: async (sftpId) => sftpId,
|
||||
}),
|
||||
/Dedicated transfer session unavailable/,
|
||||
);
|
||||
});
|
||||
|
||||
test("compressed upload discards a failed dedicated session instead of releasing it", async () => {
|
||||
let discarded = 0;
|
||||
let released = 0;
|
||||
await assert.rejects(runWithCompressedUploadSession({
|
||||
enabled: true,
|
||||
hasDirectory: true,
|
||||
isLocal: false,
|
||||
hostId: "host-1",
|
||||
jobId: "compressed-job-3",
|
||||
prepSftpId: "browse-session",
|
||||
acquire: async () => ({
|
||||
sftpId: "dead-session",
|
||||
discard: () => { discarded += 1; },
|
||||
release: () => { released += 1; },
|
||||
}),
|
||||
shouldDiscard: () => true,
|
||||
run: async () => { throw new Error("session closed"); },
|
||||
}), /session closed/);
|
||||
assert.equal(discarded, 1);
|
||||
assert.equal(released, 0);
|
||||
});
|
||||
|
||||
test("plain file upload keeps using its preparation session", async () => {
|
||||
let acquireCalls = 0;
|
||||
const result = await runWithCompressedUploadSession({
|
||||
enabled: true,
|
||||
hasDirectory: false,
|
||||
isLocal: false,
|
||||
hostId: "host-1",
|
||||
jobId: "plain-file",
|
||||
prepSftpId: "browse-session",
|
||||
acquire: async () => {
|
||||
acquireCalls += 1;
|
||||
throw new Error("must not acquire");
|
||||
},
|
||||
shouldDiscard: () => false,
|
||||
run: async (sftpId) => sftpId,
|
||||
});
|
||||
assert.equal(result, "browse-session");
|
||||
assert.equal(acquireCalls, 0);
|
||||
assert.equal(compressedUploadRequiresDedicatedSession({
|
||||
enabled: true,
|
||||
hasDirectory: false,
|
||||
isLocal: false,
|
||||
hostId: "host-1",
|
||||
}), false);
|
||||
});
|
||||
|
||||
test("remote ends with host id require the transfer pool when available", () => {
|
||||
assert.equal(
|
||||
remoteEndpointRequiresPool({ isLocal: false, hostId: "h1", poolAvailable: true }),
|
||||
true,
|
||||
);
|
||||
assert.equal(
|
||||
remoteEndpointRequiresPool({ isLocal: true, hostId: "h1", poolAvailable: true }),
|
||||
false,
|
||||
);
|
||||
assert.equal(
|
||||
remoteEndpointRequiresPool({ isLocal: false, hostId: "h1", poolAvailable: false }),
|
||||
false,
|
||||
);
|
||||
});
|
||||
|
||||
test("resolveDedicatedStreamEndpointIds refuses silent browse fallback for required ends", () => {
|
||||
const failed = resolveDedicatedStreamEndpointIds({
|
||||
sourceIsLocal: true,
|
||||
targetIsLocal: false,
|
||||
targetHostId: "h1",
|
||||
panelTargetSftpId: "browse-1",
|
||||
poolAvailable: true,
|
||||
});
|
||||
assert.equal(failed.error, "Dedicated target transfer session unavailable");
|
||||
assert.equal(failed.targetSftpId, undefined);
|
||||
|
||||
const ok = resolveDedicatedStreamEndpointIds({
|
||||
sourceIsLocal: true,
|
||||
targetIsLocal: false,
|
||||
targetHostId: "h1",
|
||||
targetPoolSftpId: "pool-1",
|
||||
panelTargetSftpId: "browse-1",
|
||||
poolAvailable: true,
|
||||
});
|
||||
assert.equal(ok.error, undefined);
|
||||
assert.equal(ok.targetSftpId, "pool-1");
|
||||
});
|
||||
|
||||
test("resolveUploadStreamTargetSftpId never substitutes prep when pool required", () => {
|
||||
assert.deepEqual(
|
||||
resolveUploadStreamTargetSftpId({
|
||||
requirePool: true,
|
||||
poolSftpId: null,
|
||||
prepSftpId: "browse",
|
||||
}),
|
||||
{ error: "Dedicated transfer session unavailable" },
|
||||
);
|
||||
assert.deepEqual(
|
||||
resolveUploadStreamTargetSftpId({
|
||||
requirePool: true,
|
||||
poolSftpId: "pool",
|
||||
prepSftpId: "browse",
|
||||
}),
|
||||
{ sftpId: "pool" },
|
||||
);
|
||||
assert.deepEqual(
|
||||
resolveUploadStreamTargetSftpId({
|
||||
requirePool: false,
|
||||
prepSftpId: "browse",
|
||||
}),
|
||||
{ sftpId: "browse" },
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user