mirror of https://github.com/certusone/wasmd.git
104 lines
2.4 KiB
Go
104 lines
2.4 KiB
Go
package keeper
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/gzip"
|
|
"errors"
|
|
"io"
|
|
"io/ioutil"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/CosmWasm/wasmd/x/wasm/types"
|
|
)
|
|
|
|
func TestUncompress(t *testing.T) {
|
|
wasmRaw, err := ioutil.ReadFile("./testdata/hackatom.wasm")
|
|
require.NoError(t, err)
|
|
|
|
wasmGzipped, err := ioutil.ReadFile("./testdata/hackatom.wasm.gzip")
|
|
require.NoError(t, err)
|
|
|
|
const maxSize = 400_000
|
|
|
|
specs := map[string]struct {
|
|
src []byte
|
|
expError error
|
|
expResult []byte
|
|
}{
|
|
"handle wasm uncompressed": {
|
|
src: wasmRaw,
|
|
expResult: wasmRaw,
|
|
},
|
|
"handle wasm compressed": {
|
|
src: wasmGzipped,
|
|
expResult: wasmRaw,
|
|
},
|
|
"handle nil slice": {
|
|
src: nil,
|
|
expResult: nil,
|
|
},
|
|
"handle short unidentified": {
|
|
src: []byte{0x1, 0x2},
|
|
expResult: []byte{0x1, 0x2},
|
|
},
|
|
"handle input slice exceeding limit": {
|
|
src: []byte(strings.Repeat("a", maxSize+1)),
|
|
expError: types.ErrLimit,
|
|
},
|
|
"handle input slice at limit": {
|
|
src: []byte(strings.Repeat("a", maxSize)),
|
|
expResult: []byte(strings.Repeat("a", maxSize)),
|
|
},
|
|
"handle gzip identifier only": {
|
|
src: gzipIdent,
|
|
expError: io.ErrUnexpectedEOF,
|
|
},
|
|
"handle broken gzip": {
|
|
src: append(gzipIdent, byte(0x1)),
|
|
expError: io.ErrUnexpectedEOF,
|
|
},
|
|
"handle incomplete gzip": {
|
|
src: wasmGzipped[:len(wasmGzipped)-5],
|
|
expError: io.ErrUnexpectedEOF,
|
|
},
|
|
"handle limit gzip output": {
|
|
src: asGzip(bytes.Repeat([]byte{0x1}, maxSize)),
|
|
expResult: bytes.Repeat([]byte{0x1}, maxSize),
|
|
},
|
|
"handle big gzip output": {
|
|
src: asGzip(bytes.Repeat([]byte{0x1}, maxSize+1)),
|
|
expError: types.ErrLimit,
|
|
},
|
|
"handle other big gzip output": {
|
|
src: asGzip(bytes.Repeat([]byte{0x1}, 2*maxSize)),
|
|
expError: types.ErrLimit,
|
|
},
|
|
}
|
|
for msg, spec := range specs {
|
|
t.Run(msg, func(t *testing.T) {
|
|
r, err := uncompress(spec.src, maxSize)
|
|
require.True(t, errors.Is(spec.expError, err), "exp %v got %+v", spec.expError, err)
|
|
if spec.expError != nil {
|
|
return
|
|
}
|
|
assert.Equal(t, spec.expResult, r)
|
|
})
|
|
}
|
|
}
|
|
|
|
func asGzip(src []byte) []byte {
|
|
var buf bytes.Buffer
|
|
zipper := gzip.NewWriter(&buf)
|
|
if _, err := io.Copy(zipper, bytes.NewReader(src)); err != nil {
|
|
panic(err)
|
|
}
|
|
if err := zipper.Close(); err != nil {
|
|
panic(err)
|
|
}
|
|
return buf.Bytes()
|
|
}
|