1*055d4590SKeyi Gui#!/bin/bash 2*055d4590SKeyi Gui# 3*055d4590SKeyi Gui# Copyright (C) 2007 The Android Open Source Project 4*055d4590SKeyi Gui# 5*055d4590SKeyi Gui# Licensed under the Apache License, Version 2.0 (the "License"); 6*055d4590SKeyi Gui# you may not use this file except in compliance with the License. 7*055d4590SKeyi Gui# You may obtain a copy of the License at 8*055d4590SKeyi Gui# 9*055d4590SKeyi Gui# http://www.apache.org/licenses/LICENSE-2.0 10*055d4590SKeyi Gui# 11*055d4590SKeyi Gui# Unless required by applicable law or agreed to in writing, software 12*055d4590SKeyi Gui# distributed under the License is distributed on an "AS IS" BASIS, 13*055d4590SKeyi Gui# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*055d4590SKeyi Gui# See the License for the specific language governing permissions and 15*055d4590SKeyi Gui# limitations under the License. 16*055d4590SKeyi Gui 17*055d4590SKeyi Gui# Set up prog to be the path of this script, including following symlinks, 18*055d4590SKeyi Gui# and set up progdir to be the fully-qualified pathname of its directory. 19*055d4590SKeyi Guiprog="$0" 20*055d4590SKeyi Guiwhile [ -h "${prog}" ]; do 21*055d4590SKeyi Gui newProg=`/bin/ls -ld "${prog}"` 22*055d4590SKeyi Gui newProg=`expr "${newProg}" : ".* -> \(.*\)$"` 23*055d4590SKeyi Gui if expr "x${newProg}" : 'x/' >/dev/null; then 24*055d4590SKeyi Gui prog="${newProg}" 25*055d4590SKeyi Gui else 26*055d4590SKeyi Gui progdir=`dirname "${prog}"` 27*055d4590SKeyi Gui prog="${progdir}/${newProg}" 28*055d4590SKeyi Gui fi 29*055d4590SKeyi Guidone 30*055d4590SKeyi Guioldwd=`pwd` 31*055d4590SKeyi Guiprogdir=`dirname "${prog}"` 32*055d4590SKeyi Guicd "${progdir}" 33*055d4590SKeyi Guiprogdir=`pwd` 34*055d4590SKeyi Guiprog="${progdir}"/`basename "${prog}"` 35*055d4590SKeyi Gui 36*055d4590SKeyi Guiif [[ -z "${JAVA_HOME}" ]]; then 37*055d4590SKeyi Gui unix=$(uname | tr '[A-Z]' '[a-z]') 38*055d4590SKeyi Gui JAVA_HOME="${progdir}/../../../prebuilts/jdk/jdk11/${unix}-x86" 39*055d4590SKeyi Guifi 40*055d4590SKeyi Gui 41*055d4590SKeyi Guiif [[ ! -d "${JAVA_HOME}" ]]; then 42*055d4590SKeyi Gui echo "Missing JAVA_HOME directory: $JAVA_HOME" 1>&2 43*055d4590SKeyi Gui exit 1 44*055d4590SKeyi Guifi 45*055d4590SKeyi Gui 46*055d4590SKeyi Guiexport JAVAC="${JAVA_HOME}/bin/javac" 47*055d4590SKeyi Guiif [ "!" -e "$JAVAC" ]; then 48*055d4590SKeyi Gui echo "Missing JAVAC executable: ${JAVAC}" 1>&2 49*055d4590SKeyi Gui exit 1 50*055d4590SKeyi Guifi 51*055d4590SKeyi Gui 52*055d4590SKeyi Guiexport JAVA="${JAVA_HOME}/bin/java" 53*055d4590SKeyi Guiif [ "!" -e "$JAVA" ]; then 54*055d4590SKeyi Gui echo "Missing JAVA executable: ${JAVA}" 1>&2 55*055d4590SKeyi Gui exit 1 56*055d4590SKeyi Guifi 57*055d4590SKeyi Gui 58*055d4590SKeyi Guiinfo="info.txt" 59*055d4590SKeyi Guirun="run" 60*055d4590SKeyi Guiexpected="expected.txt" 61*055d4590SKeyi Guioutput="out.txt" 62*055d4590SKeyi Gui 63*055d4590SKeyi Guiclean_on_exit="yes" 64*055d4590SKeyi Guidev_mode="no" 65*055d4590SKeyi Guiupdate_mode="no" 66*055d4590SKeyi Guitmpdir=/tmp/test-$$ 67*055d4590SKeyi Guiusage="no" 68*055d4590SKeyi Gui 69*055d4590SKeyi Guiwhile [[ "x$1" = "x-"* ]]; do 70*055d4590SKeyi Gui case $1 in 71*055d4590SKeyi Gui --dev) dev_mode="yes" ;; 72*055d4590SKeyi Gui --no-clean) clean_on_exit="no" ;; 73*055d4590SKeyi Gui --output_dir) 74*055d4590SKeyi Gui tmpdir=$2 75*055d4590SKeyi Gui shift ;; 76*055d4590SKeyi Gui --update) update_mode="yes" ;; 77*055d4590SKeyi Gui --help) usage="yes" ;; 78*055d4590SKeyi Gui *) usage="yes" ;; 79*055d4590SKeyi Gui esac 80*055d4590SKeyi Gui shift 81*055d4590SKeyi Guidone 82*055d4590SKeyi Gui 83*055d4590SKeyi Guiif [ "x$1" = "x" ]; then 84*055d4590SKeyi Gui testdir=`basename "$oldwd"` 85*055d4590SKeyi Guielse 86*055d4590SKeyi Gui testdir="$1" 87*055d4590SKeyi Guifi 88*055d4590SKeyi Gui 89*055d4590SKeyi Guiif [ '!' -d "$testdir" ]; then 90*055d4590SKeyi Gui td2=`echo ${testdir}-*` 91*055d4590SKeyi Gui if [ '!' -d "$td2" ]; then 92*055d4590SKeyi Gui echo "${testdir}: no such test directory" 1>&2 93*055d4590SKeyi Gui usage="yes" 94*055d4590SKeyi Gui fi 95*055d4590SKeyi Gui testdir="$td2" 96*055d4590SKeyi Guifi 97*055d4590SKeyi Gui 98*055d4590SKeyi Guiif [ "$update_mode" = "yes" -a "$dev_mode" = "yes" ] ; then 99*055d4590SKeyi Gui echo Error: --dev is incompatible with --update. 1>&2 100*055d4590SKeyi Gui usage="yes" 101*055d4590SKeyi Guifi 102*055d4590SKeyi Gui 103*055d4590SKeyi Guiif [ "$usage" = "yes" ]; then 104*055d4590SKeyi Gui prog=`basename $prog` 105*055d4590SKeyi Gui ( 106*055d4590SKeyi Gui echo "usage:" 107*055d4590SKeyi Gui echo " $prog --help Print this message." 108*055d4590SKeyi Gui echo " $prog testname Run test normally." 109*055d4590SKeyi Gui echo " $prog --dev testname Development mode (dump to stdout)." 110*055d4590SKeyi Gui echo " $prog --update testname Update mode (replace expected.txt)." 111*055d4590SKeyi Gui echo " Omitting the test name uses the current directory as the test." 112*055d4590SKeyi Gui echo "options:" 113*055d4590SKeyi Gui echo " --output_dir <dir> Use <dir> for the test outputs." 114*055d4590SKeyi Gui ) 1>&2 115*055d4590SKeyi Gui exit 1 116*055d4590SKeyi Guifi 117*055d4590SKeyi Gui 118*055d4590SKeyi Guitd_info="${testdir}/${info}" 119*055d4590SKeyi Guitd_run="${testdir}/${run}" 120*055d4590SKeyi Guitd_expected="${testdir}/${expected}" 121*055d4590SKeyi Gui 122*055d4590SKeyi Guifor td_file in "$td_info" "$td_run" "$td_expected"; do 123*055d4590SKeyi Gui if [[ ! -r "$td_file" ]]; then 124*055d4590SKeyi Gui echo "${testdir}: missing file $td_file" 1>&2 125*055d4590SKeyi Gui exit 1 126*055d4590SKeyi Gui fi 127*055d4590SKeyi Guidone 128*055d4590SKeyi Gui 129*055d4590SKeyi Gui# copy the test to a temp dir and run it 130*055d4590SKeyi Guiif [ -d "$tmpdir" ]; then 131*055d4590SKeyi Gui rm -rf "$tmpdir" || exit 1 132*055d4590SKeyi Guifi 133*055d4590SKeyi Guioutput_parent=`dirname ${tmpdir}` 134*055d4590SKeyi Guimkdir -p "${output_parent}" || exit 1 135*055d4590SKeyi Guicp -Rp "$testdir" "$tmpdir" || exit 1 136*055d4590SKeyi Guicd "$tmpdir" 137*055d4590SKeyi Guichmod 755 "$run" 138*055d4590SKeyi Gui 139*055d4590SKeyi Guiecho "${testdir}: running..." 1>&2 140*055d4590SKeyi Guigood="no" 141*055d4590SKeyi Guiif [ "$dev_mode" = "yes" ]; then 142*055d4590SKeyi Gui "./$run" 2>&1 143*055d4590SKeyi Gui echo "exit status: $?" 1>&2 144*055d4590SKeyi Gui good="yes" 145*055d4590SKeyi Guielif [ "$update_mode" = "yes" ]; then 146*055d4590SKeyi Gui "./$run" >"$output" 2>&1 147*055d4590SKeyi Gui if [[ $? == 0 ]]; then 148*055d4590SKeyi Gui good="yes" 149*055d4590SKeyi Gui mv "$output" "${progdir}/${td_expected}" 150*055d4590SKeyi Gui else 151*055d4590SKeyi Gui echo "Test failed during update." 152*055d4590SKeyi Gui good="no" 153*055d4590SKeyi Gui fi 154*055d4590SKeyi Gui 155*055d4590SKeyi Guielse 156*055d4590SKeyi Gui "./$run" >"$output" 2>&1 157*055d4590SKeyi Gui cmp -s "$expected" "$output" 158*055d4590SKeyi Gui if [ "$?" = "0" ]; then 159*055d4590SKeyi Gui # output == expected 160*055d4590SKeyi Gui good="yes" 161*055d4590SKeyi Gui echo "$testdir"': succeeded!' 1>&2 162*055d4590SKeyi Gui fi 163*055d4590SKeyi Guifi 164*055d4590SKeyi Gui 165*055d4590SKeyi Guiif [ "$good" = "yes" ]; then 166*055d4590SKeyi Gui cd "$oldwd" 167*055d4590SKeyi Gui if [ "$clean_on_exit" = "yes" ]; then 168*055d4590SKeyi Gui rm -rf "$tmpdir" 169*055d4590SKeyi Gui else 170*055d4590SKeyi Gui echo "Test artifacts left in $tmpdir" 171*055d4590SKeyi Gui fi 172*055d4590SKeyi Gui exit 0 173*055d4590SKeyi Guifi 174*055d4590SKeyi Gui 175*055d4590SKeyi Gui( 176*055d4590SKeyi Gui echo "${testdir}: FAILED!" 177*055d4590SKeyi Gui echo ' ' 178*055d4590SKeyi Gui echo '#################### info' 179*055d4590SKeyi Gui cat "$info" | sed 's/^/# /g' 180*055d4590SKeyi Gui echo '#################### diffs' 181*055d4590SKeyi Gui diff -u "$expected" "$output" 182*055d4590SKeyi Gui echo '####################' 183*055d4590SKeyi Gui echo ' ' 184*055d4590SKeyi Gui echo "files left in $tmpdir" 185*055d4590SKeyi Gui) 1>&2 186*055d4590SKeyi Gui 187*055d4590SKeyi Guiexit 1 188