mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-25 17:36:18 +03:00
Merge branch 'main' into test_font_leaks
This commit is contained in:
commit
5709ffe5da
|
@ -1,13 +1,13 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from pathlib import PosixPath
|
from pathlib import Path
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
|
|
||||||
def test_j2k_overflow(tmp_path: PosixPath) -> None:
|
def test_j2k_overflow(tmp_path: Path) -> None:
|
||||||
im = Image.new("RGBA", (1024, 131584))
|
im = Image.new("RGBA", (1024, 131584))
|
||||||
target = str(tmp_path / "temp.jpc")
|
target = str(tmp_path / "temp.jpc")
|
||||||
with pytest.raises(OSError):
|
with pytest.raises(OSError):
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
from pathlib import PosixPath
|
from pathlib import Path
|
||||||
from types import ModuleType
|
from types import ModuleType
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -31,18 +31,18 @@ XDIM = 48000
|
||||||
pytestmark = pytest.mark.skipif(sys.maxsize <= 2**32, reason="requires 64-bit system")
|
pytestmark = pytest.mark.skipif(sys.maxsize <= 2**32, reason="requires 64-bit system")
|
||||||
|
|
||||||
|
|
||||||
def _write_png(tmp_path: PosixPath, xdim: int, ydim: int) -> None:
|
def _write_png(tmp_path: Path, xdim: int, ydim: int) -> None:
|
||||||
f = str(tmp_path / "temp.png")
|
f = str(tmp_path / "temp.png")
|
||||||
im = Image.new("L", (xdim, ydim), 0)
|
im = Image.new("L", (xdim, ydim), 0)
|
||||||
im.save(f)
|
im.save(f)
|
||||||
|
|
||||||
|
|
||||||
def test_large(tmp_path: PosixPath) -> None:
|
def test_large(tmp_path: Path) -> None:
|
||||||
"""succeeded prepatch"""
|
"""succeeded prepatch"""
|
||||||
_write_png(tmp_path, XDIM, YDIM)
|
_write_png(tmp_path, XDIM, YDIM)
|
||||||
|
|
||||||
|
|
||||||
def test_2gpx(tmp_path: PosixPath) -> None:
|
def test_2gpx(tmp_path: Path) -> None:
|
||||||
"""failed prepatch"""
|
"""failed prepatch"""
|
||||||
_write_png(tmp_path, XDIM, XDIM)
|
_write_png(tmp_path, XDIM, XDIM)
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
from pathlib import PosixPath
|
from pathlib import Path
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ XDIM = 48000
|
||||||
pytestmark = pytest.mark.skipif(sys.maxsize <= 2**32, reason="requires 64-bit system")
|
pytestmark = pytest.mark.skipif(sys.maxsize <= 2**32, reason="requires 64-bit system")
|
||||||
|
|
||||||
|
|
||||||
def _write_png(tmp_path: PosixPath, xdim: int, ydim: int) -> None:
|
def _write_png(tmp_path: Path, xdim: int, ydim: int) -> None:
|
||||||
dtype = np.uint8
|
dtype = np.uint8
|
||||||
a = np.zeros((xdim, ydim), dtype=dtype)
|
a = np.zeros((xdim, ydim), dtype=dtype)
|
||||||
f = str(tmp_path / "temp.png")
|
f = str(tmp_path / "temp.png")
|
||||||
|
@ -33,11 +33,11 @@ def _write_png(tmp_path: PosixPath, xdim: int, ydim: int) -> None:
|
||||||
im.save(f)
|
im.save(f)
|
||||||
|
|
||||||
|
|
||||||
def test_large(tmp_path: PosixPath) -> None:
|
def test_large(tmp_path: Path) -> None:
|
||||||
"""succeeded prepatch"""
|
"""succeeded prepatch"""
|
||||||
_write_png(tmp_path, XDIM, YDIM)
|
_write_png(tmp_path, XDIM, YDIM)
|
||||||
|
|
||||||
|
|
||||||
def test_2gpx(tmp_path: PosixPath) -> None:
|
def test_2gpx(tmp_path: Path) -> None:
|
||||||
"""failed prepatch"""
|
"""failed prepatch"""
|
||||||
_write_png(tmp_path, XDIM, XDIM)
|
_write_png(tmp_path, XDIM, XDIM)
|
||||||
|
|
|
@ -7,7 +7,7 @@ from PIL import BdfFontFile, FontFile
|
||||||
filename = "Tests/images/courB08.bdf"
|
filename = "Tests/images/courB08.bdf"
|
||||||
|
|
||||||
|
|
||||||
def test_sanity():
|
def test_sanity() -> None:
|
||||||
with open(filename, "rb") as test_file:
|
with open(filename, "rb") as test_file:
|
||||||
font = BdfFontFile.BdfFontFile(test_file)
|
font = BdfFontFile.BdfFontFile(test_file)
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ def test_sanity():
|
||||||
assert len([_f for _f in font.glyph if _f]) == 190
|
assert len([_f for _f in font.glyph if _f]) == 190
|
||||||
|
|
||||||
|
|
||||||
def test_invalid_file():
|
def test_invalid_file() -> None:
|
||||||
with open("Tests/images/flower.jpg", "rb") as fp:
|
with open("Tests/images/flower.jpg", "rb") as fp:
|
||||||
with pytest.raises(SyntaxError):
|
with pytest.raises(SyntaxError):
|
||||||
BdfFontFile.BdfFontFile(fp)
|
BdfFontFile.BdfFontFile(fp)
|
||||||
|
|
|
@ -8,7 +8,7 @@ from .helper import skip_unless_feature
|
||||||
|
|
||||||
|
|
||||||
class TestFontCrash:
|
class TestFontCrash:
|
||||||
def _fuzz_font(self, font):
|
def _fuzz_font(self, font: ImageFont.FreeTypeFont) -> None:
|
||||||
# from fuzzers.fuzz_font
|
# from fuzzers.fuzz_font
|
||||||
font.getbbox("ABC")
|
font.getbbox("ABC")
|
||||||
font.getmask("test text")
|
font.getmask("test text")
|
||||||
|
@ -18,7 +18,7 @@ class TestFontCrash:
|
||||||
draw.text((10, 10), "Test Text", font=font, fill="#000")
|
draw.text((10, 10), "Test Text", font=font, fill="#000")
|
||||||
|
|
||||||
@skip_unless_feature("freetype2")
|
@skip_unless_feature("freetype2")
|
||||||
def test_segfault(self):
|
def test_segfault(self) -> None:
|
||||||
with pytest.raises(OSError):
|
with pytest.raises(OSError):
|
||||||
font = ImageFont.truetype("Tests/fonts/fuzz_font-5203009437302784")
|
font = ImageFont.truetype("Tests/fonts/fuzz_font-5203009437302784")
|
||||||
self._fuzz_font(font)
|
self._fuzz_font(font)
|
||||||
|
|
|
@ -12,7 +12,7 @@ class TestTTypeFontLeak(PillowLeakTestCase):
|
||||||
iterations = 10
|
iterations = 10
|
||||||
mem_limit = 4096 # k
|
mem_limit = 4096 # k
|
||||||
|
|
||||||
def _test_font(self, font):
|
def _test_font(self, font: ImageFont.FreeTypeFont) -> None:
|
||||||
im = Image.new("RGB", (255, 255), "white")
|
im = Image.new("RGB", (255, 255), "white")
|
||||||
draw = ImageDraw.ImageDraw(im)
|
draw = ImageDraw.ImageDraw(im)
|
||||||
self._test_leak(
|
self._test_leak(
|
||||||
|
@ -22,7 +22,7 @@ class TestTTypeFontLeak(PillowLeakTestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
@skip_unless_feature("freetype2")
|
@skip_unless_feature("freetype2")
|
||||||
def test_leak(self):
|
def test_leak(self) -> None:
|
||||||
ttype = ImageFont.truetype("Tests/fonts/FreeMono.ttf", 20)
|
ttype = ImageFont.truetype("Tests/fonts/FreeMono.ttf", 20)
|
||||||
self._test_font(ttype)
|
self._test_font(ttype)
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ class TestDefaultFontLeak(TestTTypeFontLeak):
|
||||||
iterations = 100
|
iterations = 100
|
||||||
mem_limit = 1024 # k
|
mem_limit = 1024 # k
|
||||||
|
|
||||||
def test_leak(self):
|
def test_leak(self) -> None:
|
||||||
if features.check_module("freetype2"):
|
if features.check_module("freetype2"):
|
||||||
ImageFont.core = _util.DeferredError(ImportError)
|
ImageFont.core = _util.DeferredError(ImportError)
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
@ -20,7 +21,7 @@ message = "hello, world"
|
||||||
pytestmark = skip_unless_feature("zlib")
|
pytestmark = skip_unless_feature("zlib")
|
||||||
|
|
||||||
|
|
||||||
def save_font(request, tmp_path):
|
def save_font(request: pytest.FixtureRequest, tmp_path: Path) -> str:
|
||||||
with open(fontname, "rb") as test_file:
|
with open(fontname, "rb") as test_file:
|
||||||
font = PcfFontFile.PcfFontFile(test_file)
|
font = PcfFontFile.PcfFontFile(test_file)
|
||||||
assert isinstance(font, FontFile.FontFile)
|
assert isinstance(font, FontFile.FontFile)
|
||||||
|
@ -29,7 +30,7 @@ def save_font(request, tmp_path):
|
||||||
|
|
||||||
tempname = str(tmp_path / "temp.pil")
|
tempname = str(tmp_path / "temp.pil")
|
||||||
|
|
||||||
def delete_tempfile():
|
def delete_tempfile() -> None:
|
||||||
try:
|
try:
|
||||||
os.remove(tempname[:-4] + ".pbm")
|
os.remove(tempname[:-4] + ".pbm")
|
||||||
except OSError:
|
except OSError:
|
||||||
|
@ -47,11 +48,11 @@ def save_font(request, tmp_path):
|
||||||
return tempname
|
return tempname
|
||||||
|
|
||||||
|
|
||||||
def test_sanity(request, tmp_path):
|
def test_sanity(request: pytest.FixtureRequest, tmp_path: Path) -> None:
|
||||||
save_font(request, tmp_path)
|
save_font(request, tmp_path)
|
||||||
|
|
||||||
|
|
||||||
def test_less_than_256_characters():
|
def test_less_than_256_characters() -> None:
|
||||||
with open("Tests/fonts/10x20-ISO8859-1-fewer-characters.pcf", "rb") as test_file:
|
with open("Tests/fonts/10x20-ISO8859-1-fewer-characters.pcf", "rb") as test_file:
|
||||||
font = PcfFontFile.PcfFontFile(test_file)
|
font = PcfFontFile.PcfFontFile(test_file)
|
||||||
assert isinstance(font, FontFile.FontFile)
|
assert isinstance(font, FontFile.FontFile)
|
||||||
|
@ -59,13 +60,13 @@ def test_less_than_256_characters():
|
||||||
assert len([_f for _f in font.glyph if _f]) == 127
|
assert len([_f for _f in font.glyph if _f]) == 127
|
||||||
|
|
||||||
|
|
||||||
def test_invalid_file():
|
def test_invalid_file() -> None:
|
||||||
with open("Tests/images/flower.jpg", "rb") as fp:
|
with open("Tests/images/flower.jpg", "rb") as fp:
|
||||||
with pytest.raises(SyntaxError):
|
with pytest.raises(SyntaxError):
|
||||||
PcfFontFile.PcfFontFile(fp)
|
PcfFontFile.PcfFontFile(fp)
|
||||||
|
|
||||||
|
|
||||||
def test_draw(request, tmp_path):
|
def test_draw(request: pytest.FixtureRequest, tmp_path: Path) -> None:
|
||||||
tempname = save_font(request, tmp_path)
|
tempname = save_font(request, tmp_path)
|
||||||
font = ImageFont.load(tempname)
|
font = ImageFont.load(tempname)
|
||||||
im = Image.new("L", (130, 30), "white")
|
im = Image.new("L", (130, 30), "white")
|
||||||
|
@ -74,7 +75,7 @@ def test_draw(request, tmp_path):
|
||||||
assert_image_similar_tofile(im, "Tests/images/test_draw_pbm_target.png", 0)
|
assert_image_similar_tofile(im, "Tests/images/test_draw_pbm_target.png", 0)
|
||||||
|
|
||||||
|
|
||||||
def test_textsize(request, tmp_path):
|
def test_textsize(request: pytest.FixtureRequest, tmp_path: Path) -> None:
|
||||||
tempname = save_font(request, tmp_path)
|
tempname = save_font(request, tmp_path)
|
||||||
font = ImageFont.load(tempname)
|
font = ImageFont.load(tempname)
|
||||||
for i in range(255):
|
for i in range(255):
|
||||||
|
@ -90,7 +91,9 @@ def test_textsize(request, tmp_path):
|
||||||
assert font.getbbox(msg) == (0, 0, len(msg) * 10, 20)
|
assert font.getbbox(msg) == (0, 0, len(msg) * 10, 20)
|
||||||
|
|
||||||
|
|
||||||
def _test_high_characters(request, tmp_path, message):
|
def _test_high_characters(
|
||||||
|
request: pytest.FixtureRequest, tmp_path: Path, message: str | bytes
|
||||||
|
) -> None:
|
||||||
tempname = save_font(request, tmp_path)
|
tempname = save_font(request, tmp_path)
|
||||||
font = ImageFont.load(tempname)
|
font = ImageFont.load(tempname)
|
||||||
im = Image.new("L", (750, 30), "white")
|
im = Image.new("L", (750, 30), "white")
|
||||||
|
@ -99,7 +102,7 @@ def _test_high_characters(request, tmp_path, message):
|
||||||
assert_image_similar_tofile(im, "Tests/images/high_ascii_chars.png", 0)
|
assert_image_similar_tofile(im, "Tests/images/high_ascii_chars.png", 0)
|
||||||
|
|
||||||
|
|
||||||
def test_high_characters(request, tmp_path):
|
def test_high_characters(request: pytest.FixtureRequest, tmp_path: Path) -> None:
|
||||||
message = "".join(chr(i + 1) for i in range(140, 232))
|
message = "".join(chr(i + 1) for i in range(140, 232))
|
||||||
_test_high_characters(request, tmp_path, message)
|
_test_high_characters(request, tmp_path, message)
|
||||||
# accept bytes instances.
|
# accept bytes instances.
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import TypedDict
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
@ -14,7 +16,14 @@ from .helper import (
|
||||||
|
|
||||||
fontname = "Tests/fonts/ter-x20b.pcf"
|
fontname = "Tests/fonts/ter-x20b.pcf"
|
||||||
|
|
||||||
charsets = {
|
|
||||||
|
class Charset(TypedDict):
|
||||||
|
glyph_count: int
|
||||||
|
message: str
|
||||||
|
image1: str
|
||||||
|
|
||||||
|
|
||||||
|
charsets: dict[str, Charset] = {
|
||||||
"iso8859-1": {
|
"iso8859-1": {
|
||||||
"glyph_count": 223,
|
"glyph_count": 223,
|
||||||
"message": "hello, world",
|
"message": "hello, world",
|
||||||
|
@ -36,7 +45,7 @@ charsets = {
|
||||||
pytestmark = skip_unless_feature("zlib")
|
pytestmark = skip_unless_feature("zlib")
|
||||||
|
|
||||||
|
|
||||||
def save_font(request, tmp_path, encoding):
|
def save_font(request: pytest.FixtureRequest, tmp_path: Path, encoding: str) -> str:
|
||||||
with open(fontname, "rb") as test_file:
|
with open(fontname, "rb") as test_file:
|
||||||
font = PcfFontFile.PcfFontFile(test_file, encoding)
|
font = PcfFontFile.PcfFontFile(test_file, encoding)
|
||||||
assert isinstance(font, FontFile.FontFile)
|
assert isinstance(font, FontFile.FontFile)
|
||||||
|
@ -45,7 +54,7 @@ def save_font(request, tmp_path, encoding):
|
||||||
|
|
||||||
tempname = str(tmp_path / "temp.pil")
|
tempname = str(tmp_path / "temp.pil")
|
||||||
|
|
||||||
def delete_tempfile():
|
def delete_tempfile() -> None:
|
||||||
try:
|
try:
|
||||||
os.remove(tempname[:-4] + ".pbm")
|
os.remove(tempname[:-4] + ".pbm")
|
||||||
except OSError:
|
except OSError:
|
||||||
|
@ -64,12 +73,12 @@ def save_font(request, tmp_path, encoding):
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("encoding", ("iso8859-1", "iso8859-2", "cp1250"))
|
@pytest.mark.parametrize("encoding", ("iso8859-1", "iso8859-2", "cp1250"))
|
||||||
def test_sanity(request, tmp_path, encoding):
|
def test_sanity(request: pytest.FixtureRequest, tmp_path: Path, encoding: str) -> None:
|
||||||
save_font(request, tmp_path, encoding)
|
save_font(request, tmp_path, encoding)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("encoding", ("iso8859-1", "iso8859-2", "cp1250"))
|
@pytest.mark.parametrize("encoding", ("iso8859-1", "iso8859-2", "cp1250"))
|
||||||
def test_draw(request, tmp_path, encoding):
|
def test_draw(request: pytest.FixtureRequest, tmp_path: Path, encoding: str) -> None:
|
||||||
tempname = save_font(request, tmp_path, encoding)
|
tempname = save_font(request, tmp_path, encoding)
|
||||||
font = ImageFont.load(tempname)
|
font = ImageFont.load(tempname)
|
||||||
im = Image.new("L", (150, 30), "white")
|
im = Image.new("L", (150, 30), "white")
|
||||||
|
@ -80,7 +89,9 @@ def test_draw(request, tmp_path, encoding):
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("encoding", ("iso8859-1", "iso8859-2", "cp1250"))
|
@pytest.mark.parametrize("encoding", ("iso8859-1", "iso8859-2", "cp1250"))
|
||||||
def test_textsize(request, tmp_path, encoding):
|
def test_textsize(
|
||||||
|
request: pytest.FixtureRequest, tmp_path: Path, encoding: str
|
||||||
|
) -> None:
|
||||||
tempname = save_font(request, tmp_path, encoding)
|
tempname = save_font(request, tmp_path, encoding)
|
||||||
font = ImageFont.load(tempname)
|
font = ImageFont.load(tempname)
|
||||||
for i in range(255):
|
for i in range(255):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user