Source code for spack.test.cmd.stage

# Copyright 2013-2022 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)

import os
import sys

import pytest

import spack.environment as ev
import spack.repo
from spack.main import SpackCommand
from spack.version import Version

stage = SpackCommand('stage')
env = SpackCommand('env')

pytestmark = pytest.mark.usefixtures('install_mockery', 'mock_packages')


[docs]@pytest.mark.skipif(sys.platform == 'win32', reason="not implemented on windows") def test_stage_spec(monkeypatch): """Verify that staging specs works.""" expected = set(['trivial-install-test-package', 'mpileaks']) def fake_stage(pkg, mirror_only=False): expected.remove(pkg.name) monkeypatch.setattr(spack.package.PackageBase, 'do_stage', fake_stage) stage('trivial-install-test-package', 'mpileaks') assert len(expected) == 0
[docs]@pytest.fixture(scope='function') def check_stage_path(monkeypatch, tmpdir): expected_path = os.path.join(str(tmpdir), 'x') def fake_stage(pkg, mirror_only=False): assert pkg.path == expected_path monkeypatch.setattr(spack.package.PackageBase, 'do_stage', fake_stage) return expected_path
[docs]@pytest.mark.skipif(sys.platform == 'win32', reason="PermissionError") def test_stage_path(check_stage_path): """Verify that --path only works with single specs.""" stage('--path={0}'.format(check_stage_path), 'trivial-install-test-package')
[docs]def test_stage_path_errors_multiple_specs(check_stage_path): """Verify that --path only works with single specs.""" with pytest.raises(spack.main.SpackCommandError): stage('--path={0}'.format(check_stage_path), 'trivial-install-test-package', 'mpileaks')
[docs]@pytest.mark.skipif(sys.platform == 'win32', reason="not implemented on windows") def test_stage_with_env_outside_env(mutable_mock_env_path, monkeypatch): """Verify that stage concretizes specs not in environment instead of erroring.""" def fake_stage(pkg, mirror_only=False): assert pkg.name == 'trivial-install-test-package' assert pkg.path is None monkeypatch.setattr(spack.package.PackageBase, 'do_stage', fake_stage) e = ev.create('test') e.add('mpileaks') e.concretize() with e: stage('trivial-install-test-package')
[docs]@pytest.mark.skipif(sys.platform == 'win32', reason="not implemented on windows") def test_stage_with_env_inside_env(mutable_mock_env_path, monkeypatch): """Verify that stage filters specs in environment instead of reconcretizing.""" def fake_stage(pkg, mirror_only=False): assert pkg.name == 'mpileaks' assert pkg.version == Version('100.100') monkeypatch.setattr(spack.package.PackageBase, 'do_stage', fake_stage) e = ev.create('test') e.add('mpileaks@100.100') e.concretize() with e: stage('mpileaks')
[docs]@pytest.mark.skipif(sys.platform == 'win32', reason="not implemented on windows") def test_stage_full_env(mutable_mock_env_path, monkeypatch): """Verify that stage filters specs in environment.""" e = ev.create('test') e.add('mpileaks@100.100') e.concretize() # list all the package names that should be staged expected = set() for spec in e.specs_by_hash.values(): for dep in spec.traverse(): expected.add(dep.name) # pop the package name from the list instead of actually staging def fake_stage(pkg, mirror_only=False): expected.remove(pkg.name) monkeypatch.setattr(spack.package.PackageBase, 'do_stage', fake_stage) with e: stage() # assert that all were staged assert len(expected) == 0