|
24 | 24 | UNSUPPORTED_TIER_FILTER = ( |
25 | 25 | "--test-case=elementwise CPU GEMM: the forced tier is the tier that actually ran" |
26 | 26 | ) |
| 27 | +NOMINMAX_REAL_CLOSURE = ( |
| 28 | + "src/vllm/model_executor/models/minimax_h3_sharded.cpp", |
| 29 | + "src/vllm/v1/kv_offload/fs_io.cpp", |
| 30 | + "src/vt/cpu/cpu_threadpool.cpp", |
| 31 | + "src/vllm/platform/console_shutdown.cpp", |
| 32 | + "src/vllm/platform/process.cpp", |
| 33 | +) |
27 | 34 |
|
28 | 35 |
|
29 | 36 | SAFE_FILES = { |
@@ -267,6 +274,27 @@ def assert_rejected(self, relative: str, content: str, reason: str) -> None: |
267 | 274 | self.assertNotEqual(result.returncode, 0, result.stdout + result.stderr) |
268 | 275 | self.assertIn(reason, result.stdout + result.stderr) |
269 | 276 |
|
| 277 | + @staticmethod |
| 278 | + def nominmax_real_sources() -> dict[str, str]: |
| 279 | + return { |
| 280 | + relative: (REPO / relative).read_text(encoding="utf-8") |
| 281 | + for relative in NOMINMAX_REAL_CLOSURE |
| 282 | + } |
| 283 | + |
| 284 | + @staticmethod |
| 285 | + def with_nominmax_fallback(source: str, *, before: bool, |
| 286 | + guarded: bool = True) -> str: |
| 287 | + header = "#include <windows.h>" |
| 288 | + if source.count(header) != 1: |
| 289 | + raise AssertionError("expected exactly one windows.h include") |
| 290 | + definition = "#define NOMINMAX\n" |
| 291 | + if guarded: |
| 292 | + definition = "#ifndef NOMINMAX\n#define NOMINMAX\n#endif\n" |
| 293 | + return source.replace( |
| 294 | + header, |
| 295 | + definition + header if before else header + "\n" + definition, |
| 296 | + ) |
| 297 | + |
270 | 298 | def test_accepts_complete_guarded_contract(self) -> None: |
271 | 299 | result = self.run_checker(self.make_tree()) |
272 | 300 | self.assertEqual(result.returncode, 0, result.stdout + result.stderr) |
@@ -704,6 +732,115 @@ def test_nominmax_contract_follows_central_compile_definition(self) -> None: |
704 | 732 | "unguarded source-local NOMINMAX", |
705 | 733 | ) |
706 | 734 |
|
| 735 | + def test_nominmax_real_closure_accepts_guarded_fallbacks_before_headers( |
| 736 | + self) -> None: |
| 737 | + cmake = textwrap.dedent(SAFE_FILES["CMakeLists.txt"]) |
| 738 | + without_central = cmake.replace( |
| 739 | + "add_compile_definitions(NOMINMAX _CRT_SECURE_NO_WARNINGS)", "" |
| 740 | + ) |
| 741 | + safe_fs = textwrap.dedent( |
| 742 | + SAFE_FILES["src/vllm/v1/kv_offload/fs_io.cpp"] |
| 743 | + ) |
| 744 | + real_sources = self.nominmax_real_sources() |
| 745 | + for relative, source in real_sources.items(): |
| 746 | + with self.subTest(relative=relative): |
| 747 | + result = self.run_checker(self.make_tree({ |
| 748 | + "CMakeLists.txt": without_central, |
| 749 | + "src/vllm/v1/kv_offload/fs_io.cpp": |
| 750 | + self.with_nominmax_fallback(safe_fs, before=True), |
| 751 | + relative: self.with_nominmax_fallback( |
| 752 | + source, before=True |
| 753 | + ), |
| 754 | + })) |
| 755 | + self.assertEqual( |
| 756 | + result.returncode, 0, result.stdout + result.stderr |
| 757 | + ) |
| 758 | + |
| 759 | + def test_nominmax_real_closure_rejects_late_and_unguarded_fallbacks( |
| 760 | + self) -> None: |
| 761 | + cmake = textwrap.dedent(SAFE_FILES["CMakeLists.txt"]) |
| 762 | + without_central = cmake.replace( |
| 763 | + "add_compile_definitions(NOMINMAX _CRT_SECURE_NO_WARNINGS)", "" |
| 764 | + ) |
| 765 | + real_sources = self.nominmax_real_sources() |
| 766 | + all_guarded = { |
| 767 | + relative: self.with_nominmax_fallback(source, before=True) |
| 768 | + for relative, source in real_sources.items() |
| 769 | + } |
| 770 | + for relative, source in real_sources.items(): |
| 771 | + with self.subTest(relative=relative, shape="late"): |
| 772 | + mutations = dict(all_guarded) |
| 773 | + mutations[relative] = self.with_nominmax_fallback( |
| 774 | + source, before=False |
| 775 | + ) |
| 776 | + result = self.run_checker(self.make_tree({ |
| 777 | + "CMakeLists.txt": without_central, |
| 778 | + **mutations, |
| 779 | + })) |
| 780 | + self.assertNotEqual( |
| 781 | + result.returncode, 0, result.stdout + result.stderr |
| 782 | + ) |
| 783 | + self.assertIn( |
| 784 | + f"{relative}: NOMINMAX must be defined centrally", |
| 785 | + result.stdout + result.stderr, |
| 786 | + ) |
| 787 | + |
| 788 | + with self.subTest(relative=relative, shape="unguarded"): |
| 789 | + mutations = dict(real_sources) |
| 790 | + mutations[relative] = self.with_nominmax_fallback( |
| 791 | + source, before=True, guarded=False |
| 792 | + ) |
| 793 | + result = self.run_checker(self.make_tree(mutations)) |
| 794 | + self.assertNotEqual( |
| 795 | + result.returncode, 0, result.stdout + result.stderr |
| 796 | + ) |
| 797 | + self.assertRegex( |
| 798 | + result.stdout + result.stderr, |
| 799 | + rf"{re.escape(relative)}:\d+: unguarded source-local " |
| 800 | + r"NOMINMAX is forbidden", |
| 801 | + ) |
| 802 | + |
| 803 | + def test_nominmax_real_closure_ignores_comment_and_literal_decoys( |
| 804 | + self) -> None: |
| 805 | + real_sources = self.nominmax_real_sources() |
| 806 | + target = "src/vllm/platform/process.cpp" |
| 807 | + source = real_sources[target] |
| 808 | + decoys = { |
| 809 | + "raw string": 'constexpr auto kRaw = R"TAG(\n#define NOMINMAX\n)TAG";\n', |
| 810 | + "ordinary string": 'constexpr auto kString = "\\\n#define NOMINMAX";\n', |
| 811 | + "line comment": "// #define NOMINMAX\n", |
| 812 | + "block comment": "/*\n#define NOMINMAX\n*/\n", |
| 813 | + } |
| 814 | + for shape, decoy in decoys.items(): |
| 815 | + with self.subTest(shape=shape): |
| 816 | + mutations = dict(real_sources) |
| 817 | + mutations[target] = source.replace( |
| 818 | + "#include <windows.h>", |
| 819 | + decoy + "#include <windows.h>", |
| 820 | + ) |
| 821 | + result = self.run_checker(self.make_tree(mutations)) |
| 822 | + self.assertEqual( |
| 823 | + result.returncode, 0, result.stdout + result.stderr |
| 824 | + ) |
| 825 | + |
| 826 | + def test_nominmax_real_closure_without_contract_rejects_all_five_sources( |
| 827 | + self) -> None: |
| 828 | + cmake = textwrap.dedent(SAFE_FILES["CMakeLists.txt"]) |
| 829 | + without_central = cmake.replace( |
| 830 | + "add_compile_definitions(NOMINMAX _CRT_SECURE_NO_WARNINGS)", "" |
| 831 | + ) |
| 832 | + result = self.run_checker(self.make_tree({ |
| 833 | + "CMakeLists.txt": without_central, |
| 834 | + **self.nominmax_real_sources(), |
| 835 | + })) |
| 836 | + self.assertNotEqual(result.returncode, 0, result.stdout + result.stderr) |
| 837 | + output = result.stdout + result.stderr |
| 838 | + for relative in NOMINMAX_REAL_CLOSURE: |
| 839 | + with self.subTest(relative=relative): |
| 840 | + self.assertIn( |
| 841 | + f"{relative}: NOMINMAX must be defined centrally", output |
| 842 | + ) |
| 843 | + |
707 | 844 | def test_pins_peer_close_invalidation(self) -> None: |
708 | 845 | source = textwrap.dedent( |
709 | 846 | SAFE_FILES["src/vllm/v1/kv_offload/lmcache/remote_client.cpp"] |
|
0 commit comments