Browse code

Add tests for pkg/pools

Fixes #11588

Signed-off-by: Vincent Demeester <vincent@sbr.pm>

Vincent Demeester authored on 2015/05/16 03:13:54
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,162 @@
0
+package pools
1
+
2
+import (
3
+	"bufio"
4
+	"bytes"
5
+	"io"
6
+	"strings"
7
+	"testing"
8
+)
9
+
10
+func TestBufioReaderPoolGetWithNoReaderShouldCreateOne(t *testing.T) {
11
+	reader := BufioReader32KPool.Get(nil)
12
+	if reader == nil {
13
+		t.Fatalf("BufioReaderPool should have create a bufio.Reader but did not.")
14
+	}
15
+}
16
+
17
+func TestBufioReaderPoolPutAndGet(t *testing.T) {
18
+	sr := bufio.NewReader(strings.NewReader("foobar"))
19
+	reader := BufioReader32KPool.Get(sr)
20
+	if reader == nil {
21
+		t.Fatalf("BufioReaderPool should not return a nil reader.")
22
+	}
23
+	// verify the first 3 byte
24
+	buf1 := make([]byte, 3)
25
+	_, err := reader.Read(buf1)
26
+	if err != nil {
27
+		t.Fatal(err)
28
+	}
29
+	if actual := string(buf1); actual != "foo" {
30
+		t.Fatalf("The first letter should have been 'foo' but was %v", actual)
31
+	}
32
+	BufioReader32KPool.Put(reader)
33
+	// Try to read the next 3 bytes
34
+	_, err = sr.Read(make([]byte, 3))
35
+	if err == nil || err != io.EOF {
36
+		t.Fatalf("The buffer should have been empty, issue an EOF error.")
37
+	}
38
+}
39
+
40
+type simpleReaderCloser struct {
41
+	io.Reader
42
+	closed bool
43
+}
44
+
45
+func (r *simpleReaderCloser) Close() error {
46
+	r.closed = true
47
+	return nil
48
+}
49
+
50
+func TestNewReadCloserWrapperWithAReadCloser(t *testing.T) {
51
+	br := bufio.NewReader(strings.NewReader(""))
52
+	sr := &simpleReaderCloser{
53
+		Reader: strings.NewReader("foobar"),
54
+		closed: false,
55
+	}
56
+	reader := BufioReader32KPool.NewReadCloserWrapper(br, sr)
57
+	if reader == nil {
58
+		t.Fatalf("NewReadCloserWrapper should not return a nil reader.")
59
+	}
60
+	// Verify the content of reader
61
+	buf := make([]byte, 3)
62
+	_, err := reader.Read(buf)
63
+	if err != nil {
64
+		t.Fatal(err)
65
+	}
66
+	if actual := string(buf); actual != "foo" {
67
+		t.Fatalf("The first 3 letter should have been 'foo' but were %v", actual)
68
+	}
69
+	reader.Close()
70
+	// Read 3 more bytes "bar"
71
+	_, err = reader.Read(buf)
72
+	if err != nil {
73
+		t.Fatal(err)
74
+	}
75
+	if actual := string(buf); actual != "bar" {
76
+		t.Fatalf("The first 3 letter should have been 'bar' but were %v", actual)
77
+	}
78
+	if !sr.closed {
79
+		t.Fatalf("The ReaderCloser should have been closed, it is not.")
80
+	}
81
+}
82
+
83
+func TestBufioWriterPoolGetWithNoReaderShouldCreateOne(t *testing.T) {
84
+	writer := BufioWriter32KPool.Get(nil)
85
+	if writer == nil {
86
+		t.Fatalf("BufioWriterPool should have create a bufio.Writer but did not.")
87
+	}
88
+}
89
+
90
+func TestBufioWriterPoolPutAndGet(t *testing.T) {
91
+	buf := new(bytes.Buffer)
92
+	bw := bufio.NewWriter(buf)
93
+	writer := BufioWriter32KPool.Get(bw)
94
+	if writer == nil {
95
+		t.Fatalf("BufioReaderPool should not return a nil writer.")
96
+	}
97
+	written, err := writer.Write([]byte("foobar"))
98
+	if err != nil {
99
+		t.Fatal(err)
100
+	}
101
+	if written != 6 {
102
+		t.Fatalf("Should have written 6 bytes, but wrote %v bytes", written)
103
+	}
104
+	// Make sure we Flush all the way ?
105
+	writer.Flush()
106
+	bw.Flush()
107
+	if len(buf.Bytes()) != 6 {
108
+		t.Fatalf("The buffer should contain 6 bytes ('foobar') but contains %v ('%v')", buf.Bytes(), string(buf.Bytes()))
109
+	}
110
+	// Reset the buffer
111
+	buf.Reset()
112
+	BufioWriter32KPool.Put(writer)
113
+	// Try to write something
114
+	written, err = writer.Write([]byte("barfoo"))
115
+	if err != nil {
116
+		t.Fatal(err)
117
+	}
118
+	// If we now try to flush it, it should panic (the writer is nil)
119
+	// recover it
120
+	defer func() {
121
+		if r := recover(); r == nil {
122
+			t.Fatal("Trying to flush the writter should have 'paniced', did not.")
123
+		}
124
+	}()
125
+	writer.Flush()
126
+}
127
+
128
+type simpleWriterCloser struct {
129
+	io.Writer
130
+	closed bool
131
+}
132
+
133
+func (r *simpleWriterCloser) Close() error {
134
+	r.closed = true
135
+	return nil
136
+}
137
+
138
+func TestNewWriteCloserWrapperWithAWriteCloser(t *testing.T) {
139
+	buf := new(bytes.Buffer)
140
+	bw := bufio.NewWriter(buf)
141
+	sw := &simpleWriterCloser{
142
+		Writer: new(bytes.Buffer),
143
+		closed: false,
144
+	}
145
+	bw.Flush()
146
+	writer := BufioWriter32KPool.NewWriteCloserWrapper(bw, sw)
147
+	if writer == nil {
148
+		t.Fatalf("BufioReaderPool should not return a nil writer.")
149
+	}
150
+	written, err := writer.Write([]byte("foobar"))
151
+	if err != nil {
152
+		t.Fatal(err)
153
+	}
154
+	if written != 6 {
155
+		t.Fatalf("Should have written 6 bytes, but wrote %v bytes", written)
156
+	}
157
+	writer.Close()
158
+	if !sw.closed {
159
+		t.Fatalf("The ReaderCloser should have been closed, it is not.")
160
+	}
161
+}