diff options
-rw-r--r-- | doc/build/doing_build.rst | 3 | ||||
-rw-r--r-- | src/lib/rpc/unit-test/client.c | 50 | ||||
-rw-r--r-- | src/lib/rpc/unit-test/config/unix.exp | 21 | ||||
-rw-r--r-- | src/lib/rpc/unit-test/lib/helpers.exp | 6 | ||||
-rw-r--r-- | src/lib/rpc/unit-test/server.c | 3 |
5 files changed, 48 insertions, 35 deletions
diff --git a/doc/build/doing_build.rst b/doc/build/doing_build.rst index bc438c849e..3c686cc716 100644 --- a/doc/build/doing_build.rst +++ b/doc/build/doing_build.rst @@ -149,9 +149,6 @@ However, there are several prerequisites that must be satisfied first: **-**\ **-disable-rpath**, which renders the build tree less suitable for installation, but allows testing without interference from previously installed libraries. -* In order to test the RPC layer, the local system has to be running - the portmap daemon and it has to be listening to the regular network - interface (not just localhost). There are additional regression tests available, which are not run by ``make check``. These tests require manual setup and teardown of diff --git a/src/lib/rpc/unit-test/client.c b/src/lib/rpc/unit-test/client.c index a70cf3842a..6ab45347f1 100644 --- a/src/lib/rpc/unit-test/client.c +++ b/src/lib/rpc/unit-test/client.c @@ -7,12 +7,15 @@ #include <stdio.h> #include <string.h> +#include <netdb.h> +#include <sys/socket.h> #include "autoconf.h" #ifdef HAVE_UNISTD_H #include <unistd.h> #endif #include <gssrpc/rpc.h> #include <gssapi/gssapi.h> +#include <gssapi/gssapi_krb5.h> #include <gssrpc/rpc.h> #include <gssrpc/auth_gssapi.h> #include "rpc_test.h" @@ -51,17 +54,19 @@ main(argc, argv) int argc; char **argv; { - char *host, *target, *echo_arg, **echo_resp, buf[BIG_BUF]; - char *prot; + char *host, *port, *target, *echo_arg, **echo_resp, buf[BIG_BUF]; CLIENT *clnt; AUTH *tmp_auth; struct rpc_err e; - int i, auth_once; + int i, auth_once, sock, use_tcp; unsigned int count; extern int optind; extern char *optarg; extern int svc_debug_gssapi, misc_debug_gssapi, auth_debug_gssapi; int c; + struct sockaddr_in sin; + struct hostent *h; + struct timeval tv; extern int krb5_gss_dbg_client_expcreds; krb5_gss_dbg_client_expcreds = 1; @@ -69,7 +74,7 @@ main(argc, argv) whoami = argv[0]; count = 1026; auth_once = 0; - prot = NULL; + use_tcp = -1; while ((c = getopt(argc, argv, "a:m:os:tu")) != -1) { switch (c) { @@ -86,39 +91,60 @@ main(argc, argv) svc_debug_gssapi = atoi(optarg); break; case 't': - prot = "tcp"; + use_tcp = 1; break; case 'u': - prot = "udp"; + use_tcp = 0; break; case '?': usage(); break; } } - if (prot == NULL) + if (use_tcp == -1) usage(); argv += optind; argc -= optind; switch (argc) { - case 3: - count = atoi(argv[2]); + case 4: + count = atoi(argv[3]); if (count > BIG_BUF-1) { fprintf(stderr, "Test count cannot exceed %d.\n", BIG_BUF-1); usage(); } - case 2: + case 3: host = argv[0]; - target = argv[1]; + port = argv[1]; + target = argv[2]; break; default: usage(); } + /* get server address */ + h = gethostbyname(host); + if (h == NULL) { + fprintf(stderr, "Can't resolve hostname %s\n", host); + exit(1); + } + memset(&sin, 0, sizeof(sin)); + sin.sin_family = h->h_addrtype; + sin.sin_port = ntohs(atoi(port)); + memmove(&sin.sin_addr, h->h_addr, sizeof(sin.sin_addr)); + /* client handle to rstat */ - clnt = clnt_create(host, RPC_TEST_PROG, RPC_TEST_VERS_1, prot); + sock = RPC_ANYSOCK; + if (use_tcp) { + clnt = clnttcp_create(&sin, RPC_TEST_PROG, RPC_TEST_VERS_1, &sock, 0, + 0); + } else { + tv.tv_sec = 5; + tv.tv_usec = 0; + clnt = clntudp_create(&sin, RPC_TEST_PROG, RPC_TEST_VERS_1, tv, + &sock); + } if (clnt == NULL) { clnt_pcreateerror(whoami); exit(1); diff --git a/src/lib/rpc/unit-test/config/unix.exp b/src/lib/rpc/unit-test/config/unix.exp index f02116e1da..ba57b703e9 100644 --- a/src/lib/rpc/unit-test/config/unix.exp +++ b/src/lib/rpc/unit-test/config/unix.exp @@ -112,10 +112,6 @@ proc rpc_test_exit {} { global server_started global kill - if { [info exists server_started] && $server_started == 0 } { - return - } - if {[catch { expect { -i $server_id @@ -138,6 +134,7 @@ proc rpc_test_start { } { global server_id global server_pid global server_started + global server_port global env if [info exists server_pid] { rpc_test_exit } @@ -148,25 +145,17 @@ proc rpc_test_start { } { set server_pid [spawn $SERVER $PROT] set server_id $spawn_id set server_started 1 + set server_port -1 unset env(KRB5_KTNAME) set timeout 30 expect { + -re "port: (\[0-9\]*)\r\n" { + set server_port $expect_out(1,string) + } "running" { } - "Cannot register service" { - send_error "Server cannot register with portmap/rpcbind!!\n" - note "+++" - note "+++ These tests require the ability to register with portmap/rpcbind" - note "+++ Either the server is not running or it does not" - note "+++ allow registration using a loopback connection" - note "+++" - verbose $expect_out(buffer) 1 - set server_started 0 - unsupported "Server registration" - return - } eof { send_error "server exited!" verbose $expect_out(buffer) 1 diff --git a/src/lib/rpc/unit-test/lib/helpers.exp b/src/lib/rpc/unit-test/lib/helpers.exp index 963fff4589..a1b078374a 100644 --- a/src/lib/rpc/unit-test/lib/helpers.exp +++ b/src/lib/rpc/unit-test/lib/helpers.exp @@ -170,7 +170,7 @@ proc flush_server {} { proc start_client {testname ccname user password lifetime count {target ""}} { - global env CLIENT PROT hostname spawn_id verbose + global env CLIENT PROT hostname server_port spawn_id verbose if {$target == ""} { set target "server@$hostname" @@ -180,9 +180,9 @@ proc start_client {testname ccname user password lifetime count kinit $user $password $lifetime if {$verbose > 0} { - spawn $CLIENT -a 1 -s 1 -m 1 $PROT $hostname $target $count + spawn $CLIENT -a 1 -s 1 -m 1 $PROT $hostname $server_port $target $count } else { - spawn $CLIENT $PROT $hostname $target $count + spawn $CLIENT $PROT $hostname $server_port $target $count } verbose "$testname: client $ccname started" diff --git a/src/lib/rpc/unit-test/server.c b/src/lib/rpc/unit-test/server.c index c2cb30ccbc..7451558056 100644 --- a/src/lib/rpc/unit-test/server.c +++ b/src/lib/rpc/unit-test/server.c @@ -114,12 +114,13 @@ main(int argc, char **argv) exit(1); } if (!svc_register(transp, RPC_TEST_PROG, RPC_TEST_VERS_1, - rpc_test_prog_1_svc, prot)) { + rpc_test_prog_1_svc, 0)) { fprintf(stderr, "unable to register (RPC_TEST_PROG, RPC_TEST_VERS_1, %s).", prot == IPPROTO_TCP ? "tcp" : "udp"); exit(1); } + printf("port: %d\n", (int)transp->xp_port); if (svcauth_gssapi_set_names(names, 0) == FALSE) { fprintf(stderr, "unable to set gssapi names\n"); |