From 6d69d23aa5574df501ac8bdccdeaaf0ecc550f1b Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 21 Oct 2021 17:44:53 +0200 Subject: Add a unit test to prevent regression --- lib/spack/spack/test/cmd/dependencies.py | 4 +++- lib/spack/spack/test/concretize.py | 14 ++++++++++++++ lib/spack/spack/test/data/config/packages.yaml | 3 ++- lib/spack/spack/test/package_class.py | 1 + .../packages/low-priority-provider/package.py | 18 ++++++++++++++++++ .../packages/many-virtual-consumer/package.py | 18 ++++++++++++++++++ 6 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 var/spack/repos/builtin.mock/packages/low-priority-provider/package.py create mode 100644 var/spack/repos/builtin.mock/packages/many-virtual-consumer/package.py diff --git a/lib/spack/spack/test/cmd/dependencies.py b/lib/spack/spack/test/cmd/dependencies.py index 7ca1eae2e5..9d2ebccd9d 100644 --- a/lib/spack/spack/test/cmd/dependencies.py +++ b/lib/spack/spack/test/cmd/dependencies.py @@ -14,7 +14,9 @@ from spack.main import SpackCommand dependencies = SpackCommand('dependencies') -mpis = ['mpich', 'mpich2', 'multi-provider-mpi', 'zmpi'] +mpis = [ + 'low-priority-provider', 'mpich', 'mpich2', 'multi-provider-mpi', 'zmpi' +] mpi_deps = ['fake'] diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index d30191f4f2..b2ac1b6446 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -1274,3 +1274,17 @@ class TestConcretize(object): # package doesn't end up using a later implementation s = spack.spec.Spec('hpcviewer@2019.02').concretized() assert s['java'].satisfies('virtual-with-versions@1.8.0') + + @pytest.mark.regression('26866') + def test_non_default_provider_of_multiple_virtuals(self): + s = spack.spec.Spec( + 'many-virtual-consumer ^low-priority-provider' + ).concretized() + assert s['mpi'].name == 'low-priority-provider' + assert s['lapack'].name == 'low-priority-provider' + + for virtual_pkg in ('mpi', 'lapack'): + for pkg in spack.repo.path.providers_for(virtual_pkg): + if pkg.name == 'low-priority-provider': + continue + assert pkg not in s diff --git a/lib/spack/spack/test/data/config/packages.yaml b/lib/spack/spack/test/data/config/packages.yaml index 84f470d208..7d5e06a74c 100644 --- a/lib/spack/spack/test/data/config/packages.yaml +++ b/lib/spack/spack/test/data/config/packages.yaml @@ -1,7 +1,8 @@ packages: all: providers: - mpi: [openmpi, mpich] + mpi: [openmpi, mpich, zmpi] + lapack: [openblas-with-lapack] blas: [openblas] externaltool: buildable: False diff --git a/lib/spack/spack/test/package_class.py b/lib/spack/spack/test/package_class.py index 22939105a4..8c55b47ba4 100644 --- a/lib/spack/spack/test/package_class.py +++ b/lib/spack/spack/test/package_class.py @@ -30,6 +30,7 @@ def mpi_names(mock_repo_path): def mpileaks_possible_deps(mock_packages, mpi_names): possible = { 'callpath': set(['dyninst'] + mpi_names), + 'low-priority-provider': set(), 'dyninst': set(['libdwarf', 'libelf']), 'fake': set(), 'libdwarf': set(['libelf']), diff --git a/var/spack/repos/builtin.mock/packages/low-priority-provider/package.py b/var/spack/repos/builtin.mock/packages/low-priority-provider/package.py new file mode 100644 index 0000000000..d0b768637f --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/low-priority-provider/package.py @@ -0,0 +1,18 @@ +# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack import * + + +class LowPriorityProvider(Package): + """Provides multiple virtuals but is low in the priority of clingo""" + + homepage = "http://www.example.com" + url = "http://www.example.com/a-1.0.tar.gz" + + version('1.0', '0123456789abcdef0123456789abcdef') + + provides('lapack') + provides('mpi') diff --git a/var/spack/repos/builtin.mock/packages/many-virtual-consumer/package.py b/var/spack/repos/builtin.mock/packages/many-virtual-consumer/package.py new file mode 100644 index 0000000000..40da0f40e0 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/many-virtual-consumer/package.py @@ -0,0 +1,18 @@ +# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +class ManyVirtualConsumer(Package): + """PAckage that depends on many virtual packages""" + url = "http://www.example.com/" + url = "http://www.example.com/2.0.tar.gz" + + version('1.0', 'abcdef1234567890abcdef1234567890') + + depends_on('mpi') + depends_on('lapack') + + # This directive is an example of imposing a constraint on a + # dependency is that dependency is in the DAG. This pattern + # is mainly used with virtual providers. + depends_on('low-priority-provider@1.0', when='^low-priority-provider') -- cgit v1.2.3-70-g09d2