Repository navigation
ci(hipdnn): run the IngestorGenerator and DescriptorGenerator pytest suites in superbuild CI - #13385
Conversation
The IngestorGenerator and DescriptorGenerator pytest suites never ran in the superbuild lanes: the CI venv lacked PyYAML and Jinja2, and nothing registered them with ctest. Register both as ctest tests behind HIPDNN_ENABLE_TOOLING_TESTS, which is off by default and fails configure when pytest, PyYAML or Jinja2 is missing from the interpreter, and enable it in the Linux superbuild job. ctest reports a suite whose every case skips as a pass, so check_pytest_junit.py reads the pytest junit and fails on any skip that hipdnn-tooling-allowed-skips.txt does not name, and on any allow-list entry that no longer matches a skip. The gates that skipped for want of an input are closed where the build can supply it. ctest exports HIPDNN_VALIDATE_DESCRIPTORS for the round-trip tests and writes the flatbuffers and HIP include directories to a file named by HIPDNN_INGESTOR_STUB_INCLUDE_FILE for the native-stub tests, where a bad value now fails instead of skipping. The DescriptorGenerator CLI tests run under sys.executable instead of skipping without a local .venv, and the dispatch-parity tests fail, rather than skip, when the shipped profile names a module the in-tree rocKE does not provide. ALMIOPEN-2843
…tier and make the sys.path probe self-contained test_specialization_agreement.py needs neither hipcc nor comgr, so it belongs to the quick tier; the marker moves its 73 tests from the hkp-pack ctest entry to hkp-pack-quick. test_worker_inherits_parent_sys_path watched HIPKERNELPROVIDER_ROCM_KPACK_DIR, which made it skip when the variable was unset and pass without checking anything when the directory was already a site-packages directory that the child sees regardless. It now prepends a directory it creates itself, so the premise holds in every environment. ALMIOPEN-2843
…cKE dispatcher The rocKE dispatcher replaced dense_spec_for_request and the dense_* request fields with opt-in dense candidates selected by algorithm and spec_id, so the shipped gfx950 dense profile named modules and fields that no longer exist and its dispatch-parity tests failed. The profile now selects the non-persistent grid body through a dispatch.pin and resolves it with dispatch_attention, and the reference-candidates family follows the new algorithm name. dispatch_parity.py reads four optional keys from the profile's dispatch block. The pin is merged into every request and outranks the shape, so a shape cannot mix another kernel family into the catalog. The result_attr and spec_attr keys walk the dispatcher's return value down to the architecture's spec, and refusal_exception names the class the dispatcher raises to decline a shape, which is reported as a per-shape decline as the predicate's was. reconcile_applicability.py inherits the pin for its reference requests, since an opt-in candidate declines every request that does not name it. The shipped-profile tests resolve through the tool and check that the grid body is non-persistent, that pinning the persistent body flips it, that a head size the body refuses is a decline, that a shape naming another candidate aborts, and that the reference oracle reaches the pinned candidate. The test that pinned dense_persistent as a YAML string is removed because the field no longer exists. ALMIOPEN-2843
The renderers returned str(rel_path) for each file they wrote, which is a backslash path on Windows. The returned lists name files for downstream consumers and for the preview output, so a Windows run produced a different list than a Linux one. Use as_posix() so the lists are identical on every platform; all 695 DescriptorGenerator tests pass on Windows, where 23 failed before. ALMIOPEN-2843
Enable HIPDNN_ENABLE_TOOLING_TESTS in the Windows job and check its junit with the same checker as the Linux lane. The flatbuffers and HIP include list is written on Windows as well, and the build's own clang++ directory is prepended to the ingestor test's PATH, since the native-stub tests look for g++ or clang++ there and the lane only puts the ROCm bin directory on PATH. The MSVC environment the lane already configures gives that clang its standard library headers. check_pytest_junit.py accepts --allow-skips more than once and pools the lists, so the Windows lane adds its own entries to the shared ones; Linux reads only the shared list, where a Windows-only entry would be stale. The Windows list covers the sweep tests, which drive a benchmark on an allocated Linux device host by design. ALMIOPEN-2843
Give the script the shape of its sibling: a shebang, a usage and exit-code section in the module docstring, type hints, and Path-typed arguments. ALMIOPEN-2843
✅ All Checks Passed — Ready for Review
📖 Need help? See the Policy FAQ for details on every check and how to fix failures. |
|
🎉 All checks passed! This PR is ready for review. |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #13385 +/- ##
===========================================
- Coverage 75.95% 71.96% -3.99%
===========================================
Files 2880 2885 +5
Lines 479003 478200 -803
Branches 71955 70691 -1264
===========================================
- Hits 363791 344092 -19699
- Misses 90349 110137 +19788
+ Partials 24863 23971 -892
*This pull request uses carry forward flags. Click here to find out more. 🚀 New features to boost your workflow:
|
…s beside the suites The allow-lists now live in projects/hipdnn/tools next to the tests they excuse and the ctest names they key on, so hipdnn-core maintains them and the list headers cite the KNOWN_BAD and KNOWN_VIOLATIONS rule that a list only shrinks. The Windows list names the eight sweep-test classes that carry the POSIX-only markers instead of the whole module, so a new environment-gated skip elsewhere in it still fails the check. The header example no longer uses a bracketed test id, which fnmatch reads as a character class. HIPDNN_ENABLE_TOOLING_TESTS now fails configure when the kernel ingestor is off, because the IngestorGenerator suite runs the validator that option builds and registering only the other suite would leave it silently absent, and it says so when HIPDNN_SKIP_TESTS makes it a no-op. The pin dialect of dispatch_parity.py gains tests that need no rocKE, covering the route-only guard, a missing attribute, a non-refusal exception staying fatal and a malformed refusal_exception. The provider-root lookup in the dispatch-parity tests goes through launch_surface.find_repo_root like the tool does, and two comments that described a lane and a try-block structure no longer true are dropped or reworded. The two pool tests that check sys.path reaches a worker no longer pass vacuously on Linux, where the default start method forks and the child copies the parent's memory: they pin the pool to spawn, and the first drops an assertion that could not fail. The checker's tests use unittest like the rest of their directory and assert the exact failure ids, the counts in the OK line and the skip reason. In the dispatch-parity tests the pin-conflict case moves to the class that needs no rocKE, the stub proves the pin reaches every request, and the refusal test no longer asserts rocKE's own wording. ALMIOPEN-2843
…IOPEN-2843/tooling-tests-in-superbuild-ci The one conflict, in the Linux "Run tests" step of hipdnn-superbuild-ci.yml, keeps both the step id that the tooling junit check depends on and the ROCKE_COMGR_LIB environment that develop added for the native rocKE tests. ALMIOPEN-2843
The gfx950 dense ingestor profile named a rocKE dispatcher entry point, a request field and spec ids the dispatcher no longer has, and the tests that read it skipped without rocKE, so nothing flagged the drift. Porting it to the current dispatcher only restated in YAML what the dispatcher registry already answers, and the next dispatcher change would break it again, so the profile is deleted rather than maintained. The repository ships no profile again, and dispatch_parity.py, reconcile_applicability.py and knob_sweep.py take the author's own through --profile. The pin dialect that the earlier port added to dispatch_parity.py (dispatch.pin, result_attr, spec_attr and refusal_exception) and the pin inheritance in reconcile_applicability.py existed only to serve that profile, so both are removed with their tests, which returns the two tools to their form before the port. The dispatch-parity tests that resolved the profile through the real dispatcher or checked its provider_root are removed as well, along with the two config-loader tests that required a profile under configs/. The stub-based tests of the tools remain. ALMIOPEN-2843
BrianHarrisonAMD
left a comment
There was a problem hiding this comment.
LGTM thanks.
Lets get this merged, and we can update #13024 with these changes + figure out the way forward.
…IOPEN-2843/tooling-tests-in-superbuild-ci # Conflicts: # .github/workflows/hipdnn-superbuild-ci.yml
|
Tagging @geomin12 for review as well |
…IOPEN-2843/tooling-tests-in-superbuild-ci # Conflicts: # projects/hipdnn/test_categories.yaml # projects/hipdnn/tools/IngestorGenerator/tests/test_native_stub.py
There was a problem hiding this comment.
some comments, but would prefer to fix the root cause of pytest skipping tests rather than this workaround
if this is needed though, i would like a better explanation in the check_pytest_junit.py (i'm an external contributor and would need to understand context via code)
…ng junit ctest reports a pytest run as passed when every case skips, so a compiler, a validator binary or a kpack that is missing at run time left the IngestorGenerator and DescriptorGenerator suites green without running part of them. Both suites run under a pytest plugin, hipdnn_strict_skips, that turns any skipped or xfailed test into a failure. A skip that is correct by design, such as an author-supplied input or the POSIX-only sweep tests on Windows, opts out with @pytest.mark.allow_skip(reason=...) beside the code that skips, and a skip raised while a module is imported fails the collection. This replaces check_pytest_junit.py with its allow-lists and the separate junit step in each lane, so the suites run in the ordinary ctest step. The packaging-probe gate follows the same reasoning. HIPKERNELPROVIDER_MIN_PACKAGING_PROBES fails configure when probe discovery declares fewer probes than a lane requires, or when it is set without the probes option, so a lane that must always have a probe cannot pass with none. Both superbuild lanes set it to 1 and run ctest with --no-tests=error, which replaces check_probe_junit.py and the manifest it read. The native-stub tests get the compiler that builds the tree by putting its directory on the test PATH on every platform, so the Linux runner needs no separate C++ compiler. ALMIOPEN-2843
…IOPEN-2843/tooling-tests-in-superbuild-ci # Conflicts: # projects/hipdnn/tools/IngestorGenerator/tests/test_config_loader.py # projects/hipdnn/tools/IngestorGenerator/tests/test_coverage_gate.py # projects/hipdnn/tools/IngestorGenerator/tests/test_dispatch_parity.py # projects/hipdnn/tools/IngestorGenerator/tests/test_variant_reachability.py
…f the tooling suite TestAgainstTheRealBuild gates a build packed with the gfx950 attention engine and runs against any build directory that holds a validator and a packed tree. The superbuild lanes pack other descriptors, so the class fails on Linux, where the packed tree holds the example engines, and cannot find the packed tree on Windows, where the plugin tree lives under bin. The ingestor ctest entry deselects it rather than counting a skip, since no lane is expected to pack that engine. The coverage-gate test that serves a threshold the tool cannot check uses a shebang script as its stand-in validator, which Windows cannot execute directly, so it skips off POSIX and is allowed to skip under the strict-skips plugin. ALMIOPEN-2843
…IOPEN-2843/tooling-tests-in-superbuild-ci
test_registry_regeneration.py diffs the regenerated catalog against the shipped gfx950 attention KDP, which is DVC-managed. The Linux lane packs the example descriptors rather than the production tree, so nothing fetched it and both tests skipped. The tooling suite fails skips inside pytest, so the lane failed. Pull the descriptors tree the way the Windows lane does, and check that a pointer-backed KDP landed. ALMIOPEN-2843
…IOPEN-2843/tooling-tests-in-superbuild-ci test_native_stub.py: keep both imports (os for the include-file lookup, re for the placeholder check). Adapt develop's new IngestorGenerator tests to the strict-skip suite run: - test_inventory: the RUNBOOK-recipe case skips on Windows by design, so it is allow_skip; a POSIX host without bash/sha256sum now fails instead of skipping. - test_packs_formatting skips without clang-format. Install the pre-commit hook's clang-format==18.1.4 in the lane venv and hand it to the suite as HIPDNN_CLANG_FORMAT, since the venv's scripts directory is not on PATH.
geomin12
left a comment
There was a problem hiding this comment.
lgtm, but would love to cover these testing gaps in TheRock CI, so we don't maintain these other workflows!
@geomin12 did we want dev-tooling, dev-builds, and non-production testing added to TheRock CI? I thought this split made sense, but if preferred we could try land future things in TheRock CI, and eventually migrate these. |
# Conflicts: # .github/requirements-hipdnn-superbuild-ci.txt # projects/hipdnn/tools/CMakeLists.txt
…lates The live packs moved to hipdnn_plugin_sdk/ingestor/NativeHooks.hpp; the templates still emitted hipdnn_plugin_sdk/NativeRegistry.hpp, so the census regeneration and clang-format fixed-point tests failed once they ran in CI.
|
issuing override merge |
…olved (#14209) ## Summary Fixes the `hipdnn_ingestor_generator_pytest` failure on the Linux hipDNN Superbuild lane. The ctest entry now passes `HKP_HIPCC`, so the multi-launch rocKE tests from #14158 find the compiler. Before this change they found it only when hipcc was on `PATH`, which is true on Windows but not on Linux. JIRA ID : ALMIOPEN-2973 Related: #14158 added the test; #13385 made the suite a superbuild ctest entry. Each PR passed its own CI; the failure appears only with both merged. ## Risk Assessment Risk 1 of 5. The change only sets an environment variable on one test entry. That entry is registered only when `HIPDNN_ENABLE_TOOLING_TESTS=ON`, which only superbuild CI turns on. ## ASIC Coverage Host-only test wiring with no device code. Passing PR CI is sufficient. ## Testing Summary - The four cases in `test_verify_variant_sets_multi_launch_rocke.py` reproduce the CI error without hipcc and pass with `HKP_HIPCC` set. - Configuring hipDNN with the tooling tests on writes `HKP_HIPCC` into the test's environment in the generated ctest file. ## Testing Checklist - [x] Reproduction - `pytest tests/test_verify_variant_sets_multi_launch_rocke.py` with `PATH=/usr/bin:/bin` - Status: 4 errors (`hipcc not found`), matching CI - [x] Fix - same command with `HKP_HIPCC=/opt/rocm/bin/hipcc` - Status: Passed (4) - [x] CMake wiring - configure `projects/hipdnn` with `HIPDNN_ENABLE_KERNEL_INGESTOR=ON` and `HIPDNN_ENABLE_TOOLING_TESTS=ON` - Status: `HKP_HIPCC` set on `hipdnn_ingestor_generator_pytest` - [ ] PR CI - HipDNN Linux and Windows Superbuild - Status: Pending ## Technical Changes - The test entry takes the hipcc that `find_package(hip)` resolves, the same source the descriptor-packaging ctest entries use. The alternative, putting the ROCm bin directory on `PATH` in the Linux workflow, would change the environment of every Linux test.
Conflicts resolved, keeping the behaviour of both sides: - Container.cpp (#13028, UHD runtime): engine creation now takes the whole descriptor set. Pass withComputedBehaviorNotes(set) to it, so the plan serialization note and the prediction and selector inputs both survive. - ConvNative.cpp, PointwiseNative.cpp (#13028): include lists; keep both. - kernel_ingestor_engine tests CMakeLists.txt (#14158, multi-launch rocKE kernels): keep TestLaunchKernelDefinition.cpp and TestRestoredIngestorPlan.cpp. - TestKernelIngestorEngine.cpp (#13028): DispatchRegistry moved to NativeHooks.hpp; keep all tests of both sides. - IKernelDispatchHandler.hpp (#14158): include list; launchNames() and the save, restore and supportsSaving() hooks all stay. - TestBenchmarkPlan.cpp (#13028): include list and appended tests; keep both. - hipdnn-superbuild-ci.yml (#13385, tooling tests in CI): both lanes pass HIPDNN_ENABLE_TOOLING_TESTS and HIPKERNELPROVIDER_GENERATE_SERIALIZE_HEADERS. - PluginDevelopment.md, RFC 0009 (#13763, docs sweep and RFC status): keep the status header and the drift fixes. The RFC now says that hip-kernel-provider exports the serialization hooks. Testing (gfx942 MI300X, image hipdnn_20261017_gfx942): - Baseline, clean develop 0bb1c36: build OK, quick set 62/62 (job 68147020). - Merged tree: build OK, quick set 62/62 (job 68147243). - Targeted provider tests: unit 195/195, IntegrationGpuKernelIngestor* 26/26 (job 68147244). Plugin SDK targeted tests 309/309 (job 68147245). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ons from the registry registry_enumerator: - enumerate.also sections may be space: full. Each section projects its own varying performance knobs; the catalog's projected knobs are their union, in reduction.fields.performance order, and --plan-space counts every section. - A manifest `launches` block (launch name -> override, two or more) is copied onto every kernel's kernel_source, for a builder returning a KernelModule. - A registry candidate that pairs its kernel with a reduce kernel (reduce_spec beside kernel_spec) without `launches` exits 2: the catalog would otherwise ship the kernel without the reduce the dispatcher launches after it. Regeneration gates (test_registry_regeneration.py): - g1 keys every kernel on its launches (name, builder, role), and reads the spec fields a kernel omits from the selection kernel, so a field dropped from every kernel is still compared with its default (negative control added). - g3 compares a space: full catalog as a --subset: variant reduction ships a strict subset of the enumeration by design. - g4 compares the selection's launch set with the manifest's. - g6 hydrates and predicate-checks every launch of a multi-launch kernel, and checks a module builder yields exactly the launched roles. - A manifest without its selection, or without a *Native.cpp mirror, fails instead of skipping, as the strict-skip CTest lane (#13385) would. Co-Authored-By: Claude <noreply@anthropic.com>
TheRock Submodule Bump ActivityNewest first
|
…ons from the registry registry_enumerator: - enumerate.also sections may be space: full. Each section projects its own varying performance knobs; the catalog's projected knobs are their union, in reduction.fields.performance order, and --plan-space counts every section. - A manifest `launches` block (launch name -> override, two or more) is copied onto every kernel's kernel_source, for a builder returning a KernelModule. - A registry candidate that pairs its kernel with a reduce kernel (reduce_spec beside kernel_spec) without `launches` exits 2: the catalog would otherwise ship the kernel without the reduce the dispatcher launches after it. Regeneration gates (test_registry_regeneration.py): - g1 keys every kernel on its launches (name, builder, role), and reads the spec fields a kernel omits from the selection kernel, so a field dropped from every kernel is still compared with its default (negative control added). - g3 compares a space: full catalog as a --subset: variant reduction ships a strict subset of the enumeration by design. - g4 compares the selection's launch set with the manifest's. - g6 hydrates and predicate-checks every launch of a multi-launch kernel, and checks a module builder yields exactly the launched roles. - A manifest without its selection, or without a *Native.cpp mirror, fails instead of skipping, as the strict-skip CTest lane (#13385) would. Co-Authored-By: Claude <noreply@anthropic.com>
…ons from the registry registry_enumerator: - enumerate.also sections may be space: full. Each section projects its own varying performance knobs; the catalog's projected knobs are their union, in reduction.fields.performance order, and --plan-space counts every section. - A manifest `launches` block (launch name -> override, two or more) is copied onto every kernel's kernel_source, for a builder returning a KernelModule. - A registry candidate that pairs its kernel with a reduce kernel (reduce_spec beside kernel_spec) without `launches` exits 2: the catalog would otherwise ship the kernel without the reduce the dispatcher launches after it. Regeneration gates (test_registry_regeneration.py): - g1 keys every kernel on its launches (name, builder, role), and reads the spec fields a kernel omits from the selection kernel, so a field dropped from every kernel is still compared with its default (negative control added). - g3 compares a space: full catalog as a --subset: variant reduction ships a strict subset of the enumeration by design. - g4 compares the selection's launch set with the manifest's. - g6 hydrates and predicate-checks every launch of a multi-launch kernel, and checks a module builder yields exactly the launched roles. - A manifest without its selection, or without a *Native.cpp mirror, fails instead of skipping, as the strict-skip CTest lane (#13385) would. Co-Authored-By: Claude <noreply@anthropic.com>
…ons from the registry registry_enumerator: - enumerate.also sections may be space: full. Each section projects its own varying performance knobs; the catalog's projected knobs are their union, in reduction.fields.performance order, and --plan-space counts every section. - A manifest `launches` block (launch name -> override, two or more) is copied onto every kernel's kernel_source, for a builder returning a KernelModule. - A registry candidate that pairs its kernel with a reduce kernel (reduce_spec beside kernel_spec) without `launches` exits 2: the catalog would otherwise ship the kernel without the reduce the dispatcher launches after it. Regeneration gates (test_registry_regeneration.py): - g1 keys every kernel on its launches (name, builder, role), and reads the spec fields a kernel omits from the selection kernel, so a field dropped from every kernel is still compared with its default (negative control added). - g3 compares a space: full catalog as a --subset: variant reduction ships a strict subset of the enumeration by design. - g4 compares the selection's launch set with the manifest's. - g6 hydrates and predicate-checks every launch of a multi-launch kernel, and checks a module builder yields exactly the launched roles. - A manifest without its selection, or without a *Native.cpp mirror, fails instead of skipping, as the strict-skip CTest lane (#13385) would. Co-Authored-By: Claude <noreply@anthropic.com>
…ons from the registry registry_enumerator: - enumerate.also sections may be space: full. Each section projects its own varying performance knobs; the catalog's projected knobs are their union, in reduction.fields.performance order, and --plan-space counts every section. - A manifest `launches` block (launch name -> override, two or more) is copied onto every kernel's kernel_source, for a builder returning a KernelModule. - A registry candidate that pairs its kernel with a reduce kernel (reduce_spec beside kernel_spec) without `launches` exits 2: the catalog would otherwise ship the kernel without the reduce the dispatcher launches after it. Regeneration gates (test_registry_regeneration.py): - g1 keys every kernel on its launches (name, builder, role), and reads the spec fields a kernel omits from the selection kernel, so a field dropped from every kernel is still compared with its default (negative control added). - g3 compares a space: full catalog as a --subset: variant reduction ships a strict subset of the enumeration by design. - g4 compares the selection's launch set with the manifest's. - g6 hydrates and predicate-checks every launch of a multi-launch kernel, and checks a module builder yields exactly the launched roles. - A manifest without its selection, or without a *Native.cpp mirror, fails instead of skipping, as the strict-skip CTest lane (#13385) would. Co-Authored-By: Claude <noreply@anthropic.com>
…ons from the registry registry_enumerator: - enumerate.also sections may be space: full. Each section projects its own varying performance knobs; the catalog's projected knobs are their union, in reduction.fields.performance order, and --plan-space counts every section. - A manifest `launches` block (launch name -> override, two or more) is copied onto every kernel's kernel_source, for a builder returning a KernelModule. - A registry candidate that pairs its kernel with a reduce kernel (reduce_spec beside kernel_spec) without `launches` exits 2: the catalog would otherwise ship the kernel without the reduce the dispatcher launches after it. Regeneration gates (test_registry_regeneration.py): - g1 keys every kernel on its launches (name, builder, role), and reads the spec fields a kernel omits from the selection kernel, so a field dropped from every kernel is still compared with its default (negative control added). - g3 compares a space: full catalog as a --subset: variant reduction ships a strict subset of the enumeration by design. - g4 compares the selection's launch set with the manifest's. - g6 hydrates and predicate-checks every launch of a multi-launch kernel, and checks a module builder yields exactly the launched roles. - A manifest without its selection, or without a *Native.cpp mirror, fails instead of skipping, as the strict-skip CTest lane (#13385) would. Co-Authored-By: Claude <noreply@anthropic.com>
Summary
The IngestorGenerator and DescriptorGenerator pytest suites never ran in the hipDNN superbuild lanes: the CI venv had no PyYAML or Jinja2, nothing registered them with ctest, and several of their tests skipped silently without their inputs. This runs both suites as ordinary ctest entries in the Linux and Windows superbuild jobs (not TheRock) under a small pytest plugin that fails any skip a test has not explicitly allowed, and replaces the packaging-probe junit check with a configure-time minimum.
JIRA ID : ALMIOPEN-2843
Risk Assessment
Risk 3 of 5: no product code changes, but a new gate lands in the superbuild lanes, so a regression in these tools can now turn them red, and a lane that discovers fewer packaging probes than it requires now fails at configure. The suites register behind
HIPDNN_ENABLE_TOOLING_TESTS, which defaults to OFF and is enabled only inhipdnn-superbuild-ci.yml; the probe minimum defaults to 0 and only the two superbuild lanes set it. TheRock and developer builds are unchanged.ASIC Coverage
Host-only: the tests drive Python generators and compile generated C++ with
-fsyntax-only, and the probe check runs at configure time. No device code, dispatch default or support surface changes, so passing PR CI is sufficient.Testing Summary
cteston Linux (ROCm container, the lane's flags, a built gfx942 packing tree) and on Windows. On Linux the ingestor suite also passes with no system C++ compiler onPATH, using only the compiler that builds the tree.skipif, fixture and module-level skips, xfail, and theallow_skipmarker with and without a reason.Testing Checklist
ctest -R hipdnn_descriptor_generator_pytest- Status: Passed (695, none skipped)ctest -R hipdnn_ingestor_generator_pytest- Status: Passed withrocm_kpackinstalled, as the lanes dopython -m pytest projects/hipdnn/tools/IngestorGenerator/tests/test_strict_skips_plugin.py- Status: Passed (3)-DHIPKERNELPROVIDER_ENABLE_PACKAGING_PROBES=ONand-DHIPKERNELPROVIDER_MIN_PACKAGING_PROBESset to 1, 99, and 1 with the probes option OFF - Status: passes, fails, fails as intendedpython -m pytest tests -m quickindescriptor-packaging- Status: PassedTechnical Changes
HIPDNN_ENABLE_TOOLING_TESTSregisters the two suites as ctest tests (build tree only). Configure fails if pytest, PyYAML, Jinja2 or the kernel ingestor is missing, and the CI requirements file gains PyYAML and Jinja2.hipdnn_strict_skips(projects/hipdnn/tools/pytest_plugins/) is a pytest plugin that turns any skipped or xfailed test into a failure. A skip that is correct by design opts out with@pytest.mark.allow_skip(reason=...)beside the code that skips: the POSIX-only sweep tests and the coverage-gate test that runs a shebang script. A skip raised while a module is imported fails the collection. Run by hand the plugin is not loaded, so tests skip as before.ctestsupplies the validator binary, the flatbuffers/HIP include directories, and puts the directory of the compiler that builds the tree on the testPATH, so the native-stub tests need no separate C++ compiler. The DescriptorGenerator CLI tests usesys.executable, and its file lists useas_posix()(23 Windows failures before).TestAgainstTheRealBuildis deselected in the ingestor ctest entry: it gates a build packed with the gfx950 attention engine, which neither lane packs.HIPKERNELPROVIDER_MIN_PACKAGING_PROBESfails configure when probe discovery declares fewer probes than a lane requires, or when it is set without the probes option. Both superbuild lanes set it to 1 and runctestwith--no-tests=error, which replacescheck_probe_junit.py, its tests and the manifest it read.test_specialization_agreement.pymoves to the quick tier, and the workersys.pathtests no longer depend onHIPKERNELPROVIDER_ROCM_KPACK_DIRor pass vacuously where the default start method forks.Related PRs
ctestby label on dispatch runs, which could leave the tooling ctest entries or the packaging probes unselected; whichever merges second should make sure they stay in the selected set.test_native_stub.pyand the IngestorGenerator README.