1*795d594fSAndroid Build Coastguard Worker#!/bin/bash 2*795d594fSAndroid Build Coastguard Worker# 3*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2015 The Android Open Source Project 4*795d594fSAndroid Build Coastguard Worker# 5*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*795d594fSAndroid Build Coastguard Worker# 9*795d594fSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*795d594fSAndroid Build Coastguard Worker# 11*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*795d594fSAndroid Build Coastguard Worker# limitations under the License. 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker# Set up prog to be the path of this script, including following symlinks, 18*795d594fSAndroid Build Coastguard Worker# and set up progdir to be the fully-qualified pathname of its directory. 19*795d594fSAndroid Build Coastguard Workerprog="$0" 20*795d594fSAndroid Build Coastguard Workerwhile [ -h "${prog}" ]; do 21*795d594fSAndroid Build Coastguard Worker newProg=`/bin/ls -ld "${prog}"` 22*795d594fSAndroid Build Coastguard Worker newProg=`expr "${newProg}" : ".* -> \(.*\)$"` 23*795d594fSAndroid Build Coastguard Worker if expr "x${newProg}" : 'x/' >/dev/null; then 24*795d594fSAndroid Build Coastguard Worker prog="${newProg}" 25*795d594fSAndroid Build Coastguard Worker else 26*795d594fSAndroid Build Coastguard Worker progdir=`dirname "${prog}"` 27*795d594fSAndroid Build Coastguard Worker prog="${progdir}/${newProg}" 28*795d594fSAndroid Build Coastguard Worker fi 29*795d594fSAndroid Build Coastguard Workerdone 30*795d594fSAndroid Build Coastguard Workeroldwd=`pwd` 31*795d594fSAndroid Build Coastguard Workerprogdir=`dirname "${prog}"` 32*795d594fSAndroid Build Coastguard Workercd "${progdir}" 33*795d594fSAndroid Build Coastguard Workerprogdir=`pwd` 34*795d594fSAndroid Build Coastguard Workerprog="${progdir}"/`basename "${prog}"` 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Worker# Set up a temp directory for output. 37*795d594fSAndroid Build Coastguard Workertmpdir=/tmp/test-$$ 38*795d594fSAndroid Build Coastguard Workermkdir ${tmpdir} 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker# Set up tools and commands to run 41*795d594fSAndroid Build Coastguard WorkerDEXDUMP="${ANDROID_HOST_OUT}/bin/dexdump" 42*795d594fSAndroid Build Coastguard WorkerDEXLIST="${ANDROID_HOST_OUT}/bin/dexlist" 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Workerdeclare -A SUFFIX_COMMAND_MAP 45*795d594fSAndroid Build Coastguard WorkerSUFFIX_COMMAND_MAP[txt]="${DEXDUMP} -adfh" 46*795d594fSAndroid Build Coastguard WorkerSUFFIX_COMMAND_MAP[xml]="${DEXDUMP} -e -l xml" 47*795d594fSAndroid Build Coastguard WorkerSUFFIX_COMMAND_MAP[lst]="${DEXLIST}" 48*795d594fSAndroid Build Coastguard Worker 49*795d594fSAndroid Build Coastguard WorkerALL_DEX_FILES_JAR=all-dex-files.jar 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker# Parse command-line options 52*795d594fSAndroid Build Coastguard WorkerUPDATE="no" 53*795d594fSAndroid Build Coastguard WorkerUSAGE="no" 54*795d594fSAndroid Build Coastguard Workerwhile [ $# -ne 0 ]; do 55*795d594fSAndroid Build Coastguard Worker case "$1" in 56*795d594fSAndroid Build Coastguard Worker --update) 57*795d594fSAndroid Build Coastguard Worker UPDATE="yes" 58*795d594fSAndroid Build Coastguard Worker ;; 59*795d594fSAndroid Build Coastguard Worker *) 60*795d594fSAndroid Build Coastguard Worker echo "Unknown option $1" 1>&2 61*795d594fSAndroid Build Coastguard Worker USAGE="yes" 62*795d594fSAndroid Build Coastguard Worker ;; 63*795d594fSAndroid Build Coastguard Worker esac 64*795d594fSAndroid Build Coastguard Worker shift 65*795d594fSAndroid Build Coastguard Workerdone 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Workerif [ "${USAGE}" = "yes" ]; then 68*795d594fSAndroid Build Coastguard Worker cat 1>&2 <<USAGE_END 69*795d594fSAndroid Build Coastguard WorkerUsage: 70*795d594fSAndroid Build Coastguard Worker ${prog##*/} [--update] 71*795d594fSAndroid Build Coastguard WorkerOptions: 72*795d594fSAndroid Build Coastguard Worker --update Update reference outputs 73*795d594fSAndroid Build Coastguard WorkerUSAGE_END 74*795d594fSAndroid Build Coastguard Worker exit 1 75*795d594fSAndroid Build Coastguard Workerfi 76*795d594fSAndroid Build Coastguard Worker 77*795d594fSAndroid Build Coastguard Workerif [ "${UPDATE}" = "yes" ]; then 78*795d594fSAndroid Build Coastguard Worker for dex in *.dex; do 79*795d594fSAndroid Build Coastguard Worker for suffix in ${!SUFFIX_COMMAND_MAP[@]}; do 80*795d594fSAndroid Build Coastguard Worker new_output=${dex%%.*}.${suffix} 81*795d594fSAndroid Build Coastguard Worker ${SUFFIX_COMMAND_MAP[${suffix}]} ${dex} > ${new_output} 82*795d594fSAndroid Build Coastguard Worker if [ $? -ne 0 ]; then 83*795d594fSAndroid Build Coastguard Worker echo "Failed running ${SUFFIX_COMMAND_MAP[${suffix}]} ${dex} > ${new_output}" 2>&1 84*795d594fSAndroid Build Coastguard Worker exit 1 85*795d594fSAndroid Build Coastguard Worker fi 86*795d594fSAndroid Build Coastguard Worker done 87*795d594fSAndroid Build Coastguard Worker done 88*795d594fSAndroid Build Coastguard Worker 89*795d594fSAndroid Build Coastguard Worker # Create a .jar file containing all dex files, renamed as expected by the runtime. 90*795d594fSAndroid Build Coastguard Worker count=0 91*795d594fSAndroid Build Coastguard Worker for i in *.dex; do 92*795d594fSAndroid Build Coastguard Worker if [ ${count} = 0 ] ; then 93*795d594fSAndroid Build Coastguard Worker dex_file=classes.dex 94*795d594fSAndroid Build Coastguard Worker flags="-cf" 95*795d594fSAndroid Build Coastguard Worker else 96*795d594fSAndroid Build Coastguard Worker dex_file=classes${count}.dex 97*795d594fSAndroid Build Coastguard Worker flags="-uf" 98*795d594fSAndroid Build Coastguard Worker fi 99*795d594fSAndroid Build Coastguard Worker cp $i ${tmpdir}/${dex_file} 100*795d594fSAndroid Build Coastguard Worker jar ${flags} ${ALL_DEX_FILES_JAR} -C ${tmpdir} ${dex_file} 101*795d594fSAndroid Build Coastguard Worker ((count += 1)) 102*795d594fSAndroid Build Coastguard Worker rm ${tmpdir}/${dex_file} 103*795d594fSAndroid Build Coastguard Worker done 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker prefix=$(basename ${ALL_DEX_FILES_JAR} .jar) 106*795d594fSAndroid Build Coastguard Worker for suffix in ${!SUFFIX_COMMAND_MAP[@]}; do 107*795d594fSAndroid Build Coastguard Worker new_output=${prefix}.${suffix} 108*795d594fSAndroid Build Coastguard Worker ${SUFFIX_COMMAND_MAP[${suffix}]} ${ALL_DEX_FILES_JAR} > ${new_output} 109*795d594fSAndroid Build Coastguard Worker done 110*795d594fSAndroid Build Coastguard Worker 111*795d594fSAndroid Build Coastguard Worker exit 0 112*795d594fSAndroid Build Coastguard Workerfi 113*795d594fSAndroid Build Coastguard Worker 114*795d594fSAndroid Build Coastguard Worker# Run the tests. 115*795d594fSAndroid Build Coastguard Workerpassed=0 116*795d594fSAndroid Build Coastguard Workerfailed=0 117*795d594fSAndroid Build Coastguard Workerfor input in *.dex *.jar; do 118*795d594fSAndroid Build Coastguard Worker echo ${input} 119*795d594fSAndroid Build Coastguard Worker for suffix in ${!SUFFIX_COMMAND_MAP[@]}; do 120*795d594fSAndroid Build Coastguard Worker expected_output=${input%%.*}.${suffix} 121*795d594fSAndroid Build Coastguard Worker actual_output=${tmpdir}/${expected_output} 122*795d594fSAndroid Build Coastguard Worker cmd="${SUFFIX_COMMAND_MAP[${suffix}]} ${input}" 123*795d594fSAndroid Build Coastguard Worker ${cmd} > ${actual_output} 124*795d594fSAndroid Build Coastguard Worker cmp ${expected_output} ${actual_output} 125*795d594fSAndroid Build Coastguard Worker if [ "$?" = "0" ]; then 126*795d594fSAndroid Build Coastguard Worker ((passed += 1)) 127*795d594fSAndroid Build Coastguard Worker else 128*795d594fSAndroid Build Coastguard Worker ((failed += 1)) 129*795d594fSAndroid Build Coastguard Worker echo failed: ${cmd} 130*795d594fSAndroid Build Coastguard Worker fi 131*795d594fSAndroid Build Coastguard Worker done 132*795d594fSAndroid Build Coastguard Workerdone 133*795d594fSAndroid Build Coastguard Worker 134*795d594fSAndroid Build Coastguard Worker# Report results. 135*795d594fSAndroid Build Coastguard Workerecho 136*795d594fSAndroid Build Coastguard Workerecho "passed: ${passed} test(s)" 137*795d594fSAndroid Build Coastguard Workerecho "failed: ${failed} test(s)" 138*795d594fSAndroid Build Coastguard Workerecho 139*795d594fSAndroid Build Coastguard Worker 140*795d594fSAndroid Build Coastguard Worker# Clean up, cd back to original dir. 141*795d594fSAndroid Build Coastguard Workerrm -rf ${tmpdir} 142*795d594fSAndroid Build Coastguard Workercd ${oldwd} 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker# Return status. 145*795d594fSAndroid Build Coastguard Workerif [ "${failed}" != "0" ]; then 146*795d594fSAndroid Build Coastguard Worker echo failed 147*795d594fSAndroid Build Coastguard Worker exit 1 148*795d594fSAndroid Build Coastguard Workerfi 149*795d594fSAndroid Build Coastguard Workerexit 0 150*795d594fSAndroid Build Coastguard Worker 151