Skip to content

Commit 620d555

Browse files
authored
Add catch-all FAIL_WITHOUT_IMAGE_DECODERS var for CI (#1550)
1 parent 6107b08 commit 620d555

8 files changed

Lines changed: 61 additions & 66 deletions

.github/workflows/linux_aarch64_wheel.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@ jobs:
107107

108108
- name: Run Python smoke tests
109109
run: |
110-
if [ "${{ matrix.ffmpeg-version-for-tests }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
111-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short
110+
if [ "${{ matrix.ffmpeg-version-for-tests }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
111+
FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short
112112
113113
- name: Run Python tests
114114
if: ${{ matrix.ffmpeg-version-for-tests == '7' && !startsWith(github.ref, 'refs/heads/release/') }}
115115
run: |
116-
if [ "${{ matrix.ffmpeg-version-for-tests }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
117-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test
116+
if [ "${{ matrix.ffmpeg-version-for-tests }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
117+
FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test

.github/workflows/linux_cuda_aarch64_wheel.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,11 @@ jobs:
113113
run: bash packaging/install_test_dependencies.sh ${{ matrix.ffmpeg-version-for-tests != '4' }}
114114
- name: Run Python smoke tests
115115
run: |
116-
if [ "${{ matrix.ffmpeg-version-for-tests }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
117-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short
116+
if [ "${{ matrix.ffmpeg-version-for-tests }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
117+
FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short
118118
119119
- name: Run Python tests
120120
if: ${{ matrix.ffmpeg-version-for-tests == '8' && !startsWith(github.ref, 'refs/heads/release/') }}
121121
run: |
122-
if [ "${{ matrix.ffmpeg-version-for-tests }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
123-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test
122+
if [ "${{ matrix.ffmpeg-version-for-tests }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
123+
FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test

.github/workflows/linux_cuda_wheel.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ jobs:
131131
run: ${CONDA_RUN} bash packaging/install_test_dependencies.sh ${{ matrix.ffmpeg-version-for-tests != '4' && matrix.cuda-version != '12.6' }}
132132
- name: Run Python tests
133133
run: |
134-
if [ "${{ matrix.ffmpeg-version-for-tests }}" != "4" ] && [ "${{ matrix.cuda-version }}" != "12.6" ]; then export FAIL_WITHOUT_HEIC=1; fi
135-
${CONDA_RUN} FAIL_WITHOUT_CUDA=1 FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test --tb=short
134+
if [ "${{ matrix.ffmpeg-version-for-tests }}" = "4" ] || [ "${{ matrix.cuda-version }}" = "12.6" ]; then export FAIL_WITHOUT_HEIC=0; fi
135+
${CONDA_RUN} FAIL_WITHOUT_CUDA=1 FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test --tb=short
136136
- name: Run Python benchmark
137137
run: |
138138
${CONDA_RUN} time python benchmarks/decoders/gpu_benchmark.py --devices=cuda:0,cpu --resize_devices=none
@@ -198,8 +198,8 @@ jobs:
198198
199199
- name: Run Python tests
200200
run: |
201-
if [ "${{ env.FFMPEG_VERSION }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
202-
pytest --override-ini="addopts=-v" test --tb=short
201+
if [ "${{ env.FFMPEG_VERSION }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
202+
FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test --tb=short
203203
204204
install-and-test-no-ffmpeg:
205205
# Asserts that the CUDA wheel works WITHOUT FFmpeg installed: it must import,
@@ -257,7 +257,7 @@ jobs:
257257
258258
- name: Run FFmpeg-free Python tests
259259
run: |
260-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 \
260+
FAIL_WITHOUT_IMAGE_DECODERS=1 FAIL_WITHOUT_HEIC=0 \
261261
pytest --override-ini="addopts=-v" test/test_ffmpeg_optional.py test/test_decoders.py::TestImageDecoder
262262
263263
build-docs:

.github/workflows/linux_wheel.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ jobs:
107107

108108
- name: Run Python tests
109109
run: |
110-
if [ "${{ matrix.ffmpeg-version-for-tests }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
111-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test
110+
if [ "${{ matrix.ffmpeg-version-for-tests }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
111+
FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test
112112
113113
install-and-test-no-ffmpeg:
114114
# Asserts that torchcodec works WITHOUT FFmpeg installed: the package must
@@ -161,7 +161,7 @@ jobs:
161161
162162
- name: Run FFmpeg-free Python tests
163163
run: |
164-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 \
164+
FAIL_WITHOUT_IMAGE_DECODERS=1 \
165165
pytest --override-ini="addopts=-v" test/test_ffmpeg_optional.py test/test_decoders.py::TestImageDecoder
166166
167167
install-and-test-third-party-interface:

.github/workflows/macos_wheel.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,11 @@ jobs:
110110

111111
- name: Run Python smoke tests
112112
run: |
113-
if [ "${{ matrix.ffmpeg-version-for-tests }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
114-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short
113+
if [ "${{ matrix.ffmpeg-version-for-tests }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
114+
FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short
115115
116116
- name: Run Python tests
117117
if: ${{ matrix.ffmpeg-version-for-tests == '8' && !startsWith(github.ref, 'refs/heads/release/') }}
118118
run: |
119-
if [ "${{ matrix.ffmpeg-version-for-tests }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
120-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test
119+
if [ "${{ matrix.ffmpeg-version-for-tests }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
120+
FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test

.github/workflows/windows_cuda_wheel.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ jobs:
142142
run: bash -l packaging/install_test_dependencies.sh ${{ matrix.ffmpeg-version-for-tests != '4' }}
143143
- name: Run Python tests
144144
run: |
145-
if [ "${{ matrix.ffmpeg-version-for-tests }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
146-
FAIL_WITHOUT_CUDA=1 FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short
145+
if [ "${{ matrix.ffmpeg-version-for-tests }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
146+
FAIL_WITHOUT_CUDA=1 FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short
147147
- name: Run Python benchmark
148148
run: |
149149
time python benchmarks/decoders/gpu_benchmark.py --devices=cuda:0,cpu --resize_devices=none
@@ -211,5 +211,5 @@ jobs:
211211
212212
- name: Run Python tests
213213
run: |
214-
if [ "${{ env.FFMPEG_VERSION }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
215-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short
214+
if [ "${{ env.FFMPEG_VERSION }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
215+
FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short

.github/workflows/windows_wheel.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,11 @@ jobs:
115115

116116
- name: Run Python smoke tests
117117
run: |
118-
if [ "${{ matrix.ffmpeg-version-for-tests }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
119-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short
118+
if [ "${{ matrix.ffmpeg-version-for-tests }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
119+
FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test/smoke_test.py --tb=short
120120
121121
- name: Run Python tests
122122
if: ${{ matrix.ffmpeg-version-for-tests == '8' && !startsWith(github.ref, 'refs/heads/release/') }}
123123
run: |
124-
if [ "${{ matrix.ffmpeg-version-for-tests }}" != "4" ]; then export FAIL_WITHOUT_HEIC=1; fi
125-
FAIL_WITHOUT_JPEG=1 FAIL_WITHOUT_PNG=1 FAIL_WITHOUT_WEBP=1 FAIL_WITHOUT_AVIF=1 pytest --override-ini="addopts=-v" test
124+
if [ "${{ matrix.ffmpeg-version-for-tests }}" = "4" ]; then export FAIL_WITHOUT_HEIC=0; fi
125+
FAIL_WITHOUT_IMAGE_DECODERS=1 pytest --override-ini="addopts=-v" test

test/conftest.py

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,33 @@ def pytest_configure(config):
3939
)
4040

4141

42+
def skip_image_decoder_test(codec):
43+
# Whether to skip a test that needs the given image codec: we skip when the
44+
# backing library isn't available, unless we're told to fail loudly (on CI
45+
# we are, so a missing library surfaces as a failure rather than a silent
46+
# skip).
47+
#
48+
# FAIL_WITHOUT_IMAGE_DECODERS is a catch-all default covering every image
49+
# codec. A per-codec FAIL_WITHOUT_<CODEC> overrides the catch-all, so a CI
50+
# job can enable the catch-all and still opt a single codec out, e.g.
51+
# FAIL_WITHOUT_IMAGE_DECODERS=1 FAIL_WITHOUT_HEIC=0.
52+
if {
53+
"jpeg": jpeg_is_available,
54+
"png": png_is_available,
55+
"webp": webp_is_available,
56+
"avif": avif_is_available,
57+
"heic": heic_is_available,
58+
}[codec]():
59+
return False
60+
override = os.environ.get(f"FAIL_WITHOUT_{codec.upper()}")
61+
fail_without = (
62+
override
63+
if override is not None
64+
else os.environ.get("FAIL_WITHOUT_IMAGE_DECODERS")
65+
)
66+
return fail_without in (None, "0")
67+
68+
4269
def pytest_collection_modifyitems(items):
4370
# This hook is called by pytest after it has collected the tests (google its
4471
# name to check out its doc!). We can ignore some tests as we see fit here,
@@ -95,52 +122,20 @@ def pytest_collection_modifyitems(items):
95122
# those for whatever reason, we need to know.
96123
item.add_marker(pytest.mark.skip(reason="CUDA not available."))
97124

98-
# Same rationale as needs_cuda: skip when libjpeg support isn't built in,
99-
# unless FAIL_WITHOUT_JPEG is set (on CI it is, so a missing libjpeg
100-
# surfaces as a failure rather than a silent skip).
101-
if (
102-
needs_jpeg
103-
and not jpeg_is_available()
104-
and os.environ.get("FAIL_WITHOUT_JPEG") is None
105-
):
125+
# Same rationale as needs_cuda; see skip_image_decoder_test().
126+
if needs_jpeg and skip_image_decoder_test("jpeg"):
106127
item.add_marker(pytest.mark.skip(reason="libjpeg support not available."))
107128

108-
# Same rationale as needs_jpeg: skip when libpng support isn't built in,
109-
# unless FAIL_WITHOUT_PNG is set (on CI it is, so a missing libpng
110-
# surfaces as a failure rather than a silent skip).
111-
if (
112-
needs_png
113-
and not png_is_available()
114-
and os.environ.get("FAIL_WITHOUT_PNG") is None
115-
):
129+
if needs_png and skip_image_decoder_test("png"):
116130
item.add_marker(pytest.mark.skip(reason="libpng support not available."))
117131

118-
# Same rationale as needs_jpeg: skip when libwebp support isn't built in,
119-
# unless FAIL_WITHOUT_WEBP is set (on CI it is, so a missing libwebp
120-
# surfaces as a failure rather than a silent skip).
121-
if (
122-
needs_webp
123-
and not webp_is_available()
124-
and os.environ.get("FAIL_WITHOUT_WEBP") is None
125-
):
132+
if needs_webp and skip_image_decoder_test("webp"):
126133
item.add_marker(pytest.mark.skip(reason="libwebp support not available."))
127134

128-
# Same rationale as needs_jpeg: skip when libavif support isn't built in,
129-
# unless FAIL_WITHOUT_AVIF is set (on CI it is, so a missing libavif
130-
# surfaces as a failure rather than a silent skip).
131-
if (
132-
needs_avif
133-
and not avif_is_available()
134-
and os.environ.get("FAIL_WITHOUT_AVIF") is None
135-
):
135+
if needs_avif and skip_image_decoder_test("avif"):
136136
item.add_marker(pytest.mark.skip(reason="libavif support not available."))
137137

138-
# Same rationale as needs_jpeg
139-
if (
140-
needs_heic
141-
and not heic_is_available()
142-
and os.environ.get("FAIL_WITHOUT_HEIC") is None
143-
):
138+
if needs_heic and skip_image_decoder_test("heic"):
144139
item.add_marker(pytest.mark.skip(reason="libheif support not available."))
145140

146141
out_items.append(item)

0 commit comments

Comments
 (0)