Newer
Older
from mpsd_software_manager.cmds import status
def test_environment_status(
tmp_path, simple_toolchain, create_fake_environment, install_test_release
):
"""Test that the environment status is correct.
The status command has the following three usage:
- 1) If no mpsd_release, list available releases
- 2) If mpsd_release, list available toolchains
- 3) If mpsd_release and toolchain, list available packages
We need to test all the three cases.
"""
# 1) If no mpsd_release, list available releases
list_of_release_in_empty_dir = status.environment_status(None, tmp_path)
assert list_of_release_in_empty_dir == []
(tmp_path / "test_case1" / "dev-23a" / "spack-environments").mkdir(
parents=True, exist_ok=True
)
(tmp_path / "test_case1" / "fake_release").mkdir(parents=True, exist_ok=True)
list_of_release = status.environment_status(None, tmp_path / "test_case1")
assert list_of_release == ["dev-23a"]
# 2) If mpsd_release, list available toolchains
toolchain_map = status.environment_status("fake-release", tmp_path)
assert toolchain_map is None
mpsd_release = "dev-23a"
expected_toolchain_map = create_fake_environment(tmp_path, mpsd_release)
# check that the environment status is is correct
toolchain_map = status.environment_status(mpsd_release, tmp_path)
# convert each list to a set to ensure that the order doesn't matter
for microarch in expected_toolchain_map:
assert set(toolchain_map[microarch]) == set(expected_toolchain_map[microarch])
# 3) If mpsd_release and toolchain, list available packages
install_test_release(tmp_path / "test_case3", simple_toolchain)
package_list = status.environment_status(
mpsd_release, tmp_path / "test_case3", "toolchain2"
)
assert len(package_list) == 2 # we installed zlib and zstd only
check_for_valid_spec_syntax(
package_list[0], "zlib"
) # the list is always in alphabetical order
check_for_valid_spec_syntax(package_list[1], "zstd")
def check_for_valid_spec_syntax(spec: str, package_name: str):
"""Check if the spec is valid.
Assuming the format of the spec as:
{name}{@versions}{%compiler.name}{@compiler.versions}{compiler_flags}{variants}{arch=architecture}
we ensure that:
- package name is correct
- there are atleast 2 @ symbols (version for package and compiler)
- there is atleast 1 % symbol (compiler specification)
- there is atleast 1 arch=
"""
assert spec.count("@") >= 2
assert spec.count("%") >= 1
assert "build_system=" in spec
assert "arch=" in spec
assert spec.split("@")[0] == package_name