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();
 }

Reply via email to