#!/bin/bash
#
# Copyright (C) 2008 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}"`
cd "${oldwd}"

javaOpts=""
while expr "x$1" : 'x-J' >/dev/null; do
    opt=`expr "$1" : '-J\(.*\)'`
    javaOpts="${javaOpts} -${opt}"
    shift
done


#######################################################################
# Original content of invocation script follows. Uses values cleverly
# deduced by the above code.
#######################################################################

selection=$1
interpreter="fast"
if [ "$selection" = "--portable" ]; then
    selection=$2;
    interpreter="portable"
fi

dalviktest=$ANDROID_BUILD_TOP/out/host/common/obj/JAVA_LIBRARIES/vm-tests-tf_intermediates
dalviktestdir=$dalviktest/tests
dexcore=$dalviktest/tests/dot/junit/dexcore.jar
scriptdata=$dalviktestdir/data/scriptdata
report=$dalviktest/report.html
curdate=`date`
datadir=/tmp/${USER}
export ANDROID_PRINTF_LOG=tag
export ANDROID_LOG_TAGS='*:s' # was: jdwp:i dalvikvm:i dalvikvmi:i'
export ANDROID_DATA=$datadir
export ANDROID_ROOT=$ANDROID_HOST_OUT
# export LD_LIBRARY_PATH=$base/system/lib
# export DYLD_LIBRARY_PATH=$base/system/lib
debug_opts="-Xcheck:jni -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"
vmtpath=$ANDROID_HOST_OUT/../common/obj/JAVA_LIBRARIES/vm-tests-tf_intermediates/tests

echo "--------------------------------------------------"
echo "Dalvik VM Test Suite"
echo "Version 1.0"
echo "Copyright (c) 2008 The Android Open Source Project"
echo ""

if [ "$selection" = "--help" ]; then
    echo "Usage: vm-tests [--help|--portable] [<mnemonic>]"
    echo ""
    echo "    --help      prints this help message"
    echo ""
    echo "    <mnemonic>  specifies the instruction to test;"
    echo "                default is to run all tests"
    echo ""
    exit 1;
fi

rm -rf --preserve-root $datadir/dalvik-cache
mkdir -p $datadir
mkdir -p $datadir/dalvik-cache

echo ""

