github.com/nimakaviani/cli@v6.37.1-0.20180619223813-e734901a73fa+incompatible/integration/helpers/command.go (about)

     1  package helpers
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"os"
     7  	"os/exec"
     8  	"regexp"
     9  	"strings"
    10  
    11  	. "github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  	. "github.com/onsi/gomega/gexec"
    14  )
    15  
    16  const (
    17  	DebugCommandPrefix = "\nCMD>"
    18  	DebugOutPrefix     = "OUT: "
    19  	DebugErrPrefix     = "ERR: "
    20  )
    21  
    22  func CF(args ...string) *Session {
    23  	WriteCommand(nil, args)
    24  	session, err := Start(
    25  		exec.Command("cf", args...),
    26  		NewPrefixedWriter(DebugOutPrefix, GinkgoWriter),
    27  		NewPrefixedWriter(DebugErrPrefix, GinkgoWriter))
    28  	Expect(err).NotTo(HaveOccurred())
    29  	return session
    30  }
    31  
    32  type CFEnv struct {
    33  	WorkingDirectory string
    34  	EnvVars          map[string]string
    35  	stdin            io.Reader
    36  }
    37  
    38  func CustomCF(cfEnv CFEnv, args ...string) *Session {
    39  	command := exec.Command("cf", args...)
    40  	if cfEnv.stdin != nil {
    41  		command.Stdin = cfEnv.stdin
    42  	}
    43  	if cfEnv.WorkingDirectory != "" {
    44  		command.Dir = cfEnv.WorkingDirectory
    45  	}
    46  
    47  	if cfEnv.EnvVars != nil {
    48  		env := os.Environ()
    49  		for key, val := range cfEnv.EnvVars {
    50  			env = AddOrReplaceEnvironment(env, key, val)
    51  		}
    52  		command.Env = env
    53  	}
    54  
    55  	WriteCommand(cfEnv.EnvVars, args)
    56  	session, err := Start(
    57  		command,
    58  		NewPrefixedWriter(DebugOutPrefix, GinkgoWriter),
    59  		NewPrefixedWriter(DebugErrPrefix, GinkgoWriter))
    60  	Expect(err).NotTo(HaveOccurred())
    61  	return session
    62  }
    63  
    64  func DebugCustomCF(cfEnv CFEnv, args ...string) *Session {
    65  	if cfEnv.EnvVars == nil {
    66  		cfEnv.EnvVars = map[string]string{}
    67  	}
    68  	cfEnv.EnvVars["CF_LOG_LEVEL"] = "debug"
    69  
    70  	return CustomCF(cfEnv, args...)
    71  }
    72  
    73  func CFWithStdin(stdin io.Reader, args ...string) *Session {
    74  	WriteCommand(nil, args)
    75  	command := exec.Command("cf", args...)
    76  	command.Stdin = stdin
    77  	session, err := Start(
    78  		command,
    79  		NewPrefixedWriter(DebugOutPrefix, GinkgoWriter),
    80  		NewPrefixedWriter(DebugErrPrefix, GinkgoWriter))
    81  	Expect(err).NotTo(HaveOccurred())
    82  	return session
    83  }
    84  
    85  func CFWithEnv(envVars map[string]string, args ...string) *Session {
    86  	return CustomCF(CFEnv{EnvVars: envVars}, args...)
    87  }
    88  
    89  func WriteCommand(env map[string]string, args []string) {
    90  	display := []string{
    91  		DebugCommandPrefix,
    92  	}
    93  
    94  	isPass := regexp.MustCompile("(?i)password|token")
    95  	for key, val := range env {
    96  		if isPass.MatchString(key) {
    97  			val = "*****"
    98  		}
    99  		display = append(display, fmt.Sprintf("%s=%s", key, val))
   100  	}
   101  
   102  	display = append(display, "cf")
   103  	display = append(display, args...)
   104  	GinkgoWriter.Write([]byte(strings.Join(append(display, "\n"), " ")))
   105  }