#!/bin/sh -e
PROJECT="$1"
PROJECT_UPPER="$(echo "$PROJECT" | tr '[:lower:]' '[:upper:]')"
DIR_OSMODEV="$(readlink -f "$(dirname $0)/..")"
DIR_MAKE="${DIR_MAKE:-${DIR_OSMODEV}/ttcn3/make}"
DIR_OUTPUT="${DIR_OUTPUT:-${DIR_OSMODEV}/ttcn3/out}"
JOBS="${JOBS:-9}"

check_usage() {
	if [ -z "$PROJECT" ]; then
		echo "usage: $(basename $0) PROJECT"
		echo "example: $(basename $0) hlr"
		exit 1
	fi
}

# Returns the name of the testsuite binary
get_testsuite_name() {
	case "$PROJECT" in
		bts-*) echo "BTS_Tests" ;;
		mgw) echo "MGCP_Test" ;;
		pcu-sns) echo "PCU_Tests" ;;
		*) echo "${PROJECT_UPPER}_Tests" ;;
	esac
}

get_testsuite_dir() {
	local hacks="${DIR_OSMODEV}/src/osmo-ttcn3-hacks"

	case "$PROJECT" in
		bts-*) echo "$hacks/bts" ;;
		pcu-sns) echo "$hacks/pcu" ;;
		*) echo "$hacks/$PROJECT" ;;
	esac
}

get_testsuite_config() {
	case "$PROJECT" in
		bts-gprs) echo "BTS_Tests_GPRS.cfg" ;;
		bts-oml) echo "BTS_Tests_OML.cfg" ;;
		pcu-sns) echo "PCU_Tests_SNS.cfg" ;;
		*) echo "$(get_testsuite_name).cfg" ;;
	esac
}

get_testsuite_dir_docker() {
	local dp="${DIR_OSMODEV}/src/docker-playground"

	case "$PROJECT" in
		*) echo "$dp/ttcn3-$PROJECT-test" ;;
	esac
}

# Programs that need to be built
get_programs() {
	case "$PROJECT" in
		bsc) echo "osmo-stp osmo-bsc osmo-bts-omldummy" ;;
		bts) echo "osmo-bsc osmo-bts-trx fake_trx.py trxcon" ;;
		msc) echo "osmo-stp osmo-msc" ;;
		pcu-sns) echo "osmo-pcu" ;;
		pcu) echo "osmo-pcu osmo-bsc osmo-bts-virtual virtphy" ;;
		sgsn) echo "osmo-stp osmo-sgsn" ;;
		sip) echo "osmo-sip-connector" ;;
		*) echo "osmo-$PROJECT" ;;
	esac
}

# Return the git repository name, which has the source for a specific program.
# $1: program name
get_program_repo() {
	case "$1" in
		fake_trx.py) echo "osmocom-bb" ;;
		osmo-bts-*) echo "osmo-bts" ;;
		osmo-stp) echo "libosmo-sccp" ;;
		trxcon) echo "osmocom-bb" ;;
		virtphy) echo "osmocom-bb" ;;
		*) echo "$1" ;;
	esac
}

check_ttcn3_install() {
	if ! command -v ttcn3_compiler > /dev/null; then
		echo "ERROR: ttcn3_compiler is not installed."
		echo "Install eclipse-titan from the Osmocom latest repository."
		echo "Details: https://osmocom.org/projects/cellular-infrastructure/wiki/Titan_TTCN3_Testsuites"
		exit 1
	fi
}

setup_dir_make() {
	cd "$DIR_OSMODEV"

	( echo "# Generated by ttcn3.sh, do not edit"
	  cat ./3G+2G.deps
	  echo
	  echo "osmo-bts	libosmocore libosmo-abis"
	  echo "osmo-pcu	libosmocore"
	  # just clone these, building is handled by ttcn3.sh
	  echo "docker-playground"
	  echo "osmo-ttcn3-hacks"
	  echo "osmocom-bb") > ttcn3/3G+2G_ttcn3.deps

	./gen_makefile.py \
		ttcn3/3G+2G_ttcn3.deps \
		default.opts \
		iu.opts \
		no_systemd.opts \
		no_doxygen.opts \
		no_dahdi.opts \
		no_optimization.opts \
		ttcn3/ttcn3.opts -I -m "$DIR_MAKE"
}

# $1: name of repository (e.g. osmo-ttcn3-hacks)
clone_repo() {
	make -C "$DIR_MAKE" ".make.${1}.clone"
}

