From 3d715c8b89516b84729ad389e8c5008efede49b6 Mon Sep 17 00:00:00 2001 From: sudacode Date: Thu, 9 Jul 2026 22:39:26 -0700 Subject: [PATCH] test(launcher): stabilize SSH resolver coverage --- launcher/sync/ssh.test.ts | 42 +++++++++++++++------------------------ launcher/sync/ssh.ts | 8 ++++++-- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/launcher/sync/ssh.test.ts b/launcher/sync/ssh.test.ts index 20e5cdeb..af2355eb 100644 --- a/launcher/sync/ssh.test.ts +++ b/launcher/sync/ssh.test.ts @@ -1,8 +1,5 @@ import test from 'node:test'; import assert from 'node:assert/strict'; -import fs from 'node:fs'; -import os from 'node:os'; -import path from 'node:path'; import { assertSafeSshHost, resolveRemoteSubminerCommand, runScp, shellQuote } from './ssh.js'; test('assertSafeSshHost rejects option-like hosts', () => { @@ -34,28 +31,21 @@ test('runScp rejects option-like remote host components', () => { }); test('resolveRemoteSubminerCommand verifies the launcher under the remote runtime PATH', () => { - const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'subminer-ssh-test-')); - const sshPath = path.join(tempDir, 'ssh'); - const originalPath = process.env.PATH; - fs.writeFileSync( - sshPath, - `#!/bin/sh -case "$2" in - *'$HOME/.local/bin'*'$HOME/.bun/bin'*'/opt/homebrew/bin'*'/usr/local/bin'*'/usr/bin'*'/bin'*'subminer --help'*) exit 0 ;; - *) exit 1 ;; -esac -`, - { mode: 0o755 }, - ); + const calls: Array<{ host: string; remoteCommand: string }> = []; + const command = resolveRemoteSubminerCommand('macbook', null, (host, remoteCommand) => { + calls.push({ host, remoteCommand }); + return { status: 0, stdout: '', stderr: '' }; + }); - try { - process.env.PATH = `${tempDir}:${originalPath ?? ''}`; - assert.equal( - resolveRemoteSubminerCommand('macbook', null), - 'PATH="$HOME/.local/bin:$HOME/.bun/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:$PATH" subminer', - ); - } finally { - process.env.PATH = originalPath; - fs.rmSync(tempDir, { recursive: true, force: true }); - } + assert.equal( + command, + 'PATH="$HOME/.local/bin:$HOME/.bun/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:$PATH" subminer', + ); + assert.deepEqual(calls, [ + { + host: 'macbook', + remoteCommand: + 'PATH="$HOME/.local/bin:$HOME/.bun/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:$PATH" subminer --help >/dev/null 2>&1', + }, + ]); }); diff --git a/launcher/sync/ssh.ts b/launcher/sync/ssh.ts index c9d5b482..220a4a6c 100644 --- a/launcher/sync/ssh.ts +++ b/launcher/sync/ssh.ts @@ -78,7 +78,11 @@ const REMOTE_RUNTIME_PATH = * Non-interactive SSH shells often miss user-installed launchers and Bun. * Probe the launcher under the same deterministic PATH used by sync itself. */ -export function resolveRemoteSubminerCommand(host: string, preferred: string | null): string { +export function resolveRemoteSubminerCommand( + host: string, + preferred: string | null, + runRemote: typeof runSsh = runSsh, +): string { // Trusted defaults stay unquoted so the remote shell expands `~`; a // user-supplied override is shell-quoted to prevent command injection. const candidates: Array<{ value: string; invocation: string }> = preferred @@ -89,7 +93,7 @@ export function resolveRemoteSubminerCommand(host: string, preferred: string | n ]; for (const candidate of candidates) { const command = `${REMOTE_RUNTIME_PATH} ${candidate.invocation}`; - const probe = runSsh(host, `${command} --help >/dev/null 2>&1`); + const probe = runRemote(host, `${command} --help >/dev/null 2>&1`); if (probe.status === 0) { return command; }