#!/bin/bash
#
# Copyright (C) 2007 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Set up prog to be the path of this script, including following symlinks,
# and set up progdir to be the fully-qualified pathname of its directory.
prog="$0"
while [ -h "${prog}" ]; do
    newProg=`/bin/ls -ld "${prog}"`
    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
    if expr "x${newProg}" : 'x/' >/dev/null; then
        prog="${newProg}"
    else
        progdir=`dirname "${prog}"`
        prog="${progdir}/${newProg}"
    fi
done
oldwd=`pwd`
progdir=`dirname "${prog}"`
cd "${progdir}"
progdir=`pwd`
prog="${progdir}"/`basename "${prog}"`

if [[ -z "${JAVA_HOME}" ]]; then
    unix=$(uname | tr '[A-Z]' '[a-z]')
    JAVA_HOME="${progdir}/../../../prebuilts/jdk/jdk8/${unix}-x86"
fi

if [[ ! -d "${JAVA_HOME}" ]]; then
    echo "Missing JAVA_HOME directory: $JAVA_HOME" 1>&2
    exit 1
fi

export JAVAC="${JAVA_HOME}/bin/javac"
if [ "!" -e "$JAVAC" ]; then
    echo "Missing JAVAC executable: ${JAVAC}" 1>&2
    exit 1
fi

info="info.txt"
run="run"
expected="expected.txt"
output="out.txt"

dev_mode="no"
update_mode="no"
tmpdir=/tmp/test-$$
usage="no"

while [[ "x$1" = "x-"* ]]; do
    case $1 in
         --dev) dev_mode="yes" ;;
         --output_dir)
             tmpdir=$2
             shift ;;
         --update) update_mode="yes" ;;
         --help) usage="yes" ;;
         *) usage="yes" ;;
     esac
     shift
done

if [ "x$1" = "x" ]; then
    testdir=`basename "$oldwd"`
else
    testdir="$1"
fi

if [ '!' -d "$testdir" ]; then
    td2=`echo ${testdir}-*`
    if [ '!' -d "$td2" ]; then
        echo "${testdir}: no such test directory" 1>&2
        usage="yes"
    fi
    testdir="$td2"
fi

if [ "$update_mode" = "yes" -a "$dev_mode" = "yes" ] ; then
    echo Error: --dev is incompatible with --update. 1>&2
    usage="yes"
fi

if [ "$usage" = "yes" ]; then
    prog=`basename $prog`
    (
        echo "usage:"
        echo "  $prog --help             Print this message."
        echo "  $prog testname           Run test normally."
        echo "  $prog --dev testname     Development mode (dump to stdout)."
        echo "  $prog --update testname  Update mode (replace expected.txt)."
        echo "  Omitting the test name uses the current directory as the test."
        echo "options:"
        echo "        --output_dir <dir> Use <dir> for the test outputs."
    ) 1>&2
    exit 1
fi

td_info="${testdir}/${info}"
td_run="${testdir}/${run}"
td_expected="${testdir}/${expected}"

for td_file in "$td_info" "$td_run" "$td_expected"; do
    if [[ ! -r "$td_file" ]]; then
        echo "${testdir}: missing file $td_file" 1>&2
        exit 1
    fi
done

# copy the test to a temp dir and run it
if [ -d "$tmpdir" ]; then
    rm -rf "$tmpdir" || exit 1
fi
output_parent=`dirname ${tmpdir}`
mkdir -p "${output_parent}" || exit 1
cp -Rp "$testdir" "$tmpdir" || exit 1
cd "$tmpdir"
chmod 755 "$run"

echo "${testdir}: running..." 1>&2
good="no"
if [ "$dev_mode" = "yes" ]; then
    "./$run" 2>&1
    echo "exit status: $?" 1>&2
    good="yes"
elif [ "$update_mode" = "yes" ]; then
    "./$run" >"$output" 2>&1
    if [[ $? == 0 ]]; then
        good="yes"
        mv "$output" "${progdir}/${td_expected}"
    else
        echo "Test failed during update."
        good="no"
    fi

else
    "./$run" >"$output" 2>&1
    cmp -s "$expected" "$output"
    if [ "$?" = "0" ]; then
        # output == expected
        good="yes"
        echo "$testdir"': succeeded!' 1>&2
    fi
fi

if [ "$good" = "yes" ]; then
    cd "$oldwd"
    rm -rf "$tmpdir"
    exit 0
fi

(
    echo "${testdir}: FAILED!"
    echo ' '
    echo '#################### info'
    cat "$info" | sed 's/^/# /g'
    echo '#################### diffs'
    diff -u "$expected" "$output"
    echo '####################'
    echo ' '
    echo "files left in $tmpdir"
) 1>&2

exit 1
