From 1cf55d294e17922d56dc703d66fd699f67db7073 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Sun, 19 Aug 2007 15:47:14 +0000 Subject: [PATCH] Test yesno in combination with closein. * lib/yesno.c (yesno): Document use of stdin. * modules/yesno-tests (Files): New module. * tests/test-yesno.c (main): New file. * tests/test-yesno.sh: Likewise. --- ChangeLog | 8 ++++++++ lib/yesno.c | 10 ++++++--- modules/yesno-tests | 15 ++++++++++++++ tests/test-yesno.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ tests/test-yesno.sh | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 modules/yesno-tests create mode 100644 tests/test-yesno.c create mode 100755 tests/test-yesno.sh diff --git a/ChangeLog b/ChangeLog index 6e1d8ea9b..699b954a9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-08-19 Eric Blake + + Test yesno in combination with closein. + * lib/yesno.c (yesno): Document use of stdin. + * modules/yesno-tests (Files): New module. + * tests/test-yesno.c (main): New file. + * tests/test-yesno.sh: Likewise. + 2007-08-19 Bruno Haible * lib/fbufmode.c (fbufmode): Add tentative support for Solaris/AMD64. diff --git a/lib/yesno.c b/lib/yesno.c index 24006281f..3db2d6ce0 100644 --- a/lib/yesno.c +++ b/lib/yesno.c @@ -1,6 +1,6 @@ /* yesno.c -- read a yes/no response from stdin - Copyright (C) 1990, 1998, 2001, 2003, 2004, 2005, 2006 Free + Copyright (C) 1990, 1998, 2001, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify @@ -28,10 +28,14 @@ # include "getline.h" #endif -/* Return true if we read an affirmative line from standard input. */ - extern int rpmatch (char const *response); +/* Return true if we read an affirmative line from standard input. + + Since this function uses stdin, it is suggested that the caller not + use STDIN_FILENO directly, and also that the line + atexit(close_stdin) be added to main(). */ + bool yesno (void) { diff --git a/modules/yesno-tests b/modules/yesno-tests new file mode 100644 index 000000000..ee50100fd --- /dev/null +++ b/modules/yesno-tests @@ -0,0 +1,15 @@ +Files: +tests/test-yesno.c +tests/test-yesno.sh + +Depends-on: +closein + +configure.ac: + +Makefile.am: +TESTS += test-yesno.sh +TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@' +check_PROGRAMS += test-yesno +EXTRA_DIST += test-yesno.sh +test_yesno_LDADD = $(LDADD) @LIBINTL@ diff --git a/tests/test-yesno.c b/tests/test-yesno.c new file mode 100644 index 000000000..1e15acdda --- /dev/null +++ b/tests/test-yesno.c @@ -0,0 +1,51 @@ +/* Test of yesno module. + Copyright (C) 2007 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, 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 . +*/ + +#include + +#include +#include +#include + +#include "closein.h" +#include "yesno.h" + +char *program_name; + +/* Test yesno. Without arguments, read one line. If first argument + is zero, close stdin before attempting to read one line. + Otherwise, read the number of lines specified by first + argument. */ +int +main (int argc, char **argv) +{ + int i = 1; + program_name = argv[0]; + /* yesno recommends that all clients use close_stdin in main. */ + atexit (close_stdin); + + if (1 < argc) + i = atoi (argv[1]); + if (!i) + { + i = 1; + close (0); + } + while (i--) + puts (yesno () ? "Y" : "N"); + return 0; +} diff --git a/tests/test-yesno.sh b/tests/test-yesno.sh new file mode 100755 index 000000000..fdf994800 --- /dev/null +++ b/tests/test-yesno.sh @@ -0,0 +1,58 @@ +#!/bin/sh + +tmpfiles= +trap 'rm -fr $tmpfiles' 1 2 3 15 + +p=t-yesno- +tmpfiles="${p}in.tmp ${p}xout.tmp ${p}out.tmp" + +# For now, only test with C locale +LC_ALL=C +export LC_ALL + +# Test with seekable stdin; followon process must see remaining data +cat < ${p}in.tmp +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn - entire line consumed +yn - backspace does not change result +y +does not match either yesexpr or noexpr +n +EOF +cat < ${p}xout.tmp +N +Y +Y +N +n +EOF +(./test-yesno${EXEEXT}; ./test-yesno${EXEEXT} 3; cat) \ + < ${p}in.tmp > ${p}out.tmp || exit 1 +cmp ${p}xout.tmp ${p}out.tmp || exit 1 + +(./test-yesno${EXEEXT} 3; ./test-yesno${EXEEXT}; cat) \ + < ${p}in.tmp > ${p}out.tmp || exit 1 +cmp ${p}xout.tmp ${p}out.tmp || exit 1 + +# Test for behavior on pipe +cat < ${p}xout.tmp +Y +N +EOF +echo yes | ./test-yesno${EXEEXT} 2 > ${p}out.tmp || exit 1 +cmp ${p}xout.tmp ${p}out.tmp || exit 1 + +# Test for behavior on EOF +cat < ${p}xout.tmp +N +EOF +./test-yesno${EXEEXT} ${p}out.tmp || exit 1 +cmp ${p}xout.tmp ${p}out.tmp || exit 1 + +# Test for behavior when stdin is closed +./test-yesno${EXEEXT} 0 <&- > ${p}out.tmp && exit 1 +cmp ${p}xout.tmp ${p}out.tmp || exit 1 + +# Cleanup +rm -fr $tmpfiles + +exit 0 -- 2.11.0