pre_report="<html><head><style>
table tr.ok { background:#a0ffa0; }
table tr.nok { background:#ffa0a0; }
table tr.wok { background:#ffffa0; }
table tr.lok { background:#aaaaff; }
</style></head>
<body>
<h1>Dalvik VM test suite results</h1>
Generated $curdate (using the emulator)
<p>
<table width='100%'>
<tr><td>Status</td><td>Target</td><td>Category</td><td>Details</td></tr>"
post_report="</body></html>"

rm -f $report
echo $pre_report > $report

# ----------- running each opcode test ------------

export jpassedcnt=0
export jfailedcnt=0
export jvfefailedcnt=0
export jwarningcnt=0
export jallcnt=0
export jcolumns=0

function classnameToJar()
{
    echo $1 | sed -e 's#\.#/#g;s#$#.jar#'
}

while read -u 3 myline;
do
    # dot.junit.opcodes.add_double.Main_testB1;dot.junit.opcodes.add_double.d.T_add_double_1 ;opcode add_double;test B #1 (border edge case)
    # ->
    # mainclass: dot.junit.opcodes.add_double.Main_testB1
    # testcasedir: opcodes/add_double
    # testname: testB1 ->
    # dir dot/junit/opcodes/add_double/testB1

    # e.g dot.junit.opcodes.add_double.Main_testB1
    mainclass=`echo $myline | cut -d";" -f1`
    # e.g dot.junit.opcodes.add_double.d.T_add_double_1, space sep. >=1 entries
    deps=`echo $myline | cut -d";" -f2`

    jtitle=`echo $myline | cut -d";" -f3`
    jcomment=`echo $myline | cut -d";" -f4`
    details=`echo $myline | cut -d";" -f5`

    if [ "$selection" == "" ] || [ "$jtitle" == "$selection" ]; then

        (( jallcnt += 1 ))

        cd $dalviktestdir
        rm -f $datadir/dalvikout
        # write dalvik output to file
        echo -n "mk_b:" > $datadir/dalvikout

        classpath="${vmtpath}/dot/junit/dexcore.jar:${vmtpath}/mains.jar"
        deps=${deps}" "${mainclass}
        for dep in ${deps}; do
            depJar=`classnameToJar ${dep}`
            classpath=${classpath}:${vmtpath}/${depJar}
        done

        art -Djava.io.tmpdir=/tmp/${USER} \
            -classpath $classpath $mainclass >> $datadir/dalvikout 2>&1 && \
             echo -n dvmpassed: >> $datadir/dalvikout 2>&1

        echo -n "mk_s:" >> $datadir/dalvikout
        # Verify tmpout only contains mkdxc_start;mkdxc_stop -> no system.out/err
        # because of exception. If ok -> green report line else red report with info
        # between mkdxc_start and stop
        vmresult=`cat $datadir/dalvikout`

        if [[ ("$vmresult" == "mk_b:mk_s:") || ("$vmresult" == "mk_b:dvmpassed:mk_s:") ]]; then
            (( jpassedcnt += 1 ))
            echo -n "<tr class=\"ok\"><td>Success</td><td>$jtitle</td>" >> $report
            echo "<td>$jcomment</td><td>$details</td></tr>" >> $report
            echo -n "."
        else
            vmres=`cat $datadir/dalvikout | sed -e 's/mk_b://;s/mk_s://'`
            vmres="$details<br><pre>$vmres</pre>"

            stacktraces=`echo $vmresult | grep "java\.lang\." | grep -c "at dot\.junit\."`
            if [[ $stacktraces > 0 ]]; then
                jtype=`echo "$mainclass" | sed -e 's/.*_test\([^0-9]*\)[0-9].*/\1/' `
                if [ "$jtype" == "VFE" ]; then
                    (( jvfefailedcnt += 1 ))
                    echo -n "V"
                else
                    (( jfailedcnt += 1 ))
                    echo -n "F"
                fi

                echo "<tr class=\"nok\"><td>Failure</td><td>$jtitle</td><td>" >> $report
                echo "$jcomment</td><td>$vmres</td></tr>" >> $report
            else
                (( jwarningcnt += 1 ))
                echo "<tr class=\"wok\"><td>Failure</td><td>$jtitle</td><td>" >> $report
                echo "$jcomment</td><td>(No stacktrace, but errors on console)" >> $report
                echo "<br>$vmres</td></tr>" >> $report
                echo -n "C"
            fi
        fi

        (( jcolumns += 1 ))
        if [ ${jcolumns} -eq 40 ]; then
            echo ""
            (( jcolumns = 0 ))
        fi

    fi
# Use fd nr 3 to avoid subshelling via cat since this looses all
# variables(and thus also the counters we are interested in).
done 3<$scriptdata

echo "</table>" >> $report
let jallcalccnt=$jpassedcnt+$jfailedcnt+$jvfefailedcnt+$jwarningcnt
if [ $jallcalccnt -ne $jallcnt ]; then
    echo "<br>error: green & red != total , $jallcalccnt -ne $jallcnt" >> $report
    exit 1;
fi

echo $post_report >> $report

echo "<br>Tests run: ${jallcnt}" >> $report
echo "<br>Functional failures: ${jfailedcnt}" >> $report
echo "<br>Verifier failures: ${jvfefailedcnt}" >> $report
echo "<br>Console errors: ${jwarningcnt}" >> $report

echo $post_report >> $report

if [[ jcolumns -ne 0 ]]; then
    echo ""
fi

echo ""

if [[ jallcnt -eq jpassedcnt ]]; then
    echo "OK (${jpassedcnt} tests)"
else
    echo "FAILURES!!!"
    echo ""
    echo "Tests run          : ${jallcnt}"
    echo "Functional failures: ${jfailedcnt}"
    echo "Verifier failures  : ${jvfefailedcnt}"
    echo "Console errors     : ${jwarningcnt}"
fi

echo ""
echo "Please see complete report in ${report}"
echo "--------------------------------------------------"
