mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-14 11:26:27 +03:00
refactor png leak test to use PillowLeakTestCase
This commit is contained in:
parent
ed68328c09
commit
41b5121d6e
|
@ -1,4 +1,4 @@
|
||||||
from helper import unittest, PillowTestCase, hopper
|
from helper import unittest, PillowTestCase, PillowLeakTestCase, hopper
|
||||||
from PIL import Image, ImageFile, PngImagePlugin
|
from PIL import Image, ImageFile, PngImagePlugin
|
||||||
|
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
@ -7,9 +7,6 @@ import sys
|
||||||
|
|
||||||
codecs = dir(Image.core)
|
codecs = dir(Image.core)
|
||||||
|
|
||||||
# For Truncated phng memory leak
|
|
||||||
MEM_LIMIT = 2 # max increase in MB
|
|
||||||
ITERATIONS = 100 # Leak is 56k/iteration, this will leak 5.6megs
|
|
||||||
|
|
||||||
# sample png stream
|
# sample png stream
|
||||||
|
|
||||||
|
@ -533,26 +530,14 @@ class TestFilePng(PillowTestCase):
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS")
|
@unittest.skipIf(sys.platform.startswith('win32'), "requires Unix or MacOS")
|
||||||
class TestTruncatedPngPLeaks(PillowTestCase):
|
class TestTruncatedPngPLeaks(PillowLeakTestCase):
|
||||||
|
mem_limit = 2*1024 # max increase in K
|
||||||
|
iterations = 100 # Leak is 56k/iteration, this will leak 5.6megs
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
if "zip_encoder" not in codecs or "zip_decoder" not in codecs:
|
if "zip_encoder" not in codecs or "zip_decoder" not in codecs:
|
||||||
self.skipTest("zip/deflate support not available")
|
self.skipTest("zip/deflate support not available")
|
||||||
|
|
||||||
def _get_mem_usage(self):
|
|
||||||
from resource import getpagesize, getrusage, RUSAGE_SELF
|
|
||||||
mem = getrusage(RUSAGE_SELF).ru_maxrss
|
|
||||||
if sys.platform == 'darwin':
|
|
||||||
# man 2 getrusage:
|
|
||||||
# ru_maxrss the maximum resident set size utilized (in bytes).
|
|
||||||
return mem / 1024 / 1024 # megs
|
|
||||||
else:
|
|
||||||
# linux
|
|
||||||
# man 2 getrusage
|
|
||||||
# ru_maxrss (since Linux 2.6.32)
|
|
||||||
# This is the maximum resident set size used (in kilobytes).
|
|
||||||
return mem / 1024 # megs
|
|
||||||
|
|
||||||
def test_leak_load(self):
|
def test_leak_load(self):
|
||||||
with open('Tests/images/hopper.png', 'rb') as f:
|
with open('Tests/images/hopper.png', 'rb') as f:
|
||||||
DATA = BytesIO(f.read(16 * 1024))
|
DATA = BytesIO(f.read(16 * 1024))
|
||||||
|
@ -560,13 +545,13 @@ class TestTruncatedPngPLeaks(PillowTestCase):
|
||||||
ImageFile.LOAD_TRUNCATED_IMAGES = True
|
ImageFile.LOAD_TRUNCATED_IMAGES = True
|
||||||
with Image.open(DATA) as im:
|
with Image.open(DATA) as im:
|
||||||
im.load()
|
im.load()
|
||||||
start_mem = self._get_mem_usage()
|
|
||||||
|
def core():
|
||||||
|
with Image.open(DATA) as im:
|
||||||
|
im.load()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
for _ in range(ITERATIONS):
|
self._test_leak(core)
|
||||||
with Image.open(DATA) as im:
|
|
||||||
im.load()
|
|
||||||
mem = (self._get_mem_usage() - start_mem)
|
|
||||||
self.assertLess(mem, MEM_LIMIT, msg='memory usage limit exceeded')
|
|
||||||
finally:
|
finally:
|
||||||
ImageFile.LOAD_TRUNCATED_IMAGES = False
|
ImageFile.LOAD_TRUNCATED_IMAGES = False
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user