From 33d0dd0bfc3451643a78eb267faafd704c224a79 Mon Sep 17 00:00:00 2001 From: rigel rozanski Date: Tue, 6 Jun 2017 18:36:28 -0400 Subject: [PATCH] add stderr to tests --- .gitignore | 1 + cli/helper.go | 33 ++++++++++++++++++++++----------- cli/setup_test.go | 6 ++++-- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 62f28681c..6e0986855 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +*.swp vendor .glide diff --git a/cli/helper.go b/cli/helper.go index 79654bc34..959f8a5f6 100644 --- a/cli/helper.go +++ b/cli/helper.go @@ -57,28 +57,39 @@ func RunWithArgs(cmd Executable, args []string, env map[string]string) error { // RunCaptureWithArgs executes the given command with the specified command line args // and environmental variables set. It returns whatever was writen to // stdout along with any error returned from cmd.Execute() -func RunCaptureWithArgs(cmd Executable, args []string, env map[string]string) (output string, err error) { - old := os.Stdout // keep backup of the real stdout - r, w, _ := os.Pipe() - os.Stdout = w +func RunCaptureWithArgs(cmd Executable, args []string, env map[string]string) (stdout, stderr string, err error) { + oldout, olderr := os.Stdout, os.Stderr // keep backup of the real stdout + rOut, wOut, _ := os.Pipe() + rErr, wErr, _ := os.Pipe() + os.Stdout, os.Stderr = wOut, wErr defer func() { - os.Stdout = old // restoring the real stdout + os.Stdout, os.Stderr = oldout, olderr // restoring the real stdout }() - outC := make(chan string) // copy the output in a separate goroutine so printing can't block indefinitely + outC := make(chan string) go func() { var buf bytes.Buffer - // io.Copy will end when we call w.Close() below - io.Copy(&buf, r) + // io.Copy will end when we call wOut.Close() below + io.Copy(&buf, rOut) outC <- buf.String() }() + errC := make(chan string) + go func() { + var buf bytes.Buffer + // io.Copy will end when we call wErr.Close() below + io.Copy(&buf, rErr) + errC <- buf.String() + }() + // now run the command err = RunWithArgs(cmd, args, env) // and grab the stdout to return - w.Close() - output = <-outC - return output, err + wOut.Close() + wErr.Close() + stdout = <-outC + stderr = <-errC + return stdout, stderr, err } diff --git a/cli/setup_test.go b/cli/setup_test.go index 8fb4ce140..791bc7993 100644 --- a/cli/setup_test.go +++ b/cli/setup_test.go @@ -212,9 +212,11 @@ func TestSetupTrace(t *testing.T) { viper.Reset() args := append([]string{cmd.Use}, tc.args...) - out, err := RunCaptureWithArgs(cmd, args, tc.env) + stdout, stderr, err := RunCaptureWithArgs(cmd, args, tc.env) require.NotNil(err, i) - msg := strings.Split(out, "\n") + require.Equal("", stdout, i) + require.NotEqual("", stderr, i) + msg := strings.Split(stderr, "\n") desired := fmt.Sprintf("ERROR: %s", tc.expected) assert.Equal(desired, msg[0], i) if tc.long && assert.True(len(msg) > 2, i) {