1
2
3
4
5 package s2
6
7 import (
8 "bytes"
9 "fmt"
10 "io"
11 "os"
12 "runtime"
13 "strings"
14 "testing"
15
16 "github.com/klauspost/compress/zip"
17 )
18
19 func TestDecodeRegression(t *testing.T) {
20 data, err := os.ReadFile("testdata/dec-block-regressions.zip")
21 if err != nil {
22 t.Fatal(err)
23 }
24 zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
25 if err != nil {
26 t.Fatal(err)
27 }
28 for _, tt := range zr.File {
29 if !strings.HasSuffix(t.Name(), "") {
30 continue
31 }
32 t.Run(tt.Name, func(t *testing.T) {
33 r, err := tt.Open()
34 if err != nil {
35 t.Error(err)
36 return
37 }
38 in, err := io.ReadAll(r)
39 if err != nil {
40 t.Error(err)
41 }
42 got, err := Decode(nil, in)
43 t.Log("Received:", len(got), err)
44 })
45 }
46 }
47
48 func TestDecoderMaxBlockSize(t *testing.T) {
49 data, err := os.ReadFile("testdata/enc_regressions.zip")
50 if err != nil {
51 t.Fatal(err)
52 }
53 zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
54 if err != nil {
55 t.Fatal(err)
56 }
57 sizes := []int{4 << 10, 10 << 10, 1 << 20, 4 << 20}
58 test := func(t *testing.T, data []byte) {
59 for _, size := range sizes {
60 t.Run(fmt.Sprintf("%d", size), func(t *testing.T) {
61 var buf bytes.Buffer
62 dec := NewReader(nil, ReaderMaxBlockSize(size), ReaderAllocBlock(size/2))
63 enc := NewWriter(&buf, WriterBlockSize(size), WriterPadding(16<<10), WriterPaddingSrc(zeroReader{}))
64
65
66 n, err := enc.Write(data)
67 if err != nil {
68 t.Error(err)
69 return
70 }
71 if n != len(data) {
72 t.Error(fmt.Errorf("Write: Short write, want %d, got %d", len(data), n))
73 return
74 }
75 err = enc.Close()
76 if err != nil {
77 t.Error(err)
78 return
79 }
80
81 err = enc.Close()
82 if err != nil {
83 t.Error(err)
84 return
85 }
86
87 dec.Reset(&buf)
88 got, err := io.ReadAll(dec)
89 if err != nil {
90 t.Error(err)
91 return
92 }
93 if !bytes.Equal(data, got) {
94 t.Error("block (reset) decoder mismatch")
95 return
96 }
97
98
99 buf.Reset()
100 enc.Reset(&buf)
101 n2, err := enc.ReadFrom(bytes.NewBuffer(data))
102 if err != nil {
103 t.Error(err)
104 return
105 }
106 if n2 != int64(len(data)) {
107 t.Error(fmt.Errorf("ReadFrom: Short read, want %d, got %d", len(data), n2))
108 return
109 }
110
111 n2, err = enc.ReadFrom(bytes.NewBuffer(data))
112 if err != nil {
113 t.Error(err)
114 return
115 }
116 if n2 != int64(len(data)) {
117 t.Error(fmt.Errorf("ReadFrom: Short read, want %d, got %d", len(data), n2))
118 return
119 }
120
121 err = enc.Close()
122 if err != nil {
123 t.Error(err)
124 return
125 }
126 if enc.pad > 0 && buf.Len()%enc.pad != 0 {
127 t.Error(fmt.Errorf("wanted size to be mutiple of %d, got size %d with remainder %d", enc.pad, buf.Len(), buf.Len()%enc.pad))
128 return
129 }
130 encoded := buf.Bytes()
131 dec.Reset(&buf)
132
133 dec.Skip(int64(len(data)))
134 got, err = io.ReadAll(dec)
135 if err != nil {
136 t.Error(err)
137 return
138 }
139 if !bytes.Equal(data, got) {
140 t.Error("frame (reset) decoder mismatch")
141 return
142 }
143
144 buf.Write(encoded)
145 dec.Reset(&buf)
146 var doubleB bytes.Buffer
147 nb, err := dec.DecodeConcurrent(&doubleB, runtime.GOMAXPROCS(0))
148 if err != nil {
149 t.Error(err)
150 return
151 }
152 if nb != int64(len(data)*2) {
153 t.Errorf("want %d, got %d, err: %v", len(data)*2, nb, err)
154 return
155 }
156 got = doubleB.Bytes()[:len(data)]
157 if !bytes.Equal(data, got) {
158 t.Error("frame (DecodeConcurrent) decoder mismatch")
159 return
160 }
161 got = doubleB.Bytes()[len(data):]
162 if !bytes.Equal(data, got) {
163 t.Error("frame (DecodeConcurrent) decoder mismatch")
164 return
165 }
166 })
167 }
168 }
169 for _, tt := range zr.File {
170 if !strings.HasSuffix(t.Name(), "") {
171 continue
172 }
173 t.Run(tt.Name, func(t *testing.T) {
174 r, err := tt.Open()
175 if err != nil {
176 t.Error(err)
177 return
178 }
179 b, err := io.ReadAll(r)
180 if err != nil {
181 t.Error(err)
182 return
183 }
184 test(t, b[:len(b):len(b)])
185 })
186 }
187 }
188
View as plain text