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 | 9 | ||||
-rw-r--r-- | tests/nt.c | 137 |
3 files changed, 206 insertions, 17 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]) m4_popdef([IT_SPECIAL]) + +# IT_TCPMUX([KW],[ID],[INPUT],[OUTPUT]) +m4_define([IT_TCPMUX], +[AT_SETUP([tcpmux: $1]) +AT_KEYWORDS([inetd builtin internal tcpmux $1]) +AT_CHECK([ +PIES_XFAIL_CHECK +PIES_CONTROL_INIT +: ${PIES_TEST_INET_SOCKET:=unix://$PWD/in.sock} +m4_if([$3],[],[],[AT_DATA([input],[$3])]) +cat > pies.conf <<_EOT +component master { + socket "$PIES_TEST_INET_SOCKET"; + service tcpmux; + flags internal; +} +component one { + service one; + flags (tcpmuxplus); + tcpmux-master master; + command "$auxdir/in.test $PWD/one.log"; + stderr file "$PWD/one.err"; +} +component two { + service two; + flags (tcpmuxplus); + tcpmux-master master; + command "$auxdir/in.test $PWD/two.log"; + stderr file "$PWD/two.err"; +} +component test { + command "nt -t [$2]m4_if([$3],[],,[ -i $PWD/input]) -o $PWD/test.out '$PIES_TEST_INET_SOCKET'"; + stderr file "$PWD/test.err"; + return-code * { + action disable; + exec "piesctl --no-netrc --url=$PIES_CTLSOCK shutdown"; + } +} +_EOT + +set -e +to 10 \ + pies --foreground --stderr \ + --config-file control.conf --config-file pies.conf --debug 1 2>errlog + +for err in one.err two.err test.err +do + if test -s $err; then + echo "$err:" + cat $err + fi +done >&2 + +if test -f test.out; then + cat test.out | tr -d '\r' +fi +], +[0], +[$4]) +AT_CLEANUP +]) + +IT_TCPMUX([help],[help],[], +[one +two +]) + +IT_TCPMUX([service],[one], +[Test one +quit +], +[OK Test one +]) + +m4_popdef([IT_TCPMUX]) + + 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) { - perror (argv[0]); + perror (argv[1]); return 64; @@ -83,3 +83,10 @@ main (int argc, char **argv) fd = url_connect (url, NULL); + if (fd == -1) + return 1; fp = fdopen (fd, "r"); + if (!fp) + { + perror ("fdopen"); + return 1; + } @@ -138,3 +138,3 @@ netcat_stream_read (netcat_server_t *srv) grecs_error (NULL, errno, "%s: read", srv->id); - srv->pollfd->events &= ~POLLIN; + netcat_stream_disconnect (srv, POLLIN); return -1; @@ -187,2 +187,3 @@ netcat_stream_write (netcat_server_t *srv) grecs_error (NULL, errno, "%s: write", srv->id); + netcat_stream_disconnect (srv, POLLOUT); return -1; @@ -191,3 +192,3 @@ netcat_stream_write (netcat_server_t *srv) { - // FIXME: eof + netcat_stream_disconnect (srv, POLLOUT); return -1; @@ -222,4 +223,95 @@ disconnect_stdout (netcat_server_t *srv) +void +fd_write (int fd, char const *str, size_t len) +{ + while (len) + { + ssize_t n = write (fd, str, len); + if (n == -1) + { + perror ("socket write"); + exit (1); + } + if (n == 0) + { + fprintf (stderr, "zero write\n"); + exit (1); + } + len -= n; + str += n; + } +} + +void +fd_writeln (int fd, char const *str) +{ + fd_write (fd, str, strlen (str)); + fd_write (fd, "\r\n", 2); +} + +int +fd_getc (int fd) +{ + char c; + ssize_t n = read (fd, &c, 1); + if (n == -1) + { + perror ("socket read"); + exit (1); + } + if (n == 0) + c = EOF; + return c; +} + +static void +tcpmux_init (int fd, char const *service) +{ + int c; + + fd_writeln (fd, service); + + if (strcmp (service, "help") == 0) + { + while ((c = fd_getc (fd)) != EOF) + { + fputc (c, stdout); + } + close (fd); + exit (0); + } + + c = fd_getc (fd); + if (c == 0) + { + fprintf (stderr, "socket read: unexpected eof\n"); + exit (1); + } + if (c == '+') + { + while ((c = fd_getc (fd)) != '\n') + { + if (c == EOF) + { + fprintf (stderr, "socket read: unexpected eof\n"); + exit (1); + } + } + } + else + { + fprintf (stderr, "service rejected: "); + do + { + if (c != '\r') + fputc (c, stderr); + } + while ((c = fd_getc (fd)) != 0 && c != '\n'); + fputc ('\n', stderr); + exit (1); + } +} + static int -netcat (char const *urlstr) +netcat (char const *urlstr, char const *tcpmux_service) { @@ -241,2 +333,5 @@ netcat (char const *urlstr) + if (tcpmux_service) + tcpmux_init (fd, tcpmux_service); + pfd[0].fd = 0; @@ -267,14 +362,8 @@ netcat (char const *urlstr) netcat_server_t *next = srv->next; - int events; - events = (srv->pollfd->events|POLLHUP) - & (srv->pollfd->revents - & (srv->state | ((srv->state & POLLOUT) ? POLLHUP : 0))); - if (events) - { - if (events & POLLIN) + if ((srv->pollfd->revents & srv->state) & POLLIN) netcat_stream_read (srv); - if (events & POLLOUT) + if ((srv->pollfd->revents & srv->state) & POLLOUT) netcat_stream_write (srv); - if (events & POLLHUP) + if ((srv->state & POLLOUT) && (srv->pollfd->revents & POLLHUP)) { @@ -283,5 +372,12 @@ netcat (char const *urlstr) } - } if (srv->state == 0 || srv->pollfd->fd == -1) + { + netcat_server_t *peer = srv->peer; + if (peer && peer->pollfd->events == 0) + { + netcat_stream_disconnect (peer, peer->state); + netcat_server_remove (peer); + } netcat_server_remove (srv); + } srv = next; @@ -313,5 +409,9 @@ usage (FILE *fp) { - fprintf (fp, "usage: nt [-i IFILE] [-o OFILE] URL\n"); + fprintf (fp, "usage: nt [-i IFILE] [-o OFILE] [-t SERVICE] URL\n"); fprintf (fp, "Reads data from stdin (or IFILE) and sends them to URL.\n"); fprintf (fp, "Reads replies from URL and sends them to stdout (or OFILE).\n"); + fprintf (fp, "\nOPTIONS\n\n"); + fprintf (fp, " -t SERVICE use TCPMUX service\n"); + fprintf (fp, " -i IFILE read input from IFILE\n"); + fprintf (fp, " -o OFILE write output to OFILE\n"); } @@ -322,4 +422,5 @@ main (int argc, char **argv) int c; + char const *tcpmux_service = NULL; - while ((c = getopt (argc, argv, "i:o:")) != EOF) + while ((c = getopt (argc, argv, "i:o:t:")) != EOF) { @@ -335,2 +436,6 @@ main (int argc, char **argv) + case 't': + tcpmux_service = optarg; + break; + default: @@ -349,3 +454,3 @@ main (int argc, char **argv) - return netcat (argv[0]); + return netcat (argv[0], tcpmux_service); } |