Make unit-test case reproduce CLI investigation

This commit is contained in:
psakiev 2024-04-30 09:08:21 -06:00
parent b88c0e6b6d
commit f003060ea6
3 changed files with 108 additions and 33 deletions

View File

@ -4,7 +4,6 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT) # SPDX-License-Identifier: (Apache-2.0 OR MIT)
import copy import copy
import os import os
import pathlib
import sys import sys
import jinja2 import jinja2
@ -2809,60 +2808,47 @@ def mock_runtime_dependencies(*args, **kwargs):
""" """
mock function moved outside local definition to allow mock function moved outside local definition to allow
multiprocessing pickling to work multiprocessing pickling to work
----------------- Captured stderr call -------------
AttributeError:
Can't pickle local object 'test_reuse_prefers_standard_over_git_versions.<locals>.<lambda>'
""" """
return True return True
@pytest.mark.only_clingo("clingo only re-use feature being tested") @pytest.mark.only_clingo("clingo only re-use feature being tested")
@pytest.mark.regression("38484") @pytest.mark.regression("38484")
def test_git_ref_version_can_be_reused( def test_git_ref_version_can_be_reused(monkeypatch, mock_packages, install_mockery_mutable_config):
monkeypatch, mock_packages, install_mockery_mutable_config, mock_git_version_info
):
repo_path, filename, commits = mock_git_version_info
monkeypatch.setattr(
spack.package_base.PackageBase, "git", pathlib.Path(repo_path).as_uri(), raising=False
)
# override gcc-runtime dep and make all installs reusable # override gcc-runtime dep and make all installs reusable
monkeypatch.setattr(spack.solver.asp, "_has_runtime_dependencies", mock_runtime_dependencies) monkeypatch.setattr(spack.solver.asp, "_has_runtime_dependencies", mock_runtime_dependencies)
first_spec = spack.spec.Spec( first_spec = spack.spec.Spec("zlib-ng@git.2.1.5=2.1.5").concretized()
"git-test-commit@git.v1.0=1.0+generic_install+feature"
).concretized()
first_spec.package.do_install(fake=True, explicit=True) first_spec.package.do_install(fake=True, explicit=True)
with spack.config.override("concretizer:reuse", True): with spack.config.override("concretizer:reuse", True):
second_spec = spack.spec.Spec( second_spec = spack.spec.Spec("zlib-ng@git.2.1.5=2.1.5~opt").concretized()
"git-test-commit@git.v1.0=1.0+generic_install~feature"
).concretized()
# is_installed(first_spec) # is_installed(first_spec)
assert second_spec.dag_hash() != first_spec.dag_hash() assert second_spec.dag_hash() != first_spec.dag_hash()
@pytest.mark.only_clingo("clingo only re-use feature being tested") @pytest.mark.only_clingo("clingo only re-use feature being tested")
def test_reuse_prefers_standard_over_git_versions( def test_reuse_prefers_standard_over_git_versions(
monkeypatch, mock_packages, install_mockery_mutable_config, mock_git_version_info monkeypatch, mock_packages, install_mockery_mutable_config
): ):
""" """
order matters in this test. typically re-use would pick the last installed match order matters in this test. typically re-use would pick the last installed match
but we want to prefer the standard version over git ref based versions but we want to prefer the standard version over git ref based versions
so install git ref last and ensure it is not picked up by re-use so install git ref last and ensure it is not picked up by re-use
""" """
repo_path, filename, commits = mock_git_version_info
monkeypatch.setattr(
spack.package_base.PackageBase, "git", pathlib.Path(repo_path).as_uri(), raising=False
)
# override gcc-runtime dep and make all installs reusable # override gcc-runtime dep and make all installs reusable
monkeypatch.setattr(spack.solver.asp, "_has_runtime_dependencies", mock_runtime_dependencies) monkeypatch.setattr(spack.solver.asp, "_has_runtime_dependencies", mock_runtime_dependencies)
standard_spec = spack.spec.Spec("git-test-commit@1.0+generic_install+feature").concretized() standard_spec = spack.spec.Spec("zlib-ng@2.1.5").concretized()
standard_spec.package.do_install(fake=True, explicit=True) standard_spec.package.do_install(fake=True, explicit=True)
git_spec = spack.spec.Spec( git_spec = spack.spec.Spec("zlib-ng@git.2.1.5=2.1.5").concretized()
"git-test-commit@git.v1.0=1.0+generic_install+feature"
).concretized()
git_spec.package.do_install(fake=True, explicit=True) git_spec.package.do_install(fake=True, explicit=True)
with spack.config.override("concretizer:reuse", True): with spack.config.override("concretizer:reuse", True):
test_spec = spack.spec.Spec("git-test-commit@1.0+generic_install").concretized() test_spec = spack.spec.Spec("zlib-ng@2").concretized()
assert git_spec.dag_hash() != test_spec.dag_hash() assert git_spec.dag_hash() != test_spec.dag_hash()
assert standard_spec.dag_hash() == test_spec.dag_hash() assert standard_spec.dag_hash() == test_spec.dag_hash()

