diff mbox

[v3,07/13] test-char: split char_udp_test

Message ID 1496152683-102751-8-git-send-email-anton.nefedov@virtuozzo.com
State New
Headers show

Commit Message

Anton Nefedov May 30, 2017, 1:57 p.m. UTC
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(-)

Comments

Marc-André Lureau May 31, 2017, 7:22 p.m. UTC | #1
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 mbox

Patch

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)