From 3d579be7e69c936d9f8ec864b1867d1d9a2c1eea Mon Sep 17 00:00:00 2001 From: nmannall Date: Mon, 25 Nov 2024 17:48:43 +0000 Subject: [PATCH] Fix getting variant of test dependency --- reframe_tests/tests/base_tests.py | 31 ++++++++++++++++--- reframe_tests/tests/mixins.py | 6 +++- reframe_tests/tests/test_2d_models.py | 6 ++-- reframe_tests/tests/test_geometry.py | 6 ++-- reframe_tests/tests/test_materials.py | 2 +- reframe_tests/tests/test_pmls.py | 2 +- reframe_tests/tests/test_snapshots.py | 6 ++-- reframe_tests/tests/test_sources.py | 6 ++-- .../tests/test_taskfarm_functionality.py | 5 ++- 9 files changed, 48 insertions(+), 22 deletions(-) diff --git a/reframe_tests/tests/base_tests.py b/reframe_tests/tests/base_tests.py index 5f80614d..31ce5a5e 100644 --- a/reframe_tests/tests/base_tests.py +++ b/reframe_tests/tests/base_tests.py @@ -23,6 +23,7 @@ from reframe.core.builtins import ( sanity_function, variable, ) +from reframe.core.exceptions import DependencyError from reframe.utility import udeps from reframe_tests.tests.regression_checks import RegressionCheck @@ -110,14 +111,34 @@ class GprMaxBaseTest(RunOnlyRegressionTest): regression_checks = variable(typ.List[RegressionCheck], value=[]) - test_dependency = variable(type(None), str, value=None) + # TODO: Make this a ReFrame variable + # Not currently possible as ReFrame does not think an object of type + # reframe.core.meta.RegressionTestMeta is copyable, and so ReFrame + # test classes cannot be specified in a variable. + test_dependency: Optional[type["GprMaxBaseTest"]] = None + # test_dependency = variable(type(None), type, value=None) + + def get_test_dependency_variant_name(self, **kwargs) -> Optional[str]: + if self.test_dependency is None: + return None + + variant_nums = self.test_dependency.get_variant_nums(model=self.model, **kwargs) + + if len(variant_nums) < 1: + kwargs.setdefault("model", self.model) + raise DependencyError( + f"No variant of '{self.test_dependency.__name__}' meets conditions: {kwargs}", + ) + + return self.test_dependency.variant_name(variant_nums[0]) def get_test_dependency(self) -> Optional["GprMaxBaseTest"]: """Get test variant with the same model and number of models""" - if self.test_dependency is None: + variant = self.get_test_dependency_variant_name() + if variant is None: return None else: - return self.getdep(self.test_dependency) + return self.getdep(variant) def build_reference_filepath(self, name: Union[str, os.PathLike]) -> Path: target = self.get_test_dependency() @@ -148,7 +169,9 @@ class GprMaxBaseTest(RunOnlyRegressionTest): """Test depends on the Python virtual environment building correctly""" self.depends_on("CreatePyenvTest", udeps.by_env) if self.test_dependency is not None: - self.depends_on(self.test_dependency, udeps.by_env) + variant = self.get_test_dependency_variant_name() + self.depends_on(variant, udeps.by_env) + # self.depends_on(self.test_dependency, udeps.by_env) @require_deps def get_pyenv_path(self, CreatePyenvTest): diff --git a/reframe_tests/tests/mixins.py b/reframe_tests/tests/mixins.py index 5bcd3b4f..93e96eed 100644 --- a/reframe_tests/tests/mixins.py +++ b/reframe_tests/tests/mixins.py @@ -1,4 +1,5 @@ from pathlib import Path +from typing import Optional import reframe.utility.typecheck as typ from numpy import prod @@ -88,6 +89,9 @@ class BScanMixin(GprMaxMixin): f"mv {self.model}_merged.h5 {self.output_file}", ] + def get_test_dependency_variant_name(self) -> Optional[str]: + return super().get_test_dependency_variant_name(num_models=self.num_models) + class TaskfarmMixin(GprMaxMixin): # num_tasks = required @@ -95,7 +99,7 @@ class TaskfarmMixin(GprMaxMixin): @run_after("setup") def add_taskfarm_flag(self): """Add taskfarm specific commandline arguments""" - self.executable_opts += ["-taskfarm"] + self.executable_opts += ["--taskfarm"] class AntennaModelMixin(GprMaxMixin): diff --git a/reframe_tests/tests/test_2d_models.py b/reframe_tests/tests/test_2d_models.py index 2d495f38..ad301e39 100644 --- a/reframe_tests/tests/test_2d_models.py +++ b/reframe_tests/tests/test_2d_models.py @@ -37,18 +37,18 @@ class Test2DModelYZ(GprMaxRegressionTest): class Test2DModelXYMpi(MpiMixin, Test2DModelXY): tags = {"test", "mpi", "2d", "waveform", "hertzian_dipole"} mpi_layout = parameter([[4, 4, 1]]) - test_dependency = "Test2DModelXY" + test_dependency = Test2DModelXY @rfm.simple_test class Test2DModelXZMpi(MpiMixin, Test2DModelXZ): tags = {"test", "mpi", "2d", "waveform", "hertzian_dipole"} mpi_layout = parameter([[4, 1, 4]]) - test_dependency = "Test2DModelXZ" + test_dependency = Test2DModelXZ @rfm.simple_test class Test2DModelYZMpi(MpiMixin, Test2DModelYZ): tags = {"test", "mpi", "2d", "waveform", "hertzian_dipole"} mpi_layout = parameter([[1, 4, 4]]) - test_dependency = "Test2DModelYZ" + test_dependency = Test2DModelYZ diff --git a/reframe_tests/tests/test_geometry.py b/reframe_tests/tests/test_geometry.py index 5dfbb119..aaae282d 100644 --- a/reframe_tests/tests/test_geometry.py +++ b/reframe_tests/tests/test_geometry.py @@ -49,18 +49,18 @@ class TestEdgeGeometry(AntennaModelMixin, GprMaxRegressionTest): class TestBoxGeometryDefaultPmlMpi(MpiMixin, TestBoxGeometryDefaultPml): tags = {"test", "mpi", "geometery", "box"} mpi_layout = parameter([[2, 2, 2], [3, 3, 3], [4, 4, 4]]) - test_dependency = "TestBoxGeometryDefaultPml" + test_dependency = TestBoxGeometryDefaultPml @rfm.simple_test class TestBoxGeometryNoPmlMpi(MpiMixin, TestBoxGeometryNoPml): tags = {"test", "mpi", "geometery", "box"} mpi_layout = parameter([[2, 2, 2], [3, 3, 3], [4, 4, 4]]) - test_dependency = "TestBoxGeometryNoPml" + test_dependency = TestBoxGeometryNoPml @rfm.simple_test class TestEdgeGeometryMpi(MpiMixin, TestEdgeGeometry): tags = {"test", "mpi", "geometry", "edge", "transmission_line", "waveform", "antenna"} mpi_layout = parameter([[3, 3, 3]]) - test_dependency = "TestEdgeGeometry" + test_dependency = TestEdgeGeometry diff --git a/reframe_tests/tests/test_materials.py b/reframe_tests/tests/test_materials.py index d7f75aeb..bb31fdea 100644 --- a/reframe_tests/tests/test_materials.py +++ b/reframe_tests/tests/test_materials.py @@ -23,4 +23,4 @@ class TestDispersiveMaterials(GprMaxRegressionTest): class TestDispersiveMaterialsMpi(MpiMixin, TestDispersiveMaterials): tags = {"test", "mpi", "hertzian_dipole", "waveform", "material", "dispersive", "box"} mpi_layout = parameter([[3, 3, 3]]) - test_dependency = "TestDispersiveMaterials" + test_dependency = TestDispersiveMaterials diff --git a/reframe_tests/tests/test_pmls.py b/reframe_tests/tests/test_pmls.py index 25e22194..13f503f9 100644 --- a/reframe_tests/tests/test_pmls.py +++ b/reframe_tests/tests/test_pmls.py @@ -23,4 +23,4 @@ class TestSingleCellPml(GprMaxRegressionTest): class TestSingleCellPmlMpi(MpiMixin, TestSingleCellPml): tags = {"test", "mpi", "geometery", "box", "pml"} mpi_layout = parameter([[2, 2, 1], [3, 3, 1]]) - test_dependency = "TestSingleCellPml" + test_dependency = TestSingleCellPml diff --git a/reframe_tests/tests/test_snapshots.py b/reframe_tests/tests/test_snapshots.py index c24241f2..cd7aee50 100644 --- a/reframe_tests/tests/test_snapshots.py +++ b/reframe_tests/tests/test_snapshots.py @@ -50,7 +50,7 @@ class Test2DSliceSnapshot(GprMaxSnapshotTest): class Test2DSnapshotMpi(MpiMixin, Test2DSnapshot): tags = {"test", "mpi", "2d", "waveform", "hertzian_dipole", "snapshot"} mpi_layout = parameter([[2, 2, 1], [3, 3, 1], [4, 4, 1]]) - test_dependency = "Test2DSnapshot" + test_dependency = Test2DSnapshot @rfm.simple_test @@ -69,7 +69,7 @@ class TestSnapshotMpi(MpiMixin, TestSnapshot): [4, 4, 4], ] ) - test_dependency = "TestSnapshot" + test_dependency = TestSnapshot @rfm.simple_test @@ -88,4 +88,4 @@ class Test2DSliceSnapshotMpi(MpiMixin, Test2DSliceSnapshot): [4, 4, 4], ] ) - test_dependency = "Test2DSliceSnapshot" + test_dependency = Test2DSliceSnapshot diff --git a/reframe_tests/tests/test_sources.py b/reframe_tests/tests/test_sources.py index cd4613d7..9bca3b42 100644 --- a/reframe_tests/tests/test_sources.py +++ b/reframe_tests/tests/test_sources.py @@ -37,18 +37,18 @@ class TestTransmissionLineSource(GprMaxRegressionTest): class TestHertzianDipoleSourceMpi(MpiMixin, TestHertzianDipoleSource): tags = {"test", "mpi", "hertzian_dipole", "waveform"} mpi_layout = parameter([[3, 3, 3]]) - test_dependency = "TestHertzianDipoleSource" + test_dependency = TestHertzianDipoleSource @rfm.simple_test class TestMagneticDipoleSourceMpi(MpiMixin, TestMagneticDipoleSource): tags = {"test", "mpi", "magnetic_dipole", "waveform"} mpi_layout = parameter([[3, 3, 3]]) - test_dependency = "TestMagneticDipoleSource" + test_dependency = TestMagneticDipoleSource @rfm.simple_test class TestTransmissionLineSourceMpi(MpiMixin, TestTransmissionLineSource): tags = {"test", "mpi", "transmission_line", "waveform"} mpi_layout = parameter([[3, 3, 3]]) - test_dependency = "TestTransmissionLineSource" + test_dependency = TestTransmissionLineSource diff --git a/reframe_tests/tests/test_taskfarm_functionality.py b/reframe_tests/tests/test_taskfarm_functionality.py index f2cc31c6..53aa20ef 100644 --- a/reframe_tests/tests/test_taskfarm_functionality.py +++ b/reframe_tests/tests/test_taskfarm_functionality.py @@ -1,7 +1,6 @@ import reframe as rfm from reframe_tests.tests.mixins import TaskfarmMixin -from reframe_tests.tests.standard_tests import GprMaxRegressionTest from reframe_tests.tests.test_example_models import TestBscan """Reframe regression tests for taskfarm functionality @@ -23,7 +22,7 @@ class TestSingleNodeTaskfarm(TaskfarmMixin, TestBscan): } num_tasks = 8 num_tasks_per_node = 8 - test_dependency = "TestBscan" + test_dependency = TestBscan @rfm.simple_test @@ -41,4 +40,4 @@ class TestMultiNodeTaskfarm(TaskfarmMixin, TestBscan): } num_tasks = 32 num_tasks_per_node = 8 - test_dependency = "TestBscan" + test_dependency = TestBscan