mirror of https://gitee.com/openkylin/qemu.git
test-char: split char_udp_test
makes it possible to test the existing chardev-udp Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <1499342940-56739-8-git-send-email-anton.nefedov@virtuozzo.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
12f043c240
commit
92ddfade9f
|
@ -407,16 +407,11 @@ static void char_pipe_test(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void char_udp_test(void)
|
static int make_udp_socket(int *port)
|
||||||
{
|
{
|
||||||
struct sockaddr_in addr = { 0, }, other;
|
struct sockaddr_in addr = { 0, };
|
||||||
SocketIdleData d = { 0, };
|
|
||||||
Chardev *chr;
|
|
||||||
CharBackend be;
|
|
||||||
socklen_t alen = sizeof(addr);
|
socklen_t alen = sizeof(addr);
|
||||||
int ret, sock = qemu_socket(PF_INET, SOCK_DGRAM, 0);
|
int ret, sock = qemu_socket(PF_INET, SOCK_DGRAM, 0);
|
||||||
char buf[10];
|
|
||||||
char *tmp;
|
|
||||||
|
|
||||||
g_assert_cmpint(sock, >, 0);
|
g_assert_cmpint(sock, >, 0);
|
||||||
addr.sin_family = AF_INET ;
|
addr.sin_family = AF_INET ;
|
||||||
|
@ -427,19 +422,41 @@ static void char_udp_test(void)
|
||||||
ret = getsockname(sock, (struct sockaddr *)&addr, &alen);
|
ret = getsockname(sock, (struct sockaddr *)&addr, &alen);
|
||||||
g_assert_cmpint(ret, ==, 0);
|
g_assert_cmpint(ret, ==, 0);
|
||||||
|
|
||||||
tmp = g_strdup_printf("udp:127.0.0.1:%d",
|
*port = ntohs(addr.sin_port);
|
||||||
ntohs(addr.sin_port));
|
return sock;
|
||||||
chr = qemu_chr_new("client", tmp);
|
}
|
||||||
g_assert_nonnull(chr);
|
|
||||||
|
static void char_udp_test_internal(Chardev *reuse_chr, int sock)
|
||||||
|
{
|
||||||
|
struct sockaddr_in other;
|
||||||
|
SocketIdleData d = { 0, };
|
||||||
|
Chardev *chr;
|
||||||
|
CharBackend *be;
|
||||||
|
socklen_t alen = sizeof(other);
|
||||||
|
int ret;
|
||||||
|
char buf[10];
|
||||||
|
char *tmp = NULL;
|
||||||
|
|
||||||
|
if (reuse_chr) {
|
||||||
|
chr = reuse_chr;
|
||||||
|
be = chr->be;
|
||||||
|
} else {
|
||||||
|
int port;
|
||||||
|
sock = make_udp_socket(&port);
|
||||||
|
tmp = g_strdup_printf("udp:127.0.0.1:%d", port);
|
||||||
|
chr = qemu_chr_new("client", tmp);
|
||||||
|
g_assert_nonnull(chr);
|
||||||
|
|
||||||
|
be = g_alloca(sizeof(CharBackend));
|
||||||
|
qemu_chr_fe_init(be, chr, &error_abort);
|
||||||
|
}
|
||||||
|
|
||||||
d.chr = chr;
|
d.chr = chr;
|
||||||
qemu_chr_fe_init(&be, chr, &error_abort);
|
qemu_chr_fe_set_handlers(be, socket_can_read_hello, socket_read_hello,
|
||||||
qemu_chr_fe_set_handlers(&be, socket_can_read_hello, socket_read_hello,
|
|
||||||
NULL, NULL, &d, NULL, true);
|
NULL, NULL, &d, NULL, true);
|
||||||
ret = qemu_chr_write_all(chr, (uint8_t *)"hello", 5);
|
ret = qemu_chr_write_all(chr, (uint8_t *)"hello", 5);
|
||||||
g_assert_cmpint(ret, ==, 5);
|
g_assert_cmpint(ret, ==, 5);
|
||||||
|
|
||||||
alen = sizeof(addr);
|
|
||||||
ret = recvfrom(sock, buf, sizeof(buf), 0,
|
ret = recvfrom(sock, buf, sizeof(buf), 0,
|
||||||
(struct sockaddr *)&other, &alen);
|
(struct sockaddr *)&other, &alen);
|
||||||
g_assert_cmpint(ret, ==, 5);
|
g_assert_cmpint(ret, ==, 5);
|
||||||
|
@ -448,9 +465,16 @@ static void char_udp_test(void)
|
||||||
|
|
||||||
main_loop();
|
main_loop();
|
||||||
|
|
||||||
close(sock);
|
if (!reuse_chr) {
|
||||||
|
close(sock);
|
||||||
|
qemu_chr_fe_deinit(be, true);
|
||||||
|
}
|
||||||
g_free(tmp);
|
g_free(tmp);
|
||||||
qemu_chr_fe_deinit(&be, true);
|
}
|
||||||
|
|
||||||
|
static void char_udp_test(void)
|
||||||
|
{
|
||||||
|
char_udp_test_internal(NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_CHARDEV_SERIAL
|
#ifdef HAVE_CHARDEV_SERIAL
|
||||||
|
|
Loading…
Reference in New Issue