[CI] Allowlist-shrink batch 1: wire 17 root-level tests + drop 5 stale watermarking entries into misc.yaml (#58055)

Signed-off-by: Turner Jabbour <doubleujabbour@gmail.com> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

Turner Jabbour committed Sep 27, 2026 at 23:23 UTC 2407f405b51abd23adbf0203b98464f448c58edf
8 files changed +133 -61
.buildkite/test_areas/misc.yaml
+46
@@ -496,15 +496,22 @@ steps:
496 - vllm/assets/
497 - vllm/config/
498 - vllm/device_allocator/
499 + - vllm/connections.py
500 - vllm/engine/arg_utils.py
501 - vllm/entrypoints/chat_utils.py
502 - vllm/entrypoints/mcp/
503 - vllm/entrypoints/openai/chat_completion/protocol.py
504 + - vllm/entrypoints/openai/completion/protocol.py
505 + - vllm/entrypoints/openai/responses/protocol.py
506 - vllm/entrypoints/generate/base/protocol.py
507 + - vllm/env_override.py
508 - vllm/envs.py
509 - vllm/exceptions.py
510 - vllm/inputs/
511 + - vllm/logging_utils/
512 + - vllm/logprobs.py
513 - vllm/model_executor/layers/quantization/quark/
514 + - vllm/model_executor/model_loader/tensorizer.py
515 - vllm/multimodal/
516 - vllm/outputs.py
517 - vllm/parser/
@@ -514,17 +521,38 @@ steps:
521 - vllm/reasoning/
522 - vllm/renderers/
523 - vllm/sampling_params.py
524 + - vllm/scalar_type.py
525 - vllm/tokenizers/
526 - vllm/tool_parsers/
527 - vllm/transformers_utils/
528 + - vllm/triton_utils/
529 - vllm/utils/
530 - vllm/v1/
531 + - vllm/version.py
532 + - cmake/utils.cmake
533 + - tests/test_access_log_filter.py
534 + - tests/test_attention_backend_registry.py
535 + - tests/test_audio_media_size_precheck.py
536 + - tests/test_cmake_utils.py
537 + - tests/test_connections.py
538 + - tests/test_embedded_commit.py
539 - tests/test_envs.py
540 + - tests/test_force_first_config.py
541 + - tests/test_fxgraphcache_pickle_patch.py
542 + - tests/test_logprobs.py
543 - tests/test_outputs.py
544 - tests/test_pcp_dp.py
545 - tests/test_pooling_params.py
546 + - tests/test_quantization_revision_pin.py
547 - tests/test_ray_env.py
548 + - tests/test_ray_env_utils.py
549 + - tests/test_request_input_bounds.py
550 - tests/test_sampling_params.py
551 + - tests/test_scalartype.py
552 + - tests/test_tensorizer_revision_pin.py
553 + - tests/test_triton_utils.py
554 + - tests/test_version.py
555 + - tests/test_zen_cpu_platform_detection.py
556 - tests/multimodal
557 - tests/renderers
558 - tests/standalone_tests/lazy_imports.py
@@ -540,14 +568,32 @@ steps:
568 - tests/device_allocator
569 device: cpu-small
570 commands:
571 + - pip install cmake # test_cmake_utils.py shells out to cmake; the CPU image has none
572 - python3 standalone_tests/lazy_imports.py
573 - pytest -v -s device_allocator
574 + - pytest -v -s test_access_log_filter.py
575 + - pytest -v -s test_attention_backend_registry.py
576 + - pytest -v -s test_audio_media_size_precheck.py
577 + - pytest -v -s test_cmake_utils.py
578 + - pytest -v -s test_connections.py
579 + - pytest -v -s test_embedded_commit.py
580 - pytest -v -s test_envs.py
581 + - pytest -v -s test_force_first_config.py
582 + - pytest -v -s test_fxgraphcache_pickle_patch.py
583 + - pytest -v -s test_logprobs.py
584 - pytest -v -s test_outputs.py
585 - pytest -v -s test_pcp_dp.py
586 - pytest -v -s test_pooling_params.py
587 + - pytest -v -s test_quantization_revision_pin.py
588 - pytest -v -s test_ray_env.py
589 + - pytest -v -s test_ray_env_utils.py
590 + - pytest -v -s test_request_input_bounds.py
591 - pytest -v -s test_sampling_params.py
592 + - pytest -v -s test_scalartype.py
593 + - pytest -v -s test_tensorizer_revision_pin.py
594 + - pytest -v -s test_triton_utils.py
595 + - pytest -v -s test_version.py
596 + - pytest -v -s test_zen_cpu_platform_detection.py
597 - pytest -v -s tokenizers_
598 - pytest -v -s parser
599 - pytest -v -s transformers_utils
docker/Dockerfile.cpu
+2
@@ -433,6 +433,8 @@ ADD ./benchmarks/ ./benchmarks/
433 ADD ./vllm/collect_env.py .
434 ADD ./docker/ ./docker/
435 ADD ./.buildkite/ ./.buildkite/
436 +# cmake/ is needed by tests/test_cmake_utils.py, which includes cmake/utils.cmake.
437 +ADD ./cmake/ ./cmake/
438 # tools/ carries repo-tooling code that a few tests exercise directly
439 # (e.g. tests/tools/test_check_test_tethering.py imports
440 # tools.pre_commit.check_test_tethering).
tests/test_request_input_bounds.py
+2 -3
@@ -43,6 +43,7 @@ def prompt_embeds_processor():
43 logits_processors=None,
44 is_diffusion=False,
45 return_sampling_mask=False,
46 + supports_multimodal_inputs=False,
47 )
48 model_config.get_vocab_size.return_value = 32
49 model_config.try_get_generation_config.return_value = {}
@@ -53,9 +54,7 @@ def prompt_embeds_processor():
54 )
55 renderer = Mock(tokenizer=None)
56 renderer.get_eos_token_id.return_value = None
56 - registry = Mock()
57 - registry.supports_multimodal_inputs.return_value = False
58 - return InputProcessor(config, renderer, mm_registry=registry)
57 + return InputProcessor(config, renderer, mm_registry=Mock())
58
59
60 @pytest.mark.parametrize("mask_len", [0, 1, 2, 4])
tests/test_triton_utils.py
+51 -16
@@ -10,10 +10,13 @@ from vllm.triton_utils import importing as triton_importing
10 from vllm.triton_utils.importing import TritonLanguagePlaceholder, TritonPlaceholder
11
12
13 -def _has_triton_for_backends(**drivers: bool) -> bool:
13 +def _has_triton_for_backends(*, vllm_version: str = "0.0.0", **drivers: bool) -> bool:
14 """Re-evaluate ``HAS_TRITON`` against a synthetic ``triton.backends`` map.
15
16 ``drivers`` maps backend name to whether its driver reports itself active.
17 + ``vllm_version`` selects the build type: importing.py takes its Triton-CPU
18 + branch only when "cpu" is in the installed vLLM version, so pin it rather
19 + than depending on the real install (the CPU CI image is a "+cpu" build).
20 """
21 backends = {}
22 for name, is_active in drivers.items():
@@ -34,6 +37,7 @@ def _has_triton_for_backends(**drivers: bool) -> bool:
37 with (
38 mock.patch.dict(sys.modules, patched_modules),
39 mock.patch.dict("os.environ", {}, clear=True),
40 + mock.patch("importlib.metadata.version", return_value=vllm_version),
41 ):
42 return importlib.reload(triton_importing).HAS_TRITON
43 finally:
@@ -129,19 +133,50 @@ def test_cpu_backend_alone_disables_triton():
133 assert _has_triton_for_backends(cpu=True) is False
134
135
136 +def test_cpu_build_with_cpu_backend_keeps_triton():
137 + assert _has_triton_for_backends(vllm_version="0.0.0+cpu", cpu=True) is True
138 +
139 +
140 +def test_cpu_build_without_cpu_backend_disables_triton():
141 + assert _has_triton_for_backends(vllm_version="0.0.0+cpu", amd=True) is False
142 +
143 +
144 def test_no_triton_fallback():
133 - # clear existing triton modules
134 - sys.modules.pop("triton", None)
135 - sys.modules.pop("triton.language", None)
136 - sys.modules.pop("vllm.triton_utils", None)
137 - sys.modules.pop("vllm.triton_utils.importing", None)
138 -
139 - # mock triton not being installed
140 - with mock.patch.dict(sys.modules, {"triton": None}):
141 - from vllm.triton_utils import HAS_TRITON, tl, triton
142 -
143 - assert HAS_TRITON is False
144 - assert triton.__class__.__name__ == "TritonPlaceholder"
145 - assert triton.language.__class__.__name__ == "TritonLanguagePlaceholder"
146 - assert tl.__class__.__name__ == "TritonLanguagePlaceholder"
147 - assert tl.constexpr(2**31 - 1) == 2**31 - 1
145 + # Save the real modules so they can be put back afterward - popping them
146 + # (rather than mock.patch.dict alone) is what forces vllm.triton_utils to
147 + # be freshly, unmemoized re-imported under the "triton is absent"
148 + # condition below.
149 + saved_modules = {
150 + name: sys.modules.get(name)
151 + for name in (
152 + "triton",
153 + "triton.language",
154 + "vllm.triton_utils",
155 + "vllm.triton_utils.importing",
156 + )
157 + }
158 + for name in saved_modules:
159 + sys.modules.pop(name, None)
160 +
161 + try:
162 + # mock triton not being installed
163 + with mock.patch.dict(sys.modules, {"triton": None}):
164 + from vllm.triton_utils import HAS_TRITON, tl, triton
165 +
166 + assert HAS_TRITON is False
167 + assert triton.__class__.__name__ == "TritonPlaceholder"
168 + assert triton.language.__class__.__name__ == "TritonLanguagePlaceholder"
169 + assert tl.__class__.__name__ == "TritonLanguagePlaceholder"
170 + assert tl.constexpr(2**31 - 1) == 2**31 - 1
171 + finally:
172 + # The pops above are outside mock.patch.dict's scope, so exiting the
173 + # `with` restores "triton" to absent, not to the real module - unlike
174 + # _has_triton_for_backends above, nothing here puts it back. Left
175 + # alone, every subsequent import of vllm.triton_utils in this process
176 + # (including other test files, and other tests' cleanup fixtures that
177 + # need real triton) would get this fake, HAS_TRITON=False module.
178 + for name, module in saved_modules.items():
179 + if module is not None:
180 + sys.modules[name] = module
181 + else:
182 + sys.modules.pop(name, None)
tests/test_version.py
+4 -1
@@ -13,7 +13,10 @@ def test_version_is_defined():
13
14
15 def test_version_tuple():
16 - assert len(version.__version_tuple__) in (3, 4, 5)
16 + # (major, minor, patch) plus optional pre-release tag, dev-distance, and
17 + # git-hash components - setuptools_scm can emit any combination of them,
18 + # e.g. 6 when a dev build sits on top of an rc-tagged commit.
19 + assert len(version.__version_tuple__) >= 3
20
21
22 @pytest.mark.parametrize(
tests/test_zen_cpu_platform_detection.py
+28 -11
@@ -13,6 +13,23 @@ from vllm.platforms import (
13 )
14
15
16 +@pytest.fixture
17 +def caplog_vllm(caplog):
18 + """`caplog`, but also captures vLLM's loggers.
19 +
20 + vllm/logger.py configures the "vllm" logger with propagate=False, so
21 + records from child loggers like "vllm.platforms" reach vLLM's own
22 + handler but never bubble up to the root logger where plain `caplog`
23 + listens. Attach caplog's handler directly to "vllm" to see them too.
24 + """
25 + logger = logging.getLogger("vllm")
26 + logger.addHandler(caplog.handler)
27 + try:
28 + yield caplog
29 + finally:
30 + logger.removeHandler(caplog.handler)
31 +
32 +
33 def test_is_amd_zen_cpu_detects_amd_with_avx512():
34 cpuinfo = "vendor_id: AuthenticAMD\nflags: avx avx2 avx512f avx512bw"
35 with (
@@ -65,7 +82,7 @@ def test_cpu_target_selects_cpu_platform_from_non_cpu_wheel(
82 rocm_plugin.assert_not_called()
83
84
68 -def test_broken_zentorch_falls_back_to_cpu_platform(caplog):
85 +def test_broken_zentorch_falls_back_to_cpu_platform(caplog_vllm):
86 original_import = builtins.__import__
87
88 def import_with_broken_zentorch(name, *args, **kwargs):
@@ -84,16 +101,16 @@ def test_broken_zentorch_falls_back_to_cpu_platform(caplog):
101 patch("vllm.platforms.vllm_version_matches_substr", return_value=True),
102 patch("vllm.platforms._is_amd_zen_cpu", return_value=True),
103 patch.object(builtins, "__import__", side_effect=import_with_broken_zentorch),
87 - caplog.at_level(logging.DEBUG, logger="vllm.platforms"),
104 + caplog_vllm.at_level(logging.DEBUG, logger="vllm.platforms"),
105 ):
106 platform = resolve_current_platform_cls_qualname()
107
108 assert platform == "vllm.platforms.cpu.CpuPlatform"
92 - assert "zentorch failed to import" in caplog.text
93 - assert "OSError: incompatible shared library" in caplog.text
109 + assert "zentorch failed to import" in caplog_vllm.text
110 + assert "OSError: incompatible shared library" in caplog_vllm.text
111
112
96 -def test_zentorch_failure_other_than_oserror_is_not_recovered(caplog):
113 +def test_zentorch_failure_other_than_oserror_is_not_recovered(caplog_vllm):
114 original_import = builtins.__import__
115
116 def import_with_broken_zentorch(name, *args, **kwargs):
@@ -112,15 +129,15 @@ def test_zentorch_failure_other_than_oserror_is_not_recovered(caplog):
129 patch("vllm.platforms.vllm_version_matches_substr", return_value=True),
130 patch("vllm.platforms._is_amd_zen_cpu", return_value=True),
131 patch.object(builtins, "__import__", side_effect=import_with_broken_zentorch),
115 - caplog.at_level(logging.DEBUG, logger="vllm.platforms"),
132 + caplog_vllm.at_level(logging.DEBUG, logger="vllm.platforms"),
133 ):
134 platform = resolve_current_platform_cls_qualname()
135
136 assert platform == "vllm.platforms.interface.UnspecifiedPlatform"
120 - assert "RuntimeError: unknown zentorch failure" in caplog.text
137 + assert "RuntimeError: unknown zentorch failure" in caplog_vllm.text
138
139
123 -def test_platform_plugin_failure_is_logged(caplog):
140 +def test_platform_plugin_failure_is_logged(caplog_vllm):
141 def failing_plugin():
142 raise RuntimeError("plugin exploded")
143
@@ -132,10 +149,10 @@ def test_platform_plugin_failure_is_logged(caplog):
149 clear=True,
150 ),
151 patch("vllm.platforms.load_plugins_by_group", return_value={}),
135 - caplog.at_level(logging.DEBUG, logger="vllm.platforms"),
152 + caplog_vllm.at_level(logging.DEBUG, logger="vllm.platforms"),
153 ):
154 platform = resolve_current_platform_cls_qualname()
155
156 assert platform == "vllm.platforms.interface.UnspecifiedPlatform"
140 - assert "Platform plugin cpu failed during detection" in caplog.text
141 - assert "RuntimeError: plugin exploded" in caplog.text
157 + assert "Platform plugin cpu failed during detection" in caplog_vllm.text
158 + assert "RuntimeError: plugin exploded" in caplog_vllm.text
tools/pre_commit/test_tethering_allowlist.txt
-28
@@ -59,27 +59,6 @@ tests/models/test_dspark_mla.py # no models_*.yaml job collects this path
59 tests/models/test_language_model_cache_is_weak.py # no models_*.yaml job collects this path
60 tests/models/transformers/test_layer_registry.py # no models_*.yaml job collects this path
61
62 -# tests/ root-level - misc.yaml runs a hand-picked set of these by name
63 -# (test_regression.py, test_envs.py, test_outputs.py, test_pooling_params.py);
64 -# the rest are unreferenced.
65 -tests/test_access_log_filter.py # root test_*.py not in misc.yaml's by-name list
66 -tests/test_attention_backend_registry.py # root test_*.py not in misc.yaml's by-name list
67 -tests/test_audio_media_size_precheck.py # root test_*.py not in misc.yaml's by-name list
68 -tests/test_cmake_utils.py # root test_*.py not in misc.yaml's by-name list
69 -tests/test_connections.py # root test_*.py not in misc.yaml's by-name list
70 -tests/test_embedded_commit.py # root test_*.py not in misc.yaml's by-name list
71 -tests/test_force_first_config.py # root test_*.py not in misc.yaml's by-name list
72 -tests/test_fxgraphcache_pickle_patch.py # root test_*.py not in misc.yaml's by-name list
73 -tests/test_logprobs.py # root test_*.py not in misc.yaml's by-name list
74 -tests/test_quantization_revision_pin.py # root test_*.py not in misc.yaml's by-name list
75 -tests/test_ray_env_utils.py # root test_*.py not in misc.yaml's by-name list
76 -tests/test_request_input_bounds.py # root test_*.py not in misc.yaml's by-name list
77 -tests/test_scalartype.py # root test_*.py not in misc.yaml's by-name list
78 -tests/test_tensorizer_revision_pin.py # root test_*.py not in misc.yaml's by-name list
79 -tests/test_triton_utils.py # root test_*.py not in misc.yaml's by-name list
80 -tests/test_version.py # root test_*.py not in misc.yaml's by-name list
81 -tests/test_zen_cpu_platform_detection.py # root test_*.py not in misc.yaml's by-name list
82 -
62 # tests/v1/ - the v1 subtree is otherwise covered by many `pytest v1/...` jobs.
63 tests/v1/e2e/test_replayssm_decode.py # ReplaySSM decode test (#52506) wired into no job
64 tests/v1/ec_connector/integration/test_epd_correctness.py # run_epd_correctness_test.sh exists but no Buildkite job invokes it
@@ -91,10 +70,3 @@ tests/platforms/test_cpu.py # CPU-only unit test; no job targets tests/platform
70
71 # tests/tools/
72 tests/tools/test_config_validator.py # logic covered by the validate-config pre-commit hook; no test_areas job
94 -
95 -# tests/watermarking/ - added by #54053 (2026-09-09), no Buildkite job collects the dir yet
96 -tests/watermarking/test_detection.py # watermarking feature (#54053); no job collects tests/watermarking/
97 -tests/watermarking/test_gumbel.py # watermarking feature (#54053); no job collects tests/watermarking/
98 -tests/watermarking/test_prf.py # watermarking feature (#54053); no job collects tests/watermarking/
99 -tests/watermarking/test_watermarking.py # watermarking feature (#54053); no job collects tests/watermarking/
100 -tests/watermarking/test_watermarking_e2e.py # watermarking hardening (#56309); no job collects tests/watermarking/
vllm/version.py
-2
@@ -26,8 +26,6 @@ def _prev_minor_version_was(version_str):
26 if __version_tuple__[0:2] == (0, 0):
27 return True
28
29 - # Note - this won't do the right thing when we release 1.0!
30 - assert __version_tuple__[0] == 0
29 assert isinstance(__version_tuple__[1], int)
30 return version_str == f"{__version_tuple__[0]}.{__version_tuple__[1] - 1}"
31