xref: /aosp_15_r20/prebuilts/asuite/aidegen/smoke_tests (revision b3adc34a6be591bf5fd4943dfdce52f3982696f0)
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