Skip to content

Commit f63d971

Browse files
committed
Merge pull request #2 from deis/utils
feat(utils): adding selected utils
2 parents 2fe28eb + f1e3522 commit f63d971

2 files changed

Lines changed: 106 additions & 0 deletions

File tree

utils/utils.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package utils
2+
3+
// this is code taken from the v2 branch of github.com/deis/deis/tests/utils
4+
5+
import (
6+
"bufio"
7+
"bytes"
8+
"fmt"
9+
"io"
10+
"os"
11+
"os/exec"
12+
)
13+
14+
// RunCommandWithStdoutStderr execs a command and returns its output.
15+
func RunCommandWithStdoutStderr(cmd *exec.Cmd) (bytes.Buffer, bytes.Buffer, error) {
16+
var stdout, stderr bytes.Buffer
17+
stderrPipe, err := cmd.StderrPipe()
18+
stdoutPipe, err := cmd.StdoutPipe()
19+
20+
cmd.Env = os.Environ()
21+
if err != nil {
22+
fmt.Println("error at io pipes")
23+
}
24+
25+
err = cmd.Start()
26+
if err != nil {
27+
fmt.Println("error at command start")
28+
}
29+
30+
go func() {
31+
streamOutput(stdoutPipe, &stdout, os.Stdout)
32+
}()
33+
go func() {
34+
streamOutput(stderrPipe, &stderr, os.Stderr)
35+
}()
36+
err = cmd.Wait()
37+
if err != nil {
38+
fmt.Println("error at command wait")
39+
}
40+
return stdout, stderr, err
41+
}
42+
43+
// streamOutput from a source to a destination buffer while also printing
44+
func streamOutput(src io.Reader, dst *bytes.Buffer, out io.Writer) error {
45+
mw := io.MultiWriter(dst, out)
46+
s := bufio.NewReader(src)
47+
for {
48+
var line []byte
49+
line, err := s.ReadSlice('\n')
50+
if err == io.EOF && len(line) == 0 {
51+
break // done
52+
}
53+
if err == io.EOF {
54+
return fmt.Errorf("Improper termination: %v", line)
55+
}
56+
if err != nil {
57+
return err
58+
}
59+
60+
// append to the buffer and out at once
61+
mw.Write(line)
62+
}
63+
64+
return nil
65+
}

utils/utils_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package utils
2+
3+
import (
4+
"bytes"
5+
"strings"
6+
"testing"
7+
)
8+
9+
func TestStreamOuptutSuccess(t *testing.T) {
10+
str := "abc\ndef\n"
11+
src := strings.NewReader(str)
12+
dest := bytes.NewBuffer(nil)
13+
out := bytes.NewBuffer(nil)
14+
15+
err := streamOutput(src, dest, out)
16+
if err != nil {
17+
t.Fatal(err)
18+
}
19+
20+
destStr := string(dest.Bytes())
21+
if destStr != str {
22+
t.Fatalf("dest was [%s], expected [%s]", destStr, str)
23+
}
24+
25+
outStr := string(out.Bytes())
26+
if outStr != str {
27+
t.Fatalf("out was [%s], expected [%s]", outStr, str)
28+
}
29+
}
30+
31+
func TestStreamOutputErr(t *testing.T) {
32+
// no ending newline
33+
str := "abc\ndef"
34+
src := strings.NewReader(str)
35+
dest := bytes.NewBuffer(nil)
36+
out := bytes.NewBuffer(nil)
37+
err := streamOutput(src, dest, out)
38+
if err == nil {
39+
t.Fatal("expected an error for a string that doesn't end with a newline")
40+
}
41+
}

0 commit comments

Comments
 (0)