1package terminal
2
3import (
4	"bytes"
5	"errors"
6	"testing"
7
8	"github.com/stretchr/testify/assert"
9	"github.com/stretchr/testify/require"
10)
11
12type chStringReadWriter struct {
13	wrieDone chan struct{}
14	bytes.Buffer
15}
16
17func (c *chStringReadWriter) Write(p []byte) (int, error) {
18	defer func() {
19		c.wrieDone <- struct{}{}
20	}()
21	return c.Buffer.Write(p)
22}
23
24func TestServe(t *testing.T) {
25	encProxy := NewStreamProxy(1)
26	downstream := bytes.Buffer{}
27	upstream := chStringReadWriter{
28		wrieDone: make(chan struct{}),
29	}
30	writeString := []byte("data from downstream")
31
32	downstream.Write([]byte(writeString))
33
34	go func() {
35		err := encProxy.Serve(&upstream, &downstream)
36		if err != nil {
37			t.Fatalf("unexpected error from serve: %v", err)
38		}
39	}()
40
41	// Wait until the write is done
42	<-upstream.wrieDone
43
44	b := make([]byte, 20)
45	_, err := upstream.Read(b)
46	require.NoError(t, err)
47
48	assert.Equal(t, writeString, b)
49}
50
51func TestServeError(t *testing.T) {
52	encProxy := NewStreamProxy(1)
53	downstream := errorReadWriter{}
54	upstream := bytes.Buffer{}
55
56	err := encProxy.Serve(&upstream, &downstream)
57	assert.Error(t, err)
58}
59
60type errorReadWriter struct {
61}
62
63func (rw *errorReadWriter) Read(p []byte) (int, error) {
64	return 0, errors.New("failed to read")
65}
66
67func (rw *errorReadWriter) Write(p []byte) (int, error) {
68	return 0, errors.New("failed to read")
69}
70