# Shell library for Morph yarns. # # The shell functions in this library are meant to make writing IMPLEMENTS # sections for yarn scenario tests easier. # Copyright (C) 2013-2014 Codethink Limited # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # Add $SRCDIR to PYTHONPATH. case "$PYTHONPATH" in '') PYTHONPATH="$SRCDIR)" ;; *) PYTHONPATH="$SRCDIR:$PYTHONPATH" ;; esac export PYTHONPATH # Run Morph from the source tree, ignoring any configuration files. # This way the test suite is not affected by any configuration the user # or system may have. Instead, we'll use the `$DATADIR/morph.conf` file, # which tests can create, if they want to. run_morph() { { set +e "$SRCDIR"/morph --verbose \ --cachedir-min-space=0 --tempdir-min-space=0 \ --no-default-config --config "$DATADIR/morph.conf" "$@" \ 2> "$DATADIR/result-$1" > "$DATADIR/out-$1" local exit_code="$?" cat "$DATADIR/out-$1" cat "$DATADIR/result-$1" >&2 return "$exit_code" } } # Sometimes we want to try running morph, but are OK if it fails, we just # need to remember that it did. attempt_morph() { if run_morph "$@" then echo 0 > "$DATADIR/morph-exit" else echo "$?" > "$DATADIR/morph-exit" fi } # Perl's die() function is often very useful: it prints an error message # and terminates the process with a non-zero exit code. Let's have a # shell function to do that. die() { echo "ERROR: $@" 1>&2 exit 1 } # Tests often need to check that specific files or directories exist # and have the right ownerships etc. Here's some shell functions to # test that kind of thing. is_dir() { if [ ! -d "$1" ] then die "Expected $1 to be a directory" fi } is_file() { if [ ! -f "$1" ] then die "Expected $1 to be a regular file" fi } # General assertions. assert_equal() { if [ "$1" != "$2" ] then die "Expected '$1' and '$2' to be equal" fi } # Sometimes it's nice to run a command in a different directory, without # having to bother changing the directory before and after the command, # or spawning subshells. This function helps with that. run_in() { (cd "$1" && shift && exec "$@") } # Extract all refs in all given morphologies. Each ref is reported # as filename:ref. The referred-to repository is not listed. list_refs() { awk '/ ref: / { printf "%s %s\n", FILENAME, $NF }' "$@" } # Is a ref petrified? Or a specific branch? is_petrified_or_branch() { if echo "$1" | awk -v "branch=$2" '$NF ~ /[0-9a-fA-F]{40}/ || $NF == branch' | grep . then return 0 else return 1 fi } # Are named morphologies petrified? Die if not. First arg is the # branch that is allowed in addition to SHA1s. assert_morphologies_are_petrified() { local branch="$1" shift list_refs "$@" | while read filename ref do if ! is_petrified_or_branch "$ref" "$branch" then die "Found non-SHA1 ref in $filename: $ref" fi done } # Added until it's fixed in upstream. # It's a solution to create an empty home directory each execution export HOME="$DATADIR/home" if [ ! -d "$HOME" ] then mkdir "$HOME" fi # Generating a default git user to run the tests if ! test -r "$HOME/.gitconfig" then cat > "$HOME/.gitconfig" <