test and logic fixes
This commit is contained in:
+5
-3
@@ -34,7 +34,7 @@ func main() {
|
|||||||
From("golang:1.25").
|
From("golang:1.25").
|
||||||
WithMountedDirectory("/src", src).
|
WithMountedDirectory("/src", src).
|
||||||
WithWorkdir("/src").
|
WithWorkdir("/src").
|
||||||
WithExec([]string{"go", "build", "-o", "bootstrap_environment", "."})
|
WithExec([]string{"go", "build", "-buildvcs=false", "-o", "bootstrap_environment", "."})
|
||||||
|
|
||||||
binaryFile := builder.File("bootstrap_environment")
|
binaryFile := builder.File("bootstrap_environment")
|
||||||
|
|
||||||
@@ -105,7 +105,8 @@ func main() {
|
|||||||
fmt.Printf("[%s] Verifying package installations on PATH and running version checks...\n", target)
|
fmt.Printf("[%s] Verifying package installations on PATH and running version checks...\n", target)
|
||||||
verifyCmd := []string{
|
verifyCmd := []string{
|
||||||
"sh", "-c",
|
"sh", "-c",
|
||||||
"export PATH=$PATH:/usr/local/go/bin; " +
|
"set -e -x; " +
|
||||||
|
"export PATH=$PATH:/usr/local/go/bin:/usr/local/bin; " +
|
||||||
"which go && go version && " +
|
"which go && go version && " +
|
||||||
"which nvim && nvim --version && " +
|
"which nvim && nvim --version && " +
|
||||||
"which zig && zig version && " +
|
"which zig && zig version && " +
|
||||||
@@ -113,7 +114,8 @@ func main() {
|
|||||||
}
|
}
|
||||||
verifyOutput, err := testContainer.WithExec(verifyCmd).Stdout(ctx)
|
verifyOutput, err := testContainer.WithExec(verifyCmd).Stdout(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("verification failed on %s: package not found on PATH or exited with error (%w)", target, err)
|
// To see the stdout/stderr of the failing command, we can try to extract it from dagger's ExecError
|
||||||
|
return fmt.Errorf("verification failed on %s: %v", target, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -260,6 +260,7 @@ func TestPromptGitHubTokenAcceptThenEmpty(t *testing.T) {
|
|||||||
// password read can't be cleanly mocked.
|
// password read can't be cleanly mocked.
|
||||||
stdin = strings.NewReader("y\n")
|
stdin = strings.NewReader("y\n")
|
||||||
defer func() { stdin = os.Stdin }()
|
defer func() { stdin = os.Stdin }()
|
||||||
|
readPassword = func() ([]byte, error) { return nil, errors.New("mocked error") }
|
||||||
captureStdout(t, func() {
|
captureStdout(t, func() {
|
||||||
// term.ReadPassword on a non-terminal returns an error,
|
// term.ReadPassword on a non-terminal returns an error,
|
||||||
// landing in the "could not read token" warn branch.
|
// landing in the "could not read token" warn branch.
|
||||||
|
|||||||
@@ -229,6 +229,7 @@ func TestEnsureHomebrewInstallerFails(t *testing.T) {
|
|||||||
defer resetMocks()
|
defer resetMocks()
|
||||||
isMacOS = true
|
isMacOS = true
|
||||||
hasCmd = func(_ string) bool { return false }
|
hasCmd = func(_ string) bool { return false }
|
||||||
|
runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} }
|
||||||
runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 1} }
|
runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 1} }
|
||||||
called := false
|
called := false
|
||||||
osExit = func(_ int) { called = true }
|
osExit = func(_ int) { called = true }
|
||||||
@@ -245,6 +246,7 @@ func TestEnsureHomebrewBrewNotAtExpectedPath(t *testing.T) {
|
|||||||
isMacOS = true
|
isMacOS = true
|
||||||
archName = "x86_64"
|
archName = "x86_64"
|
||||||
hasCmd = func(_ string) bool { return false }
|
hasCmd = func(_ string) bool { return false }
|
||||||
|
runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} }
|
||||||
runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} }
|
runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} }
|
||||||
osStat = func(_ string) (os.FileInfo, error) { return nil, os.ErrNotExist }
|
osStat = func(_ string) (os.FileInfo, error) { return nil, os.ErrNotExist }
|
||||||
called := false
|
called := false
|
||||||
@@ -614,6 +616,8 @@ func TestRunMainHasErrorsExitsOne(t *testing.T) {
|
|||||||
hasCmd = func(_ string) bool { return true }
|
hasCmd = func(_ string) bool { return true }
|
||||||
runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} }
|
runCmd = func(_ []string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 0} }
|
||||||
runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 1} } // install fails
|
runShell = func(_ string, _ CmdOpts) CmdResult { return CmdResult{ExitCode: 1} } // install fails
|
||||||
|
fetchJSON = func(_ string, _ any) bool { return false }
|
||||||
|
download = func(_, dest string) bool { return true }
|
||||||
stdin = strings.NewReader("y\n")
|
stdin = strings.NewReader("y\n")
|
||||||
defer func() { stdin = os.Stdin }()
|
defer func() { stdin = os.Stdin }()
|
||||||
exitCode := -1
|
exitCode := -1
|
||||||
|
|||||||
@@ -53,10 +53,16 @@ var defaultInstallPaths = map[string]string{
|
|||||||
"zig": "/usr/local/bin/zig",
|
"zig": "/usr/local/bin/zig",
|
||||||
"nvm": "~/.nvm",
|
"nvm": "~/.nvm",
|
||||||
"pyenv": "~/.pyenv",
|
"pyenv": "~/.pyenv",
|
||||||
"neovim": "/usr/local/bin/nvim",
|
"neovim": "/usr/local/bin/nvim",
|
||||||
"oh-my-zsh": "~/.oh-my-zsh",
|
"oh-my-zsh": "~/.oh-my-zsh",
|
||||||
"agy": "~/.local/bin/agy",
|
"agy": "~/.local/bin/agy",
|
||||||
"gh-repo-bootstrap": "~/.local/share/gh/extensions/gh-repo-bootstrap",
|
"gh-repo-bootstrap": "~/.local/share/gh/extensions/gh-repo-bootstrap",
|
||||||
|
"yq": "/usr/local/bin/yq",
|
||||||
|
"rustup": "~/.cargo/bin/rustup",
|
||||||
|
"dagger": "/usr/local/bin/dagger",
|
||||||
|
"trivy": "/usr/local/bin/trivy",
|
||||||
|
"cosign": "/usr/local/bin/cosign",
|
||||||
|
"gitleaks": "/usr/local/bin/gitleaks",
|
||||||
}
|
}
|
||||||
|
|
||||||
func expandHome(p string) string {
|
func expandHome(p string) string {
|
||||||
@@ -224,10 +230,7 @@ func installFirecracker(archive, tmp string) {
|
|||||||
if strings.HasSuffix(name, ".tgz") || strings.HasSuffix(name, ".tar.gz") {
|
if strings.HasSuffix(name, ".tgz") || strings.HasSuffix(name, ".tar.gz") {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if !strings.HasPrefix(name, "firecracker") {
|
if !strings.HasPrefix(name, "firecracker-v") || strings.Contains(name, "debug") {
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if strings.HasSuffix(name, ".debug") || strings.Contains(name, "debug") {
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if binary == "" {
|
if binary == "" {
|
||||||
|
|||||||
+7
-2
@@ -1,7 +1,9 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func resetMocks() {
|
func resetMocks() {
|
||||||
@@ -20,9 +22,12 @@ func resetMocks() {
|
|||||||
osMkdirAll = os.MkdirAll
|
osMkdirAll = os.MkdirAll
|
||||||
osRemove = os.Remove
|
osRemove = os.Remove
|
||||||
osRemoveAll = os.RemoveAll
|
osRemoveAll = os.RemoveAll
|
||||||
osRename = os.Rename
|
|
||||||
osExit = os.Exit
|
osExit = os.Exit
|
||||||
stdin = os.Stdin
|
// Default to an empty reader so un-mocked tests don't hang waiting for user input.
|
||||||
|
stdin = strings.NewReader("")
|
||||||
|
readPassword = func() ([]byte, error) {
|
||||||
|
return nil, errors.New("terminal blocked in test")
|
||||||
|
}
|
||||||
|
|
||||||
// Reset global state variables to safe defaults
|
// Reset global state variables to safe defaults
|
||||||
isMacOS = false
|
isMacOS = false
|
||||||
|
|||||||
@@ -380,7 +380,14 @@ func waitForVMSSH(privKey string, timeout time.Duration) bool {
|
|||||||
fmt.Println(" VM SSH ready.")
|
fmt.Println(" VM SSH ready.")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
time.Sleep(5 * time.Second)
|
rem := time.Until(deadline)
|
||||||
|
if rem <= 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if rem > 5*time.Second {
|
||||||
|
rem = 5 * time.Second
|
||||||
|
}
|
||||||
|
time.Sleep(rem)
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -393,7 +400,14 @@ func waitForFirecrackerInVM(privKey string, timeout time.Duration) bool {
|
|||||||
fmt.Println(" firecracker is installed inside the VM.")
|
fmt.Println(" firecracker is installed inside the VM.")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
time.Sleep(10 * time.Second)
|
rem := time.Until(deadline)
|
||||||
|
if rem <= 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if rem > 10*time.Second {
|
||||||
|
rem = 10 * time.Second
|
||||||
|
}
|
||||||
|
time.Sleep(rem)
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,6 +179,10 @@ func runMain(args []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var readPassword = func() ([]byte, error) {
|
||||||
|
return term.ReadPassword(int(os.Stdin.Fd()))
|
||||||
|
}
|
||||||
|
|
||||||
// promptGitHubToken asks the user if they want to supply a GitHub token
|
// promptGitHubToken asks the user if they want to supply a GitHub token
|
||||||
// after they've authenticated sudo. With a token, our HTTP-bound worker
|
// after they've authenticated sudo. With a token, our HTTP-bound worker
|
||||||
// pool uncaps from the conservative 8-worker default up to runtime.NumCPU(),
|
// pool uncaps from the conservative 8-worker default up to runtime.NumCPU(),
|
||||||
@@ -196,7 +200,7 @@ func promptGitHubToken() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Print(" Paste token (input hidden): ")
|
fmt.Print(" Paste token (input hidden): ")
|
||||||
tokenBytes, err := term.ReadPassword(int(os.Stdin.Fd()))
|
tokenBytes, err := readPassword()
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
warn(fmt.Sprintf("could not read token: %v — continuing without uncap", err))
|
warn(fmt.Sprintf("could not read token: %v — continuing without uncap", err))
|
||||||
|
|||||||
+1
-1
@@ -170,7 +170,7 @@ func customPackages() []CustomPackage {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "trivy",
|
Name: "trivy",
|
||||||
Version: "0.52.0",
|
Version: "0.70.0",
|
||||||
URLTemplate: "https://github.com/aquasecurity/trivy/releases/download/v{version}/trivy_{version}_{os_trivy}-{arch_trivy}.tar.gz",
|
URLTemplate: "https://github.com/aquasecurity/trivy/releases/download/v{version}/trivy_{version}_{os_trivy}-{arch_trivy}.tar.gz",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
+4
-4
@@ -85,11 +85,11 @@ func TestResolveSystemPkgs(t *testing.T) {
|
|||||||
t.Errorf("expected skipped to be [docker-compose], got %v", skipped)
|
t.Errorf("expected skipped to be [docker-compose], got %v", skipped)
|
||||||
}
|
}
|
||||||
|
|
||||||
// brew: bashtop -> btop (replace), buildah -> skipped
|
// brew: buildah -> skipped
|
||||||
pkgMgr = "brew"
|
pkgMgr = "brew"
|
||||||
resolved, skipped = resolveSystemPkgs([]string{"bashtop", "buildah", "rg"})
|
resolved, skipped = resolveSystemPkgs([]string{"buildah", "rg"})
|
||||||
if len(resolved) != 2 || resolved[0] != "btop" || resolved[1] != "ripgrep" {
|
if len(resolved) != 1 || resolved[0] != "ripgrep" {
|
||||||
t.Errorf("expected [btop ripgrep], got %v", resolved)
|
t.Errorf("expected [ripgrep], got %v", resolved)
|
||||||
}
|
}
|
||||||
// pacman: docker-ce-rootless-extras and vagrant are AUR-only -> skipped;
|
// pacman: docker-ce-rootless-extras and vagrant are AUR-only -> skipped;
|
||||||
// pipx is replaced with python-pipx.
|
// pipx is replaced with python-pipx.
|
||||||
|
|||||||
@@ -461,7 +461,7 @@ func installSystemPackages(regular, special []string) {
|
|||||||
if pkgMgr == "brew" {
|
if pkgMgr == "brew" {
|
||||||
failed := pkgInstallMany(regular)
|
failed := pkgInstallMany(regular)
|
||||||
for _, p := range failed {
|
for _, p := range failed {
|
||||||
errLog(fmt.Sprintf("System package failed to install: %s", p))
|
taskPrintf(" [WARN] System package failed to install: %s\n", p)
|
||||||
}
|
}
|
||||||
// No special packages on macOS — brew covers all of them.
|
// No special packages on macOS — brew covers all of them.
|
||||||
return
|
return
|
||||||
@@ -481,7 +481,7 @@ func installSystemPackages(regular, special []string) {
|
|||||||
|
|
||||||
failed := pkgInstallMany(regular)
|
failed := pkgInstallMany(regular)
|
||||||
for _, p := range failed {
|
for _, p := range failed {
|
||||||
errLog(fmt.Sprintf("System package failed to install: %s", p))
|
taskPrintf(" [WARN] System package failed to install: %s\n", p)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(special) > 0 {
|
if len(special) > 0 {
|
||||||
|
|||||||
+2
-11
@@ -377,9 +377,7 @@ func TestSystemGoEdgeCases(t *testing.T) {
|
|||||||
}
|
}
|
||||||
hasCmd = func(name string) bool { return true }
|
hasCmd = func(name string) bool { return true }
|
||||||
|
|
||||||
if !isSpecialPkgInstalled("bashtop") {
|
|
||||||
t.Error("expected bashtop to be installed")
|
|
||||||
}
|
|
||||||
if !isSpecialPkgInstalled("pulumi") {
|
if !isSpecialPkgInstalled("pulumi") {
|
||||||
t.Error("expected pulumi to be installed")
|
t.Error("expected pulumi to be installed")
|
||||||
}
|
}
|
||||||
@@ -445,14 +443,7 @@ func TestSystemGoEdgeCases(t *testing.T) {
|
|||||||
fetchText = func(url string) string { return "mismatch-checksum minikube" }
|
fetchText = func(url string) string { return "mismatch-checksum minikube" }
|
||||||
installSpecialPkg("minikube", "/tmp")
|
installSpecialPkg("minikube", "/tmp")
|
||||||
|
|
||||||
resetMocks()
|
|
||||||
osStat = func(name string) (os.FileInfo, error) {
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
runCmd = func(argv []string, opts CmdOpts) CmdResult {
|
|
||||||
return CmdResult{ExitCode: 1}
|
|
||||||
}
|
|
||||||
installSpecialPkg("bashtop", "/tmp")
|
|
||||||
|
|
||||||
resetMocks()
|
resetMocks()
|
||||||
fetchText = func(url string) string { return "some-sha pulumi-v3.90.0-linux-x64.tar.gz" }
|
fetchText = func(url string) string { return "some-sha pulumi-v3.90.0-linux-x64.tar.gz" }
|
||||||
|
|||||||
Reference in New Issue
Block a user