responseemitter_test.go 1.83 KB
Newer Older
Jan Winkelmann's avatar
Jan Winkelmann committed
1 2 3 4
package cli

import (
	"bytes"
keks's avatar
keks committed
5
	"fmt"
Jan Winkelmann's avatar
Jan Winkelmann committed
6 7
	"testing"

Hector Sanjuan's avatar
Hector Sanjuan committed
8
	cmds "github.com/ipfs/go-ipfs-cmds"
Jan Winkelmann's avatar
Jan Winkelmann committed
9 10
)

keks's avatar
keks committed
11
type tcCloseWithError struct {
Jan Winkelmann's avatar
Jan Winkelmann committed
12 13 14 15 16 17
	stdout, stderr     *bytes.Buffer
	exStdout, exStderr string
	exExit             int
	f                  func(re ResponseEmitter, t *testing.T)
}

keks's avatar
keks committed
18
func (tc tcCloseWithError) Run(t *testing.T) {
19
	req := &cmds.Request{}
Steven Allen's avatar
Steven Allen committed
20
	cmdsre, err := NewResponseEmitter(tc.stdout, tc.stderr, req)
Steven Allen's avatar
Steven Allen committed
21 22 23
	if err != nil {
		t.Fatal(err)
	}
Jan Winkelmann's avatar
Jan Winkelmann committed
24 25 26

	re := cmdsre.(ResponseEmitter)

Steven Allen's avatar
Steven Allen committed
27
	tc.f(re, t)
Jan Winkelmann's avatar
Jan Winkelmann committed
28

Steven Allen's avatar
Steven Allen committed
29 30
	if re.Status() != tc.exExit {
		t.Fatalf("expected exit code %d, got %d", tc.exExit, re.Status())
Jan Winkelmann's avatar
Jan Winkelmann committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44
	}

	if tc.stdout.String() != tc.exStdout {
		t.Fatalf(`expected stdout string "%s" but got "%s"`, tc.exStdout, tc.stdout.String())
	}

	if tc.stderr.String() != tc.exStderr {
		t.Fatalf(`expected stderr string "%s" but got "%s"`, tc.exStderr, tc.stderr.String())
	}

	t.Logf("stdout:\n---\n%s---\n", tc.stdout.Bytes())
	t.Logf("stderr:\n---\n%s---\n", tc.stderr.Bytes())
}

keks's avatar
keks committed
45 46 47
func TestCloseWithError(t *testing.T) {
	tcs := []tcCloseWithError{
		tcCloseWithError{
Jan Winkelmann's avatar
Jan Winkelmann committed
48 49 50 51 52 53 54
			stdout:   bytes.NewBuffer(nil),
			stderr:   bytes.NewBuffer(nil),
			exStdout: "a\n",
			exStderr: "Error: some error\n",
			exExit:   1,
			f: func(re ResponseEmitter, t *testing.T) {
				re.Emit("a")
keks's avatar
keks committed
55
				re.CloseWithError(fmt.Errorf("some error"))
Jan Winkelmann's avatar
Jan Winkelmann committed
56 57 58
				re.Emit("b")
			},
		},
keks's avatar
keks committed
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
		tcCloseWithError{
			stdout:   bytes.NewBuffer(nil),
			stderr:   bytes.NewBuffer(nil),
			exStdout: "a\n",
			exStderr: "Error: some error\n",
			exExit:   1,
			f: func(re ResponseEmitter, t *testing.T) {
				re.Emit("a")

				err := re.CloseWithError(fmt.Errorf("some error"))
				if err != nil {
					t.Fatal("unexpected error:", err)
				}

				err = re.Close()
				if err != cmds.ErrClosingClosedEmitter {
					t.Fatal("expected double close error, got:", err)
				}
			},
		},
Jan Winkelmann's avatar
Jan Winkelmann committed
79 80 81 82 83 84 85
	}

	for i, tc := range tcs {
		t.Log(i)
		tc.Run(t)
	}
}