1*795d594fSAndroid Build Coastguard Worker#!/bin/bash 2*795d594fSAndroid Build Coastguard Worker 3*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2018 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 18*795d594fSAndroid Build Coastguard Workerset -e 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker# Run ART APEX tests. 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard WorkerSCRIPT_DIR=$(dirname $0) 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker# Status of whole test script. 25*795d594fSAndroid Build Coastguard Workerexit_status=0 26*795d594fSAndroid Build Coastguard Worker# Status of current test suite. 27*795d594fSAndroid Build Coastguard Workertest_status=0 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Workerfunction say { 30*795d594fSAndroid Build Coastguard Worker echo "$0: $*" 31*795d594fSAndroid Build Coastguard Worker} 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Workerfunction die { 34*795d594fSAndroid Build Coastguard Worker echo "$0: $*" 35*795d594fSAndroid Build Coastguard Worker exit 1 36*795d594fSAndroid Build Coastguard Worker} 37*795d594fSAndroid Build Coastguard Worker 38*795d594fSAndroid Build Coastguard Workerif [[ -z "$ANDROID_BUILD_TOP" ]]; then 39*795d594fSAndroid Build Coastguard Worker export ANDROID_BUILD_TOP=$(pwd) 40*795d594fSAndroid Build Coastguard Worker if [[ ! -x "$ANDROID_BUILD_TOP/build/soong/soong_ui.bash" ]]; then 41*795d594fSAndroid Build Coastguard Worker die "Run from the root of the Android tree, or run lunch/banchan/tapas first." 42*795d594fSAndroid Build Coastguard Worker fi 43*795d594fSAndroid Build Coastguard Workerfi 44*795d594fSAndroid Build Coastguard Worker 45*795d594fSAndroid Build Coastguard Workerquery_build_vars=( 46*795d594fSAndroid Build Coastguard Worker HOST_OUT 47*795d594fSAndroid Build Coastguard Worker PRODUCT_COMPRESSED_APEX 48*795d594fSAndroid Build Coastguard Worker PRODUCT_OUT 49*795d594fSAndroid Build Coastguard Worker) 50*795d594fSAndroid Build Coastguard Workervars="$($ANDROID_BUILD_TOP/build/soong/soong_ui.bash \ 51*795d594fSAndroid Build Coastguard Worker --dumpvars-mode --vars="${query_build_vars[*]}")" 52*795d594fSAndroid Build Coastguard Worker# Assign to a variable and eval that, since bash ignores any error status from 53*795d594fSAndroid Build Coastguard Worker# the command substitution if it's directly on the eval line. 54*795d594fSAndroid Build Coastguard Workereval $vars 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker# Switch the build system to unbundled mode in the reduced manifest branch. 57*795d594fSAndroid Build Coastguard Workerif [ ! -d $ANDROID_BUILD_TOP/frameworks/base ]; then 58*795d594fSAndroid Build Coastguard Worker export TARGET_BUILD_UNBUNDLED=true 59*795d594fSAndroid Build Coastguard Workerfi 60*795d594fSAndroid Build Coastguard Worker 61*795d594fSAndroid Build Coastguard Workerdeapex_binaries=( 62*795d594fSAndroid Build Coastguard Worker deapexer 63*795d594fSAndroid Build Coastguard Worker debugfs_static 64*795d594fSAndroid Build Coastguard Worker fsck.erofs 65*795d594fSAndroid Build Coastguard Worker) 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Workerhave_deapex_binaries=true 68*795d594fSAndroid Build Coastguard Workerfor f in ${deapex_binaries[@]}; do 69*795d594fSAndroid Build Coastguard Worker if [ ! -e "$HOST_OUT/bin/$f" ]; then 70*795d594fSAndroid Build Coastguard Worker have_deapex_binaries=false 71*795d594fSAndroid Build Coastguard Worker fi 72*795d594fSAndroid Build Coastguard Workerdone 73*795d594fSAndroid Build Coastguard Workerif $have_deapex_binaries; then :; else 74*795d594fSAndroid Build Coastguard Worker deapex_targets=( ${deapex_binaries[@]/%/-host} ) 75*795d594fSAndroid Build Coastguard Worker say "Building host binaries for deapexer: ${deapex_targets[*]}" 76*795d594fSAndroid Build Coastguard Worker build/soong/soong_ui.bash --make-mode ${deapex_targets[@]} || \ 77*795d594fSAndroid Build Coastguard Worker die "Failed to build: ${deapex_targets[*]}" 78*795d594fSAndroid Build Coastguard Workerfi 79*795d594fSAndroid Build Coastguard Worker 80*795d594fSAndroid Build Coastguard Worker# Fail early. 81*795d594fSAndroid Build Coastguard Workerset -e 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Workerbuild_apex_p=true 84*795d594fSAndroid Build Coastguard Workerlist_image_files_p=false 85*795d594fSAndroid Build Coastguard Workerprint_image_tree_p=false 86*795d594fSAndroid Build Coastguard Workerprint_file_sizes_p=false 87*795d594fSAndroid Build Coastguard Worker 88*795d594fSAndroid Build Coastguard Workerfunction usage { 89*795d594fSAndroid Build Coastguard Worker cat <<EOF 90*795d594fSAndroid Build Coastguard WorkerUsage: $0 [OPTION] [apexes...] 91*795d594fSAndroid Build Coastguard WorkerBuild (optional) and run tests on ART APEX package (on host). Defaults to all 92*795d594fSAndroid Build Coastguard Workerapplicable APEXes if none is given on the command line. 93*795d594fSAndroid Build Coastguard Worker 94*795d594fSAndroid Build Coastguard Worker -B, --skip-build skip the build step 95*795d594fSAndroid Build Coastguard Worker -l, --list-files list the contents of the ext4 image (\`find\`-like style) 96*795d594fSAndroid Build Coastguard Worker -t, --print-tree list the contents of the ext4 image (\`tree\`-like style) 97*795d594fSAndroid Build Coastguard Worker -s, --print-sizes print the size in bytes of each file when listing contents 98*795d594fSAndroid Build Coastguard Worker --bitness=32|64|multilib|auto passed on to art_apex_test.py 99*795d594fSAndroid Build Coastguard Worker -h, --help display this help and exit 100*795d594fSAndroid Build Coastguard Worker 101*795d594fSAndroid Build Coastguard WorkerEOF 102*795d594fSAndroid Build Coastguard Worker exit 103*795d594fSAndroid Build Coastguard Worker} 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Workerdevice_bitness_arg="" 106*795d594fSAndroid Build Coastguard Workerapex_modules=() 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Workerwhile [[ $# -gt 0 ]]; do 109*795d594fSAndroid Build Coastguard Worker case "$1" in 110*795d594fSAndroid Build Coastguard Worker (-B|--skip-build) build_apex_p=false;; 111*795d594fSAndroid Build Coastguard Worker (-l|--list-files) list_image_files_p=true;; 112*795d594fSAndroid Build Coastguard Worker (-t|--print-tree) print_image_tree_p=true;; 113*795d594fSAndroid Build Coastguard Worker (-s|--print-sizes) print_file_sizes_p=true;; 114*795d594fSAndroid Build Coastguard Worker (--bitness=*) device_bitness_arg=$1;; 115*795d594fSAndroid Build Coastguard Worker (-h|--help) usage;; 116*795d594fSAndroid Build Coastguard Worker (-*) die "Unknown option: '$1' 117*795d594fSAndroid Build Coastguard WorkerTry '$0 --help' for more information.";; 118*795d594fSAndroid Build Coastguard Worker (*) apex_modules+=($1);; 119*795d594fSAndroid Build Coastguard Worker esac 120*795d594fSAndroid Build Coastguard Worker shift 121*795d594fSAndroid Build Coastguard Workerdone 122*795d594fSAndroid Build Coastguard Worker 123*795d594fSAndroid Build Coastguard Worker# build_apex APEX_MODULES 124*795d594fSAndroid Build Coastguard Worker# ----------------------- 125*795d594fSAndroid Build Coastguard Worker# Build APEX packages APEX_MODULES. 126*795d594fSAndroid Build Coastguard Workerfunction build_apex { 127*795d594fSAndroid Build Coastguard Worker if $build_apex_p; then 128*795d594fSAndroid Build Coastguard Worker say "Building $@" && build/soong/soong_ui.bash --make-mode "$@" || die "Cannot build $@" 129*795d594fSAndroid Build Coastguard Worker fi 130*795d594fSAndroid Build Coastguard Worker} 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Worker# maybe_list_apex_contents_apex APEX TMPDIR [other] 133*795d594fSAndroid Build Coastguard Workerfunction maybe_list_apex_contents_apex { 134*795d594fSAndroid Build Coastguard Worker local print_options=() 135*795d594fSAndroid Build Coastguard Worker if $print_file_sizes_p; then 136*795d594fSAndroid Build Coastguard Worker print_options+=(--size) 137*795d594fSAndroid Build Coastguard Worker fi 138*795d594fSAndroid Build Coastguard Worker 139*795d594fSAndroid Build Coastguard Worker # List the contents of the apex in list form. 140*795d594fSAndroid Build Coastguard Worker if $list_image_files_p; then 141*795d594fSAndroid Build Coastguard Worker say "Listing image files" 142*795d594fSAndroid Build Coastguard Worker $SCRIPT_DIR/art_apex_test.py --list ${print_options[@]} $@ 143*795d594fSAndroid Build Coastguard Worker fi 144*795d594fSAndroid Build Coastguard Worker 145*795d594fSAndroid Build Coastguard Worker # List the contents of the apex in tree form. 146*795d594fSAndroid Build Coastguard Worker if $print_image_tree_p; then 147*795d594fSAndroid Build Coastguard Worker say "Printing image tree" 148*795d594fSAndroid Build Coastguard Worker $SCRIPT_DIR/art_apex_test.py --tree ${print_options[@]} $@ 149*795d594fSAndroid Build Coastguard Worker fi 150*795d594fSAndroid Build Coastguard Worker} 151*795d594fSAndroid Build Coastguard Worker 152*795d594fSAndroid Build Coastguard Workerfunction fail_check { 153*795d594fSAndroid Build Coastguard Worker echo "$0: FAILED: $*" 154*795d594fSAndroid Build Coastguard Worker test_status=1 155*795d594fSAndroid Build Coastguard Worker exit_status=1 156*795d594fSAndroid Build Coastguard Worker} 157*795d594fSAndroid Build Coastguard Worker 158*795d594fSAndroid Build Coastguard Workerif [ ${#apex_modules[@]} -eq 0 ]; then 159*795d594fSAndroid Build Coastguard Worker # Test as many modules as possible. 160*795d594fSAndroid Build Coastguard Worker apex_modules=( 161*795d594fSAndroid Build Coastguard Worker "com.android.art" 162*795d594fSAndroid Build Coastguard Worker "com.android.art.debug" 163*795d594fSAndroid Build Coastguard Worker "com.android.art.testing" 164*795d594fSAndroid Build Coastguard Worker ) 165*795d594fSAndroid Build Coastguard Workerfi 166*795d594fSAndroid Build Coastguard Worker 167*795d594fSAndroid Build Coastguard Worker# Build the APEX packages (optional). 168*795d594fSAndroid Build Coastguard Workerbuild_apex ${apex_modules[@]} 169*795d594fSAndroid Build Coastguard Worker 170*795d594fSAndroid Build Coastguard Worker# Clean-up. 171*795d594fSAndroid Build Coastguard Workerfunction cleanup { 172*795d594fSAndroid Build Coastguard Worker rm -rf "$work_dir" 173*795d594fSAndroid Build Coastguard Worker} 174*795d594fSAndroid Build Coastguard Worker 175*795d594fSAndroid Build Coastguard Worker# Garbage collection. 176*795d594fSAndroid Build Coastguard Workerfunction finish { 177*795d594fSAndroid Build Coastguard Worker # Don't fail early during cleanup. 178*795d594fSAndroid Build Coastguard Worker set +e 179*795d594fSAndroid Build Coastguard Worker cleanup 180*795d594fSAndroid Build Coastguard Worker} 181*795d594fSAndroid Build Coastguard Worker 182*795d594fSAndroid Build Coastguard Workerfor apex_module in ${apex_modules[@]}; do 183*795d594fSAndroid Build Coastguard Worker test_status=0 184*795d594fSAndroid Build Coastguard Worker say "Checking APEX package $apex_module" 185*795d594fSAndroid Build Coastguard Worker work_dir=$(mktemp -d) 186*795d594fSAndroid Build Coastguard Worker trap finish EXIT 187*795d594fSAndroid Build Coastguard Worker 188*795d594fSAndroid Build Coastguard Worker art_apex_test_args="--tmpdir $work_dir" 189*795d594fSAndroid Build Coastguard Worker test_only_args="" 190*795d594fSAndroid Build Coastguard Worker art_apex_test_args="$art_apex_test_args $device_bitness_arg" 191*795d594fSAndroid Build Coastguard Worker # Note: The Testing ART APEX is never built as a Compressed APEX. 192*795d594fSAndroid Build Coastguard Worker if [[ "$PRODUCT_COMPRESSED_APEX" = true && $apex_module != *.testing ]]; then 193*795d594fSAndroid Build Coastguard Worker apex_path="$PRODUCT_OUT/system/apex/${apex_module}.capex" 194*795d594fSAndroid Build Coastguard Worker else 195*795d594fSAndroid Build Coastguard Worker apex_path="$PRODUCT_OUT/system/apex/${apex_module}.apex" 196*795d594fSAndroid Build Coastguard Worker fi 197*795d594fSAndroid Build Coastguard Worker if $have_deapex_binaries; then 198*795d594fSAndroid Build Coastguard Worker art_apex_test_args="$art_apex_test_args --deapexer $HOST_OUT/bin/deapexer" 199*795d594fSAndroid Build Coastguard Worker art_apex_test_args="$art_apex_test_args --debugfs $HOST_OUT/bin/debugfs_static" 200*795d594fSAndroid Build Coastguard Worker art_apex_test_args="$art_apex_test_args --fsckerofs $HOST_OUT/bin/fsck.erofs" 201*795d594fSAndroid Build Coastguard Worker fi 202*795d594fSAndroid Build Coastguard Worker case $apex_module in 203*795d594fSAndroid Build Coastguard Worker (*.debug) test_only_args="--flavor debug";; 204*795d594fSAndroid Build Coastguard Worker (*.testing) test_only_args="--flavor testing";; 205*795d594fSAndroid Build Coastguard Worker (*) test_only_args="--flavor release";; 206*795d594fSAndroid Build Coastguard Worker esac 207*795d594fSAndroid Build Coastguard Worker say "APEX package path: $apex_path" 208*795d594fSAndroid Build Coastguard Worker 209*795d594fSAndroid Build Coastguard Worker # List the contents of the APEX image (optional). 210*795d594fSAndroid Build Coastguard Worker maybe_list_apex_contents_apex $art_apex_test_args $apex_path 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker # Run tests on APEX package. 213*795d594fSAndroid Build Coastguard Worker $SCRIPT_DIR/art_apex_test.py $art_apex_test_args $test_only_args $apex_path \ 214*795d594fSAndroid Build Coastguard Worker || fail_check "Checks failed on $apex_module" 215*795d594fSAndroid Build Coastguard Worker 216*795d594fSAndroid Build Coastguard Worker # Clean up. 217*795d594fSAndroid Build Coastguard Worker trap - EXIT 218*795d594fSAndroid Build Coastguard Worker cleanup 219*795d594fSAndroid Build Coastguard Worker 220*795d594fSAndroid Build Coastguard Worker [[ "$test_status" = 0 ]] && say "$apex_module tests passed" 221*795d594fSAndroid Build Coastguard Worker echo 222*795d594fSAndroid Build Coastguard Workerdone 223*795d594fSAndroid Build Coastguard Worker 224*795d594fSAndroid Build Coastguard Worker[[ "$exit_status" = 0 ]] && say "All ART APEX tests passed" 225*795d594fSAndroid Build Coastguard Worker 226*795d594fSAndroid Build Coastguard Workerexit $exit_status 227