Message ID | 1496152683-102751-8-git-send-email-anton.nefedov@virtuozzo.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Tue, May 30, 2017 at 6:02 PM Anton Nefedov <anton.nefedov@virtuozzo.com> wrote: > 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> > --- > tests/test-char.c | 58 > +++++++++++++++++++++++++++++++++++++++---------------- > 1 file changed, 41 insertions(+), 17 deletions(-) > > diff --git a/tests/test-char.c b/tests/test-char.c > index d63d3d2..ad0752a 100644 > --- a/tests/test-char.c > +++ b/tests/test-char.c > @@ -413,16 +413,11 @@ static void char_pipe_test(void) > } > #endif > > -static void char_udp_test(void) > +static int make_udp_socket(int *port) > { > - struct sockaddr_in addr = { 0, }, other; > - SocketIdleData d = { 0, }; > - Chardev *chr; > - CharBackend be; > + struct sockaddr_in addr = { 0, }; > socklen_t alen = sizeof(addr); > int ret, sock = qemu_socket(PF_INET, SOCK_DGRAM, 0); > - char buf[10]; > - char *tmp; > > g_assert_cmpint(sock, >, 0); > addr.sin_family = AF_INET ; > @@ -433,19 +428,41 @@ static void char_udp_test(void) > ret = getsockname(sock, (struct sockaddr *)&addr, &alen); > g_assert_cmpint(ret, ==, 0); > > - tmp = g_strdup_printf("udp:127.0.0.1:%d", > - ntohs(addr.sin_port)); > - chr = qemu_chr_new("client", tmp); > - g_assert_nonnull(chr); > + *port = ntohs(addr.sin_port); > + return sock; > +} > + > +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; > - 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); > ret = qemu_chr_write_all(chr, (uint8_t *)"hello", 5); > g_assert_cmpint(ret, ==, 5); > > - alen = sizeof(addr); > ret = recvfrom(sock, buf, sizeof(buf), 0, > (struct sockaddr *)&other, &alen); > g_assert_cmpint(ret, ==, 5); > @@ -454,10 +471,17 @@ static void char_udp_test(void) > > main_loop(); > > - close(sock); > + if (!reuse_chr) { > + close(sock); > + qemu_chr_fe_deinit(be); > + object_unparent(OBJECT(chr)); > + } > g_free(tmp); > - qemu_chr_fe_deinit(&be); > - object_unparent(OBJECT(chr)); > +} > + > +static void char_udp_test(void) > +{ > + char_udp_test_internal(NULL, 0); > } > > static void char_file_test(void) > -- > 2.7.4 > > > -- Marc-André Lureau
diff --git a/tests/test-char.c b/tests/test-char.c index d63d3d2..ad0752a 100644 --- a/tests/test-char.c +++ b/tests/test-char.c @@ -413,16 +413,11 @@ static void char_pipe_test(void) } #endif -static void char_udp_test(void) +static int make_udp_socket(int *port) { - struct sockaddr_in addr = { 0, }, other; - SocketIdleData d = { 0, }; - Chardev *chr; - CharBackend be; + struct sockaddr_in addr = { 0, }; socklen_t alen = sizeof(addr); int ret, sock = qemu_socket(PF_INET, SOCK_DGRAM, 0); - char buf[10]; - char *tmp; g_assert_cmpint(sock, >, 0); addr.sin_family = AF_INET ; @@ -433,19 +428,41 @@ static void char_udp_test(void) ret = getsockname(sock, (struct sockaddr *)&addr, &alen); g_assert_cmpint(ret, ==, 0); - tmp = g_strdup_printf("udp:127.0.0.1:%d", - ntohs(addr.sin_port)); - chr = qemu_chr_new("client", tmp); - g_assert_nonnull(chr); + *port = ntohs(addr.sin_port); + return sock; +} + +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; - 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); ret = qemu_chr_write_all(chr, (uint8_t *)"hello", 5); g_assert_cmpint(ret, ==, 5); - alen = sizeof(addr); ret = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&other, &alen); g_assert_cmpint(ret, ==, 5); @@ -454,10 +471,17 @@ static void char_udp_test(void) main_loop(); - close(sock); + if (!reuse_chr) { + close(sock); + qemu_chr_fe_deinit(be); + object_unparent(OBJECT(chr)); + } g_free(tmp); - qemu_chr_fe_deinit(&be); - object_unparent(OBJECT(chr)); +} + +static void char_udp_test(void) +{ + char_udp_test_internal(NULL, 0); } static void char_file_test(void)
makes it possible to test the existing chardev-udp Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com> --- tests/test-char.c | 58 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 17 deletions(-)