1c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein#!/bin/bash
2c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein#
3c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# Copyright 2009 The Android Open Source Project
4c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein#
5c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# Licensed under the Apache License, Version 2.0 (the "License");
6c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# you may not use this file except in compliance with the License.
7c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# You may obtain a copy of the License at
8c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein#
9c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein#      http://www.apache.org/licenses/LICENSE-2.0
10c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein#
11c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# Unless required by applicable law or agreed to in writing, software
12c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# distributed under the License is distributed on an "AS IS" BASIS,
13c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# See the License for the specific language governing permissions and
15c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# limitations under the License.
16c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
17c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein#
18c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# Script to run all the tests, which only works for host builds. This
19c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# uses some heuristics to navigate the source tree and built output,
20c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# and it won't be too surprising if this breaks with some change in
21c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# the build system.
22c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein#
23c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
24c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinlibName="libffi-host"
25c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinexecFile="/tmp/run-test-$$"
26c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinoutFile="/tmp/out-test-$$.txt"
27c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
28c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
29c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# Set up prog to be the path of this script, including following symlinks,
30c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# and set up progdir to be the fully-qualified pathname of its directory.
31c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
32c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinprog="$0"
33c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinwhile [ -h "${prog}" ]; do
34c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    newProg=`/bin/ls -ld "${prog}"`
35c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    newProg=`expr "${newProg}" : ".* -> \(.*\)$"`
36c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    if expr "x${newProg}" : 'x/' >/dev/null; then
37c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein        prog="${newProg}"
38c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    else
39c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein        progdir=`dirname "${prog}"`
40c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein        prog="${progdir}/${newProg}"
41c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    fi
42c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteindone
43c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinorigDir=`pwd`
44c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinprogDir=`dirname "${prog}"`
45c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteincd "${progDir}"
46c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinprogDir=`pwd`
47c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinprog="${progDir}"/`basename "${prog}"`
48c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
49c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
50c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# Find the base directory of the source tree (which is expected to be
51c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# the first directory found up the tree that contains both an out and
52c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# a build directory).
53c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
54c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinwhile true; do
55c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    if [ -d out -a -d build ]; then
56c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein        break;
57c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    fi
58c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    cd ..
59c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    if [ "x`pwd`" = "x/" ]; then
60c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein        echo "could not find top of source tree" 1>&2
61c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein        exit 1
62c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    fi
63c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteindone
64c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
65c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinsourceDir=`pwd`
66c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
67c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
68c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# Find the library, collect the list of test files, and set other variables.
69c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
70c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinif get_build_var x >/dev/null 2>&1; then
71c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    : # Already have build system defs.
72c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinelse
73c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    # Pull in envsetup.sh.
74c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    . build/envsetup.sh
75c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinfi
76c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
77c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinCC=`get_build_var CC`
78c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinHOST_OS=`get_build_var HOST_OS`
79c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinHOST_ARCH=`get_build_var HOST_ARCH`
80c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
81c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# All this is to make the libFile be an absolute path.
82c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinlibFile=`find out/host/${HOST_OS}-${HOST_ARCH} -name "${libName}.a" | head -1`
83c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinlibDir=`dirname ${libFile}`
84c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinlibDir=`cd "$libDir"; pwd`
85c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteinlibFile="${libDir}/${libName}.a"
86c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
87c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinif [ "x$libFile" = "x" ]; then
88c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    echo "could not find ${libName}" 1>&2
89c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    exit 1
90c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinfi
91c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
92c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteincd "${progDir}"
93c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan BornsteintestFiles=`/bin/ls libffi.call/*.c`
94c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
95c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinecho "$libDir"
96c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinls "$libDir"
97c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
98c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein# Iterate over all the files, compiling and running each.
99c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
100c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinfor file in $testFiles; do
101c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    echo "${file}..."
102c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    rm -f "$execFile" "$outFile"
103c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    "$CC" -g -I"../${HOST_OS}-${HOST_ARCH}" -o "$execFile" "$file" "$libFile"
104c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    #    -L"$libDir" -l"$libName"
105c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    if [ "$?" != "0" ]; then
106c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein        echo "compilation failure" 1>&2
107c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    else
108c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein        "$execFile" > "$outFile"
109c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein        if [ "$?" = "0" ]; then
110c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein            echo "${file}: OK"
111c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein        else
112c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein            echo "${file}: FAIL"
113c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein            cat "$outFile"
114c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein        fi
115c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein    fi
116c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteindone
117c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornstein
118c2b1dd7a596d1accbc3fa0cfea5f96062ec44606Dan Bornsteinrm -f "$execFile" "$outFile"
119