From: Bruno Haible Date: Mon, 6 Jun 2011 09:42:17 +0000 (+0200) Subject: spawn-pipe tests: Rename program. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e5ff59461450dda2e88e631634401dd1be017517;p=pspp spawn-pipe tests: Rename program. * tests/test-spawn-pipe-main.c: Renamed from tests/test-spawn-pipe.c. * tests/test-spawn-pipe-child.c: Update comment. * tests/test-spawn-pipe.sh: Update. * modules/spawn-pipe-tests (Files, Makefile.am): Update. --- diff --git a/ChangeLog b/ChangeLog index 91c512cc71..db473d86a2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2011-06-06 Bruno Haible + spawn-pipe tests: Rename program. + * tests/test-spawn-pipe-main.c: Renamed from tests/test-spawn-pipe.c. + * tests/test-spawn-pipe-child.c: Update comment. + * tests/test-spawn-pipe.sh: Update. + * modules/spawn-pipe-tests (Files, Makefile.am): Update. + spawn-pipe tests: Like the child program only against libc. * tests/test-spawn-pipe-child.c: New file, extracted from tests/test-spawn-pipe.c. diff --git a/modules/spawn-pipe-tests b/modules/spawn-pipe-tests index 55cabf39f3..26e1240d79 100644 --- a/modules/spawn-pipe-tests +++ b/modules/spawn-pipe-tests @@ -1,6 +1,6 @@ Files: tests/test-spawn-pipe.sh -tests/test-spawn-pipe.c +tests/test-spawn-pipe-main.c tests/test-spawn-pipe-child.c tests/macros.h @@ -11,8 +11,8 @@ configure.ac: Makefile.am: TESTS += test-spawn-pipe.sh -check_PROGRAMS += test-spawn-pipe test-spawn-pipe-child -test_spawn_pipe_LDADD = $(LDADD) @LIBINTL@ +check_PROGRAMS += test-spawn-pipe-main test-spawn-pipe-child +test_spawn_pipe_main_LDADD = $(LDADD) @LIBINTL@ # The test-spawn-pipe-child program must be a real executable, not a libtool # wrapper script, and should link against as few libraries as possible. # Therefore don't link it against any libraries other than -lc. diff --git a/tests/test-spawn-pipe-child.c b/tests/test-spawn-pipe-child.c index f1d3f0f9ce..eefecf9c10 100644 --- a/tests/test-spawn-pipe-child.c +++ b/tests/test-spawn-pipe-child.c @@ -1,4 +1,4 @@ -/* Child program invoked by test-spawn-pipe.. +/* Child program invoked by test-spawn-pipe-main. Copyright (C) 2009-2011 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify diff --git a/tests/test-spawn-pipe-main.c b/tests/test-spawn-pipe-main.c new file mode 100644 index 0000000000..36aa064095 --- /dev/null +++ b/tests/test-spawn-pipe-main.c @@ -0,0 +1,139 @@ +/* Test of create_pipe_bidi/wait_subprocess. + Copyright (C) 2009-2011 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, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include + +#include "spawn-pipe.h" +#include "wait-process.h" + +#include +#include +#include +#include +#include + +/* Depending on arguments, this test intentionally closes stderr or + starts life with stderr closed. So, we arrange to have fd 10 + (outside the range of interesting fd's during the test) set up to + duplicate the original stderr. */ + +#define BACKUP_STDERR_FILENO 10 +#define ASSERT_STREAM myerr +#include "macros.h" + +static FILE *myerr; + +/* Create a bi-directional pipe to a test child, and validate that the + child program returns the expected output. + PROG is the program to run in the child process. + STDERR_CLOSED is true if we have already closed fd 2. */ +static void +test_pipe (const char *prog, bool stderr_closed) +{ + int fd[2]; + char *argv[3]; + pid_t pid; + char buffer[2] = { 'a', 't' }; + + /* Set up child. */ + argv[0] = (char *) prog; + argv[1] = (char *) (stderr_closed ? "1" : "0"); + argv[2] = NULL; + pid = create_pipe_bidi (prog, prog, argv, false, true, true, fd); + ASSERT (0 <= pid); + ASSERT (STDERR_FILENO < fd[0]); + ASSERT (STDERR_FILENO < fd[1]); + + /* Push child's input. */ + ASSERT (write (fd[1], buffer, 1) == 1); + ASSERT (close (fd[1]) == 0); + + /* Get child's output. */ + ASSERT (read (fd[0], buffer, 2) == 1); + + /* Wait for child. */ + ASSERT (wait_subprocess (pid, prog, true, false, true, true, NULL) == 0); + ASSERT (close (fd[0]) == 0); + + /* Check the result. */ + ASSERT (buffer[0] == 'b'); + ASSERT (buffer[1] == 't'); +} + +int +main (int argc, char *argv[]) +{ + int test; + int fd; + + if (argc != 3) + { + fprintf (stderr, "%s: need 2 arguments\n", argv[0]); + return 2; + } + /* We might close fd 2 later, so save it in fd 10. */ + if (dup2 (STDERR_FILENO, BACKUP_STDERR_FILENO) != BACKUP_STDERR_FILENO + || (myerr = fdopen (BACKUP_STDERR_FILENO, "w")) == NULL) + return 2; + + /* Selectively close various standard fds, to verify the child process is + not impacted by this. */ + test = atoi (argv[2]); + switch (test) + { + case 0: + break; + case 1: + close (0); + break; + case 2: + close (1); + break; + case 3: + close (0); + close (1); + break; + case 4: + close (2); + break; + case 5: + close (0); + close (2); + break; + case 6: + close (1); + close (2); + break; + case 7: + close (0); + close (1); + close (2); + break; + default: + ASSERT (false); + } + + /* Plug any file descriptor leaks inherited from outside world before + starting, so that child has a clean slate (at least for the fds that we + might be manipulating). */ + for (fd = 3; fd < 7; fd++) + close (fd); + + test_pipe (argv[1], test >= 4); + + return 0; +} diff --git a/tests/test-spawn-pipe.c b/tests/test-spawn-pipe.c deleted file mode 100644 index 36aa064095..0000000000 --- a/tests/test-spawn-pipe.c +++ /dev/null @@ -1,139 +0,0 @@ -/* Test of create_pipe_bidi/wait_subprocess. - Copyright (C) 2009-2011 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, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - -#include - -#include "spawn-pipe.h" -#include "wait-process.h" - -#include -#include -#include -#include -#include - -/* Depending on arguments, this test intentionally closes stderr or - starts life with stderr closed. So, we arrange to have fd 10 - (outside the range of interesting fd's during the test) set up to - duplicate the original stderr. */ - -#define BACKUP_STDERR_FILENO 10 -#define ASSERT_STREAM myerr -#include "macros.h" - -static FILE *myerr; - -/* Create a bi-directional pipe to a test child, and validate that the - child program returns the expected output. - PROG is the program to run in the child process. - STDERR_CLOSED is true if we have already closed fd 2. */ -static void -test_pipe (const char *prog, bool stderr_closed) -{ - int fd[2]; - char *argv[3]; - pid_t pid; - char buffer[2] = { 'a', 't' }; - - /* Set up child. */ - argv[0] = (char *) prog; - argv[1] = (char *) (stderr_closed ? "1" : "0"); - argv[2] = NULL; - pid = create_pipe_bidi (prog, prog, argv, false, true, true, fd); - ASSERT (0 <= pid); - ASSERT (STDERR_FILENO < fd[0]); - ASSERT (STDERR_FILENO < fd[1]); - - /* Push child's input. */ - ASSERT (write (fd[1], buffer, 1) == 1); - ASSERT (close (fd[1]) == 0); - - /* Get child's output. */ - ASSERT (read (fd[0], buffer, 2) == 1); - - /* Wait for child. */ - ASSERT (wait_subprocess (pid, prog, true, false, true, true, NULL) == 0); - ASSERT (close (fd[0]) == 0); - - /* Check the result. */ - ASSERT (buffer[0] == 'b'); - ASSERT (buffer[1] == 't'); -} - -int -main (int argc, char *argv[]) -{ - int test; - int fd; - - if (argc != 3) - { - fprintf (stderr, "%s: need 2 arguments\n", argv[0]); - return 2; - } - /* We might close fd 2 later, so save it in fd 10. */ - if (dup2 (STDERR_FILENO, BACKUP_STDERR_FILENO) != BACKUP_STDERR_FILENO - || (myerr = fdopen (BACKUP_STDERR_FILENO, "w")) == NULL) - return 2; - - /* Selectively close various standard fds, to verify the child process is - not impacted by this. */ - test = atoi (argv[2]); - switch (test) - { - case 0: - break; - case 1: - close (0); - break; - case 2: - close (1); - break; - case 3: - close (0); - close (1); - break; - case 4: - close (2); - break; - case 5: - close (0); - close (2); - break; - case 6: - close (1); - close (2); - break; - case 7: - close (0); - close (1); - close (2); - break; - default: - ASSERT (false); - } - - /* Plug any file descriptor leaks inherited from outside world before - starting, so that child has a clean slate (at least for the fds that we - might be manipulating). */ - for (fd = 3; fd < 7; fd++) - close (fd); - - test_pipe (argv[1], test >= 4); - - return 0; -} diff --git a/tests/test-spawn-pipe.sh b/tests/test-spawn-pipe.sh index d650c05786..676026c86e 100755 --- a/tests/test-spawn-pipe.sh +++ b/tests/test-spawn-pipe.sh @@ -2,7 +2,7 @@ st=0 for i in 0 1 2 3 4 5 6 7 ; do - ./test-spawn-pipe${EXEEXT} ./test-spawn-pipe-child${EXEEXT} $i \ + ./test-spawn-pipe-main${EXEEXT} ./test-spawn-pipe-child${EXEEXT} $i \ || { echo test-spawn-pipe.sh: iteration $i failed >&2; st=1; } done exit $st