aboutsummaryrefslogtreecommitdiff
path: root/tests/test.sh
blob: 34b42e3a3089511749eb455fa139f90507306215 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# 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"
	local ORIG="$(pwd)"
	cd "$BUILD_DIR"
	/usr/lib64/qt5/bin/qmake "$PROJECT_ROOT" || echo_fail "QtMips qmake failed!"
	make "$@" || echo_fail "QtMips build failed! (target: $@)"
	cd "$ORIG"
}

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"
	local ORIG="$(pwd)"
	cd "$TEST_DIR_ROOT"
	"$PROJECT_ROOT"/compiler/compile.sh
	cd "$ORIG"
}

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" "$@"
}