responseemitter_test.go 2.66 KB
Newer Older
Jan Winkelmann's avatar
Jan Winkelmann committed
1 2 3
package cmds

import (
4
	"context"
5
	"fmt"
Jan Winkelmann's avatar
Jan Winkelmann committed
6 7 8 9 10
	"io"
	"testing"
)

func TestCopy(t *testing.T) {
11
	req, err := NewRequest(context.Background(), nil, nil, nil, nil, &Command{})
Jan Winkelmann's avatar
Jan Winkelmann committed
12 13 14 15 16 17 18 19 20 21
	if err != nil {
		t.Fatal(err)
	}

	re1, res1 := NewChanResponsePair(req)
	re2, res2 := NewChanResponsePair(req)

	go func() {
		err := Copy(re2, res1)
		if err != nil {
Hector Sanjuan's avatar
Hector Sanjuan committed
22 23
			t.Error(err)
			return
Jan Winkelmann's avatar
Jan Winkelmann committed
24 25 26 27 28
		}
	}()
	go func() {
		err := re1.Emit("test")
		if err != nil {
Hector Sanjuan's avatar
Hector Sanjuan committed
29 30
			t.Error(err)
			return
Jan Winkelmann's avatar
Jan Winkelmann committed
31 32 33 34
		}

		err = re1.Close()
		if err != nil {
Hector Sanjuan's avatar
Hector Sanjuan committed
35 36
			t.Error(err)
			return
Jan Winkelmann's avatar
Jan Winkelmann committed
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
		}
	}()

	v, err := res2.Next()
	if err != nil {
		t.Fatal(err)
	}

	str := v.(string)
	if str != "test" {
		t.Fatalf("expected string %#v but got %#v", "test", str)
	}

	_, err = res2.Next()
	if err != io.EOF {
Steven Allen's avatar
Steven Allen committed
52
		t.Fatalf("expected EOF but got err=%v", err)
Jan Winkelmann's avatar
Jan Winkelmann committed
53 54
	}
}
55

56 57 58 59 60 61 62 63 64 65 66 67 68 69
func TestCopyError(t *testing.T) {
	req, err := NewRequest(context.Background(), nil, nil, nil, nil, &Command{})
	if err != nil {
		t.Fatal(err)
	}

	fooErr := fmt.Errorf("foo")

	re1, res1 := NewChanResponsePair(req)
	re2, res2 := NewChanResponsePair(req)

	go func() {
		err := Copy(re2, res1)
		if err != nil {
Hector Sanjuan's avatar
Hector Sanjuan committed
70 71
			t.Error(err)
			return
72 73 74 75 76
		}
	}()
	go func() {
		err := re1.Emit("test")
		if err != nil {
Hector Sanjuan's avatar
Hector Sanjuan committed
77 78
			t.Error(err)
			return
79 80 81 82
		}

		err = re1.CloseWithError(fooErr)
		if err != nil {
Hector Sanjuan's avatar
Hector Sanjuan committed
83 84
			t.Error(err)
			return
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
		}
	}()

	v, err := res2.Next()
	if err != nil {
		t.Fatal(err)
	}

	str := v.(string)
	if str != "test" {
		t.Fatalf("expected string %#v but got %#v", "test", str)
	}

	_, err = res2.Next()
	if err != fooErr {
		t.Fatalf("expected fooErr but got err=%v", err)
	}
}

104 105 106 107 108 109 110 111 112 113 114
func TestError(t *testing.T) {
	req, err := NewRequest(context.Background(), nil, nil, nil, nil, &Command{})
	if err != nil {
		t.Fatal(err)
	}

	re, res := NewChanResponsePair(req)

	go func() {
		err := re.Emit("value1")
		if err != nil {
Hector Sanjuan's avatar
Hector Sanjuan committed
115 116
			t.Error(err)
			return
117 118 119 120
		}

		err = re.Emit("value2")
		if err != nil {
Hector Sanjuan's avatar
Hector Sanjuan committed
121 122
			t.Error(err)
			return
123 124
		}

Steven Allen's avatar
Steven Allen committed
125
		err = re.CloseWithError(&Error{Message: "foo"})
126
		if err != nil {
Hector Sanjuan's avatar
Hector Sanjuan committed
127 128
			t.Error(err)
			return
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
		}
	}()

	v, err := res.Next()
	if err != nil {
		t.Fatal(err)
	}
	if v.(string) != "value1" {
		t.Errorf("expected string %#v but got %#v", "value1", v)
	}

	v, err = res.Next()
	if err != nil {
		t.Error(err)
	}
	if v.(string) != "value2" {
		t.Errorf("expected string %#v but got %#v", "value1", v)
	}
keks's avatar
keks committed
147 148 149 150 151 152

	v, err = res.Next()
	if v != nil {
		t.Errorf("expected nil value, got %#v", v)

	}
Steven Allen's avatar
Steven Allen committed
153
	e, ok := err.(*Error)
keks's avatar
keks committed
154 155 156 157 158 159 160 161 162 163 164 165
	if !ok {
		t.Errorf("expected error to be %T, got %T", e, v)
	} else {
		expMsg := "foo"
		if e.Message != expMsg {
			t.Errorf("expected error message to be %q, got %q", expMsg, e.Message)
		}

		if e.Code != 0 {
			t.Errorf("expected error code 0(ErrNormal), got %v", e.Code)
		}
	}
166
}