Add test suite for bootstrapping

This only checks to make sure that for a given updated file, the
bootstrap stage is properly run. It doesn't actually check to make sure
that anything was rebuilt.

Change-Id: I9cb6ff1d483264da30e43d5580361d93b148f42c
This commit is contained in:
Dan Willemsen 2015-07-22 17:05:51 -07:00
parent 21b6f37cee
commit f04c55172f
14 changed files with 111 additions and 2 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
out.test

View file

@ -11,3 +11,4 @@ script:
- ../bootstrap.bash
- ninja
- diff -us ../build.ninja.in ../build.ninja.in.orig
- ../tests/test.sh

View file

@ -70,7 +70,7 @@ var (
bootstrap = pctx.StaticRule("bootstrap",
blueprint.RuleParams{
Command: "$bootstrapCmd -i $in",
Command: "echo \"Choosing $$(basename $in) for next stage\" && $bootstrapCmd -i $in",
Description: "bootstrap $in",
Generator: true,
})

View file

@ -32,7 +32,7 @@ g.bootstrap.srcDir = @@SrcDir@@
builddir = .bootstrap
rule g.bootstrap.bootstrap
command = ${g.bootstrap.bootstrapCmd} -i ${in}
command = echo "Choosing $$(basename ${in}) for next stage" && ${g.bootstrap.bootstrapCmd} -i ${in}
description = bootstrap ${in}
generator = true

7
tests/bootstrap.bash Executable file
View file

@ -0,0 +1,7 @@
#!/bin/bash
export BOOTSTRAP="${BASH_SOURCE[0]}"
export SRCDIR=".."
export BOOTSTRAP_MANIFEST="src.build.ninja.in"
../bootstrap.bash "$@"

2
tests/expected_all Normal file
View file

@ -0,0 +1,2 @@
Choosing build.ninja.in for next stage
Choosing main.ninja.in for next stage

2
tests/expected_manifest Normal file
View file

@ -0,0 +1,2 @@
Choosing build.ninja.in for next stage
Choosing main.ninja.in for next stage

0
tests/expected_none Normal file
View file

View file

@ -0,0 +1,2 @@
Choosing src.build.ninja.in for next stage
Choosing main.ninja.in for next stage

2
tests/expected_regen Normal file
View file

@ -0,0 +1,2 @@
Choosing src.build.ninja.in for next stage
Choosing main.ninja.in for next stage

1
tests/expected_start Normal file
View file

@ -0,0 +1 @@
Choosing main.ninja.in for next stage

1
tests/expected_start2 Normal file
View file

@ -0,0 +1 @@
Choosing main.ninja.in for next stage

View file

@ -0,0 +1 @@
Choosing main.ninja.in for next stage

89
tests/test.sh Executable file
View file

@ -0,0 +1,89 @@
#!/bin/bash
# Go to srcdir
cd $(dirname ${BASH_SOURCE[0]})/..
rm -rf out.test
mkdir out.test
cd out.test
../bootstrap.bash
# Run ninja, filter the output, and compare against expectations
# $1: Name of test
function testcase()
{
echo -n "Running $1..."
if ! ninja -v -d explain >log_$1 2>&1; then
echo " Failed."
echo "Test $1 Failed:" >>failed
tail log_$1 >>failed
return
fi
grep -E "^(Choosing|Newer|Stage)" log_$1 >test_$1
if ! cmp -s test_$1 ../tests/expected_$1; then
echo " Failed."
echo "Test $1 Failed:" >>failed
diff -u ../tests/expected_$1 test_$1 >>failed
else
echo " Passed."
fi
}
testcase start
# The 2 second sleeps are needed until ninja understands sub-second timestamps
# https://github.com/martine/ninja/issues/371
# This test affects all bootstrap stages
sleep 2
touch ../Blueprints
testcase all
# This test affects nothing, nothing should be done
sleep 2
testcase none
# This test will cause the source build.ninja.in to be copied into the first
# stage.
sleep 2
touch ../build.ninja.in
testcase manifest
# From now on, we're going to be modifying the build.ninja.in, so let's make our
# own copy
sleep 2
../tests/bootstrap.bash -r
sleep 2
testcase start2
# This is similar to the last test, but incorporates a change into the source
# build.ninja.in, so that we'll restart into the new version created by the
# build.
sleep 2
echo "# test" >>src.build.ninja.in
testcase regen
# Add tests to our build by using '-t'
sleep 2
../tests/bootstrap.bash -r -t
sleep 2
testcase start_add_tests
# Make sure that updating a test file causes us to go back to the bootstrap
# stage
sleep 2
touch ../parser/parser_test.go
testcase rebuild_test
if [ -f failed ]; then
cat failed
exit 1
fi