#!/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}" libdir=`dirname $progdir`/framework 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} base=$OUT framework=$base/system/framework export ANDROID_PRINTF_LOG=tag export ANDROID_LOG_TAGS='*:s' # was: jdwp:i dalvikvm:i dalvikvmi:i' export ANDROID_DATA=$datadir export ANDROID_ROOT=$base/system 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" exe=$base/system/bin/dalvikvm bpath=$framework/core.jar 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 " --portable uses the portable interpreter;" echo " default is the fast one" 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 # TODO unhack; dimitry: unhack what? adb push $dexcore /data/local/tmp/dexcore.jar >> /dev/null 2>&1 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="/data/local/tmp/dexcore.jar" deps=${deps}" "${mainclass} pushedjars="" for dep in ${deps}; do depJar=`classnameToJar ${dep}` depFileName=`basename ${depJar}` deviceFileName=/data/local/tmp/${depFileName} adb push ${depJar} ${deviceFileName} &> /dev/null classpath=${classpath}:${deviceFileName} pushedjars=${pushedjars}" "${deviceFileName} done adb shell dalvikvm -Djava.io.tmpdir=/data/local/tmp \ -classpath $classpath $mainclass >> $datadir/dalvikout 2>&1 && \ echo -n dvmpassed: >> $datadir/dalvikout 2>&1 for jar in ${pushedjars}; do adb shell rm ${jar} &> /dev/null done 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 "--------------------------------------------------"