Re: sed on binary files

Eric Blake <[email protected]>
Newsgroups gmane.comp.gnu.m4.patches
Message-ID <[email protected]>
Eric Blake <ebb9 <at> byu.net> writes:

> Here's what I'm committing on the master branch,
> which actually skips the test if $SED (defaulting to the one learned from
> configure.ac) can't handle NUL.

It helps if I actually attach it for review...

From: Eric Blake <[email protected]>
Date: Wed, 8 Oct 2008 22:00:39 -0600
Subject: [PATCH] Clean up testsuite invocation.

* tests/atlocal.in: Fix copyright notice.
* Makefile.am (TESTS_ENVIRONMENT): Delete; it wasn't being used.
(check-local, installcheck-local): Adjust clients.  Add missing
dependency.

Signed-off-by: Eric Blake <[email protected]>
---
 ChangeLog        |    8 ++++++++
 Makefile.am      |   21 ++++++---------------
 tests/atlocal.in |   17 ++++++++++++++++-
 3 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 229b057..9f3f75c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-10-09  Eric Blake  <[email protected]>
+
+	Clean up testsuite invocation.
+	* tests/atlocal.in: Fix copyright notice.
+	* Makefile.am (TESTS_ENVIRONMENT): Delete; it wasn't being used.
+	(check-local, installcheck-local): Adjust clients.  Add missing
+	dependency.
+
 2008-09-25  Eric Blake  <[email protected]>
 
 	Tweak error message on command line failure.
diff --git a/Makefile.am b/Makefile.am
index f6a2b68..35b555b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -372,16 +372,6 @@ EXTRA_DIST     += $(TESTSUITE) $(TESTSUITE_AT) 
$(OTHER_FILES) \
 		  tests/generate.awk \
 		  $(srcdir)/tests/package.m4
 
-# Be sure to reexport important environment variables:
-TESTS_ENVIRONMENT = MAKE="$(MAKE)" CC="$(CC)" CFLAGS="$(CFLAGS)" \
-	CPP="$(CPP)" CPPFLAGS="$(CPPFLAGS)" LD="$(LD)" LDFLAGS="$(LDFLAGS)" \
-	LIBS="$(LIBS)" LN_S="$(LN_S)" NM="$(NM)" RANLIB="$(RANLIB)" \
-	OBJEXT="$(OBJEXT)" EXEEXT="$(EXEEXT)" CONFIG_SHELL="$(SHELL)" \
-	abs_top_builddir="$(abs_top_builddir)" \
-	CXX="$(CXX)" CXXFLAGS="$(CXXFLAGS)" CXXCPP="$(CXXCPP)" \
-	F77="$(F77)" FFLAGS="$(FFLAGS)" \
-	GCJ="$(GCJ)" GCJFLAGS="$(GCJFLAGS)"
-
 # Using variables so that this snippet is not too wide and can
 # be used as is in Texinfo @example/@end example.
 m4_texinfo  = $(srcdir)/doc/m4.texinfo
@@ -413,15 +403,16 @@ tests/atconfig: config.status
 DISTCLEANFILES += tests/atconfig
 
 # Hook the test suite into the check rule
-check-local: tests/atconfig tests/m4 $(TESTSUITE) $(check_LTLIBRARIES)
-	$(SHELL) '$(srcdir)/tests/testsuite' -C tests \
-	  $(TESTS_ENVIRONMENT) $(TESTSUITEFLAGS)
+check-local: tests/atconfig tests/atlocal tests/m4 $(TESTSUITE) \
+		$(check_LTLIBRARIES)
+	$(SHELL) '$(srcdir)/tests/testsuite' -C tests $(TESTSUITEFLAGS)
 
 # Run the test suite on the *installed* tree, including any renames
 # the user requested.
-installcheck-local: tests/atconfig $(TESTSUITE) $(check_LTLIBRARIES)
+installcheck-local: tests/atconfig tests/atlocal $(TESTSUITE) \
+		$(check_LTLIBRARIES)
 	$(SHELL) '$(srcdir)/tests/testsuite' -C tests \
-	  $(TESTS_ENVIRONMENT) AUTOTEST_PATH="$(bindir)" \
+	  AUTOTEST_PATH="$(bindir)" \
 	  M4="`echo m4 | sed '$(program_transform_name)'`" $(TESTSUITEFLAGS)
 
 # Enough users install GNU M4 as gm4 that we make sure 'make installcheck'
