def skip_unless_feature_version(feature, version_required, reason=None): if not features.check(feature): return pytest.mark.skip(f"{feature} not available") if reason is None: reason = f"{feature} is older than {version_required}" version_required = parse_version(version_required) version_available = parse_version(features.version(feature)) return pytest.mark.skipif(version_available < version_required, reason=reason)
def test(name, function): version = features.version(name) if not features.check(name): assert version is None else: assert function(name) == version if name != "PIL": assert version is None or re.search(r"\d+(\.\d+)*$", version)
async def debug_info(self, ctx): """Get info about libs used by leveler and environment info""" try: from dns.version import version as dns_version except ImportError: dns_version = None except Exception as e: dns_version = e.__class__.__qualname__ # tkinter already failed once due to incorrect installation (?) pil_features = [] for feature in pilfeatures.get_supported(): try: feature = (feature, pilfeatures.version(feature) or "N/A") except Exception as e: feature = (feature, type(e)) pil_features.append(feature) # noinspection PyProtectedMember await ctx.send( chat.box( tabulate( [ ("DB lock locked", self._db_lock.locked()), ( "DB lock queue", "N/A" if self._db_lock._waiters is None else len( self._db_lock._waiters), ), ("pymongo version", pymongoversion), ("motor version", motorversion), ( "Mongo DB version", (await self.client.server_info()).get( "version", "?"), ), ("dnspython version", dns_version), ("PIL version", pilfeatures.version("pil")), ( "PIL features", tabulate(pil_features, tablefmt="psql"), ), ], tablefmt="psql", )))
def mark_if_feature_version(mark, feature, version_blacklist, reason=None): if not features.check(feature): return pytest.mark.pil_noop_mark() if reason is None: reason = f"{feature} is {version_blacklist}" version_required = parse_version(version_blacklist) version_available = parse_version(features.version(feature)) if (version_available.major == version_required.major and version_available.minor == version_required.minor): return mark(reason=reason) return pytest.mark.pil_noop_mark()
def test_libimagequant_version(): assert re.search(r"\d+\.\d+\.\d+$", features.version("libimagequant"))
def test_libjpeg_turbo_version(): assert re.search(r"\d+\.\d+\.\d+$", features.version("libjpeg_turbo"))
import subprocess import sys import fuzzers import packaging import pytest from PIL import Image, features if sys.platform.startswith("win32"): pytest.skip("Fuzzer is linux only", allow_module_level=True) if features.check("libjpeg_turbo"): version = packaging.version.parse(features.version("libjpeg_turbo")) if version.major == 2 and version.minor == 0: pytestmark = pytest.mark.valgrind_known_error( reason="Known failing with libjpeg_turbo 2.0") @pytest.mark.parametrize( "path", subprocess.check_output("find Tests/images -type f", shell=True).split(b"\n"), ) def test_fuzz_images(path): fuzzers.enable_decompressionbomb_error() try: with open(path, "rb") as f: fuzzers.fuzz_image(f.read()) assert True except ( OSError,