mirror of
https://github.com/pocket-id/pocket-id.git
synced 2026-09-16 16:09:04 +02:00
59 lines
1.6 KiB
Go
59 lines
1.6 KiB
Go
package profilepicture
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"hash/crc32"
|
|
"image"
|
|
"image/png"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestCreateProfilePictureRejectsOversizedPixelCountBeforeDecode(t *testing.T) {
|
|
_, err := CreateProfilePicture(bytes.NewReader(pngHeaderWithDimensions(12_000, 12_000)))
|
|
|
|
require.ErrorIs(t, err, ErrInvalidImage)
|
|
require.ErrorIs(t, err, errImageDimensionsTooLarge)
|
|
}
|
|
|
|
func TestCreateProfilePictureAcceptsImageWithinLimits(t *testing.T) {
|
|
var input bytes.Buffer
|
|
require.NoError(t, png.Encode(&input, image.NewNRGBA(image.Rect(0, 0, 400, 300))))
|
|
|
|
output, err := CreateProfilePicture(bytes.NewReader(input.Bytes()))
|
|
require.NoError(t, err)
|
|
|
|
config, format, err := image.DecodeConfig(output)
|
|
require.NoError(t, err)
|
|
require.Equal(t, "png", format)
|
|
require.Equal(t, 300, config.Width)
|
|
require.Equal(t, 300, config.Height)
|
|
}
|
|
|
|
func TestStripMetadataRejectsOversizedPixelCount(t *testing.T) {
|
|
_, err := StripMetadata(bytes.NewReader(pngHeaderWithDimensions(12_000, 12_000)), "png")
|
|
|
|
require.ErrorIs(t, err, ErrInvalidImage)
|
|
require.ErrorIs(t, err, errImageDimensionsTooLarge)
|
|
}
|
|
|
|
func pngHeaderWithDimensions(width, height uint32) []byte {
|
|
var out bytes.Buffer
|
|
out.Write([]byte("\x89PNG\r\n\x1a\n"))
|
|
|
|
const headerLength = 13
|
|
data := make([]byte, headerLength)
|
|
binary.BigEndian.PutUint32(data[0:4], width)
|
|
binary.BigEndian.PutUint32(data[4:8], height)
|
|
data[8] = 8
|
|
|
|
_ = binary.Write(&out, binary.BigEndian, uint32(headerLength))
|
|
out.WriteString("IHDR")
|
|
out.Write(data)
|
|
_ = binary.Write(&out, binary.BigEndian, crc32.ChecksumIEEE(append([]byte("IHDR"), data...)))
|
|
|
|
return out.Bytes()
|
|
}
|