13af6ab5fSopenharmony_ci#!/usr/bin/env python3
23af6ab5fSopenharmony_ci# -*- coding: utf-8 -*-
33af6ab5fSopenharmony_ci
43af6ab5fSopenharmony_ci# Copyright (c) 2023-2024 Huawei Device Co., Ltd.
53af6ab5fSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
63af6ab5fSopenharmony_ci# you may not use this file except in compliance with the License.
73af6ab5fSopenharmony_ci# You may obtain a copy of the License at
83af6ab5fSopenharmony_ci#
93af6ab5fSopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0
103af6ab5fSopenharmony_ci#
113af6ab5fSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
123af6ab5fSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
133af6ab5fSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143af6ab5fSopenharmony_ci# See the License for the specific language governing permissions and
153af6ab5fSopenharmony_ci# limitations under the License.
163af6ab5fSopenharmony_ci#
173af6ab5fSopenharmony_ci#
183af6ab5fSopenharmony_ci#
193af6ab5fSopenharmony_ci# This is a script for running a minimal reasonable set of tests
203af6ab5fSopenharmony_ci# during front-end development. Can be used for a quick self-check.
213af6ab5fSopenharmony_ci# Definitely not a substitute / equivalent of the full CI run.
223af6ab5fSopenharmony_ci# Can be dropped to your favorite location in $PATH to be invoked
233af6ab5fSopenharmony_ci# as a CLI tool. Try --help if not sure how to proceed.
243af6ab5fSopenharmony_ci#
253af6ab5fSopenharmony_ci
263af6ab5fSopenharmony_ciROOT_DIR=
273af6ab5fSopenharmony_ciBUILD_DIR=
283af6ab5fSopenharmony_ciBRANCH_NAME=
293af6ab5fSopenharmony_ciBUILD_TYPE=Debug
303af6ab5fSopenharmony_ciDO_CONFIGURE=no
313af6ab5fSopenharmony_ciDO_CLEAN=no
323af6ab5fSopenharmony_ciBUILD_TARGETS=
333af6ab5fSopenharmony_ciRUN_FUNC_SUITE=no
343af6ab5fSopenharmony_ciRUN_CTS=no
353af6ab5fSopenharmony_ciPARSER=
363af6ab5fSopenharmony_ciRUN_CLANG_TIDY=yes
373af6ab5fSopenharmony_ciPARENT_BRANCH=
383af6ab5fSopenharmony_ci
393af6ab5fSopenharmony_cifunction print_help
403af6ab5fSopenharmony_ci{
413af6ab5fSopenharmony_ci    HELP_MESSAGE="
423af6ab5fSopenharmony_ci    Options:
433af6ab5fSopenharmony_ci
443af6ab5fSopenharmony_ci    --root-dir=REQUIRED
453af6ab5fSopenharmony_ci    --build-dir=REQUIRED
463af6ab5fSopenharmony_ci
473af6ab5fSopenharmony_ci    [--branch=BRANCH_NAME]
483af6ab5fSopenharmony_ci    [--build-type=CMAKE_BUILD_TYPE]
493af6ab5fSopenharmony_ci    [--build-clean]
503af6ab5fSopenharmony_ci    [--configure]
513af6ab5fSopenharmony_ci    [--build=TARGET1 --build=TARGET2 ...]
523af6ab5fSopenharmony_ci    [--run-func-suite]
533af6ab5fSopenharmony_ci    [--run-cts]
543af6ab5fSopenharmony_ci    [--parser]
553af6ab5fSopenharmony_ci    [--run-clang_tidy=yes/no]
563af6ab5fSopenharmony_ci
573af6ab5fSopenharmony_ci    Notes:
583af6ab5fSopenharmony_ci    * --build-type should correspond to the main project's build
593af6ab5fSopenharmony_ci      types, i.e.: Debug, FastVerify, Release.
603af6ab5fSopenharmony_ci    * --build can be repeated to build several targets (correspond
613af6ab5fSopenharmony_ci      to the main project's build targets).
623af6ab5fSopenharmony_ci    * --run-clang_tidy set to "yes" by default.
633af6ab5fSopenharmony_ci    "
643af6ab5fSopenharmony_ci    echo "$HELP_MESSAGE"
653af6ab5fSopenharmony_ci}
663af6ab5fSopenharmony_ci
673af6ab5fSopenharmony_cifor opt in "$@"
683af6ab5fSopenharmony_cido
693af6ab5fSopenharmony_ci    case $opt in
703af6ab5fSopenharmony_ci    -h|--help)
713af6ab5fSopenharmony_ci        print_help
723af6ab5fSopenharmony_ci        exit 0
733af6ab5fSopenharmony_ci        ;;
743af6ab5fSopenharmony_ci    --root-dir=*)
753af6ab5fSopenharmony_ci        ROOT_DIR=${opt//[-a-zA-Z0-9]*=/}
763af6ab5fSopenharmony_ci        ;;
773af6ab5fSopenharmony_ci    --build-dir=*)
783af6ab5fSopenharmony_ci        BUILD_DIR=${opt//[-a-zA-Z0-9]*=/}
793af6ab5fSopenharmony_ci        ;;
803af6ab5fSopenharmony_ci    --build-type=*)
813af6ab5fSopenharmony_ci        BUILD_TYPE=${opt//[-a-zA-Z0-9]*=/}
823af6ab5fSopenharmony_ci        ;;
833af6ab5fSopenharmony_ci    --branch=*)
843af6ab5fSopenharmony_ci        BRANCH_NAME=${opt//[-a-zA-Z0-9]*=/}
853af6ab5fSopenharmony_ci        ;;
863af6ab5fSopenharmony_ci    --configure)
873af6ab5fSopenharmony_ci        DO_CONFIGURE=yes
883af6ab5fSopenharmony_ci        ;;
893af6ab5fSopenharmony_ci    --build-clean)
903af6ab5fSopenharmony_ci        DO_CLEAN=yes
913af6ab5fSopenharmony_ci        ;;
923af6ab5fSopenharmony_ci    --build=*)
933af6ab5fSopenharmony_ci        build_target=${opt//[-a-zA-Z0-9]*=/}
943af6ab5fSopenharmony_ci        BUILD_TARGETS="${BUILD_TARGETS} ${build_target}"
953af6ab5fSopenharmony_ci        ;;
963af6ab5fSopenharmony_ci    --run-func-suite)
973af6ab5fSopenharmony_ci        RUN_FUNC_SUITE=yes
983af6ab5fSopenharmony_ci        ;;
993af6ab5fSopenharmony_ci    --run-cts)
1003af6ab5fSopenharmony_ci        RUN_CTS=yes
1013af6ab5fSopenharmony_ci        ;;
1023af6ab5fSopenharmony_ci    --parser)
1033af6ab5fSopenharmony_ci        PARSER=yes
1043af6ab5fSopenharmony_ci        ;;
1053af6ab5fSopenharmony_ci    --run-clang_tidy=*)
1063af6ab5fSopenharmony_ci        $RUN_CLANG_TIDY=$opt
1073af6ab5fSopenharmony_ci        ;;
1083af6ab5fSopenharmony_ci    *)
1093af6ab5fSopenharmony_ci        echo "Error: Unsupported flag $opt" >&2
1103af6ab5fSopenharmony_ci        exit 1
1113af6ab5fSopenharmony_ci        ;;
1123af6ab5fSopenharmony_ci    esac
1133af6ab5fSopenharmony_cidone
1143af6ab5fSopenharmony_ci
1153af6ab5fSopenharmony_ciset -e
1163af6ab5fSopenharmony_ci
1173af6ab5fSopenharmony_ciif [[ ! -d "${ROOT_DIR}" ]]; then
1183af6ab5fSopenharmony_ci    echo 'Fatal: --root-dir is missing or invalid'
1193af6ab5fSopenharmony_ci    exit 1
1203af6ab5fSopenharmony_cifi
1213af6ab5fSopenharmony_ci
1223af6ab5fSopenharmony_ciif [[ "${BUILD_DIR}" == '' ]]; then
1233af6ab5fSopenharmony_ci    echo 'Fatal: --build-dir is missing'
1243af6ab5fSopenharmony_ci    exit 1
1253af6ab5fSopenharmony_cifi
1263af6ab5fSopenharmony_ci
1273af6ab5fSopenharmony_cimkdir -p "$BUILD_DIR"
1283af6ab5fSopenharmony_ciif [[ "$DO_CLEAN" == 'yes' ]]; then
1293af6ab5fSopenharmony_ci    pushd "$BUILD_DIR"
1303af6ab5fSopenharmony_ci        rm -rf *
1313af6ab5fSopenharmony_ci    popd
1323af6ab5fSopenharmony_cifi
1333af6ab5fSopenharmony_ci
1343af6ab5fSopenharmony_ciRUNTIME_CORE_DIR=${ROOT_DIR}/runtime_core
1353af6ab5fSopenharmony_ciETS_FRONTEND_DIR=${ROOT_DIR}/ets_frontend
1363af6ab5fSopenharmony_ciCLANG_TIDY_DIRS=(${RUNTIME_CORE_DIR} ${ETS_FRONTEND_DIR})
1373af6ab5fSopenharmony_ciif [[ "${BRANCH_NAME}" != '' ]]; then
1383af6ab5fSopenharmony_ci    for dir in "${CLANG_TIDY_DIRS[@]}"
1393af6ab5fSopenharmony_ci    do
1403af6ab5fSopenharmony_ci        pushd $dir
1413af6ab5fSopenharmony_ci            git checkout "${BRANCH_NAME}"
1423af6ab5fSopenharmony_ci        popd
1433af6ab5fSopenharmony_ci    done
1443af6ab5fSopenharmony_cifi
1453af6ab5fSopenharmony_ci
1463af6ab5fSopenharmony_ciSTATIC_CORE_DIR=${ROOT_DIR}/runtime_core/static_core
1473af6ab5fSopenharmony_ciTEST_RUNNER=${STATIC_CORE_DIR}/tests/tests-u-runner/runner.sh
1483af6ab5fSopenharmony_ciCLANG_TIDY_CHECK=${STATIC_CORE_DIR}/scripts/clang-tidy/clang_tidy_check.py
1493af6ab5fSopenharmony_ci
1503af6ab5fSopenharmony_ciif [[ "$RUN_CLANG_TIDY" == 'yes' ]]; then
1513af6ab5fSopenharmony_ci    for dir in "${CLANG_TIDY_DIRS[@]}"
1523af6ab5fSopenharmony_ci    do
1533af6ab5fSopenharmony_ci        pushd $dir > /dev/null
1543af6ab5fSopenharmony_ci        echo $dir
1553af6ab5fSopenharmony_ci        while [[ "$PARENT_BRANCH" == '' || $i != 25 ]]
1563af6ab5fSopenharmony_ci        do
1573af6ab5fSopenharmony_ci            i=1
1583af6ab5fSopenharmony_ci            branch=$(git show-branch | sed "s/].*//" | grep "\*" | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -n${i} | sed "s/^.*\[//" | sed 's/[\^~].*//')
1593af6ab5fSopenharmony_ci            if [[ "$branch" == 'fe_dev_stable' || "$branch" == 'master' ]]; then
1603af6ab5fSopenharmony_ci                PARENT_BRANCH=$branch
1613af6ab5fSopenharmony_ci                echo "PARENT_BRANCH = $branch"
1623af6ab5fSopenharmony_ci                FILE_NAME_FILTER=$(git diff --name-only $PARENT_BRANCH | sed -rn "/^.*(\.(c|cpp|h))$/p" | sed ':a;N;$!ba;s/\n/\|/g')
1633af6ab5fSopenharmony_ci                echo "$FILE_NAME_FILTER"
1643af6ab5fSopenharmony_ci                if [[ $FILE_NAME_FILTER != '' ]]; then
1653af6ab5fSopenharmony_ci                    ${CLANG_TIDY_CHECK} --filename-filter=${FILE_NAME_FILTER} "$STATIC_CORE_DIR" "$BUILD_DIR"
1663af6ab5fSopenharmony_ci                else
1673af6ab5fSopenharmony_ci                    echo "Nothing to check"
1683af6ab5fSopenharmony_ci                fi
1693af6ab5fSopenharmony_ci                break
1703af6ab5fSopenharmony_ci            fi
1713af6ab5fSopenharmony_ci            i=$i+1
1723af6ab5fSopenharmony_ci            PARENT_BRANCH=
1733af6ab5fSopenharmony_ci        done
1743af6ab5fSopenharmony_ci        if [[ "$PARENT_BRANCH" == '' ]]; then
1753af6ab5fSopenharmony_ci            echo "Parent branch for $dir not found. All files will be checked"
1763af6ab5fSopenharmony_ci            ${CLANG_TIDY_CHECK} "$STATIC_CORE_DIR" "$BUILD_DIR"
1773af6ab5fSopenharmony_ci        fi
1783af6ab5fSopenharmony_ci        PARENT_BRANCH=
1793af6ab5fSopenharmony_ci        popd > /dev/null
1803af6ab5fSopenharmony_ci    done
1813af6ab5fSopenharmony_cifi
1823af6ab5fSopenharmony_ci
1833af6ab5fSopenharmony_ciif [[ "${DO_CONFIGURE}" == 'yes' ]]; then
1843af6ab5fSopenharmony_ci    pushd ${BUILD_DIR}
1853af6ab5fSopenharmony_ci        cmake -GNinja \
1863af6ab5fSopenharmony_ci            -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
1873af6ab5fSopenharmony_ci            -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain/host_clang_14.cmake \
1883af6ab5fSopenharmony_ci            -DPANDA_ETS_INTEROP_JS=ON \
1893af6ab5fSopenharmony_ci            -DPANDA_WITH_ECMASCRIPT=OFF \
1903af6ab5fSopenharmony_ci            -DPANDA_WITH_ETS=ON \
1913af6ab5fSopenharmony_ci            "$STATIC_CORE_DIR"
1923af6ab5fSopenharmony_ci    popd
1933af6ab5fSopenharmony_cifi
1943af6ab5fSopenharmony_ci
1953af6ab5fSopenharmony_ciif [[ "$BUILD_TARGETS" != '' ]]; then
1963af6ab5fSopenharmony_ci    pushd "$BUILD_DIR"
1973af6ab5fSopenharmony_ci        ninja ${BUILD_TARGETS}
1983af6ab5fSopenharmony_ci    popd
1993af6ab5fSopenharmony_cifi
2003af6ab5fSopenharmony_ci
2013af6ab5fSopenharmony_ciif [[ "$RUN_FUNC_SUITE" == 'yes' ]]; then
2023af6ab5fSopenharmony_ci    # Func tests INT:
2033af6ab5fSopenharmony_ci    ${TEST_RUNNER} --build-dir "$BUILD_DIR" \
2043af6ab5fSopenharmony_ci        --processes=all --force-generate \
2053af6ab5fSopenharmony_ci        --ets-func-tests
2063af6ab5fSopenharmony_ci
2073af6ab5fSopenharmony_ci    # Func tests JIT:
2083af6ab5fSopenharmony_ci    ${TEST_RUNNER} --build-dir "$BUILD_DIR" \
2093af6ab5fSopenharmony_ci        --processes=all --force-generate \
2103af6ab5fSopenharmony_ci        --ets-func-tests --jit --ark-args='--compiler-ignore-failures=false'
2113af6ab5fSopenharmony_cifi
2123af6ab5fSopenharmony_ci
2133af6ab5fSopenharmony_ciif [[ "$RUN_CTS" == 'yes' ]]; then
2143af6ab5fSopenharmony_ci    # ArkTS CTS:
2153af6ab5fSopenharmony_ci    ${TEST_RUNNER} --build-dir "$BUILD_DIR" \
2163af6ab5fSopenharmony_ci        --processes=all --force-generate \
2173af6ab5fSopenharmony_ci        --ets-cts
2183af6ab5fSopenharmony_cifi
2193af6ab5fSopenharmony_ci
2203af6ab5fSopenharmony_ciif [[ "$PARSER" == 'yes' ]]; then
2213af6ab5fSopenharmony_ci    # Pasrer:
2223af6ab5fSopenharmony_ci    ${TEST_RUNNER} --build-dir "$BUILD_DIR" \
2233af6ab5fSopenharmony_ci        --processes=all --force-generate \
2243af6ab5fSopenharmony_ci        --parser --no-js
2253af6ab5fSopenharmony_cifi