[spice-gtk,v4,27/29] test-cd-emu: Test detach and reattach

Submitted by Frediano Ziglio on Aug. 27, 2019, 9:22 a.m.

Details

Message ID 20190827092246.10276-28-fziglio@redhat.com
State Superseded
Headers show
Series "added feature of sharing CD image" ( rev: 6 ) in Spice

Not browsing as part of any series.

Commit Message

Frediano Ziglio Aug. 27, 2019, 9:22 a.m.
Make sure device can be detached and attached again.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
---
 tests/cd-emu.c | 105 +++++++++++++++++++++++++++++++++++--------------
 1 file changed, 76 insertions(+), 29 deletions(-)

Patch hide | download patch | download mbox

diff --git a/tests/cd-emu.c b/tests/cd-emu.c
index f0966662..8bc3a7ed 100644
--- a/tests/cd-emu.c
+++ b/tests/cd-emu.c
@@ -113,6 +113,67 @@  static void decrement_allocated(gpointer data G_GNUC_UNUSED, GObject *old_gobjec
         spice_usb_backend_read_guest_data(usb_ch, (uint8_t*)data, G_N_ELEMENTS(data)); \
     } while(0)
 
+static void
+device_iteration(const int loop, const bool attach_on_connect)
+{
+    GError *err = NULL;
+    unsigned int hellos_expected, messages_expected;
+
+printf("LOOP %d\n", loop);
+    hellos_expected = hellos_sent;
+    messages_expected = messages_sent;
+
+    if (ch_state == SPICE_CHANNEL_STATE_UNCONNECTED) {
+        ch_state = SPICE_CHANNEL_STATE_CONNECTING;
+    }
+    if (attach_on_connect) {
+        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device, &err));
+        g_assert_null(err);
+        if (ch_state == SPICE_CHANNEL_STATE_READY) {
+            hellos_expected = MIN(hellos_expected + 1, 1);
+            ++messages_expected;
+        } else {
+            g_assert_cmpint(messages_sent, ==, messages_expected);
+        }
+    }
+    g_assert_cmpint(hellos_sent, ==, hellos_expected);
+    g_assert_cmpint(messages_sent, >=, messages_expected);
+
+    // try to get initial data
+    if (ch_state == SPICE_CHANNEL_STATE_CONNECTING) {
+        ch_state = SPICE_CHANNEL_STATE_READY;
+        spice_usb_backend_channel_flush_writes(usb_ch);
+        hellos_expected = MIN(hellos_expected + 1, 1);
+        ++messages_expected;
+    }
+
+    // we should get an hello (only one!)
+    g_assert_cmpint(hellos_sent, ==, hellos_expected);
+    g_assert_cmpint(messages_sent, >=, messages_expected);
+
+    // send hello reply
+    if (loop == 0) {
+        DATA_START
+            0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //000 ....D.......
+            0x71,0x65,0x6d,0x75,0x20,0x75,0x73,0x62,0x2d,0x72,0x65,0x64, //00c qemu usb-red
+            0x69,0x72,0x20,0x67,0x75,0x65,0x73,0x74,0x20,0x33,0x2e,0x30, //018 ir guest 3.0
+            0x2e,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //024 .1..........
+            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //030 ............
+            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //03c ............
+            0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,                     //048 ........
+        DATA_SEND;
+    }
+
+    if (!attach_on_connect) {
+        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device, &err));
+        g_assert_null(err);
+    }
+    g_assert_cmpint(hellos_sent, ==, 1);
+    g_assert_cmpint(messages_sent, >, 1);
+
+    spice_usb_backend_channel_detach(usb_ch);
+}
+
 static void attach(const void *param)
 {
     const bool attach_on_connect = !!GPOINTER_TO_UINT(param);
@@ -156,44 +217,30 @@  static void attach(const void *param)
     g_assert_true(create_emulated_cd(be, &params, &err));
     g_assert_null(err);
     g_assert_nonnull(device);
+    g_assert_false(device->edev_configured);
 
     usb_ch = spice_usb_backend_channel_new(be, SPICE_USBREDIR_CHANNEL(ch));
     g_assert_nonnull(usb_ch);
 
-    // attach on connect
-    ch_state = SPICE_CHANNEL_STATE_CONNECTING;
-    if (attach_on_connect) {
-        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device, &err));
-        g_assert_null(err);
+    for (int loop = 0; loop < 2; ++loop) {
+        device_iteration(loop, attach_on_connect);
     }
-    g_assert_cmpint(hellos_sent, ==, 0);
-    g_assert_cmpint(messages_sent, ==, 0);
 
