Home | History | Annotate | Download | only in etc
      1 #!/bin/bash
      2 #
      3 # Copyright (C) 2008 The Android Open Source Project
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #      http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 
     17 # Set up prog to be the path of this script, including following symlinks,
     18 # and set up progdir to be the fully-qualified pathname of its directory.
     19 
     20 prog="$0"
     21 while [ -h "${prog}" ]; do
     22     newProg=`/bin/ls -ld "${prog}"`
     23     newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
     24     if expr "x${newProg}" : 'x/' >/dev/null; then
     25         prog="${newProg}"
     26     else
     27         progdir=`dirname "${prog}"`
     28         prog="${progdir}/${newProg}"
     29     fi
     30 done
     31 oldwd=`pwd`
     32 progdir=`dirname "${prog}"`
     33 cd "${progdir}"
     34 progdir=`pwd`
     35 prog="${progdir}"/`basename "${prog}"`
     36 cd "${oldwd}"
     37 
     38 libdir=`dirname $progdir`/framework
     39 
     40 javaOpts=""
     41 while expr "x$1" : 'x-J' >/dev/null; do
     42     opt=`expr "$1" : '-J\(.*\)'`
     43     javaOpts="${javaOpts} -${opt}"
     44     shift
     45 done
     46 
     47 #exec java $javaOpts -jar $libdir/hat.jar "$@"
     48 
     49 #######################################################################
     50 # Original content of invocation script follows. Uses values cleverly
     51 # deduced by the above code.
     52 #######################################################################
     53 
     54 selection=$1
     55 interpreter="fast"
     56 if [ "$selection" = "--portable" ]; then
     57     selection=$2;
     58     interpreter="portable"
     59 fi
     60 
     61 datadir=/tmp/${USER}
     62 rm -rf --preserve-root $datadir/dalvik-cache
     63 mkdir -p $datadir
     64 mkdir -p $datadir/dalvik-cache
     65 
     66 base=$OUT
     67 framework=$base/system/framework
     68 export ANDROID_PRINTF_LOG=tag
     69 export ANDROID_LOG_TAGS='*:s' # was: jdwp:i dalvikvm:i dalvikvmi:i'
     70 export ANDROID_DATA=$datadir
     71 export ANDROID_ROOT=$base/system
     72 export LD_LIBRARY_PATH=$base/system/lib
     73 export DYLD_LIBRARY_PATH=$base/system/lib
     74 debug_opts="-Xcheck:jni"
     75 exe=$base/system/bin/dalvikvm
     76 bpath=$framework/core.jar
     77 BASEDIR=$progdir/../cts/dxconverter
     78 
     79 echo "--------------------------------------------------"
     80 echo "DX Converter Test Suite"
     81 echo "Version 1.0"
     82 echo "Copyright (c) 2008 The Android Open Source Project"
     83 echo ""
     84 
     85 if [ "$selection" = "--help" ]; then
     86     echo "Usage: dx-tests [--help|--portable] [<mnemonic>]"
     87     echo ""
     88     echo "    --help      prints this help message"
     89     echo "    --portable  uses the portable interpreter;"
     90     echo "                default is the fast one"
     91     echo ""
     92     echo "    <mnemonic>  specifies the instruction to test;"
     93     echo "                default is to run all tests"
     94     echo ""
     95     exit 1;
     96 fi
     97 
     98 # we need for launching: the dx tool, the dalvikvm executable, and the directory with all .class files
     99 # - prep dxcore.jar
    100 # - init reportfile
    101 # for each package as stated in data/scriptdata (like dxc/junit/opcode/aaload) do
    102 #   - clear tmpoutput
    103 #   - try to dx Test_opcode.class and all .class files in the ./jm directory into a classes.jar file
    104 #   - launch dalvikvm, let it write output &> to tmpoutput (surrounded by magic key for start/stop)
    105 #   - look at tmpoutput -> green or red test result
    106 #   - append the result to the report.html file (table form)
    107 #   - clear the tmpoutput, the classes.jar etc.
    108 # end for
    109 # - close the report file and cat its path to stdout
    110 
    111 # sanity checks:
    112 # dx around?
    113 curmode=""
    114 dx --version &> /dev/null
    115 if [ ! $? -eq 0 ]
    116 then
    117     echo "error:could not start dx tool"
    118     exit 1;
    119 fi
    120  
    121 if [ "$TARGET_SIMULATOR" = "true" ]; then
    122     echo "Simulator mode, $interpreter interpreter";
    123     curmode="simulator"
    124     if [ -f $exe ]; then
    125         version=`${exe} -version 2> /dev/null | grep -o "version.*$"`
    126         echo "Using Dalvik VM ${version}"
    127     else
    128         echo "No Dalvik VM found at $exe";
    129         exit 1;
    130     fi
    131 else
    132     echo "Emulator mode, $interpreter interpreter";
    133     curmode="emulator"
    134     version=`adb shell dalvikvm -version 2> /dev/null | grep -o "version.*$"`
    135     if [ "${version}" != "" ]; then
    136         echo "Using Dalvik VM ${version}"
    137     else
    138         echo "No emulator or device found";
    139         exit 1;
    140     fi
    141 fi
    142 
    143 echo ""
    144 
    145 latestpath=""
    146 curdate=`date`
    147 dxtmpdir=$BASEDIR/dxtmp
    148 dxruntmpdir=$BASEDIR/dxruntmp
    149 javac_out=$BASEDIR/classout
    150 report=$BASEDIR/report.html
    151 mkdir -p $dxtmpdir
    152 rm -f $report
    153 pre_report="<html><head><style>
    154 table tr.ok { background:#a0ffa0; }
    155 table tr.nok { background:#ffa0a0; }
    156 table tr.wok { background:#ffffa0; }
    157 table tr.lok { background:#aaaaff; }
    158 </style></head>
    159 <body>
    160 <h1>DX test suite results</h1>
    161 Generated $curdate (using the $curmode)
    162 <p>
    163 <table width='100%'>
    164 <tr><td>Status</td><td>Target</td><td>Category</td><td>Details</td></tr>"
    165 post_report="</body></html>"
    166 echo $pre_report > $report
    167 
    168 # ----------- generating dxcore.jar
    169 cd $javac_out
    170 # consists of dxc.junit.DxAbstractMain and dxc.junit.DxUtil
    171 dx --dex --positions=lines --output="$BASEDIR/dxcore.jar" dxc/junit/DxAbstractMain.class dxc/junit/DxUtil.class
    172 
    173 # ----------- generating jars for each opcode test ------------
    174 
    175 export jpassedcnt=0
    176 export jwarningcnt=0
    177 export jvfefailedcnt=0
    178 export jfailedcnt=0
    179 export jallcnt=0
    180 export jcolumns=0
    181 
    182 function classnameToPath()
    183 {
    184     echo $1 | sed -e 's#\.#/#g;s#$#.class#'
    185 }
    186 
    187 function lecho()
    188 {
    189     if [ ! -z $CTS_DX_DEBUG ]; then echo $@; fi
    190 }
    191 
    192 while read -u 3 myline;
    193 do
    194     mainclass=`echo $myline | cut -d";" -f1` # e.g dxc.junit.verify.t482_9.Main_testVFE2
    195     classfiles=`classnameToPath $mainclass`
    196     
    197     testclasses=`echo $myline | cut -d";" -f2` # e.g dxc.junit.verity.t482_9.jm.T_t482_9_1
    198     
    199     for testclass in $testclasses; do
    200         classfiles="$classfiles "`classnameToPath $testclass`;
    201     done
    202     
    203     jtitle=`echo $myline | cut -d";" -f3`
    204     jcomment=`echo $myline | cut -d";" -f4`
    205     details=`echo $myline | cut -d";" -f5`
    206     
    207     if [ "$selection" == "" ] || [ "$jtitle" == "$selection" ]; then
    208     
    209         (( jallcnt += 1 ))   
    210     
    211     
    212         rm -rf --preserve-root $dxtmpdir/*
    213         mkdir -p $dxtmpdir
    214         cd $dxtmpdir            
    215         
    216         for testclass in $classfiles; do
    217             lecho -n "dexing $testclass : "
    218             mkdir -p `dirname ${dxtmpdir}/${testclass}`
    219             cp ${javac_out}/${testclass} ${dxtmpdir}/${testclass}
    220             
    221             dx --dex --positions=lines $testclass &>/dev/null
    222             
    223             if [ $? -eq 0 ]; then
    224                 lecho " dexable";
    225             else
    226                 lecho " not dexable->remove";
    227                 rm $testclass
    228             fi
    229         done
    230         
    231         dx --dex --positions=lines --output="$BASEDIR/dxclasses.jar" .
    232             
    233         # run the previously prepared jar files in the dalvik vm.
    234         # the dalvik vm executable (dalvikvm) must be on the PATH.
    235         # 
    236         ### echo -n ">>> launch dalvikvm for class: $mainclass"
    237         cd $BASEDIR
    238         rm -f $BASEDIR/dalvikout
    239         # write dalvik output to file
    240         echo -n "mk_b:" > $BASEDIR/dalvikout
    241             #echo ">>> launch dex package -classpath $BASEDIR/dxcore.jar:$BASEDIR/dxclasses.jar $mainclass"
    242     
    243         if [ "$TARGET_SIMULATOR" = "true" ]; then
    244             ### echo " on simulator";
    245             $valgrind $exe -Xint:$interpreter -Xmx512M -Xss32K -Xbootclasspath:$bpath -DacceptCNF=true -classpath $BASEDIR/dxcore.jar:$BASEDIR/dxclasses.jar $debug_opts $mainclass "$@" >> $BASEDIR/dalvikout 2>&1
    246             RESULTCODE=$?
    247             if [ ${RESULTCODE} -ne 0 ]; then
    248                 echo "execute dalvikvm failed with resultcode: ${RESULTCODE}" >> $BASEDIR/dalvikout 2>&1
    249             fi
    250         else
    251             # adb shell dalvikvm -Xint:$interpreter -Djava.io.tmpdir=/data/local/tmp -classpath /data/dxcore.jar:/data/dxclasses.jar dxc.junit.opcodes.aload.Main_testN2
    252             # either no output (ok) or
    253             # java.lang.RuntimeException: test did not cause the expected verify error, but:java.lang.RuntimeException, msg:AssertionFailedError msg:expected a verification exception
    254             #    at dxc.junit.DxUtil.checkVerifyException(DxUtil.java:65)
    255             #    at dxc.junit.opcodes.aload.Test_aload.testVFE10(Test_aload.java:181)
    256             #    at dxc.junit.opcodes.aload.Main_testVFE10.main(Main_testVFE10.java:5)
    257             #    at dalvik.system.NativeStart.main(Native Method)
    258         
    259             ### echo " on emulator/device with adb push"
    260             adb push $BASEDIR/dxcore.jar /data/dxcore.jar &> /dev/null
    261             adb push $BASEDIR/dxclasses.jar /data/dxclasses.jar &> /dev/null
    262             adb shell "dalvikvm -Djava.io.tmpdir=/data/local/tmp -classpath /data/dxcore.jar:/data/dxclasses.jar $mainclass && echo -n dvmpassed:" >> $BASEDIR/dalvikout 2>&1
    263         fi
    264         
    265         echo -n "mk_s:" >> $BASEDIR/dalvikout
    266         # verify tmpout only contains mkdxc_start;mkdxc_stop -> no system.out/err because of exception.
    267             # if ok -> green report line else red report with info between mkdxc_start and stop
    268         ### echo "vmresult: $vmresult"
    269         vmresult=`cat $BASEDIR/dalvikout`
    270         if [[ ("$vmresult" == "mk_b:mk_s:") || ("$vmresult" == "mk_b:dvmpassed:mk_s:") ]]; then
    271             (( jpassedcnt += 1 )) 
    272             echo "<tr class=\"ok\"><td>Success</td><td>$jtitle</td><td>$jcomment</td><td>$details</td></tr>" >> $report
    273             ### echo " -> PASSED (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)"
    274             echo -n "."
    275         elif [[ ("$vmresult" == "mk_b:dvmvfe:mk_s:") || ("$vmresult" == "mk_b:dvmvfe:dvmpassed:mk_s:") ]]; then
    276             (( jwarningcnt += 1 )) 
    277             echo "<tr class=\"wok\"><td>Warning</td><td>$jtitle</td><td>$jcomment</td><td>Special behavior regarding VerifyError</td></tr>" >> $report
    278             ### echo " -> WARNING (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)"
    279             echo -n "W"
    280         else
    281            vmres=`cat $BASEDIR/dalvikout | sed -e 's/mk_b://;s/mk_s://'`
    282            vmres="$details<br><pre>$vmres</pre>"    
    283             # red with additional info if a VFE failed, red if either a N,B, or E failed
    284             jtype=`echo "$mainclass" | sed -e 's/.*_test\([^0-9]*\)[0-9].*/\1/' `
    285             if [ "$jtype" == "VFE" ]; then
    286                 (( jvfefailedcnt += 1 ))
    287                 echo -n "<tr class=\"nok\"><td>Verifier failure</td><td>$jtitle</td><td>$jcomment</td><td>$vmres</td></tr>" >> $report
    288                 ### echo " -> VFE FAILED (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)"
    289                 echo -n "V"
    290             else
    291                 (( jfailedcnt += 1 )) 
    292                 echo -n "<tr class=\"nok\"><td>Functional failure</td><td>$jtitle</td><td>$jcomment</td><td>$vmres</td></tr>" >> $report
    293                 ### echo " -> FAILED (passed:$jpassedcnt, failed:$jfailedcnt, vfe failed:$jvfefailedcnt, warnings:$jwarningcnt)"
    294                 echo -n "F"
    295             fi
    296         fi
    297         
    298         (( jcolumns += 1 ))
    299         if [ ${jcolumns} -eq 40 ]; then
    300             echo ""
    301             (( jcolumns = 0 ))
    302         fi
    303         
    304     fi
    305       
    306 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).
    307 
    308 echo "</table>" >> $report
    309 let jallcalccnt=$jpassedcnt+$jfailedcnt+$jvfefailedcnt+$jwarningcnt
    310 if [ $jallcalccnt -ne $jallcnt ]; then
    311     echo "<br>error: green & red != total , $jallcalccnt -ne $jallcnt" >> $report
    312     exit 1;
    313 fi
    314 
    315 echo "<br>Tests run: ${jallcnt}" >> $report
    316 echo "<br>Functional failures: ${jfailedcnt}" >> $report
    317 echo "<br>Verifier failures: ${jvfefailedcnt}" >> $report
    318 echo "<br>Warnings: ${jwarningcnt}" >> $report
    319 
    320 echo $post_report >> $report
    321 
    322 if [[ jcolumns -ne 0 ]]; then
    323     echo ""
    324 fi
    325 
    326 echo ""
    327 
    328 if [[ jallcnt -eq jpassedcnt ]]; then
    329     echo "OK (${jpassedcnt} tests)"
    330 else
    331     echo "FAILURES!!!"
    332     echo ""
    333     echo "Tests run          : ${jallcnt}"
    334     echo "Functional failures: ${jfailedcnt}"
    335     echo "Verifier failures  : ${jvfefailedcnt}"
    336     echo "Warnings           : ${jwarningcnt}"
    337 fi
    338 
    339 echo ""
    340 echo "Please see complete report in ${report}"
    341 echo "--------------------------------------------------"
    342