blob: 14f5cee6526cc57b0b46612ccd8ff2d27ef5a197 [file] [log] [blame]
#!/bin/sh
# Copyright (C) 2008 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.
# A lit XML parser which could get attribute value of the specified tag.
# parseXML(tag, attribute)
parseXML() {
awk -v tag=${2} -v attribute=${3} \
'BEGIN { RS=">" }
{ ind=split($0,field," ");
if (substr(field[1],2)==tag) {
for(ind2=2;ind2<=ind;ind2++) {
split(field[ind2],token,"=");
if (token[1]==attribute)
{ print token[2] }
}}}' ${1}
}
# Generate signature checking description xml file.
generateSignatureCheckDescription() {
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > ${SIGNATURE_CHECK_PATH}
echo "<TestPackage AndroidFramework=\"Android 1.0\" jarPath=\"\" "\
"name=\"${SIGNATURE_TEST_NAME}\" runner=\".InstrumentationRunner\" "\
"targetNameSpace=\"\" targetBinaryName=\"\" version=\"1.0\" signatureCheck=\"true\" "\
"appPackageName=\"${SIGNATURE_TESTS}\">" >> ${SIGNATURE_CHECK_PATH}
echo "<TestSuite name=\"android\">" >> ${SIGNATURE_CHECK_PATH}
echo "<TestSuite name=\"tests\">" >> ${SIGNATURE_CHECK_PATH}
echo "<TestSuite name=\"sigtest\">" >> ${SIGNATURE_CHECK_PATH}
echo "<TestCase name=\"SignatureTest\">" >> ${SIGNATURE_CHECK_PATH}
echo "<Test name=\"signatureTest\">" >> ${SIGNATURE_CHECK_PATH}
echo "</Test>" >> ${SIGNATURE_CHECK_PATH}
echo "</TestCase>" >> ${SIGNATURE_CHECK_PATH}
echo "</TestSuite>" >> ${SIGNATURE_CHECK_PATH}
echo "</TestSuite>" >> ${SIGNATURE_CHECK_PATH}
echo "</TestSuite>" >> ${SIGNATURE_CHECK_PATH}
echo "</TestPackage>" >> ${SIGNATURE_CHECK_PATH}
}
generateReferenceAppDescription() {
PACKAGE_NAME=${1}
PACKAGE_PATH=${2}
JAVA_PACKAGE=${3}
CLASS_NAME=${4}
METHOD_NAME=${5}
APK_TO_TEST_NAME=${6}
PACKAGE_TO_TEST=${7}
# Convert the dotted package name into a list so we can loop though it.
JAVA_PACKAGE_LIST=`echo $JAVA_PACKAGE | sed 's/\./ /g'`
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > ${PACKAGE_PATH}
echo "<TestPackage AndroidFramework=\"Android 1.0\" jarPath=\"\" "\
"name=\"${PACKAGE_NAME}\" runner=\"android.test.InstrumentationTestRunner\" "\
"targetNameSpace=\"\" targetBinaryName=\"\" version=\"1.0\" "\
"signatureCheck=\"false\" referenceAppTest=\"true\""\
"apkToTestName=\"${APK_TO_TEST_NAME}\""\
"packageToTest=\"${PACKAGE_TO_TEST}\""\
"appPackageName=\"${JAVA_PACKAGE}\">" >> ${PACKAGE_PATH}
for pack_part in ${JAVA_PACKAGE_LIST}; do
echo "<TestSuite name=\"${pack_part}\">" >> ${PACKAGE_PATH}
done
echo "<TestCase name=\"${CLASS_NAME}\">" >> ${PACKAGE_PATH}
echo "<Test name=\"${METHOD_NAME}\">" >> ${PACKAGE_PATH}
echo "</Test>" >> ${PACKAGE_PATH}
echo "</TestCase>" >> ${PACKAGE_PATH}
for pack_part in ${JAVA_PACKAGE_LIST}; do
echo "</TestSuite>" >> ${PACKAGE_PATH}
done
echo "</TestPackage>" >> ${PACKAGE_PATH}
}
# Genrate the header of the test plan XML file.
genTestPlanHeader() {
TEST_PLAN=${1}
echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" > ${TEST_PLAN}
echo "<TestPlan version=\"1.0\">" >> ${TEST_PLAN}
}
# add one entry into test plan XML file.
addTestPlanEntry() {
TEST_PLAN=${1}
APP_JAVA_PKG_NAME=${2}
entry=$(grep "<Entry uri=\"${APP_JAVA_PKG_NAME}\"/>" ${TEST_PLAN})
if [ "${entry}" == "" ]; then
echo "<Entry uri=\"${APP_JAVA_PKG_NAME}\"/>" >> ${TEST_PLAN}
fi
}
# Process the inclusive list.
procInclusiveList() {
TESTCASE_PATH=${1}
TEST_PLAN=${2}
INC_LIST=${3}
for FILE_NAME in $(ls ${TESTCASE_PATH}/*.xml); do
APP_JAVA_PKG_NAME=$(parseXML ${FILE_NAME} TestPackage appPackageName | sed 's/\"//g')
for INC_NAME in ${INC_LIST} ; do
if [ "${INC_NAME}" == "${APP_JAVA_PKG_NAME}" ]; then
addTestPlanEntry ${TEST_PLAN} ${APP_JAVA_PKG_NAME}
fi
done
done
}
# Process the exclusive list.
procExclusiveList() {
TESTCASE_PATH=${1}
TEST_PLAN=${2}
EXC_LIST=${3}
for FILE_NAME in $(ls ${TESTCASE_PATH}/*.xml); do
APP_JAVA_PKG_NAME=$(parseXML ${FILE_NAME} TestPackage appPackageName | sed 's/\"//g')
excluded=""
for EXC_NAME in ${EXC_LIST} ; do
if [ "${EXC_NAME}" == "${APP_JAVA_PKG_NAME}" ]; then
excluded="true"
fi
done
if [ "${excluded}" != "true" ]; then
addTestPlanEntry ${TEST_PLAN} ${APP_JAVA_PKG_NAME}
fi
done
}
# Generate test plan with given information.
genTestPlan() {
TESTCASE_PATH=${1}
TEST_PLAN=${2}
TYPE=${3}
LIST=${4}
genTestPlanHeader ${TEST_PLAN};
if [ "${TYPE}" == "inclusive" ]; then
procInclusiveList ${TESTCASE_PATH} ${TEST_PLAN} "${LIST}"
else
procExclusiveList ${TESTCASE_PATH} ${TEST_PLAN} "${LIST}"
fi
echo "</TestPlan>" >> ${TEST_PLAN}
}
# Generate all of the default test plans
generateAllTestPlans() {
TESTCASE_PATH=${1}
PLAN_PATH=${2}
TEST_PLAN=${PLAN_PATH}/CTS.xml
LIST="${PERFORMANCE_TESTS}"
TYPE="exclusive"
genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
TEST_PLAN=${PLAN_PATH}/Android.xml
LIST="${SIGNATURE_TESTS} ${ANDROID_CORE_TESTS} ${ANDROID_CORE_VM_TESTS} ${PERFORMANCE_TESTS}"
TYPE="exclusive"
genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
TEST_PLAN=${PLAN_PATH}/Java.xml
LIST="${ANDROID_CORE_TESTS}"
TYPE="inclusive"
genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
TEST_PLAN=${PLAN_PATH}/VM.xml
LIST="${ANDROID_CORE_VM_TESTS}"
TYPE="inclusive"
genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
TEST_PLAN=${PLAN_PATH}/Signature.xml
LIST="${SIGNATURE_TESTS}"
TYPE="inclusive"
genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
TEST_PLAN=${PLAN_PATH}/RefApp.xml
LIST="${REFERENCE_APP_TESTS}"
TYPE="inclusive"
genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
TEST_PLAN=${PLAN_PATH}/Performance.xml
LIST="${PERFORMANCE_TESTS}"
TYPE="inclusive"
genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
}
# Build the DescriptionGenerator as the Doclet
buildDescriptionGenerator() {
OUT=${1}
READLINK_OPT=""
HOST=$(uname -s | tr 'A-Z' 'a-z')
if [ ${HOST} != "darwin" ]; then
READLINK_OPT="-m"
fi;
echo "Build "Description generator""
JAVADOC_PATH=$(readlink ${READLINK_OPT} $(which javadoc))
JAVADOC_LIBS=$(echo ${JAVADOC_PATH} | sed 's/bin\/javadoc/lib\//')
javac -d ${OUT} -extdirs ${JAVADOC_LIBS} \
${CTS_ROOT}/utils/DescriptionGenerator.java
}
addControllerInfo() {
CTSROOT=${1}
OUT=${2}
XMLNAME=${3}
APP_PACKAGE_NAME=${4}
MANIFEST="AndroidManifest.xml"
MAKEFILE="Android.mk"
TARGET_BINARY_MARK="LOCAL_INSTRUMENTATION_FOR"
HOST_CONTROLLER_NAME="hostController.jar"
APP_NAME_SPACE=$(parseXML ${CTSROOT}/${MANIFEST} manifest package | sed 's/\"//g')
RUNNER_NAME=$(parseXML ${CTSROOT}/${MANIFEST} instrumentation android:name | sed 's/\"//g')
TARGET_NAME_SPACE=$(parseXML ${CTSROOT}/${MANIFEST} instrumentation android:targetPackage | sed 's/\"//g')
TARGET_BINARY_NAME=$(cat ${CTSROOT}/${MAKEFILE} | grep "LOCAL_INSTRUMENTATION_FOR :=" | cut -d"=" -f2 | sed 's/^[ \t]*//g;s/[ \t]*$//g')
if [ -z "${RUNNER_NAME}" ] ; then
echo "Can't find instrumentation in the manifest file."
return 1;
fi
HOST_CONTROLLER_LOCATION=$(find ${ANDROID_OUT_ROOT} -type f -name ${HOST_CONTROLLER_NAME})
if [ -f "${HOST_CONTROLLER_LOCATION}" ]; then
cp -f ${HOST_CONTROLLER_LOCATION} ${CASE_REPOSITORY}/${HOST_CONTROLLER_NAME}
XML_INFO="jarPath=\"${HOST_CONTROLLER_NAME}\" name=\"${XMLNAME}\" "\
"runner=\"${RUNNER_NAME}\" appNameSpace=\"${APP_NAME_SPACE}\" appPackageName=\"${APP_PACKAGE_NAME}\""
else
XML_INFO="jarPath=\"\" name=\"${XMLNAME}\" runner=\"${RUNNER_NAME}\" "\
"appNameSpace=\"${APP_NAME_SPACE}\" appPackageName=\"${APP_PACKAGE_NAME}\""
fi
if [ "${PACKAGE_NAME}" != "${TARGET_PACKAGE_NAME}" ]; then
# A dependancy is required by this package
XML_INFO="${XML_INFO} targetNameSpace=\"${TARGET_NAME_SPACE}\" targetBinaryName=\"${TARGET_BINARY_NAME}\""
fi
# Update "Package description" file
sed 's/XML_INFO=\"\"/'"${XML_INFO}"'/' ${OUT}/description.xml \
> ${CASE_REPOSITORY}/${XMLNAME}.xml
}
# Generate "Package description" file
generatePackageDescription() {
SRC=${1}
OUT=${2}
# Build "Description generator" if not available
if [ ! -f ${OUT}/DescriptionGenerator.class ]; then
buildDescriptionGenerator ${OUT}
fi
SOURCES=$(find ${SRC} -type f -name "*.java")
echo "Generating TestCases description file from ${SRC}..."
javadoc -J-Xmx256m -quiet -doclet DescriptionGenerator -docletpath ${OUT} -sourcepath \
${TOP_DIR}/frameworks/base/awt/java:\
${TOP_DIR}/frameworks/base/core/java:\
${TOP_DIR}/frameworks/base/graphics/java:\
${TOP_DIR}/frameworks/base/location/java:\
${TOP_DIR}/frameworks/base/media/java:\
${TOP_DIR}/frameworks/base/opengl/java:\
${TOP_DIR}/frameworks/base/sax/java:\
${TOP_DIR}/frameworks/base/services/java:\
${TOP_DIR}/frameworks/base/telephony/java:\
${TOP_DIR}/frameworks/base/wifi/java:\
${TOP_DIR}/frameworks/base/test-runner:\
${TOP_DIR}/cts/tests/tests/app/src:\
${TOP_DIR}/cts/tests/tests/content/src:\
${TOP_DIR}/cts/tests/tests/database/src:\
${TOP_DIR}/cts/tests/tests/graphics/src:\
${TOP_DIR}/cts/tests/tests/hardware/src:\
${TOP_DIR}/cts/tests/tests/location/src:\
${TOP_DIR}/cts/tests/tests/media/src:\
${TOP_DIR}/cts/tests/tests/net/src:\
${TOP_DIR}/cts/tests/tests/os/src:\
${TOP_DIR}/cts/tests/tests/permission/src:\
${TOP_DIR}/cts/tests/tests/permission2/src:\
${TOP_DIR}/cts/tests/tests/preference/src:\
${TOP_DIR}/cts/tests/tests/provider/src:\
${TOP_DIR}/cts/tests/tests/telephony/src:\
${TOP_DIR}/cts/tests/tests/text/src:\
${TOP_DIR}/cts/tests/tests/util/src:\
${TOP_DIR}/cts/tests/tests/view/src:\
${TOP_DIR}/cts/tests/tests/widget/src:\
${TOP_DIR}/cts/tests/tests/performance/src:\
${TOP_DIR}/cts/tests/tests/performance2/src:\
${TOP_DIR}/cts/tests/tests/performance3/src:\
${TOP_DIR}/cts/tests/tests/performance4/src:\
${TOP_DIR}/cts/tests/tests/performance5/src:\
${TOP_DIR}/dalvik/libcore/dalvik/src/main/java:\
${TOP_DIR}/dalvik/libcore/junit/src/main/java \
${SOURCES} 1>/dev/null 2>/dev/null
mv description.xml ${OUT}/description.xml
}
if [ $# -ne 6 ]; then
echo "Usage ${0} <source dir> <destination dir> <temp dir> <top dir> "\
"<target common out root> == JAVA_LIBS=${5}/obj/JAVA_LIBRARIES <android out dir>"
exit 1
fi
TESTCASES_SOURCE=${1}
OUT_DIR=${2}
TEMP_DIR=${3}
TOP_DIR=${4}
JAVA_LIBS=${5}/obj/JAVA_LIBRARIES
ANDROID_OUT_ROOT=${6}
CTS_ROOT=${TOP_DIR}/cts/tools
CASE_REPOSITORY=${OUT_DIR}/repository/testcases
PLAN_REPOSITORY=${OUT_DIR}/repository/plans
SIGNATURE_TEST_NAME="SignatureTest"
SIGNATURE_TESTS="android.tests.sigtest"
SIGNATURE_CHECK_PATH="${CASE_REPOSITORY}/${SIGNATURE_TEST_NAME}.xml"
ANDROID_CORE_TESTS="android.core.tests.annotation android.core.tests.archive android.core.tests.concurrent android.core.tests.crypto android.core.tests.dom android.core.tests.logging android.core.tests.luni.io android.core.tests.luni.lang android.core.tests.luni.net android.core.tests.luni.util android.core.tests.math android.core.tests.nio android.core.tests.nio_char android.core.tests.prefs android.core.tests.regex android.core.tests.security android.core.tests.sql android.core.tests.text android.core.tests.xml android.core.tests.xnet"
ANDROID_CORE_VM_TESTS="android.core.vm-tests"
#Creating Signature check description xml file, if not existed.
generateSignatureCheckDescription
REFERENCE_APP_TESTS="android.apidemos.cts"
API_DEMOS_REFERENCE_NAME="ApiDemosReferenceTest"
API_DEMOS_REFERENCE_PATH="${CASE_REPOSITORY}/${API_DEMOS_REFERENCE_NAME}.xml"
PERFORMANCE_TESTS="android.performance android.performance2 android.performance3 android.performance4 android.performance5"
generateReferenceAppDescription "ApiDemosReferenceTest"\
${API_DEMOS_REFERENCE_PATH}\
"android.apidemos.cts"\
"ApiDemosTest"\
"testNumberOfItemsInListView"\
"ApiDemos"\
"com.example.android.apis"
# Every test case package ends with "cts"
for CASE_SOURCE in $(find ${TESTCASES_SOURCE} -type d | grep "cts$" | sed 's/\/\//\//'); do
TARGET_PACKAGE_NAME=$(echo ${CASE_SOURCE} | sed 's/^.*src\///g' | sed 's/\/cts//g' | sed 's/\//./g' | sed 's/android\..*\..*//g')
if [ x${TARGET_PACKAGE_NAME} != x ]; then
# TODO: translate this script to python to reduce dependencies on external tools
# darwin sed does not support \u in replacement pattern, use perl for now
NAME=$(echo $TARGET_PACKAGE_NAME | sed 's/android\.//g' | perl -p -e 's/([a-z])([a-zA-Z0-9]*)/\u\1\2/g' | sed 's/^/Cts/g' | sed 's/$/TestCases/g')
if [ x${NAME} != x ]; then
# TODO: Currently hard coded as -f4, should find a better way to remove this hard code
TESTCASE_DIR=$TESTCASES_SOURCE$(echo $CASE_SOURCE | cut -d"/" -f4)
# Since case source java packages always end in cts, we need to
# start the search for sources in the parent package, so that e.g.
# the android.content.cts test package also includes the sources in
# android.content.pm.cts.
CASE_SOURCE_PARENT=$(echo ${CASE_SOURCE} | sed 's/\/cts$//g')
generatePackageDescription ${CASE_SOURCE_PARENT} ${TEMP_DIR}
addControllerInfo ${TESTCASE_DIR} ${TEMP_DIR} ${NAME} ${TARGET_PACKAGE_NAME}
if [[ $? -ne 0 ]]; then
exit 1
fi
fi
fi
done
# Creating the default test plans
generateAllTestPlans ${CASE_REPOSITORY} ${PLAN_REPOSITORY}