File: 0005-tests-skip-vos-tests-when-a-vlserver-is-already-runn.patch

package info (click to toggle)
openafs 1.8.9-1%2Bdeb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 45,712 kB
  • sloc: ansic: 459,205; xml: 66,853; perl: 11,934; makefile: 10,153; sh: 7,817; objc: 6,430; java: 5,638; cpp: 2,268; asm: 1,214; yacc: 432; tcl: 249; lex: 201; csh: 85
file content (97 lines) | stat: -rw-r--r-- 3,374 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
From: Michael Meffie <mmeffie@sinenomine.net>
Date: Fri, 10 Jan 2020 10:54:20 -0500
Subject: tests: skip vos tests when a vlserver is already running

The vos tests start a temporary vlserver process, which is problematic
when the local system already has an installed vlserver. Attempt to
temporarily bind a socket to the vlserver port, and if unable to bind
with an EADDRINUSE error, assume the vlserver is already running and
skip these tests.

Change-Id: I1dd3bc4c7ebcd2c7bffc8aca422222a50058090e
Reviewed-on: https://gerrit.openafs.org/14021
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
(cherry picked from commit bf1b3e2fc12a7502cfd74eb109eeb7131f7230d3)
---
 tests/common/common.h  |  1 +
 tests/common/network.c | 41 +++++++++++++++++++++++++++++++++++++++++
 tests/volser/vos-t.c   |  2 ++
 3 files changed, 44 insertions(+)

diff --git a/tests/common/common.h b/tests/common/common.h
index b976683..e1a407c 100644
--- a/tests/common/common.h
+++ b/tests/common/common.h
@@ -55,6 +55,7 @@ extern int afstest_GetUbikClient(struct afsconf_dir *dir, char *service,
 extern int afstest_IsLoopbackNetworkDefault(void);
 extern int afstest_SkipTestsIfLoopbackNetIsDefault(void);
 extern void afstest_SkipTestsIfBadHostname(void);
+extern void afstest_SkipTestsIfServerRunning(char *name);
 
 /* misc.c */
 extern char *afstest_GetProgname(char **argv);
diff --git a/tests/common/network.c b/tests/common/network.c
index 474fc61..c664505 100644
--- a/tests/common/network.c
+++ b/tests/common/network.c
@@ -61,3 +61,44 @@ afstest_SkipTestsIfBadHostname(void)
     if (!host)
 	skip_all("Can't resolve hostname %s\n", hostname);
 }
+
+/*!
+ * Skips all TAP tests if a server is already running on this system.
+ *
+ * \param name[in]  IANA service name, e.g. "afs3-vlserver"
+ */
+void
+afstest_SkipTestsIfServerRunning(char *name)
+{
+    afs_int32 code;
+    osi_socket sock;
+    struct sockaddr_in addr;
+    afs_int32 service;
+
+    service = afsconf_FindService(name);
+    if (service == -1) {
+	fprintf(stderr, "Unknown service name: %s\n", name);
+	exit(1);
+    }
+    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+    if (sock == OSI_NULLSOCKET) {
+	fprintf(stderr, "Failed to get socket file descriptor.\n");
+	exit(1);
+    }
+    addr.sin_family = AF_INET;
+    addr.sin_addr.s_addr = htonl(INADDR_ANY);
+    addr.sin_port = service; /* Already in network byte order. */
+#ifdef STRUCT_SOCKADDR_HAS_SA_LEN
+    addr.sin_len = sizeof(addr);
+#endif
+    code = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
+    if (code < 0) {
+	if (errno == EADDRINUSE) {
+	    skip_all("Service %s is already running.\n", name);
+	} else {
+	    perror("bind");
+	    exit(1);
+	}
+    }
+    close(sock);
+}
diff --git a/tests/volser/vos-t.c b/tests/volser/vos-t.c
index 41e74bd..382fbed 100644
--- a/tests/volser/vos-t.c
+++ b/tests/volser/vos-t.c
@@ -106,6 +106,8 @@ main(int argc, char **argv)
     afstest_SkipTestsIfBadHostname();
     /* Skip all tests if the current hostname is on the loopback network */
     afstest_SkipTestsIfLoopbackNetIsDefault();
+    /* Skip all tests if a vlserver is already running on this system. */
+    afstest_SkipTestsIfServerRunning("afs3-vlserver");
 
     plan(6);