diff --git a/go.mod b/go.mod index db87e67..b54f409 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,11 @@ require ( require ( github.com/avast/retry-go v3.0.0+incompatible // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dsnet/compress v0.0.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/testify v1.8.4 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect go.uber.org/multierr v1.10.0 // indirect golang.org/x/net v0.8.0 // indirect diff --git a/go.sum b/go.sum index f8f0867..6bcc01a 100644 --- a/go.sum +++ b/go.sum @@ -9,14 +9,19 @@ github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= +github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= +github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/go-http-utils/headers v0.0.0-20181008091004-fed159eddc2a h1:v6zMvHuY9yue4+QkG/HQ/W67wvtQmWJ4SDo9aK/GIno= github.com/go-http-utils/headers v0.0.0-20181008091004-fed159eddc2a/go.mod h1:I79BieaU4fxrw4LMXby6q5OS9XnoR9UIKLOzDFjUmuw= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= @@ -24,9 +29,15 @@ github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfm github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= diff --git a/next/assets/extract.go b/next/assets/extract.go index 28391d3..c00f804 100644 --- a/next/assets/extract.go +++ b/next/assets/extract.go @@ -28,7 +28,7 @@ func gzipExtract(data []byte) ([]byte, error) { defer reader.Close() var buffer bytes.Buffer - size, err := io.Copy(&buffer, reader) + size, err := reader.WriteTo(&buffer) if err != nil { logger.Errorf("Failed to handle gzip archive -> %v", err) return nil, err diff --git a/next/assets/extract_test.go b/next/assets/extract_test.go new file mode 100644 index 0000000..ff5afd7 --- /dev/null +++ b/next/assets/extract_test.go @@ -0,0 +1,107 @@ +package assets + +import ( + "bytes" + "compress/gzip" + "crypto/rand" + "github.com/dsnet/compress/bzip2" + "github.com/stretchr/testify/assert" + "github.com/ulikunitz/xz" + mrand "math/rand" + "testing" +) + +const testMin = 1024 * 1024 // 1MiB +const testMax = 4096 * 1024 // 4Mib + +func randBytes(size int) []byte { + tmp := make([]byte, size) + _, _ = rand.Read(tmp) + return tmp +} + +func randInt(min int, max int) int { + return min + int(mrand.Float64()*float64(max-min)) +} + +func gzipCompress(data []byte) []byte { + buf := bytes.Buffer{} + gw := gzip.NewWriter(&buf) + _, _ = gw.Write(data) + _ = gw.Close() + return buf.Bytes() +} + +func bzip2Compress(data []byte) []byte { + buf := bytes.Buffer{} + bw, _ := bzip2.NewWriter(&buf, &bzip2.WriterConfig{ + Level: bzip2.DefaultCompression, + }) + _, _ = bw.Write(data) + _ = bw.Close() + return buf.Bytes() +} + +func xzCompress(data []byte) []byte { + buf := bytes.Buffer{} + xw, _ := xz.NewWriter(&buf) + _, _ = xw.Write(data) + _ = xw.Close() + return buf.Bytes() +} + +func TestGzipExtract(t *testing.T) { + raw := randBytes(randInt(testMin, testMax)) + gzOk := gzipCompress(raw) + gzErr := append(gzOk, randBytes(randInt(1, 16))...) + + ret, err := gzipExtract(gzOk) + assert.Nil(t, err) + assert.Equal(t, raw, ret) + _, err = gzipExtract(gzErr) + assert.NotNil(t, err) +} + +func TestBzip2Extract(t *testing.T) { + raw := randBytes(randInt(testMin, testMax)) + bz2Ok := bzip2Compress(raw) + bz2Err := append(bz2Ok, randBytes(randInt(1, 16))...) + + ret, err := bzip2Extract(bz2Ok) + assert.Nil(t, err) + assert.Equal(t, raw, ret) + _, err = bzip2Extract(bz2Err) + assert.NotNil(t, err) +} + +func TestXzExtract(t *testing.T) { + raw := randBytes(randInt(testMin, testMax)) + xzOk := xzCompress(raw) + xzErr := append(xzOk, randBytes(randInt(1, 16))...) + + ret, err := xzExtract(xzOk) + assert.Nil(t, err) + assert.Equal(t, raw, ret) + _, err = xzExtract(xzErr) + assert.NotNil(t, err) +} + +func TestExtract(t *testing.T) { + raw := randBytes(randInt(testMin, testMax)) + + ret, err := tryExtract(raw) + assert.Nil(t, err) + assert.Equal(t, raw, ret) + + ret, err = tryExtract(gzipCompress(raw)) + assert.Nil(t, err) + assert.Equal(t, raw, ret) + + ret, err = tryExtract(bzip2Compress(raw)) + assert.Nil(t, err) + assert.Equal(t, raw, ret) + + ret, err = tryExtract(xzCompress(raw)) + assert.Nil(t, err) + assert.Equal(t, raw, ret) +}