diff --git a/t/010-jobserver/.gitignore b/t/010-jobserver/.gitignore new file mode 100644 index 0000000..7430e1d --- /dev/null +++ b/t/010-jobserver/.gitignore @@ -0,0 +1,6 @@ +*.end +*.start +*.sub +*.spin +*.log +*.x diff --git a/t/010-jobserver/all.do b/t/010-jobserver/all.do new file mode 100644 index 0000000..85cc9b1 --- /dev/null +++ b/t/010-jobserver/all.do @@ -0,0 +1,13 @@ +# We put the -j options at this toplevel to detect an earlier bug +# where the sub-jobserver wasn't inherited by sub-sub-processes, which +# accidentally reverted to the parent jobserver instead. + +redo -j1 serialtest + +# Capture log output to parallel.log to hide the (intentional since we're +# testing it) scary warning from redo about overriding the jobserver. +echo 'parallel test...' >&2 +if ! redo -j10 paralleltest 2>parallel.log; then + cat parallel.log >&2 + exit 99 +fi diff --git a/t/010-jobserver/clean.do b/t/010-jobserver/clean.do new file mode 100644 index 0000000..80aa8ab --- /dev/null +++ b/t/010-jobserver/clean.do @@ -0,0 +1,2 @@ +rm -f *~ .*~ *.log *.sub *.spin *.x *.start *.end \ + first second parallel parallel2 diff --git a/t/010-jobserver/default.spin.do b/t/010-jobserver/default.spin.do new file mode 100644 index 0000000..293f924 --- /dev/null +++ b/t/010-jobserver/default.spin.do @@ -0,0 +1,4 @@ +for d in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19; do + redo $2.$d.x +done +echo hello diff --git a/t/010-jobserver/default.x.do b/t/010-jobserver/default.x.do new file mode 100644 index 0000000..4662694 --- /dev/null +++ b/t/010-jobserver/default.x.do @@ -0,0 +1 @@ +echo world diff --git a/t/010-jobserver/first.do b/t/010-jobserver/first.do new file mode 100644 index 0000000..2835c19 --- /dev/null +++ b/t/010-jobserver/first.do @@ -0,0 +1,24 @@ +# in case we're (erroneously) running in parallel, give second.do some +# time to start but not finish. +echo 'first sleep' >&2 +sleep 1 + +# Because of --shuffle, we can't be sure if first or second ran first, but +# because all.do uses -j1, we *should* expect that if second ran first, it +# at least ran to completion before we ran at all. +if [ -e second.start ]; then + echo 'first: second already started before we did...' >&2 + [ -e second.end ] || exit 21 + echo 'first: ...and it finished as it should.' >&2 + # no sense continuing the test; can't test anything if second already + # ran. + exit 0 +fi +echo 'first: second has not started yet, good.' >&2 + +echo 'first spin' >&2 +redo 1.a.spin +[ -e 1.a.spin ] || exit 11 +echo 'first spin complete' >&2 + +! [ -e second.start ] || exit 22 diff --git a/t/010-jobserver/parallel.do b/t/010-jobserver/parallel.do new file mode 100644 index 0000000..7be7592 --- /dev/null +++ b/t/010-jobserver/parallel.do @@ -0,0 +1,6 @@ +# We should be running in parallel with a jobserver shared with second.do. +# Give second.do some time to start but not finish. +sleep 1 + +[ -e parallel2.start ] || exit 31 +! [ -e parallel2.end ] || exit 32 diff --git a/t/010-jobserver/parallel2.do b/t/010-jobserver/parallel2.do new file mode 100644 index 0000000..ac83526 --- /dev/null +++ b/t/010-jobserver/parallel2.do @@ -0,0 +1,4 @@ +rm -f $1.start $1.end +: >$1.start +sleep 2 +: >$1.end diff --git a/t/010-jobserver/paralleltest.do b/t/010-jobserver/paralleltest.do new file mode 100644 index 0000000..0fb3203 --- /dev/null +++ b/t/010-jobserver/paralleltest.do @@ -0,0 +1,7 @@ +# Test that -j2 really gives us parallel builds with their own tokens. +# (It's hard to test for sure that we have our own tokens, but if we're +# sharing with other tests, we can't be sure that parallel2 will run while +# parallel is running, and the race condition will make this test at least +# be flakey instead of pass, which means there's a bug.) +rm -f *.sub *.spin *.x *.log parallel *.start *.end +redo parallel parallel2 diff --git a/t/010-jobserver/second.do b/t/010-jobserver/second.do new file mode 100644 index 0000000..de732b4 --- /dev/null +++ b/t/010-jobserver/second.do @@ -0,0 +1,8 @@ +rm -f $1.start $1.end +echo 'second start' >&2 +: >$1.start +redo 2.x +echo 'second sleep' >&2 +redo-ifchange first # wait until 'first' finishes, if it's running +echo 'second end' >&2 +: >$1.end diff --git a/t/010-jobserver/serialtest.do b/t/010-jobserver/serialtest.do new file mode 100644 index 0000000..4c2bb7e --- /dev/null +++ b/t/010-jobserver/serialtest.do @@ -0,0 +1,4 @@ +# Test that -j1 really serializes all sub-redo processes. +rm -f *.sub *.spin *.x first second *.start *.end +redo first second + diff --git a/t/203-make/.gitignore b/t/203-make/.gitignore index 038beb4..76809a5 100644 --- a/t/203-make/.gitignore +++ b/t/203-make/.gitignore @@ -1,2 +1,3 @@ +*.log *.out whichmake diff --git a/t/203-make/all.do b/t/203-make/all.do index 3b2c06f..3a665ea 100644 --- a/t/203-make/all.do +++ b/t/203-make/all.do @@ -12,7 +12,12 @@ run() { redo y rm -f *.out - redo -j10 y + # Capture output to y.log because we know this intentionally generates + # a scary-looking redo warning (overriding the jobserver). + if ! redo -j10 y 2>y.log; then + cat y.log + exit 99 + fi } run diff --git a/t/203-make/clean.do b/t/203-make/clean.do index bac26b4..4eb03b8 100644 --- a/t/203-make/clean.do +++ b/t/203-make/clean.do @@ -1 +1 @@ -rm -f *~ .*~ *.out whichmake +rm -f *~ .*~ *.out whichmake *.log