|
@@ -27,6 +27,7 @@ import (
|
|
|
"regexp"
|
|
"regexp"
|
|
|
"strings"
|
|
"strings"
|
|
|
"sync"
|
|
"sync"
|
|
|
|
|
+ "syscall"
|
|
|
"testing"
|
|
"testing"
|
|
|
"text/template"
|
|
"text/template"
|
|
|
"time"
|
|
"time"
|
|
@@ -50,6 +51,8 @@ type TestCmd struct {
|
|
|
stdout *bufio.Reader
|
|
stdout *bufio.Reader
|
|
|
stdin io.WriteCloser
|
|
stdin io.WriteCloser
|
|
|
stderr *testlogger
|
|
stderr *testlogger
|
|
|
|
|
+ // Err will contain the process exit error or interrupt signal error
|
|
|
|
|
+ Err error
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Run exec's the current binary using name as argv[0] which will trigger the
|
|
// Run exec's the current binary using name as argv[0] which will trigger the
|
|
@@ -182,11 +185,25 @@ func (tt *TestCmd) ExpectExit() {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (tt *TestCmd) WaitExit() {
|
|
func (tt *TestCmd) WaitExit() {
|
|
|
- tt.cmd.Wait()
|
|
|
|
|
|
|
+ tt.Err = tt.cmd.Wait()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func (tt *TestCmd) Interrupt() {
|
|
func (tt *TestCmd) Interrupt() {
|
|
|
- tt.cmd.Process.Signal(os.Interrupt)
|
|
|
|
|
|
|
+ tt.Err = tt.cmd.Process.Signal(os.Interrupt)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ExitStatus exposes the process' OS exit code
|
|
|
|
|
+// It will only return a valid value after the process has finished.
|
|
|
|
|
+func (tt *TestCmd) ExitStatus() int {
|
|
|
|
|
+ if tt.Err != nil {
|
|
|
|
|
+ exitErr := tt.Err.(*exec.ExitError)
|
|
|
|
|
+ if exitErr != nil {
|
|
|
|
|
+ if status, ok := exitErr.Sys().(syscall.WaitStatus); ok {
|
|
|
|
|
+ return status.ExitStatus()
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return 0
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// StderrText returns any stderr output written so far.
|
|
// StderrText returns any stderr output written so far.
|