From b7cd88744cb38230c66a6c2f5628822411e72fd6 Mon Sep 17 00:00:00 2001 From: Samuel Hawksby-Robinson Date: Thu, 8 Oct 2020 14:59:03 +0100 Subject: [PATCH] Implemented better images.Get() and added better tests --- _assets/tests/elephant.jpg | Bin 0 -> 979 bytes _assets/tests/rose.webp | Bin 0 -> 18840 bytes _assets/tests/spin.gif | Bin 0 -> 8463 bytes _assets/tests/status.png | Bin 0 -> 9398 bytes images/files.go | 49 +++++++++++++++-------- images/files_test.go | 79 +++++++++++++++++++++++++++++++++++++ 6 files changed, 112 insertions(+), 16 deletions(-) create mode 100644 _assets/tests/elephant.jpg create mode 100644 _assets/tests/rose.webp create mode 100644 _assets/tests/spin.gif create mode 100644 _assets/tests/status.png create mode 100644 images/files_test.go diff --git a/_assets/tests/elephant.jpg b/_assets/tests/elephant.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8dfd44d177d8023f478d961345d903000362f216 GIT binary patch literal 979 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 literal 0 HcmV?d00001 diff --git a/_assets/tests/spin.gif b/_assets/tests/spin.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ca5fb82b7a1ccdcbc6082968713b68391f49d79 GIT binary patch literal 8463 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 literal 0 HcmV?d00001 diff --git a/_assets/tests/status.png b/_assets/tests/status.png new file mode 100644 index 0000000000000000000000000000000000000000..3c511b7a11b85193dca1e715d55bf77b21fc3948 GIT binary patch literal 9398 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 literal 0 HcmV?d00001 diff --git a/images/files.go b/images/files.go index d5842266d..e9540d06f 100644 --- a/images/files.go +++ b/images/files.go @@ -7,7 +7,6 @@ import ( "image/jpeg" "image/png" "io" - "net/http" "os" "golang.org/x/image/webp" @@ -20,27 +19,45 @@ func Get(fileName string) (image.Image, error) { } defer file.Close() - fb := make([]byte, 12) - file.Read(fb) - ft := GetFileType(fb) - if ft == UNKNOWN { - return nil, errors.New("unsupported file type") + fb, err := prepareFileForDecode(file) + if err != nil { + return nil, err } - var img image.Image - switch ft { + return decodeImageData(fb, file) +} + +func prepareFileForDecode(file *os.File) ([]byte, error) { + // Read the first 14 bytes, used for performing image type checks before parsing the image data + fb := make([]byte, 14) + _, err := file.Read(fb) + if err != nil { + return nil, err + } + + // Reset the read cursor + _, err = file.Seek(0, 0) + if err != nil { + return nil, err + } + + return fb, nil +} + +func decodeImageData(buf []byte, r io.Reader) (img image.Image, err error) { + switch GetFileType(buf) { case JPEG: - img, err = jpeg.Decode(file) - break + img, err = jpeg.Decode(r) case PNG: - img, err = png.Decode(file) - break + img, err = png.Decode(r) case GIF: - img, err = gif.Decode(file) - break + img, err = gif.Decode(r) case WEBP: - img, err = webp.Decode(file) - break + img, err = webp.Decode(r) + case UNKNOWN: + fallthrough + default: + return nil, errors.New("unsupported file type") } if err != nil { return nil, err diff --git a/images/files_test.go b/images/files_test.go new file mode 100644 index 000000000..89dd3acf9 --- /dev/null +++ b/images/files_test.go @@ -0,0 +1,79 @@ +package images + +import ( + "github.com/stretchr/testify/require" + "image" + "testing" +) + +func TestGet(t *testing.T) { + + cs := []struct{ + Filepath string + Error bool + Nil bool + Bounds image.Rectangle + }{ + { + "../_assets/tests/elephant.jpg", + false, + false, + image.Rectangle{ + Min: image.Point{X: 0, Y: 0}, + Max: image.Point{X: 80, Y: 80}, + }, + }, + { + "../_assets/tests/status.png", + false, + false, + image.Rectangle{ + Min: image.Point{X: 0, Y: 0}, + Max: image.Point{X: 256, Y: 256}, + }, + }, + { + "../_assets/tests/spin.gif", + false, + false, + image.Rectangle{ + Min: image.Point{X: 0, Y: 0}, + Max: image.Point{X: 256, Y: 256}, + }, + }, + { + "../_assets/tests/rose.webp", + false, + false, + image.Rectangle{ + Min: image.Point{X: 0, Y: 0}, + Max: image.Point{X: 400, Y: 301}, + }, + }, + { + "../_assets/tests/test.aac", + true, + true, + image.Rectangle{}, + }, + } + + for _, test := range cs { + img, err := Get(test.Filepath) + + if test.Error { + require.Error(t, err) + } else { + require.NoError(t, err) + } + + if test.Nil { + require.Nil(t, img) + continue + } else { + require.NotNil(t, img) + } + + require.Exactly(t, test.Bounds, img.Bounds()) + } +}