# Require testsuite dir and docker-playground dir
check_dir_testsuite() {
	local program
	local config_testsuite
	local dir_testsuite="$(get_testsuite_dir)"
	local dir_testsuite_docker="$(get_testsuite_dir_docker)"

	if ! [ -d "$dir_testsuite" ]; then
		echo "ERROR: project '$PROJECT' is invalid, resulting path not found: $dir_testsuite"
		exit 1
	fi

	if ! [ -d "$dir_testsuite_docker" ]; then
		echo "ERROR: could not find docker dir for project: $PROJECT. Adjust get_testsuite_dir_docker?"
		exit 1
	fi

	# Sanity check for jenkins.sh
	if ! grep -q DOCKER_ARGS $dir_testsuite_docker/jenkins.sh; then
		echo "ERROR: DOCKER_ARGS not found in $dir_testsuite_docker/jenkins.sh!"
		exit 1
	fi
}

# Build a program that is in the subdir of a repository (e.g. trxcon in osmocom-bb.git).
# $1: repository
# $2: path in the repository
build_osmo_program_subdir() {
	clone_repo "$1"
	cd "$DIR_OSMODEV/src/$1/$2"
	if ! [ -e "./configure" ] && [ -e "configure.ac" ]; then
		autoreconf -fi
	fi
	if ! [ -e "Makefile" ] && [ -e "Makefile.am" ]; then
		./configure
	fi
	make -j"$JOBS"
}

# Use osmo-dev to build a typical Osmocom program, and run a few sanity checks.
# $1 program
build_osmo_program_osmodev() {
	local repo="$(get_program_repo "$program")"
	make -C "$DIR_MAKE" "$repo"

	local path="$(command -v "$program")"
	if [ -z "$path" ]; then
		echo "ERROR: program was not installed to PATH: $program"
		echo "Maybe you need to add /usr/local/bin to PATH?"
		exit 1
	fi

	local pathdir="$(dirname "$path")"
	local reference="$DIR_MAKE/.make.$repo.build"
	if [ -z "$(find "$pathdir" -name "$program" -newer "$reference")" ]; then
		echo "ERROR: $path is outdated!"
		echo "Maybe you need to pass a configure argument to $repo.git, so it builds and installs $program?"
		echo "Or the order in PATH is wrong?"
		exit 1
	fi
}

# Use osmo-dev to build one Osmocom program and its dependencies
build_osmo_programs() {
	local program
	for program in $(get_programs); do
		case "$program" in
			fake_trx.py) clone_repo "osmocom-bb" ;;
			trxcon) build_osmo_program_subdir "osmocom-bb" "src/host/trxcon" ;;
			virtphy) build_osmo_program_subdir "osmocom-bb" "src/host/virt_phy" ;;
			*) build_osmo_program_osmodev "$program" ;;
		esac
	done
}

build_testsuite() {
	cd "$(get_testsuite_dir)"
	./gen_links.sh
	./regen_makefile.sh
	make compile
	make -j"$JOBS"
}

run_docker() {
	local hacks="${DIR_OSMODEV}/src/osmo-ttcn3-hacks"
	local docker_dir="$(get_testsuite_dir_docker)"
	local docker_name="$(basename "$docker_dir")"
	local marker="${DIR_OSMODEV}/ttcn3/make/.docker.$docker_name"

	# Skip building docker containers if this already ran
	if [ -e "$marker" ]; then
		echo "NOTE: skipping docker container build, because marker exists: $marker"
		export NO_DOCKER_IMAGE_BUILD=1
	fi

	cd "$(get_testsuite_dir_docker)"
	export DOCKER_ARGS="-v /usr/local:/usr/local:ro -v $hacks:/osmo-ttcn3-hacks:ro"
	./jenkins.sh

	touch "$marker"
}

remove_old_logs() {
	sudo rm -rf /tmp/tmp.* 2>/dev/null
}

collect_logs() {
	# Merge and move logs
	cd /tmp/logs/*-tester

	# Format logs
	for log in *.merged; do
		ttcn3_logformat -o "${log}.log" "$log"
		sudo rm "$log"
	done

	# Print log path
	echo "---"
	echo "Logs: /tmp/logs"
	echo "---"
}

check_usage
check_ttcn3_install
setup_dir_make
clone_repo "osmo-ttcn3-hacks"
clone_repo "docker-playground"
check_dir_testsuite
build_osmo_programs
build_testsuite
remove_old_logs
run_docker
collect_logs
