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

     1  //go:build cover
     2  
     3  package tests
     4  
     5  import (
     6  	"fmt"
     7  	"io/ioutil"
     8  	"os"
     9  	"sync"
    10  
    11  	"github.com/pterm/pterm"
    12  	"github.com/taubyte/tau-cli/cli"
    13  	"github.com/taubyte/tau-cli/constants"
    14  	"github.com/taubyte/tau-cli/env"
    15  	authClient "github.com/taubyte/tau-cli/singletons/auth_client"
    16  	"github.com/taubyte/tau-cli/singletons/config"
    17  	"github.com/taubyte/tau-cli/singletons/session"
    18  )
    19  
    20  var coverLock sync.Mutex
    21  
    22  func takeCover() func() {
    23  	buildLock.Lock()
    24  	session.Clear()
    25  	config.Clear()
    26  	authClient.Clear()
    27  	env.Clear()
    28  	return buildLock.Unlock
    29  }
    30  
    31  func (r *roadRunner) Run(args ...string) (err error, code int, out string, errOut string) {
    32  	coverLock.Lock()
    33  	defer coverLock.Unlock()
    34  	defer func() {
    35  		// Capture panic and return err, 2, "", "" if panic
    36  		if r := recover(); r != nil {
    37  			err = fmt.Errorf("command failed with panic: %v", r)
    38  			errOut = r.(string)
    39  			code = 2
    40  			return
    41  		}
    42  	}()
    43  
    44  	r.env[constants.TauConfigFileNameEnvVarName] = r.configFile
    45  	r.env[constants.TauSessionLocationEnvVarName] = r.sessionFile
    46  	if r.authUrl != "" {
    47  		// All the tests run with localAuthClient tag, but if the mock tag is false
    48  		// the url is still set to the auth.taubyte.com url
    49  		r.env[constants.AuthURLEnvVarName] = r.authUrl
    50  	}
    51  
    52  	for key, value := range r.env {
    53  		err = os.Setenv(key, value)
    54  		if err != nil {
    55  			return
    56  		}
    57  
    58  		defer os.Unsetenv(key)
    59  	}
    60  
    61  	constants.TauConfigFileName = r.configFile
    62  
    63  	oldDir, err := os.Getwd()
    64  	if err != nil {
    65  		return
    66  	}
    67  
    68  	err = os.Chdir(r.dir)
    69  	if err != nil {
    70  		return
    71  	}
    72  	defer os.Chdir(oldDir)
    73  
    74  	rescueStdout := os.Stdout
    75  	rdr, wtr, _ := os.Pipe()
    76  	os.Stdout = wtr
    77  	pterm.SetDefaultOutput(wtr)
    78  
    79  	err = cli.Run(append([]string{"prog"}, args...)...)
    80  	if err != nil {
    81  		errOut = err.Error()
    82  		code = 1
    83  	}
    84  
    85  	// back to normal state
    86  	wtr.Close()
    87  
    88  	outB, _ := ioutil.ReadAll(rdr)
    89  	os.Stdout = rescueStdout
    90  	pterm.SetDefaultOutput(rescueStdout)
    91  
    92  	out = string(outB)
    93  
    94  	return
    95  }