github.com/hazelops/ize@v1.1.12-0.20230915191306-97d7c0e48f11/tests/e2e/util.go (about) 1 package test 2 3 import ( 4 "bytes" 5 "fmt" 6 "github.com/Netflix/go-expect" 7 "os" 8 "os/exec" 9 "strings" 10 "testing" 11 ) 12 13 var ( 14 izeBinary = GetFromEnv("IZE_BINARY", "ize") 15 examplesRootDir = GetFromEnv("IZE_EXAMPLES_PATH", "") 16 ) 17 18 // A struct representation of the IZE binary 19 type binary struct { 20 t *testing.T 21 binaryPath string 22 workingDir string 23 } 24 25 func NewBinary(t *testing.T, binaryPath string, workingDir string) *binary { 26 return &binary{ 27 t: t, 28 binaryPath: binaryPath, 29 workingDir: workingDir, 30 } 31 } 32 33 func GetFromEnv(key string, defaultValue string) string { 34 result := os.Getenv(key) 35 if result == "" { 36 result = defaultValue 37 } 38 return result 39 } 40 41 // Runs a command with the arguments specified 42 func (b *binary) RunRaw(args ...string) (stdout, stderr string, err error) { 43 cmd := b.NewCmd(args...) 44 cmd.Stdin = nil 45 cmd.Stdout = &bytes.Buffer{} 46 cmd.Stderr = &bytes.Buffer{} 47 err = cmd.Run() 48 stdout = cmd.Stdout.(*bytes.Buffer).String() 49 stderr = cmd.Stderr.(*bytes.Buffer).String() 50 return 51 } 52 53 // Runs a command with the arguments specified in pty 54 func (b *binary) RunPty(args ...string) (stdout, stderr string, err error) { 55 cmd := b.NewCmd(args...) 56 out := &bytes.Buffer{} 57 console, err := expect.NewConsole(expect.WithStdin(os.Stdin), expect.WithStdout(out)) 58 if err != nil { 59 return "", "", err 60 } 61 62 cmd.Stdin = console.Tty() 63 cmd.Stdout = console.Tty() 64 cmd.Stderr = console.Tty() 65 66 go func() { 67 console.ExpectEOF() 68 }() 69 err = cmd.Start() 70 err = cmd.Wait() 71 stdout = out.String() 72 return 73 } 74 75 // Builds a generic execer for running waypoint commands 76 func (b *binary) NewCmd(args ...string) *exec.Cmd { 77 cmd := exec.Command(b.binaryPath, args...) 78 cmd.Dir = b.workingDir 79 cmd.Env = os.Environ() 80 81 return cmd 82 } 83 84 // Runs the command, fails the test on errors 85 func (b *binary) Run(args string) (stdout string) { 86 fmt.Printf("running %s ...\n", args) 87 stdout, stderr, err := b.RunRaw(splitArgs(args)...) 88 if err != nil { 89 b.t.Fatalf("unexpected error running %q inside %q\nERROR:\n%s\n\nSTDERR:\n%s\n\nSTDOUT:\n%s", args, b.workingDir, err, stderr, stdout) 90 } 91 if stderr != "" { 92 b.t.Fatalf("unexpected stderr output running %s:\n%s", args, stderr) 93 } 94 return stdout 95 } 96 97 func splitArgs(args string) []string { 98 return strings.Split(args, " ") 99 } 100 101 func recovery(t *testing.T) { 102 if panicMsg := recover(); panicMsg != nil { 103 t.Errorf("panic message: %s\n", panicMsg) 104 } 105 }