@@ -14,6 +14,9 @@ import (
14
14
"io"
15
15
"io/ioutil"
16
16
"log"
17
+ "math"
18
+ mathrand "math/rand"
19
+ "testing"
17
20
18
21
"github.com/dsnet/compress/internal/testutil"
19
22
"github.com/dsnet/compress/xflate"
@@ -246,3 +249,112 @@ func Example_gzipFile() {
246
249
// got: "ver, white with foam, the driving spray of spume-flakes, the dim\noutlines of the"
247
250
// want: "ver, white with foam, the driving spray of spume-flakes, the dim\noutlines of the"
248
251
}
252
+
253
+ type seekItem struct {
254
+ off int64
255
+ seek int
256
+ n int
257
+ want string
258
+ wantpos int64
259
+ readerr error
260
+ seekerr string
261
+ }
262
+
263
+ var testSeekPlaintext = []byte ("0123456789" )
264
+
265
+ var testSeekItems = []seekItem {
266
+
267
+ {seek : io .SeekStart , off : 0 , n : 20 , want : "0123456789" },
268
+ {seek : io .SeekStart , off : 0 , n : 5 , want : "01234" },
269
+
270
+ {seek : io .SeekCurrent , off : 1 , wantpos : 6 , n : 1 , want : "6" },
271
+ {seek : io .SeekCurrent , off : - 3 , wantpos : 4 , n : 3 , want : "456" },
272
+
273
+ {seek : io .SeekStart , off : 1 , n : 1 , want : "1" },
274
+ {seek : io .SeekCurrent , off : 1 , wantpos : 3 , n : 2 , want : "34" },
275
+
276
+ {seek : io .SeekStart , off : - 1 , seekerr : "xflate: invalid argument: negative position: -1" },
277
+ // {seek: io.SeekStart, off: -1, seekerr: "bytes.Reader.Seek: negative position"},
278
+ {seek : io .SeekStart , off : 1 << 33 , wantpos : 1 << 33 , readerr : io .EOF },
279
+ {seek : io .SeekCurrent , off : 1 , wantpos : 1 << 33 + 1 , readerr : io .EOF },
280
+
281
+ {seek : io .SeekStart , n : 5 , want : "01234" },
282
+ {seek : io .SeekCurrent , n : 5 , want : "56789" },
283
+ {seek : io .SeekEnd , off : - 1 , n : 1 , wantpos : 9 , want : "9" },
284
+
285
+ {seek : io .SeekStart , n : 0 },
286
+ }
287
+
288
+ func testSeek (t * testing.T , chunkSize int64 , tests []seekItem , r io.ReadSeeker ) {
289
+ for i , tt := range tests {
290
+ pos , err := r .Seek (tt .off , tt .seek )
291
+ if err == nil && tt .seekerr != "" {
292
+ t .Errorf ("%d. want seek error %q" , i , tt .seekerr )
293
+ continue
294
+ }
295
+ if err != nil && err .Error () != tt .seekerr {
296
+ t .Errorf ("%d. seek error = %q; want %q" , i , err .Error (), tt .seekerr )
297
+ continue
298
+ }
299
+ if tt .wantpos != 0 && tt .wantpos != pos {
300
+ t .Errorf ("%d. pos = %d, want %d" , i , pos , tt .wantpos )
301
+ }
302
+ buf := make ([]byte , tt .n )
303
+ n , err := r .Read (buf )
304
+ if err != tt .readerr {
305
+ t .Errorf ("%d. read = %v; want %v" , i , err , tt .readerr )
306
+ continue
307
+ }
308
+ got := string (buf [:n ])
309
+ if got != tt .want {
310
+ t .Errorf ("%d. got %q; want %q, chunkSize: %v" , i , got , tt .want , chunkSize )
311
+ }
312
+ }
313
+ }
314
+
315
+ func TestSeekDeflate (t * testing.T ) {
316
+ v_input := testSeekPlaintext
317
+
318
+ pow := float64 (mathrand .Intn (8 ) + 1 )
319
+ chunkSize := int64 (math .Pow (2 , pow ))
320
+
321
+ var wb , rb bytes.Buffer
322
+ xw , err := xflate .NewWriter (& wb , & xflate.WriterConfig {
323
+ ChunkSize : chunkSize ,
324
+ })
325
+ if err != nil {
326
+ t .Errorf ("unexpected error: NewWriter() = %v" , err )
327
+ }
328
+ cnt2 , err := xw .Write (v_input )
329
+ cnt := int64 (cnt2 )
330
+ // cnt, err := io.Copy(xw, bytes.NewReader(v_input))
331
+ if err != nil {
332
+ t .Errorf ("unexpected error: Write() = %v" , err )
333
+ }
334
+ if cnt != int64 (len (v_input )) {
335
+ t .Errorf ("write count mismatch: got %d, want %d" , cnt , len (v_input ))
336
+ }
337
+ if err := xw .Close (); err != nil {
338
+ t .Errorf ("unexpected error: Close() = %v" , err )
339
+ }
340
+
341
+ xr , err := xflate .NewReader (bytes .NewReader (wb .Bytes ()), & xflate.ReaderConfig {})
342
+ if err != nil {
343
+ t .Errorf ("unexpected error: NewReader() = %v" , err )
344
+ }
345
+
346
+ testSeek (t , chunkSize , testSeekItems , xr )
347
+
348
+ cnt , err = io .Copy (& rb , xr )
349
+ if err != nil {
350
+ t .Errorf ("unexpected error: Read() = %v" , err )
351
+ }
352
+ if cnt != int64 (len (v_input )) {
353
+ t .Errorf ("read count mismatch: got %d, want %d" , cnt , len (v_input ))
354
+ }
355
+
356
+ if err := xr .Close (); err != nil {
357
+ t .Errorf ("unexpected error: Close() = %v" , err )
358
+ }
359
+
360
+ }
0 commit comments