Mercurial > gnulib
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 |
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 | 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 } |