blob: 61b1a1e7b59aceff394bcd5dd31ad03aedaf5258 [file] [log] [blame]
#!/bin/bash
# Copyright 2018 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.
# Usage '. runcts.sh'
function _runtest_cts_mediacomponent_usage() {
echo 'runtest-cts-MediaComponents [option]: Build, flash device,'
echo ' and run subset of CtsMediaTestCases that MediaComponents covers.'
echo ' *Warning* This bypasses CTS setup (e.g. download media contents from server)'
echo ' For running CTS in official way, use atest or cts-tradefed '
echo ' -h|--help: This help'
echo ' --skip: Skip build and flash. Just rerun-tests'
echo ' --min: Only rebuild tests and updatable library.'
echo ' --test: Only rebuild tests'
echo ' -s [device_id]: Specify a device name to run test against.'
echo ' You can define ${ADBHOST} instead.'
echo ' -r [count]: Repeat tests for given count. It will stop when fails.'
echo ' --ignore: Keep repeating tests even when it fails.'
echo ' -t [test]: Only run the specific test. Can be either a class or a method.'
}
function runtest-cts-MediaComponents() {
# Edit here if you want to support other tests.
# List up libs and apks in the media_api needed for tests, and place test target at the last.
local TEST_PACKAGE_DIR=("frameworks/av/packages/MediaComponents/test")
local TEST_PACKAGE=("android.media.cts")
local BUILD_TARGETS=("MediaComponents" "CtsMediaTestCases")
# Don't include MediaComponents -- if we simply install it, system server
# wouldn't use the installed one.
local INSTALL_TARGETS=("CtsMediaTestCases")
local TEST_RUNNER="android.support.test.runner.AndroidJUnitRunner"
local DEPENDENCIES=("mockito-target-minus-junit4" "android-support-test" "compatibility-device-util")
local DEFAULT_TEST_TARGET=""
DEFAULT_TEST_TARGET+="android.media.cts.MediaBrowser2Test"
DEFAULT_TEST_TARGET+=",android.media.cts.MediaController2Test"
DEFAULT_TEST_TARGET+=",android.media.cts.MediaMetadata2Test"
DEFAULT_TEST_TARGET+=",android.media.cts.MediaSession2Test"
DEFAULT_TEST_TARGET+=",android.media.cts.MediaSession2_PermissionTest"
DEFAULT_TEST_TARGET+=",android.media.cts.MediaSessionManager_MediaSession2Test"
DEFAULT_TEST_TARGET+=",android.media.cts.SessionToken2Test"
if [[ -z "${ANDROID_BUILD_TOP}" ]]; then
echo "Needs to lunch a target first"
return
fi
local old_path=${OLDPWD}
while true; do
local OPTION_SKIP="false"
local OPTION_MIN="false"
local OPTION_TEST="false"
local OPTION_REPEAT_COUNT="1"
local OPTION_IGNORE="false"
local OPTION_TEST_TARGET="${DEFAULT_TEST_TARGET}"
local adbhost_local
while (( "$#" )); do
case "${1}" in
-h|--help)
_runtest_cts_mediacomponent_usage
return
;;
--skip)
OPTION_SKIP="true"
;;
--min)
OPTION_MIN="true"
;;
--test)
OPTION_TEST="true"
;;
-s)
shift
adbhost_local=${1}
;;
-r)
shift
OPTION_REPEAT_COUNT="${1}"
;;
--ignore)
OPTION_IGNORE="true"
;;
-t)
shift
OPTION_TEST_TARGET="${1}"
esac
shift
done
# Build adb command.
local adb
if [[ -z "${adbhost_local}" ]]; then
adbhost_local=${ADBHOST}
fi
if [[ -z "${adbhost_local}" ]]; then
local device_count=$(adb devices | sed '/^[[:space:]]*$/d' | wc -l)
if [[ "${device_count}" != "2" ]]; then
echo "Too many devices. Specify a device." && break
fi
adb="adb"
else
adb="adb -s ${adbhost_local}"
fi
local target_dir="${ANDROID_BUILD_TOP}/${TEST_PACKAGE_DIR}"
#local TEST_PACKAGE=$(sed -n 's/^.*\bpackage\b="\([a-z0-9\.]*\)".*$/\1/p' ${target_dir}/AndroidManifest.xml)
if [[ "${OPTION_SKIP}" != "true" ]]; then
# Build dependencies if needed.
local dependency
local build_dependency=""
for dependency in ${DEPENDENCIES[@]}; do
if [[ "${dependency}" == "out/"* ]]; then
if [[ ! -f ${ANDROID_BUILD_TOP}/${dependency} ]]; then
build_dependency="true"
break
fi
else
if [[ "$(find ${OUT} -name ${dependency}_intermediates | wc -l)" == "0" ]]; then
build_dependency="true"
break
fi
fi
done
if [[ "${build_dependency}" == "true" ]]; then
echo "Building dependencies. Will only print stderr."
m ${DEPENDENCIES[@]} -j > /dev/null
fi
# Build test apk and required apk.
local build_targets
if [[ "${OPTION_TEST}" == "true" ]]; then
build_targets="${INSTALL_TARGETS[@]}"
elif [[ "${OPTION_MIN}" == "true" ]]; then
build_targets="${BUILD_TARGETS[@]}"
else
build_targets="${BUILD_TARGETS[@]} droid"
fi
m ${build_targets} -j || break
if [[ "${OPTION_TEST}" != "true" ]]; then
# Flash only when needed
local device_build_type="$(${adb} shell getprop ro.build.type)"
if [[ "${device_build_type}" == "user" ]]; then
# User build. Cannot adb sync
${adb} reboot bootloader
fastboot flashall
else
${adb} root
local device_verity_mode="$(${adb} shell getprop ro.boot.veritymode)"
if [[ "${device_verity_mode}" != "disabled" ]]; then
${adb} disable-verity
${adb} reboot
${adb} wait-for-device || break
${adb} root
fi
${adb} remount
${adb} shell stop
${adb} shell setprop log.tag.MediaSessionService DEBUG
${adb} sync
${adb} shell start
fi
${adb} wait-for-device || break
# Ensure package manager is loaded.
# TODO(jaewan): Find better way to wait
sleep 15
fi
# Install apks
local install_failed="false"
for target in ${INSTALL_TARGETS[@]}; do
local apk_path=$(find ${OUT}/system ${OUT}/data -name ${target}.apk)
local apk_num=$(find ${OUT}/system ${OUT}/data -name ${target}.apk | wc -l)
if [[ "${apk_num}" != "1" ]]; then
echo "Cannot locate a ${target}.apk. Found ${apk_num} apks" && break
fi
echo "Installing ${target}.apk. path=${apk_path}"
${adb} install -r ${apk_path}
if [[ "${?}" != "0" ]]; then
install_failed="true"
break
fi
done
if [[ "${install_failed}" == "true" ]]; then
echo "Failed to install. Test wouldn't run."
break
fi
fi
local test_target=""
if [[ -n "${OPTION_TEST_TARGET}" ]]; then
test_target="-e class ${OPTION_TEST_TARGET}"
fi
local i
local tmpfile=$(tempfile)
for ((i=1; i <= ${OPTION_REPEAT_COUNT}; i++)); do
echo "Run test ${i}/${OPTION_REPEAT_COUNT}"
${adb} shell am instrument ${test_target} -w ${TEST_PACKAGE}/${TEST_RUNNER} >& ${tmpfile}
cat ${tmpfile}
if [[ "${OPTION_IGNORE}" != "true" ]]; then
if [[ -n "$(grep ${tmpfile} -e 'FAILURE\|crashed')" ]]; then
# am instrument doesn't return error code so need to grep result message instead
break
fi
fi
done
rm ${tmpfile}
break
done
}
echo "Following functions are added to your environment:"
_runtest_cts_mediacomponent_usage