Fixes for run_integration_tests.sh
This script runs some useful integration tests, but is currently broken at ToT. This CL enables us to rerun this script successfully. Details 1. Remove the scripts related to bp2build/b/mixed_builds. These modes have been/are on the verge of deletion from soong 2. Remove the comparisision scripts for soong and bazel built artifcats, for the same reason 3. Add a TARGET_RELEASE to androidmk_test.sh 4. Add a TARGET_PRODUCT to o/s/build.ninja, since the generated .ninja files now have a product-specific suffix. 5. Remove a test that checks that globs are not generated in the first clean run. We always generate the glob file now (aosp/2893286) Test: build/soong/tests/run_integration_tests.sh Change-Id: I39f6706ab2a81a7b1b2e90d43195bc3e2c7a5c08
This commit is contained in:
parent
87f5ee4cb6
commit
08e90c2718
12 changed files with 43 additions and 1486 deletions
|
@ -5,7 +5,7 @@ set -o pipefail
|
|||
# How to run: bash path-to-script/androidmk_test.sh
|
||||
# Tests of converting license functionality of the androidmk tool
|
||||
REAL_TOP="$(readlink -f "$(dirname "$0")"/../../..)"
|
||||
"$REAL_TOP/build/soong/soong_ui.bash" --make-mode androidmk
|
||||
"$REAL_TOP/build/soong/soong_ui.bash" --make-mode TARGET_RELEASE=trunk_staging androidmk
|
||||
|
||||
source "$(dirname "$0")/lib.sh"
|
||||
|
||||
|
|
|
@ -1,94 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Copyright (C) 2022 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
set -uo pipefail
|
||||
|
||||
# Integration test for verifying arch variant cflags set on cc modules included
|
||||
# in Bazel-built apexes in the real source tree.
|
||||
|
||||
if [ ! -e "build/make/core/Makefile" ]; then
|
||||
echo "$0 must be run from the top of the Android source tree."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
############
|
||||
# Test Setup
|
||||
############
|
||||
|
||||
OUTPUT_DIR="$(mktemp -d tmp.XXXXXX)"
|
||||
BAZEL_OUTPUT_DIR="$OUTPUT_DIR/bazel"
|
||||
|
||||
export TARGET_PRODUCT="aosp_arm64"
|
||||
[ "$#" -ge 1 ] && export TARGET_PRODUCT="$1"
|
||||
ARCH_VARIANT_CFLAG="armv8-a"
|
||||
[ "$#" -ge 2 ] && ARCH_VARIANT_CFLAG="$2"
|
||||
CPU_VARIANT_CFLAG=""
|
||||
[ "$#" -ge 3 ] && CPU_VARIANT_CFLAG="$3"
|
||||
|
||||
function call_bazel() {
|
||||
build/bazel/bin/bazel --output_base="$BAZEL_OUTPUT_DIR" $@
|
||||
}
|
||||
|
||||
function cleanup {
|
||||
# call bazel clean because some bazel outputs don't have w bits.
|
||||
call_bazel clean
|
||||
rm -rf "${OUTPUT_DIR}"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
######################
|
||||
# Run bp2build / Bazel
|
||||
######################
|
||||
build/soong/soong_ui.bash --make-mode BP2BUILD_VERBOSE=1 --skip-soong-tests bp2build
|
||||
|
||||
# Number of CppCompile actions with arch variant flag
|
||||
actions_with_arch_variant_num=$(call_bazel aquery --config=bp2build --config=ci --config=android \
|
||||
'mnemonic("CppCompile", deps(//build/bazel/examples/apex/minimal:build.bazel.examples.apex.minimal))' | grep -c \'-march=$ARCH_VARIANT_CFLAG\')
|
||||
|
||||
# Number of all CppCompile actions
|
||||
all_cppcompile_actions_num=0
|
||||
aquery_summary=$(call_bazel aquery --config=bp2build --config=ci --config=android --output=summary \
|
||||
'mnemonic("CppCompile", deps(//build/bazel/examples/apex/minimal:build.bazel.examples.apex.minimal))' \
|
||||
| egrep -o '.*opt-ST.*: ([0-9]+)$' \
|
||||
| cut -d: -f2 -)
|
||||
|
||||
while read -r num;
|
||||
do
|
||||
all_cppcompile_actions_num=$(($all_cppcompile_actions_num + $num))
|
||||
done <<< "$aquery_summary"
|
||||
|
||||
if [ $actions_with_arch_variant_num -eq $all_cppcompile_actions_num ]
|
||||
then
|
||||
echo "Pass: arch variant is set."
|
||||
else
|
||||
echo "Error: number of CppCompile actions with arch variant set: actual=$actions_with_arch_variant_num, expected=$all_cppcompile_actions_num"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ $CPU_VARIANT_CFLAG ]
|
||||
then
|
||||
# Number of CppCompiler actions with cpu variant flag
|
||||
actions_with_cpu_variant_num=$(call_bazel aquery --config=bp2build --config=ci --config=android \
|
||||
'mnemonic("CppCompile", deps(//build/bazel/examples/apex/minimal:build.bazel.examples.apex.minimal))' | grep -c "\-mcpu=$CPU_VARIANT_CFLAG")
|
||||
|
||||
if [ $actions_with_cpu_variant_num -eq $all_cppcompile_actions_num ]
|
||||
then
|
||||
echo "Pass: cpu variant is set."
|
||||
else
|
||||
echo "Error: number of CppCompile actions with cpu variant set: actual=$actions_with_cpu_variant_num, expected=$all_cppcompile_actions_num"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
|
@ -1,119 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Copyright (C) 2022 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Soong/Bazel integration test for building unbundled apexes in the real source tree.
|
||||
#
|
||||
# These tests build artifacts from head and compares their contents.
|
||||
|
||||
if [ ! -e "build/make/core/Makefile" ]; then
|
||||
echo "$0 must be run from the top of the Android source tree."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
############
|
||||
# Test Setup
|
||||
############
|
||||
|
||||
OUTPUT_DIR="$(mktemp -d $(pwd)/tmp.XXXXXX)"
|
||||
SOONG_OUTPUT_DIR="$OUTPUT_DIR/soong"
|
||||
BAZEL_OUTPUT_DIR="$OUTPUT_DIR/bazel"
|
||||
|
||||
export TARGET_PRODUCT="module_arm"
|
||||
[ "$#" -eq 1 ] && export TARGET_PRODUCT="$1"
|
||||
|
||||
function call_bazel() {
|
||||
build/bazel/bin/bazel --output_base="$BAZEL_OUTPUT_DIR" $@
|
||||
}
|
||||
|
||||
function cleanup {
|
||||
# call bazel clean because some bazel outputs don't have w bits.
|
||||
call_bazel clean
|
||||
rm -rf "${OUTPUT_DIR}"
|
||||
}
|
||||
|
||||
function deapexer() {
|
||||
DEBUGFS_PATH="$(realpath $(call_bazel cquery --config=bp2build --config=linux_x86_64 --config=ci --output=files //external/e2fsprogs/debugfs))"
|
||||
call_bazel run --config=bp2build //system/apex/tools:deapexer -- --debugfs_path=$DEBUGFS_PATH $@
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
###########
|
||||
# Run Soong
|
||||
###########
|
||||
export UNBUNDLED_BUILD_SDKS_FROM_SOURCE=true # don't rely on prebuilts
|
||||
export TARGET_BUILD_APPS="com.android.adbd com.android.tzdata build.bazel.examples.apex.minimal"
|
||||
packages/modules/common/build/build_unbundled_mainline_module.sh \
|
||||
--product "$TARGET_PRODUCT" \
|
||||
--dist_dir "$SOONG_OUTPUT_DIR"
|
||||
|
||||
######################
|
||||
# Run bp2build / Bazel
|
||||
######################
|
||||
build/soong/soong_ui.bash --make-mode BP2BUILD_VERBOSE=1 --skip-soong-tests bp2build
|
||||
|
||||
BAZEL_OUT="$(call_bazel info --config=bp2build output_path)"
|
||||
|
||||
call_bazel build --config=bp2build --config=ci --config=android \
|
||||
//packages/modules/adb/apex:com.android.adbd \
|
||||
//system/timezone/apex:com.android.tzdata \
|
||||
//build/bazel/examples/apex/minimal:build.bazel.examples.apex.minimal
|
||||
BAZEL_ADBD="$(realpath $(call_bazel cquery --config=bp2build --config=android --config=ci --output=files //packages/modules/adb/apex:com.android.adbd))"
|
||||
BAZEL_TZDATA="$(realpath $(call_bazel cquery --config=bp2build --config=android --config=ci --output=files //system/timezone/apex:com.android.tzdata))"
|
||||
BAZEL_MINIMAL="$(realpath $(call_bazel cquery --config=bp2build --config=android --config=ci --output=files //build/bazel/examples/apex/minimal:build.bazel.examples.apex.minimal))"
|
||||
|
||||
# # Build debugfs separately, as it's not a dep of apexer, but needs to be an explicit arg.
|
||||
call_bazel build --config=bp2build --config=linux_x86_64 //external/e2fsprogs/debugfs
|
||||
|
||||
#######
|
||||
# Tests
|
||||
#######
|
||||
|
||||
function compare_deapexer_list() {
|
||||
local BAZEL_APEX=$1; shift
|
||||
local APEX=$1; shift
|
||||
|
||||
# Compare the outputs of `deapexer list`, which lists the contents of the apex filesystem image.
|
||||
local SOONG_APEX="$SOONG_OUTPUT_DIR/$APEX"
|
||||
|
||||
local SOONG_LIST="$OUTPUT_DIR/soong.list"
|
||||
local BAZEL_LIST="$OUTPUT_DIR/bazel.list"
|
||||
|
||||
deapexer list "$SOONG_APEX" > "$SOONG_LIST"
|
||||
deapexer list "$BAZEL_APEX" > "$BAZEL_LIST"
|
||||
|
||||
if cmp -s "$SOONG_LIST" "$BAZEL_LIST"
|
||||
then
|
||||
echo "ok: $APEX"
|
||||
else
|
||||
echo "contents of $APEX are different between Soong and Bazel:"
|
||||
echo
|
||||
echo expected
|
||||
echo
|
||||
cat "$SOONG_LIST"
|
||||
echo
|
||||
echo got
|
||||
echo
|
||||
cat "$BAZEL_LIST"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
compare_deapexer_list "${BAZEL_ADBD}" com.android.adbd.apex
|
||||
compare_deapexer_list "${BAZEL_TZDATA}" com.android.tzdata.apex
|
||||
compare_deapexer_list "${BAZEL_MINIMAL}" build.bazel.examples.apex.minimal.apex
|
|
@ -9,6 +9,8 @@ source "$(dirname "$0")/lib.sh"
|
|||
|
||||
readonly GENERATED_BUILD_FILE_NAME="BUILD.bazel"
|
||||
|
||||
readonly target_product="${TARGET_PRODUCT:-aosp_arm}"
|
||||
|
||||
function test_smoke {
|
||||
setup
|
||||
run_soong
|
||||
|
@ -18,10 +20,10 @@ function test_null_build() {
|
|||
setup
|
||||
run_soong
|
||||
local -r bootstrap_mtime1=$(stat -c "%y" out/soong/bootstrap.ninja)
|
||||
local -r output_mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r output_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
run_soong
|
||||
local -r bootstrap_mtime2=$(stat -c "%y" out/soong/bootstrap.ninja)
|
||||
local -r output_mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r output_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
if [[ "$bootstrap_mtime1" == "$bootstrap_mtime2" ]]; then
|
||||
# Bootstrapping is always done. It doesn't take a measurable amount of time.
|
||||
|
@ -60,7 +62,7 @@ EOF
|
|||
touch a/my_little_binary_host.py
|
||||
run_soong
|
||||
|
||||
grep -q "^# Module:.*my_little_binary_host" out/soong/build.ninja || fail "module not found"
|
||||
grep -q "^# Module:.*my_little_binary_host" out/soong/build."${target_product}".ninja || fail "module not found"
|
||||
|
||||
cat > a/Android.bp <<'EOF'
|
||||
python_binary_host {
|
||||
|
@ -71,14 +73,14 @@ EOF
|
|||
touch a/my_great_binary_host.py
|
||||
run_soong
|
||||
|
||||
grep -q "^# Module:.*my_little_binary_host" out/soong/build.ninja && fail "old module found"
|
||||
grep -q "^# Module:.*my_great_binary_host" out/soong/build.ninja || fail "new module not found"
|
||||
grep -q "^# Module:.*my_little_binary_host" out/soong/build."${target_product}".ninja && fail "old module found"
|
||||
grep -q "^# Module:.*my_great_binary_host" out/soong/build."${target_product}".ninja || fail "new module not found"
|
||||
}
|
||||
|
||||
function test_add_android_bp() {
|
||||
setup
|
||||
run_soong
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
mkdir -p a
|
||||
cat > a/Android.bp <<'EOF'
|
||||
|
@ -90,12 +92,12 @@ EOF
|
|||
touch a/my_little_binary_host.py
|
||||
run_soong
|
||||
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
if [[ "$mtime1" == "$mtime2" ]]; then
|
||||
fail "Output Ninja file did not change"
|
||||
fi
|
||||
|
||||
grep -q "^# Module:.*my_little_binary_host$" out/soong/build.ninja || fail "New module not in output"
|
||||
grep -q "^# Module:.*my_little_binary_host$" out/soong/build."${target_product}".ninja || fail "New module not in output"
|
||||
|
||||
run_soong
|
||||
}
|
||||
|
@ -112,12 +114,12 @@ EOF
|
|||
touch a/my_little_binary_host.py
|
||||
run_soong
|
||||
|
||||
grep -q "^# Module:.*my_little_binary_host$" out/soong/build.ninja || fail "Module not in output"
|
||||
grep -q "^# Module:.*my_little_binary_host$" out/soong/build."${target_product}".ninja || fail "Module not in output"
|
||||
|
||||
rm a/Android.bp
|
||||
run_soong
|
||||
|
||||
if grep -q "^# Module:.*my_little_binary_host$" out/soong/build.ninja; then
|
||||
if grep -q "^# Module:.*my_little_binary_host$" out/soong/build."${target_product}".ninja; then
|
||||
fail "Old module in output"
|
||||
fi
|
||||
}
|
||||
|
@ -141,16 +143,12 @@ python_binary_host {
|
|||
EOF
|
||||
touch a/my_little_binary_host.py
|
||||
run_soong
|
||||
local -r ninja_mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r ninja_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
local glob_deps_file=out/soong/globs/build/0.d
|
||||
|
||||
if [ -e "$glob_deps_file" ]; then
|
||||
fail "Glob deps file unexpectedly written on first build"
|
||||
fi
|
||||
local glob_deps_file=out/soong/globs/"${target_product}"/0.d
|
||||
|
||||
run_soong
|
||||
local -r ninja_mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r ninja_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
# There is an ineffiencency in glob that requires bpglob to rerun once for each glob to update
|
||||
# the entry in the .ninja_log. It doesn't update the output file, but we can detect the rerun
|
||||
|
@ -166,7 +164,7 @@ EOF
|
|||
fi
|
||||
|
||||
run_soong
|
||||
local -r ninja_mtime3=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r ninja_mtime3=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
local -r glob_deps_mtime3=$(stat -c "%y" "$glob_deps_file")
|
||||
|
||||
if [[ "$ninja_mtime2" != "$ninja_mtime3" ]]; then
|
||||
|
@ -191,17 +189,17 @@ python_binary_host {
|
|||
EOF
|
||||
touch a/my_little_binary_host.py
|
||||
run_soong
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
touch a/my_little_library.py
|
||||
run_soong
|
||||
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
if [[ "$mtime1" == "$mtime2" ]]; then
|
||||
fail "Output Ninja file did not change"
|
||||
fi
|
||||
|
||||
grep -q my_little_library.py out/soong/build.ninja || fail "new file is not in output"
|
||||
grep -q my_little_library.py out/soong/build."${target_product}".ninja || fail "new file is not in output"
|
||||
}
|
||||
|
||||
function test_soong_build_rerun_iff_environment_changes() {
|
||||
|
@ -267,17 +265,17 @@ EOF
|
|||
|
||||
export CHERRY=TASTY
|
||||
run_soong
|
||||
grep -q "CHERRY IS TASTY" out/soong/build.ninja \
|
||||
grep -q "CHERRY IS TASTY" out/soong/build."${target_product}".ninja \
|
||||
|| fail "first value of environment variable is not used"
|
||||
|
||||
export CHERRY=RED
|
||||
run_soong
|
||||
grep -q "CHERRY IS RED" out/soong/build.ninja \
|
||||
grep -q "CHERRY IS RED" out/soong/build."${target_product}".ninja \
|
||||
|| fail "second value of environment variable not used"
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
run_soong
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
if [[ "$mtime1" != "$mtime2" ]]; then
|
||||
fail "Output Ninja file changed when environment variable did not"
|
||||
fi
|
||||
|
@ -287,7 +285,7 @@ EOF
|
|||
function test_create_global_include_directory() {
|
||||
setup
|
||||
run_soong
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
# Soong needs to know if top level directories like hardware/ exist for use
|
||||
# as global include directories. Make sure that doesn't cause regens for
|
||||
|
@ -295,7 +293,7 @@ function test_create_global_include_directory() {
|
|||
mkdir -p system/core
|
||||
|
||||
run_soong
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
if [[ "$mtime1" != "$mtime2" ]]; then
|
||||
fail "Output Ninja file changed when top level directory changed"
|
||||
fi
|
||||
|
@ -305,7 +303,7 @@ function test_create_global_include_directory() {
|
|||
mkdir -p system/core/include
|
||||
|
||||
run_soong
|
||||
local -r mtime3=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime3=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
if [[ "$mtime2" = "$mtime3" ]]; then
|
||||
fail "Output Ninja file did not change when global include directory created"
|
||||
fi
|
||||
|
@ -315,7 +313,7 @@ function test_create_global_include_directory() {
|
|||
function test_add_file_to_soong_build() {
|
||||
setup
|
||||
run_soong
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
mkdir -p vendor/foo/picard
|
||||
cat > vendor/foo/picard/Android.bp <<'EOF'
|
||||
|
@ -377,12 +375,12 @@ func (p *picardSingleton) GenerateBuildActions(ctx android.SingletonContext) {
|
|||
EOF
|
||||
|
||||
run_soong
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
if [[ "$mtime1" == "$mtime2" ]]; then
|
||||
fail "Output Ninja file did not change"
|
||||
fi
|
||||
|
||||
grep -q "Make it so" out/soong/build.ninja || fail "New action not present"
|
||||
grep -q "Make it so" out/soong/build."${target_product}".ninja || fail "New action not present"
|
||||
}
|
||||
|
||||
# Tests a glob in a build= statement in an Android.bp file, which is interpreted
|
||||
|
@ -455,9 +453,9 @@ func (p *picardSingleton) GenerateBuildActions(ctx android.SingletonContext) {
|
|||
EOF
|
||||
|
||||
run_soong
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
grep -q "Make it so" out/soong/build.ninja || fail "Original action not present"
|
||||
grep -q "Make it so" out/soong/build."${target_product}".ninja || fail "Original action not present"
|
||||
|
||||
cat > build/soong/picard/foob.bp <<'EOF'
|
||||
bootstrap_go_package {
|
||||
|
@ -487,14 +485,14 @@ func init() {
|
|||
EOF
|
||||
|
||||
run_soong
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
if [[ "$mtime1" == "$mtime2" ]]; then
|
||||
fail "Output Ninja file did not change"
|
||||
fi
|
||||
|
||||
grep -q "Engage" out/soong/build.ninja || fail "New action not present"
|
||||
grep -q "Engage" out/soong/build."${target_product}".ninja || fail "New action not present"
|
||||
|
||||
if grep -q "Make it so" out/soong/build.ninja; then
|
||||
if grep -q "Make it so" out/soong/build."${target_product}".ninja; then
|
||||
fail "Original action still present"
|
||||
fi
|
||||
}
|
||||
|
@ -512,7 +510,7 @@ function test_null_build_after_soong_docs() {
|
|||
setup
|
||||
|
||||
run_soong
|
||||
local -r ninja_mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r ninja_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
run_soong soong_docs
|
||||
local -r docs_mtime1=$(stat -c "%y" out/soong/docs/soong_build.html)
|
||||
|
@ -525,7 +523,7 @@ function test_null_build_after_soong_docs() {
|
|||
fi
|
||||
|
||||
run_soong
|
||||
local -r ninja_mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r ninja_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
if [[ "$ninja_mtime1" != "$ninja_mtime2" ]]; then
|
||||
fail "Output Ninja file changed on null build"
|
||||
|
@ -565,144 +563,6 @@ EOF
|
|||
fi
|
||||
}
|
||||
|
||||
function test_bp2build_smoke {
|
||||
setup
|
||||
run_soong bp2build
|
||||
[[ -e out/soong/bp2build_workspace_marker ]] || fail "bp2build marker file not created"
|
||||
[[ -e out/soong/workspace ]] || fail "Bazel workspace not created"
|
||||
}
|
||||
|
||||
function test_bp2build_generates_marker_file {
|
||||
setup
|
||||
|
||||
run_soong bp2build
|
||||
|
||||
if [[ ! -f "./out/soong/bp2build_files_marker" ]]; then
|
||||
fail "bp2build marker file was not generated"
|
||||
fi
|
||||
|
||||
if [[ ! -f "./out/soong/bp2build_workspace_marker" ]]; then
|
||||
fail "symlink forest marker file was not generated"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_bp2build_add_irrelevant_file {
|
||||
setup
|
||||
|
||||
mkdir -p a/b
|
||||
touch a/b/c.txt
|
||||
cat > a/b/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "c",
|
||||
srcs: ["c.txt"],
|
||||
bazel_module: { bp2build_available: true },
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
if [[ ! -e out/soong/bp2build/a/b/BUILD.bazel ]]; then
|
||||
fail "BUILD file in symlink forest was not created";
|
||||
fi
|
||||
|
||||
local -r mtime1=$(stat -c "%y" out/soong/bp2build/a/b/BUILD.bazel)
|
||||
|
||||
touch a/irrelevant.txt
|
||||
run_soong bp2build
|
||||
local -r mtime2=$(stat -c "%y" out/soong/bp2build/a/b/BUILD.bazel)
|
||||
|
||||
if [[ "$mtime1" != "$mtime2" ]]; then
|
||||
fail "BUILD.bazel file was regenerated"
|
||||
fi
|
||||
|
||||
if [[ ! -e "out/soong/workspace/a/irrelevant.txt" ]]; then
|
||||
fail "New file was not symlinked into symlink forest"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_bp2build_add_android_bp {
|
||||
setup
|
||||
|
||||
mkdir -p a
|
||||
touch a/a.txt
|
||||
cat > a/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "a",
|
||||
srcs: ["a.txt"],
|
||||
bazel_module: { bp2build_available: true },
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
[[ -e out/soong/bp2build/a/${GENERATED_BUILD_FILE_NAME} ]] || fail "a/${GENERATED_BUILD_FILE_NAME} not created"
|
||||
[[ -L out/soong/workspace/a/${GENERATED_BUILD_FILE_NAME} ]] || fail "a/${GENERATED_BUILD_FILE_NAME} not symlinked"
|
||||
|
||||
mkdir -p b
|
||||
touch b/b.txt
|
||||
cat > b/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "b",
|
||||
srcs: ["b.txt"],
|
||||
bazel_module: { bp2build_available: true },
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
[[ -e out/soong/bp2build/b/${GENERATED_BUILD_FILE_NAME} ]] || fail "a/${GENERATED_BUILD_FILE_NAME} not created"
|
||||
[[ -L out/soong/workspace/b/${GENERATED_BUILD_FILE_NAME} ]] || fail "a/${GENERATED_BUILD_FILE_NAME} not symlinked"
|
||||
}
|
||||
|
||||
function test_bp2build_null_build {
|
||||
setup
|
||||
|
||||
run_soong bp2build
|
||||
local -r mtime1=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
|
||||
run_soong bp2build
|
||||
local -r mtime2=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
|
||||
if [[ "$mtime1" != "$mtime2" ]]; then
|
||||
fail "Output Ninja file changed on null build"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_bp2build_add_to_glob {
|
||||
setup
|
||||
|
||||
mkdir -p a
|
||||
touch a/a1.txt
|
||||
cat > a/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "a",
|
||||
srcs: ["*.txt"],
|
||||
bazel_module: { bp2build_available: true },
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
grep -q a1.txt "out/soong/bp2build/a/${GENERATED_BUILD_FILE_NAME}" || fail "a1.txt not in ${GENERATED_BUILD_FILE_NAME} file"
|
||||
|
||||
touch a/a2.txt
|
||||
run_soong bp2build
|
||||
grep -q a2.txt "out/soong/bp2build/a/${GENERATED_BUILD_FILE_NAME}" || fail "a2.txt not in ${GENERATED_BUILD_FILE_NAME} file"
|
||||
}
|
||||
|
||||
function test_multiple_soong_build_modes() {
|
||||
setup
|
||||
run_soong json-module-graph bp2build nothing
|
||||
if [[ ! -f "out/soong/bp2build_workspace_marker" ]]; then
|
||||
fail "bp2build marker file was not generated"
|
||||
fi
|
||||
|
||||
|
||||
if [[ ! -f "out/soong/module-graph.json" ]]; then
|
||||
fail "JSON file was not created"
|
||||
fi
|
||||
|
||||
if [[ ! -f "out/soong/build.ninja" ]]; then
|
||||
fail "Main build.ninja file was not created"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_dump_json_module_graph() {
|
||||
setup
|
||||
run_soong json-module-graph
|
||||
|
@ -715,13 +575,13 @@ function test_json_module_graph_back_and_forth_null_build() {
|
|||
setup
|
||||
|
||||
run_soong
|
||||
local -r ninja_mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r ninja_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
run_soong json-module-graph
|
||||
local -r json_mtime1=$(stat -c "%y" out/soong/module-graph.json)
|
||||
|
||||
run_soong
|
||||
local -r ninja_mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r ninja_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
if [[ "$ninja_mtime1" != "$ninja_mtime2" ]]; then
|
||||
fail "Output Ninja file changed after writing JSON module graph"
|
||||
fi
|
||||
|
@ -734,143 +594,6 @@ function test_json_module_graph_back_and_forth_null_build() {
|
|||
|
||||
}
|
||||
|
||||
function test_bp2build_bazel_workspace_structure {
|
||||
setup
|
||||
|
||||
mkdir -p a/b
|
||||
touch a/a.txt
|
||||
touch a/b/b.txt
|
||||
cat > a/b/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "b",
|
||||
srcs: ["b.txt"],
|
||||
bazel_module: { bp2build_available: true },
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
[[ -e out/soong/workspace ]] || fail "Bazel workspace not created"
|
||||
[[ -d out/soong/workspace/a/b ]] || fail "module directory not a directory"
|
||||
[[ -L "out/soong/workspace/a/b/${GENERATED_BUILD_FILE_NAME}" ]] || fail "${GENERATED_BUILD_FILE_NAME} file not symlinked"
|
||||
[[ "$(readlink -f out/soong/workspace/a/b/${GENERATED_BUILD_FILE_NAME})" =~ "bp2build/a/b/${GENERATED_BUILD_FILE_NAME}"$ ]] \
|
||||
|| fail "BUILD files symlinked at the wrong place"
|
||||
[[ -L out/soong/workspace/a/b/b.txt ]] || fail "a/b/b.txt not symlinked"
|
||||
[[ -L out/soong/workspace/a/a.txt ]] || fail "a/b/a.txt not symlinked"
|
||||
[[ ! -e out/soong/workspace/out ]] || fail "out directory symlinked"
|
||||
}
|
||||
|
||||
function test_bp2build_bazel_workspace_add_file {
|
||||
setup
|
||||
|
||||
mkdir -p a
|
||||
touch a/a.txt
|
||||
cat > a/Android.bp <<EOF
|
||||
filegroup {
|
||||
name: "a",
|
||||
srcs: ["a.txt"],
|
||||
bazel_module: { bp2build_available: true },
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
|
||||
touch a/a2.txt # No reference in the .bp file needed
|
||||
run_soong bp2build
|
||||
[[ -L out/soong/workspace/a/a2.txt ]] || fail "a/a2.txt not symlinked"
|
||||
}
|
||||
|
||||
function test_bp2build_build_file_precedence {
|
||||
setup
|
||||
|
||||
mkdir -p a
|
||||
touch a/a.txt
|
||||
touch a/${GENERATED_BUILD_FILE_NAME}
|
||||
cat > a/Android.bp <<EOF
|
||||
filegroup {
|
||||
name: "a",
|
||||
srcs: ["a.txt"],
|
||||
bazel_module: { bp2build_available: true },
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
[[ -L "out/soong/workspace/a/${GENERATED_BUILD_FILE_NAME}" ]] || fail "${GENERATED_BUILD_FILE_NAME} file not symlinked"
|
||||
[[ "$(readlink -f out/soong/workspace/a/${GENERATED_BUILD_FILE_NAME})" =~ "bp2build/a/${GENERATED_BUILD_FILE_NAME}"$ ]] \
|
||||
|| fail "${GENERATED_BUILD_FILE_NAME} files symlinked to the wrong place"
|
||||
}
|
||||
|
||||
function test_bp2build_fails_fast {
|
||||
setup
|
||||
|
||||
mkdir -p "a/${GENERATED_BUILD_FILE_NAME}"
|
||||
cat > a/Android.bp <<EOF
|
||||
filegroup {
|
||||
name: "a",
|
||||
srcs: ["a.txt"],
|
||||
bazel_module: { bp2build_available: true },
|
||||
}
|
||||
EOF
|
||||
|
||||
mkdir -p "b/${GENERATED_BUILD_FILE_NAME}"
|
||||
cat > b/Android.bp <<EOF
|
||||
filegroup {
|
||||
name: "b",
|
||||
srcs: ["b.txt"],
|
||||
bazel_module: { bp2build_available: true },
|
||||
}
|
||||
EOF
|
||||
|
||||
if run_soong bp2build >& "$MOCK_TOP/errors"; then
|
||||
fail "Build should have failed"
|
||||
fi
|
||||
|
||||
# we should expect at least one error
|
||||
grep -q -E "(a|b)/${GENERATED_BUILD_FILE_NAME}' exist" "$MOCK_TOP/errors" || fail "Error for ${GENERATED_BUILD_FILE_NAME} not found"
|
||||
}
|
||||
|
||||
function test_bp2build_back_and_forth_null_build {
|
||||
setup
|
||||
|
||||
run_soong
|
||||
local -r output_mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
|
||||
run_soong bp2build
|
||||
local -r output_mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
if [[ "$output_mtime1" != "$output_mtime2" ]]; then
|
||||
fail "Output Ninja file changed when switching to bp2build"
|
||||
fi
|
||||
|
||||
local -r marker_mtime1=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
|
||||
run_soong
|
||||
local -r output_mtime3=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r marker_mtime2=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
if [[ "$output_mtime1" != "$output_mtime3" ]]; then
|
||||
fail "Output Ninja file changed when switching to regular build from bp2build"
|
||||
fi
|
||||
if [[ "$marker_mtime1" != "$marker_mtime2" ]]; then
|
||||
fail "bp2build marker file changed when switching to regular build from bp2build"
|
||||
fi
|
||||
|
||||
run_soong bp2build
|
||||
local -r output_mtime4=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r marker_mtime3=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
if [[ "$output_mtime1" != "$output_mtime4" ]]; then
|
||||
fail "Output Ninja file changed when switching back to bp2build"
|
||||
fi
|
||||
if [[ "$marker_mtime1" != "$marker_mtime3" ]]; then
|
||||
fail "bp2build marker file changed when switching back to bp2build"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_queryview_smoke() {
|
||||
setup
|
||||
|
||||
run_soong queryview
|
||||
[[ -e out/soong/queryview/WORKSPACE ]] || fail "queryview WORKSPACE file not created"
|
||||
|
||||
}
|
||||
|
||||
function test_queryview_null_build() {
|
||||
setup
|
||||
|
||||
|
@ -886,14 +609,14 @@ function test_queryview_null_build() {
|
|||
}
|
||||
|
||||
# This test verifies that adding a new glob to a blueprint file only
|
||||
# causes build.ninja to be regenerated on the *next* build, and *not*
|
||||
# causes build."${target_product}".ninja to be regenerated on the *next* build, and *not*
|
||||
# the build after. (This is a regression test for a bug where globs
|
||||
# resulted in two successive regenerations.)
|
||||
function test_new_glob_incrementality {
|
||||
setup
|
||||
|
||||
run_soong nothing
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
mkdir -p globdefpkg/
|
||||
cat > globdefpkg/Android.bp <<'EOF'
|
||||
|
@ -904,14 +627,14 @@ filegroup {
|
|||
EOF
|
||||
|
||||
run_soong nothing
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
if [[ "$mtime1" == "$mtime2" ]]; then
|
||||
fail "Ninja file was not regenerated, despite a new bp file"
|
||||
fi
|
||||
|
||||
run_soong nothing
|
||||
local -r mtime3=$(stat -c "%y" out/soong/build.ninja)
|
||||
local -r mtime3=$(stat -c "%y" out/soong/build."${target_product}".ninja)
|
||||
|
||||
if [[ "$mtime2" != "$mtime3" ]]; then
|
||||
fail "Ninja file was regenerated despite no previous bp changes"
|
||||
|
|
|
@ -1,445 +0,0 @@
|
|||
#!/bin/bash -eu
|
||||
|
||||
set -o pipefail
|
||||
|
||||
# Test that bp2build and Bazel can play nicely together
|
||||
|
||||
source "$(dirname "$0")/lib.sh"
|
||||
|
||||
readonly GENERATED_BUILD_FILE_NAME="BUILD.bazel"
|
||||
|
||||
function test_bp2build_null_build {
|
||||
setup
|
||||
run_soong bp2build
|
||||
local -r output_mtime1=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
|
||||
run_soong bp2build
|
||||
local -r output_mtime2=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
|
||||
if [[ "$output_mtime1" != "$output_mtime2" ]]; then
|
||||
fail "Output bp2build marker file changed on null build"
|
||||
fi
|
||||
}
|
||||
|
||||
# Tests that, if bp2build reruns due to a blueprint file changing, that
|
||||
# BUILD files whose contents are unchanged are not regenerated.
|
||||
function test_bp2build_unchanged {
|
||||
setup
|
||||
|
||||
mkdir -p pkg
|
||||
touch pkg/x.txt
|
||||
cat > pkg/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "x",
|
||||
srcs: ["x.txt"],
|
||||
bazel_module: {bp2build_available: true},
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
local -r buildfile_mtime1=$(stat -c "%y" out/soong/bp2build/pkg/BUILD.bazel)
|
||||
local -r marker_mtime1=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
|
||||
# Force bp2build to rerun by updating the timestamp of a blueprint file.
|
||||
touch pkg/Android.bp
|
||||
|
||||
run_soong bp2build
|
||||
local -r buildfile_mtime2=$(stat -c "%y" out/soong/bp2build/pkg/BUILD.bazel)
|
||||
local -r marker_mtime2=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
|
||||
if [[ "$marker_mtime1" == "$marker_mtime2" ]]; then
|
||||
fail "Expected bp2build marker file to change"
|
||||
fi
|
||||
if [[ "$buildfile_mtime1" != "$buildfile_mtime2" ]]; then
|
||||
fail "BUILD.bazel was updated even though contents are same"
|
||||
fi
|
||||
|
||||
# Force bp2build to rerun by updating the timestamp of the constants_exported_to_soong.bzl file.
|
||||
touch build/bazel/constants_exported_to_soong.bzl
|
||||
|
||||
run_soong bp2build
|
||||
local -r buildfile_mtime3=$(stat -c "%y" out/soong/bp2build/pkg/BUILD.bazel)
|
||||
local -r marker_mtime3=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
|
||||
if [[ "$marker_mtime2" == "$marker_mtime3" ]]; then
|
||||
fail "Expected bp2build marker file to change"
|
||||
fi
|
||||
if [[ "$buildfile_mtime2" != "$buildfile_mtime3" ]]; then
|
||||
fail "BUILD.bazel was updated even though contents are same"
|
||||
fi
|
||||
}
|
||||
|
||||
# Tests that blueprint files that are deleted are not present when the
|
||||
# bp2build tree is regenerated.
|
||||
function test_bp2build_deleted_blueprint {
|
||||
setup
|
||||
|
||||
mkdir -p pkg
|
||||
touch pkg/x.txt
|
||||
cat > pkg/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "x",
|
||||
srcs: ["x.txt"],
|
||||
bazel_module: {bp2build_available: true},
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
if [[ ! -e "./out/soong/bp2build/pkg/BUILD.bazel" ]]; then
|
||||
fail "Expected pkg/BUILD.bazel to be generated"
|
||||
fi
|
||||
|
||||
rm pkg/Android.bp
|
||||
|
||||
run_soong bp2build
|
||||
if [[ -e "./out/soong/bp2build/pkg/BUILD.bazel" ]]; then
|
||||
fail "Expected pkg/BUILD.bazel to be deleted"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_bp2build_null_build_with_globs {
|
||||
setup
|
||||
|
||||
mkdir -p foo/bar
|
||||
cat > foo/bar/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "globs",
|
||||
srcs: ["*.txt"],
|
||||
}
|
||||
EOF
|
||||
touch foo/bar/a.txt foo/bar/b.txt
|
||||
|
||||
run_soong bp2build
|
||||
local -r output_mtime1=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
|
||||
run_soong bp2build
|
||||
local -r output_mtime2=$(stat -c "%y" out/soong/bp2build_workspace_marker)
|
||||
|
||||
if [[ "$output_mtime1" != "$output_mtime2" ]]; then
|
||||
fail "Output bp2build marker file changed on null build"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_different_relative_outdir {
|
||||
setup
|
||||
|
||||
mkdir -p a
|
||||
touch a/g.txt
|
||||
cat > a/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "g",
|
||||
srcs: ["g.txt"],
|
||||
bazel_module: {bp2build_available: true},
|
||||
}
|
||||
EOF
|
||||
|
||||
# A directory under $MOCK_TOP
|
||||
outdir=out2
|
||||
trap "rm -rf $outdir" EXIT
|
||||
# Modify OUT_DIR in a subshell so it doesn't affect the top level one.
|
||||
(export OUT_DIR=$outdir; run_soong bp2build && run_bazel build --config=bp2build --config=ci //a:g)
|
||||
}
|
||||
|
||||
function test_different_absolute_outdir {
|
||||
setup
|
||||
|
||||
mkdir -p a
|
||||
touch a/g.txt
|
||||
cat > a/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "g",
|
||||
srcs: ["g.txt"],
|
||||
bazel_module: {bp2build_available: true},
|
||||
}
|
||||
EOF
|
||||
|
||||
# A directory under /tmp/...
|
||||
outdir=$(mktemp -t -d st.XXXXX)
|
||||
trap 'rm -rf $outdir' EXIT
|
||||
# Modify OUT_DIR in a subshell so it doesn't affect the top level one.
|
||||
(export OUT_DIR=$outdir; run_soong bp2build && run_bazel build --config=bp2build --config=ci //a:g)
|
||||
}
|
||||
|
||||
function _bp2build_generates_all_buildfiles {
|
||||
setup
|
||||
|
||||
mkdir -p foo/convertible_soong_module
|
||||
cat > foo/convertible_soong_module/Android.bp <<'EOF'
|
||||
genrule {
|
||||
name: "the_answer",
|
||||
cmd: "echo '42' > $(out)",
|
||||
out: [
|
||||
"the_answer.txt",
|
||||
],
|
||||
bazel_module: {
|
||||
bp2build_available: true,
|
||||
},
|
||||
}
|
||||
EOF
|
||||
|
||||
mkdir -p foo/unconvertible_soong_module
|
||||
cat > foo/unconvertible_soong_module/Android.bp <<'EOF'
|
||||
genrule {
|
||||
name: "not_the_answer",
|
||||
cmd: "echo '43' > $(out)",
|
||||
out: [
|
||||
"not_the_answer.txt",
|
||||
],
|
||||
bazel_module: {
|
||||
bp2build_available: false,
|
||||
},
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
|
||||
if [[ ! -f "./out/soong/workspace/foo/convertible_soong_module/${GENERATED_BUILD_FILE_NAME}" ]]; then
|
||||
fail "./out/soong/workspace/foo/convertible_soong_module/${GENERATED_BUILD_FILE_NAME} was not generated"
|
||||
fi
|
||||
|
||||
if [[ ! -f "./out/soong/workspace/foo/unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME}" ]]; then
|
||||
fail "./out/soong/workspace/foo/unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME} was not generated"
|
||||
fi
|
||||
|
||||
if ! grep "the_answer" "./out/soong/workspace/foo/convertible_soong_module/${GENERATED_BUILD_FILE_NAME}"; then
|
||||
fail "missing BUILD target the_answer in convertible_soong_module/${GENERATED_BUILD_FILE_NAME}"
|
||||
fi
|
||||
|
||||
if grep "not_the_answer" "./out/soong/workspace/foo/unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME}"; then
|
||||
fail "found unexpected BUILD target not_the_answer in unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME}"
|
||||
fi
|
||||
|
||||
if ! grep "filegroup" "./out/soong/workspace/foo/unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME}"; then
|
||||
fail "missing filegroup in unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME}"
|
||||
fi
|
||||
|
||||
# NOTE: We don't actually use the extra BUILD file for anything here
|
||||
run_bazel build --config=android --config=bp2build --config=ci //foo/...
|
||||
|
||||
local -r the_answer_file="$(find -L bazel-out -name the_answer.txt)"
|
||||
if [[ ! -f "${the_answer_file}" ]]; then
|
||||
fail "Expected the_answer.txt to be generated, but was missing"
|
||||
fi
|
||||
if ! grep 42 "${the_answer_file}"; then
|
||||
fail "Expected to find 42 in '${the_answer_file}'"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_bp2build_generates_all_buildfiles {
|
||||
_save_trap=$(trap -p EXIT)
|
||||
trap '[[ $? -ne 0 ]] && echo Are you running this locally? Try changing --sandbox_tmpfs_path to something other than /tmp/ in build/bazel/linux.bazelrc.' EXIT
|
||||
_bp2build_generates_all_buildfiles
|
||||
eval "${_save_trap}"
|
||||
}
|
||||
|
||||
function test_build_files_take_precedence {
|
||||
_save_trap=$(trap -p EXIT)
|
||||
trap '[[ $? -ne 0 ]] && echo Are you running this locally? Try changing --sandbox_tmpfs_path to something other than /tmp/ in build/bazel/linux.bazelrc.' EXIT
|
||||
_build_files_take_precedence
|
||||
eval "${_save_trap}"
|
||||
}
|
||||
|
||||
function _build_files_take_precedence {
|
||||
setup
|
||||
|
||||
# This specific directory is hardcoded in bp2build as being one
|
||||
# where the BUILD file should be intentionally kept.
|
||||
mkdir -p testpkg/keep_build_file
|
||||
cat > testpkg/keep_build_file/Android.bp <<'EOF'
|
||||
genrule {
|
||||
name: "print_origin",
|
||||
cmd: "echo 'from_soong' > $(out)",
|
||||
out: [
|
||||
"origin.txt",
|
||||
],
|
||||
bazel_module: {
|
||||
bp2build_available: true,
|
||||
},
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
run_bazel build --config=android --config=bp2build --config=ci //testpkg/keep_build_file:print_origin
|
||||
|
||||
local -r output_file="$(find -L bazel-out -name origin.txt)"
|
||||
if [[ ! -f "${output_file}" ]]; then
|
||||
fail "Expected origin.txt to be generated, but was missing"
|
||||
fi
|
||||
if ! grep from_soong "${output_file}"; then
|
||||
fail "Expected to find 'from_soong' in '${output_file}'"
|
||||
fi
|
||||
|
||||
cat > testpkg/keep_build_file/BUILD.bazel <<'EOF'
|
||||
genrule(
|
||||
name = "print_origin",
|
||||
outs = ["origin.txt"],
|
||||
cmd = "echo 'from_bazel' > $@",
|
||||
)
|
||||
EOF
|
||||
|
||||
# Clean the workspace. There is a test infrastructure bug where run_bazel
|
||||
# will symlink Android.bp files in the source directory again and thus
|
||||
# pollute the workspace.
|
||||
# TODO: b/286059878 - Remove this clean after the underlying bug is fixed.
|
||||
run_soong clean
|
||||
run_soong bp2build
|
||||
run_bazel build --config=android --config=bp2build --config=ci //testpkg/keep_build_file:print_origin
|
||||
if ! grep from_bazel "${output_file}"; then
|
||||
fail "Expected to find 'from_bazel' in '${output_file}'"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_bp2build_symlinks_files {
|
||||
setup
|
||||
mkdir -p foo
|
||||
touch foo/BLANK1
|
||||
touch foo/BLANK2
|
||||
touch foo/F2D
|
||||
touch foo/BUILD
|
||||
|
||||
run_soong bp2build
|
||||
|
||||
if [[ -e "./out/soong/workspace/foo/BUILD" ]]; then
|
||||
fail "./out/soong/workspace/foo/BUILD should be omitted"
|
||||
fi
|
||||
for file in BLANK1 BLANK2 F2D
|
||||
do
|
||||
if [[ ! -L "./out/soong/workspace/foo/$file" ]]; then
|
||||
fail "./out/soong/workspace/foo/$file should exist"
|
||||
fi
|
||||
done
|
||||
local -r BLANK1_BEFORE=$(stat -c %y "./out/soong/workspace/foo/BLANK1")
|
||||
|
||||
rm foo/BLANK2
|
||||
rm foo/F2D
|
||||
mkdir foo/F2D
|
||||
touch foo/F2D/BUILD
|
||||
|
||||
run_soong bp2build
|
||||
|
||||
if [[ -e "./out/soong/workspace/foo/BUILD" ]]; then
|
||||
fail "./out/soong/workspace/foo/BUILD should be omitted"
|
||||
fi
|
||||
local -r BLANK1_AFTER=$(stat -c %y "./out/soong/workspace/foo/BLANK1")
|
||||
if [[ "$BLANK1_AFTER" != "$BLANK1_BEFORE" ]]; then
|
||||
fail "./out/soong/workspace/foo/BLANK1 should be untouched"
|
||||
fi
|
||||
if [[ -e "./out/soong/workspace/foo/BLANK2" ]]; then
|
||||
fail "./out/soong/workspace/foo/BLANK2 should be removed"
|
||||
fi
|
||||
if [[ -L "./out/soong/workspace/foo/F2D" ]] || [[ ! -d "./out/soong/workspace/foo/F2D" ]]; then
|
||||
fail "./out/soong/workspace/foo/F2D should be a dir"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_cc_correctness {
|
||||
setup
|
||||
|
||||
mkdir -p a
|
||||
cat > a/Android.bp <<EOF
|
||||
cc_object {
|
||||
name: "qq",
|
||||
srcs: ["qq.cc"],
|
||||
bazel_module: {
|
||||
bp2build_available: true,
|
||||
},
|
||||
stl: "none",
|
||||
system_shared_libs: [],
|
||||
}
|
||||
EOF
|
||||
|
||||
cat > a/qq.cc <<EOF
|
||||
#include "qq.h"
|
||||
int qq() {
|
||||
return QQ;
|
||||
}
|
||||
EOF
|
||||
|
||||
cat > a/qq.h <<EOF
|
||||
#define QQ 1
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
|
||||
run_bazel build --config=android --config=bp2build --config=ci //a:qq
|
||||
local -r output_mtime1=$(stat -c "%y" bazel-bin/a/_objs/qq/qq.o)
|
||||
|
||||
run_bazel build --config=android --config=bp2build --config=ci //a:qq
|
||||
local -r output_mtime2=$(stat -c "%y" bazel-bin/a/_objs/qq/qq.o)
|
||||
|
||||
if [[ "$output_mtime1" != "$output_mtime2" ]]; then
|
||||
fail "output changed on null build"
|
||||
fi
|
||||
|
||||
cat > a/qq.h <<EOF
|
||||
#define QQ 2
|
||||
EOF
|
||||
|
||||
run_bazel build --config=android --config=bp2build --config=ci //a:qq
|
||||
local -r output_mtime3=$(stat -c "%y" bazel-bin/a/_objs/qq/qq.o)
|
||||
|
||||
if [[ "$output_mtime1" == "$output_mtime3" ]]; then
|
||||
fail "output not changed when included header changed"
|
||||
fi
|
||||
}
|
||||
|
||||
# Regression test for the following failure during symlink forest creation:
|
||||
#
|
||||
# Cannot stat '/tmp/st.rr054/foo/bar/unresolved_symlink': stat /tmp/st.rr054/foo/bar/unresolved_symlink: no such file or directory
|
||||
#
|
||||
function test_bp2build_null_build_with_unresolved_symlink_in_source() {
|
||||
setup
|
||||
|
||||
mkdir -p foo/bar
|
||||
ln -s /tmp/non-existent foo/bar/unresolved_symlink
|
||||
cat > foo/bar/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "fg",
|
||||
srcs: ["unresolved_symlink/non-existent-file.txt"],
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong bp2build
|
||||
|
||||
dest=$(readlink -f out/soong/workspace/foo/bar/unresolved_symlink)
|
||||
if [[ "$dest" != "/tmp/non-existent" ]]; then
|
||||
fail "expected to plant an unresolved symlink out/soong/workspace/foo/bar/unresolved_symlink that resolves to /tmp/non-existent"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_bazel_standalone_output_paths_contain_product_name {
|
||||
setup
|
||||
mkdir -p a
|
||||
cat > a/Android.bp <<EOF
|
||||
cc_object {
|
||||
name: "qq",
|
||||
srcs: ["qq.cc"],
|
||||
bazel_module: {
|
||||
bp2build_available: true,
|
||||
},
|
||||
stl: "none",
|
||||
system_shared_libs: [],
|
||||
}
|
||||
EOF
|
||||
|
||||
cat > a/qq.cc <<EOF
|
||||
#include "qq.h"
|
||||
int qq() {
|
||||
return QQ;
|
||||
}
|
||||
EOF
|
||||
|
||||
cat > a/qq.h <<EOF
|
||||
#define QQ 1
|
||||
EOF
|
||||
|
||||
export TARGET_PRODUCT=aosp_arm; run_soong bp2build
|
||||
local -r output=$(run_bazel cquery //a:qq --output=files --config=android --config=bp2build --config=ci)
|
||||
if [[ ! $(echo ${output} | grep "bazel-out/aosp_arm") ]]; then
|
||||
fail "Did not find the product name '${TARGET_PRODUCT}' in the output path. This can cause " \
|
||||
"unnecessary rebuilds when toggling between products as bazel outputs for different products will " \
|
||||
"clobber each other. Output paths are: \n${output}"
|
||||
fi
|
||||
}
|
||||
|
||||
scan_and_run_tests
|
|
@ -1,166 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Copyright (C) 2023 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Soong/Bazel integration test to build the mainline modules in mixed build and
|
||||
# compare the DCLA libs extracted from those modules to ensure they are identical.
|
||||
|
||||
if [ ! -e "build/make/core/Makefile" ]; then
|
||||
echo "$0 must be run from the top of the Android source tree."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TARGET_PRODUCTS=(
|
||||
module_arm64
|
||||
module_x86_64
|
||||
)
|
||||
|
||||
MODULES=(
|
||||
# These modules depend on the DCLA libs
|
||||
com.android.adbd
|
||||
com.android.art
|
||||
com.android.art.debug
|
||||
com.android.art.testing
|
||||
com.android.btservices
|
||||
com.android.conscrypt
|
||||
com.android.i18n
|
||||
com.android.media
|
||||
com.android.media.swcodec
|
||||
com.android.resolv
|
||||
com.android.runtime
|
||||
com.android.tethering
|
||||
)
|
||||
|
||||
BAZEL_TARGETS=(
|
||||
//packages/modules/adb/apex:com.android.adbd
|
||||
//frameworks/av/apex:com.android.media.swcodec
|
||||
)
|
||||
|
||||
DCLA_LIBS=(
|
||||
libbase.so
|
||||
libc++.so
|
||||
libcrypto.so
|
||||
libcutils.so
|
||||
libstagefright_flacdec.so
|
||||
libutils.so
|
||||
)
|
||||
|
||||
if [[ -z ${OUT_DIR+x} ]]; then
|
||||
OUT_DIR="out"
|
||||
fi
|
||||
|
||||
if [[ -z ${ANDROID_HOST_OUT+x} ]]; then
|
||||
export ANDROID_HOST_OUT="out/host/linux-x86"
|
||||
fi
|
||||
|
||||
######################
|
||||
# Build deapexer and debugfs
|
||||
######################
|
||||
DEAPEXER="${ANDROID_HOST_OUT}/bin/deapexer"
|
||||
DEBUGFS="${ANDROID_HOST_OUT}/bin/debugfs"
|
||||
if [[ ! -f "${DEAPEXER}" ]] || [[ ! -f "${DEBUGFS}" ]]; then
|
||||
build/soong/soong_ui.bash --make-mode --skip-soong-tests deapexer debugfs
|
||||
fi
|
||||
|
||||
DEAPEXER="${DEAPEXER} --debugfs_path=${DEBUGFS}"
|
||||
|
||||
############
|
||||
# Test Setup
|
||||
############
|
||||
OUTPUT_DIR="$(mktemp -d tmp.XXXXXX)"
|
||||
|
||||
function call_bazel() {
|
||||
build/bazel/bin/bazel $@
|
||||
}
|
||||
|
||||
function cleanup {
|
||||
rm -rf "${OUTPUT_DIR}"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
#######
|
||||
# Tests
|
||||
#######
|
||||
|
||||
function extract_dcla_libs() {
|
||||
local product=$1; shift
|
||||
local modules=("$@"); shift
|
||||
|
||||
for module in "${modules[@]}"; do
|
||||
local apex="${OUTPUT_DIR}/${product}/${module}.apex"
|
||||
local extract_dir="${OUTPUT_DIR}/${product}/${module}/extract"
|
||||
|
||||
$DEAPEXER extract "${apex}" "${extract_dir}"
|
||||
done
|
||||
}
|
||||
|
||||
function compare_dcla_libs() {
|
||||
local product=$1; shift
|
||||
local modules=("$@"); shift
|
||||
|
||||
for lib in "${DCLA_LIBS[@]}"; do
|
||||
for arch in lib lib64; do
|
||||
local prev_sha=""
|
||||
for module in "${modules[@]}"; do
|
||||
local file="${OUTPUT_DIR}/${product}/${module}/extract/${arch}/${lib}"
|
||||
if [[ ! -f "${file}" ]]; then
|
||||
# not all libs are present in a module
|
||||
echo "file doesn't exist: ${file}"
|
||||
continue
|
||||
fi
|
||||
sha=$(sha1sum ${file})
|
||||
sha="${sha% *}"
|
||||
if [ "${prev_sha}" == "" ]; then
|
||||
prev_sha="${sha}"
|
||||
elif [ "${sha}" != "${prev_sha}" ] && { [ "${lib}" != "libcrypto.so" ] || [[ "${module}" != *"com.android.tethering" ]]; }; then
|
||||
echo "Test failed, ${lib} has different hash value"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
export UNBUNDLED_BUILD_SDKS_FROM_SOURCE=true # don't rely on prebuilts
|
||||
export TARGET_BUILD_APPS="${MODULES[@]}"
|
||||
for product in "${TARGET_PRODUCTS[@]}"; do
|
||||
###########
|
||||
# Build the mainline modules
|
||||
###########
|
||||
packages/modules/common/build/build_unbundled_mainline_module.sh \
|
||||
--product "${product}" \
|
||||
--dist_dir "${OUTPUT_DIR}/${product}"
|
||||
|
||||
bazel_apexes=()
|
||||
if [[ -n ${TEST_BAZEL+x} ]] && [ "${TEST_BAZEL}" = true ]; then
|
||||
export TARGET_PRODUCT="${product/module/aosp}"
|
||||
call_bazel build --config=bp2build --config=ci --config=android "${BAZEL_TARGETS[@]}"
|
||||
for target in "${BAZEL_TARGETS[@]}"; do
|
||||
apex_path="$(realpath $(call_bazel cquery --config=bp2build --config=android --config=ci --output=files $target))"
|
||||
mkdir -p ${OUTPUT_DIR}/${product}
|
||||
bazel_apex="bazel_$(basename $apex_path)"
|
||||
mv $apex_path ${OUTPUT_DIR}/${product}/${bazel_apex}
|
||||
bazel_apexes+=(${bazel_apex%".apex"})
|
||||
done
|
||||
fi
|
||||
|
||||
all_modeuls=(${MODULES[@]} ${bazel_apexes[@]})
|
||||
extract_dcla_libs "${product}" "${all_modeuls[@]}"
|
||||
compare_dcla_libs "${product}" "${all_modeuls[@]}"
|
||||
done
|
||||
|
||||
echo "Test passed"
|
|
@ -1,99 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
# This test exercises mixed builds where Soong and Bazel cooperate in building
|
||||
# Android.
|
||||
#
|
||||
# When the execroot is deleted, the Bazel server process will automatically
|
||||
# terminate itself.
|
||||
|
||||
source "$(dirname "$0")/lib.sh"
|
||||
|
||||
function test_bazel_smoke {
|
||||
setup
|
||||
|
||||
run_soong bp2build
|
||||
|
||||
run_bazel info --config=bp2build
|
||||
}
|
||||
|
||||
function test_add_irrelevant_file {
|
||||
setup
|
||||
|
||||
mkdir -p soong_tests/a/b
|
||||
touch soong_tests/a/b/c.txt
|
||||
cat > soong_tests/a/b/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "c",
|
||||
srcs: ["c.txt"],
|
||||
bazel_module: { bp2build_available: true },
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong --bazel-mode-staging nothing
|
||||
|
||||
if [[ ! -e out/soong/bp2build/soong_tests/a/b/BUILD.bazel ]]; then
|
||||
fail "BUILD.bazel not created"
|
||||
fi
|
||||
|
||||
if [[ ! -e out/soong/build.ninja ]]; then
|
||||
fail "build.ninja not created"
|
||||
fi
|
||||
|
||||
local mtime_build1=$(stat -c "%y" out/soong/bp2build/soong_tests/a/b/BUILD.bazel)
|
||||
local mtime_ninja1=$(stat -c "%y" out/soong/build.ninja)
|
||||
|
||||
touch soong_tests/a/irrelevant.txt
|
||||
|
||||
run_soong --bazel-mode-staging nothing
|
||||
local mtime_build2=$(stat -c "%y" out/soong/bp2build/soong_tests/a/b/BUILD.bazel)
|
||||
local mtime_ninja2=$(stat -c "%y" out/soong/build.ninja)
|
||||
|
||||
if [[ "$mtime_build1" != "$mtime_build2" ]]; then
|
||||
fail "BUILD.bazel was generated"
|
||||
fi
|
||||
|
||||
if [[ "$mtime_ninja1" != "$mtime_ninja2" ]]; then
|
||||
fail "build.ninja was regenerated"
|
||||
fi
|
||||
|
||||
if [[ ! -e out/soong/workspace/soong_tests/a/irrelevant.txt ]]; then
|
||||
fail "new file was not symlinked"
|
||||
fi
|
||||
}
|
||||
|
||||
function test_force_enabled_modules {
|
||||
setup
|
||||
# b/273910287 - test force enable modules
|
||||
mkdir -p soong_tests/a/b
|
||||
cat > soong_tests/a/b/Android.bp <<'EOF'
|
||||
genrule {
|
||||
name: "touch-file",
|
||||
out: ["fake-out.txt"],
|
||||
cmd: "touch $(out)",
|
||||
bazel_module: { bp2build_available: true },
|
||||
}
|
||||
|
||||
genrule {
|
||||
name: "unenabled-touch-file",
|
||||
out: ["fake-out2.txt"],
|
||||
cmd: "touch $(out)",
|
||||
bazel_module: { bp2build_available: false },
|
||||
}
|
||||
EOF
|
||||
run_soong --bazel-mode-staging --bazel-force-enabled-modules=touch-file nothing
|
||||
local bazel_contained=`grep out/soong/.intermediates/soong_tests/a/b/touch-file/gen/fake-out.txt out/soong/build.ninja`
|
||||
if [[ $bazel_contained == '' ]]; then
|
||||
fail "Bazel actions not found for force-enabled module"
|
||||
fi
|
||||
|
||||
unused=`run_soong --bazel-force-enabled-modules=unenabled-touch-file --ensure-allowlist-integrity nothing >/dev/null`
|
||||
|
||||
if [[ $? -ne 1 ]]; then
|
||||
fail "Expected failure due to force-enabling an unenabled module "
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
scan_and_run_tests
|
|
@ -1,83 +0,0 @@
|
|||
#!/bin/bash -eu
|
||||
|
||||
# Copyright (C) 2023 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
set -o pipefail
|
||||
|
||||
source "$(dirname "$0")/lib.sh"
|
||||
|
||||
# This test verifies that adding USE_PERSISTENT_BAZEL creates a Bazel process
|
||||
# that outlasts the build process.
|
||||
# This test should only be run in sandboxed environments (because this test
|
||||
# verifies a Bazel process using global process list, and may spawn lingering
|
||||
# Bazel processes).
|
||||
function test_persistent_bazel {
|
||||
setup
|
||||
|
||||
# Ensure no existing Bazel process.
|
||||
if [[ -e out/bazel/output/server/server.pid.txt ]]; then
|
||||
kill $(cat out/bazel/output/server/server.pid.txt) 2>/dev/null || true
|
||||
if kill -0 $(cat out/bazel/output/server/server.pid.txt) 2>/dev/null ; then
|
||||
fail "Error killing pre-setup bazel"
|
||||
fi
|
||||
fi
|
||||
|
||||
USE_PERSISTENT_BAZEL=1 run_soong nothing
|
||||
|
||||
if ! kill -0 $(cat out/bazel/output/server/server.pid.txt) 2>/dev/null ; then
|
||||
fail "Persistent bazel process expected, but not found after first build"
|
||||
fi
|
||||
BAZEL_PID=$(cat out/bazel/output/server/server.pid.txt)
|
||||
|
||||
USE_PERSISTENT_BAZEL=1 run_soong nothing
|
||||
|
||||
if ! kill -0 $BAZEL_PID 2>/dev/null ; then
|
||||
fail "Bazel pid $BAZEL_PID was killed after second build"
|
||||
fi
|
||||
|
||||
kill $BAZEL_PID 2>/dev/null
|
||||
if ! kill -0 $BAZEL_PID 2>/dev/null ; then
|
||||
fail "Error killing bazel on shutdown"
|
||||
fi
|
||||
}
|
||||
|
||||
# Verifies that USE_PERSISTENT_BAZEL mode operates as expected in the event
|
||||
# that there are Bazel failures.
|
||||
function test_bazel_failure {
|
||||
setup
|
||||
|
||||
# Ensure no existing Bazel process.
|
||||
if [[ -e out/bazel/output/server/server.pid.txt ]]; then
|
||||
kill $(cat out/bazel/output/server/server.pid.txt) 2>/dev/null || true
|
||||
if kill -0 $(cat out/bazel/output/server/server.pid.txt) 2>/dev/null ; then
|
||||
fail "Error killing pre-setup bazel"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Introduce a syntax error in a BUILD file which is used in every build
|
||||
# (Note this is a BUILD file which is copied as part of test setup, so this
|
||||
# has no effect on sources outside of this test.
|
||||
rm -rf build/bazel/rules
|
||||
|
||||
USE_PERSISTENT_BAZEL=1 run_soong nothing 1>out/failurelog.txt 2>&1 && fail "Expected build failure" || true
|
||||
|
||||
if ! grep -sq "cannot load //build/bazel/rules/common/api_constants.bzl" out/failurelog.txt ; then
|
||||
fail "Expected error to contain 'cannot load //build/bazel/rules/common/api_constants.bzl', instead got:\n$(cat out/failurelog.txt)"
|
||||
fi
|
||||
|
||||
kill $(cat out/bazel/output/server/server.pid.txt) 2>/dev/null || true
|
||||
}
|
||||
|
||||
scan_and_run_tests
|
|
@ -4,25 +4,6 @@ set -o pipefail
|
|||
|
||||
TOP="$(readlink -f "$(dirname "$0")"/../../..)"
|
||||
"$TOP/build/soong/tests/androidmk_test.sh"
|
||||
"$TOP/build/soong/tests/b_args_test.sh"
|
||||
"$TOP/build/soong/tests/bootstrap_test.sh"
|
||||
"$TOP/build/soong/tests/mixed_mode_test.sh"
|
||||
"$TOP/build/soong/tests/bp2build_bazel_test.sh"
|
||||
"$TOP/build/soong/tests/persistent_bazel_test.sh"
|
||||
"$TOP/build/soong/tests/soong_test.sh"
|
||||
"$TOP/build/soong/tests/stale_metrics_files_test.sh"
|
||||
"$TOP/build/soong/tests/symlink_forest_rerun_test.sh"
|
||||
"$TOP/prebuilts/build-tools/linux-x86/bin/py3-cmd" "$TOP/build/bazel/ci/rbc_dashboard.py" aosp_arm64-userdebug
|
||||
|
||||
# The following tests build against the full source tree and don't rely on the
|
||||
# mock client.
|
||||
"$TOP/build/soong/tests/apex_comparison_tests.sh"
|
||||
"$TOP/build/soong/tests/apex_comparison_tests.sh" "module_arm64only"
|
||||
TEST_BAZEL=true extra_build_params=--bazel-mode-staging "$TOP/build/soong/tests/dcla_apex_comparison_test.sh"
|
||||
#BUILD_BROKEN_DISABLE_BAZEL=true "$TOP/build/soong/tests/dcla_apex_comparison_test.sh"
|
||||
"$TOP/build/soong/tests/apex_cc_module_arch_variant_tests.sh"
|
||||
"$TOP/build/soong/tests/apex_cc_module_arch_variant_tests.sh" "aosp_arm" "armv7-a"
|
||||
"$TOP/build/soong/tests/apex_cc_module_arch_variant_tests.sh" "aosp_cf_arm64_phone" "armv8-a" "cortex-a53"
|
||||
|
||||
"$TOP/build/bazel/ci/b_test.sh"
|
||||
"$TOP/build/soong/tests/symlinks_path_test.sh"
|
||||
|
|
|
@ -1,47 +0,0 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
# This test ensures that stale metrics files are deleted after each run
|
||||
|
||||
# Run bazel
|
||||
# Note - bp2build metrics are present after clean runs, only
|
||||
build/soong/soong_ui.bash --make-mode clean
|
||||
build/bazel/bin/b build libcore:all
|
||||
soong_build_metrics_files=("out/soong_build_metrics.pb" "out/build_progress.pb" "out/soong_metrics" "out/bp2build_metrics.pb")
|
||||
bazel_build_metrics_files=("out/bazel_metrics.pb" "out/build_progress.pb" "out/soong_metrics" "out/bp2build_metrics.pb")
|
||||
|
||||
# Ensure bazel metrics files are present
|
||||
for i in ${!bazel_build_metrics_files[@]};
|
||||
do
|
||||
file=${bazel_build_metrics_files[$i]}
|
||||
if [[ ! -f $file ]]; then
|
||||
echo "Missing metrics file for Bazel build " $file
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
# Run a soong build
|
||||
build/soong/soong_ui.bash --make-mode nothing
|
||||
|
||||
for i in ${!soong_build_metrics_files[@]};
|
||||
do
|
||||
file=${soong_build_metrics_files[$i]}
|
||||
if [[ ! -f $file ]]; then
|
||||
echo "Missing metrics file for Soong build " $file
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Ensure that bazel_metrics.pb is deleted
|
||||
if [[ -f out/bazel_metrics.pb ]]; then
|
||||
echo "Stale out/bazel_metrics.pb file detected"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run bazel again - to make sure that soong_build_metrics.pb gets deleted
|
||||
build/bazel/bin/b build libcore:all
|
||||
|
||||
if [[ -f out/soong_build_metrics.pb ]]; then
|
||||
echo "Stale out/soong_build_metrics.pb file detected"
|
||||
exit 1
|
||||
fi
|
|
@ -1,43 +0,0 @@
|
|||
#!/bin/bash -eu
|
||||
|
||||
set -o pipefail
|
||||
|
||||
# Tests that symlink forest will replant if soong_build has changed
|
||||
# Any change to the build system should trigger a rerun
|
||||
|
||||
source "$(dirname "$0")/lib.sh"
|
||||
|
||||
function test_symlink_forest_reruns {
|
||||
setup
|
||||
|
||||
mkdir -p a
|
||||
touch a/g.txt
|
||||
cat > a/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "g",
|
||||
srcs: ["g.txt"],
|
||||
}
|
||||
EOF
|
||||
|
||||
run_soong g
|
||||
|
||||
mtime=`cat out/soong/workspace/soong_build_mtime`
|
||||
# rerun with no changes - ensure that it hasn't changed
|
||||
run_soong g
|
||||
newmtime=`cat out/soong/workspace/soong_build_mtime`
|
||||
if [[ ! "$mtime" == "$mtime" ]]; then
|
||||
fail "symlink forest reran when it shouldn't have"
|
||||
fi
|
||||
|
||||
# change exit codes to force a soong_build rebuild.
|
||||
sed -i 's/os.Exit(1)/os.Exit(2)/g' build/soong/bp2build/symlink_forest.go
|
||||
|
||||
run_soong g
|
||||
newmtime=`cat out/soong/workspace/soong_build_mtime`
|
||||
if [[ "$mtime" == "$newmtime" ]]; then
|
||||
fail "symlink forest did not rerun when it should have"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
scan_and_run_tests
|
|
@ -1,51 +0,0 @@
|
|||
#!/bin/bash -eu
|
||||
|
||||
set -o pipefail
|
||||
|
||||
# Test that relative symlinks work by recreating the bug in b/259191764
|
||||
# In some cases, developers prefer to move their checkouts. This causes
|
||||
# issues in that symlinked files (namely, the bazel wrapper script)
|
||||
# cannot be found. As such, we implemented relative symlinks so that a
|
||||
# moved checkout doesn't need a full clean before rebuilding.
|
||||
# The bazel output base will still need to be removed, as Starlark
|
||||
# doesn't seem to support relative symlinks yet.
|
||||
|
||||
source "$(dirname "$0")/lib.sh"
|
||||
|
||||
function check_link_has_mock_top_prefix {
|
||||
input_link=$1
|
||||
link_target=`readlink $input_link`
|
||||
if [[ $link_target != "$MOCK_TOP"* ]]; then
|
||||
echo "Symlink for file $input_link -> $link_target doesn't start with $MOCK_TOP"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
function test_symlinks_updated_when_top_dir_changed {
|
||||
setup
|
||||
|
||||
mkdir -p a
|
||||
touch a/g.txt
|
||||
cat > a/Android.bp <<'EOF'
|
||||
filegroup {
|
||||
name: "g",
|
||||
srcs: ["g.txt"],
|
||||
bazel_module: {bp2build_available: true},
|
||||
}
|
||||
EOF
|
||||
# A directory under $MOCK_TOP
|
||||
outdir=out2
|
||||
|
||||
# Modify OUT_DIR in a subshell so it doesn't affect the top level one.
|
||||
(export OUT_DIR=$MOCK_TOP/$outdir; run_soong bp2build && run_bazel build --config=bp2build --config=ci //a:g)
|
||||
|
||||
g_txt="out2/soong/workspace/a/g.txt"
|
||||
check_link_has_mock_top_prefix "$g_txt"
|
||||
|
||||
move_mock_top
|
||||
|
||||
(export OUT_DIR=$MOCK_TOP/$outdir; run_soong bp2build && run_bazel build --config=bp2build --config=ci //a:g)
|
||||
check_link_has_mock_top_prefix "$g_txt"
|
||||
}
|
||||
|
||||
scan_and_run_tests
|
Loading…
Reference in a new issue