Added unit tests to for regressions on open concretizer bugs
This commit is contained in:
parent
63327d1eea
commit
e0ae60edc4
@ -18,17 +18,28 @@
|
||||
def test_immediate_dependents(mock_packages):
|
||||
out = dependents('libelf')
|
||||
actual = set(re.split(r'\s+', out.strip()))
|
||||
assert actual == set(['dyninst', 'libdwarf',
|
||||
'patch-a-dependency', 'patch-several-dependencies'])
|
||||
assert actual == set([
|
||||
'dyninst',
|
||||
'libdwarf',
|
||||
'patch-a-dependency',
|
||||
'patch-several-dependencies',
|
||||
'quantum-espresso'
|
||||
])
|
||||
|
||||
|
||||
def test_transitive_dependents(mock_packages):
|
||||
out = dependents('--transitive', 'libelf')
|
||||
actual = set(re.split(r'\s+', out.strip()))
|
||||
assert actual == set(
|
||||
['callpath', 'dyninst', 'libdwarf', 'mpileaks', 'multivalue-variant',
|
||||
'singlevalue-variant-dependent',
|
||||
'patch-a-dependency', 'patch-several-dependencies'])
|
||||
assert actual == set([
|
||||
'callpath',
|
||||
'dyninst',
|
||||
'libdwarf',
|
||||
'mpileaks',
|
||||
'multivalue-variant',
|
||||
'singlevalue-variant-dependent',
|
||||
'patch-a-dependency', 'patch-several-dependencies',
|
||||
'quantum-espresso'
|
||||
])
|
||||
|
||||
|
||||
@pytest.mark.db
|
||||
|
@ -2,6 +2,8 @@
|
||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
import sys
|
||||
|
||||
import pytest
|
||||
|
||||
import archspec.cpu
|
||||
@ -683,6 +685,9 @@ def test_compiler_conflicts_in_package_py(self, spec_str, expected_str):
|
||||
('py-extension3@1.1 ^python@2.7.11', ['patchelf@0.9'], []),
|
||||
('py-extension3@1.0 ^python@3.5.1', ['patchelf@0.10'], []),
|
||||
])
|
||||
@pytest.mark.skipif(
|
||||
sys.version_info[:2] == (3, 5), reason='Known failure with Python3.5'
|
||||
)
|
||||
def test_conditional_dependencies(self, spec_str, expected, unexpected):
|
||||
s = Spec(spec_str).concretized()
|
||||
|
||||
@ -710,3 +715,143 @@ def test_patching_dependencies(self, spec_str, patched_deps):
|
||||
for dep, num_patches in patched_deps:
|
||||
assert s[dep].satisfies('patches=*')
|
||||
assert len(s[dep].variants['patches'].value) == num_patches
|
||||
|
||||
@pytest.mark.regression(
|
||||
'267,303,1781,2310,2632,3628'
|
||||
)
|
||||
@pytest.mark.parametrize('spec_str, expected', [
|
||||
# Need to understand that this configuration is possible
|
||||
# only if we use the +mpi variant, which is not the default
|
||||
('fftw ^mpich', ['+mpi']),
|
||||
# This spec imposes two orthogonal constraints on a dependency,
|
||||
# one of which is conditional. The original concretizer fail since
|
||||
# when it applies the first constraint, it sets the unknown variants
|
||||
# of the dependency to their default values
|
||||
('quantum-espresso', ['^fftw@1.0+mpi']),
|
||||
# This triggers a conditional dependency on ^fftw@1.0
|
||||
('quantum-espresso', ['^openblas']),
|
||||
# This constructs a constraint for a dependency og the type
|
||||
# @x.y:x.z where the lower bound is unconditional, the upper bound
|
||||
# is conditional to having a variant set
|
||||
('quantum-espresso', ['^libelf@0.8.12']),
|
||||
('quantum-espresso~veritas', ['^libelf@0.8.13'])
|
||||
])
|
||||
def test_working_around_conflicting_defaults(self, spec_str, expected):
|
||||
if spack.config.get('config:concretizer') == 'original':
|
||||
pytest.xfail('Known failure of the original concretizer')
|
||||
|
||||
s = Spec(spec_str).concretized()
|
||||
|
||||
assert s.concrete
|
||||
for constraint in expected:
|
||||
assert s.satisfies(constraint)
|
||||
|
||||
@pytest.mark.regression('4635')
|
||||
@pytest.mark.parametrize('spec_str,expected', [
|
||||
('cmake', ['%clang']),
|
||||
('cmake %gcc', ['%gcc']),
|
||||
('cmake %clang', ['%clang'])
|
||||
])
|
||||
def test_external_package_and_compiler_preferences(
|
||||
self, spec_str, expected
|
||||
):
|
||||
if spack.config.get('config:concretizer') == 'original':
|
||||
pytest.xfail('Known failure of the original concretizer')
|
||||
|
||||
packages_yaml = {
|
||||
'all': {
|
||||
'compiler': ['clang', 'gcc'],
|
||||
},
|
||||
'cmake': {
|
||||
'externals': [
|
||||
{'spec': 'cmake@3.4.3', 'prefix': '/usr'}
|
||||
],
|
||||
'buildable': False
|
||||
}
|
||||
}
|
||||
spack.config.set('packages', packages_yaml)
|
||||
s = Spec(spec_str).concretized()
|
||||
|
||||
assert s.external
|
||||
for condition in expected:
|
||||
assert s.satisfies(condition)
|
||||
|
||||
@pytest.mark.regression('5651')
|
||||
def test_package_with_constraint_not_met_by_external(
|
||||
self
|
||||
):
|
||||
"""Check that if we have an external package A at version X.Y in
|
||||
packages.yaml, but our spec doesn't allow X.Y as a version, then
|
||||
a new version of A is built that meets the requirements.
|
||||
"""
|
||||
if spack.config.get('config:concretizer') == 'original':
|
||||
pytest.xfail('Known failure of the original concretizer')
|
||||
|
||||
packages_yaml = {
|
||||
'libelf': {
|
||||
'externals': [
|
||||
{'spec': 'libelf@0.8.13', 'prefix': '/usr'}
|
||||
]
|
||||
}
|
||||
}
|
||||
spack.config.set('packages', packages_yaml)
|
||||
|
||||
# quantum-espresso+veritas requires libelf@:0.8.12
|
||||
s = Spec('quantum-espresso+veritas').concretized()
|
||||
assert s.satisfies('^libelf@0.8.12')
|
||||
assert not s['libelf'].external
|
||||
|
||||
@pytest.mark.regression('9744')
|
||||
def test_cumulative_version_ranges_with_different_length(self):
|
||||
if spack.config.get('config:concretizer') == 'original':
|
||||
pytest.xfail('Known failure of the original concretizer')
|
||||
|
||||
s = Spec('cumulative-vrange-root').concretized()
|
||||
assert s.concrete
|
||||
assert s.satisfies('^cumulative-vrange-bottom@2.2')
|
||||
|
||||
@pytest.mark.regression('9937')
|
||||
@pytest.mark.skipif(
|
||||
sys.version_info[:2] == (3, 5), reason='Known failure with Python3.5'
|
||||
)
|
||||
def test_dependency_conditional_on_another_dependency_state(self):
|
||||
root_str = 'variant-on-dependency-condition-root'
|
||||
dep_str = 'variant-on-dependency-condition-a'
|
||||
spec_str = '{0} ^{1}'.format(root_str, dep_str)
|
||||
|
||||
s = Spec(spec_str).concretized()
|
||||
assert s.concrete
|
||||
assert s.satisfies('^variant-on-dependency-condition-b')
|
||||
|
||||
s = Spec(spec_str + '+x').concretized()
|
||||
assert s.concrete
|
||||
assert s.satisfies('^variant-on-dependency-condition-b')
|
||||
|
||||
s = Spec(spec_str + '~x').concretized()
|
||||
assert s.concrete
|
||||
assert not s.satisfies('^variant-on-dependency-condition-b')
|
||||
|
||||
@pytest.mark.regression('8082')
|
||||
@pytest.mark.parametrize('spec_str,expected', [
|
||||
('cmake %gcc', '%gcc'),
|
||||
('cmake %clang', '%clang')
|
||||
])
|
||||
def test_compiler_constraint_with_external_package(
|
||||
self, spec_str, expected
|
||||
):
|
||||
if spack.config.get('config:concretizer') == 'original':
|
||||
pytest.xfail('Known failure of the original concretizer')
|
||||
|
||||
packages_yaml = {
|
||||
'cmake': {
|
||||
'externals': [
|
||||
{'spec': 'cmake@3.4.3', 'prefix': '/usr'}
|
||||
],
|
||||
'buildable': False
|
||||
}
|
||||
}
|
||||
spack.config.set('packages', packages_yaml)
|
||||
|
||||
s = Spec(spec_str).concretized()
|
||||
assert s.external
|
||||
assert s.satisfies(expected)
|
||||
|
@ -0,0 +1,16 @@
|
||||
# Copyright 2013-2020 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 CumulativeVrangeBottom(Package):
|
||||
"""Test that creating cumulative version ranges of the
|
||||
form X.Y:X works and allows for the selection of all the
|
||||
versions >= X.Y with major == X
|
||||
"""
|
||||
homepage = 'https://www.example.org'
|
||||
url = 'https://example.org/files/v3.4/cmake-3.4.3.tar.gz'
|
||||
|
||||
version('3.0', '4cb3ff35b2472aae70f542116d616e63')
|
||||
version('2.2', '4cb3ff35b2472aae70f542116d616e63')
|
||||
version('2.1', '4cb3ff35b2472aae70f542116d616e63')
|
||||
version('2.0', '4cb3ff35b2472aae70f542116d616e63')
|
@ -0,0 +1,15 @@
|
||||
# Copyright 2013-2020 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 CumulativeVrangeMiddle(Package):
|
||||
"""Test that creating cumulative version ranges of the
|
||||
form X.Y:X works and allows for the selection of all the
|
||||
versions >= X.Y with major == X
|
||||
"""
|
||||
homepage = 'https://www.example.org'
|
||||
url = 'https://example.org/files/v3.4/cmake-3.4.3.tar.gz'
|
||||
|
||||
version('1.0', '4cb3ff35b2472aae70f542116d616e63')
|
||||
|
||||
depends_on('cumulative-vrange-bottom@2.1:')
|
@ -0,0 +1,16 @@
|
||||
# Copyright 2013-2020 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 CumulativeVrangeRoot(Package):
|
||||
"""Test that creating cumulative version ranges of the
|
||||
form X.Y:X works and allows for the selection of all the
|
||||
versions >= X.Y with major == X
|
||||
"""
|
||||
homepage = 'https://www.example.org'
|
||||
url = 'https://example.org/files/v3.4/cmake-3.4.3.tar.gz'
|
||||
|
||||
version('1.0', '4cb3ff35b2472aae70f542116d616e63')
|
||||
|
||||
depends_on('cumulative-vrange-middle')
|
||||
depends_on('cumulative-vrange-bottom@:2')
|
18
var/spack/repos/builtin.mock/packages/fftw/package.py
Normal file
18
var/spack/repos/builtin.mock/packages/fftw/package.py
Normal file
@ -0,0 +1,18 @@
|
||||
# Copyright 2013-2020 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 Fftw(Package):
|
||||
"""Used to test that a few problematic concretization
|
||||
cases with the old concretizer have been solved by the
|
||||
new ones.
|
||||
"""
|
||||
homepage = "http://www.example.com"
|
||||
url = "http://www.example.com/fftw-1.0.tar.gz"
|
||||
|
||||
version(2.0, 'foobar')
|
||||
version(1.0, 'foobar')
|
||||
|
||||
variant('mpi', default=False, description='Enable MPI')
|
||||
|
||||
depends_on('mpi', when='+mpi')
|
@ -10,6 +10,6 @@ class Hdf5(Package):
|
||||
|
||||
version(2.3, 'foobarbaz')
|
||||
|
||||
variant('mpi', default=True, description='Debug variant')
|
||||
variant('mpi', default=True, description='Enable mpi')
|
||||
|
||||
depends_on('mpi', when='mpi')
|
||||
depends_on('mpi', when='+mpi')
|
||||
|
@ -0,0 +1,24 @@
|
||||
# Copyright 2013-2020 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 QuantumEspresso(Package):
|
||||
"""Used to test that a few problematic concretization
|
||||
cases with the old concretizer have been solved by the
|
||||
new ones.
|
||||
"""
|
||||
homepage = "http://www.example.com"
|
||||
url = "http://www.example.com/qe-1.0.tar.gz"
|
||||
|
||||
version(1.0, 'foobar')
|
||||
|
||||
variant('invino', default=True, description='?')
|
||||
variant('veritas', default=True, description='?')
|
||||
|
||||
depends_on('fftw@:1.0')
|
||||
depends_on('fftw+mpi', when='+invino')
|
||||
|
||||
depends_on('openblas', when='^fftw@:1')
|
||||
|
||||
depends_on('libelf@0.8.10:')
|
||||
depends_on('libelf@:0.8.12', when='+veritas')
|
@ -0,0 +1,18 @@
|
||||
# Copyright 2013-2020 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 VariantOnDependencyConditionA(Package):
|
||||
"""Test that dependencies that are conditional on the state of
|
||||
other dependencies are added correctly, for instance:
|
||||
|
||||
depends_on('A')
|
||||
depends_on('B', when='^A+x')
|
||||
"""
|
||||
|
||||
homepage = 'https://www.example.org'
|
||||
url = 'https://example.org/files/v3.4/cmake-3.4.3.tar.gz'
|
||||
|
||||
version('1.0', '4cb3ff35b2472aae70f542116d616e63')
|
||||
|
||||
variant('x', default=True, description='?')
|
@ -0,0 +1,15 @@
|
||||
# Copyright 2013-2020 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 VariantOnDependencyConditionB(Package):
|
||||
"""Test that dependencies that are conditional on the state of
|
||||
other dependencies are added correctly, for instance:
|
||||
|
||||
depends_on('A')
|
||||
depends_on('B', when='^A+x')
|
||||
"""
|
||||
homepage = 'https://www.example.org'
|
||||
url = 'https://example.org/files/v3.4/cmake-3.4.3.tar.gz'
|
||||
|
||||
version('1.0', '4cb3ff35b2472aae70f542116d616e63')
|
@ -0,0 +1,20 @@
|
||||
# Copyright 2013-2020 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 VariantOnDependencyConditionRoot(Package):
|
||||
"""Test that dependencies that are conditional on the state of
|
||||
other dependencies are added correctly, for instance:
|
||||
|
||||
depends_on('A')
|
||||
depends_on('B', when='^A+x')
|
||||
"""
|
||||
|
||||
homepage = 'https://www.example.org'
|
||||
url = 'https://example.org/files/v3.4/cmake-3.4.3.tar.gz'
|
||||
|
||||
version('1.0', '4cb3ff35b2472aae70f542116d616e63')
|
||||
|
||||
depends_on('variant-on-dependency-condition-a')
|
||||
depends_on('variant-on-dependency-condition-b',
|
||||
when='^variant-on-dependency-condition-a+x')
|
Loading…
Reference in New Issue
Block a user