#!/bin/sh

TEST_CONFIGS_ALL="ipv4 ipv6"
TEST_CONFIGS="${TEST_CONFIGS:-$TEST_CONFIGS_ALL}"

. ../jenkins-common.sh
IMAGE_SUFFIX="${IMAGE_SUFFIX:-master}"
docker_images_require \
	"asterisk-$IMAGE_SUFFIX" \
	"ttcn3-asterisk-ims-ue-test" \
	"dnsmasq"

set_clean_up_trap
set -e

clean_up() {
	local i
	local log

	# Add a suffix to the class names in the junit-xml log
	for i in $TEST_CONFIGS; do
		if [ "$i" = "all" ]; then
			continue
		fi

		for log in "$VOL_BASE_DIR"/asterisk-ims-ue-tester-"$i"/junit-xml-*.log; do
			if ! [ -e "$log" ]; then
				continue
			fi
			sed -i "s/classname='\([^']\+\)'/classname='\1_$i'/g" "$log"
		done
	done
}

# Start container with dnsmasq in background
start_dnsmasq() {
	local test_config="$1"
	echo Starting container with dnsmasq
	docker run	--rm \
			--cap-add=NET_ADMIN \
			$(docker_network_params $SUBNET $DNS_IP_SUFFIX) \
			--ulimit core=-1 \
			-v "$VOL_BASE_DIR/dnsmasq-${test_config}:/data" \
			--name ${BUILD_TAG}-dnsmasq -d \
			$DOCKER_ARGS \
			$REPO_USER/dnsmasq
}

# Start container with Asterisk in background
start_asterisk() {
	local test_config="$1"
	echo Starting container with Asterisk
	docker run	--rm \
			--cap-add=NET_ADMIN \
			--cap-add=SYS_RESOURCE \
			$(docker_network_params $SUBNET $ASTERISK_IP_SUFFIX) \
			-e "DNS_IPADDR=${DNS_IPADDR}" \
			--ulimit core=-1 \
			-v "$VOL_BASE_DIR/asterisk-${test_config}:/data" \
			--name "${BUILD_TAG}-asterisk" -d \
			$DOCKER_ARGS \
			"$REPO_USER/asterisk-$IMAGE_SUFFIX" \
			/bin/sh -c "/data/asterisk.sh >/data/asterisk.console.log 2>&1"
}

# Start docker container with testsuite in foreground
start_testsuite() {
	local test_config="$1"
	echo Starting container with Asterisk testsuite
	docker run	--rm \
			--cap-add=NET_ADMIN \
			--cap-add=SYS_RESOURCE \
			$(docker_network_params $SUBNET $TTCN3_IP_SUFFIX) \
			--ulimit core=-1 \
			-e "TTCN3_PCAP_PATH=/data" \
			-e "EXTRA_IPADDR=${EXTRA_IPADDR}" \
			-e "ASTERISK_IPADDR=${ASTERISK_IPADDR}" \
			-v "$VOL_BASE_DIR/asterisk-ims-ue-tester-${test_config}:/data" \
			--name "${BUILD_TAG}-ttcn3-asterisk-ims-ue-test" \
			$DOCKER_ARGS \
			"$REPO_USER/ttcn3-asterisk-ims-ue-test" \
			/data/ttcn3.sh
}

network_create

