Home | History | Annotate | Download | only in test
      1 #!/bin/bash
      2 #
      3 # Copyright (C) 2007 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 prog="$0"
     20 while [ -h "${prog}" ]; do
     21     newProg=`/bin/ls -ld "${prog}"`
     22     newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
     23     if expr "x${newProg}" : 'x/' >/dev/null; then
     24         prog="${newProg}"
     25     else
     26         progdir=`dirname "${prog}"`
     27         prog="${progdir}/${newProg}"
     28     fi
     29 done
     30 oldwd=`pwd`
     31 progdir=`dirname "${prog}"`
     32 cd "${progdir}"
     33 progdir=`pwd`
     34 prog="${progdir}"/`basename "${prog}"`
     35 test_dir="test-$$"
     36 tmp_dir="/tmp/${test_dir}"
     37 
     38 export JAVA="java"
     39 export JAVAC="javac -g -source 1.5 -target 1.5"
     40 export RUN="${progdir}/etc/push-and-run-test-jar"
     41 export DEX_LOCATION=/data/run-test/${test_dir}
     42 export NEED_DEX="true"
     43 
     44 # If dx was not set by the environment variable, assume it is in the path.
     45 if [ -z "$DX" ]; then
     46   export DX="dx"
     47 fi
     48 
     49 # If jasmin was not set by the environment variable, assume it is in the path.
     50 if [ -z "$JASMIN" ]; then
     51   export JASMIN="jasmin"
     52 fi
     53 
     54 
     55 info="info.txt"
     56 build="build"
     57 run="run"
     58 expected="expected.txt"
     59 output="output.txt"
     60 build_output="build-output.txt"
     61 run_args="--quiet"
     62 
     63 target_mode="yes"
     64 dev_mode="no"
     65 update_mode="no"
     66 debug_mode="no"
     67 usage="no"
     68 build_only="no"
     69 
     70 while true; do
     71     if [ "x$1" = "x--host" ]; then
     72         target_mode="no"
     73         RUN="${progdir}/etc/host-run-test-jar"
     74         DEX_LOCATION=$tmp_dir
     75         shift
     76     elif [ "x$1" = "x--jvm" ]; then
     77         target_mode="no"
     78         RUN="${progdir}/etc/reference-run-test-classes"
     79         NEED_DEX="false"
     80         shift
     81     elif [ "x$1" = "x-O" ]; then
     82         run_args="${run_args} -O"
     83         shift
     84     elif [ "x$1" = "x--debug" ]; then
     85         run_args="${run_args} --debug"
     86         shift
     87     elif [ "x$1" = "x--gdb" ]; then
     88         run_args="${run_args} --gdb"
     89         dev_mode="yes"
     90         shift
     91     elif [ "x$1" = "x--zygote" ]; then
     92         run_args="${run_args} --zygote"
     93         shift
     94     elif [ "x$1" = "x--interpreter" ]; then
     95         run_args="${run_args} --interpreter"
     96         shift
     97     elif [ "x$1" = "x--no-verify" ]; then
     98         run_args="${run_args} --no-verify"
     99         shift
    100     elif [ "x$1" = "x--no-optimize" ]; then
    101         run_args="${run_args} --no-optimize"
    102         shift
    103     elif [ "x$1" = "x--no-precise" ]; then
    104         run_args="${run_args} --no-precise"
    105         shift
    106     elif [ "x$1" = "x--invoke-with" ]; then
    107         shift
    108         what="$1"
    109         run_args="${run_args} --invoke-with ${what}"
    110         shift
    111     elif [ "x$1" = "x--dev" ]; then
    112         run_args="${run_args} --dev"
    113         dev_mode="yes"
    114         shift
    115     elif [ "x$1" = "x--build-only" ]; then
    116         build_only="yes"
    117         shift
    118     elif [ "x$1" = "x--output-path" ]; then
    119         shift
    120         tmp_dir=$1
    121         shift
    122     elif [ "x$1" = "x--update" ]; then
    123         update_mode="yes"
    124         shift
    125     elif [ "x$1" = "x--help" ]; then
    126         usage="yes"
    127         shift
    128     elif expr "x$1" : "x--" >/dev/null 2>&1; then
    129         echo "unknown $0 option: $1" 1>&2
    130         usage="yes"
    131         break
    132     else
    133         break
    134     fi
    135 done
    136 
    137 if [ "$dev_mode" = "yes" -a "$update_mode" = "yes" ]; then
    138     echo "--dev and --update are mutually exclusive" 1>&2
    139     usage="yes"
    140 fi
    141 
    142 if [ "$usage" = "no" ]; then
    143     if [ "x$1" = "x" -o "x$1" = "x-" ]; then
    144         test_dir=`basename "$oldwd"`
    145     else
    146         test_dir="$1"
    147     fi
    148 
    149     if [ '!' -d "$test_dir" ]; then
    150         td2=`echo ${test_dir}-*`
    151         if [ '!' -d "$td2" ]; then
    152             echo "${test_dir}: no such test directory" 1>&2
    153             usage="yes"
    154         fi
    155         test_dir="$td2"
    156     fi
    157     # Shift to get rid of the test name argument. The rest of the arguments
    158     # will get passed to the test run.
    159     shift
    160 fi
    161 
    162 if [ "$usage" = "yes" ]; then
    163     prog=`basename $prog`
    164     (
    165         echo "usage:"
    166         echo "  $prog --help                          Print this message."
    167         echo "  $prog [options] [test-name]           Run test normally."
    168         echo "  $prog --dev [options] [test-name]     Development mode" \
    169              "(dumps to stdout)."
    170         echo "  $prog --update [options] [test-name]  Update mode" \
    171              "(replaces expected.txt)."
    172         echo '  Omitting the test name or specifying "-" will use the' \
    173              "current directory."
    174         echo "  Runtime Options:"
    175         echo "    -O             Run non-debug rather than debug build (off by default)."
    176         echo "    --debug        Wait for a debugger to attach."
    177         echo "    --gdb          Run under gdb; incompatible with some tests."
    178         echo "    --build-only   Build test files only (off by default)."
    179         echo "    --interpreter  Enable interpreter only mode (off by default)."
    180         echo "    --no-verify    Turn off verification (on by default)."
    181         echo "    --no-optimize  Turn off optimization (on by default)."
    182         echo "    --no-precise   Turn off precise GC (on by default)."
    183         echo "    --zygote       Spawn the process from the Zygote." \
    184              "If used, then the"
    185         echo "                   other runtime options are ignored."
    186         echo "    --host         Use the host-mode virtual machine."
    187         echo "    --invoke-with  Pass --invoke-with option to runtime."
    188         echo "    --jvm          Use a host-local RI virtual machine."
    189         echo "    --output-path [path] Location where to store the build" \
    190              "files."
    191     ) 1>&2
    192     exit 1
    193 fi
    194 
    195 cd "$test_dir"
    196 test_dir=`pwd`
    197 
    198 td_info="${test_dir}/${info}"
    199 td_expected="${test_dir}/${expected}"
    200 
    201 if [ ! -r $td_info ]; then
    202     echo "${test_dir}: missing file $td_info" 1>&2
    203     exit 1
    204 fi
    205 
    206 if [ ! -r $td_expected ]; then
    207     echo "${test_dir}: missing file $td_expected" 1>&2
    208     exit 1
    209 fi
    210 
    211 # copy the test to a temp dir and run it
    212 
    213 echo "${test_dir}: building..." 1>&2
    214 
    215 rm -rf "$tmp_dir"
    216 cp -Rp "$test_dir" "$tmp_dir"
    217 cd "$tmp_dir"
    218 
    219 if [ '!' -r "$build" ]; then
    220     cp "${progdir}/etc/default-build" build
    221 fi
    222 
    223 if [ '!' -r "$run" ]; then
    224     cp "${progdir}/etc/default-run" run
    225 fi
    226 
    227 chmod 755 "$build"
    228 chmod 755 "$run"
    229 
    230 export TEST_NAME=`basename ${test_dir}`
    231 
    232 good="no"
    233 if [ "$dev_mode" = "yes" ]; then
    234     "./${build}" 2>&1
    235     build_exit="$?"
    236     echo "build exit status: $build_exit" 1>&2
    237     if [ "$build_exit" = '0' ]; then
    238         echo "${test_dir}: running..." 1>&2
    239         "./${run}" $run_args "$@" 2>&1
    240 	run_exit="$?"
    241         echo "run exit status: $run_exit" 1>&2
    242         if [ "$run_exit" = "0" ]; then
    243             good="yes"
    244         fi
    245     fi
    246 elif [ "$update_mode" = "yes" ]; then
    247     "./${build}" >"$build_output" 2>&1
    248     build_exit="$?"
    249     if [ "$build_exit" = '0' ]; then
    250         echo "${test_dir}: running..." 1>&2
    251         "./${run}" $run_args "$@" >"$output" 2>&1
    252         sed -e 's/[[:cntrl:]]$//g' < "$output" >"${td_expected}"
    253         good="yes"
    254     else
    255         cat "$build_output" 1>&2
    256         echo "build exit status: $build_exit" 1>&2
    257     fi
    258 elif [ "$build_only" = "yes" ]; then
    259     good="yes"
    260     "./${build}" >"$build_output" 2>&1
    261     build_exit="$?"
    262     if [ "$build_exit" '!=' '0' ]; then
    263         cp "$build_output" "$output"
    264         echo "build exit status: $build_exit" >>"$output"
    265         diff --strip-trailing-cr -q "$expected" "$output" >/dev/null
    266         if [ "$?" '!=' "0" ]; then
    267             good="no"
    268             echo "BUILD FAILED For ${TEST_NAME}"
    269         fi
    270     fi
    271     # Clean up extraneous files that are not used by tests.
    272     find $tmp_dir -mindepth 1  ! -regex ".*/\(.*jar\|$build_output\|$expected\)" | xargs rm -rf
    273     exit 0
    274 else
    275     "./${build}" >"$build_output" 2>&1
    276     build_exit="$?"
    277     if [ "$build_exit" = '0' ]; then
    278         echo "${test_dir}: running..." 1>&2
    279         "./${run}" $run_args "$@" >"$output" 2>&1
    280     else
    281         cp "$build_output" "$output"
    282         echo "build exit status: $build_exit" >>"$output"
    283     fi
    284     diff --strip-trailing-cr -q "$expected" "$output" >/dev/null
    285     if [ "$?" = "0" ]; then
    286         # output == expected
    287         good="yes"
    288         echo "${test_dir}: succeeded!" 1>&2
    289     fi
    290 fi
    291 
    292 # Clean up test files.
    293 if [ "$good" == "yes" ]; then
    294     cd "$oldwd"
    295     rm -rf "$tmp_dir"
    296     if [ "$target_mode" = "yes" -a "$build_exit" = "0" ]; then
    297         adb shell rm -r $DEX_LOCATION
    298     fi
    299     exit 0
    300 fi
    301 
    302 
    303 (
    304     if [ "$update_mode" != "yes" ]; then
    305         echo "${test_dir}: FAILED!"
    306         echo ' '
    307         echo '#################### info'
    308         cat "${td_info}" | sed 's/^/# /g'
    309         echo '#################### diffs'
    310         diff --strip-trailing-cr -u "$expected" "$output"
    311         echo '####################'
    312         echo ' '
    313     fi
    314     echo "${TEST_NAME} files left in ${tmp_dir} on host"
    315     if [ "$target_mode" == "yes" ]; then
    316         echo "and in ${DEX_LOCATION} on target"
    317     fi
    318 
    319 ) 1>&2
    320 
    321 exit 1
    322