Module Name: src Committed By: christos Date: Sun Nov 8 19:38:04 UTC 2015
Modified Files: src/tests/lib/libc/rpc: t_rpc.c Log Message: Add more rpc tests. XXX: Need rpcbind running. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/tests/lib/libc/rpc/t_rpc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libc/rpc/t_rpc.c diff -u src/tests/lib/libc/rpc/t_rpc.c:1.5 src/tests/lib/libc/rpc/t_rpc.c:1.6 --- src/tests/lib/libc/rpc/t_rpc.c:1.5 Fri Nov 6 10:30:47 2015 +++ src/tests/lib/libc/rpc/t_rpc.c Sun Nov 8 14:38:04 2015 @@ -1,19 +1,21 @@ -/* $NetBSD: t_rpc.c,v 1.5 2015/11/06 15:30:47 christos Exp $ */ +/* $NetBSD: t_rpc.c,v 1.6 2015/11/08 19:38:04 christos Exp $ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_rpc.c,v 1.5 2015/11/06 15:30:47 christos Exp $"); +__RCSID("$NetBSD: t_rpc.c,v 1.6 2015/11/08 19:38:04 christos Exp $"); #include <sys/types.h> #include <sys/socket.h> #include <rpc/rpc.h> -// #include <rpc/raw.h> #include <stdlib.h> +#include <string.h> #include <err.h> #include <netdb.h> #include <stdio.h> +#include <errno.h> #include <unistd.h> - +#define DEBUG +#define TEST #ifndef TEST #include <atf-c.h> @@ -86,8 +88,9 @@ onehost(const char *host, const char *tr #define PROGNUM 0x81 #define VERSNUM 0x01 #define PLUSONE 1 +#define DESTROY 2 -static struct timeval tout = {0, 0}; +static struct timeval tout = {1, 0}; static void server(struct svc_req *rqstp, SVCXPRT *transp) @@ -103,6 +106,11 @@ server(struct svc_req *rqstp, SVCXPRT *t return; case PLUSONE: break; + case DESTROY: + if (!svc_sendreply(transp, (xdrproc_t)xdr_void, NULL)) + ERRX(EXIT_FAILURE, "svc_sendreply failed %d", 0); + svc_destroy(transp); + exit(0); default: svcerr_noproc(transp); return; @@ -155,6 +163,55 @@ rawtest(const char *arg) return EXIT_SUCCESS; } +static int +regtest(const char *hostname, const char *transp, const char *arg, int p) +{ + CLIENT *clnt; + int num, resp; + enum clnt_stat rv; + pid_t pid; + + if (arg) + num = atoi(arg); + else + num = 0; + + svc_fdset_init(p ? SVC_FDSET_POLL : 0); + if (!svc_create(server, PROGNUM, VERSNUM, transp)) + ERRX(EXIT_FAILURE, "Can't not create server %d", num); + + switch ((pid = fork())) { + case 0: + DPRINTF("Calling svc_run\n"); + svc_run(); + case -1: + ERRX(EXIT_FAILURE, "Fork failed (%s)", strerror(errno)); + default: + sleep(1); + break; + } + + DPRINTF("Initializing client\n"); + clnt = clnt_create(hostname, PROGNUM, VERSNUM, transp); + if (clnt == NULL) + ERRX(EXIT_FAILURE, "%s", + clnt_spcreateerror("clnt_raw_create")); + rv = clnt_call(clnt, PLUSONE, (xdrproc_t)xdr_int, (void *)&num, + (xdrproc_t)xdr_int, (void *)&resp, tout); + if (rv != RPC_SUCCESS) + ERRX(EXIT_FAILURE, "clnt_call: %s", clnt_sperrno(rv)); + DPRINTF("Got %d\n", resp); + if (++num != resp) + ERRX(EXIT_FAILURE, "expected %d got %d", num, resp); + rv = clnt_call(clnt, DESTROY, (xdrproc_t)xdr_void, NULL, + (xdrproc_t)xdr_void, NULL, tout); + if (rv != RPC_SUCCESS) + ERRX(EXIT_FAILURE, "clnt_call: %s", clnt_sperrno(rv)); + clnt_destroy(clnt); + + return EXIT_SUCCESS; +} + #ifdef TEST static void @@ -173,11 +230,18 @@ int main(int argc, char *argv[]) { int ch; + int s, p; const char *transp = "udp"; - - while ((ch = getopt(argc, argv, "rtu")) != -1) + p = s = 0; + while ((ch = getopt(argc, argv, "prstu")) != -1) switch (ch) { + case 'p': + p = 1; + break; + case 's': + s = 1; + break; case 't': transp = "tcp"; break; @@ -188,7 +252,8 @@ main(int argc, char *argv[]) transp = NULL; break; default: - fprintf(stderr, "Usage: %s -[r|t|u] [<hostname>...]\n", + fprintf(stderr, + "Usage: %s -[r|s|t|u] [<hostname>...]\n", getprogname()); return EXIT_FAILURE; } @@ -201,7 +266,9 @@ main(int argc, char *argv[]) } else { for (; optind < argc; optind++) { if (transp) - onehost(argv[optind], transp); + s == 0 ? + onehost(argv[optind], transp) : + regtest(argv[optind], transp, "1", p); else rawtest(argv[optind]); } @@ -248,11 +315,64 @@ ATF_TC_BODY(raw, tc) rawtest(NULL); } + +ATF_TC(tcp); +ATF_TC_HEAD(tcp, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks svc tcp (select)"); +} + +ATF_TC_BODY(tcp, tc) +{ + regtest("localhost", "tcp", 1, 0); + +} + +ATF_TC(udp); +ATF_TC_HEAD(udp, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks svc udp (select)"); +} + +ATF_TC_BODY(udp, tc) +{ + regtest("localhost", "udp", 1, 0); + +} + +ATF_TC(tcp_poll); +ATF_TC_HEAD(tcp_poll, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks svc tcp (poll)"); +} + +ATF_TC_BODY(tcp_poll, tc) +{ + regtest("localhost", "tcp", 1, 1); + +} + +ATF_TC(udp_poll); +ATF_TC_HEAD(udp_poll, tc) +{ + atf_tc_set_md_var(tc, "descr", "Checks svc udp (poll)"); +} + +ATF_TC_BODY(udp_poll, tc) +{ + regtest("localhost", "udp", 1, 1); + +} + ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, get_svc_addr_udp); ATF_TP_ADD_TC(tp, get_svc_addr_tcp); ATF_TP_ADD_TC(tp, raw); + ATF_TP_ADD_TC(tp, tcp); + ATF_TP_ADD_TC(tp, udp); + ATF_TP_ADD_TC(tp, tcp_poll); + ATF_TP_ADD_TC(tp, udp_poll); return atf_no_error(); }