1*b3adc34aSAndroid Build Coastguard Worker#!/usr/bin/env bash 2*b3adc34aSAndroid Build Coastguard Worker# 3*b3adc34aSAndroid Build Coastguard Worker# Copyright 2019, The Android Open Source Project 4*b3adc34aSAndroid Build Coastguard Worker# 5*b3adc34aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*b3adc34aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*b3adc34aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*b3adc34aSAndroid Build Coastguard Worker# 9*b3adc34aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*b3adc34aSAndroid Build Coastguard Worker# 11*b3adc34aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*b3adc34aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*b3adc34aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*b3adc34aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*b3adc34aSAndroid Build Coastguard Worker# limitations under the License. 16*b3adc34aSAndroid Build Coastguard Worker 17*b3adc34aSAndroid Build Coastguard Worker# Variables that will be used inside of containers. 18*b3adc34aSAndroid Build Coastguard WorkerSRCTOP="/home/$USER/aosp" 19*b3adc34aSAndroid Build Coastguard WorkerTARGET="aosp_cf_x86_phone-userdebug" 20*b3adc34aSAndroid Build Coastguard Worker# Variables that will be used when creating docker image. 21*b3adc34aSAndroid Build Coastguard WorkerIMAGE="aosp/asuite" 22*b3adc34aSAndroid Build Coastguard WorkerDOCKERFILE_DIR=$(realpath $(dirname $0)/..) 23*b3adc34aSAndroid Build Coastguard Worker 24*b3adc34aSAndroid Build Coastguard Worker# The core functional tests for AIDEGen. 25*b3adc34aSAndroid Build Coastguard Workerfunction run_functiontests() { 26*b3adc34aSAndroid Build Coastguard Worker local target="aidegen_functional_test" 27*b3adc34aSAndroid Build Coastguard Worker if ! m $target; then 28*b3adc34aSAndroid Build Coastguard Worker echo -e "\n[Error] Fail to build $target.\n" 29*b3adc34aSAndroid Build Coastguard Worker exit 1 30*b3adc34aSAndroid Build Coastguard Worker fi 31*b3adc34aSAndroid Build Coastguard Worker if ! ${target}-dev -b; then 32*b3adc34aSAndroid Build Coastguard Worker echo -e "\n[Error] Fail to run ${target}-dev.\n" 33*b3adc34aSAndroid Build Coastguard Worker exit 1 34*b3adc34aSAndroid Build Coastguard Worker fi 35*b3adc34aSAndroid Build Coastguard Worker} 36*b3adc34aSAndroid Build Coastguard Worker 37*b3adc34aSAndroid Build Coastguard Worker# Initialize $ANDROID_BUILD_TOP in container and install m(). 38*b3adc34aSAndroid Build Coastguard Workerfunction check_env() { 39*b3adc34aSAndroid Build Coastguard Worker if [[ -z "$ANDROID_BUILD_TOP" ]]; then 40*b3adc34aSAndroid Build Coastguard Worker if [[ "$IS_CONTAINER" = "true" ]]; then 41*b3adc34aSAndroid Build Coastguard Worker pushd "$SRCTOP" 42*b3adc34aSAndroid Build Coastguard Worker source build/envsetup.sh && lunch $TARGET 43*b3adc34aSAndroid Build Coastguard Worker popd 44*b3adc34aSAndroid Build Coastguard Worker else 45*b3adc34aSAndroid Build Coastguard Worker echo -ne "\n[Error] Missing \$ANDROID_BUILD_TOP variable. " 46*b3adc34aSAndroid Build Coastguard Worker echo -e "Please run 'lunch' first.\n" 47*b3adc34aSAndroid Build Coastguard Worker exit 1 48*b3adc34aSAndroid Build Coastguard Worker fi 49*b3adc34aSAndroid Build Coastguard Worker fi 50*b3adc34aSAndroid Build Coastguard Worker function m() { 51*b3adc34aSAndroid Build Coastguard Worker echo "[Info] m $@" 52*b3adc34aSAndroid Build Coastguard Worker ${ANDROID_BUILD_TOP}/build/soong/soong_ui.bash --make-mode "$@" 53*b3adc34aSAndroid Build Coastguard Worker } 54*b3adc34aSAndroid Build Coastguard Worker [[ $(uname -s) = "Darwin" ]] && export IS_CONTAINER=true 55*b3adc34aSAndroid Build Coastguard Worker} 56*b3adc34aSAndroid Build Coastguard Worker 57*b3adc34aSAndroid Build Coastguard Worker# TODO: Move this method to asuite.sh. 58*b3adc34aSAndroid Build Coastguard Workerfunction build_docker_image() { 59*b3adc34aSAndroid Build Coastguard Worker echo "[Info] Start building Docker image $IMAGE..." 60*b3adc34aSAndroid Build Coastguard Worker build_cmd="docker build --rm --force-rm --no-cache \ 61*b3adc34aSAndroid Build Coastguard Worker --build-arg USER=$USER \ 62*b3adc34aSAndroid Build Coastguard Worker --build-arg UID=$UID \ 63*b3adc34aSAndroid Build Coastguard Worker --build-arg SRCTOP=$SRCTOP \ 64*b3adc34aSAndroid Build Coastguard Worker -t $IMAGE $DOCKERFILE_DIR" 65*b3adc34aSAndroid Build Coastguard Worker if ! eval $build_cmd; then 66*b3adc34aSAndroid Build Coastguard Worker echo -e "\n[Error] Failed to build docker image." 67*b3adc34aSAndroid Build Coastguard Worker exit 1 68*b3adc34aSAndroid Build Coastguard Worker fi 69*b3adc34aSAndroid Build Coastguard Worker} 70*b3adc34aSAndroid Build Coastguard Worker 71*b3adc34aSAndroid Build Coastguard Worker# TODO: Move this method to asuite.sh. 72*b3adc34aSAndroid Build Coastguard Workerfunction run_docker_instance() { 73*b3adc34aSAndroid Build Coastguard Worker echo "[Info] Start a Docker container..." 74*b3adc34aSAndroid Build Coastguard Worker docker run --rm -v $ANDROID_BUILD_TOP:$SRCTOP $IMAGE prebuilts/asuite/aidegen/smoke_tests 75*b3adc34aSAndroid Build Coastguard Worker} 76*b3adc34aSAndroid Build Coastguard Worker 77*b3adc34aSAndroid Build Coastguard Worker# TODO: Move this method to asuite.sh. 78*b3adc34aSAndroid Build Coastguard Workerfunction has_docker() { 79*b3adc34aSAndroid Build Coastguard Worker [[ "$IS_CONTAINER" = "true" ]] && return 1 80*b3adc34aSAndroid Build Coastguard Worker if ! systemctl is-active docker -q; then 81*b3adc34aSAndroid Build Coastguard Worker echo "[Error] Docker daemon not running." 82*b3adc34aSAndroid Build Coastguard Worker exit 1 83*b3adc34aSAndroid Build Coastguard Worker elif ! docker ps -q 2>/dev/null; then 84*b3adc34aSAndroid Build Coastguard Worker echo "[Error] $USER not in docker group." 85*b3adc34aSAndroid Build Coastguard Worker exit 1 86*b3adc34aSAndroid Build Coastguard Worker fi 87*b3adc34aSAndroid Build Coastguard Worker} 88*b3adc34aSAndroid Build Coastguard Worker 89*b3adc34aSAndroid Build Coastguard Worker# TODO: Move this method to asuite.sh. 90*b3adc34aSAndroid Build Coastguard Workerfunction has_docker_image() { 91*b3adc34aSAndroid Build Coastguard Worker image_id=$(docker images --filter=reference=$IMAGE --format "{{.ID}}") 92*b3adc34aSAndroid Build Coastguard Worker if [[ -z $image_id ]]; then 93*b3adc34aSAndroid Build Coastguard Worker echo "[Info] Docker image $IMAGE not found." 94*b3adc34aSAndroid Build Coastguard Worker return 1 95*b3adc34aSAndroid Build Coastguard Worker fi 96*b3adc34aSAndroid Build Coastguard Worker} 97*b3adc34aSAndroid Build Coastguard Worker 98*b3adc34aSAndroid Build Coastguard Workerfunction helper() { 99*b3adc34aSAndroid Build Coastguard Worker cat << END 100*b3adc34aSAndroid Build Coastguard WorkerUsage: 101*b3adc34aSAndroid Build Coastguard Worker 102*b3adc34aSAndroid Build Coastguard Workersmoke_tests: run aidegen functional tests. If docker is unavailable, run 103*b3adc34aSAndroid Build Coastguard Worker functional test directly; otherwise build necessary image before 104*b3adc34aSAndroid Build Coastguard Worker running tests. 105*b3adc34aSAndroid Build Coastguard Workersmoke_tests -m: force rebuilding a new image and running smoke testing, 106*b3adc34aSAndroid Build Coastguard Worker especially after a new Dockerfile has been updated. 107*b3adc34aSAndroid Build Coastguard Worker 108*b3adc34aSAndroid Build Coastguard WorkerWhenever needs to access the instance for investigation, please issue: 109*b3adc34aSAndroid Build Coastguard Worker docker run -it -v $ANDROID_BUILD_TOP:$SRCTOP $IMAGE bash 110*b3adc34aSAndroid Build Coastguard Worker 111*b3adc34aSAndroid Build Coastguard WorkerEND 112*b3adc34aSAndroid Build Coastguard Worker exit 0 113*b3adc34aSAndroid Build Coastguard Worker} 114*b3adc34aSAndroid Build Coastguard Worker 115*b3adc34aSAndroid Build Coastguard Worker# Run functional tests directly when in MacOS or in a container. 116*b3adc34aSAndroid Build Coastguard Worker# Pass IS_CONTAINER=true to run functional tests when Docker is installed on Linux. 117*b3adc34aSAndroid Build Coastguard Workerfunction main() { 118*b3adc34aSAndroid Build Coastguard Worker check_env 119*b3adc34aSAndroid Build Coastguard Worker while getopts ":m" opt; do 120*b3adc34aSAndroid Build Coastguard Worker case "$opt" in 121*b3adc34aSAndroid Build Coastguard Worker m) has_docker && build_docker_image;; 122*b3adc34aSAndroid Build Coastguard Worker *) helper;; 123*b3adc34aSAndroid Build Coastguard Worker esac 124*b3adc34aSAndroid Build Coastguard Worker done 125*b3adc34aSAndroid Build Coastguard Worker if ! has_docker; then 126*b3adc34aSAndroid Build Coastguard Worker m clean 127*b3adc34aSAndroid Build Coastguard Worker run_functiontests 128*b3adc34aSAndroid Build Coastguard Worker else 129*b3adc34aSAndroid Build Coastguard Worker if ! has_docker_image; then 130*b3adc34aSAndroid Build Coastguard Worker build_docker_image 131*b3adc34aSAndroid Build Coastguard Worker fi 132*b3adc34aSAndroid Build Coastguard Worker run_docker_instance 133*b3adc34aSAndroid Build Coastguard Worker fi 134*b3adc34aSAndroid Build Coastguard Worker} 135*b3adc34aSAndroid Build Coastguard Worker 136*b3adc34aSAndroid Build Coastguard Workermain "$@" 137