github.com/taubyte/tau-cli@v0.1.13-0.20240326000942-487f0d57edfc/tests/run_test.go (about)

     1  //go:build !cover
     2  
     3  package tests
     4  
     5  import (
     6  	"bytes"
     7  	"fmt"
     8  	"os"
     9  	"os/exec"
    10  	"path"
    11  	"path/filepath"
    12  	"syscall"
    13  	"time"
    14  
    15  	"github.com/taubyte/tau-cli/constants"
    16  )
    17  
    18  func takeCover() func() {
    19  	return func() {}
    20  }
    21  
    22  func (r *roadRunner) Run(args ...string) (error, int, string, string) {
    23  	cwd, err := os.Getwd()
    24  	if err != nil {
    25  		return fmt.Errorf("getting cwd failed with: %s", err), 1, "", ""
    26  	}
    27  
    28  	_cmd := exec.Command(path.Join(cwd, "tau-cli"), args...)
    29  	_cmd.Dir, _ = filepath.Abs(r.dir)
    30  	r.env[constants.TauConfigFileNameEnvVarName] = r.configFile
    31  	r.env[constants.TauSessionLocationEnvVarName] = r.sessionFile
    32  	if r.authUrl != "" {
    33  		// All the tests run with localAuthClient tag, but if the mock tag is false
    34  		// the url is still set to the auth.taubyte.com url
    35  		r.env[constants.AuthURLEnvVarName] = r.authUrl
    36  	}
    37  
    38  	_cmd.Env = os.Environ()
    39  
    40  	for k, v := range r.env {
    41  		_cmd.Env = append(_cmd.Env, fmt.Sprintf("%s=%s", k, v))
    42  	}
    43  
    44  	// Capture command output
    45  	var out bytes.Buffer
    46  	var errOut bytes.Buffer
    47  	_cmd.Stdout = &out
    48  	_cmd.Stderr = &errOut
    49  
    50  	// Start the command
    51  	err = _cmd.Start()
    52  	if err != nil {
    53  		return fmt.Errorf("Command failed to start %s", err.Error()), 1, "", ""
    54  	}
    55  
    56  	// Kill the command after the timeout
    57  	done := make(chan bool)
    58  	go func() {
    59  		select {
    60  		case <-time.After(r.waitTime):
    61  			err = _cmd.Process.Kill()
    62  			if err != nil {
    63  				panic(err)
    64  			}
    65  		case <-done:
    66  			return
    67  		}
    68  	}()
    69  
    70  	// Wait for the command to finish
    71  	err = _cmd.Wait()
    72  	if err != nil {
    73  		exiterr := err.(*exec.ExitError)
    74  		status := exiterr.Sys().(syscall.WaitStatus)
    75  		return err, status.ExitStatus(), out.String(), errOut.String()
    76  	}
    77  	return nil, 0, out.String(), errOut.String()
    78  }