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