tests: add tests for setup-env.sh
- tests use a shell-script harness and test all Spack commands that require special shell support. - tests work in bash, zsh, and dash - run setup-env.sh tests on macos and linux builds. - we run them on macos and linux
This commit is contained in:
		@@ -16,6 +16,12 @@
 | 
			
		||||
#     Optionally add one or more unit tests
 | 
			
		||||
#     to only run these tests.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
#-----------------------------------------------------------
 | 
			
		||||
# Run a few initial commands and set up test environment
 | 
			
		||||
#-----------------------------------------------------------
 | 
			
		||||
ORIGINAL_PATH="$PATH"
 | 
			
		||||
 | 
			
		||||
. "$(dirname $0)/setup.sh"
 | 
			
		||||
check_dependencies ${coverage} git hg svn
 | 
			
		||||
 | 
			
		||||
@@ -33,9 +39,33 @@ bin/spack help -a
 | 
			
		||||
# Profile and print top 20 lines for a simple call to spack spec
 | 
			
		||||
bin/spack -p --lines 20 spec mpileaks%gcc ^elfutils@0.170
 | 
			
		||||
 | 
			
		||||
#-----------------------------------------------------------
 | 
			
		||||
# Run unit tests with code coverage
 | 
			
		||||
#-----------------------------------------------------------
 | 
			
		||||
extra_args=""
 | 
			
		||||
if [[ -n "$@" ]]; then
 | 
			
		||||
    extra_args="-k $@"
 | 
			
		||||
fi
 | 
			
		||||
${coverage_run} bin/spack test --verbose "$extra_args"
 | 
			
		||||
 | 
			
		||||
#-----------------------------------------------------------
 | 
			
		||||
# Run tests for setup-env.sh
 | 
			
		||||
#-----------------------------------------------------------
 | 
			
		||||
# Clean the environment by removing Spack from the path and getting rid of
 | 
			
		||||
# the spack shell function
 | 
			
		||||
export PATH="$ORIGINAL_PATH"
 | 
			
		||||
unset spack
 | 
			
		||||
 | 
			
		||||
# start in the spack root directory
 | 
			
		||||
cd $SPACK_ROOT
 | 
			
		||||
 | 
			
		||||
# Run bash tests with coverage enabled, but pipe output to /dev/null
 | 
			
		||||
# because it seems that kcov seems to undo the script's redirection
 | 
			
		||||
if [ "$BASH_COVERAGE" = true ]; then
 | 
			
		||||
    ${QA_DIR}/bashcov ${QA_DIR}/setup-env-test.sh &> /dev/null
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# run the test scripts for their output (these will print nicely)
 | 
			
		||||
bash ${QA_DIR}/setup-env-test.sh
 | 
			
		||||
zsh  ${QA_DIR}/setup-env-test.sh
 | 
			
		||||
dash ${QA_DIR}/setup-env-test.sh
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										289
									
								
								share/spack/qa/setup-env-test.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										289
									
								
								share/spack/qa/setup-env-test.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,289 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
#
 | 
			
		||||
# Copyright 2013-2019 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)
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# This script tests that Spack's setup-env.sh init script works.
 | 
			
		||||
#
 | 
			
		||||
# The tests are portable to bash, zsh, and bourne shell, and can be run
 | 
			
		||||
# in any of these shells.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# ------------------------------------------------------------------------
 | 
			
		||||
# Functions for color output.
 | 
			
		||||
# ------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# Colors for output
 | 
			
		||||
red='\033[1;31m'
 | 
			
		||||
cyan='\033[1;36m'
 | 
			
		||||
green='\033[1;32m'
 | 
			
		||||
reset='\033[0m'
 | 
			
		||||
 | 
			
		||||
