go-libwebp

Experimental translation from libwebp to Go source.
Log | Files | Refs | README | LICENSE

commit 515e5ffe955010e2d37bd28886d73f12ae59cc57
parent 9881b32bd1cda8b6dac428b03eadedeb276baadf
Author: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Date:   Thu, 19 Oct 2023 16:45:45 +0800

webp/encode: fuzz test

Signed-off-by: Jack Mordaunt <jackmordaunt.dev@gmail.com>

Diffstat:
Mwebp/encode.go | 6++++++
Mwebp/webp_test.go | 29+++++++++++++++++++++++++++++
2 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/webp/encode.go b/webp/encode.go @@ -24,6 +24,12 @@ type EncodeOption func(*Encoder) // Quality in the range (0,1]. func Quality(q float32) EncodeOption { + if q <= 0 { + q = 0.1 + } + if q > 1 { + q = 1 + } return func(enc *Encoder) { enc.Quality = q } diff --git a/webp/webp_test.go b/webp/webp_test.go @@ -3,6 +3,8 @@ package webp import ( "bytes" _ "embed" + "image" + "image/color" "image/png" "os" "path/filepath" @@ -40,3 +42,30 @@ func TestSmoke(t *testing.T) { t.Fatalf("decoding webp: %v", err) } } + +func FuzzEncode(f *testing.F) { + f.Add(uint16(0), uint16(0), uint16(0), uint16(0), uint8(0), uint8(0), uint8(0), uint8(0), float32(0)) + f.Add(uint16(0), uint16(0), uint16(1), uint16(1), uint8(1), uint8(1), uint8(1), uint8(1), float32(1)) + f.Add(uint16(0), uint16(0), uint16(1), uint16(1), uint8(1), uint8(1), uint8(1), uint8(1), float32(0.5)) + f.Add(uint16(0), uint16(0), uint16(100), uint16(100), uint8(100), uint8(50), uint8(50), uint8(50), float32(0.75)) + f.Fuzz(func(t *testing.T, x0, y0, x1, y1 uint16, r, g, b, a uint8, quality float32) { + m := image.NewNRGBA(image.Rect(int(x0), int(y0), int(x1), int(y1))) + for x := x0; x < x1; x += 1 { + for y := y0; y < y1; y += 1 { + m.Set(int(x), int(y), color.RGBA{R: r, G: g, B: b, A: a}) + } + } + if quality <= 0 || quality > 1 { + t.Skip() + return + } + if int(x1)-int(x0) <= 0 || int(y1)-int(y0) <= 0 { + t.Skip() + return + } + buf := bytes.NewBuffer(nil) + if err := Encode(buf, m, Quality(quality)); err != nil { + t.Errorf("error: %v (x0: %d, y0: %d, x1: %d, y1: %d) (r: %d, g: %d, b: %d, a: %d)", err, x0, y0, x1, y1, r, g, b, a) + } + }) +}