diff --git a/tests/atlocal.in b/tests/atlocal.in
index 1462e8d..6974987 100644
--- a/tests/atlocal.in
+++ b/tests/atlocal.in
@@ -1,7 +1,22 @@
 # -*- shell-script -*-
 # @configure_input@
 # Configurable variable values for M4 test suite.
-# Copyright (C) 2000, 2001, 2006 Free Software Foundation, Inc.
+# Copyright (C) 2000, 2001, 2006, 2008 Free Software Foundation, Inc.
+
+# This file is part of GNU M4.
+#
+# GNU M4 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.
+#
+# GNU M4 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/>.
 
 # Some tests cannot be performed with all the configurations.
 USE_GMP=@USE_GMP@
-- 
1.6.0.2


From e21aa9fbd79d2080084ce108b8d5e3569f19756f Mon Sep 17 00:00:00 2001
From: Eric Blake <[email protected]>
Date: Thu, 9 Oct 2008 17:08:01 -0600
Subject: [PATCH] Allow user to choose which sed to use in testsuite.

* tests/atlocal.in (SED): Inherit from configure results.
* tests/builtins.at (__m4_@&t@version__, divert, esyscmd)
(mkstemp, syscmd): Use $SED.
* tests/generate.awk (new_test): Likewise.
* tests/options.at (deprecated options, unknown option)
(--debugmode, --help and --version): Likewise.
* tests/testsuite.at (AT_CHECK_M4): Likewise.
* tests/others.at (directory, stderr closed, stdin seekable)
(stdout closed): Likewise.
(nul character): Likewise.  Also, skip test if sed can't handle
NUL bytes.

Signed-off-by: Eric Blake <[email protected]>
---
 ChangeLog          |   13 +++++++++++++
 tests/atlocal.in   |    4 ++++
 tests/builtins.at  |   15 ++++++++-------
 tests/generate.awk |    4 ++--
 tests/options.at   |   14 +++++++-------
 tests/others.at    |   30 +++++++++++++++++-------------
 tests/testsuite.at |    2 +-
 7 files changed, 52 insertions(+), 30 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 9f3f75c..38a37b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
 2008-10-09  Eric Blake  <[email protected]>
 
+	Allow user to choose which sed to use in testsuite.
+	* tests/atlocal.in (SED): Inherit from configure results.
+	* tests/builtins.at (__m4_@&t@version__, divert, esyscmd)
+	(mkstemp, syscmd): Use $SED.
+	* tests/generate.awk (new_test): Likewise.
+	* tests/options.at (deprecated options, unknown option)
+	(--debugmode, --help and --version): Likewise.
+	* tests/testsuite.at (AT_CHECK_M4): Likewise.
+	* tests/others.at (directory, stderr closed, stdin seekable)
+	(stdout closed): Likewise.
+	(nul character): Likewise.  Also, skip test if sed can't handle
+	NUL bytes.
+
 	Clean up testsuite invocation.
 	* tests/atlocal.in: Fix copyright notice.
 	* Makefile.am (TESTS_ENVIRONMENT): Delete; it wasn't being used.
diff --git a/tests/atlocal.in b/tests/atlocal.in
index 6974987..a6120a3 100644
--- a/tests/atlocal.in
+++ b/tests/atlocal.in
@@ -21,3 +21,7 @@
 # Some tests cannot be performed with all the configurations.
 USE_GMP=@USE_GMP@
 DYNAMIC_MODULES=@DYNAMIC_MODULES@
