blob: 6f828fcc34a06c4f2aa1c0f3cb1fbe39324ae3f5 [file] [log] [blame]
#!/usr/bin/env bash
set -e
set -u
readonly DEFAULT_TESTS="
netdutils_test
netd_unit_test
netd_integration_test
resolv_integration_test
resolv_unit_test
"
readonly EXTENDED_TESTS="
netd_benchmark
"
readonly TEST_DEVICE_PATH="/data/local/tmp"
REPO_TOP=""
SOONG_BIN=""
DEBUG=""
function logToStdErr() {
echo "$1" >&2
}
function testAndSetRepoTop() {
if [[ -n "$1" && -d "$1/.repo" ]]; then
REPO_TOP="$1"
SOONG_BIN="$REPO_TOP/build/soong/soong_ui.bash"
return 0
fi
return 1
}
function gotoRepoTop() {
if testAndSetRepoTop "$ANDROID_BUILD_TOP"; then
return
fi
while ! testAndSetRepoTop "$PWD"; do
if [[ "$PWD" == "/" ]]; then
break
fi
cd ..
done
}
function runCmd() {
local cmd="$@"
echo "#"
echo "# $cmd"
$DEBUG $cmd
return $?
}
function runOneTest() {
local test="$1"
echo
echo "###"
echo "# $test"
echo "###"
local prefix="$ANDROID_TARGET_OUT_TESTCASES/$test/$TARGET_ARCH/$test"
for bits in '' 32 64; do
local testbin="${prefix}${bits}"
if [ -f "$testbin" ]; then
runCmd adb push "$testbin" "$TEST_DEVICE_PATH/$test" &&
runCmd adb shell "$TEST_DEVICE_PATH/$test" &&
runCmd adb shell "rm $TEST_DEVICE_PATH/$test"
return $?
fi
done
logToStdErr "Couldn't find test binary '$prefix'"
return 1
}
function main() {
if [ ! -v ANDROID_BUILD_TOP ]; then
logToStdErr "You need to source and lunch before you can use this script"
return 1
fi
gotoRepoTop
if ! testAndSetRepoTop "$REPO_TOP"; then
logToStdErr "Could not find useful top of repo directory"
return 1
fi
logToStdErr "Using REPO_TOP=$REPO_TOP"
TARGET_ARCH=$("$SOONG_BIN" --dumpvar-mode TARGET_ARCH)
if [ -z "$TARGET_ARCH" ]; then
logToStdErr "Could not determine TARGET_ARCH"
return 1
fi
local test_regex=""
while [[ $# -gt 0 ]]; do
case "$1" in
"-n")
DEBUG=echo
shift
;;
*)
# Allow us to do things like "runtests.sh integration", etc.
test_regex="$1"
shift
;;
esac
done
# Try becoming root, in case the tests will be run on a device
# with a userdebug build. Failure to become root is not fatal
# for all (in fact, not even most) tests so don't exit on error.
runCmd adb root || logToStdErr "WARNING: unable to 'adb root'"
local failures=0
local skipped=0
# Find out which tests to run.
local tests=""
for testName in $DEFAULT_TESTS; do
if [[ -z "$test_regex" || "$testName" =~ "$test_regex" ]]; then
tests="$tests $testName"
else
logToStdErr "Skipping $testName"
skipped=$((skipped + 1))
fi
done
# If something has been specified, also check the extended tests for
# a possible match (i.e. in order to run benchmarks, etc).
if [[ -n "$test_regex" ]]; then
for testName in $EXTENDED_TESTS; do
if [[ "$testName" =~ "$test_regex" ]]; then
tests="$tests $testName"
fi
done
fi
if [[ -z "$tests" ]]; then
logToStdErr "No tests matched"
return 1
fi
# Build all the specified tests.
runCmd "$SOONG_BIN" --make-mode "$tests" || return $?
# Run all the specified tests.
for testName in $tests; do
runOneTest "$testName" || failures=$((failures + 1))
done
echo "Number of tests failing: $failures"
[[ $skipped -gt 0 ]] && echo "Number of tests skipped: $skipped"
return $failures
}
main "$@"
exit $?