package command import ( "os" "path/filepath" "strings" "testing" ) const fakeSudo = `#!/bin/sh "$@" -qptest` const fakeUtil = `#!/bin/sh echo "$@" if [ "$4" = "-qptest" ]; then exit 0; else exit 1; fi` func setupExecTestEnv(t *testing.T) (string, string) { t.Helper() tmpDir := t.TempDir() fakeSudoPath := filepath.Join(tmpDir, "sudo") fakeUtilPath := filepath.Join(tmpDir, "util") if err := os.WriteFile(fakeSudoPath, []byte(fakeSudo), 0755); err != nil { t.Fatalf("failed to write fake sudo stub: %s", err.Error()) } if err := os.WriteFile(fakeUtilPath, []byte(fakeUtil), 0755); err != nil { t.Fatalf("failed to write fake util stub: %s", err.Error()) } t.Setenv("PATH", tmpDir+":"+os.Getenv("PATH")) return fakeSudoPath, fakeUtilPath } func TestExecAndLogSudo(t *testing.T) { _, fakeUtilPath := setupExecTestEnv(t) args := []string{"i am a string with spaces", "i came to ruin parsers and chew bubble gum", "and I'm all out of bubblegum."} t.Run("is_not_root", func(t *testing.T) { if err := ExecAndLogSudo(false, false, "util", args...); err != nil { t.Errorf("unexpected error: %s", err.Error()) } }) t.Run("is_root", func(t *testing.T) { newFakeUtil := strings.Replace(fakeUtil, "exit 1", "exit 0", 1) newFakeUtil = strings.Replace(newFakeUtil, "exit 0", "exit 1", 1) if err := os.WriteFile(fakeUtilPath, []byte(newFakeUtil), 0755); err != nil { t.Fatalf("failed to overwrite fake util with modified stub: %s", err.Error()) } if err := ExecAndLogSudo(false, false, "util", args...); err == nil { t.Errorf("expected error when using modified util with sudo, got nil") } if err := ExecAndLogSudo(true, true, "util", args...); err != nil { t.Errorf("unexpected error: %s", err.Error()) } }) }