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=$ANDROID_BUILD_TOP/out/target/common/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