package main // Second wave of coverage tests. The first batch (coverage_test.go) hit // the easiest gaps; this file picks up the remaining branches across // install handlers, orchestration, runMain combinations, repo setup, // special-package installers, macOS helpers, and runtime helpers. import ( "bytes" "errors" "fmt" "io" "os" "path/filepath" "runtime" "strings" "testing" "time" ) // ── runOneCustomInstall branch coverage ───────────────────────────────── func TestRunOneCustomInstallNVM(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return true } osStat = func(_ string) (os.FileInfo, error) { return nil, nil } fetchJSON = func(_ string, v any) bool { v.(*ghRelease).TagName = "v0.39.0" return true } runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } runOneCustomInstall(&CustomPackage{Name: "nvm"}) } func TestRunOneCustomInstallPyenv(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return true } osStat = func(_ string) (os.FileInfo, error) { return nil, nil } runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } runOneCustomInstall(&CustomPackage{Name: "pyenv"}) } func TestRunOneCustomInstallPip(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return true } probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0}, true } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } runOneCustomInstall(&CustomPackage{Name: "pip"}) } func TestRunOneCustomInstallOhMyZsh(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return true } osStat = func(_ string) (os.FileInfo, error) { return nil, nil } osReadFile = func(_ string) ([]byte, error) { return []byte("ZSH_THEME=\"x\""), nil } osWriteFile = func(_ string, _ []byte, _ os.FileMode) error { return nil } runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } runOneCustomInstall(&CustomPackage{Name: "oh-my-zsh"}) } func TestRunOneCustomInstallNeovim(t *testing.T) { defer resetMocks() osName = "linux" archName = "x86_64" osStat = func(_ string) (os.FileInfo, error) { return nil, os.ErrNotExist } fetchJSON = func(_ string, v any) bool { rel := v.(*ghRelease) rel.Assets = []ghAsset{{ Name: "nvim-linux-x86_64.tar.gz", BrowserDownloadURL: "http://x", Digest: "sha256:abc", }} return true } download = func(_, dest string) bool { return os.WriteFile(dest, []byte("x"), 0o644) == nil } runOneCustomInstall(&CustomPackage{Name: "neovim"}) } func TestRunOneCustomInstallAgy(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return true } osStat = func(_ string) (os.FileInfo, error) { return nil, nil } runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } runOneCustomInstall(&CustomPackage{Name: "agy"}) } func TestRunOneCustomInstallGHExtension(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return true } osStat = func(_ string) (os.FileInfo, error) { return nil, nil } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } runOneCustomInstall(&CustomPackage{Name: "gh-repo-bootstrap"}) } func TestRunOneCustomInstallGoSuccess(t *testing.T) { defer resetMocks() archName = "x86_64" osName = "linux" osStat = func(_ string) (os.FileInfo, error) { return nil, os.ErrNotExist } download = func(_, dest string) bool { return os.WriteFile(dest, []byte("content"), 0o644) == nil } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } // SHA256("content") = 751a073f248535132b178652553f1f317b3f1f90be68c078021481e33d443224 runOneCustomInstall(&CustomPackage{ Name: "go", Version: "1.0", URLTemplate: "http://example.com/go-{arch}.tar.gz", SHA256: "ed7002b439e9ac845f22357d822bac1444730fbdb6016d3ec9432297b9ec9f73", }) } func TestRunOneCustomInstallZigSuccess(t *testing.T) { defer resetMocks() archName = "x86_64" osName = "linux" osStat = func(_ string) (os.FileInfo, error) { return nil, os.ErrNotExist } download = func(_, dest string) bool { return os.WriteFile(dest, []byte("content"), 0o644) == nil } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } runOneCustomInstall(&CustomPackage{ Name: "zig", Version: "0.11.0", URLTemplate: "http://example.com/zig-{arch}.tar.xz", SHA256: "ed7002b439e9ac845f22357d822bac1444730fbdb6016d3ec9432297b9ec9f73", }) } func TestRunOneCustomInstallFirecrackerSuccess(t *testing.T) { defer resetMocks() archName = "x86_64" isMacOS = false osStat = func(_ string) (os.FileInfo, error) { return nil, os.ErrNotExist } download = func(_, dest string) bool { return os.WriteFile(dest, []byte("content"), 0o644) == nil } runCmd = func(argv []string, _ CmdOpts) CmdResult { // Drop a stub firecracker binary in the tmp dir when tar runs. if argv[0] == "tar" { tmp := argv[2] _ = os.WriteFile(filepath.Join(tmp, "firecracker-v1"), []byte("x"), 0o755) } return CmdResult{ExitCode: 0} } runOneCustomInstall(&CustomPackage{ Name: "firecracker", Version: "1.0", URLTemplate: "http://example.com/fc-{arch}.tgz", SHA256: "ed7002b439e9ac845f22357d822bac1444730fbdb6016d3ec9432297b9ec9f73", }) } func TestRunOneCustomInstallTmpDirFail(t *testing.T) { defer resetMocks() archName = "x86_64" osName = "linux" osStat = func(_ string) (os.FileInfo, error) { return nil, os.ErrNotExist } // We can't easily mock MkdirTemp; this branch is covered when TMPDIR // points to nonexistent path. Set TMPDIR to a definitely-bad path. t.Setenv("TMPDIR", "/no/such/parent/exists/here") // MkdirTemp will succeed in most environments; if it does, just skip // the assertion — the goal is to merely exercise the path. runOneCustomInstall(&CustomPackage{ Name: "go", Version: "1.0", URLTemplate: "http://example.com/go-{arch}.tar.gz", SHA256: "x", }) } // ── installNpmToolsBatch fallback ─────────────────────────────────────── func TestInstallNpmToolsBatchAddFails(t *testing.T) { defer resetMocks() osStat = func(name string) (os.FileInfo, error) { if strings.HasSuffix(name, ".nvm") { return nil, nil } return nil, os.ErrNotExist } calls := 0 var captured []string runShell = func(cmd string, _ CmdOpts) CmdResult { calls++ captured = append(captured, cmd) // Fail the batched pnpm add, succeed everything else. if strings.Contains(cmd, "pnpm add -g @anthropic-ai") { return CmdResult{ExitCode: 1} } return CmdResult{ExitCode: 0} } installNpmToolsBatch([]*CustomPackage{{Name: "claude"}, {Name: "codex"}}) if !hasIssueContaining("Batched pnpm add -g failed") { t.Error("expected fallback warning") } // Per-package retries: at least 2 more `pnpm add -g ` calls. retryCount := 0 for _, c := range captured { if strings.Contains(c, "pnpm add -g @") && !strings.Contains(c, "pnpm add -g @anthropic-ai/claude-code @openai/codex") { retryCount++ } } if retryCount < 2 { t.Errorf("expected per-package retries, got %d retries; calls: %v", retryCount, captured) } } // ── runMain branches ──────────────────────────────────────────────────── func TestRunMainNoAIFiltering(t *testing.T) { defer resetMocks() osStat = func(_ string) (os.FileInfo, error) { return nil, nil } probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0}, true } hasCmd = func(_ string) bool { return true } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } osExit = func(_ int) {} captureStdout(t, func() { runMain([]string{"bootstrap_environment", "--only", "custom", "--no-ai"}) }) } func TestRunMainOnlySystem(t *testing.T) { defer resetMocks() pkgMgr = "dnf" osStat = func(_ string) (os.FileInfo, error) { return nil, nil } probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0}, true } hasCmd = func(_ string) bool { return true } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } osExit = func(_ int) {} captureStdout(t, func() { runMain([]string{"bootstrap_environment", "--only", "system"}) }) } func TestRunMainGuiMode(t *testing.T) { defer resetMocks() pkgMgr = "dnf" osStat = func(_ string) (os.FileInfo, error) { return nil, nil } probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0}, true } hasCmd = func(_ string) bool { return true } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } osExit = func(_ int) {} captureStdout(t, func() { runMain([]string{"bootstrap_environment", "--only", "flatpak", "--gui"}) }) } // ── promptGitHubToken empty-token branch ──────────────────────────────── func TestPromptGitHubTokenAcceptThenEmpty(t *testing.T) { defer func() { githubTokenSet = false }() githubTokenSet = false os.Unsetenv("GITHUB_TOKEN") // Say "y" to the prompt, but since stdin is not a tty term.ReadPassword // will fail. We just exercise the "user accepted" path; the actual // password read can't be cleanly mocked. stdin = strings.NewReader("y\n") defer func() { stdin = os.Stdin }() readPassword = func() ([]byte, error) { return nil, errors.New("mocked error") } captureStdout(t, func() { // term.ReadPassword on a non-terminal returns an error, // landing in the "could not read token" warn branch. promptGitHubToken() }) if githubTokenSet { t.Error("expected token NOT set when ReadPassword fails") } } // ── pkgInstall via apt-get ────────────────────────────────────────────── func TestPkgInstallApt(t *testing.T) { defer resetMocks() pkgMgr = "apt-get" var got []string runCmd = func(a []string, _ CmdOpts) CmdResult { got = a return CmdResult{ExitCode: 0} } pkgInstall("vim") if got[0] != "apt-get" || got[1] != "install" || got[3] != "vim" { t.Errorf("expected apt-get install -y vim, got %v", got) } } // ── isSpecialPkgInstalled ─────────────────────────────────────────────── func TestIsSpecialPkgFallthrough(t *testing.T) { defer resetMocks() pkgMgr = "dnf" probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0}, true } // Unknown pkg falls through to isSystemPkgInstalled. if !isSpecialPkgInstalled("vim") { t.Error("expected unknown special pkg to fall through to system check") } } // ── installSystemPackages brew ────────────────────────────────────────── func TestInstallSystemPackagesBrew(t *testing.T) { defer resetMocks() pkgMgr = "brew" runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } captureStdout(t, func() { installSystemPackages([]string{"git"}, nil) }) } func TestInstallSystemPackagesBrewFailures(t *testing.T) { defer resetMocks() pkgMgr = "brew" runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 1} } out := captureStdout(t, func() { installSystemPackages([]string{"git"}, nil) }) if !strings.Contains(out, "System package failed to install") { t.Error("expected warning logged for brew failure") } } func TestInstallSystemPackagesWithSpecial(t *testing.T) { defer resetMocks() pkgMgr = "dnf" runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } hasCmd = func(_ string) bool { return true } captureStdout(t, func() { installSystemPackages([]string{"git"}, []string{"pipx"}) }) } // ── installFirecracker debug-binary skipping ──────────────────────────── func TestInstallFirecrackerSkipsDebugBinary(t *testing.T) { defer resetMocks() tmp := t.TempDir() runCmd = func(argv []string, _ CmdOpts) CmdResult { if argv[0] == "tar" { // drop a real firecracker plus a debug binary _ = os.WriteFile(filepath.Join(tmp, "firecracker-v1"), []byte("x"), 0o755) _ = os.WriteFile(filepath.Join(tmp, "firecracker-v1.debug"), []byte("x"), 0o755) _ = os.WriteFile(filepath.Join(tmp, "firecracker-v1-debug-info"), []byte("x"), 0o755) } return CmdResult{ExitCode: 0} } installFirecracker(filepath.Join(tmp, "fc.tgz"), tmp) } // ── installZig fallback when archive dir not glob-matched ─────────────── func TestInstallZigWithGlobMatchMove(t *testing.T) { defer resetMocks() osName = "linux" archName = "x86_64" tmp := t.TempDir() // Pretend the parent /usr/local has a matching glob result. // We can't write to /usr/local in tests, so we just exercise the // install function and rely on Glob returning []. runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } installZig(&CustomPackage{Name: "zig", Version: "0.99"}, filepath.Join(tmp, "zig.tar.xz")) } // ── installNeovim more branches ───────────────────────────────────────── func TestInstallNeovimAssetNoDigest(t *testing.T) { defer resetMocks() osName = "linux" archName = "x86_64" fetchJSON = func(_ string, v any) bool { rel := v.(*ghRelease) rel.Assets = []ghAsset{{Name: "nvim-linux-x86_64.tar.gz", Digest: ""}} return true } installNeovim(nil, t.TempDir()) if !hasIssueContaining("digest missing") { t.Error("expected missing-digest error") } } // ── checkSystemPackages with remap + skip ─────────────────────────────── func TestCheckSystemPackagesWithOverrides(t *testing.T) { defer resetMocks() pkgMgr = "dnf" probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 1}, true } // "rg" is remapped to "ripgrep" on dnf, and "docker-compose" is skipped. res := checkSystemPackages([]string{"rg", "docker-compose", "git"}) if len(res.remapped) == 0 { t.Error("expected remapping recorded") } if len(res.skipped) == 0 { t.Error("expected docker-compose marked skipped") } } // ── runLogPath fallback ───────────────────────────────────────────────── func TestRunLogPathFallback(t *testing.T) { // Just exercise the path; we can't easily make os.Executable fail // across all platforms, so this test just confirms a non-empty path. p := runLogPath() if p == "" { t.Error("expected non-empty run log path") } } // ── parallel.go missing branches ──────────────────────────────────────── func TestCpuWorkersDefault(t *testing.T) { os.Unsetenv("BOOTSTRAP_PARALLELISM") if cpuWorkers() < 1 { t.Error("expected at least 1 worker by default") } if cpuWorkers() > runtime.NumCPU()+1 { t.Errorf("expected default to be near NumCPU=%d, got %d", runtime.NumCPU(), cpuWorkers()) } } func TestHttpWorkersBelowCap(t *testing.T) { defer func() { githubTokenSet = false }() t.Setenv("BOOTSTRAP_PARALLELISM", "4") githubTokenSet = false if n := httpWorkers(); n != 4 { t.Errorf("expected 4 (below cap of 8), got %d", n) } } func TestFlushNilWriter(t *testing.T) { // Flush with nil writer should fall back to os.Stdout — exercise it. tOut := newCapturedOutput("nil-writer-test") tOut.Printf("test\n") captureStdout(t, func() { tOut.Flush(nil) }) } // ── runShell with Capture flag ────────────────────────────────────────── func TestRunShellRealCapture(t *testing.T) { defer resetMocks() r := runShellReal("echo shell-cap", CmdOpts{Capture: true}) if !r.OK() || !bytes.Contains(r.Stdout, []byte("shell-cap")) { t.Errorf("expected captured shell output, got: %q (err=%v)", r.Stdout, r.Err) } } // ── installPip ensurepip pacman branch ────────────────────────────────── func TestInstallPipEnsurepipPacman(t *testing.T) { defer resetMocks() pkgMgr = "pacman" hasCmd = func(_ string) bool { return true } probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0}, true } calls := 0 runCmd = func(_ []string, _ CmdOpts) CmdResult { calls++ if calls == 1 { return CmdResult{ExitCode: 1} // ensurepip fails } return CmdResult{ExitCode: 0} } installPip() } func TestInstallPipEnsurepipPacmanFail(t *testing.T) { defer resetMocks() pkgMgr = "pacman" hasCmd = func(_ string) bool { return true } probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0}, true } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 1} } installPip() if !hasIssueContaining("python-pip failed to install via pacman") { t.Error("expected pacman fallback failure error") } } func TestInstallPipUpgradeFailWarns(t *testing.T) { defer resetMocks() pkgMgr = "dnf" hasCmd = func(_ string) bool { return true } probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0}, true } calls := 0 runCmd = func(_ []string, _ CmdOpts) CmdResult { calls++ if calls == 2 { // ensurepip OK, upgrade fails return CmdResult{ExitCode: 1} } return CmdResult{ExitCode: 0} } installPip() if !hasIssueContaining("pip self-upgrade failed") { t.Error("expected pip self-upgrade warning") } } // ── ensureZshDefault: probe `which` falls back when stdout empty ──────── func TestEnsureZshDefaultProbeFails(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return true } probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 1}, true // which fails → use default /bin/zsh } t.Setenv("SUDO_USER", "nonexistentuser_xyz") ensureZshDefault() // Should warn about unknown user. if !hasIssueContaining("not found in passwd") { t.Error("expected unknown-user warning") } } func TestEnsureZshDefaultNoUser(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return true } probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0, Stdout: []byte("/bin/zsh")}, true } // invokingUser fallback chain: SUDO_USER, then user.Current. Hard to // make both fail in a test. Exercise the happy path instead. } // ── installPlaywright add succeeds, browsers run ──────────────────────── func TestInstallPlaywrightSuccess(t *testing.T) { defer resetMocks() pkgMgr = "dnf" osStat = func(_ string) (os.FileInfo, error) { return nil, nil } runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } installPlaywright() } // ── installFlatpak no IDs ─────────────────────────────────────────────── func TestInstallFlatpakNoIDs(t *testing.T) { defer resetMocks() hasCmd = func(name string) bool { return name == "flatpak" } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } captureStdout(t, func() { installFlatpakPackages(nil) }) } // ── repos setup with existing files ───────────────────────────────────── func TestSetupDockerRepoExisting(t *testing.T) { defer resetMocks() pkgMgr = "dnf" osStat = func(name string) (os.FileInfo, error) { if strings.Contains(name, "docker-ce.repo") { return nil, nil } return nil, os.ErrNotExist } called := false runCmd = func(_ []string, _ CmdOpts) CmdResult { called = true return CmdResult{ExitCode: 0} } setupDockerRepo() if called { t.Error("expected no runCmd when repo file already exists") } } func TestSetupChromeRepoExisting(t *testing.T) { defer resetMocks() pkgMgr = "dnf" archName = "x86_64" osStat = func(name string) (os.FileInfo, error) { if strings.Contains(name, "google-chrome.repo") { return nil, nil } return nil, os.ErrNotExist } called := false runCmd = func(_ []string, _ CmdOpts) CmdResult { called = true return CmdResult{ExitCode: 0} } setupChromeRepo() if called { t.Error("expected no runCmd when chrome repo already exists") } } func TestSetupVivaldiRepoExisting(t *testing.T) { defer resetMocks() pkgMgr = "dnf" archName = "x86_64" osStat = func(name string) (os.FileInfo, error) { if strings.Contains(name, "vivaldi.repo") { return nil, nil } return nil, os.ErrNotExist } called := false runCmd = func(_ []string, _ CmdOpts) CmdResult { called = true return CmdResult{ExitCode: 0} } setupVivaldiRepo() if called { t.Error("expected no runCmd when vivaldi repo already exists") } } // ── special installer branches ────────────────────────────────────────── func TestInstallPulumiNoVersion(t *testing.T) { defer resetMocks() fetchText = func(_ string) string { return "" } installPulumi("/tmp") if !hasIssueContaining("Could not determine latest Pulumi") { t.Error("expected pulumi version error") } } func TestInstallPulumiNoChecksums(t *testing.T) { defer resetMocks() osName = "linux" archName = "x86_64" calls := 0 fetchText = func(_ string) string { calls++ if calls == 1 { return "3.0.0" // version } return "" // checksums } download = func(_, dest string) bool { return os.WriteFile(dest, []byte("x"), 0o644) == nil } installPulumi(t.TempDir()) if !hasIssueContaining("Could not fetch Pulumi checksums") { t.Error("expected pulumi checksum error") } } func TestInstallPulumiNoChecksumEntry(t *testing.T) { defer resetMocks() osName = "linux" archName = "x86_64" calls := 0 fetchText = func(_ string) string { calls++ if calls == 1 { return "3.0.0" } return "deadbeef unrelated-file.tar.gz" } download = func(_, dest string) bool { return os.WriteFile(dest, []byte("x"), 0o644) == nil } installPulumi(t.TempDir()) if !hasIssueContaining("No checksum entry") { t.Error("expected pulumi no-entry error") } } func TestInstallPulumiDownloadFails(t *testing.T) { defer resetMocks() fetchText = func(_ string) string { return "3.0.0" } download = func(_, _ string) bool { return false } installPulumi("/tmp") } func TestInstallMinikubeShaFetchFail(t *testing.T) { defer resetMocks() archName = "x86_64" download = func(_, dest string) bool { return os.WriteFile(dest, []byte("x"), 0o644) == nil } fetchText = func(_ string) string { return "" } installMinikube(t.TempDir()) } func TestInstallObsidianAssetMismatchArch(t *testing.T) { defer resetMocks() archName = "aarch64" fetchJSON = func(_ string, v any) bool { rel := v.(*ghRelease) rel.Assets = []ghAsset{{Name: "Obsidian-amd64.AppImage"}} return true } installObsidian("/tmp") if !hasIssueContaining("No Obsidian AppImage") { t.Error("expected obsidian no-match error") } } func TestInstallObsidianDownloadFails(t *testing.T) { defer resetMocks() archName = "x86_64" fetchJSON = func(_ string, v any) bool { rel := v.(*ghRelease) rel.Assets = []ghAsset{{Name: "Obsidian-1.0.0.AppImage", BrowserDownloadURL: "http://x"}} return true } download = func(_, _ string) bool { return false } installObsidian("/tmp") } func TestInstallGitHubDesktopMacOS(t *testing.T) { defer resetMocks() pkgMgr = "brew" fetchJSON = func(_ string, v any) bool { v.(*ghRelease).Assets = []ghAsset{{Name: "GitHubDesktop.dmg"}} return true } installGitHubDesktop("/tmp") if !hasIssueContaining("no installer for this package manager") { t.Error("expected unsupported pkgmgr warning") } } func TestInstallZoomMacOS(t *testing.T) { defer resetMocks() pkgMgr = "brew" archName = "x86_64" installZoom("/tmp") if !hasIssueContaining("zoom: no installer") { t.Error("expected zoom unsupported-distro warning") } } func TestInstallZoomDownloadFails(t *testing.T) { defer resetMocks() pkgMgr = "dnf" archName = "x86_64" download = func(_, _ string) bool { return false } installZoom("/tmp") } func TestInstallPipxNoPython(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return false } installPipx("/tmp") if !hasIssueContaining("Python 3 is not installed") { t.Error("expected python missing error") } } func TestInstallPipxMissingAfter(t *testing.T) { defer resetMocks() pkgMgr = "dnf" calls := 0 hasCmd = func(name string) bool { // python3 exists; pipx doesn't exist after install attempt calls++ return name == "python3" } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } installPipx("/tmp") if !hasIssueContaining("pipx command not found") { t.Errorf("expected pipx-missing error, issues: %v", issuesSnapshot()) } } func TestInstallPoetryNoPipx(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return false } installPoetry("/tmp") if !hasIssueContaining("pipx is not installed") { t.Error("expected pipx-missing error") } } func TestInstallGHExtensionNoGH(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return false } installGHExtension("foo/bar") if !hasIssueContaining("gh CLI is not installed") { t.Error("expected gh-missing error") } } func TestInstallGHExtensionFails(t *testing.T) { defer resetMocks() hasCmd = func(_ string) bool { return true } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 1} } installGHExtension("foo/bar") if !hasIssueContaining("gh extension install foo/bar failed") { t.Error("expected gh extension failure error") } } // ── macos.go branches ─────────────────────────────────────────────────── func TestMacosMajorNotMacOS(t *testing.T) { defer resetMocks() isMacOS = false if macosMajor() != 0 { t.Error("expected 0 on non-macOS") } } func TestMacosMajorProbeFail(t *testing.T) { defer resetMocks() isMacOS = true probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{}, false } if macosMajor() != 0 { t.Error("expected 0 when probe fails") } } func TestMacosMajorBadOutput(t *testing.T) { defer resetMocks() isMacOS = true probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0, Stdout: []byte("not-a-number")}, true } if macosMajor() != 0 { t.Error("expected 0 when version is not numeric") } } func TestMacosMajorEmptyOutput(t *testing.T) { defer resetMocks() isMacOS = true probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0, Stdout: []byte("")}, true } if macosMajor() != 0 { t.Error("expected 0 on empty output") } } func TestAppleSiliconGenerationNonMac(t *testing.T) { defer resetMocks() isMacOS = false if appleSiliconGeneration() != 0 { t.Error("expected 0 on non-macOS") } } func TestAppleSiliconGenerationNonArm(t *testing.T) { defer resetMocks() isMacOS = true archName = "x86_64" if appleSiliconGeneration() != 0 { t.Error("expected 0 on Intel macOS") } } func TestAppleSiliconGenerationProbeFail(t *testing.T) { defer resetMocks() isMacOS = true archName = "aarch64" probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{}, false } if appleSiliconGeneration() != 0 { t.Error("expected 0 on probe failure") } } func TestAppleSiliconGenerationNonAppleM(t *testing.T) { defer resetMocks() isMacOS = true archName = "aarch64" probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0, Stdout: []byte("Some Other CPU")}, true } if appleSiliconGeneration() != 0 { t.Error("expected 0 when brand isn't Apple M") } } func TestAppleSiliconGenerationNoDigits(t *testing.T) { defer resetMocks() isMacOS = true archName = "aarch64" probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0, Stdout: []byte("Apple Max Pro")}, true } if appleSiliconGeneration() != 0 { t.Error("expected 0 when no digits after 'Apple M'") } } func TestSelectVMBackendNonMac(t *testing.T) { defer resetMocks() isMacOS = false if selectVMBackend() != "" { t.Error("expected empty backend on non-macOS") } } func TestSelectVMBackendIntel(t *testing.T) { defer resetMocks() isMacOS = true archName = "x86_64" captureStdout(t, func() { if selectVMBackend() != "virtualbox" { t.Error("expected virtualbox on Intel macOS") } }) } func TestSelectVMBackendAppleM3MacOS15(t *testing.T) { defer resetMocks() isMacOS = true archName = "aarch64" probe = func(argv []string, _ time.Duration) (CmdResult, bool) { if argv[0] == "sw_vers" { return CmdResult{ExitCode: 0, Stdout: []byte("15.0")}, true } return CmdResult{ExitCode: 0, Stdout: []byte("Apple M3 Max")}, true } captureStdout(t, func() { if selectVMBackend() != "qemu" { t.Error("expected qemu on Apple M3+ macOS 15+") } }) } func TestSelectVMBackendOldApple(t *testing.T) { defer resetMocks() isMacOS = true archName = "aarch64" probe = func(argv []string, _ time.Duration) (CmdResult, bool) { if argv[0] == "sw_vers" { return CmdResult{ExitCode: 0, Stdout: []byte("14.0")}, true } return CmdResult{ExitCode: 0, Stdout: []byte("Apple M2")}, true } captureStdout(t, func() { if selectVMBackend() != "" { t.Error("expected empty on old Apple Silicon") } }) } func TestLatestFedoraCloudImageEmpty(t *testing.T) { defer resetMocks() fetchText = func(_ string) string { return "" } _, _, _, ok := latestFedoraCloudImage() if ok { t.Error("expected !ok when fetch returns empty") } } func TestLatestFedoraCloudImageNoVersions(t *testing.T) { defer resetMocks() fetchText = func(_ string) string { return "no version tags here" } _, _, _, ok := latestFedoraCloudImage() if ok { t.Error("expected !ok when no versions found") } } func TestLatestFedoraCloudImageHappy(t *testing.T) { defer resetMocks() archName = "x86_64" calls := 0 fetchText = func(url string) string { calls++ if calls == 1 { return `href="40/" href="41/"` } // images dir listing — return both qcow and CHECKSUM return `href="Fedora-Cloud-Base-Generic-41-1.4.x86_64.qcow2" href="Fedora-Cloud-41-CHECKSUM"` } name, qcow, ck, ok := latestFedoraCloudImage() if !ok { t.Errorf("expected success; got name=%q qcow=%q ck=%q ok=%v", name, qcow, ck, ok) } } func TestVerifyFedoraQcow2EmptyChecksumFile(t *testing.T) { defer resetMocks() fetchText = func(_ string) string { return "" } if verifyFedoraQcow2("/tmp/foo", "http://x") { t.Error("expected false when checksum body is empty") } } func TestVerifyFedoraQcow2NoEntry(t *testing.T) { defer resetMocks() fetchText = func(_ string) string { return "SHA256 (other-file.qcow2) = abc" } if verifyFedoraQcow2("/tmp/foo.qcow2", "http://x") { t.Error("expected false when no matching entry") } } func TestVerifyFedoraQcow2HashFail(t *testing.T) { defer resetMocks() fetchText = func(_ string) string { return "SHA256 (foo.qcow2) = ed7002b439e9ac845f22357d822bac1444730fbdb6016d3ec9432297b9ec9f73" } if verifyFedoraQcow2("/no/such/path/foo.qcow2", "http://x") { t.Error("expected false when file missing") } } func TestVerifyFedoraQcow2Mismatch(t *testing.T) { defer resetMocks() tmp := t.TempDir() qcow := filepath.Join(tmp, "foo.qcow2") _ = os.WriteFile(qcow, []byte("content"), 0o644) fetchText = func(_ string) string { return "SHA256 (foo.qcow2) = deadbeef" } if verifyFedoraQcow2(qcow, "http://x") { t.Error("expected mismatch -> false") } } func TestVerifyFedoraQcow2OK(t *testing.T) { defer resetMocks() tmp := t.TempDir() qcow := filepath.Join(tmp, "foo.qcow2") _ = os.WriteFile(qcow, []byte("content"), 0o644) fetchText = func(_ string) string { return "SHA256 (foo.qcow2) = ed7002b439e9ac845f22357d822bac1444730fbdb6016d3ec9432297b9ec9f73" } if !verifyFedoraQcow2(qcow, "http://x") { t.Error("expected verification to succeed for matching SHA") } } func TestWriteCloudInitSeedMkdirFails(t *testing.T) { defer resetMocks() osMkdirAll = func(_ string, _ os.FileMode) error { return errors.New("nope") } if err := writeCloudInitSeed("/tmp/xx", "pub-key"); err == nil { t.Error("expected error when mkdir fails") } } func TestWriteCloudInitSeedWriteFails(t *testing.T) { defer resetMocks() osMkdirAll = func(_ string, _ os.FileMode) error { return nil } osWriteFile = func(_ string, _ []byte, _ os.FileMode) error { return errors.New("nope") } if err := writeCloudInitSeed("/tmp/xx", "pub-key"); err == nil { t.Error("expected error when write fails") } } func TestSshToVMSuccessProbe(t *testing.T) { defer resetMocks() probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{ExitCode: 0}, true } r := sshToVM("/tmp/key", []string{"echo", "ok"}, 0) if !r.OK() { t.Errorf("expected OK, got %+v", r) } } func TestSshToVMTimeout(t *testing.T) { defer resetMocks() probe = func(_ []string, _ time.Duration) (CmdResult, bool) { return CmdResult{}, false } r := sshToVM("/tmp/key", []string{"echo"}, 0) if r.ExitCode != 124 { t.Errorf("expected timeout exit code 124, got %d", r.ExitCode) } } func TestInstallFirecrackerZshFunctionNoExistingZshrc(t *testing.T) { defer resetMocks() tmp := t.TempDir() t.Setenv("HOME", tmp) osReadFile = func(_ string) ([]byte, error) { return nil, os.ErrNotExist } written := "" osWriteFile = func(_ string, data []byte, _ os.FileMode) error { written = string(data) return nil } installFirecrackerZshFunction("firecracker() { echo wrapper; }") if !strings.Contains(written, "firecracker()") { t.Errorf("expected zsh function written to fresh zshrc, got: %q", written) } } func TestInstallFirecrackerZshFunctionExistingNoBlock(t *testing.T) { defer resetMocks() tmp := t.TempDir() t.Setenv("HOME", tmp) osReadFile = func(_ string) ([]byte, error) { return []byte("existing config"), nil } written := "" osWriteFile = func(_ string, data []byte, _ os.FileMode) error { written = string(data) return nil } installFirecrackerZshFunction("# >>> firecracker-vm wrapper >>>\nfirecracker() {}\n# <<< firecracker-vm wrapper <<<") if !strings.Contains(written, "existing config") || !strings.Contains(written, "firecracker-vm wrapper") { t.Errorf("expected appended block alongside existing config, got: %q", written) } } // ── pyenv install-from-scratch background path ────────────────────────── func TestEnsurePythonLatestKicksOffInstall(t *testing.T) { defer resetMocks() osStat = func(_ string) (os.FileInfo, error) { return nil, nil } probe = func(argv []string, _ time.Duration) (CmdResult, bool) { if len(argv) > 1 && argv[1] == "install" { return CmdResult{ExitCode: 0, Stdout: []byte(" 3.12.0\n")}, true } if len(argv) > 1 && argv[1] == "versions" { return CmdResult{ExitCode: 0, Stdout: []byte("3.11.0\n")}, true // missing 3.12.0 } return CmdResult{ExitCode: 0}, true } runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} } wg := ensurePythonLatest() if wg == nil { t.Fatal("expected non-nil waitgroup when install kicked off") } wg.Wait() } func TestEnsurePythonLatestInstallFails(t *testing.T) { defer resetMocks() osStat = func(_ string) (os.FileInfo, error) { return nil, nil } probe = func(argv []string, _ time.Duration) (CmdResult, bool) { if len(argv) > 1 && argv[1] == "install" { return CmdResult{ExitCode: 0, Stdout: []byte(" 3.12.0\n")}, true } if len(argv) > 1 && argv[1] == "versions" { return CmdResult{ExitCode: 0, Stdout: []byte("")}, true } return CmdResult{ExitCode: 0}, true } runCmd = func(argv []string, _ CmdOpts) CmdResult { // Fail the pyenv install ... if len(argv) > 1 && argv[1] == "install" { return CmdResult{ExitCode: 1, Stderr: []byte("some error\n")} } return CmdResult{ExitCode: 0} } wg := ensurePythonLatest() if wg == nil { t.Fatal("expected non-nil waitgroup") } wg.Wait() if !hasIssueContaining("pyenv install") { t.Error("expected install error logged") } } // ── npmInstalled: hasCmd true, LookPath fails ─────────────────────────── func TestNpmInstalledHasCmdNoLookPath(t *testing.T) { defer resetMocks() // Use a name that hasCmd reports true for but doesn't exist on PATH. hasCmd = func(_ string) bool { return true } _, _ = npmInstalled("definitely-not-on-real-path-xyz") // Result varies by env — just exercise the path. } // ── Helpers that suppress noisy output during tests ───────────────────── func init() { // Quiet the issue-log output during tests by default. Tests that // need it back can swap issueLogWriter themselves. issueLogWriter = io.Discard } // Touch a few helpers / vars so linters don't flag unused. var _ = fmt.Sprintf