for i in $TEST_CONFIGS; do
	if ! test_config_enabled "$i"; then
		continue
	fi

	mkdir "${VOL_BASE_DIR}/dnsmasq-${i}"
	cp dnsmasq/* "${VOL_BASE_DIR}/dnsmasq-${i}/"

	mkdir "${VOL_BASE_DIR}/asterisk-ims-ue-tester-${i}"
	mkdir "${VOL_BASE_DIR}/asterisk-ims-ue-tester-${i}/unix"
	cp "ttcn3/ttcn3.sh" "${VOL_BASE_DIR}/asterisk-ims-ue-tester-${i}/"
	cp "ttcn3/Asterisk_Tests.cfg" "${VOL_BASE_DIR}/asterisk-ims-ue-tester-${i}/"
	write_mp_osmo_repo "${VOL_BASE_DIR}/asterisk-ims-ue-tester-${i}/Asterisk_Tests.cfg"

	mkdir "$VOL_BASE_DIR/asterisk-${i}"
	cp asterisk/* "$VOL_BASE_DIR/asterisk-${i}/"

	network_replace_subnet_in_configs
	ASTERISK_IP_SUFFIX="10"
	TTCN3_IP_SUFFIX="103"
	IMSCORE_IP_SUFFIX="104"
	DNS_IP_SUFFIX="200"

	if [ "$i" = "ipv4" ]; then
		NETMASK_PREFIX="24"
		SUBNET_IP_PREFIX="$SUB4_PREFIX.$SUBNET"
		ASTERISK_IPADDR="${SUBNET_IP_PREFIX}.${ASTERISK_IP_SUFFIX}"
		DNS_IPADDR="${SUBNET_IP_PREFIX}.${DNS_IP_SUFFIX}"
		EXTRA_IPADDR="${SUBNET_IP_PREFIX}.${IMSCORE_IP_SUFFIX}/${NETMASK_PREFIX}"
	elif [ "$i" = "ipv6" ]; then
		NETMASK_PREFIX="64"
		SUBNET_IP_PREFIX="$SUB6_PREFIX:$SUBNET"
		ASTERISK_IPADDR="${SUBNET_IP_PREFIX}::${ASTERISK_IP_SUFFIX}"
		DNS_IPADDR="${SUBNET_IP_PREFIX}::${DNS_IP_SUFFIX}"
		EXTRA_IPADDR="${SUBNET_IP_PREFIX}::${IMSCORE_IP_SUFFIX}/${NETMASK_PREFIX}"

		# Replace IPv4 addresses with IPv6 ones:
		REPLACE_V4_TO_V6_EXPR="s,${SUB4_PREFIX}\.${SUBNET}\.,${SUB6_PREFIX}:${SUBNET}::,g"
		REPLACE_V4_TO_V6_PORT_EXPR="s,${SUB4_PREFIX}\.${SUBNET}\.${ASTERISK_IP_SUFFIX}:,[${ASTERISK_IPADDR}]:,g"
		sed -i -E -e "${REPLACE_V4_TO_V6_EXPR}" "${VOL_BASE_DIR}/dnsmasq-${i}"/*.conf
		sed -i -E -e "s,${SUB4_PREFIX}\.${SUBNET}\.${TTCN3_IP_SUFFIX}/24,${SUB6_PREFIX}:${SUBNET}::${TTCN3_IP_SUFFIX}/${NETMASK_PREFIX},g" "${VOL_BASE_DIR}/asterisk-${i}"/manager.conf
		sed -i -E -e "s,${SUB4},${SUB6},g" "${VOL_BASE_DIR}/asterisk-${i}"/*.conf
		sed -i -E -e "${REPLACE_V4_TO_V6_PORT_EXPR}" "${VOL_BASE_DIR}/asterisk-${i}"/*.conf
		sed -i -E -e "${REPLACE_V4_TO_V6_EXPR}" "${VOL_BASE_DIR}/asterisk-${i}"/*.conf
		sed -i -E -e "${REPLACE_V4_TO_V6_EXPR}" "${VOL_BASE_DIR}/asterisk-ims-ue-tester-${i}"/*.cfg
	fi

	start_dnsmasq "$i"
	start_asterisk "$i"
	start_testsuite "$i"

	docker_kill_wait "$BUILD_TAG"-asterisk || true
	docker_kill_wait "$BUILD_TAG"-dnsmasq || true
	 # For some reason we need to wait a bit until recreating dnsmasq docker,
	 # otherwise it says "container name X  is already in use by container Y":
	sleep 1
done