diff options
Diffstat (limited to 'tests/test.sh')
-rw-r--r-- | tests/test.sh | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/tests/test.sh b/tests/test.sh new file mode 100644 index 0000000..7145a0c --- /dev/null +++ b/tests/test.sh @@ -0,0 +1,99 @@ +# Enable shell exit on failure +set -e + +## Colored echo function ######################################################## + +echo_head() { + echo -e "\e[1;34m-- $@ --\e[0m" >&2 +} + +echo_msg() { + echo -e "\e[1;33m$@\e[0m" >&2 +} + +echo_fail() { + echo -e "\e[1;31m$@\e[0m" >&2 + exit 1 +} + +## Check and init test ########################################################## + +# Check if test name is defined +[ -n "$TEST_NAME" ] || echo_fail "Test name is not defined! Define TEST_NAME variable in test script." +# Report user what test is going to be executed +echo_head "Running test $TEST_NAME" + +## Define some variables ######################################################## + +# Store base directory from which we started test script +PWD_DIR="$(pwd)" +# Define path to test sources +TEST_SRC="$(dirname "$(readlink -f "$0")")" + +# Get project root. +# As we want to have script calling this anywhere, we have to do some more work to +# get project root. But we know content of root and so we can use that to locate +# it and we know that test source directory is part of tree so it's under root. +PROJECT_ROOT="$TEST_SRC" +while [ -n "$PROJECT_ROOT" ] && ! [ \ + -f "$PROJECT_ROOT/LICENSE" -a \ + -f "$PROJECT_ROOT/README.md" -a \ + -d "$PROJECT_ROOT/qtmips_gui" -a \ + -d "$PROJECT_ROOT/qtmips_cli" -a \ + -d "$PROJECT_ROOT/qtmips_machine" \ + ]; do + PROJECT_ROOT="${PROJECT_ROOT%/*}" +done +[ -n "$PROJECT_ROOT" ] || echo_fail "Project root not found!!" + +# Define root for all tests +# We are little bit clever about it. If we detect that we are in project tree we +# will use same directory every time. Otherwise we use current working directory +# where we create test_dir directory. +if [ -n "${PWD_DIR#$PROJECT_ROOT}" ]; then + TEST_DIR_ROOT="$PROJECT_ROOT/test_dir" +else + TEST_DIR_ROOT="$PWD_DIR/test_dir" +fi + +# Directory where qtmips will be build +BUILD_DIR="$TEST_DIR_ROOT/build" + +# Directory where test should be build and executed +TEST_DIR="$TEST_DIR_ROOT/$TEST_NAME" + +## Helper functions for building and running project ############################ + +qtmips_make() { + mkdir -p "$BUILD_DIR" + pushd "$BUILD_DIR" >/dev/null + /usr/lib64/qt5/bin/qmake "$PROJECT_ROOT" || echo_fail "QtMips qmake failed!" + make "$@" || echo_fail "QtMips build failed! (target: $@)" + popd >/dev/null +} + +qtmips_run() { + local BIN="$BUILD_DIR/$1" + shift + LD_LIBRARY_PATH="$BUILD_DIR/qtmips_machine" "$BIN" "$@" +} + +## Mips elf binary compilation ################################################## + +MIPS_COMPILER="$TEST_DIR_ROOT/mips-qtmips-elf" + +mips_compiler() { + # Skip if we have compiler already + [ ! -d "$MIPS_COMPILER" ] || return 0 + # Otherwise compile it + mkdir -p "$TEST_DIR_ROOT" + pushd "$TEST_DIR_ROOT" >/dev/null + "$PROJECT_ROOT"/compiler/compile.sh + popd >/dev/null +} + +mips_make_test() { + mips_compiler + mkdir -p "$TEST_DIR" + PATH="$PATH:$MIPS_COMPILER/bin" make -C "$TEST_SRC" O="$TEST_DIR" MIPS_PREFIX="mips-qtmips-elf" "$@" +} |