Source code for spack.test.cmd.location

# 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 shutil
import sys

import pytest

from llnl.util.filesystem import mkdirp

import spack.environment as ev
import spack.paths
import spack.stage
from spack.main import SpackCommand, SpackCommandError

# Everything here uses (or can use) the mock config and database.
pytestmark = [
    pytest.mark.usefixtures("config", "database"),
    pytest.mark.skipif(sys.platform == "win32", reason="does not run on windows"),
# location prints out "locations of packages and spack directories"
location = SpackCommand("location")
env = SpackCommand("env")

[docs]@pytest.fixture def mock_spec(): # Make it look like the source was actually expanded. s = spack.spec.Spec("externaltest").concretized() source_path = s.package.stage.source_path mkdirp(source_path) yield s, s.package # Remove the spec from the mock stage area. shutil.rmtree(s.package.stage.path)
[docs]def test_location_build_dir(mock_spec): """Tests spack location --build-dir.""" spec, pkg = mock_spec assert location("--build-dir", == pkg.stage.source_path
[docs]@pytest.mark.regression("22738") def test_location_source_dir(mock_spec): """Tests spack location --source-dir.""" spec, pkg = mock_spec assert location("--source-dir", == pkg.stage.source_path assert location( == pkg.stage.source_path
[docs]def test_location_source_dir_missing(): """Tests spack location --source-dir with a missing source directory.""" spec = "mpileaks" prefix = "==> Error: " expected = ( "%sSource directory does not exist yet. Run this to create it:" "%s spack stage %s" % (prefix, os.linesep, spec) ) out = location("--source-dir", spec, fail_on_error=False).strip() assert out == expected
[docs]@pytest.mark.parametrize( "options", [([]), (["--source-dir", "mpileaks"]), (["--env", "missing-env"]), (["spec1", "spec2"])], ) def test_location_cmd_error(options): """Ensure the proper error is raised with problematic location options.""" with pytest.raises(SpackCommandError, match="Command exited with code 1"): location(*options)
[docs]def test_location_env_exists(mutable_mock_env_path): """Tests spack location --env <name> for an existing environment.""" e = ev.create("example") e.write() assert location("--env", "example").strip() == e.path
[docs]def test_location_with_active_env(mutable_mock_env_path): """Tests spack location --env with active env""" e = ev.create("example") e.write() with e: assert location("--env").strip() == e.path
[docs]def test_location_env_flag_interference(mutable_mock_env_path, tmpdir): """ Tests that specifying an active environment using `spack -e x location ...` does not interfere with the location command flags. """ # create two environments env("create", "first_env") env("create", "second_env") global_args = ["-e", "first_env"] # `spack -e first_env location -e second_env` should print the env # path of second_env assert "first_env" not in location("-e", "second_env", global_args=global_args) # `spack -e first_env location --packages` should not print # the environment path of first_env. assert "first_env" not in location("--packages", global_args=global_args)
[docs]def test_location_env_missing(): """Tests spack location --env.""" missing_env_name = "missing-env" error = "==> Error: no such environment: '%s'" % missing_env_name out = location("--env", missing_env_name, fail_on_error=False).strip() assert out == error
[docs]@pytest.mark.db def test_location_install_dir(mock_spec): """Tests spack location --install-dir.""" spec, _ = mock_spec assert location("--install-dir", == spec.prefix
[docs]@pytest.mark.db def test_location_package_dir(mock_spec): """Tests spack location --package-dir.""" spec, pkg = mock_spec assert location("--package-dir", == pkg.package_dir
[docs]@pytest.mark.db @pytest.mark.parametrize( "option,expected", [ ("--module-dir", spack.paths.module_path), ("--packages", spack.paths.mock_packages_path), ("--spack-root", spack.paths.prefix), ], ) def test_location_paths_options(option, expected): """Tests basic spack.paths location command options.""" assert location(option).strip() == expected
[docs]@pytest.mark.parametrize( "specs,expected", [([], "You must supply a spec."), (["spec1", "spec2"], "Too many specs. Supply only one.")], ) def test_location_spec_errors(specs, expected): """Tests spack location with bad spec options.""" error = "==> Error: %s" % expected assert location(*specs, fail_on_error=False).strip() == error
[docs]@pytest.mark.db def test_location_stage_dir(mock_spec): """Tests spack location --stage-dir.""" spec, pkg = mock_spec assert location("--stage-dir", == pkg.stage.path
[docs]@pytest.mark.db def test_location_stages(mock_spec): """Tests spack location --stages.""" assert location("--stages").strip() == spack.stage.get_stage_root()