xref: /aosp_15_r20/dalvik/dx/tests/run-test (revision 055d459012065f78d96b68be8421640240ddf631)
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