| // Copyright 2021 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package jpeg | |
| import ( | |
| "bytes" | |
| "image" | |
| "os" | |
| "path/filepath" | |
| "strings" | |
| "testing" | |
| ) | |
| func FuzzDecode(f *testing.F) { | |
| testdata, err := os.ReadDir("../testdata") | |
| if err != nil { | |
| f.Fatalf("failed to read testdata directory: %s", err) | |
| } | |
| for _, de := range testdata { | |
| if de.IsDir() || !strings.HasSuffix(de.Name(), ".jpeg") { | |
| continue | |
| } | |
| b, err := os.ReadFile(filepath.Join("../testdata", de.Name())) | |
| if err != nil { | |
| f.Fatalf("failed to read testdata: %s", err) | |
| } | |
| f.Add(b) | |
| } | |
| f.Fuzz(func(t *testing.T, b []byte) { | |
| cfg, _, err := image.DecodeConfig(bytes.NewReader(b)) | |
| if err != nil { | |
| return | |
| } | |
| if cfg.Width*cfg.Height > 1e6 { | |
| return | |
| } | |
| img, typ, err := image.Decode(bytes.NewReader(b)) | |
| if err != nil || typ != "jpeg" { | |
| return | |
| } | |
| for q := 1; q <= 100; q++ { | |
| var w bytes.Buffer | |
| err := Encode(&w, img, &Options{Quality: q}) | |
| if err != nil { | |
| t.Fatalf("failed to encode valid image: %s", err) | |
| } | |
| img1, err := Decode(&w) | |
| if err != nil { | |
| t.Fatalf("failed to decode roundtripped image: %s", err) | |
| } | |
| got := img1.Bounds() | |
| want := img.Bounds() | |
| if !got.Eq(want) { | |
| t.Fatalf("roundtripped image bounds have changed, got: %s, want: %s", got, want) | |
| } | |
| } | |
| }) | |
| } |