annotate tests/test-spawn-pipe-main.c @ 40196:e63f5d3edab5

relocatable-prog: Update documentation. * doc/relocatable-maint.texi (Supporting Relocation): Update to match the recent changes.
author Bruno Haible <bruno@clisp.org>
date Sun, 24 Feb 2019 01:49:15 +0100
parents b06060465f09
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14876
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Test of create_pipe_bidi/wait_subprocess.
40057
b06060465f09 maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents: 19484
diff changeset
2 Copyright (C) 2009-2019 Free Software Foundation, Inc.
14876
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 the Free Software Foundation; either version 3, or (at your option)
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7 any later version.
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 GNU General Public License for more details.
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
19190
9759915b2aca all: prefer https: URLs
Paul Eggert <eggert@cs.ucla.edu>
parents: 18626
diff changeset
15 along with this program; if not, see <https://www.gnu.org/licenses/>. */
14876
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
16
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17 #include <config.h>
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19 #include "spawn-pipe.h"
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20 #include "wait-process.h"
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 #include <stdbool.h>
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23 #include <stdio.h>
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 #include <stdlib.h>
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 #include <string.h>
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 #include <unistd.h>
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28 /* Depending on arguments, this test intentionally closes stderr or
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 starts life with stderr closed. So, we arrange to have fd 10
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30 (outside the range of interesting fd's during the test) set up to
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 duplicate the original stderr. */
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 #define BACKUP_STDERR_FILENO 10
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 #define ASSERT_STREAM myerr
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35 #include "macros.h"
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 static FILE *myerr;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39 /* Create a bi-directional pipe to a test child, and validate that the
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40 child program returns the expected output.
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 PROG is the program to run in the child process.
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42 STDERR_CLOSED is true if we have already closed fd 2. */
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 static void
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 test_pipe (const char *prog, bool stderr_closed)
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 {
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 int fd[2];
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 char *argv[3];
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 pid_t pid;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 char buffer[2] = { 'a', 't' };
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 /* Set up child. */
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 argv[0] = (char *) prog;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 argv[1] = (char *) (stderr_closed ? "1" : "0");
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54 argv[2] = NULL;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 pid = create_pipe_bidi (prog, prog, argv, false, true, true, fd);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 ASSERT (0 <= pid);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 ASSERT (STDERR_FILENO < fd[0]);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58 ASSERT (STDERR_FILENO < fd[1]);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 /* Push child's input. */
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 ASSERT (write (fd[1], buffer, 1) == 1);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 ASSERT (close (fd[1]) == 0);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
64 /* Get child's output. */
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65 ASSERT (read (fd[0], buffer, 2) == 1);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 /* Wait for child. */
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 ASSERT (wait_subprocess (pid, prog, true, false, true, true, NULL) == 0);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
69 ASSERT (close (fd[0]) == 0);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71 /* Check the result. */
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72 ASSERT (buffer[0] == 'b');
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73 ASSERT (buffer[1] == 't');
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74 }
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76 int
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
77 main (int argc, char *argv[])
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 {
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 int test;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80 int fd;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
81
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82 if (argc != 3)
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
83 {
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84 fprintf (stderr, "%s: need 2 arguments\n", argv[0]);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
85 return 2;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86 }
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
87 /* We might close fd 2 later, so save it in fd 10. */
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
88 if (dup2 (STDERR_FILENO, BACKUP_STDERR_FILENO) != BACKUP_STDERR_FILENO
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
89 || (myerr = fdopen (BACKUP_STDERR_FILENO, "w")) == NULL)
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
90 return 2;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
91
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
92 /* Selectively close various standard fds, to verify the child process is
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
93 not impacted by this. */
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
94 test = atoi (argv[2]);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
95 switch (test)
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
96 {
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
97 case 0:
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98 break;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99 case 1:
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
100 close (0);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
101 break;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
102 case 2:
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
103 close (1);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
104 break;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
105 case 3:
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
106 close (0);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
107 close (1);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
108 break;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
109 case 4:
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
110 close (2);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
111 break;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
112 case 5:
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
113 close (0);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
114 close (2);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
115 break;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
116 case 6:
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
117 close (1);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
118 close (2);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
119 break;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
120 case 7:
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
121 close (0);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
122 close (1);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
123 close (2);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
124 break;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
125 default:
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
126 ASSERT (false);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
127 }
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
128
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
129 /* Plug any file descriptor leaks inherited from outside world before
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
130 starting, so that child has a clean slate (at least for the fds that we
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
131 might be manipulating). */
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
132 for (fd = 3; fd < 7; fd++)
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
133 close (fd);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
134
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
135 test_pipe (argv[1], test >= 4);
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
136
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
137 return 0;
bb6795464200 spawn-pipe tests: Rename program.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
138 }