| #!/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 |
| |
| #exec java $javaOpts -jar $libdir/hat.jar "$@" |
| |
| ####################################################################### |
| # 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 |
| |
| datadir=/tmp/${USER} |
| rm -rf $datadir/dalvik-cache |
| mkdir -p $datadir |
| mkdir -p $datadir/dalvik-cache |
| |
| 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" |
| exe=$base/system/bin/dalvikvm |
| bpath=$framework/core.jar |
| BASEDIR=$progdir/../cts/dxconverter |
| |
| echo "--------------------------------------------------" |
| echo "DX Converter Test Suite" |
| echo "Version 1.0" |
| echo "Copyright (c) 2008 The Android Open Source Project" |
| echo "" |
| |
| if [ "$selection" = "--help" ]; then |
| echo "Usage: dx-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 |
| |
| # we need for launching: the dx tool, the dalvikvm executable, and the directory with all .class files |
| # - prep dxcore.jar |
| # - init reportfile |
| # for each package as stated in data/scriptdata (like dxc/junit/opcode/aaload) do |
| # - clear tmpoutput |
| # - try to dx Test_opcode.class and all .class files in the ./jm directory into a classes.jar file |
| # - launch dalvikvm, let it write output &> to tmpoutput (surrounded by magic key for start/stop) |
| # - look at tmpoutput -> green or red test result |
| # - append the result to the report.html file (table form) |
| # - clear the tmpoutput, the classes.jar etc. |
| # end for |
| # - close the report file and cat its path to stdout |
| |
| # sanity checks: |
| # dx around? |
| curmode="" |
| dx --version &> /dev/null |
| if [ ! $? -eq 0 ] |
| then |
| echo "error:could not start dx tool" |
| exit 1; |
| fi |
| |
| if [ "$TARGET_SIMULATOR" = "true" ]; then |
| echo "Simulator mode, $interpreter interpreter"; |
| curmode="simulator" |
| if [ -f $exe ]; then |
| version=`${exe} -version 2> /dev/null | grep -o "version.*$"` |
| echo "Using Dalvik VM ${version}" |
| else |
| echo "No Dalvik VM found at $exe"; |
| exit 1; |
| fi |
| else |
| echo "Emulator mode, $interpreter interpreter"; |
| curmode="emulator" |
| version=`adb shell dalvikvm -version 2> /dev/null | grep -o "version.*$"` |
| if [ "${version}" != "" ]; then |
| echo "Using Dalvik VM ${version}" |
| else |
| echo "No emulator or device found"; |
| exit 1; |
| fi |
| fi |
| |
| echo "" |
| |
| latestpath="" |
| curdate=`date` |
| dxtmpdir=$BASEDIR/dxtmp |
| dxruntmpdir=$BASEDIR/dxruntmp |
| javac_out=$BASEDIR/classout |
| report=$BASEDIR/report.html |
| mkdir -p $dxtmpdir |
| rm -f $report |
| 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>DX test suite results</h1> |
| Generated $curdate (using the $curmode) |
| <p> |
| <table width='100%'> |
| <tr><td>Status</td><td>Target</td><td>Category</td><td>Details</td></tr>" |
| post_report="</body></html>" |
| echo $pre_report > $report |
| |
| # ----------- generating dxcore.jar |
| cd $javac_out |
| # consists of dxc.junit.DxAbstractMain and dxc.junit.DxUtil |
| dx --dex --positions=lines --output="$BASEDIR/dxcore.jar" dxc/junit/DxAbstractMain.class dxc/junit/DxUtil.class |
| |
| # ----------- generating jars for each opcode test ------------ |
| |
| export jpassedcnt=0 |
| export jwarningcnt=0 |
| export jvfefailedcnt=0 |
| export jfailedcnt=0 |
| export jallcnt=0 |
| export jcolumns=0 |
| |
| function classnameToPath() |
| { |
| echo $1 | sed -e 's#\.#/#g;s#$#.class#' |
| } |
| |
| function lecho() |
| { |
| if [ ! -z $CTS_DX_DEBUG ]; then echo $@; fi |
| } |
| |
| while read -u 3 myline; |
| do |
| mainclass=`echo $myline | cut -d";" -f1` # e.g dxc.junit.verify.t482_9.Main_testVFE2 |
| classfiles=`classnameToPath $mainclass` |
| |
| testclasses=`echo $myline | cut -d";" -f2` # e.g dxc.junit.verity.t482_9.jm.T_t482_9_1 |
| |
| for testclass in $testclasses; do |
| classfiles="$classfiles "`classnameToPath $testclass`; |
| done |
| |
| 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 )) |
| |
| |
| rm -rf $dxtmpdir/* |
| mkdir -p $dxtmpdir |
| cd $dxtmpdir |
| |
| for testclass in $classfiles; do |
| lecho -n "dexing $testclass : " |
| mkdir -p `dirname ${dxtmpdir}/${testclass}` |
| cp ${javac_out}/${testclass} ${dxtmpdir}/${testclass} |
| |
| dx --dex --positions=lines $testclass &>/dev/null |
| |
| if [ $? -eq 0 ]; then |
| lecho " dexable"; |
| else |
| lecho " not dexable->remove"; |
| rm $testclass |
| fi |
| done |
| |
| dx --dex --positions=lines --output="$BASEDIR/dxclasses.jar" . |
| |
| # run the previously prepared jar files in the dalvik vm. |
| # the dalvik vm executable (dalvikvm) must be on the PATH. |
| # |
| ### echo -n ">>> launch dalvikvm for class: $mainclass" |
| cd $BASEDIR |
| rm -f $BASEDIR/dalvikout |
| # write dalvik output to file |
| echo -n "mk_b:" > $BASEDIR/dalvikout |
| #echo ">>> launch dex package -classpath $BASEDIR/dxcore.jar:$BASEDIR/dxclasses.jar $mainclass" |
| |
| if [ "$TARGET_SIMULATOR" = "true" ]; then |
| ### echo " on simulator"; |
| $valgrind $exe -Xint:$interpreter -Xmx512M -Xss32K -Xbootclasspath:$bpath -DacceptCNF=true -classpath $BASEDIR/dxcore.jar:$BASEDIR/dxclasses.jar $debug_opts $mainclass "$@" >> $BASEDIR/dalvikout 2>&1 |
| RESULTCODE=$? |
| if [ ${RESULTCODE} -ne 0 ]; then |
| echo "execute dalvikvm failed with resultcode: ${RESULTCODE}" >> $BASEDIR/dalvikout 2>&1 |
| fi |
| else |
| # adb shell dalvikvm -Xint:$interpreter -Djava.io.tmpdir=/data/local/tmp -classpath /data/dxcore.jar:/data/dxclasses.jar dxc.junit.opcodes.aload.Main_testN2 |
| # either no output (ok) or |
| # java.lang.RuntimeException: test did not cause the expected verify error, but:java.lang.RuntimeException, msg:AssertionFailedError msg:expected a verification exception |
| # at dxc.junit.DxUtil.checkVerifyException(DxUtil.java:65) |
| # at dxc.junit.opcodes.aload.Test_aload.testVFE10(Test_aload.java:181) |
| # at dxc.junit.opcodes.aload.Main_testVFE10.main(Main_testVFE10.java:5) |
| # at dalvik.system.NativeStart.main(Native Method) |
| |
| ### echo " on emulator/device with adb push" |
| adb push $BASEDIR/dxcore.jar /data/dxcore.jar &> /dev/null |
| adb push $BASEDIR/dxclasses.jar /data/dxclasses.jar &> /dev/null |
| adb shell "dalvikvm -Djava.io.tmpdir=/data/local/tmp -classpath /data/dxcore.jar:/data/dxclasses.jar $mainclass && echo -n dvmpassed:" >> $BASEDIR/dalvikout 2>&1 |
| fi |
| |
| echo -n "mk_s:" >> $BASEDIR/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 |
| ### echo "vmresult: $vmresult" |
| vmresult=`cat $BASEDIR/dalvikout` |
| if [[ ("$vmresult" == "mk_b:mk_s:") || ("$vmresult" == "mk_b:dvmpassed:mk_s:") ]]; then |
| (( jpassedcnt += 1 )) |
| echo "<tr class=\"ok\"><td>Success</td><td>$jtitle</td><td>$jcomment</td><td>$details</td></tr>" >> $report |
| ### echo " -> PASSED (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)" |
| echo -n "." |
| elif [[ ("$vmresult" == "mk_b:dvmvfe:mk_s:") || ("$vmresult" == "mk_b:dvmvfe:dvmpassed:mk_s:") ]]; then |
| (( jwarningcnt += 1 )) |
| echo "<tr class=\"wok\"><td>Warning</td><td>$jtitle</td><td>$jcomment</td><td>Special behavior regarding VerifyError</td></tr>" >> $report |
| ### echo " -> WARNING (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)" |
| echo -n "W" |
| else |
| vmres=`cat $BASEDIR/dalvikout | sed -e 's/mk_b://;s/mk_s://'` |
| vmres="$details<br><pre>$vmres</pre>" |
| # red with additional info if a VFE failed, red if either a N,B, or E failed |
| jtype=`echo "$mainclass" | sed -e 's/.*_test\([^0-9]*\)[0-9].*/\1/' ` |
| if [ "$jtype" == "VFE" ]; then |
| (( jvfefailedcnt += 1 )) |
| echo -n "<tr class=\"nok\"><td>Verifier failure</td><td>$jtitle</td><td>$jcomment</td><td>$vmres</td></tr>" >> $report |
| ### echo " -> VFE FAILED (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)" |
| echo -n "V" |
| else |
| (( jfailedcnt += 1 )) |
| echo -n "<tr class=\"nok\"><td>Functional failure</td><td>$jtitle</td><td>$jcomment</td><td>$vmres</td></tr>" >> $report |
| ### echo " -> FAILED (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)" |
| echo -n "F" |
| fi |
| fi |
| |
| (( jcolumns += 1 )) |
| if [ ${jcolumns} -eq 40 ]; then |
| echo "" |
| (( jcolumns = 0 )) |
| fi |
| |
| fi |
| |
| done 3<$BASEDIR/data/scriptdata #we use fd nr 3 to avoid subshelling via cat since this looses all variables (and thus also the counters we are interested in). |
| |
| 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 "<br>Tests run: ${jallcnt}" >> $report |
| echo "<br>Functional failures: ${jfailedcnt}" >> $report |
| echo "<br>Verifier failures: ${jvfefailedcnt}" >> $report |
| echo "<br>Warnings: ${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 "Warnings : ${jwarningcnt}" |
| fi |
| |
| echo "" |
| echo "Please see complete report in ${report}" |
| echo "--------------------------------------------------" |