#!/bin/bash # # This script runs the full set of tests for product config: # 1. Build the product-config tool. # 2. Run the unit tests. # 3. Run the product config for every product available in the current # source tree, for each of user, userdebug and eng. # - To restrict which products or variants are run, set the # PRODUCTS or VARIANTS environment variables. # - Products for which the make based product config fails are # skipped. # # The PRODUCTS variable is used by the build, and setting it in the environment # interferes with that, so unset it. (That should probably be fixed) products=$PRODUCTS variants=$VARIANTS unset PRODUCTS unset VARIANTS # Don't use lunch from the user's shell unset TARGET_PRODUCT unset TARGET_BUILD_VARIANT function die() { format=$1 shift printf "$format\nStopping...\n" $@ >&2 exit 1; } [[ -f build/make/envsetup.sh ]] || die "Run this script from the root of the tree." : ${products:=$(build/soong/soong_ui.bash --dumpvar-mode all_named_products | sed -e "s/ /\n/g" | sort -u )} : ${variants:="user userdebug eng"} : ${CKATI_BIN:=prebuilts/build-tools/$(build/soong/soong_ui.bash --dumpvar-mode HOST_PREBUILT_TAG)/bin/ckati} function if_signal_exit() { [[ $1 -lt 128 ]] || exit $1 } build/soong/soong_ui.bash --build-mode --all-modules --dir="$(pwd)" product-config-test product-config \ || die "Build failed." echo echo Running unit tests java -jar out/host/linux-x86/testcases/product-config-test/product-config-test.jar unit_tests=$? if_signal_exit $unit_tests failed_baseline_checks= for product in $products ; do for variant in $variants ; do echo echo "Checking: lunch $product-$variant" TARGET_PRODUCT=$product \ TARGET_BUILD_VARIANT=$variant \ build/soong/soong_ui.bash --dumpvar-mode TARGET_PRODUCT &> /dev/null exit_status=$? if_signal_exit $exit_status if [ $exit_status -ne 0 ] ; then echo "*** Combo fails with make, skipping product-config test run for $product-$variant" else rm -rf out/config/$product-$variant TARGET_PRODUCT=$product TARGET_BUILD_VARIANT=$variant product-config \ --ckati_bin $CKATI_BIN \ --error 1000 exit_status=$? if_signal_exit $exit_status if [ $exit_status -ne 0 ] ; then failed_baseline_checks="$failed_baseline_checks $product-$variant" fi if [ "$CHECK_FOR_RULES" != "" ] ; then # This is a little bit of sleight of hand for good output formatting at the # expense of speed. We've already run the command once without # ALLOW_RULES_IN_PRODUCT_CONFIG, so we know it passes there. We run it again # with ALLOW_RULES_IN_PRODUCT_CONFIG=error to see if it fails, but that will # cause it to only print the first error. But we want to see all of them, # so if it fails we run it a third time with ALLOW_RULES_IN_PRODUCT_CONFIG=warning, # so we can see all the warnings. TARGET_PRODUCT=$product \ TARGET_BUILD_VARIANT=$variant \ ALLOW_RULES_IN_PRODUCT_CONFIG=error \ build/soong/soong_ui.bash --dumpvar-mode TARGET_PRODUCT &> /dev/null exit_status=$? if_signal_exit $exit_status if [ $exit_status -ne 0 ] ; then TARGET_PRODUCT=$product \ TARGET_BUILD_VARIANT=$variant \ ALLOW_RULES_IN_PRODUCT_CONFIG=warning \ build/soong/soong_ui.bash --dumpvar-mode TARGET_PRODUCT > /dev/null failed_rule_checks="$failed_rule_checks $product-$variant" fi fi fi done done echo echo echo "------------------------------" echo SUMMARY echo "------------------------------" echo -n "Unit tests " if [ $unit_tests -eq 0 ] ; then echo PASSED ; else echo FAILED ; fi echo -n "Baseline checks " if [ "$failed_baseline_checks" = "" ] ; then echo PASSED ; else echo FAILED ; fi for combo in $failed_baseline_checks ; do echo " ... $combo" done echo -n "Rules checks " if [ "$failed_rule_checks" = "" ] ; then echo PASSED ; else echo FAILED ; fi for combo in $failed_rule_checks ; do echo " ... $combo" done