118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# 218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# Copyright (C) 2012 The Android Open Source Project 318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# 418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# Licensed under the Apache License, Version 2.0 (the "License"); 518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# you may not use this file except in compliance with the License. 618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# You may obtain a copy of the License at 718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# 818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# http://www.apache.org/licenses/LICENSE-2.0 918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# 1018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# Unless required by applicable law or agreed to in writing, software 1118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# distributed under the License is distributed on an "AS IS" BASIS, 1218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# See the License for the specific language governing permissions and 1418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# limitations under the License. 1518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# 1618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# Script to start "uiautomator" on the device 1718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# 1818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# The script does a couple of things: 1918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# * Use an alternative dalvik cache when running as non-root. Jar file needs 2018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# to be dexopt'd to run in Dalvik. For plain jar files, this is done at first 2118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# use. shell user does not have write permission to default system Dalvik 2218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# cache so we redirect to an alternative cache 2318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# * special processing for subcommand 'runtest': 2418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# * '--nohup' allows process continue to run even if parent process that 2518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# started it has already terminated. We parse for this parameter and set 2618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# signal trap. This is useful for testing with USB disconnected 2718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# * all jar files that the test classes resides in, or dependent on are 2818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# provided on command line and exported to CLASSPATH environment variable 2918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# before starting the Java code. This offloads the task of class loading 3018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# and resolving of cross jar class dependency to Dalvik 3118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# * all other subcommand or options are directly passed into Java code for 3218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# further parsing 3318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuexport run_base=/data/local/tmp 3518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuexport base=/system 3618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# if not running as root, trick dalvik into using an alternative dex cache 3818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuif [ ${USER_ID} -ne 0 ]; then 3918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu tmp_cache=${run_base}/dalvik-cache 4018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if [ ! -d ${tmp_cache} ]; then 4218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mkdir -p ${tmp_cache} 4318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu fi 4418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu export ANDROID_DATA=${run_base} 4618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhufi 4718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# take first parameter as the command 4918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhucmd=${1} 5018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 5118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuif [ -z "${1}" ]; then 5218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu cmd="help" 5318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhufi 5418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 5518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# strip the command parameter 5618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuif [ -n "${1}" ]; then 5718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu shift 5818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhufi 5918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 6018b892c723e812a7e111f102d2b0c0782b116bb6Guang ZhuCLASSPATH=/system/framework/android.test.runner.jar:${base}/framework/uiautomator.jar 6118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 6218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# eventually args will be what get passed down to Java code 6318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuargs= 6418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# we also pass the list of jar files, so we can extract class names for tests 6518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# if they are not explicitly specified 6618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhujars= 6718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 6818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu# special case pre-processing for 'runtest' command 6918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuif [ "${cmd}" == "runtest" ]; then 7018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu # first parse the jar paths 7118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu while [ true ]; do 7218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if [ -z "${1}" ] && [ -z "${jars}" ]; then 7318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu echo "Error: more parameters expected for runtest; please see usage for details" 7418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu cmd="help" 7518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu break 7618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu fi 7718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if [ -z "${1}" ]; then 7818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu break 7918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu fi 8018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu jar=${1} 8118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if [ "${1:0:1}" = "-" ]; then 8218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu # we are done with jars, starting with parameters now 8318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu break 8418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu fi 8518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu # if relative path, append the default path prefix 8618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if [ "${1:0:1}" != "/" ]; then 8718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu jar=${run_base}/${1} 8818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu fi 8918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu # about to add the file to class path, check if it's valid 9018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if [ ! -f ${jar} ]; then 9118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu echo "Error: ${jar} does not exist" 9218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu # force to print help message 9318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu cmd="help" 9418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu break 9518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu fi 9618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu jars=${jars}:${jar} 9718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu # done processing current arg, moving on 9818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu shift 9918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu done 10018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu # look for --nohup: if found, consume it and trap SIG_HUP, otherwise just 10118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu # append the arg to args 10218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu while [ -n "${1}" ]; do 10318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if [ "${1}" = "--nohup" ]; then 10418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu trap "" HUP 10518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu shift 10618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu else 10718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu args="${args} ${1}" 10818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu shift 10918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu fi 11018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu done 11118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuelse 11218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu # if cmd is not 'runtest', just take the rest of the args 11318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu args=${@} 11418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhufi 11518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 11618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuargs="${cmd} ${args}" 11718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuif [ -n "${jars}" ]; then 11818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu args="${args} -e jars ${jars}" 11918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhufi 12018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 12118b892c723e812a7e111f102d2b0c0782b116bb6Guang ZhuCLASSPATH=${CLASSPATH}:${jars} 12218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuexport CLASSPATH 12318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuexec app_process ${base}/bin com.android.commands.uiautomator.Launcher ${args} 124