blob: 14f5cee6526cc57b0b46612ccd8ff2d27ef5a197 [file] [log] [blame]
The Android Open Source Projectf8057102009-03-15 16:47:16 -07001#!/bin/sh
2
3# Copyright (C) 2008 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17# A lit XML parser which could get attribute value of the specified tag.
18# parseXML(tag, attribute)
19parseXML() {
20 awk -v tag=${2} -v attribute=${3} \
21 'BEGIN { RS=">" }
22 { ind=split($0,field," ");
23 if (substr(field[1],2)==tag) {
24 for(ind2=2;ind2<=ind;ind2++) {
25 split(field[ind2],token,"=");
26 if (token[1]==attribute)
27 { print token[2] }
28 }}}' ${1}
29}
30
31# Generate signature checking description xml file.
32generateSignatureCheckDescription() {
33 echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > ${SIGNATURE_CHECK_PATH}
34 echo "<TestPackage AndroidFramework=\"Android 1.0\" jarPath=\"\" "\
The Android Open Source Project7671bec2009-03-19 23:08:36 -070035 "name=\"${SIGNATURE_TEST_NAME}\" runner=\".InstrumentationRunner\" "\
The Android Open Source Projectf8057102009-03-15 16:47:16 -070036 "targetNameSpace=\"\" targetBinaryName=\"\" version=\"1.0\" signatureCheck=\"true\" "\
The Android Open Source Project7671bec2009-03-19 23:08:36 -070037 "appPackageName=\"${SIGNATURE_TESTS}\">" >> ${SIGNATURE_CHECK_PATH}
The Android Open Source Projectf8057102009-03-15 16:47:16 -070038 echo "<TestSuite name=\"android\">" >> ${SIGNATURE_CHECK_PATH}
39 echo "<TestSuite name=\"tests\">" >> ${SIGNATURE_CHECK_PATH}
40 echo "<TestSuite name=\"sigtest\">" >> ${SIGNATURE_CHECK_PATH}
41 echo "<TestCase name=\"SignatureTest\">" >> ${SIGNATURE_CHECK_PATH}
Phil Dubachdc4e1792009-05-05 14:01:34 -070042 echo "<Test name=\"signatureTest\">" >> ${SIGNATURE_CHECK_PATH}
The Android Open Source Projectf8057102009-03-15 16:47:16 -070043 echo "</Test>" >> ${SIGNATURE_CHECK_PATH}
44 echo "</TestCase>" >> ${SIGNATURE_CHECK_PATH}
45 echo "</TestSuite>" >> ${SIGNATURE_CHECK_PATH}
46 echo "</TestSuite>" >> ${SIGNATURE_CHECK_PATH}
47 echo "</TestSuite>" >> ${SIGNATURE_CHECK_PATH}
48 echo "</TestPackage>" >> ${SIGNATURE_CHECK_PATH}
49}
50
Bill Napierc8a5cde2009-04-17 14:31:38 -070051generateReferenceAppDescription() {
52 PACKAGE_NAME=${1}
53 PACKAGE_PATH=${2}
54 JAVA_PACKAGE=${3}
55 CLASS_NAME=${4}
56 METHOD_NAME=${5}
57 APK_TO_TEST_NAME=${6}
58 PACKAGE_TO_TEST=${7}
59 # Convert the dotted package name into a list so we can loop though it.
60 JAVA_PACKAGE_LIST=`echo $JAVA_PACKAGE | sed 's/\./ /g'`
61
62 echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > ${PACKAGE_PATH}
63 echo "<TestPackage AndroidFramework=\"Android 1.0\" jarPath=\"\" "\
64 "name=\"${PACKAGE_NAME}\" runner=\"android.test.InstrumentationTestRunner\" "\
65 "targetNameSpace=\"\" targetBinaryName=\"\" version=\"1.0\" "\
66 "signatureCheck=\"false\" referenceAppTest=\"true\""\
67 "apkToTestName=\"${APK_TO_TEST_NAME}\""\
68 "packageToTest=\"${PACKAGE_TO_TEST}\""\
69 "appPackageName=\"${JAVA_PACKAGE}\">" >> ${PACKAGE_PATH}
70 for pack_part in ${JAVA_PACKAGE_LIST}; do
71 echo "<TestSuite name=\"${pack_part}\">" >> ${PACKAGE_PATH}
72 done
73 echo "<TestCase name=\"${CLASS_NAME}\">" >> ${PACKAGE_PATH}
Phil Dubachdc4e1792009-05-05 14:01:34 -070074 echo "<Test name=\"${METHOD_NAME}\">" >> ${PACKAGE_PATH}
Bill Napierc8a5cde2009-04-17 14:31:38 -070075 echo "</Test>" >> ${PACKAGE_PATH}
76 echo "</TestCase>" >> ${PACKAGE_PATH}
77 for pack_part in ${JAVA_PACKAGE_LIST}; do
78 echo "</TestSuite>" >> ${PACKAGE_PATH}
79 done
80 echo "</TestPackage>" >> ${PACKAGE_PATH}
81}
82
The Android Open Source Project7ca56df2009-03-18 17:39:42 -070083# Genrate the header of the test plan XML file.
84genTestPlanHeader() {
85 TEST_PLAN=${1}
The Android Open Source Projectf8057102009-03-15 16:47:16 -070086 echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" > ${TEST_PLAN}
87 echo "<TestPlan version=\"1.0\">" >> ${TEST_PLAN}
The Android Open Source Project7ca56df2009-03-18 17:39:42 -070088}
The Android Open Source Projectf8057102009-03-15 16:47:16 -070089
The Android Open Source Project7ca56df2009-03-18 17:39:42 -070090# add one entry into test plan XML file.
91addTestPlanEntry() {
92 TEST_PLAN=${1}
93 APP_JAVA_PKG_NAME=${2}
94 entry=$(grep "<Entry uri=\"${APP_JAVA_PKG_NAME}\"/>" ${TEST_PLAN})
95 if [ "${entry}" == "" ]; then
96 echo "<Entry uri=\"${APP_JAVA_PKG_NAME}\"/>" >> ${TEST_PLAN}
The Android Open Source Projectf8057102009-03-15 16:47:16 -070097 fi
The Android Open Source Project7ca56df2009-03-18 17:39:42 -070098}
99
100# Process the inclusive list.
101procInclusiveList() {
102 TESTCASE_PATH=${1}
103 TEST_PLAN=${2}
104 INC_LIST=${3}
105
106 for FILE_NAME in $(ls ${TESTCASE_PATH}/*.xml); do
107 APP_JAVA_PKG_NAME=$(parseXML ${FILE_NAME} TestPackage appPackageName | sed 's/\"//g')
108 for INC_NAME in ${INC_LIST} ; do
109 if [ "${INC_NAME}" == "${APP_JAVA_PKG_NAME}" ]; then
110 addTestPlanEntry ${TEST_PLAN} ${APP_JAVA_PKG_NAME}
111 fi
112 done
113 done
114}
115
116# Process the exclusive list.
117procExclusiveList() {
118 TESTCASE_PATH=${1}
119 TEST_PLAN=${2}
120 EXC_LIST=${3}
121
122 for FILE_NAME in $(ls ${TESTCASE_PATH}/*.xml); do
123 APP_JAVA_PKG_NAME=$(parseXML ${FILE_NAME} TestPackage appPackageName | sed 's/\"//g')
124 excluded=""
125 for EXC_NAME in ${EXC_LIST} ; do
126 if [ "${EXC_NAME}" == "${APP_JAVA_PKG_NAME}" ]; then
127 excluded="true"
128 fi
129 done
130 if [ "${excluded}" != "true" ]; then
131 addTestPlanEntry ${TEST_PLAN} ${APP_JAVA_PKG_NAME}
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700132 fi
133 done
The Android Open Source Project7ca56df2009-03-18 17:39:42 -0700134}
135
136# Generate test plan with given information.
137genTestPlan() {
138 TESTCASE_PATH=${1}
139 TEST_PLAN=${2}
140 TYPE=${3}
141 LIST=${4}
142
143 genTestPlanHeader ${TEST_PLAN};
144 if [ "${TYPE}" == "inclusive" ]; then
145 procInclusiveList ${TESTCASE_PATH} ${TEST_PLAN} "${LIST}"
146 else
147 procExclusiveList ${TESTCASE_PATH} ${TEST_PLAN} "${LIST}"
148 fi
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700149 echo "</TestPlan>" >> ${TEST_PLAN}
150}
151
The Android Open Source Project7ca56df2009-03-18 17:39:42 -0700152# Generate all of the default test plans
153generateAllTestPlans() {
154 TESTCASE_PATH=${1}
155 PLAN_PATH=${2}
156
157 TEST_PLAN=${PLAN_PATH}/CTS.xml
Phil Dubach7c195892009-05-05 16:21:58 -0700158 LIST="${PERFORMANCE_TESTS}"
The Android Open Source Project7ca56df2009-03-18 17:39:42 -0700159 TYPE="exclusive"
160 genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
161
162 TEST_PLAN=${PLAN_PATH}/Android.xml
Phil Dubach7c195892009-05-05 16:21:58 -0700163 LIST="${SIGNATURE_TESTS} ${ANDROID_CORE_TESTS} ${ANDROID_CORE_VM_TESTS} ${PERFORMANCE_TESTS}"
The Android Open Source Project7ca56df2009-03-18 17:39:42 -0700164 TYPE="exclusive"
165 genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
166
167 TEST_PLAN=${PLAN_PATH}/Java.xml
168 LIST="${ANDROID_CORE_TESTS}"
169 TYPE="inclusive"
170 genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
171
172 TEST_PLAN=${PLAN_PATH}/VM.xml
173 LIST="${ANDROID_CORE_VM_TESTS}"
174 TYPE="inclusive"
175 genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
176
177 TEST_PLAN=${PLAN_PATH}/Signature.xml
178 LIST="${SIGNATURE_TESTS}"
179 TYPE="inclusive"
180 genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
Bill Napierc8a5cde2009-04-17 14:31:38 -0700181
182 TEST_PLAN=${PLAN_PATH}/RefApp.xml
183 LIST="${REFERENCE_APP_TESTS}"
184 TYPE="inclusive"
185 genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
Bill Napier56e6fe12009-04-23 10:15:53 -0700186
187 TEST_PLAN=${PLAN_PATH}/Performance.xml
188 LIST="${PERFORMANCE_TESTS}"
189 TYPE="inclusive"
190 genTestPlan ${TESTCASE_PATH} ${TEST_PLAN} ${TYPE} "${LIST}"
The Android Open Source Project7ca56df2009-03-18 17:39:42 -0700191}
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700192
193# Build the DescriptionGenerator as the Doclet
194buildDescriptionGenerator() {
195 OUT=${1}
196 READLINK_OPT=""
197 HOST=$(uname -s | tr 'A-Z' 'a-z')
198 if [ ${HOST} != "darwin" ]; then
199 READLINK_OPT="-m"
200 fi;
201
202 echo "Build "Description generator""
203 JAVADOC_PATH=$(readlink ${READLINK_OPT} $(which javadoc))
204 JAVADOC_LIBS=$(echo ${JAVADOC_PATH} | sed 's/bin\/javadoc/lib\//')
205
206 javac -d ${OUT} -extdirs ${JAVADOC_LIBS} \
207 ${CTS_ROOT}/utils/DescriptionGenerator.java
208}
209
210addControllerInfo() {
211 CTSROOT=${1}
212 OUT=${2}
213 XMLNAME=${3}
214 APP_PACKAGE_NAME=${4}
215
216 MANIFEST="AndroidManifest.xml"
217 MAKEFILE="Android.mk"
218 TARGET_BINARY_MARK="LOCAL_INSTRUMENTATION_FOR"
219 HOST_CONTROLLER_NAME="hostController.jar"
220
221 APP_NAME_SPACE=$(parseXML ${CTSROOT}/${MANIFEST} manifest package | sed 's/\"//g')
222 RUNNER_NAME=$(parseXML ${CTSROOT}/${MANIFEST} instrumentation android:name | sed 's/\"//g')
223 TARGET_NAME_SPACE=$(parseXML ${CTSROOT}/${MANIFEST} instrumentation android:targetPackage | sed 's/\"//g')
224 TARGET_BINARY_NAME=$(cat ${CTSROOT}/${MAKEFILE} | grep "LOCAL_INSTRUMENTATION_FOR :=" | cut -d"=" -f2 | sed 's/^[ \t]*//g;s/[ \t]*$//g')
225 if [ -z "${RUNNER_NAME}" ] ; then
226 echo "Can't find instrumentation in the manifest file."
227 return 1;
228 fi
229
230 HOST_CONTROLLER_LOCATION=$(find ${ANDROID_OUT_ROOT} -type f -name ${HOST_CONTROLLER_NAME})
231 if [ -f "${HOST_CONTROLLER_LOCATION}" ]; then
232 cp -f ${HOST_CONTROLLER_LOCATION} ${CASE_REPOSITORY}/${HOST_CONTROLLER_NAME}
233 XML_INFO="jarPath=\"${HOST_CONTROLLER_NAME}\" name=\"${XMLNAME}\" "\
234"runner=\"${RUNNER_NAME}\" appNameSpace=\"${APP_NAME_SPACE}\" appPackageName=\"${APP_PACKAGE_NAME}\""
235 else
236 XML_INFO="jarPath=\"\" name=\"${XMLNAME}\" runner=\"${RUNNER_NAME}\" "\
237"appNameSpace=\"${APP_NAME_SPACE}\" appPackageName=\"${APP_PACKAGE_NAME}\""
238 fi
239
240 if [ "${PACKAGE_NAME}" != "${TARGET_PACKAGE_NAME}" ]; then
241 # A dependancy is required by this package
242 XML_INFO="${XML_INFO} targetNameSpace=\"${TARGET_NAME_SPACE}\" targetBinaryName=\"${TARGET_BINARY_NAME}\""
243 fi
244 # Update "Package description" file
245 sed 's/XML_INFO=\"\"/'"${XML_INFO}"'/' ${OUT}/description.xml \
246 > ${CASE_REPOSITORY}/${XMLNAME}.xml
247}
248
249# Generate "Package description" file
250generatePackageDescription() {
251 SRC=${1}
252 OUT=${2}
253
254 # Build "Description generator" if not available
255 if [ ! -f ${OUT}/DescriptionGenerator.class ]; then
256 buildDescriptionGenerator ${OUT}
257 fi
258 SOURCES=$(find ${SRC} -type f -name "*.java")
259
260 echo "Generating TestCases description file from ${SRC}..."
261 javadoc -J-Xmx256m -quiet -doclet DescriptionGenerator -docletpath ${OUT} -sourcepath \
262${TOP_DIR}/frameworks/base/awt/java:\
263${TOP_DIR}/frameworks/base/core/java:\
264${TOP_DIR}/frameworks/base/graphics/java:\
265${TOP_DIR}/frameworks/base/location/java:\
266${TOP_DIR}/frameworks/base/media/java:\
267${TOP_DIR}/frameworks/base/opengl/java:\
268${TOP_DIR}/frameworks/base/sax/java:\
269${TOP_DIR}/frameworks/base/services/java:\
270${TOP_DIR}/frameworks/base/telephony/java:\
271${TOP_DIR}/frameworks/base/wifi/java:\
272${TOP_DIR}/frameworks/base/test-runner:\
273${TOP_DIR}/cts/tests/tests/app/src:\
274${TOP_DIR}/cts/tests/tests/content/src:\
275${TOP_DIR}/cts/tests/tests/database/src:\
276${TOP_DIR}/cts/tests/tests/graphics/src:\
277${TOP_DIR}/cts/tests/tests/hardware/src:\
278${TOP_DIR}/cts/tests/tests/location/src:\
279${TOP_DIR}/cts/tests/tests/media/src:\
280${TOP_DIR}/cts/tests/tests/net/src:\
281${TOP_DIR}/cts/tests/tests/os/src:\
282${TOP_DIR}/cts/tests/tests/permission/src:\
Brett Chabot03177f12009-08-13 21:23:28 -0700283${TOP_DIR}/cts/tests/tests/permission2/src:\
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700284${TOP_DIR}/cts/tests/tests/preference/src:\
285${TOP_DIR}/cts/tests/tests/provider/src:\
286${TOP_DIR}/cts/tests/tests/telephony/src:\
287${TOP_DIR}/cts/tests/tests/text/src:\
288${TOP_DIR}/cts/tests/tests/util/src:\
289${TOP_DIR}/cts/tests/tests/view/src:\
290${TOP_DIR}/cts/tests/tests/widget/src:\
Bill Napier56e6fe12009-04-23 10:15:53 -0700291${TOP_DIR}/cts/tests/tests/performance/src:\
292${TOP_DIR}/cts/tests/tests/performance2/src:\
293${TOP_DIR}/cts/tests/tests/performance3/src:\
294${TOP_DIR}/cts/tests/tests/performance4/src:\
295${TOP_DIR}/cts/tests/tests/performance5/src:\
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700296${TOP_DIR}/dalvik/libcore/dalvik/src/main/java:\
297${TOP_DIR}/dalvik/libcore/junit/src/main/java \
298${SOURCES} 1>/dev/null 2>/dev/null
299 mv description.xml ${OUT}/description.xml
300}
301
302if [ $# -ne 6 ]; then
303 echo "Usage ${0} <source dir> <destination dir> <temp dir> <top dir> "\
304 "<target common out root> == JAVA_LIBS=${5}/obj/JAVA_LIBRARIES <android out dir>"
305 exit 1
306fi
307
308TESTCASES_SOURCE=${1}
309OUT_DIR=${2}
310TEMP_DIR=${3}
311TOP_DIR=${4}
312JAVA_LIBS=${5}/obj/JAVA_LIBRARIES
313ANDROID_OUT_ROOT=${6}
314CTS_ROOT=${TOP_DIR}/cts/tools
315CASE_REPOSITORY=${OUT_DIR}/repository/testcases
316PLAN_REPOSITORY=${OUT_DIR}/repository/plans
317
The Android Open Source Project7671bec2009-03-19 23:08:36 -0700318SIGNATURE_TEST_NAME="SignatureTest"
319SIGNATURE_TESTS="android.tests.sigtest"
320SIGNATURE_CHECK_PATH="${CASE_REPOSITORY}/${SIGNATURE_TEST_NAME}.xml"
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700321
Jorg Pleumann4613a902009-04-24 13:40:00 -0700322ANDROID_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"
The Android Open Source Project7ca56df2009-03-18 17:39:42 -0700323ANDROID_CORE_VM_TESTS="android.core.vm-tests"
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700324
325#Creating Signature check description xml file, if not existed.
326generateSignatureCheckDescription
327
Bill Napierc8a5cde2009-04-17 14:31:38 -0700328REFERENCE_APP_TESTS="android.apidemos.cts"
329
330API_DEMOS_REFERENCE_NAME="ApiDemosReferenceTest"
331API_DEMOS_REFERENCE_PATH="${CASE_REPOSITORY}/${API_DEMOS_REFERENCE_NAME}.xml"
332
Bill Napier56e6fe12009-04-23 10:15:53 -0700333PERFORMANCE_TESTS="android.performance android.performance2 android.performance3 android.performance4 android.performance5"
334
Bill Napierc8a5cde2009-04-17 14:31:38 -0700335generateReferenceAppDescription "ApiDemosReferenceTest"\
336 ${API_DEMOS_REFERENCE_PATH}\
337 "android.apidemos.cts"\
338 "ApiDemosTest"\
339 "testNumberOfItemsInListView"\
340 "ApiDemos"\
341 "com.example.android.apis"
342
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700343# Every test case package ends with "cts"
344for CASE_SOURCE in $(find ${TESTCASES_SOURCE} -type d | grep "cts$" | sed 's/\/\//\//'); do
345 TARGET_PACKAGE_NAME=$(echo ${CASE_SOURCE} | sed 's/^.*src\///g' | sed 's/\/cts//g' | sed 's/\//./g' | sed 's/android\..*\..*//g')
346
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700347 if [ x${TARGET_PACKAGE_NAME} != x ]; then
348 # TODO: translate this script to python to reduce dependencies on external tools
349 # darwin sed does not support \u in replacement pattern, use perl for now
Phil Dubach48f63bd2009-04-30 17:04:12 -0700350 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')
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700351
352 if [ x${NAME} != x ]; then
Phil Dubach48f63bd2009-04-30 17:04:12 -0700353 # TODO: Currently hard coded as -f4, should find a better way to remove this hard code
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700354 TESTCASE_DIR=$TESTCASES_SOURCE$(echo $CASE_SOURCE | cut -d"/" -f4)
355
Phil Dubach48f63bd2009-04-30 17:04:12 -0700356 # Since case source java packages always end in cts, we need to
357 # start the search for sources in the parent package, so that e.g.
358 # the android.content.cts test package also includes the sources in
359 # android.content.pm.cts.
360 CASE_SOURCE_PARENT=$(echo ${CASE_SOURCE} | sed 's/\/cts$//g')
361 generatePackageDescription ${CASE_SOURCE_PARENT} ${TEMP_DIR}
The Android Open Source Projectf8057102009-03-15 16:47:16 -0700362 addControllerInfo ${TESTCASE_DIR} ${TEMP_DIR} ${NAME} ${TARGET_PACKAGE_NAME}
363 if [[ $? -ne 0 ]]; then
364 exit 1
365 fi
366 fi
367 fi
368done
369
The Android Open Source Project7ca56df2009-03-18 17:39:42 -0700370# Creating the default test plans
371generateAllTestPlans ${CASE_REPOSITORY} ${PLAN_REPOSITORY}