#!/bin/sh

set -e

proxyhost="$1"
proxyport="$2"
tunnelhost="${3:-$proxyhost}"
tunnelport="${4:-$proxyport}"

# Use explicit <newline> characters for POSIX compliance.
nl="
"
expected_stderr="Connected to $tunnelhost.$nl"
if [ -z "$3" ]; then
	expected_stderr="Via $proxyhost:$proxyport -> localhost:22$nl$expected_stderr"
fi

sslprotocol="`grep -o 'SSLProtocol.*' /etc/apache2/sites-enabled/$proxyhost.conf`" || true
sslprotocol="${sslprotocol:-no SSLProtocol}"
echo "=== Running test ${3:+on $tunnelhost, port $tunnelport }via $proxyhost with $sslprotocol ==="

if [ -n "$3" ]; then
	# Check IP protocol version and address proxytunnel is listening on
	listenerinfo=`lsof -c proxytunnel -a -i -s TCP:LISTEN -nP -F tn | xargs echo`
	ipaddress=`echo "$listenerinfo" | grep -Po '((?<=n)[\d.]+|(?<=n\[)[\da-f:]+)'`
	ipprotocol=`echo "$listenerinfo" | grep -Po '(?<=t)\w+'`
	expected_ipprotocol=`if [ ${ipaddress##*.*.*.*} ]; then echo 'IPv6'; else echo 'IPv4'; fi`

	if [ "$ipprotocol" != "$expected_ipprotocol" ]; then
		echo "Listening on unexpected IP protocol $ipprotocol instead of $expected_ipprotocol."
		exit 1
	fi
	if [ "$ipaddress" != "$tunnelhost" ]; then
		echo "Listening on unexpected IP address $ipaddress instead of $tunnelhost."
		exit 1
	fi
fi

( echo 'ls -l .ssh' | sftp localhost 1>localhost_stdout 2>localhost_stderr ) || true
( echo 'ls -l .ssh' | sftp ${3:+-P $tunnelport} $tunnelhost  1>tunnelhost_stdout 2>tunnelhost_stderr ) || true

echo stderr\'s diff
echo -n "$expected_stderr" | diff -y - tunnelhost_stderr

echo stdout\'s diff
diff -y localhost_stdout tunnelhost_stdout

echo Test succeeded for $tunnelhost.
