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  }