+
+# Prefer tools learned during configure.
+SED='@SED@'
+export SED
diff --git a/tests/builtins.at b/tests/builtins.at
index fe7b0ca..83810fa 100644
--- a/tests/builtins.at
+++ b/tests/builtins.at
@@ -80,7 +80,7 @@ AT_SETUP([__m4_@&t@version__])
 AT_DATA([in], [[defn(`__m4_version__')
 ]])
 AT_CHECK_M4([--version], [0], [stdout])
-AT_CHECK([[sed -e 's/.*(GNU M4\(.*\)) \([^ ]*\).*/\2\1/;q' < stdout]],
+AT_CHECK([[$SED -e 's/.*(GNU M4\(.*\)) \([^ ]*\).*/\2\1/;q' < stdout]],
 [0], [stdout])
 mv stdout expout
 AT_CHECK_M4([in], [0], [expout])
@@ -313,8 +313,9 @@ hello world
 ]])
 
 dnl Test large diversions, which were broken in m4 1.4.8-1.4.10.
+dnl Hopefully $SED doesn't choke on the over-long second line.
 AT_CHECK([echo 'divert(1)hi
-format(%1000000d, 1)' | $M4 | sed -n 1p], [0], [[hi
+format(%1000000d, 1)' | $M4 | $SED -n 1p], [0], [[hi
 ]])
 
 AT_DATA([in.m4], [M4_ONE_MEG_DEFN[divert(`2')f`'dnl
@@ -467,7 +468,7 @@ esyscmd(`echo hi >&3')divert
 hello
 ]])
 AT_CHECK_M4([3>&-], [0], [stdout], [experr], [in.m4])
-AT_CHECK([sed -ne '/./p' stdout], [0], [[hello
+AT_CHECK([$SED -ne '/./p' stdout], [0], [[hello
 world
 ]])
 
@@ -763,9 +764,9 @@ pid=`cat pid`
 cat >expout <<EOF
 
 X
-X`sed -e 's/.*\(.\)$/\1/' pid`
-X`echo "$pid" | sed -e "s/.*/00000000000000000000&/" -e 's/.*\(.\{20\}$\)/\1/'`
-no_such_dir/`echo "$pid" | sed -e "s/.*/000000&/" -e 's/.*\(.\{6\}$\)/\1/'`
+X`$SED -e 's/.*\(.\)$/\1/' pid`
+X`echo "$pid" | $SED -e "s/.*/00000000000000000000&/" -e 's/.*\(.\{20\}$\)/
\1/'`
+no_such_dir/`echo "$pid" | $SED -e "s/.*/000000&/" -e 's/.*\(.\{6\}$\)/\1/'`
 EOF
 AT_CHECK([cat stdout], [0], [expout])
 
@@ -1136,7 +1137,7 @@ syscmd(`echo hi >&3')divert
 hello
 ]])
 AT_CHECK_M4([3>&-], [0], [stdout], [experr], [in.m4])
-AT_CHECK([sed -ne '/./p' stdout], [0], [[hello
+AT_CHECK([$SED -ne '/./p' stdout], [0], [[hello
 world
 ]])
 
diff --git a/tests/generate.awk b/tests/generate.awk
index 692e21b..538dc09 100755
--- a/tests/generate.awk
+++ b/tests/generate.awk
@@ -179,12 +179,12 @@ function new_test(input, status, output, error, options, 
xfail, examples) {
   if (examples == 1)
     {
       printf ("AT_DATA([expout1],\n[[%s]])\n", output);
-      printf ("sed -e \"s|examples|$abs_top_srcdir/examples|g\" \\\n");
+      printf ("$SED -e \"s|examples|$abs_top_srcdir/examples|g\" \\\n");
       printf ("  < expout1 > expout\n\n");
       if (error)
 	{
 	  printf ("AT_DATA([experr1],\n[[%s]])\n", error);
-	  printf ("sed \"s|examples|$abs_top_srcdir/examples|g\" \\\n");
+	  printf ("$SED \"s|examples|$abs_top_srcdir/examples|g\" \\\n");
 	  printf ("  < experr1 > experr\n\n");
 	}
       options = options " -I\"$abs_top_srcdir/examples\"";
diff --git a/tests/options.at b/tests/options.at
index 31a1ced..9331a21 100644
--- a/tests/options.at
+++ b/tests/options.at
@@ -27,7 +27,7 @@ AT_SETUP([deprecated options])
 
 dnl -N/--diversions was removed after 1.4.x
 AT_CHECK_M4([--diversions=1], [1], [], [stderr])
-AT_CHECK([sed 's/Try.*help/Try `m4 --help/' stderr], [0],
+AT_CHECK([$SED 's/Try.*help/Try `m4 --help/' stderr], [0],
 [[m4: unrecognized option `--diversions=1'
 Try `m4 --help' for more information.
 ]])
@@ -256,7 +256,7 @@ AT_CLEANUP
 AT_SETUP([unknown option])
 
 AT_CHECK_M4([--unknown], [1], [], [stderr])
-AT_CHECK([sed 's/Try.*help/Try `m4 --help/' stderr], [0],
+AT_CHECK([$SED 's/Try.*help/Try `m4 --help/' stderr], [0],
 [[m4: unrecognized option `--unknown'
 Try `m4 --help' for more information.
 ]])
@@ -458,7 +458,7 @@ m4trace: -1- id 6: divnum
 
 dnl Test that shorter prefix is ambiguous.
 AT_CHECK_M4([--debu], [1], [], [stderr])
-AT_CHECK([sed -e 's/Try.*--help/Try `m4 --help/' stderr], [0],
+AT_CHECK([$SED -e 's/Try.*--help/Try `m4 --help/' stderr], [0],
 [[m4: option `--debu' is ambiguous
 Try `m4 --help' for more information.
 ]])
@@ -543,23 +543,23 @@ AT_CLEANUP
 AT_SETUP([--help and --version])
 
 AT_CHECK_M4([--help], [0], [stdout])
-AT_CHECK([[sed -n -e 's|Usage:.*\[OPTION\]... \[FILE\]...|success|p' stdout]],
+AT_CHECK([[$SED -n -e 's|Usage:.*\[OPTION\]... \[FILE\]...|success|p' stdout]],
 [0], [success
 ])
 
 AT_CHECK_M4([--version], [0], [stdout])
-AT_CHECK([[sed -n -e 's|There is NO WARRANTY.*|success|p' stdout]],
+AT_CHECK([[$SED -n -e 's|There is NO WARRANTY.*|success|p' stdout]],
 [0], [success
 ])
 
 dnl make sure option specified first takes precedence
 AT_CHECK_M4([--help --version], [0], [stdout])
-AT_CHECK([[sed -n -e 's|Usage:.*\[OPTION\]... \[FILE\]...|success|p' stdout]],
+AT_CHECK([[$SED -n -e 's|Usage:.*\[OPTION\]... \[FILE\]...|success|p' stdout]],
 [0], [success
 ])
 
 AT_CHECK_M4([--version --help], [0], [stdout])
-AT_CHECK([[sed -n -e 's|There is NO WARRANTY.*|success|p' stdout]],
+AT_CHECK([[$SED -n -e 's|There is NO WARRANTY.*|success|p' stdout]],
 [0], [success
 ])
 
diff --git a/tests/others.at b/tests/others.at
index 3a23d19..6776ee3 100644
--- a/tests/others.at
+++ b/tests/others.at
@@ -143,14 +143,14 @@ AT_DATA([in3.m4],
 
 AT_CHECK_M4([in1.m4/], [1], [], [stderr])
 dnl mingw fails with EINVAL rather than the expected ENOTDIR
-AT_CHECK([sed 's/Invalid argument/Not a directory/' stderr], [0],
+AT_CHECK([$SED 's/Invalid argument/Not a directory/' stderr], [0],
 [[m4: cannot open `in1.m4/': Not a directory
 ]])
 
 AT_CHECK_M4([in1.m4], [1], [[
 ]], [stderr])
 dnl mingw fails with EINVAL rather than the expected ENOTDIR
-AT_CHECK([sed 's/Invalid argument/Not a directory/' stderr], [0],
+AT_CHECK([$SED 's/Invalid argument/Not a directory/' stderr], [0],
 [[m4:in1.m4:1: include: cannot open `in2.m4/': Not a directory
 ]])
 
@@ -161,7 +161,7 @@ AT_CHECK_M4([in2.m4], [0], [[
 AT_CHECK_M4([in3.m4], [1], [[
 ]], [stderr])
 dnl mingw fails with EACCES rather than the expected EISDIR
-AT_CHECK([sed 's/Permission denied/Is a directory/' stderr], [0],
+AT_CHECK([$SED 's/Permission denied/Is a directory/' stderr], [0],
 [[m4:in3.m4:1: include: cannot open `.': Is a directory
 ]])
 
@@ -419,10 +419,14 @@ AT_CLEANUP
 
 AT_SETUP([nul character])
 
+# Operating on a binary file is a GNU sed extension.
+AT_CHECK([test `printf 'a\0b\n' | $SED s/a.b/abc/ | wc -c` = 4 dnl
+|| { echo "skipping: $SED can't handle NUL"; exit 77; }])
+
 # We don't embed null.* in here, since it is harder to guarantee the
 # behavior of NUL through autom4te.
-sed "s|null.m4|$abs_srcdir/null.m4|" < "$abs_srcdir/null.out" > expout
-sed "s|null.m4|$abs_srcdir/null.m4|" < "$abs_srcdir/null.err" > experr
+$SED "s|null.m4|$abs_srcdir/null.m4|" < "$abs_srcdir/null.out" > expout
+$SED "s|null.m4|$abs_srcdir/null.m4|" < "$abs_srcdir/null.err" > experr
 
 dnl all but m4exit
 AT_CHECK_M4([-Dm4exit -I "$abs_srcdir" null.m4], [0], [expout], [experr])
@@ -562,7 +566,7 @@ undivert
 goodbye
 ]])
 AT_CHECK_M4([2>&-], [1], [stdout], [], [in.m4])
-AT_CHECK([sed -ne '/./p' stdout], [0],
+AT_CHECK([$SED -ne '/./p' stdout], [0],
 [[hello
 and
 goodbye
@@ -688,19 +692,19 @@ AT_DATA([in.m4], [[dnl(
 ]])
 AT_CHECK([($M4 -EE; cat) < in.m4], [0], [[trailing data
 ]], [stderr])
-AT_CHECK([[sed 's/^[^:]*[lt-]*m4[.ex]*:/m4:/' stderr]], [0],
+AT_CHECK([[$SED 's/^[^:]*[lt-]*m4[.ex]*:/m4:/' stderr]], [0],
 [[m4:stdin:1: Warning: dnl: extra arguments ignored: 1 > 0
 ]])
 
 dnl Not all sed and libc combinations get the remaining tests right (for
 dnl example, sed 4.1.4 on glibc, or cygwin 1.5.22 and earlier).
-AT_CHECK([(sed -ne 1q; cat) < in.m4], [0], [stdout])
+AT_CHECK([($SED -ne 1q; cat) < in.m4], [0], [stdout])
 AT_CHECK([test "x`cat stdout`" = "x0)trailing data" || \
-  { echo "skipping: sed is too greedy on seekable stdin"; exit 77; }])
+  { echo "skipping: $SED is too greedy on seekable stdin"; exit 77; }])
 
 dnl Ensure that esyscmd resumes parsing where the child process left off.
 AT_DATA([in.m4], [[define(`foo', `FOO')m4 foo
-esyscmd(`sed -e "s/foo/bar/;q"')sed foo
+esyscmd(`$SED -e "s/foo/bar/;q"')sed foo
 m4 foo
 ]])
 AT_CHECK_M4([], [0], [[m4 FOO
@@ -710,7 +714,7 @@ m4 FOO
 
 dnl Ensure that syscmd resumes parsing where the child process left off.
 AT_DATA([in.m4], [[define(`foo', `FOO')m4 foo
-syscmd(`sed -e "s/foo/bar/;q"')sed foo
+syscmd(`$SED -e "s/foo/bar/;q"')sed foo
 m4 foo
 ]])
 AT_CHECK_M4([], [0], [[m4 FOO
@@ -783,7 +787,7 @@ AT_DATA([hi], [[hi
 ]])
 AT_CHECK([cat hi >&- && { echo "skipping: can't detect closed stdout"; exit 
77; }],
 [1], [], [stderr])
-AT_CHECK([sed 's/Bad file number/Bad file descriptor/' < stderr > experr])
+AT_CHECK([$SED 's/Bad file number/Bad file descriptor/' < stderr > experr])
 AT_DATA([in.m4], [[syscmd(`cat hi')dnl
 ]])
 AT_CHECK_M4([>&-], [0], [], [experr], [in.m4])
@@ -805,7 +809,7 @@ AT_DATA([in.m4], [[syscmd(`cat <&1 >&2')dnl
 dnl this line should not be read by cat
 ]])
 AT_CHECK_M4([in.m4 >&-], [0], [], [stderr])
-AT_CHECK([[sed -e 's/.*[Bb]\(ad file descriptor\)$/B\1/' stderr]], [0],
+AT_CHECK([[$SED -e 's/.*[Bb]\(ad file descriptor\)$/B\1/' stderr]], [0],
 [[Bad file descriptor
 ]])
 
diff --git a/tests/testsuite.at b/tests/testsuite.at
index b510e96..9372e92 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -75,7 +75,7 @@ m4_define([AT_CHECK_M4],
 					    [< m4_default([$5], [/dev/null])]),
           [$2], [$3], m4_case([$4], [], [], [ignore], [ignore], [stderr]))
 m4_case([$4], [], [], [ignore], [],
-[AT_CHECK([[sed 's/^[^:]*[lt-]*m4[.ex]*:/m4:/
+[AT_CHECK([[$SED 's/^[^:]*[lt-]*m4[.ex]*:/m4:/
 	/^m4debug: module/s/opening file.*/opening file/
 	s/\(cannot open module [^:]*\):.*/\1/
 	s/Bad file number/Bad file descriptor/
-- 
1.6.0.2
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.