#!/bin/sh
#
# Copyright (C) 2010 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This shell script is used to run one test on a device emulator.
#
PROGDIR=`dirname $0`
#
# Parse options
#
VERBOSE=no
VERBOSE2=no
ADB_CMD=adb
while [ -n "$1" ]; do
opt="$1"
optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
case "$opt" in
--help|-h|-\?)
OPTION_HELP=yes
;;
--verbose)
if [ "$VERBOSE" = "yes" ] ; then
VERBOSE2=yes
else
VERBOSE=yes
fi
;;
--adb=*)
ADB_CMD="$optarg"
;;
-*) # unknown options
echo "ERROR: Unknown option '$opt', use --help for list of valid ones."
exit 1
;;
*) # Simply record parameter
if [ -z "$PARAMETERS" ] ; then
PARAMETERS="$opt"
else
PARAMETERS="$PARAMETERS $opt"
fi
;;
esac
shift
done
if [ "$OPTION_HELP" = "yes" ] ; then
echo "Usage: $PROGNAME [options] <test-name>"
echo ""
echo "Run one C library test on a device/emulator through ADB."
echo ""
echo "Valid options:"
echo ""
echo " --help|-h|-? Print this help"
echo " --verbose Enable verbose mode"
echo " --adb=<file> Specify adb executable for device tests"
echo ""
exit 0
fi
if [ -z "$ANDROID_PRODUCT_OUT" ] ; then
echo "ERROR: ANDROID_PRODUCT_OUT not defined. Please run the 'lunch' command"
exit 1
fi
if [ ! -f "$ANDROID_PRODUCT_OUT/system.img" ] ; then
echo "ERROR: Missing file: $ANDROID_PRODUCT_OUT/system.img"
echo "Are you sure you built the proper system image?"
exit 1
fi
EXEC_ROOT_PATH="$ANDROID_PRODUCT_OUT/obj/EXECUTABLES"
if [ ! -d "$EXEC_ROOT_PATH" ] ; then
echo "ERROR: Missing directory: $EXEC_ROOT_PATH"
echo "Are you sure you built the proper system image?"
exit 1
fi
if [ -z "$PARAMETERS" ] ; then
echo "ERROR: Please specify test name."
echo "Must be one of the following:"
for FILE in `cd $EXEC_ROOT_PATH && ls -d test_*`; do
TEST=`echo "$FILE" | sed -e "s!test_\(.*\)_intermediates!\\1!g"`
echo " $TEST"
done
exit 1
fi
TEST="$PARAMETERS"
# Normalize test name, i.e. remove test_ prefix
TEST=`echo "$TEST" | sed -e "s!^test_!!g"`
TESTDIR="$EXEC_ROOT_PATH/test_${TEST}_intermediates"
if [ ! -d "$TESTDIR" ] ; then
echo "ERROR: No test by that name: test_$TEST!"
exit 1
fi
TESTNAME="test_$TEST"
TESTEXE="$TESTDIR/$TESTNAME"
if [ ! -f "$TESTEXE" ] ; then
echo "ERROR: Missing file: $TESTEXE"
echo "Are you sure your last test build was complete?"
exit 1
fi
# Run a command in ADB and return 0 in case of success, or 1 otherwise.
# This is needed because "adb shell" does not return the proper status
# of the launched command.
#
# NOTE: You must call set_adb_cmd_log before that to set the location
# of the temporary log file that will be used.
#
adb_cmd ()
{
local RET
if [ -z "$ADB_CMD_LOG" ] ; then
dump "INTERNAL ERROR: ADB_CMD_LOG not set!"
exit 1
fi
if [ $VERBOSE = "yes" ] ; then
echo "$ADB_CMD shell $@"
$ADB_CMD shell $@ "&&" echo OK "||" echo KO | tee $ADB_CMD_LOG
else
$ADB_CMD shell $@ "&&" echo OK "||" echo KO > $ADB_CMD_LOG
fi
# Get last line in log, should be OK or KO
RET=`tail -n1 $ADB_CMD_LOG`
# Get rid of \r at the end of lines
RET=`echo "$RET" | sed -e 's![[:cntrl:]]!!g'`
[ "$RET" = "OK" ]
}
set_adb_cmd_log ()
{
ADB_CMD_LOG="$1"
}
# Returns 0 if a variable containing one or more items separated
# by spaces contains a given value.
# $1: variable name (e.g. FOO)
# $2: value to test
var_list_contains ()
{
echo `var_value $1` | tr ' ' '\n' | fgrep -q -e "$2"
}
TMPDIR=/tmp/bionic-tests
mkdir -p $TMPDIR
set_adb_cmd_log $TMPDIR/adb.log.txt
DEVICE_TEST_DIR=/data/local/bionic-test
DEVICE_TEST=$DEVICE_TEST_DIR/$TESTNAME
adb_cmd mkdir $DEVICE_TEST_DIR
$ADB_CMD push $TESTEXE $DEVICE_TEST_DIR/
if [ $? != 0 ] ; then
echo "ERROR: Can't push test to device!"
exit 1
fi
adb_cmd chmod 0755 $DEVICE_TEST &&
adb_cmd $DEVICE_TEST
RET=$?
adb_cmd rm -r $DEVICE_TEST_DIR
if [ "$RET" != 0 ] ; then
echo "FAIL!"
else
echo "OK!"
fi
exit 0