-    // try to get initial data
-    ch_state = SPICE_CHANNEL_STATE_READY;
-    spice_usb_backend_channel_flush_writes(usb_ch);
+/*
 
-    // we should get an hello (only one!)
-    g_assert_cmpint(hellos_sent, ==, 1);
-    g_assert_cmpint(messages_sent, ==, 1);
+> to server/guest
+< to client from server/guest
 
-    // send hello reply
-    DATA_START
-        0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //000 ....D.......
-        0x71,0x65,0x6d,0x75,0x20,0x75,0x73,0x62,0x2d,0x72,0x65,0x64, //00c qemu usb-red
-        0x69,0x72,0x20,0x67,0x75,0x65,0x73,0x74,0x20,0x33,0x2e,0x30, //018 ir guest 3.0
-        0x2e,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //024 .1..........
-        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //030 ............
-        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //03c ............
-        0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,                     //048 ........
-    DATA_SEND;
+> usb_redir_interface_info,
+> usb_redir_ep_info,
+> usb_redir_device_connect
 
-    if (!attach_on_connect) {
-        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device, &err));
-        g_assert_null(err);
-    }
-    g_assert_cmpint(hellos_sent, ==, 1);
-    g_assert_cmpint(messages_sent, >, 1);
+< usb_redir_reset
+< usb_redir_control_packet
+
+> usb_redir_control_packet
+
+*/
 
     // cleanup
     spice_usb_backend_device_unref(device);

Comments

Frediano Ziglio writes:

> Make sure device can be detached and attached again.
>
> Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
> ---
>  tests/cd-emu.c | 105 +++++++++++++++++++++++++++++++++++--------------
>  1 file changed, 76 insertions(+), 29 deletions(-)
>
> diff --git a/tests/cd-emu.c b/tests/cd-emu.c
> index f0966662..8bc3a7ed 100644
> --- a/tests/cd-emu.c
> +++ b/tests/cd-emu.c
> @@ -113,6 +113,67 @@ static void decrement_allocated(gpointer data G_GNUC_UNUSED, GObject *old_gobjec
>          spice_usb_backend_read_guest_data(usb_ch, (uint8_t*)data, G_N_ELEMENTS(data)); \
>      } while(0)
>
> +static void
> +device_iteration(const int loop, const bool attach_on_connect)
> +{
> +    GError *err = NULL;
> +    unsigned int hellos_expected, messages_expected;
> +
> +printf("LOOP %d\n", loop);

Stray printf? Or if you want to keep it, indentation?

> +    hellos_expected = hellos_sent;
> +    messages_expected = messages_sent;
> +
> +    if (ch_state == SPICE_CHANNEL_STATE_UNCONNECTED) {
> +        ch_state = SPICE_CHANNEL_STATE_CONNECTING;
> +    }
> +    if (attach_on_connect) {
> +        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device, &err));
> +        g_assert_null(err);
> +        if (ch_state == SPICE_CHANNEL_STATE_READY) {
> +            hellos_expected = MIN(hellos_expected + 1, 1);
> +            ++messages_expected;
> +        } else {
> +            g_assert_cmpint(messages_sent, ==, messages_expected);
> +        }
> +    }
> +    g_assert_cmpint(hellos_sent, ==, hellos_expected);
> +    g_assert_cmpint(messages_sent, >=, messages_expected);
> +
> +    // try to get initial data
> +    if (ch_state == SPICE_CHANNEL_STATE_CONNECTING) {
> +        ch_state = SPICE_CHANNEL_STATE_READY;
> +        spice_usb_backend_channel_flush_writes(usb_ch);
> +        hellos_expected = MIN(hellos_expected + 1, 1);
> +        ++messages_expected;
> +    }
> +
> +    // we should get an hello (only one!)
> +    g_assert_cmpint(hellos_sent, ==, hellos_expected);
> +    g_assert_cmpint(messages_sent, >=, messages_expected);
> +
> +    // send hello reply
> +    if (loop == 0) {
> +        DATA_START
> +            0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //000 ....D.......
> +            0x71,0x65,0x6d,0x75,0x20,0x75,0x73,0x62,0x2d,0x72,0x65,0x64, //00c qemu usb-red
> +            0x69,0x72,0x20,0x67,0x75,0x65,0x73,0x74,0x20,0x33,0x2e,0x30, //018 ir guest 3.0
> +            0x2e,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //024 .1..........
> +            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //030 ............
> +            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //03c ............
> +            0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,                     //048 ........

I guess it was probably a direct dump from od or something, but maybe it
would be more readable replacing 0x71 with 'q' and so on?

> +        DATA_SEND;
> +    }
> +
> +    if (!attach_on_connect) {
> +        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device, &err));
> +        g_assert_null(err);
> +    }
> +    g_assert_cmpint(hellos_sent, ==, 1);
> +    g_assert_cmpint(messages_sent, >, 1);
> +
> +    spice_usb_backend_channel_detach(usb_ch);
> +}
> +
>  static void attach(const void *param)
>  {
>      const bool attach_on_connect = !!GPOINTER_TO_UINT(param);
> @@ -156,44 +217,30 @@ static void attach(const void *param)
>      g_assert_true(create_emulated_cd(be, &params, &err));
>      g_assert_null(err);
>      g_assert_nonnull(device);
> +    g_assert_false(device->edev_configured);
>
>      usb_ch = spice_usb_backend_channel_new(be, SPICE_USBREDIR_CHANNEL(ch));
>      g_assert_nonnull(usb_ch);
>
> -    // attach on connect
> -    ch_state = SPICE_CHANNEL_STATE_CONNECTING;
> -    if (attach_on_connect) {
> -        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device, &err));
> -        g_assert_null(err);
> +    for (int loop = 0; loop < 2; ++loop) {
> +        device_iteration(loop, attach_on_connect);
>      }
> -    g_assert_cmpint(hellos_sent, ==, 0);
> -    g_assert_cmpint(messages_sent, ==, 0);
>
> -    // try to get initial data
> -    ch_state = SPICE_CHANNEL_STATE_READY;
> -    spice_usb_backend_channel_flush_writes(usb_ch);
> +/*
>
> -    // we should get an hello (only one!)
> -    g_assert_cmpint(hellos_sent, ==, 1);
> -    g_assert_cmpint(messages_sent, ==, 1);
> +> to server/guest
> +< to client from server/guest
>
> -    // send hello reply
> -    DATA_START
> -        0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //000 ....D.......
> -        0x71,0x65,0x6d,0x75,0x20,0x75,0x73,0x62,0x2d,0x72,0x65,0x64, //00c qemu usb-red
> -        0x69,0x72,0x20,0x67,0x75,0x65,0x73,0x74,0x20,0x33,0x2e,0x30, //018 ir guest 3.0
> -        0x2e,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //024 .1..........
> -        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //030 ............
> -        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //03c ............
> -        0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,                     //048 ........
> -    DATA_SEND;
> +> usb_redir_interface_info,
> +> usb_redir_ep_info,
> +> usb_redir_device_connect
>
> -    if (!attach_on_connect) {
> -        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device, &err));
> -        g_assert_null(err);
> -    }
> -    g_assert_cmpint(hellos_sent, ==, 1);
> -    g_assert_cmpint(messages_sent, >, 1);
> +< usb_redir_reset
> +< usb_redir_control_packet
> +
> +> usb_redir_control_packet
> +
> +*/
>
>      // cleanup
>      spice_usb_backend_device_unref(device);


