1*b7c941bbSAndroid Build Coastguard Worker#!/bin/bash 2*b7c941bbSAndroid Build Coastguard Worker 3*b7c941bbSAndroid Build Coastguard Worker# Copyright (C) 2024 The Android Open Source Project 4*b7c941bbSAndroid Build Coastguard Worker# 5*b7c941bbSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*b7c941bbSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*b7c941bbSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*b7c941bbSAndroid Build Coastguard Worker# 9*b7c941bbSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*b7c941bbSAndroid Build Coastguard Worker# 11*b7c941bbSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*b7c941bbSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*b7c941bbSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*b7c941bbSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*b7c941bbSAndroid Build Coastguard Worker# limitations under the License. 16*b7c941bbSAndroid Build Coastguard Worker 17*b7c941bbSAndroid Build Coastguard Worker# Command tools to download the released MCTS to local. 18*b7c941bbSAndroid Build Coastguard Worker 19*b7c941bbSAndroid Build Coastguard Worker# Command examples: 20*b7c941bbSAndroid Build Coastguard Worker# 1) First, you need to download the MCTS test cases corresponding to the 21*b7c941bbSAndroid Build Coastguard Worker# Android API level of the DUT. Please use the command below as an example, 22*b7c941bbSAndroid Build Coastguard Worker# remember to input the correct device abi and android version. 23*b7c941bbSAndroid Build Coastguard Worker# Below is an example when the arm64 device is Android U (34). 24*b7c941bbSAndroid Build Coastguard Worker# 25*b7c941bbSAndroid Build Coastguard Worker# ./download_mcts.sh --abi arm64 --android_version 34 26*b7c941bbSAndroid Build Coastguard Worker 27*b7c941bbSAndroid Build Coastguard Worker# 2) Second, you need to download the MCTS test cases corresponding to the 28*b7c941bbSAndroid Build Coastguard Worker# preloaded Mainline Train version of the DUT. If you ensure that the DUT 29*b7c941bbSAndroid Build Coastguard Worker# doesn't have mainline train prebuilt, you can skip this command. 30*b7c941bbSAndroid Build Coastguard Worker# Please use the command below as an example, remember to input the correct 31*b7c941bbSAndroid Build Coastguard Worker# device abi and mainline train version. Below is an example when the 32*b7c941bbSAndroid Build Coastguard Worker# arm64 device preloaded with Mainline train released in Jan 2024. 33*b7c941bbSAndroid Build Coastguard Worker# 34*b7c941bbSAndroid Build Coastguard Worker# ./download_mcts.sh --abi arm64 --year 2024 --month 01 35*b7c941bbSAndroid Build Coastguard Worker 36*b7c941bbSAndroid Build Coastguard Worker# All the files will be downloaded to 37*b7c941bbSAndroid Build Coastguard Worker# $HOME/xts/mcts_dynamic_download/android/xts/mcts/android_version/abi/ 38*b7c941bbSAndroid Build Coastguard Worker 39*b7c941bbSAndroid Build Coastguard Workerset -e 40*b7c941bbSAndroid Build Coastguard Worker 41*b7c941bbSAndroid Build Coastguard Worker# Parse command line arguments 42*b7c941bbSAndroid Build Coastguard Workerwhile [[ $# -gt 0 ]]; do 43*b7c941bbSAndroid Build Coastguard Worker case "$1" in 44*b7c941bbSAndroid Build Coastguard Worker --abi) abi="$2";; # arm64 or x86_64 45*b7c941bbSAndroid Build Coastguard Worker --android_version) android_version="$2";; 46*b7c941bbSAndroid Build Coastguard Worker --year) year="$2";; 47*b7c941bbSAndroid Build Coastguard Worker --month) month="$2";; 48*b7c941bbSAndroid Build Coastguard Worker *) echo "Unknown argument $1"; 49*b7c941bbSAndroid Build Coastguard Worker esac 50*b7c941bbSAndroid Build Coastguard Worker shift # skip key 51*b7c941bbSAndroid Build Coastguard Worker shift # skip value 52*b7c941bbSAndroid Build Coastguard Worker done 53*b7c941bbSAndroid Build Coastguard Worker 54*b7c941bbSAndroid Build Coastguard Workerpath="" 55*b7c941bbSAndroid Build Coastguard Worker 56*b7c941bbSAndroid Build Coastguard Workerif [[ -n ${year} ]] && [[ -n ${month} ]]; then 57*b7c941bbSAndroid Build Coastguard Worker path="${year}-${month}/${abi}" 58*b7c941bbSAndroid Build Coastguard Workerfi 59*b7c941bbSAndroid Build Coastguard Worker 60*b7c941bbSAndroid Build Coastguard Workerif [[ -n ${android_version} ]]; then 61*b7c941bbSAndroid Build Coastguard Worker path="${android_version}/${abi}" 62*b7c941bbSAndroid Build Coastguard Workerfi 63*b7c941bbSAndroid Build Coastguard Worker 64*b7c941bbSAndroid Build Coastguard Workerdir_prefix="$HOME/xts/mcts_dynamic_download/android/xts/mcts" 65*b7c941bbSAndroid Build Coastguard Workerfull_dir_path="$dir_prefix/$path" 66*b7c941bbSAndroid Build Coastguard Workermkdir -p $full_dir_path 67*b7c941bbSAndroid Build Coastguard Worker 68*b7c941bbSAndroid Build Coastguard Workerfunction download_wget_and_curl_if_needed() { 69*b7c941bbSAndroid Build Coastguard Worker if [[ "$OSTYPE" == "linux-gnu" ]] 70*b7c941bbSAndroid Build Coastguard Worker then 71*b7c941bbSAndroid Build Coastguard Worker [[ -x `which wget` ]] || sudo apt-get install wget 72*b7c941bbSAndroid Build Coastguard Worker [[ -x `which curl` ]] || sudo apt-get install curl 73*b7c941bbSAndroid Build Coastguard Worker elif [[ "$OSTYPE" == "darwin"* ]] 74*b7c941bbSAndroid Build Coastguard Worker then 75*b7c941bbSAndroid Build Coastguard Worker [[ -x `which wget` ]] || brew install wget 76*b7c941bbSAndroid Build Coastguard Worker [[ -x `which curl` ]] || sudo apt-get install curl 77*b7c941bbSAndroid Build Coastguard Worker fi 78*b7c941bbSAndroid Build Coastguard Worker} 79*b7c941bbSAndroid Build Coastguard Worker 80*b7c941bbSAndroid Build Coastguard Workerfunction download_mcts() 81*b7c941bbSAndroid Build Coastguard Worker { 82*b7c941bbSAndroid Build Coastguard Worker pushd $full_dir_path > /dev/null 83*b7c941bbSAndroid Build Coastguard Worker local path=$1 84*b7c941bbSAndroid Build Coastguard Worker local file=$2 85*b7c941bbSAndroid Build Coastguard Worker local url="https://dl.google.com/android/xts/mcts/${path}/${file}" 86*b7c941bbSAndroid Build Coastguard Worker # Download the file if it doesn't exist. 87*b7c941bbSAndroid Build Coastguard Worker if [ ! -f ${file} ]; then 88*b7c941bbSAndroid Build Coastguard Worker echo "There is no ${file}, trying to download it" 89*b7c941bbSAndroid Build Coastguard Worker wget -q ${url} || true 90*b7c941bbSAndroid Build Coastguard Worker else 91*b7c941bbSAndroid Build Coastguard Worker echo "There is ${file}, checking if it is up to date" 92*b7c941bbSAndroid Build Coastguard Worker # %W time of file birth, seconds since Epoch 93*b7c941bbSAndroid Build Coastguard Worker # %s seconds since the Epoch (1970-01-01 00:00 UTC) 94*b7c941bbSAndroid Build Coastguard Worker file_download_time=$(date -d "@$(stat -c %W ${file})" +%s ) 95*b7c941bbSAndroid Build Coastguard Worker # The OS Ubuntu below 20.10 version does not support stat command and 96*b7c941bbSAndroid Build Coastguard Worker # return "0" by default, so we need to use debugfs to get the file 97*b7c941bbSAndroid Build Coastguard Worker # creation time. 98*b7c941bbSAndroid Build Coastguard Worker if [[ ${file_download_time} == "0" ]]; then 99*b7c941bbSAndroid Build Coastguard Worker file_download_time=$(get_crtime ${file}) 100*b7c941bbSAndroid Build Coastguard Worker fi 101*b7c941bbSAndroid Build Coastguard Worker url_link_last_modified_string=$(curl -sI ${url} | grep -i "last-modified" | cut -d: -f2- | xargs) 102*b7c941bbSAndroid Build Coastguard Worker url_link_time_stamp=$(date -d "${url_link_last_modified_string}" +%s ) 103*b7c941bbSAndroid Build Coastguard Worker if [[ ${file_download_time} -lt ${url_link_time_stamp} ]]; then 104*b7c941bbSAndroid Build Coastguard Worker echo "The file is out of date, trying to download it" 105*b7c941bbSAndroid Build Coastguard Worker rm ${file} 106*b7c941bbSAndroid Build Coastguard Worker wget -q ${url} || true 107*b7c941bbSAndroid Build Coastguard Worker else 108*b7c941bbSAndroid Build Coastguard Worker echo "The file is up to date, skip downloading" 109*b7c941bbSAndroid Build Coastguard Worker fi 110*b7c941bbSAndroid Build Coastguard Worker fi 111*b7c941bbSAndroid Build Coastguard Worker echo "Done" 112*b7c941bbSAndroid Build Coastguard Worker popd > /dev/null 113*b7c941bbSAndroid Build Coastguard Worker } 114*b7c941bbSAndroid Build Coastguard Worker 115*b7c941bbSAndroid Build Coastguard Workerfunction get_crtime() { 116*b7c941bbSAndroid Build Coastguard Worker local target=$1 117*b7c941bbSAndroid Build Coastguard Worker inode=$(stat -c '%i' "${target}") 118*b7c941bbSAndroid Build Coastguard Worker fs=$(df --output=source "${target}" | tail -1) 119*b7c941bbSAndroid Build Coastguard Worker crtime=$(debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null | grep -oP 'crtime.*--\s*\K.*') 120*b7c941bbSAndroid Build Coastguard Worker file_download_time=$(date -d "${crtime}" +%s) 121*b7c941bbSAndroid Build Coastguard Worker echo ${file_download_time} 122*b7c941bbSAndroid Build Coastguard Worker} 123*b7c941bbSAndroid Build Coastguard Worker 124*b7c941bbSAndroid Build Coastguard Workerfiles=( 125*b7c941bbSAndroid Build Coastguard Worker "android-mcts-adbd.zip" 126*b7c941bbSAndroid Build Coastguard Worker "android-mcts-adservices.zip" 127*b7c941bbSAndroid Build Coastguard Worker "android-mcts-appsearch.zip" 128*b7c941bbSAndroid Build Coastguard Worker "android-mcts-art.zip" 129*b7c941bbSAndroid Build Coastguard Worker "android-mcts-bluetooth.zip" 130*b7c941bbSAndroid Build Coastguard Worker "android-mcts-cellbroadcast.zip" 131*b7c941bbSAndroid Build Coastguard Worker "android-mcts-configinfrastructure.zip" 132*b7c941bbSAndroid Build Coastguard Worker "android-mcts-conscrypt.zip" 133*b7c941bbSAndroid Build Coastguard Worker "android-mcts-cronet.zip" 134*b7c941bbSAndroid Build Coastguard Worker "android-mcts-dnsresolver.zip" 135*b7c941bbSAndroid Build Coastguard Worker "android-mcts-documentsui.zip" 136*b7c941bbSAndroid Build Coastguard Worker "android-mcts-extservices.zip" 137*b7c941bbSAndroid Build Coastguard Worker "android-mcts-healthfitness.zip" 138*b7c941bbSAndroid Build Coastguard Worker "android-mcts-ipsec.zip" 139*b7c941bbSAndroid Build Coastguard Worker "android-mcts-media.zip" 140*b7c941bbSAndroid Build Coastguard Worker "android-mcts-mediaprovider.zip" 141*b7c941bbSAndroid Build Coastguard Worker "android-mcts-networking.zip" 142*b7c941bbSAndroid Build Coastguard Worker "android-mcts-neuralnetworks.zip" 143*b7c941bbSAndroid Build Coastguard Worker "android-mcts-ondevicepersonalization.zip" 144*b7c941bbSAndroid Build Coastguard Worker "android-mcts-permission.zip" 145*b7c941bbSAndroid Build Coastguard Worker "android-mcts-rkpd.zip" 146*b7c941bbSAndroid Build Coastguard Worker "android-mcts-scheduling.zip" 147*b7c941bbSAndroid Build Coastguard Worker "android-mcts-sdkextensions.zip" 148*b7c941bbSAndroid Build Coastguard Worker "android-mcts-statsd.zip" 149*b7c941bbSAndroid Build Coastguard Worker "android-mcts-tethering.zip" 150*b7c941bbSAndroid Build Coastguard Worker "android-mcts-tzdata.zip" 151*b7c941bbSAndroid Build Coastguard Worker "android-mcts-uwb.zip" 152*b7c941bbSAndroid Build Coastguard Worker "android-mcts-wifi.zip" 153*b7c941bbSAndroid Build Coastguard Worker) 154*b7c941bbSAndroid Build Coastguard Worker 155*b7c941bbSAndroid Build Coastguard Workerdownload_wget_and_curl_if_needed 156*b7c941bbSAndroid Build Coastguard Workerecho "The files will be download at $full_dir_path" 157*b7c941bbSAndroid Build Coastguard Workerfor file in ${files[@]}; do 158*b7c941bbSAndroid Build Coastguard Worker download_mcts $path $file 159*b7c941bbSAndroid Build Coastguard Workerdone 160*b7c941bbSAndroid Build Coastguard Workerchmod -R 777 $full_dir_path 161*b7c941bbSAndroid Build Coastguard Workerfor file in $full_dir_path/* ; do 162*b7c941bbSAndroid Build Coastguard Worker echo "touch $file to update the timestamp" 163*b7c941bbSAndroid Build Coastguard Worker touch $file 164*b7c941bbSAndroid Build Coastguard Workerdone 165*b7c941bbSAndroid Build Coastguard Worker 166*b7c941bbSAndroid Build Coastguard Workerecho "Download all files" 167