Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 1 | #!/bin/bash -eu |
| 2 | |
| 3 | set -o pipefail |
| 4 | |
| 5 | # Test that bp2build and Bazel can play nicely together |
| 6 | |
| 7 | source "$(dirname "$0")/lib.sh" |
| 8 | |
Rupert Shuttleworth | 413a7a9 | 2021-05-18 07:47:15 -0400 | [diff] [blame] | 9 | readonly GENERATED_BUILD_FILE_NAME="BUILD.bazel" |
| 10 | |
Jingwen Chen | 53dfa40 | 2021-08-12 09:37:14 +0000 | [diff] [blame] | 11 | function test_bp2build_null_build() { |
| 12 | setup |
Lukacs T. Berki | a1b9372 | 2021-09-02 17:23:06 +0200 | [diff] [blame] | 13 | run_soong bp2build |
Usta Shrestha | 2c9a5e3 | 2022-06-09 12:22:36 -0400 | [diff] [blame] | 14 | local -r output_mtime1=$(stat -c "%y" out/soong/bp2build_workspace_marker) |
Jingwen Chen | 53dfa40 | 2021-08-12 09:37:14 +0000 | [diff] [blame] | 15 | |
Lukacs T. Berki | a1b9372 | 2021-09-02 17:23:06 +0200 | [diff] [blame] | 16 | run_soong bp2build |
Usta Shrestha | 2c9a5e3 | 2022-06-09 12:22:36 -0400 | [diff] [blame] | 17 | local -r output_mtime2=$(stat -c "%y" out/soong/bp2build_workspace_marker) |
Jingwen Chen | 53dfa40 | 2021-08-12 09:37:14 +0000 | [diff] [blame] | 18 | |
| 19 | if [[ "$output_mtime1" != "$output_mtime2" ]]; then |
| 20 | fail "Output bp2build marker file changed on null build" |
| 21 | fi |
| 22 | } |
| 23 | |
| 24 | test_bp2build_null_build |
| 25 | |
| 26 | function test_bp2build_null_build_with_globs() { |
| 27 | setup |
| 28 | |
| 29 | mkdir -p foo/bar |
| 30 | cat > foo/bar/Android.bp <<'EOF' |
| 31 | filegroup { |
| 32 | name: "globs", |
| 33 | srcs: ["*.txt"], |
| 34 | } |
| 35 | EOF |
| 36 | touch foo/bar/a.txt foo/bar/b.txt |
| 37 | |
Lukacs T. Berki | a1b9372 | 2021-09-02 17:23:06 +0200 | [diff] [blame] | 38 | run_soong bp2build |
Usta Shrestha | 2c9a5e3 | 2022-06-09 12:22:36 -0400 | [diff] [blame] | 39 | local -r output_mtime1=$(stat -c "%y" out/soong/bp2build_workspace_marker) |
Jingwen Chen | 53dfa40 | 2021-08-12 09:37:14 +0000 | [diff] [blame] | 40 | |
Lukacs T. Berki | a1b9372 | 2021-09-02 17:23:06 +0200 | [diff] [blame] | 41 | run_soong bp2build |
Usta Shrestha | 2c9a5e3 | 2022-06-09 12:22:36 -0400 | [diff] [blame] | 42 | local -r output_mtime2=$(stat -c "%y" out/soong/bp2build_workspace_marker) |
Jingwen Chen | 53dfa40 | 2021-08-12 09:37:14 +0000 | [diff] [blame] | 43 | |
| 44 | if [[ "$output_mtime1" != "$output_mtime2" ]]; then |
| 45 | fail "Output bp2build marker file changed on null build" |
| 46 | fi |
| 47 | } |
| 48 | |
| 49 | test_bp2build_null_build_with_globs |
| 50 | |
Jingwen Chen | 7e11eb8 | 2022-10-13 09:25:38 +0000 | [diff] [blame] | 51 | function test_different_relative_outdir { |
| 52 | setup |
Jingwen Chen | 7e11eb8 | 2022-10-13 09:25:38 +0000 | [diff] [blame] | 53 | |
| 54 | mkdir -p a |
| 55 | touch a/g.txt |
| 56 | cat > a/Android.bp <<'EOF' |
| 57 | filegroup { |
| 58 | name: "g", |
| 59 | srcs: ["g.txt"], |
| 60 | bazel_module: {bp2build_available: true}, |
| 61 | } |
| 62 | EOF |
| 63 | |
| 64 | # A directory under $MOCK_TOP |
| 65 | outdir=out2 |
| 66 | trap "rm -rf $outdir" EXIT |
| 67 | # Modify OUT_DIR in a subshell so it doesn't affect the top level one. |
Cole Faust | 93dc19d | 2022-11-19 15:14:48 -0800 | [diff] [blame^] | 68 | (export OUT_DIR=$outdir; run_soong bp2build && run_bazel build --config=bp2build --config=ci //a:g) |
Jingwen Chen | 7e11eb8 | 2022-10-13 09:25:38 +0000 | [diff] [blame] | 69 | } |
| 70 | |
| 71 | test_different_relative_outdir |
| 72 | |
| 73 | function test_different_absolute_outdir { |
| 74 | setup |
Jingwen Chen | 7e11eb8 | 2022-10-13 09:25:38 +0000 | [diff] [blame] | 75 | |
| 76 | mkdir -p a |
| 77 | touch a/g.txt |
| 78 | cat > a/Android.bp <<'EOF' |
| 79 | filegroup { |
| 80 | name: "g", |
| 81 | srcs: ["g.txt"], |
| 82 | bazel_module: {bp2build_available: true}, |
| 83 | } |
| 84 | EOF |
| 85 | |
| 86 | # A directory under /tmp/... |
| 87 | outdir=$(mktemp -t -d st.XXXXX) |
| 88 | trap 'rm -rf $outdir' EXIT |
| 89 | # Modify OUT_DIR in a subshell so it doesn't affect the top level one. |
Cole Faust | 93dc19d | 2022-11-19 15:14:48 -0800 | [diff] [blame^] | 90 | (export OUT_DIR=$outdir; run_soong bp2build && run_bazel build --config=bp2build --config=ci //a:g) |
Jingwen Chen | 7e11eb8 | 2022-10-13 09:25:38 +0000 | [diff] [blame] | 91 | } |
| 92 | |
| 93 | test_different_absolute_outdir |
| 94 | |
Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 95 | function test_bp2build_generates_all_buildfiles { |
| 96 | setup |
Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 97 | |
| 98 | mkdir -p foo/convertible_soong_module |
| 99 | cat > foo/convertible_soong_module/Android.bp <<'EOF' |
| 100 | genrule { |
| 101 | name: "the_answer", |
| 102 | cmd: "echo '42' > $(out)", |
| 103 | out: [ |
| 104 | "the_answer.txt", |
| 105 | ], |
| 106 | bazel_module: { |
| 107 | bp2build_available: true, |
| 108 | }, |
| 109 | } |
| 110 | EOF |
| 111 | |
| 112 | mkdir -p foo/unconvertible_soong_module |
| 113 | cat > foo/unconvertible_soong_module/Android.bp <<'EOF' |
| 114 | genrule { |
| 115 | name: "not_the_answer", |
| 116 | cmd: "echo '43' > $(out)", |
| 117 | out: [ |
| 118 | "not_the_answer.txt", |
| 119 | ], |
| 120 | bazel_module: { |
| 121 | bp2build_available: false, |
| 122 | }, |
| 123 | } |
| 124 | EOF |
| 125 | |
Lukacs T. Berki | a1b9372 | 2021-09-02 17:23:06 +0200 | [diff] [blame] | 126 | run_soong bp2build |
Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 127 | |
Rupert Shuttleworth | 413a7a9 | 2021-05-18 07:47:15 -0400 | [diff] [blame] | 128 | if [[ ! -f "./out/soong/workspace/foo/convertible_soong_module/${GENERATED_BUILD_FILE_NAME}" ]]; then |
| 129 | fail "./out/soong/workspace/foo/convertible_soong_module/${GENERATED_BUILD_FILE_NAME} was not generated" |
Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 130 | fi |
| 131 | |
Rupert Shuttleworth | 413a7a9 | 2021-05-18 07:47:15 -0400 | [diff] [blame] | 132 | if [[ ! -f "./out/soong/workspace/foo/unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME}" ]]; then |
| 133 | fail "./out/soong/workspace/foo/unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME} was not generated" |
Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 134 | fi |
| 135 | |
Rupert Shuttleworth | 413a7a9 | 2021-05-18 07:47:15 -0400 | [diff] [blame] | 136 | if ! grep "the_answer" "./out/soong/workspace/foo/convertible_soong_module/${GENERATED_BUILD_FILE_NAME}"; then |
| 137 | fail "missing BUILD target the_answer in convertible_soong_module/${GENERATED_BUILD_FILE_NAME}" |
Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 138 | fi |
| 139 | |
Rupert Shuttleworth | 413a7a9 | 2021-05-18 07:47:15 -0400 | [diff] [blame] | 140 | if grep "not_the_answer" "./out/soong/workspace/foo/unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME}"; then |
| 141 | fail "found unexpected BUILD target not_the_answer in unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME}" |
Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 142 | fi |
| 143 | |
Rupert Shuttleworth | 413a7a9 | 2021-05-18 07:47:15 -0400 | [diff] [blame] | 144 | if ! grep "filegroup" "./out/soong/workspace/foo/unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME}"; then |
| 145 | fail "missing filegroup in unconvertible_soong_module/${GENERATED_BUILD_FILE_NAME}" |
Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 146 | fi |
| 147 | |
| 148 | # NOTE: We don't actually use the extra BUILD file for anything here |
Cole Faust | 93dc19d | 2022-11-19 15:14:48 -0800 | [diff] [blame^] | 149 | run_bazel build --config=android --config=bp2build --config=ci //foo/... |
Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 150 | |
Jingwen Chen | ba6d4ac | 2021-11-09 11:55:36 +0000 | [diff] [blame] | 151 | local the_answer_file="bazel-out/android_target-fastbuild/bin/foo/convertible_soong_module/the_answer.txt" |
Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 152 | if [[ ! -f "${the_answer_file}" ]]; then |
| 153 | fail "Expected '${the_answer_file}' to be generated, but was missing" |
| 154 | fi |
| 155 | if ! grep 42 "${the_answer_file}"; then |
| 156 | fail "Expected to find 42 in '${the_answer_file}'" |
| 157 | fi |
| 158 | } |
| 159 | |
Sam Delmerico | 0d08b9b | 2022-09-22 11:43:21 -0400 | [diff] [blame] | 160 | _save_trap=$(trap -p EXIT) |
| 161 | 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 |
Rupert Shuttleworth | 2a4fc3e | 2021-04-21 07:10:09 -0400 | [diff] [blame] | 162 | test_bp2build_generates_all_buildfiles |
Sam Delmerico | 0d08b9b | 2022-09-22 11:43:21 -0400 | [diff] [blame] | 163 | eval ${_save_trap} |
Lukacs T. Berki | e3487c8 | 2022-05-02 10:13:19 +0200 | [diff] [blame] | 164 | |
| 165 | function test_cc_correctness { |
| 166 | setup |
Lukacs T. Berki | e3487c8 | 2022-05-02 10:13:19 +0200 | [diff] [blame] | 167 | |
| 168 | mkdir -p a |
| 169 | cat > a/Android.bp <<EOF |
| 170 | cc_object { |
| 171 | name: "qq", |
| 172 | srcs: ["qq.cc"], |
| 173 | bazel_module: { |
| 174 | bp2build_available: true, |
| 175 | }, |
| 176 | stl: "none", |
| 177 | system_shared_libs: [], |
| 178 | } |
| 179 | EOF |
| 180 | |
| 181 | cat > a/qq.cc <<EOF |
| 182 | #include "qq.h" |
| 183 | int qq() { |
| 184 | return QQ; |
| 185 | } |
| 186 | EOF |
| 187 | |
| 188 | cat > a/qq.h <<EOF |
| 189 | #define QQ 1 |
| 190 | EOF |
| 191 | |
| 192 | run_soong bp2build |
| 193 | |
Cole Faust | 93dc19d | 2022-11-19 15:14:48 -0800 | [diff] [blame^] | 194 | run_bazel build --config=android --config=bp2build --config=ci //a:qq |
Usta Shrestha | 2c9a5e3 | 2022-06-09 12:22:36 -0400 | [diff] [blame] | 195 | local -r output_mtime1=$(stat -c "%y" bazel-bin/a/_objs/qq/qq.o) |
Lukacs T. Berki | e3487c8 | 2022-05-02 10:13:19 +0200 | [diff] [blame] | 196 | |
Cole Faust | 93dc19d | 2022-11-19 15:14:48 -0800 | [diff] [blame^] | 197 | run_bazel build --config=android --config=bp2build --config=ci //a:qq |
Usta Shrestha | 2c9a5e3 | 2022-06-09 12:22:36 -0400 | [diff] [blame] | 198 | local -r output_mtime2=$(stat -c "%y" bazel-bin/a/_objs/qq/qq.o) |
Lukacs T. Berki | e3487c8 | 2022-05-02 10:13:19 +0200 | [diff] [blame] | 199 | |
| 200 | if [[ "$output_mtime1" != "$output_mtime2" ]]; then |
| 201 | fail "output changed on null build" |
| 202 | fi |
| 203 | |
| 204 | cat > a/qq.h <<EOF |
| 205 | #define QQ 2 |
| 206 | EOF |
| 207 | |
Cole Faust | 93dc19d | 2022-11-19 15:14:48 -0800 | [diff] [blame^] | 208 | run_bazel build --config=android --config=bp2build --config=ci //a:qq |
Usta Shrestha | 2c9a5e3 | 2022-06-09 12:22:36 -0400 | [diff] [blame] | 209 | local -r output_mtime3=$(stat -c "%y" bazel-bin/a/_objs/qq/qq.o) |
Lukacs T. Berki | e3487c8 | 2022-05-02 10:13:19 +0200 | [diff] [blame] | 210 | |
| 211 | if [[ "$output_mtime1" == "$output_mtime3" ]]; then |
| 212 | fail "output not changed when included header changed" |
| 213 | fi |
| 214 | } |
| 215 | |
| 216 | test_cc_correctness |
Jingwen Chen | d4b1dc8 | 2022-05-12 11:08:03 +0000 | [diff] [blame] | 217 | |
| 218 | # Regression test for the following failure during symlink forest creation: |
| 219 | # |
| 220 | # Cannot stat '/tmp/st.rr054/foo/bar/unresolved_symlink': stat /tmp/st.rr054/foo/bar/unresolved_symlink: no such file or directory |
| 221 | # |
| 222 | function test_bp2build_null_build_with_unresolved_symlink_in_source() { |
| 223 | setup |
| 224 | |
| 225 | mkdir -p foo/bar |
| 226 | ln -s /tmp/non-existent foo/bar/unresolved_symlink |
| 227 | cat > foo/bar/Android.bp <<'EOF' |
| 228 | filegroup { |
| 229 | name: "fg", |
| 230 | srcs: ["unresolved_symlink/non-existent-file.txt"], |
| 231 | } |
| 232 | EOF |
| 233 | |
| 234 | run_soong bp2build |
| 235 | |
| 236 | dest=$(readlink -f out/soong/workspace/foo/bar/unresolved_symlink) |
| 237 | if [[ "$dest" != "/tmp/non-existent" ]]; then |
| 238 | fail "expected to plant an unresolved symlink out/soong/workspace/foo/bar/unresolved_symlink that resolves to /tmp/non-existent" |
| 239 | fi |
| 240 | } |
| 241 | |
| 242 | test_bp2build_null_build_with_unresolved_symlink_in_source |