Le 17 févr. 2012 à 10:49, Jim Meyering a écrit : > That's better (I confirmed it fixes the failures), but introduces a race.
Well caught, thanks! > If it's interrupted or fails between the trap and a successful "cd", > it will fail to clean up, and might try to remove $$.dir from the parent. > > How about recording cwd=$(pwd) before cleanup definition, > and then using cd "$cwd" instead of "cd .."? I did that. I also decided to factor the "test suites". From 5a9c6b89d0cd97f514383bc555a2c14f59bd9c3b Mon Sep 17 00:00:00 2001 From: Akim Demaille <[email protected]> Date: Fri, 17 Feb 2012 14:59:23 +0100 Subject: [PATCH] examples: factor the test suite. * examples/mfcalc/test, examples/calc++/test: Extract the common bits into... * examples/test: here. (cwd): New. Use it to avoid a race on the temporary directory. Reported by Jim Meyering. * examples/mfcalc/test, examples/calc++/test: Rename into... * examples/mfcalc/mfcalc.test, examples/calc++/calc++.test: these. * examples/calc++/local.mk, examples/mfcalc/local.mk, * examples/local.mk: Adjust. --- examples/calc++/calc++.test | 50 ++++++++++++++++++++ examples/calc++/local.mk | 4 +- examples/calc++/test | 109 ------------------------------------------- examples/local.mk | 3 +- examples/mfcalc/local.mk | 4 +- examples/mfcalc/mfcalc.test | 27 +++++++++++ examples/mfcalc/test | 86 ---------------------------------- examples/test | 79 +++++++++++++++++++++++++++++++ 8 files changed, 162 insertions(+), 200 deletions(-) create mode 100755 examples/calc++/calc++.test delete mode 100755 examples/calc++/test create mode 100755 examples/mfcalc/mfcalc.test delete mode 100755 examples/mfcalc/test create mode 100755 examples/test diff --git a/examples/calc++/calc++.test b/examples/calc++/calc++.test new file mode 100755 index 0000000..904d05f --- /dev/null +++ b/examples/calc++/calc++.test @@ -0,0 +1,50 @@ +#! /bin/sh + +# Copyright (C) 2005-2012 Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +cat >input <<EOF +toto := 1 +toto +EOF +run 0 1 -s + + +cat >input <<EOF +a := 1 +b := 2 +c := 3 +d := a + b * c +d +EOF +run 0 7 +run 0 7 -p + + +cat >input <<EOF +a := 1 +b := 2 +c := 3 +d := (a + b) * c +d +EOF +run 0 9 + + +cat >input <<EOF +a := 1 +d := a + b * c +EOF +run 1 '' diff --git a/examples/calc++/local.mk b/examples/calc++/local.mk index 839ef86..5d9dce0 100644 --- a/examples/calc++/local.mk +++ b/examples/calc++/local.mk @@ -64,6 +64,6 @@ examples_calc___calc___SOURCES = \ examples/calc++/calc++-parser.hh examples_calc___calc___CPPFLAGS = -I$(top_srcdir)/examples/calc++ -TESTS += examples/calc++/test +TESTS += examples/calc++/calc++.test endif -EXTRA_DIST += examples/calc++/test +EXTRA_DIST += examples/calc++/calc++.test diff --git a/examples/calc++/test b/examples/calc++/test deleted file mode 100755 index 7930dc2..0000000 --- a/examples/calc++/test +++ /dev/null @@ -1,109 +0,0 @@ -#! /bin/sh - -# Copyright (C) 2005-2012 Free Software Foundation, Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -me=`dirname $0` -me=`basename $me` - -# Number of the current test. -number=1 - -# Exit status of this script. -exit=true - -# The exercised program. -prog=../examples/$me/$me - -# cleanup -# ------- -cleanup () -{ - local status=$? - if test -z "$DEBUG"; then - cd .. - rm -rf $$.dir - fi - exit $status -} -trap cleanup 0 1 2 13 15 -mkdir $$.dir -cd $$.dir - -# run EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS] -# --------------------------------------------------------- -run () -{ - # Expected exit status. - local sta_exp=$1 - shift - # Expected output. - local out_exp=$1 - shift - $prog "$@" - <input >out_eff - # Effective exit status. - local sta_eff=$? - # Effective output. - local out_eff=`cat out_eff` - if test $sta_eff -eq $sta_exp; then - if test "$out_eff" = "$out_exp"; then - echo "$me: PASS: $number" - else - echo "$me: FAIL: $number (expected output: $out_exp, effective: $out_eff)" - exit=false - fi - else - echo "$me: FAIL: $number (expected status: $sta_exp, effective: $sta_eff)" - exit=false - fi - number=`expr $number + 1` -} - - -cat >input <<EOF -toto := 1 -toto -EOF -run 0 1 -s - - -cat >input <<EOF -a := 1 -b := 2 -c := 3 -d := a + b * c -d -EOF -run 0 7 -run 0 7 -p - - -cat >input <<EOF -a := 1 -b := 2 -c := 3 -d := (a + b) * c -d -EOF -run 0 9 - - -cat >input <<EOF -a := 1 -d := a + b * c -EOF -run 1 '' - -$exit diff --git a/examples/local.mk b/examples/local.mk index 02e82bb..de4d38f 100644 --- a/examples/local.mk +++ b/examples/local.mk @@ -15,7 +15,8 @@ doc = $(top_srcdir)/doc/bison.texinfo extexi = $(top_srcdir)/examples/extexi -dist_noinst_SCRIPTS = examples/extexi +dist_noinst_SCRIPTS = examples/extexi examples/test +TEST_LOG_COMPILER = $(top_srcdir)/examples/test include examples/calc++/local.mk include examples/mfcalc/local.mk diff --git a/examples/mfcalc/local.mk b/examples/mfcalc/local.mk index e34d8d7..c6d9470 100644 --- a/examples/mfcalc/local.mk +++ b/examples/mfcalc/local.mk @@ -54,5 +54,5 @@ examples_mfcalc_mfcalc_SOURCES = \ $(mfcalc_sources) examples_mfcalc_mfcalc_CPPFLAGS = -I$(top_srcdir)/examples/mfcalc -TESTS += examples/mfcalc/test -EXTRA_DIST += examples/mfcalc/test +TESTS += examples/mfcalc/mfcalc.test +EXTRA_DIST += examples/mfcalc/mfcalc.test diff --git a/examples/mfcalc/mfcalc.test b/examples/mfcalc/mfcalc.test new file mode 100755 index 0000000..6f794aa --- /dev/null +++ b/examples/mfcalc/mfcalc.test @@ -0,0 +1,27 @@ +#! /bin/sh + +# Copyright (C) 2005-2012 Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +cat >input <<EOF +1+2*3 +EOF +run 0 7 +run 0 7 + +cat >input <<EOF +(1+2) * 3 +EOF +run 0 9 diff --git a/examples/mfcalc/test b/examples/mfcalc/test deleted file mode 100755 index f848bbd..0000000 --- a/examples/mfcalc/test +++ /dev/null @@ -1,86 +0,0 @@ -#! /bin/sh - -# Copyright (C) 2005-2012 Free Software Foundation, Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -me=`dirname $0` -me=`basename $me` - -# Number of the current test. -number=1 - -# Exit status of this script. -exit=true - -# The exercised program. -prog=../examples/$me/$me - -# cleanup -# ------- -cleanup () -{ - local status=$? - if test -z "$DEBUG"; then - cd .. - rm -rf $$.dir - fi - exit $status -} -trap cleanup 0 1 2 13 15 -mkdir $$.dir -cd $$.dir - -# run EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS] -# --------------------------------------------------------- -run () -{ - # Expected exit status. - local sta_exp=$1 - shift - # Expected output. - local out_exp=$1 - shift - $prog "$@" - <input >out_eff - # Effective exit status. - local sta_eff=$? - # Effective output. - local out_eff=`cat out_eff` - if test $sta_eff -eq $sta_exp; then - if test "$out_eff" = "$out_exp"; then - echo "$me: PASS: $number" - else - echo "$me: FAIL: $number (expected output: $out_exp, effective: $out_eff)" - exit=false - fi - else - echo "$me: FAIL: $number (expected status: $sta_exp, effective: $sta_eff)" - exit=false - fi - number=`expr $number + 1` -} - - -cat >input <<EOF -1+2*3 -EOF -run 0 7 -run 0 7 - -cat >input <<EOF -(1+2) * 3 -EOF -run 0 9 - -$exit diff --git a/examples/test b/examples/test new file mode 100755 index 0000000..6da1667 --- /dev/null +++ b/examples/test @@ -0,0 +1,79 @@ +#! /bin/sh +set -x +# Copyright (C) 2005-2012 Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +me=`basename $1 .test` + +# Number of the current test. +number=1 + +# Exit status of this script. +exit=true + +# top_buiddir. +cwd=`pwd` + +# The exercised program. +prog=$cwd/examples/$me/$me + +# cleanup +# ------- +cleanup () +{ + local status=$? + if test -z "$DEBUG"; then + cd $cwd + rm -rf $$.dir + fi + exit $status +} +trap cleanup 0 1 2 13 15 +mkdir $$.dir +cd $$.dir + +# run EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS] +# --------------------------------------------------------- +run () +{ + # Expected exit status. + local sta_exp=$1 + shift + # Expected output. + local out_exp=$1 + shift + $prog "$@" - <input >out_eff + # Effective exit status. + local sta_eff=$? + # Effective output. + local out_eff=`cat out_eff` + if test $sta_eff -eq $sta_exp; then + if test "$out_eff" = "$out_exp"; then + echo "$me: PASS: $number" + else + echo "$me: FAIL: $number (expected output: $out_exp, effective: $out_eff)" + exit=false + fi + else + echo "$me: FAIL: $number (expected status: $sta_exp, effective: $sta_eff)" + exit=false + fi + number=`expr $number + 1` +} + +# We have cd'd one level deeper. +. "../$1" + +$exit -- 1.7.9
