#!/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 } # Run wrapper, filter the output, and compare against expectations # $1: Name of test function testcase_wrapper() { echo -n "Running wrapper_$1..." if ! ./blueprint.bash -v -d explain >log_wrapper_$1 2>&1; then echo " Failed." echo "Test wrapper_$1 Failed:" >>failed tail log_wrapper_$1 >>failed return fi grep -E "^(Choosing|Newer|Stage)" log_wrapper_$1 >test_wrapper_$1 if ! cmp -s test_wrapper_$1 ../tests/expected_wrapper_$1; then echo " Failed." echo "Test wrapper_$1 Failed:" >>failed diff -u ../tests/expected_wrapper_$1 test_wrapper_$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 only the primary bootstrap stage sleep 2 touch ../bpmodify/bpmodify.go testcase primary # 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 # Restart testing using the wrapper instead of going straight to ninja. This # will force each test to start in the correct bootstrap stage, so there are # less cases to test. cd .. rm -rf out.test mkdir -p out.test cd out.test ../bootstrap.bash testcase_wrapper start # This test affects all bootstrap stages sleep 2 touch ../Blueprints testcase_wrapper all # 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_wrapper 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_wrapper regen if [ -f failed ]; then cat failed exit 1 fi