1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#!/bin/bash
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# Copyright (C) 2007 The Android Open Source Project
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# Licensed under the Apache License, Version 2.0 (the "License");
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# you may not use this file except in compliance with the License.
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# Set up prog to be the path of this script, including following symlinks,
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# and set up progdir to be the fully-qualified pathname of its directory.
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectprog="$0"
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectwhile [ -h "${prog}" ]; do
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    newProg=`/bin/ls -ld "${prog}"`
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if expr "x${newProg}" : 'x/' >/dev/null; then
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        prog="${newProg}"
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    else
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        progdir=`dirname "${prog}"`
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        prog="${progdir}/${newProg}"
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fi
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdone
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectoldwd=`pwd`
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectprogdir=`dirname "${prog}"`
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcd "${progdir}"
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectprogdir=`pwd`
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectprog="${progdir}"/`basename "${prog}"`
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectexport JAVAC="${progdir}/../../../prebuilt/common/openjdk/bin/javac"
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectif [ "!" -e "$JAVAC" ]; then
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    JAVAC="javac"
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfi
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectinfo="info.txt"
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectrun="run"
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectexpected="expected.txt"
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectoutput="out.txt"
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectdev_mode="no"
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectupdate_mode="no"
489feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsontmpdir=/tmp/test-$$
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectusage="no"
509feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson
519feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsonwhile [[ "x$1" = "x-"* ]]; do
529feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson    case $1 in
539feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson         --dev) dev_mode="yes" ;;
549feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson         --output_dir)
559feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson             tmpdir=$2
569feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson             shift ;;
579feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson         --update) update_mode="yes" ;;
589feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson         --help) usage="yes" ;;
599feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson         *) usage="yes" ;;
609feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson     esac
619feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson     shift
629feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsondone
639feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson
649feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsonif [ "x$1" = "x" ]; then
659feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson    testdir=`basename "$oldwd"`
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectelse
679feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson    testdir="$1"
689feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsonfi
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
709feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsonif [ '!' -d "$testdir" ]; then
719feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson    td2=`echo ${testdir}-*`
729feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson    if [ '!' -d "$td2" ]; then
739feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson        echo "${testdir}: no such test directory" 1>&2
749feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson        usage="yes"
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fi
769feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson    testdir="$td2"
779feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsonfi
789feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson
799feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsonif [ "$update_mode" = "yes" -a "$dev_mode" = "yes" ] ; then
809feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson    echo Error: --dev is incompatible with --update. 1>&2
819feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson    usage="yes"
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfi
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectif [ "$usage" = "yes" ]; then
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    prog=`basename $prog`
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    (
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        echo "usage:"
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        echo "  $prog --help             Print this message."
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        echo "  $prog testname           Run test normally."
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        echo "  $prog --dev testname     Development mode (dump to stdout)."
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        echo "  $prog --update testname  Update mode (replace expected.txt)."
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        echo "  Omitting the test name uses the current directory as the test."
939feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson        echo "options:"
949feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson        echo "        --output_dir <dir> Use <dir> for the test outputs."
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ) 1>&2
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    exit 1
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfi
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
99b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsontd_info="${testdir}/${info}"
100b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsontd_run="${testdir}/${run}"
101b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsontd_expected="${testdir}/${expected}"
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsonfor td_file in "$td_info" "$td_run" "$td_expected"; do
104b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    if [[ ! -r "$td_file" ]]; then
105b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        echo "${testdir}: missing file $td_file" 1>&2
106b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson        exit 1
107b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodson    fi
108b7d748318354aba23ba03f76bdefc31fa6adc885Orion Hodsondone
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# copy the test to a temp dir and run it
1119feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsonif [ -d "$tmpdir" ]; then
1129feebf2627346eee3a9c6a117d7f279784a51720Orion Hodson    rm -rf "$tmpdir" || exit 1
1139feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsonfi
1149feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsonoutput_parent=`dirname ${tmpdir}`
1159feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsonmkdir -p "${output_parent}" || exit 1
1169feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsoncp -Rp "$testdir" "$tmpdir" || exit 1
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectcd "$tmpdir"
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectchmod 755 "$run"
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1209feebf2627346eee3a9c6a117d7f279784a51720Orion Hodsonecho "${testdir}: running..." 1>&2
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectgood="no"
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectif [ "$dev_mode" = "yes" ]; then
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    "./$run" 2>&1
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    echo "exit status: $?" 1>&2
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    good="yes"
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectelif [ "$update_mode" = "yes" ]; then
127d5370b6315ee137744746479003c9d07185f34f0Orion Hodson    "./$run" >"$output" 2>&1
128d5370b6315ee137744746479003c9d07185f34f0Orion Hodson    if [[ $? == 0 ]]; then
129d5370b6315ee137744746479003c9d07185f34f0Orion Hodson        good="yes"
130d5370b6315ee137744746479003c9d07185f34f0Orion Hodson        mv "$output" "${progdir}/${td_expected}"
131d5370b6315ee137744746479003c9d07185f34f0Orion Hodson    else
132d5370b6315ee137744746479003c9d07185f34f0Orion Hodson        echo "Test failed during update."
133d5370b6315ee137744746479003c9d07185f34f0Orion Hodson        good="no"
134d5370b6315ee137744746479003c9d07185f34f0Orion Hodson    fi
135d5370b6315ee137744746479003c9d07185f34f0Orion Hodson
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectelse
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    "./$run" >"$output" 2>&1
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cmp -s "$expected" "$output"
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if [ "$?" = "0" ]; then
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        # output == expected
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        good="yes"
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        echo "$testdir"': succeeded!' 1>&2
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    fi
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfi
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectif [ "$good" = "yes" ]; then
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cd "$oldwd"
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    rm -rf "$tmpdir"
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    exit 0
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectfi
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project(
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    echo "${testdir}: FAILED!"
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    echo ' '
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    echo '#################### info'
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    cat "$info" | sed 's/^/# /g'
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    echo '#################### diffs'
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    diff -u "$expected" "$output"
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    echo '####################'
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    echo ' '
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    echo "files left in $tmpdir"
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project) 1>&2
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectexit 1
165