diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..de99854 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +out.test diff --git a/.travis.yml b/.travis.yml index 5b17240..9268df0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,3 +11,4 @@ script: - ../bootstrap.bash - ninja - diff -us ../build.ninja.in ../build.ninja.in.orig + - ../tests/test.sh diff --git a/bootstrap/bootstrap.go b/bootstrap/bootstrap.go index 1b6d4e7..66a4036 100644 --- a/bootstrap/bootstrap.go +++ b/bootstrap/bootstrap.go @@ -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, }) diff --git a/build.ninja.in b/build.ninja.in index 0bc9450..77661e9 100644 --- a/build.ninja.in +++ b/build.ninja.in @@ -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 diff --git a/tests/bootstrap.bash b/tests/bootstrap.bash new file mode 100755 index 0000000..4b58b19 --- /dev/null +++ b/tests/bootstrap.bash @@ -0,0 +1,7 @@ +#!/bin/bash + +export BOOTSTRAP="${BASH_SOURCE[0]}" +export SRCDIR=".." +export BOOTSTRAP_MANIFEST="src.build.ninja.in" + +../bootstrap.bash "$@" diff --git a/tests/expected_all b/tests/expected_all new file mode 100644 index 0000000..380b0cc --- /dev/null +++ b/tests/expected_all @@ -0,0 +1,2 @@ +Choosing build.ninja.in for next stage +Choosing main.ninja.in for next stage diff --git a/tests/expected_manifest b/tests/expected_manifest new file mode 100644 index 0000000..380b0cc --- /dev/null +++ b/tests/expected_manifest @@ -0,0 +1,2 @@ +Choosing build.ninja.in for next stage +Choosing main.ninja.in for next stage diff --git a/tests/expected_none b/tests/expected_none new file mode 100644 index 0000000..e69de29 diff --git a/tests/expected_rebuild_test b/tests/expected_rebuild_test new file mode 100644 index 0000000..162d1db --- /dev/null +++ b/tests/expected_rebuild_test @@ -0,0 +1,2 @@ +Choosing src.build.ninja.in for next stage +Choosing main.ninja.in for next stage diff --git a/tests/expected_regen b/tests/expected_regen new file mode 100644 index 0000000..162d1db --- /dev/null +++ b/tests/expected_regen @@ -0,0 +1,2 @@ +Choosing src.build.ninja.in for next stage +Choosing main.ninja.in for next stage diff --git a/tests/expected_start b/tests/expected_start new file mode 100644 index 0000000..dc55ac3 --- /dev/null +++ b/tests/expected_start @@ -0,0 +1 @@ +Choosing main.ninja.in for next stage diff --git a/tests/expected_start2 b/tests/expected_start2 new file mode 100644 index 0000000..dc55ac3 --- /dev/null +++ b/tests/expected_start2 @@ -0,0 +1 @@ +Choosing main.ninja.in for next stage diff --git a/tests/expected_start_add_tests b/tests/expected_start_add_tests new file mode 100644 index 0000000..dc55ac3 --- /dev/null +++ b/tests/expected_start_add_tests @@ -0,0 +1 @@ +Choosing main.ninja.in for next stage diff --git a/tests/test.sh b/tests/test.sh new file mode 100755 index 0000000..08caa64 --- /dev/null +++ b/tests/test.sh @@ -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