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