#!/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