diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-06-12 19:23:39 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-06-12 19:29:45 +0300 |
commit | 85563afeac954a50de7e4c207f43b57a4e63e474 (patch) | |
tree | 967054eb92014811e067f1d56c99e12c268f1824 /tests | |
parent | f5c72b5e74ea7aaf1375f763f977e3249c6b7fc4 (diff) | |
download | pies-85563afeac954a50de7e4c207f43b57a4e63e474.tar.gz pies-85563afeac954a50de7e4c207f43b57a4e63e474.tar.bz2 |
More tests for built-in services
* tests/builtin.at: Check tcpmux services.
* tests/nt.c: Add tcpmux support, improve error checking.
* tests/chargen.c: Improve error checking.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/builtin.at | 77 | ||||
-rw-r--r-- | tests/chargen.c | 11 | ||||
-rw-r--r-- | tests/nt.c | 145 |
3 files changed, 211 insertions, 22 deletions
diff --git a/tests/builtin.at b/tests/builtin.at index 40f65fa..893f213 100644 --- a/tests/builtin.at +++ b/tests/builtin.at | |||
@@ -131 +131,78 @@ m4_popdef([IT_BUILTIN]) | |||
131 | m4_popdef([IT_SPECIAL]) | 131 | m4_popdef([IT_SPECIAL]) |
132 | |||
133 | # IT_TCPMUX([KW],[ID],[INPUT],[OUTPUT]) | ||
134 | m4_define([IT_TCPMUX], | ||
135 | [AT_SETUP([tcpmux: $1]) | ||
136 | AT_KEYWORDS([inetd builtin internal tcpmux $1]) | ||
137 | AT_CHECK([ | ||
138 | PIES_XFAIL_CHECK | ||
139 | PIES_CONTROL_INIT | ||
140 | : ${PIES_TEST_INET_SOCKET:=unix://$PWD/in.sock} | ||
141 | m4_if([$3],[],[],[AT_DATA([input],[$3])]) | ||
142 | cat > pies.conf <<_EOT | ||
143 | component master { | ||
144 | socket "$PIES_TEST_INET_SOCKET"; | ||
145 | service tcpmux; | ||
146 | flags internal; | ||
147 | } | ||
148 | component one { | ||
149 | service one; | ||
150 | flags (tcpmuxplus); | ||
151 | tcpmux-master master; | ||
152 | command "$auxdir/in.test $PWD/one.log"; | ||
153 | stderr file "$PWD/one.err"; | ||
154 | } | ||
155 | component two { | ||
156 | service two; | ||
157 | flags (tcpmuxplus); | ||
158 | tcpmux-master master; | ||
159 | command "$auxdir/in.test $PWD/two.log"; | ||
160 | stderr file "$PWD/two.err"; | ||
161 | } | ||
162 | component test { | ||
163 | command "nt -t [$2]m4_if([$3],[],,[ -i $PWD/input]) -o $PWD/test.out '$PIES_TEST_INET_SOCKET'"; | ||
164 | stderr file "$PWD/test.err"; | ||
165 | return-code * { | ||
166 | action disable; | ||
167 | exec "piesctl --no-netrc --url=$PIES_CTLSOCK shutdown"; | ||
168 | } | ||
169 | } | ||
170 | _EOT | ||
171 | |||
172 | set -e | ||
173 | to 10 \ | ||
174 | pies --foreground --stderr \ | ||
175 | --config-file control.conf --config-file pies.conf --debug 1 2>errlog | ||
176 | |||
177 | for err in one.err two.err test.err | ||
178 | do | ||
179 | if test -s $err; then | ||
180 | echo "$err:" | ||
181 | cat $err | ||
182 | fi | ||
183 | done >&2 | ||
184 | |||
185 | if test -f test.out; then | ||
186 | cat test.out | tr -d '\r' | ||
187 | fi | ||
188 | ], | ||
189 | [0], | ||
190 | [$4]) | ||
191 | AT_CLEANUP | ||
192 | ]) | ||
193 | |||
194 | IT_TCPMUX([help],[help],[], | ||
195 | [one | ||
196 | two | ||
197 | ]) | ||
198 | |||
199 | IT_TCPMUX([service],[one], | ||
200 | [Test one | ||
201 | quit | ||
202 | ], | ||
203 | [OK Test one | ||
204 | ]) | ||
205 | |||
206 | m4_popdef([IT_TCPMUX]) | ||
207 | |||
208 | |||
diff --git a/tests/chargen.c b/tests/chargen.c index a3b3290..75d096c 100644 --- a/tests/chargen.c +++ b/tests/chargen.c | |||
@@ -78,3 +78,3 @@ main (int argc, char **argv) | |||
78 | { | 78 | { |
79 | perror (argv[0]); | 79 | perror (argv[1]); |
80 | return 64; | 80 | return 64; |
@@ -83,4 +83,11 @@ main (int argc, char **argv) | |||
83 | fd = url_connect (url, NULL); | 83 | fd = url_connect (url, NULL); |
84 | if (fd == -1) | ||
85 | return 1; | ||
84 | fp = fdopen (fd, "r"); | 86 | fp = fdopen (fd, "r"); |
85 | 87 | if (!fp) | |
88 | { | ||
89 | perror ("fdopen"); | ||
90 | return 1; | ||
91 | } | ||
92 | |||
86 | first = next_char (0); | 93 | first = next_char (0); |
@@ -138,3 +138,3 @@ netcat_stream_read (netcat_server_t *srv) | |||
138 | grecs_error (NULL, errno, "%s: read", srv->id); | 138 | grecs_error (NULL, errno, "%s: read", srv->id); |
139 | srv->pollfd->events &= ~POLLIN; | 139 | netcat_stream_disconnect (srv, POLLIN); |
140 | return -1; | 140 | return -1; |
@@ -187,2 +187,3 @@ netcat_stream_write (netcat_server_t *srv) | |||
187 | grecs_error (NULL, errno, "%s: write", srv->id); | 187 | grecs_error (NULL, errno, "%s: write", srv->id); |
188 | netcat_stream_disconnect (srv, POLLOUT); | ||
188 | return -1; | 189 | return -1; |
@@ -191,3 +192,3 @@ netcat_stream_write (netcat_server_t *srv) | |||
191 | { | 192 | { |
192 | // FIXME: eof | 193 | netcat_stream_disconnect (srv, POLLOUT); |
193 | return -1; | 194 | return -1; |
@@ -222,4 +223,95 @@ disconnect_stdout (netcat_server_t *srv) | |||
222 | 223 | ||
224 | void | ||
225 | fd_write (int fd, char const *str, size_t len) | ||
226 | { | ||
227 | while (len) | ||
228 | { | ||
229 | ssize_t n = write (fd, str, len); | ||
230 | if (n == -1) | ||
231 | { | ||
232 | perror ("socket write"); | ||
233 | exit (1); | ||
234 | } | ||
235 | if (n == 0) | ||
236 | { | ||
237 | fprintf (stderr, "zero write\n"); | ||
238 | exit (1); | ||
239 | } | ||
240 | len -= n; | ||
241 | str += n; | ||
242 | } | ||
243 | } | ||
244 | |||
245 | void | ||
246 | fd_writeln (int fd, char const *str) | ||
247 | { | ||
248 | fd_write (fd, str, strlen (str)); | ||
249 | fd_write (fd, "\r\n", 2); | ||
250 | } | ||
251 | |||
252 | int | ||
253 | fd_getc (int fd) | ||
254 | { | ||
255 | char c; | ||
256 | ssize_t n = read (fd, &c, 1); | ||
257 | if (n == -1) | ||
258 | { | ||
259 | perror ("socket read"); | ||
260 | exit (1); | ||
261 | } | ||
262 | if (n == 0) | ||
263 | c = EOF; | ||
264 | return c; | ||
265 | } | ||
266 | |||
267 | static void | ||
268 | tcpmux_init (int fd, char const *service) | ||
269 | { | ||
270 | int c; | ||
271 | |||
272 | fd_writeln (fd, service); | ||
273 | |||
274 | if (strcmp (service, "help") == 0) | ||
275 | { | ||
276 | while ((c = fd_getc (fd)) != EOF) | ||
277 | { | ||
278 | fputc (c, stdout); | ||
279 | } | ||
280 | close (fd); | ||
281 | exit (0); | ||
282 | } | ||
283 | |||
284 | c = fd_getc (fd); | ||
285 | if (c == 0) | ||
286 | { | ||
287 | fprintf (stderr, "socket read: unexpected eof\n"); | ||
288 | exit (1); | ||
289 | } | ||
290 | if (c == '+') | ||
291 | { | ||
292 | while ((c = fd_getc (fd)) != '\n') | ||
293 | { | ||
294 | if (c == EOF) | ||
295 | { | ||
296 | fprintf (stderr, "socket read: unexpected eof\n"); | ||
297 | exit (1); | ||
298 | } | ||
299 | } | ||
300 | } | ||
301 | else | ||
302 | { | ||
303 | fprintf (stderr, "service rejected: "); | ||
304 | do | ||
305 | { | ||
306 | if (c != '\r') | ||
307 | fputc (c, stderr); | ||
308 | } | ||
309 | while ((c = fd_getc (fd)) != 0 && c != '\n'); | ||
310 | fputc ('\n', stderr); | ||
311 | exit (1); | ||
312 | } | ||
313 | } | ||
314 | |||
223 | static int | 315 | static int |
224 | netcat (char const *urlstr) | 316 | netcat (char const *urlstr, char const *tcpmux_service) |
225 | { | 317 | { |
@@ -241,2 +333,5 @@ netcat (char const *urlstr) | |||
241 | 333 | ||
334 | if (tcpmux_service) | ||
335 | tcpmux_init (fd, tcpmux_service); | ||
336 | |||
242 | pfd[0].fd = 0; | 337 | pfd[0].fd = 0; |
@@ -267,21 +362,22 @@ netcat (char const *urlstr) | |||
267 | netcat_server_t *next = srv->next; | 362 | netcat_server_t *next = srv->next; |
268 | int events; | ||
269 | 363 | ||
270 | events = (srv->pollfd->events|POLLHUP) | 364 | if ((srv->pollfd->revents & srv->state) & POLLIN) |
271 | & (srv->pollfd->revents | 365 | netcat_stream_read (srv); |
272 | & (srv->state | ((srv->state & POLLOUT) ? POLLHUP : 0))); | 366 | if ((srv->pollfd->revents & srv->state) & POLLOUT) |
273 | if (events) | 367 | netcat_stream_write (srv); |
368 | if ((srv->state & POLLOUT) && (srv->pollfd->revents & POLLHUP)) | ||
274 | { | 369 | { |
275 | if (events & POLLIN) | 370 | //grecs_error (NULL, 0, "HUP on %s", srv->id); |
276 | netcat_stream_read (srv); | 371 | netcat_stream_disconnect (srv, srv->state); |
277 | if (events & POLLOUT) | 372 | } |
278 | netcat_stream_write (srv); | 373 | if (srv->state == 0 || srv->pollfd->fd == -1) |
279 | if (events & POLLHUP) | 374 | { |
375 | netcat_server_t *peer = srv->peer; | ||
376 | if (peer && peer->pollfd->events == 0) | ||
280 | { | 377 | { |
281 | //grecs_error (NULL, 0, "HUP on %s", srv->id); | 378 | netcat_s |