123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518 |
- package huff0
- import (
- "bytes"
- "testing"
- )
- func TestDecompress1X(t *testing.T) {
- for _, test := range testfiles {
- t.Run(test.name, func(t *testing.T) {
- var s = &Scratch{}
- buf0, err := test.fn()
- if err != nil {
- t.Fatal(err)
- }
- if len(buf0) > BlockSizeMax {
- buf0 = buf0[:BlockSizeMax]
- }
- b, re, err := Compress1X(buf0, s)
- if err != test.err1X {
- t.Errorf("want error %v (%T), got %v (%T)", test.err1X, test.err1X, err, err)
- }
- if err != nil {
- t.Log(test.name, err.Error())
- return
- }
- if b == nil {
- t.Error("got no output")
- return
- }
- if len(s.OutTable) == 0 {
- t.Error("got no table definition")
- }
- if re {
- t.Error("claimed to have re-used.")
- }
- if len(s.OutData) == 0 {
- t.Error("got no data output")
- }
- wantRemain := len(s.OutData)
- t.Logf("%s: %d -> %d bytes (%.2f:1) %t (table: %d bytes)", test.name, len(buf0), len(b), float64(len(buf0))/float64(len(b)), re, len(s.OutTable))
- s.Out = nil
- var remain []byte
- s, remain, err = ReadTable(b, s)
- if err != nil {
- t.Error(err)
- return
- }
- var buf bytes.Buffer
- if s.matches(s.prevTable, &buf); buf.Len() > 0 {
- t.Error(buf.String())
- }
- if len(remain) != wantRemain {
- t.Fatalf("remain mismatch, want %d, got %d bytes", wantRemain, len(remain))
- }
- t.Logf("remain: %d bytes, ok", len(remain))
- dc, err := s.Decompress1X(remain)
- if err != nil {
- t.Error(err)
- return
- }
- if len(buf0) != len(dc) {
- t.Errorf(test.name+"decompressed, want size: %d, got %d", len(buf0), len(dc))
- if len(buf0) > len(dc) {
- buf0 = buf0[:len(dc)]
- } else {
- dc = dc[:len(buf0)]
- }
- if !bytes.Equal(buf0, dc) {
- if len(dc) > 1024 {
- t.Log(string(dc[:1024]))
- t.Errorf(test.name+"decompressed, got delta: \n(in)\t%02x !=\n(out)\t%02x\n", buf0[:1024], dc[:1024])
- } else {
- t.Log(string(dc))
- t.Errorf(test.name+"decompressed, got delta: (in) %v != (out) %v\n", buf0, dc)
- }
- }
- return
- }
- if !bytes.Equal(buf0, dc) {
- if len(buf0) > 1024 {
- t.Log(string(dc[:1024]))
- } else {
- t.Log(string(dc))
- }
- //t.Errorf(test.name+": decompressed, got delta: \n%s")
- t.Errorf(test.name + ": decompressed, got delta")
- }
- if !t.Failed() {
- t.Log("... roundtrip ok!")
- }
- })
- }
- }
- func TestDecompress4X(t *testing.T) {
- for _, test := range testfiles {
- t.Run(test.name, func(t *testing.T) {
- var s = &Scratch{}
- buf0, err := test.fn()
- if err != nil {
- t.Fatal(err)
- }
- if len(buf0) > BlockSizeMax {
- buf0 = buf0[:BlockSizeMax]
- }
- b, re, err := Compress4X(buf0, s)
- if err != test.err4X {
- t.Errorf("want error %v (%T), got %v (%T)", test.err1X, test.err1X, err, err)
- }
- if err != nil {
- t.Log(test.name, err.Error())
- return
- }
- if b == nil {
- t.Error("got no output")
- return
- }
- if len(s.OutTable) == 0 {
- t.Error("got no table definition")
- }
- if re {
- t.Error("claimed to have re-used.")
- }
- if len(s.OutData) == 0 {
- t.Error("got no data output")
- }
- wantRemain := len(s.OutData)
- t.Logf("%s: %d -> %d bytes (%.2f:1) %t (table: %d bytes)", test.name, len(buf0), len(b), float64(len(buf0))/float64(len(b)), re, len(s.OutTable))
- s.Out = nil
- var remain []byte
- s, remain, err = ReadTable(b, s)
- if err != nil {
- t.Error(err)
- return
- }
- var buf bytes.Buffer
- if s.matches(s.prevTable, &buf); buf.Len() > 0 {
- t.Error(buf.String())
- }
- if len(remain) != wantRemain {
- t.Fatalf("remain mismatch, want %d, got %d bytes", wantRemain, len(remain))
- }
- t.Logf("remain: %d bytes, ok", len(remain))
- dc, err := s.Decompress4X(remain, len(buf0))
- if err != nil {
- t.Error(err)
- return
- }
- if len(buf0) != len(dc) {
- t.Errorf(test.name+"decompressed, want size: %d, got %d", len(buf0), len(dc))
- if len(buf0) > len(dc) {
- buf0 = buf0[:len(dc)]
- } else {
- dc = dc[:len(buf0)]
- }
- if !bytes.Equal(buf0, dc) {
- if len(dc) > 1024 {
- t.Log(string(dc[:1024]))
- t.Errorf(test.name+"decompressed, got delta: \n(in)\t%02x !=\n(out)\t%02x\n", buf0[:1024], dc[:1024])
- } else {
- t.Log(string(dc))
- t.Errorf(test.name+"decompressed, got delta: (in) %v != (out) %v\n", buf0, dc)
- }
- }
- return
- }
- if !bytes.Equal(buf0, dc) {
- if len(buf0) > 1024 {
- t.Log(string(dc[:1024]))
- } else {
- t.Log(string(dc))
- }
- //t.Errorf(test.name+": decompressed, got delta: \n%s")
- t.Errorf(test.name + ": decompressed, got delta")
- }
- if !t.Failed() {
- t.Log("... roundtrip ok!")
- }
- })
- }
- }
- func TestRoundtrip1XFuzz(t *testing.T) {
- for _, test := range testfilesExtended {
- t.Run(test.name, func(t *testing.T) {
- var s = &Scratch{}
- buf0, err := test.fn()
- if err != nil {
- t.Fatal(err)
- }
- if len(buf0) > BlockSizeMax {
- buf0 = buf0[:BlockSizeMax]
- }
- b, re, err := Compress1X(buf0, s)
- if err != nil {
- if err == ErrIncompressible || err == ErrUseRLE || err == ErrTooBig {
- t.Log(test.name, err.Error())
- return
- }
- t.Error(test.name, err.Error())
- return
- }
- if b == nil {
- t.Error("got no output")
- return
- }
- if len(s.OutTable) == 0 {
- t.Error("got no table definition")
- }
- if re {
- t.Error("claimed to have re-used.")
- }
- if len(s.OutData) == 0 {
- t.Error("got no data output")
- }
- wantRemain := len(s.OutData)
- t.Logf("%s: %d -> %d bytes (%.2f:1) %t (table: %d bytes)", test.name, len(buf0), len(b), float64(len(buf0))/float64(len(b)), re, len(s.OutTable))
- s.Out = nil
- var remain []byte
- s, remain, err = ReadTable(b, s)
- if err != nil {
- t.Error(err)
- return
- }
- var buf bytes.Buffer
- if s.matches(s.prevTable, &buf); buf.Len() > 0 {
- t.Error(buf.String())
- }
- if len(remain) != wantRemain {
- t.Fatalf("remain mismatch, want %d, got %d bytes", wantRemain, len(remain))
- }
- t.Logf("remain: %d bytes, ok", len(remain))
- dc, err := s.Decompress1X(remain)
- if err != nil {
- t.Error(err)
- return
- }
- if len(buf0) != len(dc) {
- t.Errorf(test.name+"decompressed, want size: %d, got %d", len(buf0), len(dc))
- if len(buf0) > len(dc) {
- buf0 = buf0[:len(dc)]
- } else {
- dc = dc[:len(buf0)]
- }
- if !bytes.Equal(buf0, dc) {
- if len(dc) > 1024 {
- t.Log(string(dc[:1024]))
- t.Errorf(test.name+"decompressed, got delta: \n(in)\t%02x !=\n(out)\t%02x\n", buf0[:1024], dc[:1024])
- } else {
- t.Log(string(dc))
- t.Errorf(test.name+"decompressed, got delta: (in) %v != (out) %v\n", buf0, dc)
- }
- }
- return
- }
- if !bytes.Equal(buf0, dc) {
- if len(buf0) > 1024 {
- t.Log(string(dc[:1024]))
- } else {
- t.Log(string(dc))
- }
- //t.Errorf(test.name+": decompressed, got delta: \n%s")
- t.Errorf(test.name + ": decompressed, got delta")
- }
- if !t.Failed() {
- t.Log("... roundtrip ok!")
- }
- })
- }
- }
- func TestRoundtrip4XFuzz(t *testing.T) {
- for _, test := range testfilesExtended {
- t.Run(test.name, func(t *testing.T) {
- var s = &Scratch{}
- buf0, err := test.fn()
- if err != nil {
- t.Fatal(err)
- }
- if len(buf0) > BlockSizeMax {
- buf0 = buf0[:BlockSizeMax]
- }
- b, re, err := Compress4X(buf0, s)
- if err != nil {
- if err == ErrIncompressible || err == ErrUseRLE || err == ErrTooBig {
- t.Log(test.name, err.Error())
- return
- }
- t.Error(test.name, err.Error())
- return
- }
- if b == nil {
- t.Error("got no output")
- return
- }
- if len(s.OutTable) == 0 {
- t.Error("got no table definition")
- }
- if re {
- t.Error("claimed to have re-used.")
- }
- if len(s.OutData) == 0 {
- t.Error("got no data output")
- }
- wantRemain := len(s.OutData)
- t.Logf("%s: %d -> %d bytes (%.2f:1) %t (table: %d bytes)", test.name, len(buf0), len(b), float64(len(buf0))/float64(len(b)), re, len(s.OutTable))
- s.Out = nil
- var remain []byte
- s, remain, err = ReadTable(b, s)
- if err != nil {
- t.Error(err)
- return
- }
- var buf bytes.Buffer
- if s.matches(s.prevTable, &buf); buf.Len() > 0 {
- t.Error(buf.String())
- }
- if len(remain) != wantRemain {
- t.Fatalf("remain mismatch, want %d, got %d bytes", wantRemain, len(remain))
- }
- t.Logf("remain: %d bytes, ok", len(remain))
- dc, err := s.Decompress4X(remain, len(buf0))
- if err != nil {
- t.Error(err)
- return
- }
- if len(buf0) != len(dc) {
- t.Errorf(test.name+"decompressed, want size: %d, got %d", len(buf0), len(dc))
- if len(buf0) > len(dc) {
- buf0 = buf0[:len(dc)]
- } else {
- dc = dc[:len(buf0)]
- }
- if !bytes.Equal(buf0, dc) {
- if len(dc) > 1024 {
- t.Log(string(dc[:1024]))
- t.Errorf(test.name+"decompressed, got delta: \n(in)\t%02x !=\n(out)\t%02x\n", buf0[:1024], dc[:1024])
- } else {
- t.Log(string(dc))
- t.Errorf(test.name+"decompressed, got delta: (in) %v != (out) %v\n", buf0, dc)
- }
- }
- return
- }
- if !bytes.Equal(buf0, dc) {
- if len(buf0) > 1024 {
- t.Log(string(dc[:1024]))
- } else {
- t.Log(string(dc))
- }
- //t.Errorf(test.name+": decompressed, got delta: \n%s")
- t.Errorf(test.name + ": decompressed, got delta")
- }
- if !t.Failed() {
- t.Log("... roundtrip ok!")
- }
- })
- }
- }
- func BenchmarkDecompress1XTable(b *testing.B) {
- for _, tt := range testfiles {
- test := tt
- if test.err1X != nil {
- continue
- }
- b.Run(test.name, func(b *testing.B) {
- var s = &Scratch{}
- s.Reuse = ReusePolicyNone
- buf0, err := test.fn()
- if err != nil {
- b.Fatal(err)
- }
- if len(buf0) > BlockSizeMax {
- buf0 = buf0[:BlockSizeMax]
- }
- compressed, _, err := Compress1X(buf0, s)
- if err != test.err1X {
- b.Fatal("unexpected error:", err)
- }
- s.Out = nil
- s, remain, _ := ReadTable(compressed, s)
- s.Decompress1X(remain)
- b.ResetTimer()
- b.ReportAllocs()
- b.SetBytes(int64(len(buf0)))
- for i := 0; i < b.N; i++ {
- s, remain, err := ReadTable(compressed, s)
- if err != nil {
- b.Fatal(err)
- }
- _, err = s.Decompress1X(remain)
- if err != nil {
- b.Fatal(err)
- }
- }
- })
- }
- }
- func BenchmarkDecompress1XNoTable(b *testing.B) {
- for _, tt := range testfiles {
- test := tt
- if test.err1X != nil {
- continue
- }
- b.Run(test.name, func(b *testing.B) {
- var s = &Scratch{}
- s.Reuse = ReusePolicyNone
- buf0, err := test.fn()
- if err != nil {
- b.Fatal(err)
- }
- if len(buf0) > BlockSizeMax {
- buf0 = buf0[:BlockSizeMax]
- }
- compressed, _, err := Compress1X(buf0, s)
- if err != test.err1X {
- b.Fatal("unexpected error:", err)
- }
- s.Out = nil
- s, remain, _ := ReadTable(compressed, s)
- s.Decompress1X(remain)
- b.ResetTimer()
- b.ReportAllocs()
- b.SetBytes(int64(len(buf0)))
- for i := 0; i < b.N; i++ {
- _, err = s.Decompress1X(remain)
- if err != nil {
- b.Fatal(err)
- }
- }
- })
- }
- }
- func BenchmarkDecompress4XNoTable(b *testing.B) {
- for _, tt := range testfiles {
- test := tt
- if test.err4X != nil {
- continue
- }
- b.Run(test.name, func(b *testing.B) {
- var s = &Scratch{}
- s.Reuse = ReusePolicyNone
- buf0, err := test.fn()
- if err != nil {
- b.Fatal(err)
- }
- if len(buf0) > BlockSizeMax {
- buf0 = buf0[:BlockSizeMax]
- }
- compressed, _, err := Compress4X(buf0, s)
- if err != test.err1X {
- b.Fatal("unexpected error:", err)
- }
- s.Out = nil
- s, remain, _ := ReadTable(compressed, s)
- s.Decompress4X(remain, len(buf0))
- b.ResetTimer()
- b.ReportAllocs()
- b.SetBytes(int64(len(buf0)))
- for i := 0; i < b.N; i++ {
- _, err = s.Decompress4X(remain, len(buf0))
- if err != nil {
- b.Fatal(err)
- }
- }
- })
- }
- }
- func BenchmarkDecompress4XTable(b *testing.B) {
- for _, tt := range testfiles {
- test := tt
- if test.err4X != nil {
- continue
- }
- b.Run(test.name, func(b *testing.B) {
- var s = &Scratch{}
- s.Reuse = ReusePolicyNone
- buf0, err := test.fn()
- if err != nil {
- b.Fatal(err)
- }
- if len(buf0) > BlockSizeMax {
- buf0 = buf0[:BlockSizeMax]
- }
- compressed, _, err := Compress4X(buf0, s)
- if err != test.err1X {
- b.Fatal("unexpected error:", err)
- }
- s.Out = nil
- b.ResetTimer()
- b.ReportAllocs()
- b.SetBytes(int64(len(buf0)))
- for i := 0; i < b.N; i++ {
- s, remain, err := ReadTable(compressed, s)
- if err != nil {
- b.Fatal(err)
- }
- _, err = s.Decompress4X(remain, len(buf0))
- if err != nil {
- b.Fatal(err)
- }
- }
- })
- }
- }
|