View File

@ -17,18 +17,10 @@ class GitTestCommit(Package):
version("1.2", tag="1.2") # not a typo version("1.2", tag="1.2") # not a typo
version("2.0", tag="v2.0") version("2.0", tag="v2.0")
variant(
"generic_install",
default=False,
description="Override install feature for original implementations tests",
)
variant("feature", default=False, description="A very cool feature")
def install(self, spec, prefix): def install(self, spec, prefix):
# It is assumed for the test which installs this package, that it will # It is assumed for the test which installs this package, that it will
# be using the earliest commit, which is contained in the range @:0 # be using the earliest commit, which is contained in the range @:0
if not spec.variants["generic_install"].value: assert spec.satisfies("@:0")
assert spec.satisfies("@:0")
mkdir(prefix.bin) mkdir(prefix.bin)
# This will only exist for some second commit # This will only exist for some second commit

View File

@ -0,0 +1,97 @@
# Copyright 2013-2024 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.build_systems import autotools, cmake
from spack.package import *
class ZlibNg(AutotoolsPackage, CMakePackage):
"""
zlib replacement with optimizations for next generation systems.
-- added to mock repo and deleted patches for re-use and git ref testing
"""
homepage = "https://github.com/zlib-ng/zlib-ng"
url = "https://github.com/zlib-ng/zlib-ng/archive/2.0.0.tar.gz"
git = "https://github.com/zlib-ng/zlib-ng.git"
maintainers("haampie")
license("Zlib")
version("2.1.6", sha256="a5d504c0d52e2e2721e7e7d86988dec2e290d723ced2307145dedd06aeb6fef2")
version("2.1.5", sha256="3f6576971397b379d4205ae5451ff5a68edf6c103b2f03c4188ed7075fbb5f04")
version("2.1.4", sha256="a0293475e6a44a3f6c045229fe50f69dc0eebc62a42405a51f19d46a5541e77a")
version(
"2.1.3",
sha256="d20e55f89d71991c59f1c5ad1ef944815e5850526c0d9cd8e504eaed5b24491a",
deprecated=True,
)
version(
"2.1.2",
sha256="383560d6b00697c04e8878e26c0187b480971a8bce90ffd26a5a7b0f7ecf1a33",
deprecated=True,
)
version("2.0.7", sha256="6c0853bb27738b811f2b4d4af095323c3d5ce36ceed6b50e5f773204fb8f7200")
version("2.0.0", sha256="86993903527d9b12fc543335c19c1d33a93797b3d4d37648b5addae83679ecd8")
variant("compat", default=True, description="Enable compatibility API")
variant("opt", default=True, description="Enable optimizations")
variant("shared", default=True, description="Build shared library")
variant("pic", default=True, description="Enable position-independent code (PIC)")
conflicts("+shared~pic")
variant("new_strategies", default=True, description="Enable new deflate strategies")
provides("zlib-api", when="+compat")
# Default to autotools, since cmake would result in circular dependencies if it's not
# reused.
build_system("autotools", "cmake", default="autotools")
def libs(self):
name = "libz" if self.spec.satisfies("+compat") else "libz-ng"
return find_libraries(
name, root=self.prefix, recursive=True, shared=self.spec.satisfies("+shared")
)
def flag_handler(self, name, flags):
if name == "cflags" and self.spec.satisfies("+pic build_system=autotools"):
flags.append(self.compiler.cc_pic_flag)
return (flags, None, None)
class AutotoolsBuilder(autotools.AutotoolsBuilder):
@run_before("configure")
def pretend_gcc(self):
# All nice things (PIC flags, symbol versioning) that happen to the compilers that are
# recognized as gcc (%gcc, %clang, %intel, %oneapi) we want for some other compilers too:
if self.spec.compiler.name in ["nvhpc"]:
filter_file(r"^gcc=0$", "gcc=1", join_path(self.configure_directory, "configure"))
def configure_args(self):
args = []
if self.spec.satisfies("+compat"):
args.append("--zlib-compat")
if self.spec.satisfies("~opt"):
args.append("--without-optimizations")
if self.spec.satisfies("~shared"):
args.append("--static")
if self.spec.satisfies("~new_strategies"):
args.append("--without-new-strategies")
return args
class CMakeBuilder(cmake.CMakeBuilder):
def cmake_args(self):
return [
self.define_from_variant("ZLIB_COMPAT", "compat"),
self.define_from_variant("WITH_OPTIM", "opt"),
self.define("BUILD_SHARED_LIBS", self.spec.satisfies("+shared")),
self.define_from_variant("CMAKE_POSITION_INDEPENDENT_CODE", "pic"),
self.define_from_variant("WITH_NEW_STRATEGIES", "new_strategies"),
self.define("ZLIB_ENABLE_TESTS", self.pkg.run_tests),
]