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 }