@cryptotaxi247 / kubo / commits / c64eb1199

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 +}