echo_red() {
 | 
			
		||||
    printf "${red}$*${reset}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
echo_green() {
 | 
			
		||||
    printf "${green}$*${reset}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
echo_msg() {
 | 
			
		||||
    printf "${cyan}$*${reset}\n"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# ------------------------------------------------------------------------
 | 
			
		||||
# Generic functions for testing shell code.
 | 
			
		||||
# ------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# counts of test successes and failures.
 | 
			
		||||
success=0
 | 
			
		||||
errors=0
 | 
			
		||||
 | 
			
		||||
# Print out a header for a group of tests.
 | 
			
		||||
title() {
 | 
			
		||||
    echo
 | 
			
		||||
    echo_msg "$@"
 | 
			
		||||
    echo_msg "---------------------------------"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# echo FAIL in red text; increment failures
 | 
			
		||||
fail() {
 | 
			
		||||
    echo_red FAIL
 | 
			
		||||
    errors=$((errors+1))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Echo SUCCESS in green; increment successes
 | 
			
		||||
#
 | 
			
		||||
pass() {
 | 
			
		||||
    echo_green SUCCESS
 | 
			
		||||
    success=$((success+1))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Run a command and suppress output unless it fails.
 | 
			
		||||
# On failure, echo the exit code and output.
 | 
			
		||||
#
 | 
			
		||||
succeeds() {
 | 
			
		||||
    printf "'%s' succeeds ... " "$*"
 | 
			
		||||
    output=$("$@" 2>&1)
 | 
			
		||||
    err="$?"
 | 
			
		||||
 | 
			
		||||
    if [ "$err" != 0 ]; then
 | 
			
		||||
        fail
 | 
			
		||||
        echo_red "Command failed with error $err."
 | 
			
		||||
        if [ -n "$output" ]; then
 | 
			
		||||
            echo_msg "Output:"
 | 
			
		||||
            echo "$output"
 | 
			
		||||
        else
 | 
			
		||||
            echo_msg "No output."
 | 
			
		||||
        fi
 | 
			
		||||
    else
 | 
			
		||||
        pass
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Run a command and suppress output unless it succeeds.
 | 
			
		||||
# If the command succeeds, echo the output.
 | 
			
		||||
#
 | 
			
		||||
fails() {
 | 
			
		||||
    printf "'%s' fails ... " "$*"
 | 
			
		||||
    output=$("$@" 2>&1)
 | 
			
		||||
    err="$?"
 | 
			
		||||
 | 
			
		||||
    if [ "$err" = 0 ]; then
 | 
			
		||||
        fail
 | 
			
		||||
        echo_red "Command failed with error $err."
 | 
			
		||||
        if [ -n "$output" ]; then
 | 
			
		||||
            echo_msg "Output:"
 | 
			
		||||
            echo "$output"
 | 
			
		||||
        else
 | 
			
		||||
            echo_msg "No output."
 | 
			
		||||
        fi
 | 
			
		||||
    else
 | 
			
		||||
        pass
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Ensure that a string is in the output of a command.
 | 
			
		||||
# Suppresses output on success.
 | 
			
		||||
# On failure, echo the exit code and output.
 | 
			
		||||
#
 | 
			
		||||
contains() {
 | 
			
		||||
    string="$1"
 | 
			
		||||
    shift
 | 
			
		||||
 | 
			
		||||
    printf "'%s' output contains '$string' ... " "$*"
 | 
			
		||||
    output=$("$@" 2>&1)
 | 
			
		||||
    err="$?"
 | 
			
		||||
 | 
			
		||||
    if [ "${output#*$string}" = "${output}" ]; then
 | 
			
		||||
        fail
 | 
			
		||||
        echo_red "Command exited with error $err."
 | 
			
		||||
        echo_red "'$string' was not in output."
 | 
			
		||||
        if [ -n "$output" ]; then
 | 
			
		||||
            echo_msg "Output:"
 | 
			
		||||
            echo "$output"
 | 
			
		||||
        else
 | 
			
		||||
            echo_msg "No output."
 | 
			
		||||
        fi
 | 
			
		||||
    else
 | 
			
		||||
        pass
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# -----------------------------------------------------------------------
 | 
			
		||||
# Instead of invoking the module/use/dotkit commands, we print the
 | 
			
		||||
# arguments that Spack invokes the command with, so we can check that
 | 
			
		||||
# Spack passes the expected arguments in the tests below.
 | 
			
		||||
#
 | 
			
		||||
# We make that happen by defining the sh functions below.
 | 
			
		||||
# -----------------------------------------------------------------------
 | 
			
		||||
module() {
 | 
			
		||||
    echo module "$@"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
use() {
 | 
			
		||||
    echo use "$@"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unuse() {
 | 
			
		||||
    echo unuse "$@"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# -----------------------------------------------------------------------
 | 
			
		||||
# Setup test environment and do some preliminary checks
 | 
			
		||||
# -----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# Make sure no environment is active
 | 
			
		||||
unset SPACK_ENV
 | 
			
		||||
 | 
			
		||||
# Source setup-env.sh before tests
 | 
			
		||||
.  share/spack/setup-env.sh
 | 
			
		||||
 | 
			
		||||
title "Testing setup-env.sh with $_sp_shell"
 | 
			
		||||
 | 
			
		||||
# spack command is now avaialble
 | 
			
		||||
succeeds which spack
 | 
			
		||||
 | 
			
		||||
# mock cd command (intentionally define only AFTER setup-env.sh)
 | 
			
		||||
cd() {
 | 
			
		||||
    echo cd "$@"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# create a fake mock package install and store its location for later
 | 
			
		||||
title "Setup"
 | 
			
		||||
echo "Creating a mock package installation"
 | 
			
		||||
spack -m install --fake a
 | 
			
		||||
a_install=$(spack location -i a)
 | 
			
		||||
a_module=$(spack -m module tcl find a)
 | 
			
		||||
a_dotkit=$(spack -m module dotkit find a)
 | 
			
		||||
 | 
			
		||||
b_install=$(spack location -i b)
 | 
			
		||||
b_module=$(spack -m module tcl find b)
 | 
			
		||||
b_dotkit=$(spack -m module dotkit find b)
 | 
			
		||||
 | 
			
		||||
# ensure that we uninstall b on exit
 | 
			
		||||
cleanup() {
 | 
			
		||||
    title "Cleanup"
 | 
			
		||||
    echo "Removing test package before exiting test script."
 | 
			
		||||
    spack -m uninstall -yf b
 | 
			
		||||
    spack -m uninstall -yf a
 | 
			
		||||
 | 
			
		||||
    echo
 | 
			
		||||
    echo "$success tests succeeded."
 | 
			
		||||
    echo "$errors tests failed."
 | 
			
		||||
    if [ "$errors" = 0 ]; then
 | 
			
		||||
        pass
 | 
			
		||||
        exit 0
 | 
			
		||||
    else
 | 
			
		||||
        fail
 | 
			
		||||
        exit 1
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
trap cleanup EXIT
 | 
			
		||||
 | 
			
		||||
# -----------------------------------------------------------------------
 | 
			
		||||
# Test all spack commands with special env support
 | 
			
		||||
# -----------------------------------------------------------------------
 | 
			
		||||
title 'Testing `spack`'
 | 
			
		||||
contains 'usage: spack ' spack
 | 
			
		||||
contains "usage: spack " spack -h
 | 
			
		||||
contains "usage: spack " spack help
 | 
			
		||||
contains "usage: spack " spack -H
 | 
			
		||||
contains "usage: spack " spack help --all
 | 
			
		||||
 | 
			
		||||
title 'Testing `spack cd`'
 | 
			
		||||
contains "usage: spack cd " spack cd -h
 | 
			
		||||
contains "usage: spack cd " spack cd --help
 | 
			
		||||
contains "cd $b_install" spack cd -i b
 | 
			
		||||
 | 
			
		||||
title 'Testing `spack module`'
 | 
			
		||||
contains "usage: spack module " spack -m module -h
 | 
			
		||||
contains "usage: spack module " spack -m module --help
 | 
			
		||||
contains "usage: spack module " spack -m module
 | 
			
		||||
 | 
			
		||||
title 'Testing `spack load`'
 | 
			
		||||
contains "module load $b_module" spack -m load b
 | 
			
		||||
fails spack -m load -l
 | 
			
		||||
contains "module load -l --arg $b_module" spack -m load -l --arg b
 | 
			
		||||
contains "module load $b_module $a_module" spack -m load -r a
 | 
			
		||||
contains "module load $b_module $a_module" spack -m load --dependencies a
 | 
			
		||||
fails spack -m load d
 | 
			
		||||
contains "usage: spack load " spack -m load -h
 | 
			
		||||
contains "usage: spack load " spack -m load -h d
 | 
			
		||||
contains "usage: spack load " spack -m load --help
 | 
			
		||||
 | 
			
		||||
title 'Testing `spack unload`'
 | 
			
		||||
contains "module unload $b_module" spack -m unload b
 | 
			
		||||
fails spack -m unload -l
 | 
			
		||||
contains "module unload -l --arg $b_module" spack -m unload -l --arg b
 | 
			
		||||
fails spack -m unload d
 | 
			
		||||
contains "usage: spack unload " spack -m unload -h
 | 
			
		||||
contains "usage: spack unload " spack -m unload -h d
 | 
			
		||||
contains "usage: spack unload " spack -m unload --help
 | 
			
		||||
 | 
			
		||||
title 'Testing `spack use`'
 | 
			
		||||
contains "use $b_dotkit" spack -m use b
 | 
			
		||||
fails spack -m use -l
 | 
			
		||||
contains "use -l --arg $b_dotkit" spack -m use -l --arg b
 | 
			
		||||
contains "use $b_dotkit $a_dotkit" spack -m use -r a
 | 
			
		||||
contains "use $b_dotkit $a_dotkit" spack -m use --dependencies a
 | 
			
		||||
fails spack -m use d
 | 
			
		||||
contains "usage: spack use " spack -m use -h
 | 
			
		||||
contains "usage: spack use " spack -m use -h d
 | 
			
		||||
contains "usage: spack use " spack -m use --help
 | 
			
		||||
 | 
			
		||||
title 'Testing `spack unuse`'
 | 
			
		||||
contains "unuse $b_dotkit" spack -m unuse b
 | 
			
		||||
fails spack -m unuse -l
 | 
			
		||||
contains "unuse -l --arg $b_dotkit" spack -m unuse -l --arg b
 | 
			
		||||
fails spack -m unuse d
 | 
			
		||||
contains "usage: spack unuse "  spack -m unuse -h
 | 
			
		||||
contains "usage: spack unuse "  spack -m unuse -h d
 | 
			
		||||
contains "usage: spack unuse "  spack -m unuse --help
 | 
			
		||||
 | 
			
		||||
title 'Testing `spack env`'
 | 
			
		||||
contains "usage: spack env " spack env -h
 | 
			
		||||
contains "usage: spack env " spack env --help
 | 
			
		||||
 | 
			
		||||
title 'Testing `spack env activate`'
 | 
			
		||||
contains "No such environment:" spack env activate no_such_environment
 | 
			
		||||
contains "usage: spack env activate " spack env activate
 | 
			
		||||
contains "usage: spack env activate " spack env activate -h
 | 
			
		||||
contains "usage: spack env activate " spack env activate --help
 | 
			
		||||
 | 
			
		||||
title 'Testing `spack env deactivate`'
 | 
			
		||||
contains "Error: No environment is currently active" spack env deactivate
 | 
			
		||||
contains "usage: spack env deactivate " spack env deactivate no_such_environment
 | 
			
		||||
contains "usage: spack env deactivate " spack env deactivate -h
 | 
			
		||||
contains "usage: spack env deactivate " spack env deactivate --help
 | 
			
		||||
 | 
			
		||||
title 'Testing `spack env list`'
 | 
			
		||||
contains " spack env list " spack env list -h
 | 
			
		||||
contains " spack env list " spack env list --help
 | 
			
		||||
@@ -20,18 +20,24 @@ export SPACK_ROOT=$(realpath "$QA_DIR/../../..")
 | 
			
		||||
coverage=""
 | 
			
		||||
coverage_run=""
 | 
			
		||||
 | 
			
		||||
# bash coverage depends on some other factors -- there are issues with
 | 
			
		||||
# kcov for Python 2.6, unit tests, and build tests.
 | 
			
		||||
if [[ $TEST_SUITE == unit &&   # kcov segfaults for the MPICH build test
 | 
			
		||||
      $TRAVIS_OS_NAME == linux &&
 | 
			
		||||
      $TRAVIS_PYTHON_VERSION != 2.6 ]];
 | 
			
		||||
then
 | 
			
		||||
    BASH_COVERAGE="true"
 | 
			
		||||
else
 | 
			
		||||
    BASH_COVERAGE="false"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Set up some variables for running coverage tests.
 | 
			
		||||
if [[ "$COVERAGE" == "true" ]]; then
 | 
			
		||||
    # these set up coverage for Python
 | 
			
		||||
    coverage=coverage
 | 
			
		||||
    coverage_run="coverage run"
 | 
			
		||||
 | 
			
		||||
    # make a coverage directory for kcov, and patch cc to use our bashcov
 | 
			
		||||
    # script instead of plain bash
 | 
			
		||||
    if [[ $TEST_SUITE == unit &&   # kcov segfaults for the MPICH build test
 | 
			
		||||
          $TRAVIS_OS_NAME == linux &&
 | 
			
		||||
          $TRAVIS_PYTHON_VERSION != 2.6 ]];
 | 
			
		||||
    then
 | 
			
		||||
    if [ "$BASH_COVERAGE" = true ]; then
 | 
			
		||||
        mkdir -p coverage
 | 
			
		||||
        cc_script="$SPACK_ROOT/lib/spack/env/cc"
 | 
			
		||||
        bashcov=$(realpath ${QA_DIR}/bashcov)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user