xref: /aosp_15_r20/build/soong/tests/bootstrap_test.sh (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker#!/bin/bash -eu
2*333d2b36SAndroid Build Coastguard Worker
3*333d2b36SAndroid Build Coastguard Workerset -o pipefail
4*333d2b36SAndroid Build Coastguard Worker
5*333d2b36SAndroid Build Coastguard Worker# This test exercises the bootstrapping process of the build system
6*333d2b36SAndroid Build Coastguard Worker# in a source tree that only contains enough files for Bazel and Soong to work.
7*333d2b36SAndroid Build Coastguard Worker
8*333d2b36SAndroid Build Coastguard Workersource "$(dirname "$0")/lib.sh"
9*333d2b36SAndroid Build Coastguard Worker
10*333d2b36SAndroid Build Coastguard Workerreadonly GENERATED_BUILD_FILE_NAME="BUILD.bazel"
11*333d2b36SAndroid Build Coastguard Worker
12*333d2b36SAndroid Build Coastguard Workerreadonly target_product="${TARGET_PRODUCT:-aosp_arm}"
13*333d2b36SAndroid Build Coastguard Worker
14*333d2b36SAndroid Build Coastguard Workerfunction test_smoke {
15*333d2b36SAndroid Build Coastguard Worker  setup
16*333d2b36SAndroid Build Coastguard Worker  run_soong
17*333d2b36SAndroid Build Coastguard Worker}
18*333d2b36SAndroid Build Coastguard Worker
19*333d2b36SAndroid Build Coastguard Workerfunction test_null_build() {
20*333d2b36SAndroid Build Coastguard Worker  setup
21*333d2b36SAndroid Build Coastguard Worker  run_soong
22*333d2b36SAndroid Build Coastguard Worker  local -r bootstrap_mtime1=$(stat -c "%y" out/soong/bootstrap.ninja)
23*333d2b36SAndroid Build Coastguard Worker  local -r output_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
24*333d2b36SAndroid Build Coastguard Worker  run_soong
25*333d2b36SAndroid Build Coastguard Worker  local -r bootstrap_mtime2=$(stat -c "%y" out/soong/bootstrap.ninja)
26*333d2b36SAndroid Build Coastguard Worker  local -r output_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
27*333d2b36SAndroid Build Coastguard Worker
28*333d2b36SAndroid Build Coastguard Worker  if [[ "$bootstrap_mtime1" == "$bootstrap_mtime2" ]]; then
29*333d2b36SAndroid Build Coastguard Worker    # Bootstrapping is always done. It doesn't take a measurable amount of time.
30*333d2b36SAndroid Build Coastguard Worker    fail "Bootstrap Ninja file did not change on null build"
31*333d2b36SAndroid Build Coastguard Worker  fi
32*333d2b36SAndroid Build Coastguard Worker
33*333d2b36SAndroid Build Coastguard Worker  if [[ "$output_mtime1" != "$output_mtime2" ]]; then
34*333d2b36SAndroid Build Coastguard Worker    fail "Output Ninja file changed on null build"
35*333d2b36SAndroid Build Coastguard Worker  fi
36*333d2b36SAndroid Build Coastguard Worker}
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Workerfunction test_soong_build_rebuilt_if_blueprint_changes() {
39*333d2b36SAndroid Build Coastguard Worker  setup
40*333d2b36SAndroid Build Coastguard Worker  run_soong
41*333d2b36SAndroid Build Coastguard Worker  local -r mtime1=$(stat -c "%y" out/soong/bootstrap.ninja)
42*333d2b36SAndroid Build Coastguard Worker
43*333d2b36SAndroid Build Coastguard Worker  sed -i 's/pluginGenSrcCmd/pluginGenSrcCmd2/g' build/blueprint/bootstrap/bootstrap.go
44*333d2b36SAndroid Build Coastguard Worker
45*333d2b36SAndroid Build Coastguard Worker  run_soong
46*333d2b36SAndroid Build Coastguard Worker  local -r mtime2=$(stat -c "%y" out/soong/bootstrap.ninja)
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker  if [[ "$mtime1" == "$mtime2" ]]; then
49*333d2b36SAndroid Build Coastguard Worker    fail "Bootstrap Ninja file did not change"
50*333d2b36SAndroid Build Coastguard Worker  fi
51*333d2b36SAndroid Build Coastguard Worker}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Workerfunction test_change_android_bp() {
54*333d2b36SAndroid Build Coastguard Worker  setup
55*333d2b36SAndroid Build Coastguard Worker  mkdir -p a
56*333d2b36SAndroid Build Coastguard Worker  cat > a/Android.bp <<'EOF'
57*333d2b36SAndroid Build Coastguard Workerpython_binary_host {
58*333d2b36SAndroid Build Coastguard Worker  name: "my_little_binary_host",
59*333d2b36SAndroid Build Coastguard Worker  srcs: ["my_little_binary_host.py"]
60*333d2b36SAndroid Build Coastguard Worker}
61*333d2b36SAndroid Build Coastguard WorkerEOF
62*333d2b36SAndroid Build Coastguard Worker  touch a/my_little_binary_host.py
63*333d2b36SAndroid Build Coastguard Worker  run_soong
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker  grep -q "^# Module:.*my_little_binary_host" out/soong/build."${target_product}".ninja || fail "module not found"
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Worker  cat > a/Android.bp <<'EOF'
68*333d2b36SAndroid Build Coastguard Workerpython_binary_host {
69*333d2b36SAndroid Build Coastguard Worker  name: "my_great_binary_host",
70*333d2b36SAndroid Build Coastguard Worker  srcs: ["my_great_binary_host.py"]
71*333d2b36SAndroid Build Coastguard Worker}
72*333d2b36SAndroid Build Coastguard WorkerEOF
73*333d2b36SAndroid Build Coastguard Worker  touch a/my_great_binary_host.py
74*333d2b36SAndroid Build Coastguard Worker  run_soong
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker  grep -q "^# Module:.*my_little_binary_host" out/soong/build."${target_product}".ninja && fail "old module found"
77*333d2b36SAndroid Build Coastguard Worker  grep -q "^# Module:.*my_great_binary_host" out/soong/build."${target_product}".ninja || fail "new module not found"
78*333d2b36SAndroid Build Coastguard Worker}
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Workerfunction test_add_android_bp() {
81*333d2b36SAndroid Build Coastguard Worker  setup
82*333d2b36SAndroid Build Coastguard Worker  run_soong
83*333d2b36SAndroid Build Coastguard Worker  local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Worker  mkdir -p a
86*333d2b36SAndroid Build Coastguard Worker  cat > a/Android.bp <<'EOF'
87*333d2b36SAndroid Build Coastguard Workerpython_binary_host {
88*333d2b36SAndroid Build Coastguard Worker  name: "my_little_binary_host",
89*333d2b36SAndroid Build Coastguard Worker  srcs: ["my_little_binary_host.py"]
90*333d2b36SAndroid Build Coastguard Worker}
91*333d2b36SAndroid Build Coastguard WorkerEOF
92*333d2b36SAndroid Build Coastguard Worker  touch a/my_little_binary_host.py
93*333d2b36SAndroid Build Coastguard Worker  run_soong
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Worker  local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
96*333d2b36SAndroid Build Coastguard Worker  if [[ "$mtime1" == "$mtime2" ]]; then
97*333d2b36SAndroid Build Coastguard Worker    fail "Output Ninja file did not change"
98*333d2b36SAndroid Build Coastguard Worker  fi
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker  grep -q "^# Module:.*my_little_binary_host$" out/soong/build."${target_product}".ninja || fail "New module not in output"
101*333d2b36SAndroid Build Coastguard Worker
102*333d2b36SAndroid Build Coastguard Worker  run_soong
103*333d2b36SAndroid Build Coastguard Worker}
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Workerfunction test_delete_android_bp() {
106*333d2b36SAndroid Build Coastguard Worker  setup
107*333d2b36SAndroid Build Coastguard Worker  mkdir -p a
108*333d2b36SAndroid Build Coastguard Worker  cat > a/Android.bp <<'EOF'
109*333d2b36SAndroid Build Coastguard Workerpython_binary_host {
110*333d2b36SAndroid Build Coastguard Worker  name: "my_little_binary_host",
111*333d2b36SAndroid Build Coastguard Worker  srcs: ["my_little_binary_host.py"]
112*333d2b36SAndroid Build Coastguard Worker}
113*333d2b36SAndroid Build Coastguard WorkerEOF
114*333d2b36SAndroid Build Coastguard Worker  touch a/my_little_binary_host.py
115*333d2b36SAndroid Build Coastguard Worker  run_soong
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Worker  grep -q "^# Module:.*my_little_binary_host$" out/soong/build."${target_product}".ninja || fail "Module not in output"
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker  rm a/Android.bp
120*333d2b36SAndroid Build Coastguard Worker  run_soong
121*333d2b36SAndroid Build Coastguard Worker
122*333d2b36SAndroid Build Coastguard Worker  if grep -q "^# Module:.*my_little_binary_host$" out/soong/build."${target_product}".ninja; then
123*333d2b36SAndroid Build Coastguard Worker    fail "Old module in output"
124*333d2b36SAndroid Build Coastguard Worker  fi
125*333d2b36SAndroid Build Coastguard Worker}
126*333d2b36SAndroid Build Coastguard Worker
127*333d2b36SAndroid Build Coastguard Worker# Test that an incremental build with a glob doesn't rerun soong_build, and
128*333d2b36SAndroid Build Coastguard Worker# only regenerates the globs on the first but not the second incremental build.
129*333d2b36SAndroid Build Coastguard Workerfunction test_glob_noop_incremental() {
130*333d2b36SAndroid Build Coastguard Worker  setup
131*333d2b36SAndroid Build Coastguard Worker
132*333d2b36SAndroid Build Coastguard Worker  # This test needs to start from a clean build, but setup creates an
133*333d2b36SAndroid Build Coastguard Worker  # initialized tree that has already been built once.  Clear the out
134*333d2b36SAndroid Build Coastguard Worker  # directory to start from scratch (see b/185591972)
135*333d2b36SAndroid Build Coastguard Worker  rm -rf out
136*333d2b36SAndroid Build Coastguard Worker
137*333d2b36SAndroid Build Coastguard Worker  mkdir -p a
138*333d2b36SAndroid Build Coastguard Worker  cat > a/Android.bp <<'EOF'
139*333d2b36SAndroid Build Coastguard Workerpython_binary_host {
140*333d2b36SAndroid Build Coastguard Worker  name: "my_little_binary_host",
141*333d2b36SAndroid Build Coastguard Worker  srcs: ["*.py"],
142*333d2b36SAndroid Build Coastguard Worker}
143*333d2b36SAndroid Build Coastguard WorkerEOF
144*333d2b36SAndroid Build Coastguard Worker  touch a/my_little_binary_host.py
145*333d2b36SAndroid Build Coastguard Worker  run_soong
146*333d2b36SAndroid Build Coastguard Worker  local -r ninja_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
147*333d2b36SAndroid Build Coastguard Worker
148*333d2b36SAndroid Build Coastguard Worker  run_soong
149*333d2b36SAndroid Build Coastguard Worker  local -r ninja_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
150*333d2b36SAndroid Build Coastguard Worker
151*333d2b36SAndroid Build Coastguard Worker  if [[ "$ninja_mtime1" != "$ninja_mtime2" ]]; then
152*333d2b36SAndroid Build Coastguard Worker    fail "Ninja file rewritten on null incremental build"
153*333d2b36SAndroid Build Coastguard Worker  fi
154*333d2b36SAndroid Build Coastguard Worker
155*333d2b36SAndroid Build Coastguard Worker  run_soong
156*333d2b36SAndroid Build Coastguard Worker  local -r ninja_mtime3=$(stat -c "%y" out/soong/build."${target_product}".ninja)
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Worker  if [[ "$ninja_mtime2" != "$ninja_mtime3" ]]; then
159*333d2b36SAndroid Build Coastguard Worker    fail "Ninja file rewritten on null incremental build"
160*333d2b36SAndroid Build Coastguard Worker  fi
161*333d2b36SAndroid Build Coastguard Worker}
162*333d2b36SAndroid Build Coastguard Worker
163*333d2b36SAndroid Build Coastguard Workerfunction test_add_file_to_glob() {
164*333d2b36SAndroid Build Coastguard Worker  setup
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker  mkdir -p a
167*333d2b36SAndroid Build Coastguard Worker  cat > a/Android.bp <<'EOF'
168*333d2b36SAndroid Build Coastguard Workerpython_binary_host {
169*333d2b36SAndroid Build Coastguard Worker  name: "my_little_binary_host",
170*333d2b36SAndroid Build Coastguard Worker  srcs: ["*.py"],
171*333d2b36SAndroid Build Coastguard Worker}
172*333d2b36SAndroid Build Coastguard WorkerEOF
173*333d2b36SAndroid Build Coastguard Worker  touch a/my_little_binary_host.py
174*333d2b36SAndroid Build Coastguard Worker  run_soong
175*333d2b36SAndroid Build Coastguard Worker  local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Worker  touch a/my_little_library.py
178*333d2b36SAndroid Build Coastguard Worker  run_soong
179*333d2b36SAndroid Build Coastguard Worker
180*333d2b36SAndroid Build Coastguard Worker  local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
181*333d2b36SAndroid Build Coastguard Worker  if [[ "$mtime1" == "$mtime2" ]]; then
182*333d2b36SAndroid Build Coastguard Worker    fail "Output Ninja file did not change"
183*333d2b36SAndroid Build Coastguard Worker  fi
184*333d2b36SAndroid Build Coastguard Worker
185*333d2b36SAndroid Build Coastguard Worker  grep -q my_little_library.py out/soong/build."${target_product}".ninja || fail "new file is not in output"
186*333d2b36SAndroid Build Coastguard Worker}
187*333d2b36SAndroid Build Coastguard Worker
188*333d2b36SAndroid Build Coastguard Workerfunction test_soong_build_rerun_iff_environment_changes() {
189*333d2b36SAndroid Build Coastguard Worker  setup
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Worker  mkdir -p build/soong/cherry
192*333d2b36SAndroid Build Coastguard Worker  cat > build/soong/cherry/Android.bp <<'EOF'
193*333d2b36SAndroid Build Coastguard Workerbootstrap_go_package {
194*333d2b36SAndroid Build Coastguard Worker  name: "cherry",
195*333d2b36SAndroid Build Coastguard Worker  pkgPath: "android/soong/cherry",
196*333d2b36SAndroid Build Coastguard Worker  deps: [
197*333d2b36SAndroid Build Coastguard Worker    "blueprint",
198*333d2b36SAndroid Build Coastguard Worker    "soong",
199*333d2b36SAndroid Build Coastguard Worker    "soong-android",
200*333d2b36SAndroid Build Coastguard Worker  ],
201*333d2b36SAndroid Build Coastguard Worker  srcs: [
202*333d2b36SAndroid Build Coastguard Worker    "cherry.go",
203*333d2b36SAndroid Build Coastguard Worker  ],
204*333d2b36SAndroid Build Coastguard Worker  pluginFor: ["soong_build"],
205*333d2b36SAndroid Build Coastguard Worker}
206*333d2b36SAndroid Build Coastguard WorkerEOF
207*333d2b36SAndroid Build Coastguard Worker
208*333d2b36SAndroid Build Coastguard Worker  cat > build/soong/cherry/cherry.go <<'EOF'
209*333d2b36SAndroid Build Coastguard Workerpackage cherry
210*333d2b36SAndroid Build Coastguard Worker
211*333d2b36SAndroid Build Coastguard Workerimport (
212*333d2b36SAndroid Build Coastguard Worker  "android/soong/android"
213*333d2b36SAndroid Build Coastguard Worker  "github.com/google/blueprint"
214*333d2b36SAndroid Build Coastguard Worker)
215*333d2b36SAndroid Build Coastguard Worker
216*333d2b36SAndroid Build Coastguard Workervar (
217*333d2b36SAndroid Build Coastguard Worker  pctx = android.NewPackageContext("cherry")
218*333d2b36SAndroid Build Coastguard Worker)
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Workerfunc init() {
221*333d2b36SAndroid Build Coastguard Worker  android.RegisterSingletonType("cherry", CherrySingleton)
222*333d2b36SAndroid Build Coastguard Worker}
223*333d2b36SAndroid Build Coastguard Worker
224*333d2b36SAndroid Build Coastguard Workerfunc CherrySingleton() android.Singleton {
225*333d2b36SAndroid Build Coastguard Worker  return &cherrySingleton{}
226*333d2b36SAndroid Build Coastguard Worker}
227*333d2b36SAndroid Build Coastguard Worker
228*333d2b36SAndroid Build Coastguard Workertype cherrySingleton struct{}
229*333d2b36SAndroid Build Coastguard Worker
230*333d2b36SAndroid Build Coastguard Workerfunc (p *cherrySingleton) GenerateBuildActions(ctx android.SingletonContext) {
231*333d2b36SAndroid Build Coastguard Worker  cherryRule := ctx.Rule(pctx, "cherry",
232*333d2b36SAndroid Build Coastguard Worker    blueprint.RuleParams{
233*333d2b36SAndroid Build Coastguard Worker      Command: "echo CHERRY IS " + ctx.Config().Getenv("CHERRY") + " > ${out}",
234*333d2b36SAndroid Build Coastguard Worker      CommandDeps: []string{},
235*333d2b36SAndroid Build Coastguard Worker      Description: "Cherry",
236*333d2b36SAndroid Build Coastguard Worker    })
237*333d2b36SAndroid Build Coastguard Worker
238*333d2b36SAndroid Build Coastguard Worker  outputFile := android.PathForOutput(ctx, "cherry", "cherry.txt")
239*333d2b36SAndroid Build Coastguard Worker  var deps android.Paths
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Worker  ctx.Build(pctx, android.BuildParams{
242*333d2b36SAndroid Build Coastguard Worker    Rule: cherryRule,
243*333d2b36SAndroid Build Coastguard Worker    Output: outputFile,
244*333d2b36SAndroid Build Coastguard Worker    Inputs: deps,
245*333d2b36SAndroid Build Coastguard Worker  })
246*333d2b36SAndroid Build Coastguard Worker}
247*333d2b36SAndroid Build Coastguard WorkerEOF
248*333d2b36SAndroid Build Coastguard Worker
249*333d2b36SAndroid Build Coastguard Worker  export CHERRY=TASTY
250*333d2b36SAndroid Build Coastguard Worker  run_soong
251*333d2b36SAndroid Build Coastguard Worker  grep -q "CHERRY IS TASTY" out/soong/build."${target_product}".ninja \
252*333d2b36SAndroid Build Coastguard Worker    || fail "first value of environment variable is not used"
253*333d2b36SAndroid Build Coastguard Worker
254*333d2b36SAndroid Build Coastguard Worker  export CHERRY=RED
255*333d2b36SAndroid Build Coastguard Worker  run_soong
256*333d2b36SAndroid Build Coastguard Worker  grep -q "CHERRY IS RED" out/soong/build."${target_product}".ninja \
257*333d2b36SAndroid Build Coastguard Worker    || fail "second value of environment variable not used"
258*333d2b36SAndroid Build Coastguard Worker  local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
259*333d2b36SAndroid Build Coastguard Worker
260*333d2b36SAndroid Build Coastguard Worker  run_soong
261*333d2b36SAndroid Build Coastguard Worker  local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
262*333d2b36SAndroid Build Coastguard Worker  if [[ "$mtime1" != "$mtime2" ]]; then
263*333d2b36SAndroid Build Coastguard Worker    fail "Output Ninja file changed when environment variable did not"
264*333d2b36SAndroid Build Coastguard Worker  fi
265*333d2b36SAndroid Build Coastguard Worker
266*333d2b36SAndroid Build Coastguard Worker}
267*333d2b36SAndroid Build Coastguard Worker
268*333d2b36SAndroid Build Coastguard Workerfunction test_create_global_include_directory() {
269*333d2b36SAndroid Build Coastguard Worker  setup
270*333d2b36SAndroid Build Coastguard Worker  run_soong
271*333d2b36SAndroid Build Coastguard Worker  local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
272*333d2b36SAndroid Build Coastguard Worker
273*333d2b36SAndroid Build Coastguard Worker  # Soong needs to know if top level directories like hardware/ exist for use
274*333d2b36SAndroid Build Coastguard Worker  # as global include directories.  Make sure that doesn't cause regens for
275*333d2b36SAndroid Build Coastguard Worker  # unrelated changes to the top level directory.
276*333d2b36SAndroid Build Coastguard Worker  mkdir -p system/core
277*333d2b36SAndroid Build Coastguard Worker
278*333d2b36SAndroid Build Coastguard Worker  run_soong
279*333d2b36SAndroid Build Coastguard Worker  local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
280*333d2b36SAndroid Build Coastguard Worker  if [[ "$mtime1" != "$mtime2" ]]; then
281*333d2b36SAndroid Build Coastguard Worker    fail "Output Ninja file changed when top level directory changed"
282*333d2b36SAndroid Build Coastguard Worker  fi
283*333d2b36SAndroid Build Coastguard Worker
284*333d2b36SAndroid Build Coastguard Worker  # Make sure it does regen if a missing directory in the path of a global
285*333d2b36SAndroid Build Coastguard Worker  # include directory is added.
286*333d2b36SAndroid Build Coastguard Worker  mkdir -p system/core/include
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Worker  run_soong
289*333d2b36SAndroid Build Coastguard Worker  local -r mtime3=$(stat -c "%y" out/soong/build."${target_product}".ninja)
290*333d2b36SAndroid Build Coastguard Worker  if [[ "$mtime2" = "$mtime3" ]]; then
291*333d2b36SAndroid Build Coastguard Worker    fail "Output Ninja file did not change when global include directory created"
292*333d2b36SAndroid Build Coastguard Worker  fi
293*333d2b36SAndroid Build Coastguard Worker
294*333d2b36SAndroid Build Coastguard Worker}
295*333d2b36SAndroid Build Coastguard Worker
296*333d2b36SAndroid Build Coastguard Workerfunction test_add_file_to_soong_build() {
297*333d2b36SAndroid Build Coastguard Worker  setup
298*333d2b36SAndroid Build Coastguard Worker  run_soong
299*333d2b36SAndroid Build Coastguard Worker  local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
300*333d2b36SAndroid Build Coastguard Worker
301*333d2b36SAndroid Build Coastguard Worker  mkdir -p vendor/foo/picard
302*333d2b36SAndroid Build Coastguard Worker  cat > vendor/foo/picard/Android.bp <<'EOF'
303*333d2b36SAndroid Build Coastguard Workerbootstrap_go_package {
304*333d2b36SAndroid Build Coastguard Worker  name: "picard-soong-rules",
305*333d2b36SAndroid Build Coastguard Worker  pkgPath: "android/soong/picard",
306*333d2b36SAndroid Build Coastguard Worker  deps: [
307*333d2b36SAndroid Build Coastguard Worker    "blueprint",
308*333d2b36SAndroid Build Coastguard Worker    "soong",
309*333d2b36SAndroid Build Coastguard Worker    "soong-android",
310*333d2b36SAndroid Build Coastguard Worker  ],
311*333d2b36SAndroid Build Coastguard Worker  srcs: [
312*333d2b36SAndroid Build Coastguard Worker    "picard.go",
313*333d2b36SAndroid Build Coastguard Worker  ],
314*333d2b36SAndroid Build Coastguard Worker  pluginFor: ["soong_build"],
315*333d2b36SAndroid Build Coastguard Worker}
316*333d2b36SAndroid Build Coastguard WorkerEOF
317*333d2b36SAndroid Build Coastguard Worker
318*333d2b36SAndroid Build Coastguard Worker  cat > vendor/foo/picard/picard.go <<'EOF'
319*333d2b36SAndroid Build Coastguard Workerpackage picard
320*333d2b36SAndroid Build Coastguard Worker
321*333d2b36SAndroid Build Coastguard Workerimport (
322*333d2b36SAndroid Build Coastguard Worker  "android/soong/android"
323*333d2b36SAndroid Build Coastguard Worker  "github.com/google/blueprint"
324*333d2b36SAndroid Build Coastguard Worker)
325*333d2b36SAndroid Build Coastguard Worker
326*333d2b36SAndroid Build Coastguard Workervar (
327*333d2b36SAndroid Build Coastguard Worker  pctx = android.NewPackageContext("picard")
328*333d2b36SAndroid Build Coastguard Worker)
329*333d2b36SAndroid Build Coastguard Worker
330*333d2b36SAndroid Build Coastguard Workerfunc init() {
331*333d2b36SAndroid Build Coastguard Worker  android.RegisterSingletonType("picard", PicardSingleton)
332*333d2b36SAndroid Build Coastguard Worker}
333*333d2b36SAndroid Build Coastguard Worker
334*333d2b36SAndroid Build Coastguard Workerfunc PicardSingleton() android.Singleton {
335*333d2b36SAndroid Build Coastguard Worker  return &picardSingleton{}
336*333d2b36SAndroid Build Coastguard Worker}
337*333d2b36SAndroid Build Coastguard Worker
338*333d2b36SAndroid Build Coastguard Workertype picardSingleton struct{}
339*333d2b36SAndroid Build Coastguard Worker
340*333d2b36SAndroid Build Coastguard Workerfunc (p *picardSingleton) GenerateBuildActions(ctx android.SingletonContext) {
341*333d2b36SAndroid Build Coastguard Worker  picardRule := ctx.Rule(pctx, "picard",
342*333d2b36SAndroid Build Coastguard Worker    blueprint.RuleParams{
343*333d2b36SAndroid Build Coastguard Worker      Command: "echo Make it so. > ${out}",
344*333d2b36SAndroid Build Coastguard Worker      CommandDeps: []string{},
345*333d2b36SAndroid Build Coastguard Worker      Description: "Something quotable",
346*333d2b36SAndroid Build Coastguard Worker    })
347*333d2b36SAndroid Build Coastguard Worker
348*333d2b36SAndroid Build Coastguard Worker  outputFile := android.PathForOutput(ctx, "picard", "picard.txt")
349*333d2b36SAndroid Build Coastguard Worker  var deps android.Paths
350*333d2b36SAndroid Build Coastguard Worker
351*333d2b36SAndroid Build Coastguard Worker  ctx.Build(pctx, android.BuildParams{
352*333d2b36SAndroid Build Coastguard Worker    Rule: picardRule,
353*333d2b36SAndroid Build Coastguard Worker    Output: outputFile,
354*333d2b36SAndroid Build Coastguard Worker    Inputs: deps,
355*333d2b36SAndroid Build Coastguard Worker  })
356*333d2b36SAndroid Build Coastguard Worker}
357*333d2b36SAndroid Build Coastguard Worker
358*333d2b36SAndroid Build Coastguard WorkerEOF
359*333d2b36SAndroid Build Coastguard Worker
360*333d2b36SAndroid Build Coastguard Worker  run_soong
361*333d2b36SAndroid Build Coastguard Worker  local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
362*333d2b36SAndroid Build Coastguard Worker  if [[ "$mtime1" == "$mtime2" ]]; then
363*333d2b36SAndroid Build Coastguard Worker    fail "Output Ninja file did not change"
364*333d2b36SAndroid Build Coastguard Worker  fi
365*333d2b36SAndroid Build Coastguard Worker
366*333d2b36SAndroid Build Coastguard Worker  grep -q "Make it so" out/soong/build."${target_product}".ninja || fail "New action not present"
367*333d2b36SAndroid Build Coastguard Worker}
368*333d2b36SAndroid Build Coastguard Worker
369*333d2b36SAndroid Build Coastguard Worker# Tests a glob in a build= statement in an Android.bp file, which is interpreted
370*333d2b36SAndroid Build Coastguard Worker# during bootstrapping.
371*333d2b36SAndroid Build Coastguard Workerfunction test_glob_during_bootstrapping() {
372*333d2b36SAndroid Build Coastguard Worker  setup
373*333d2b36SAndroid Build Coastguard Worker
374*333d2b36SAndroid Build Coastguard Worker  mkdir -p build/soong/picard
375*333d2b36SAndroid Build Coastguard Worker  cat > build/soong/picard/Android.bp <<'EOF'
376*333d2b36SAndroid Build Coastguard Workerbuild=["foo*.bp"]
377*333d2b36SAndroid Build Coastguard WorkerEOF
378*333d2b36SAndroid Build Coastguard Worker  cat > build/soong/picard/fooa.bp <<'EOF'
379*333d2b36SAndroid Build Coastguard Workerbootstrap_go_package {
380*333d2b36SAndroid Build Coastguard Worker  name: "picard-soong-rules",
381*333d2b36SAndroid Build Coastguard Worker  pkgPath: "android/soong/picard",
382*333d2b36SAndroid Build Coastguard Worker  deps: [
383*333d2b36SAndroid Build Coastguard Worker    "blueprint",
384*333d2b36SAndroid Build Coastguard Worker    "soong",
385*333d2b36SAndroid Build Coastguard Worker    "soong-android",
386*333d2b36SAndroid Build Coastguard Worker  ],
387*333d2b36SAndroid Build Coastguard Worker  srcs: [
388*333d2b36SAndroid Build Coastguard Worker    "picard.go",
389*333d2b36SAndroid Build Coastguard Worker  ],
390*333d2b36SAndroid Build Coastguard Worker  pluginFor: ["soong_build"],
391*333d2b36SAndroid Build Coastguard Worker}
392*333d2b36SAndroid Build Coastguard WorkerEOF
393*333d2b36SAndroid Build Coastguard Worker
394*333d2b36SAndroid Build Coastguard Worker  cat > build/soong/picard/picard.go <<'EOF'
395*333d2b36SAndroid Build Coastguard Workerpackage picard
396*333d2b36SAndroid Build Coastguard Worker
397*333d2b36SAndroid Build Coastguard Workerimport (
398*333d2b36SAndroid Build Coastguard Worker  "android/soong/android"
399*333d2b36SAndroid Build Coastguard Worker  "github.com/google/blueprint"
400*333d2b36SAndroid Build Coastguard Worker)
401*333d2b36SAndroid Build Coastguard Worker
402*333d2b36SAndroid Build Coastguard Workervar (
403*333d2b36SAndroid Build Coastguard Worker  pctx = android.NewPackageContext("picard")
404*333d2b36SAndroid Build Coastguard Worker)
405*333d2b36SAndroid Build Coastguard Worker
406*333d2b36SAndroid Build Coastguard Workerfunc init() {
407*333d2b36SAndroid Build Coastguard Worker  android.RegisterSingletonType("picard", PicardSingleton)
408*333d2b36SAndroid Build Coastguard Worker}
409*333d2b36SAndroid Build Coastguard Worker
410*333d2b36SAndroid Build Coastguard Workerfunc PicardSingleton() android.Singleton {
411*333d2b36SAndroid Build Coastguard Worker  return &picardSingleton{}
412*333d2b36SAndroid Build Coastguard Worker}
413*333d2b36SAndroid Build Coastguard Worker
414*333d2b36SAndroid Build Coastguard Workertype picardSingleton struct{}
415*333d2b36SAndroid Build Coastguard Worker
416*333d2b36SAndroid Build Coastguard Workervar Message = "Make it so."
417*333d2b36SAndroid Build Coastguard Worker
418*333d2b36SAndroid Build Coastguard Workerfunc (p *picardSingleton) GenerateBuildActions(ctx android.SingletonContext) {
419*333d2b36SAndroid Build Coastguard Worker  picardRule := ctx.Rule(pctx, "picard",
420*333d2b36SAndroid Build Coastguard Worker    blueprint.RuleParams{
421*333d2b36SAndroid Build Coastguard Worker      Command: "echo " + Message + " > ${out}",
422*333d2b36SAndroid Build Coastguard Worker      CommandDeps: []string{},
423*333d2b36SAndroid Build Coastguard Worker      Description: "Something quotable",
424*333d2b36SAndroid Build Coastguard Worker    })
425*333d2b36SAndroid Build Coastguard Worker
426*333d2b36SAndroid Build Coastguard Worker  outputFile := android.PathForOutput(ctx, "picard", "picard.txt")
427*333d2b36SAndroid Build Coastguard Worker  var deps android.Paths
428*333d2b36SAndroid Build Coastguard Worker
429*333d2b36SAndroid Build Coastguard Worker  ctx.Build(pctx, android.BuildParams{
430*333d2b36SAndroid Build Coastguard Worker    Rule: picardRule,
431*333d2b36SAndroid Build Coastguard Worker    Output: outputFile,
432*333d2b36SAndroid Build Coastguard Worker    Inputs: deps,
433*333d2b36SAndroid Build Coastguard Worker  })
434*333d2b36SAndroid Build Coastguard Worker}
435*333d2b36SAndroid Build Coastguard Worker
436*333d2b36SAndroid Build Coastguard WorkerEOF
437*333d2b36SAndroid Build Coastguard Worker
438*333d2b36SAndroid Build Coastguard Worker  run_soong
439*333d2b36SAndroid Build Coastguard Worker  local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
440*333d2b36SAndroid Build Coastguard Worker
441*333d2b36SAndroid Build Coastguard Worker  grep -q "Make it so" out/soong/build."${target_product}".ninja || fail "Original action not present"
442*333d2b36SAndroid Build Coastguard Worker
443*333d2b36SAndroid Build Coastguard Worker  cat > build/soong/picard/foob.bp <<'EOF'
444*333d2b36SAndroid Build Coastguard Workerbootstrap_go_package {
445*333d2b36SAndroid Build Coastguard Worker  name: "worf-soong-rules",
446*333d2b36SAndroid Build Coastguard Worker  pkgPath: "android/soong/worf",
447*333d2b36SAndroid Build Coastguard Worker  deps: [
448*333d2b36SAndroid Build Coastguard Worker    "blueprint",
449*333d2b36SAndroid Build Coastguard Worker    "soong",
450*333d2b36SAndroid Build Coastguard Worker    "soong-android",
451*333d2b36SAndroid Build Coastguard Worker    "picard-soong-rules",
452*333d2b36SAndroid Build Coastguard Worker  ],
453*333d2b36SAndroid Build Coastguard Worker  srcs: [
454*333d2b36SAndroid Build Coastguard Worker    "worf.go",
455*333d2b36SAndroid Build Coastguard Worker  ],
456*333d2b36SAndroid Build Coastguard Worker  pluginFor: ["soong_build"],
457*333d2b36SAndroid Build Coastguard Worker}
458*333d2b36SAndroid Build Coastguard WorkerEOF
459*333d2b36SAndroid Build Coastguard Worker
460*333d2b36SAndroid Build Coastguard Worker  cat > build/soong/picard/worf.go <<'EOF'
461*333d2b36SAndroid Build Coastguard Workerpackage worf
462*333d2b36SAndroid Build Coastguard Worker
463*333d2b36SAndroid Build Coastguard Workerimport "android/soong/picard"
464*333d2b36SAndroid Build Coastguard Worker
465*333d2b36SAndroid Build Coastguard Workerfunc init() {
466*333d2b36SAndroid Build Coastguard Worker   picard.Message = "Engage."
467*333d2b36SAndroid Build Coastguard Worker}
468*333d2b36SAndroid Build Coastguard WorkerEOF
469*333d2b36SAndroid Build Coastguard Worker
470*333d2b36SAndroid Build Coastguard Worker  run_soong
471*333d2b36SAndroid Build Coastguard Worker  local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
472*333d2b36SAndroid Build Coastguard Worker  if [[ "$mtime1" == "$mtime2" ]]; then
473*333d2b36SAndroid Build Coastguard Worker    fail "Output Ninja file did not change"
474*333d2b36SAndroid Build Coastguard Worker  fi
475*333d2b36SAndroid Build Coastguard Worker
476*333d2b36SAndroid Build Coastguard Worker  grep -q "Engage" out/soong/build."${target_product}".ninja || fail "New action not present"
477*333d2b36SAndroid Build Coastguard Worker
478*333d2b36SAndroid Build Coastguard Worker  if grep -q "Make it so" out/soong/build."${target_product}".ninja; then
479*333d2b36SAndroid Build Coastguard Worker    fail "Original action still present"
480*333d2b36SAndroid Build Coastguard Worker  fi
481*333d2b36SAndroid Build Coastguard Worker}
482*333d2b36SAndroid Build Coastguard Worker
483*333d2b36SAndroid Build Coastguard Workerfunction test_soong_docs_smoke() {
484*333d2b36SAndroid Build Coastguard Worker  setup
485*333d2b36SAndroid Build Coastguard Worker
486*333d2b36SAndroid Build Coastguard Worker  run_soong soong_docs
487*333d2b36SAndroid Build Coastguard Worker
488*333d2b36SAndroid Build Coastguard Worker  [[ -e "out/soong/docs/soong_build.html" ]] || fail "Documentation for main page not created"
489*333d2b36SAndroid Build Coastguard Worker  [[ -e "out/soong/docs/cc.html" ]] || fail "Documentation for C++ modules not created"
490*333d2b36SAndroid Build Coastguard Worker}
491*333d2b36SAndroid Build Coastguard Worker
492*333d2b36SAndroid Build Coastguard Workerfunction test_null_build_after_soong_docs() {
493*333d2b36SAndroid Build Coastguard Worker  setup
494*333d2b36SAndroid Build Coastguard Worker
495*333d2b36SAndroid Build Coastguard Worker  run_soong
496*333d2b36SAndroid Build Coastguard Worker  local -r ninja_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
497*333d2b36SAndroid Build Coastguard Worker
498*333d2b36SAndroid Build Coastguard Worker  run_soong soong_docs
499*333d2b36SAndroid Build Coastguard Worker  local -r docs_mtime1=$(stat -c "%y" out/soong/docs/soong_build.html)
500*333d2b36SAndroid Build Coastguard Worker
501*333d2b36SAndroid Build Coastguard Worker  run_soong soong_docs
502*333d2b36SAndroid Build Coastguard Worker  local -r docs_mtime2=$(stat -c "%y" out/soong/docs/soong_build.html)
503*333d2b36SAndroid Build Coastguard Worker
504*333d2b36SAndroid Build Coastguard Worker  if [[ "$docs_mtime1" != "$docs_mtime2" ]]; then
505*333d2b36SAndroid Build Coastguard Worker    fail "Output Ninja file changed on null build"
506*333d2b36SAndroid Build Coastguard Worker  fi
507*333d2b36SAndroid Build Coastguard Worker
508*333d2b36SAndroid Build Coastguard Worker  run_soong
509*333d2b36SAndroid Build Coastguard Worker  local -r ninja_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
510*333d2b36SAndroid Build Coastguard Worker
511*333d2b36SAndroid Build Coastguard Worker  if [[ "$ninja_mtime1" != "$ninja_mtime2" ]]; then
512*333d2b36SAndroid Build Coastguard Worker    fail "Output Ninja file changed on null build"
513*333d2b36SAndroid Build Coastguard Worker  fi
514*333d2b36SAndroid Build Coastguard Worker}
515*333d2b36SAndroid Build Coastguard Worker
516*333d2b36SAndroid Build Coastguard Workerfunction test_write_to_source_tree {
517*333d2b36SAndroid Build Coastguard Worker  setup
518*333d2b36SAndroid Build Coastguard Worker  mkdir -p a
519*333d2b36SAndroid Build Coastguard Worker  cat > a/Android.bp <<EOF
520*333d2b36SAndroid Build Coastguard Workergenrule {
521*333d2b36SAndroid Build Coastguard Worker  name: "write_to_source_tree",
522*333d2b36SAndroid Build Coastguard Worker  out: ["write_to_source_tree"],
523*333d2b36SAndroid Build Coastguard Worker  cmd: "touch file_in_source_tree && touch \$(out)",
524*333d2b36SAndroid Build Coastguard Worker}
525*333d2b36SAndroid Build Coastguard WorkerEOF
526*333d2b36SAndroid Build Coastguard Worker  readonly EXPECTED_OUT=out/soong/.intermediates/a/write_to_source_tree/gen/write_to_source_tree
527*333d2b36SAndroid Build Coastguard Worker  readonly ERROR_LOG=${MOCK_TOP}/out/error.log
528*333d2b36SAndroid Build Coastguard Worker  readonly ERROR_MSG="Read-only file system"
529*333d2b36SAndroid Build Coastguard Worker  readonly ERROR_HINT_PATTERN="BUILD_BROKEN_SRC_DIR"
530*333d2b36SAndroid Build Coastguard Worker  # Test in ReadOnly source tree
531*333d2b36SAndroid Build Coastguard Worker  run_ninja BUILD_BROKEN_SRC_DIR_IS_WRITABLE=false ${EXPECTED_OUT} &> /dev/null && \
532*333d2b36SAndroid Build Coastguard Worker    fail "Write to source tree should not work in a ReadOnly source tree"
533*333d2b36SAndroid Build Coastguard Worker
534*333d2b36SAndroid Build Coastguard Worker  if grep -q "${ERROR_MSG}" "${ERROR_LOG}" && grep -q "${ERROR_HINT_PATTERN}" "${ERROR_LOG}" ; then
535*333d2b36SAndroid Build Coastguard Worker    echo Error message and error hint found in logs >/dev/null
536*333d2b36SAndroid Build Coastguard Worker  else
537*333d2b36SAndroid Build Coastguard Worker    fail "Did not find Read-only error AND error hint in error.log"
538*333d2b36SAndroid Build Coastguard Worker  fi
539*333d2b36SAndroid Build Coastguard Worker
540*333d2b36SAndroid Build Coastguard Worker  # Test in ReadWrite source tree
541*333d2b36SAndroid Build Coastguard Worker  run_ninja BUILD_BROKEN_SRC_DIR_IS_WRITABLE=true ${EXPECTED_OUT} &> /dev/null || \
542*333d2b36SAndroid Build Coastguard Worker    fail "Write to source tree did not succeed in a ReadWrite source tree"
543*333d2b36SAndroid Build Coastguard Worker
544*333d2b36SAndroid Build Coastguard Worker  if  grep -q "${ERROR_MSG}\|${ERROR_HINT_PATTERN}" "${ERROR_LOG}" ; then
545*333d2b36SAndroid Build Coastguard Worker    fail "Found read-only error OR error hint in error.log"
546*333d2b36SAndroid Build Coastguard Worker  fi
547*333d2b36SAndroid Build Coastguard Worker}
548*333d2b36SAndroid Build Coastguard Worker
549*333d2b36SAndroid Build Coastguard Workerfunction test_dump_json_module_graph() {
550*333d2b36SAndroid Build Coastguard Worker  setup
551*333d2b36SAndroid Build Coastguard Worker  run_soong json-module-graph
552*333d2b36SAndroid Build Coastguard Worker  if [[ ! -r "out/soong/module-graph.json" ]]; then
553*333d2b36SAndroid Build Coastguard Worker    fail "JSON file was not created"
554*333d2b36SAndroid Build Coastguard Worker  fi
555*333d2b36SAndroid Build Coastguard Worker}
556*333d2b36SAndroid Build Coastguard Worker
557*333d2b36SAndroid Build Coastguard Workerfunction test_json_module_graph_back_and_forth_null_build() {
558*333d2b36SAndroid Build Coastguard Worker  setup
559*333d2b36SAndroid Build Coastguard Worker
560*333d2b36SAndroid Build Coastguard Worker  run_soong
561*333d2b36SAndroid Build Coastguard Worker  local -r ninja_mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
562*333d2b36SAndroid Build Coastguard Worker
563*333d2b36SAndroid Build Coastguard Worker  run_soong json-module-graph
564*333d2b36SAndroid Build Coastguard Worker  local -r json_mtime1=$(stat -c "%y" out/soong/module-graph.json)
565*333d2b36SAndroid Build Coastguard Worker
566*333d2b36SAndroid Build Coastguard Worker  run_soong
567*333d2b36SAndroid Build Coastguard Worker  local -r ninja_mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
568*333d2b36SAndroid Build Coastguard Worker  if [[ "$ninja_mtime1" != "$ninja_mtime2" ]]; then
569*333d2b36SAndroid Build Coastguard Worker    fail "Output Ninja file changed after writing JSON module graph"
570*333d2b36SAndroid Build Coastguard Worker  fi
571*333d2b36SAndroid Build Coastguard Worker
572*333d2b36SAndroid Build Coastguard Worker  run_soong json-module-graph
573*333d2b36SAndroid Build Coastguard Worker  local -r json_mtime2=$(stat -c "%y" out/soong/module-graph.json)
574*333d2b36SAndroid Build Coastguard Worker  if [[ "$json_mtime1" != "$json_mtime2" ]]; then
575*333d2b36SAndroid Build Coastguard Worker    fail "JSON module graph file changed after writing Ninja file"
576*333d2b36SAndroid Build Coastguard Worker  fi
577*333d2b36SAndroid Build Coastguard Worker
578*333d2b36SAndroid Build Coastguard Worker}
579*333d2b36SAndroid Build Coastguard Worker
580*333d2b36SAndroid Build Coastguard Worker# This test verifies that adding a new glob to a blueprint file only
581*333d2b36SAndroid Build Coastguard Worker# causes build."${target_product}".ninja to be regenerated on the *next* build, and *not*
582*333d2b36SAndroid Build Coastguard Worker# the build after. (This is a regression test for a bug where globs
583*333d2b36SAndroid Build Coastguard Worker# resulted in two successive regenerations.)
584*333d2b36SAndroid Build Coastguard Workerfunction test_new_glob_incrementality {
585*333d2b36SAndroid Build Coastguard Worker  setup
586*333d2b36SAndroid Build Coastguard Worker
587*333d2b36SAndroid Build Coastguard Worker  run_soong nothing
588*333d2b36SAndroid Build Coastguard Worker  local -r mtime1=$(stat -c "%y" out/soong/build."${target_product}".ninja)
589*333d2b36SAndroid Build Coastguard Worker
590*333d2b36SAndroid Build Coastguard Worker  mkdir -p globdefpkg/
591*333d2b36SAndroid Build Coastguard Worker  cat > globdefpkg/Android.bp <<'EOF'
592*333d2b36SAndroid Build Coastguard Workerfilegroup {
593*333d2b36SAndroid Build Coastguard Worker  name: "fg_with_glob",
594*333d2b36SAndroid Build Coastguard Worker  srcs: ["*.txt"],
595*333d2b36SAndroid Build Coastguard Worker}
596*333d2b36SAndroid Build Coastguard WorkerEOF
597*333d2b36SAndroid Build Coastguard Worker
598*333d2b36SAndroid Build Coastguard Worker  run_soong nothing
599*333d2b36SAndroid Build Coastguard Worker  local -r mtime2=$(stat -c "%y" out/soong/build."${target_product}".ninja)
600*333d2b36SAndroid Build Coastguard Worker
601*333d2b36SAndroid Build Coastguard Worker  if [[ "$mtime1" == "$mtime2" ]]; then
602*333d2b36SAndroid Build Coastguard Worker    fail "Ninja file was not regenerated, despite a new bp file"
603*333d2b36SAndroid Build Coastguard Worker  fi
604*333d2b36SAndroid Build Coastguard Worker
605*333d2b36SAndroid Build Coastguard Worker  run_soong nothing
606*333d2b36SAndroid Build Coastguard Worker  local -r mtime3=$(stat -c "%y" out/soong/build."${target_product}".ninja)
607*333d2b36SAndroid Build Coastguard Worker
608*333d2b36SAndroid Build Coastguard Worker  if [[ "$mtime2" != "$mtime3" ]]; then
609*333d2b36SAndroid Build Coastguard Worker    fail "Ninja file was regenerated despite no previous bp changes"
610*333d2b36SAndroid Build Coastguard Worker  fi
611*333d2b36SAndroid Build Coastguard Worker}
612*333d2b36SAndroid Build Coastguard Worker
613*333d2b36SAndroid Build Coastguard Workerscan_and_run_tests
614