--
Cheers,
Christophe de Dinechin (IRC c3d)
> 
> 
> Frediano Ziglio writes:
> 
> > Make sure device can be detached and attached again.
> >
> > Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
> > ---
> >  tests/cd-emu.c | 105 +++++++++++++++++++++++++++++++++++--------------
> >  1 file changed, 76 insertions(+), 29 deletions(-)
> >
> > diff --git a/tests/cd-emu.c b/tests/cd-emu.c
> > index f0966662..8bc3a7ed 100644
> > --- a/tests/cd-emu.c
> > +++ b/tests/cd-emu.c
> > @@ -113,6 +113,67 @@ static void decrement_allocated(gpointer data
> > G_GNUC_UNUSED, GObject *old_gobjec
> >          spice_usb_backend_read_guest_data(usb_ch, (uint8_t*)data,
> >          G_N_ELEMENTS(data)); \
> >      } while(0)
> >
> > +static void
> > +device_iteration(const int loop, const bool attach_on_connect)
> > +{
> > +    GError *err = NULL;
> > +    unsigned int hellos_expected, messages_expected;
> > +
> > +printf("LOOP %d\n", loop);
> 
> Stray printf? Or if you want to keep it, indentation?
> 

debugging left, I'll remove it, thanks

> > +    hellos_expected = hellos_sent;
> > +    messages_expected = messages_sent;
> > +
> > +    if (ch_state == SPICE_CHANNEL_STATE_UNCONNECTED) {
> > +        ch_state = SPICE_CHANNEL_STATE_CONNECTING;
> > +    }
> > +    if (attach_on_connect) {
> > +        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device,
> > &err));
> > +        g_assert_null(err);
> > +        if (ch_state == SPICE_CHANNEL_STATE_READY) {
> > +            hellos_expected = MIN(hellos_expected + 1, 1);
> > +            ++messages_expected;
> > +        } else {
> > +            g_assert_cmpint(messages_sent, ==, messages_expected);
> > +        }
> > +    }
> > +    g_assert_cmpint(hellos_sent, ==, hellos_expected);
> > +    g_assert_cmpint(messages_sent, >=, messages_expected);
> > +
> > +    // try to get initial data
> > +    if (ch_state == SPICE_CHANNEL_STATE_CONNECTING) {
> > +        ch_state = SPICE_CHANNEL_STATE_READY;
> > +        spice_usb_backend_channel_flush_writes(usb_ch);
> > +        hellos_expected = MIN(hellos_expected + 1, 1);
> > +        ++messages_expected;
> > +    }
> > +
> > +    // we should get an hello (only one!)
> > +    g_assert_cmpint(hellos_sent, ==, hellos_expected);
> > +    g_assert_cmpint(messages_sent, >=, messages_expected);
> > +
> > +    // send hello reply
> > +    if (loop == 0) {
> > +        DATA_START
> > +            0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> > //000 ....D.......
> > +            0x71,0x65,0x6d,0x75,0x20,0x75,0x73,0x62,0x2d,0x72,0x65,0x64,
> > //00c qemu usb-red
> > +            0x69,0x72,0x20,0x67,0x75,0x65,0x73,0x74,0x20,0x33,0x2e,0x30,
> > //018 ir guest 3.0
> > +            0x2e,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> > //024 .1..........
> > +            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> > //030 ............
> > +            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
> > //03c ............
> > +            0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,
> > //048 ........
> 
> I guess it was probably a direct dump from od or something, but maybe it
> would be more readable replacing 0x71 with 'q' and so on?
> 

That's why I kept the "qemu usb-red" comment.

I had some instrumentation to generate it, the idea was to extent in the future
but for the current state I think is enough (well, better than noting surely).

> > +        DATA_SEND;
> > +    }
> > +
> > +    if (!attach_on_connect) {
> > +        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device,
> > &err));
> > +        g_assert_null(err);
> > +    }
> > +    g_assert_cmpint(hellos_sent, ==, 1);
> > +    g_assert_cmpint(messages_sent, >, 1);
> > +
> > +    spice_usb_backend_channel_detach(usb_ch);
> > +}
> > +
> >  static void attach(const void *param)
> >  {
> >      const bool attach_on_connect = !!GPOINTER_TO_UINT(param);
> > @@ -156,44 +217,30 @@ static void attach(const void *param)
> >      g_assert_true(create_emulated_cd(be, &params, &err));
> >      g_assert_null(err);
> >      g_assert_nonnull(device);
> > +    g_assert_false(device->edev_configured);
> >
> >      usb_ch = spice_usb_backend_channel_new(be,
> >      SPICE_USBREDIR_CHANNEL(ch));
> >      g_assert_nonnull(usb_ch);
> >
> > -    // attach on connect
> > -    ch_state = SPICE_CHANNEL_STATE_CONNECTING;
> > -    if (attach_on_connect) {
> > -        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device,
> > &err));
> > -        g_assert_null(err);
> > +    for (int loop = 0; loop < 2; ++loop) {
> > +        device_iteration(loop, attach_on_connect);
> >      }
> > -    g_assert_cmpint(hellos_sent, ==, 0);
> > -    g_assert_cmpint(messages_sent, ==, 0);
> >
> > -    // try to get initial data
> > -    ch_state = SPICE_CHANNEL_STATE_READY;
> > -    spice_usb_backend_channel_flush_writes(usb_ch);
> > +/*
> >
> > -    // we should get an hello (only one!)
> > -    g_assert_cmpint(hellos_sent, ==, 1);
> > -    g_assert_cmpint(messages_sent, ==, 1);
> > +> to server/guest
> > +< to client from server/guest
> >
> > -    // send hello reply
> > -    DATA_START
> > -        0x00,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //000
> > ....D.......
> > -        0x71,0x65,0x6d,0x75,0x20,0x75,0x73,0x62,0x2d,0x72,0x65,0x64, //00c
> > qemu usb-red
> > -        0x69,0x72,0x20,0x67,0x75,0x65,0x73,0x74,0x20,0x33,0x2e,0x30, //018
> > ir guest 3.0
> > -        0x2e,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //024
> > .1..........
> > -        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //030
> > ............
> > -        0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //03c
> > ............
> > -        0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,                     //048
> > ........
> > -    DATA_SEND;
> > +> usb_redir_interface_info,
> > +> usb_redir_ep_info,
> > +> usb_redir_device_connect
> >
> > -    if (!attach_on_connect) {
> > -        g_assert_true(spice_usb_backend_channel_attach(usb_ch, device,
> > &err));
> > -        g_assert_null(err);
> > -    }
> > -    g_assert_cmpint(hellos_sent, ==, 1);
> > -    g_assert_cmpint(messages_sent, >, 1);
> > +< usb_redir_reset
> > +< usb_redir_control_packet
> > +
> > +> usb_redir_control_packet
> > +
> > +*/
> >
> >      // cleanup
> >      spice_usb_backend_device_unref(device);
> 
> 
> --
> Cheers,
> Christophe de Dinechin (IRC c3d)