diff --git a/.travis.yml b/.travis.yml index bd780ad15b6..84ade9c8e59 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,9 +6,8 @@ notifications: irc: "chat.freenode.net#pil" # Run fast lint first to get fast feedback. -# Run slow PyPy next, to give it a headstart and reduce waiting time. -# Run latest 3.x next, to get quick compatibility results. -# Then run the remainder. +# Run slower CPUs next, to give them a headstart and reduce waiting time. +# Then run the remainder, with fastest Docker jobs last. matrix: fast_finish: true @@ -16,6 +15,14 @@ matrix: - python: "3.6" name: "Lint" env: LINT="true" + + - python: "3.6" + arch: arm64 + - python: "3.7" + arch: ppc64le + - python: "3.5" + arch: s390x + - python: "pypy3" name: "PyPy3 Xenial" - python: "3.8" diff --git a/.travis/install.sh b/.travis/install.sh index 0878bba3bc1..8e819631aa5 100755 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -16,8 +16,12 @@ pip install pyroma pip install test-image-results pip install numpy if [[ $TRAVIS_PYTHON_VERSION == 3.* ]]; then + # arm64, ppc64le, s390x CPUs: + # "ERROR: Could not find a version that satisfies the requirement pyqt5" + if [[ $TRAVIS_CPU_ARCH == "amd64" ]]; then sudo apt-get -qq install pyqt5-dev-tools pip install pyqt5!=5.14.1 + fi fi # docs only on Python 3.8 diff --git a/.travis/test.sh b/.travis/test.sh index 832d90433e1..7507c83fff5 100755 --- a/.travis/test.sh +++ b/.travis/test.sh @@ -5,4 +5,6 @@ set -e python -m pytest -v -x --cov PIL --cov Tests --cov-report term Tests # Docs -if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ]; then make doccheck; fi +if [ "$TRAVIS_PYTHON_VERSION" == "3.8" ] && [ "$TRAVIS_CPU_ARCH" == "amd64" ]; then + make doccheck +fi diff --git a/Tests/helper.py b/Tests/helper.py index 0f8e05c19f7..e52446c0394 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -4,6 +4,7 @@ import logging import os +import platform import subprocess import sys import tempfile @@ -348,6 +349,10 @@ def on_ci(): ) +def is_big_endian(): + return platform.processor() == "s390x" + + def is_win32(): return sys.platform.startswith("win32") diff --git a/Tests/test_file_jpeg2k.py b/Tests/test_file_jpeg2k.py index 37ce726dbe8..3639077ac73 100644 --- a/Tests/test_file_jpeg2k.py +++ b/Tests/test_file_jpeg2k.py @@ -1,8 +1,9 @@ from io import BytesIO +import pytest from PIL import Image, Jpeg2KImagePlugin -from .helper import PillowTestCase +from .helper import PillowTestCase, is_big_endian, on_ci codecs = dir(Image.core) @@ -165,11 +166,13 @@ def test_16bit_monochrome_has_correct_mode(self): jp2.load() self.assertEqual(jp2.mode, "I;16") + @pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian") def test_16bit_monochrome_jp2_like_tiff(self): with Image.open("Tests/images/16bit.cropped.tif") as tiff_16bit: with Image.open("Tests/images/16bit.cropped.jp2") as jp2: self.assert_image_similar(jp2, tiff_16bit, 1e-3) + @pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian") def test_16bit_monochrome_j2k_like_tiff(self): with Image.open("Tests/images/16bit.cropped.tif") as tiff_16bit: with Image.open("Tests/images/16bit.cropped.j2k") as j2k: diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 4cd613785d1..e925dfbbef3 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -2,9 +2,17 @@ import zlib from io import BytesIO +import pytest from PIL import Image, ImageFile, PngImagePlugin -from .helper import PillowLeakTestCase, PillowTestCase, hopper, is_win32 +from .helper import ( + PillowLeakTestCase, + PillowTestCase, + hopper, + is_big_endian, + is_win32, + on_ci, +) try: from PIL import _webp @@ -72,6 +80,7 @@ def get_chunks(self, filename): png.crc(cid, s) return chunks + @pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian") def test_sanity(self): # internal version number diff --git a/Tests/test_file_webp_animated.py b/Tests/test_file_webp_animated.py index bf425d07995..a7c4b671e79 100644 --- a/Tests/test_file_webp_animated.py +++ b/Tests/test_file_webp_animated.py @@ -1,6 +1,7 @@ +import pytest from PIL import Image -from .helper import PillowTestCase +from .helper import PillowTestCase, is_big_endian, on_ci try: from PIL import _webp @@ -36,6 +37,7 @@ def test_n_frames(self): self.assertEqual(im.n_frames, 42) self.assertTrue(im.is_animated) + @pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian") def test_write_animation_L(self): """ Convert an animated GIF to animated WebP, then compare the @@ -61,6 +63,7 @@ def test_write_animation_L(self): im.load() self.assert_image_similar(im, orig.convert("RGBA"), 25.0) + @pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian") def test_write_animation_RGB(self): """ Write an animated WebP from RGB frames, and ensure the frames diff --git a/Tests/test_image_getextrema.py b/Tests/test_image_getextrema.py index 78695c06b7c..6713d4380d8 100644 --- a/Tests/test_image_getextrema.py +++ b/Tests/test_image_getextrema.py @@ -1,9 +1,11 @@ +import pytest from PIL import Image -from .helper import PillowTestCase, hopper +from .helper import PillowTestCase, hopper, is_big_endian, on_ci class TestImageGetExtrema(PillowTestCase): + @pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian") def test_extrema(self): def extrema(mode): return hopper(mode).getextrema() @@ -18,6 +20,7 @@ def extrema(mode): self.assertEqual(extrema("CMYK"), ((0, 255), (0, 255), (0, 255), (0, 0))) self.assertEqual(extrema("I;16"), (1, 255)) + @pytest.mark.xfail(is_big_endian() and on_ci(), reason="Fails on big-endian") def test_true_16(self): with Image.open("Tests/images/16_bit_noise.tif") as im: self.assertEqual(im.mode, "I;16")