#!/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 $?