unit-tests: ensure that installed packages can be reused (#20307)

refers #20292

Added a unit test that ensures we can reuse installed
packages even if in the repository variants have been
removed or added.
This commit is contained in:
Massimiliano Culpo 2020-12-17 09:31:59 +01:00 committed by Tamara Dahlgren
parent 378af922a2
commit d82d2bb2db

View file

@ -5,6 +5,7 @@
import sys
import pytest
import jinja2
import archspec.cpu
@ -114,6 +115,64 @@ def current_host(request, monkeypatch):
spack.architecture.get_platform.cache.clear()
@pytest.fixture()
def repo_with_changing_recipe(tmpdir_factory, mutable_mock_repo):
repo_namespace = 'changing'
repo_dir = tmpdir_factory.mktemp(repo_namespace)
repo_dir.join('repo.yaml').write("""
repo:
namespace: changing
""", ensure=True)
packages_dir = repo_dir.ensure('packages', dir=True)
root_pkg_str = """
class Root(Package):
homepage = "http://www.example.com"
url = "http://www.example.com/root-1.0.tar.gz"
version(1.0, sha256='abcde')
depends_on('changing')
"""
packages_dir.join('root', 'package.py').write(
root_pkg_str, ensure=True
)
changing_template = """
class Changing(Package):
homepage = "http://www.example.com"
url = "http://www.example.com/changing-1.0.tar.gz"
version(1.0, sha256='abcde')
{% if not delete_variant %}
variant('fee', default=True, description='nope')
{% endif %}
variant('foo', default=True, description='nope')
{% if add_variant %}
variant('fum', default=True, description='nope')
{% endif %}
"""
repo = spack.repo.Repo(str(repo_dir))
mutable_mock_repo.put_first(repo)
class _ChangingPackage(object):
def change(self, context):
# To ensure we get the changed package we need to
# invalidate the cache
repo._modules = {}
t = jinja2.Template(changing_template)
changing_pkg_str = t.render(**context)
packages_dir.join('changing', 'package.py').write(
changing_pkg_str, ensure=True
)
_changing_pkg = _ChangingPackage()
_changing_pkg.change({'delete_variant': False, 'add_variant': False})
return _changing_pkg
# This must use the mutable_config fixture because the test
# adjusting_default_target_based_on_compiler uses the current_host fixture,
# which changes the config.
@ -1001,3 +1060,28 @@ def test_external_package_versions(self, spec_str, is_external, expected):
s = Spec(spec_str).concretized()
assert s.external == is_external
assert s.satisfies(expected)
@pytest.mark.regression('20292')
@pytest.mark.parametrize('context', [
{'add_variant': True, 'delete_variant': False},
{'add_variant': False, 'delete_variant': True},
{'add_variant': True, 'delete_variant': True}
])
@pytest.mark.xfail()
def test_reuse_installed_packages(
self, context, mutable_database, repo_with_changing_recipe
):
# Install a spec
root = Spec('root').concretized()
dependency = root['changing'].copy()
root.package.do_install(fake=True, explicit=True)
# Modify package.py
repo_with_changing_recipe.change(context)
# Try to concretize with the spec installed previously
new_root = Spec('root ^/{0}'.format(
dependency.dag_hash())
).concretized()
assert root.dag_hash() == new_root.dag_hash()