test(gateway): test the lazy seeker
Steven Allen committed
Jan 3, 2020 at 18:08 UTC
c64eb11992f755f88424afa2d8dacfc8b16d09fe
1 file changed
+137
core/corehttp/lazyseek_test.go
new
+137
@@ -0,0 +1,137 @@
1
+package corehttp
2
+
3
+import (
4
+ "fmt"
5
+ "io"
6
+ "io/ioutil"
7
+ "strings"
8
+ "testing"
9
+)
10
+
11
+type badSeeker struct {
12
+ io.ReadSeeker
13
+}
14
+
15
+var badSeekErr = fmt.Errorf("I'm a bad seeker")
16
+
17
+func (bs badSeeker) Seek(offset int64, whence int) (int64, error) {
18
+ off, err := bs.ReadSeeker.Seek(0, io.SeekCurrent)
19
+ if err != nil {
20
+ panic(err)
21
+ }
22
+ return off, badSeekErr
23
+}
24
+
25
+func TestLazySeekerError(t *testing.T) {
26
+ underlyingBuffer := strings.NewReader("fubar")
27
+ s := &lazySeeker{
28
+ reader: badSeeker{underlyingBuffer},
29
+ size: underlyingBuffer.Size(),
30
+ }
31
+ off, err := s.Seek(0, io.SeekEnd)
32
+ if err != nil {
33
+ t.Fatal(err)
34
+ }
35
+ if off != s.size {
36
+ t.Fatal("expected to seek to the end")
37
+ }
38
+
39
+ // shouldn't have actually seeked.
40
+ b, err := ioutil.ReadAll(s)
41
+ if err != nil {
42
+ t.Fatal(err)
43
+ }
44
+ if len(b) != 0 {
45
+ t.Fatal("expected to read nothing")
46
+ }
47
+
48
+ // shouldn't need to actually seek.
49
+ off, err = s.Seek(0, io.SeekStart)
50
+ if err != nil {
51
+ t.Fatal(err)
52
+ }
53
+ if off != 0 {
54
+ t.Fatal("expected to seek to the start")
55
+ }
56
+ b, err = ioutil.ReadAll(s)
57
+ if err != nil {
58
+ t.Fatal(err)
59
+ }
60
+ if string(b) != "fubar" {
61
+ t.Fatal("expected to read string")
62
+ }
63
+
64
+ // should fail the second time.
65
+ off, err = s.Seek(0, io.SeekStart)
66
+ if err != nil {
67
+ t.Fatal(err)
68
+ }
69
+ if off != 0 {
70
+ t.Fatal("expected to seek to the start")
71
+ }
72
+ // right here...
73
+ b, err = ioutil.ReadAll(s)
74
+ if err == nil {
75
+ t.Fatalf("expected an error, got output %s", string(b))
76
+ }
77
+ if err != badSeekErr {
78
+ t.Fatalf("expected a bad seek error, got %s", err)
79
+ }
80
+ if len(b) != 0 {
81
+ t.Fatalf("expected to read nothing")
82
+ }
83
+}
84
+
85
+func TestLazySeeker(t *testing.T) {
86
+ underlyingBuffer := strings.NewReader("fubar")
87
+ s := &lazySeeker{
88
+ reader: underlyingBuffer,
89
+ size: underlyingBuffer.Size(),
90
+ }
91
+ expectByte := func(b byte) {
92
+ t.Helper()
93
+ var buf [1]byte
94
+ n, err := io.ReadFull(s, buf[:])
95
+ if err != nil {
96
+ t.Fatal(err)
97
+ }
98
+ if n != 1 {
99
+ t.Fatalf("expected to read one byte, read %d", n)
100
+ }
101
+ if buf[0] != b {
102
+ t.Fatalf("expected %b, got %b", b, buf[0])
103
+ }
104
+ }
105
+ expectSeek := func(whence int, off, expOff int64, expErr string) {
106
+ t.Helper()
107
+ n, err := s.Seek(off, whence)
108
+ if expErr == "" {
109
+ if err != nil {
110
+ t.Fatal("unexpected seek error: ", err)
111
+ }
112
+ } else {
113
+ if err == nil || err.Error() != expErr {
114
+ t.Fatalf("expected %s, got %s", err, expErr)
115
+ }
116
+ }
117
+ if n != expOff {
118
+ t.Fatalf("expected offset %d, got, %d", expOff, n)
119
+ }
120
+ }
121
+
122
+ expectSeek(io.SeekEnd, 0, s.size, "")
123
+ b, err := ioutil.ReadAll(s)
124
+ if err != nil {
125
+ t.Fatal(err)
126
+ }
127
+ if len(b) != 0 {
128
+ t.Fatal("expected to read nothing")
129
+ }
130
+ expectSeek(io.SeekEnd, -1, s.size-1, "")
131
+ expectByte('r')
132
+ expectSeek(io.SeekStart, 0, 0, "")
133
+ expectByte('f')
134
+ expectSeek(io.SeekCurrent, 1, 2, "")
135
+ expectByte('b')
136
+ expectSeek(io.SeekCurrent, -100, 3, "invalid seek offset")
137
+}