提交 9e2fad87 编写于 作者: D Daniel P. Berrangé

tests: merge code for UNIX and TCP socket testing

The test code for UNIX and TCP sockets will need to be rewritten and
extended later, and will benefit from code sharing.
Reviewed-by: NAndrea Bolognani <abologna@redhat.com>
Signed-off-by: NDaniel P. Berrangé <berrange@redhat.com>
上级 dfd282f6
...@@ -116,38 +116,67 @@ checkProtocols(bool *hasIPv4, bool *hasIPv6, ...@@ -116,38 +116,67 @@ checkProtocols(bool *hasIPv4, bool *hasIPv6,
} }
struct testTCPData { struct testSocketData {
const char *lnode; const char *lnode;
int port; int port;
const char *cnode; const char *cnode;
}; };
static int testSocketTCPAccept(const void *opaque) static int testSocketAccept(const void *opaque)
{ {
virNetSocketPtr *lsock = NULL; /* Listen socket */ virNetSocketPtr *lsock = NULL; /* Listen socket */
size_t nlsock = 0, i; size_t nlsock = 0, i;
virNetSocketPtr ssock = NULL; /* Server socket */ virNetSocketPtr ssock = NULL; /* Server socket */
virNetSocketPtr csock = NULL; /* Client socket */ virNetSocketPtr csock = NULL; /* Client socket */
const struct testTCPData *data = opaque; const struct testSocketData *data = opaque;
int ret = -1; int ret = -1;
char portstr[100]; char portstr[100];
char *tmpdir = NULL;
char *path = NULL;
char template[] = "/tmp/libvirt_XXXXXX";
snprintf(portstr, sizeof(portstr), "%d", data->port); if (!data) {
virNetSocketPtr usock;
tmpdir = mkdtemp(template);
if (tmpdir == NULL) {
VIR_WARN("Failed to create temporary directory");
goto cleanup;
}
if (virAsprintf(&path, "%s/test.sock", tmpdir) < 0)
goto cleanup;
if (virNetSocketNewListenUNIX(path, 0700, -1, getegid(), &usock) < 0)
goto cleanup;
if (VIR_ALLOC_N(lsock, 1) < 0) {
virObjectUnref(usock);
goto cleanup;
}
lsock[0] = usock;
nlsock = 1;
} else {
snprintf(portstr, sizeof(portstr), "%d", data->port);
if (virNetSocketNewListenTCP(data->lnode, portstr, if (virNetSocketNewListenTCP(data->lnode, portstr,
AF_UNSPEC, AF_UNSPEC,
&lsock, &nlsock) < 0) &lsock, &nlsock) < 0)
goto cleanup; goto cleanup;
}
for (i = 0; i < nlsock; i++) { for (i = 0; i < nlsock; i++) {
if (virNetSocketListen(lsock[i], 0) < 0) if (virNetSocketListen(lsock[i], 0) < 0)
goto cleanup; goto cleanup;
} }
if (!data) {
if (virNetSocketNewConnectUNIX(path, false, NULL, &csock) < 0)
goto cleanup;
} else {
if (virNetSocketNewConnectTCP(data->cnode, portstr, if (virNetSocketNewConnectTCP(data->cnode, portstr,
AF_UNSPEC, AF_UNSPEC,
&csock) < 0) &csock) < 0)
goto cleanup; goto cleanup;
}
virObjectUnref(csock); virObjectUnref(csock);
...@@ -171,62 +200,15 @@ static int testSocketTCPAccept(const void *opaque) ...@@ -171,62 +200,15 @@ static int testSocketTCPAccept(const void *opaque)
for (i = 0; i < nlsock; i++) for (i = 0; i < nlsock; i++)
virObjectUnref(lsock[i]); virObjectUnref(lsock[i]);
VIR_FREE(lsock); VIR_FREE(lsock);
return ret;
}
#endif
#ifndef WIN32
static int testSocketUNIXAccept(const void *data ATTRIBUTE_UNUSED)
{
virNetSocketPtr lsock = NULL; /* Listen socket */
virNetSocketPtr ssock = NULL; /* Server socket */
virNetSocketPtr csock = NULL; /* Client socket */
int ret = -1;
char *path = NULL;
char *tmpdir;
char template[] = "/tmp/libvirt_XXXXXX";
tmpdir = mkdtemp(template);
if (tmpdir == NULL) {
VIR_WARN("Failed to create temporary directory");
goto cleanup;
}
if (virAsprintf(&path, "%s/test.sock", tmpdir) < 0)
goto cleanup;
if (virNetSocketNewListenUNIX(path, 0700, -1, getegid(), &lsock) < 0)
goto cleanup;
if (virNetSocketListen(lsock, 0) < 0)
goto cleanup;
if (virNetSocketNewConnectUNIX(path, false, NULL, &csock) < 0)
goto cleanup;
virObjectUnref(csock);
if (virNetSocketAccept(lsock, &ssock) != -1) {
char c = 'a';
if (virNetSocketWrite(ssock, &c, 1) != -1) {
VIR_DEBUG("Unexpected client socket present");
goto cleanup;
}
}
ret = 0;
cleanup:
VIR_FREE(path); VIR_FREE(path);
virObjectUnref(lsock);
virObjectUnref(ssock);
if (tmpdir) if (tmpdir)
rmdir(tmpdir); rmdir(tmpdir);
return ret; return ret;
} }
#endif
#ifndef WIN32
static int testSocketUNIXAddrs(const void *data ATTRIBUTE_UNUSED) static int testSocketUNIXAddrs(const void *data ATTRIBUTE_UNUSED)
{ {
virNetSocketPtr lsock = NULL; /* Listen socket */ virNetSocketPtr lsock = NULL; /* Listen socket */
...@@ -456,28 +438,28 @@ mymain(void) ...@@ -456,28 +438,28 @@ mymain(void)
} }
if (hasIPv4) { if (hasIPv4) {
struct testTCPData tcpData = { "127.0.0.1", freePort, "127.0.0.1" }; struct testSocketData tcpData = { "127.0.0.1", freePort, "127.0.0.1" };
if (virTestRun("Socket TCP/IPv4 Accept", testSocketTCPAccept, &tcpData) < 0) if (virTestRun("Socket TCP/IPv4 Accept", testSocketAccept, &tcpData) < 0)
ret = -1; ret = -1;
} }
if (hasIPv6) { if (hasIPv6) {
struct testTCPData tcpData = { "::1", freePort, "::1" }; struct testSocketData tcpData = { "::1", freePort, "::1" };
if (virTestRun("Socket TCP/IPv6 Accept", testSocketTCPAccept, &tcpData) < 0) if (virTestRun("Socket TCP/IPv6 Accept", testSocketAccept, &tcpData) < 0)
ret = -1; ret = -1;
} }
if (hasIPv6 && hasIPv4) { if (hasIPv6 && hasIPv4) {
struct testTCPData tcpData = { NULL, freePort, "127.0.0.1" }; struct testSocketData tcpData = { NULL, freePort, "127.0.0.1" };
if (virTestRun("Socket TCP/IPv4+IPv6 Accept", testSocketTCPAccept, &tcpData) < 0) if (virTestRun("Socket TCP/IPv4+IPv6 Accept", testSocketAccept, &tcpData) < 0)
ret = -1; ret = -1;
tcpData.cnode = "::1"; tcpData.cnode = "::1";
if (virTestRun("Socket TCP/IPv4+IPv6 Accept", testSocketTCPAccept, &tcpData) < 0) if (virTestRun("Socket TCP/IPv4+IPv6 Accept", testSocketAccept, &tcpData) < 0)
ret = -1; ret = -1;
} }
#endif #endif
#ifndef WIN32 #ifndef WIN32
if (virTestRun("Socket UNIX Accept", testSocketUNIXAccept, NULL) < 0) if (virTestRun("Socket UNIX Accept", testSocketAccept, NULL) < 0)
ret = -1; ret = -1;
if (virTestRun("Socket UNIX Addrs", testSocketUNIXAddrs, NULL) < 0) if (virTestRun("Socket UNIX Addrs", testSocketUNIXAddrs, NULL) < 0)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册