1package zstd
2
3import (
4	"bytes"
5	"encoding/json"
6	"io/ioutil"
7	"os"
8	"strings"
9	"testing"
10
11	"github.com/klauspost/compress/zip"
12)
13
14func TestHeader_Decode(t *testing.T) {
15	data, err := ioutil.ReadFile("testdata/headers.zip")
16	if err != nil {
17		t.Fatal(err)
18	}
19	zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
20	if err != nil {
21		t.Fatal(err)
22	}
23
24	// Regenerate golden data...
25	const regen = false
26	golden := make(map[string]Header)
27	if !regen {
28		b, err := ioutil.ReadFile("testdata/headers-want.json.zst")
29		if err != nil {
30			t.Fatal(err)
31		}
32		dec, err := NewReader(nil)
33		if err != nil {
34			t.Fatal(err)
35		}
36		defer dec.Close()
37		b, err = dec.DecodeAll(b, nil)
38		if err != nil {
39			t.Fatal(err)
40		}
41		err = json.Unmarshal(b, &golden)
42		if err != nil {
43			t.Fatal(err)
44		}
45	}
46
47	for i, tt := range zr.File {
48		if !strings.HasSuffix(t.Name(), "") {
49			continue
50		}
51		if testing.Short() && i > 100 {
52			break
53		}
54
55		t.Run(tt.Name, func(t *testing.T) {
56			r, err := tt.Open()
57			if err != nil {
58				t.Error(err)
59				return
60			}
61			defer r.Close()
62			b, err := ioutil.ReadAll(r)
63			if err != nil {
64				t.Error(err)
65				return
66			}
67			want, ok := golden[tt.Name]
68			var got Header
69			err = got.Decode(b)
70			if err != nil {
71				if ok {
72					t.Errorf("got unexpected error %v", err)
73				}
74				return
75			}
76			if regen {
77				// errored entries are not set
78				golden[tt.Name] = got
79				return
80			}
81			if !ok {
82				t.Errorf("want error, got result: %v", got)
83			}
84			if want != got {
85				t.Errorf("want %#v, got %#v", want, got)
86			}
87		})
88	}
89	if regen {
90		w, err := os.Create("testdata/headers-want.json.zst")
91		if err != nil {
92			t.Fatal(err)
93		}
94		defer w.Close()
95		enc, err := NewWriter(w, WithEncoderLevel(SpeedBestCompression))
96		b, err := json.Marshal(golden)
97		if err != nil {
98			t.Fatal(err)
99		}
100		enc.ReadFrom(bytes.NewBuffer(b))
101		enc.Close()
102		t.SkipNow()
103		return
104	}
105}
106