[spice-gtk,v4,20/29] test-cd-emu: Add base test for cd-emulation

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

Details

Message ID 20190827092246.10276-21-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.
Just allocate and free to test for base leaks and reference
counting.

Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
---
 tests/cd-emu.c    | 92 +++++++++++++++++++++++++++++++++++++++++++++++
 tests/meson.build |  4 +++
 2 files changed, 96 insertions(+)
 create mode 100644 tests/cd-emu.c

Patch hide | download patch | download mbox

diff --git a/tests/cd-emu.c b/tests/cd-emu.c
new file mode 100644
index 00000000..7bf1fa3c
--- /dev/null
+++ b/tests/cd-emu.c
@@ -0,0 +1,92 @@ 
+/*
+   Copyright (C) 2019 Red Hat, Inc.
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+#include <gio/gio.h>
+
+#include "usb-device-cd.h"
+#include "usb-emulation.h"
+
+static SpiceUsbBackendDevice *device = NULL;
+
+/* simple usb manager hotplug callback emulation. */
+static void
+test_hotplug_callback(void *user_data, SpiceUsbBackendDevice *dev, gboolean added)
+{
+    // ignore not emulated devices
+    const UsbDeviceInformation *info = spice_usb_backend_device_get_info(dev);
+    if (info->bus != BUS_NUMBER_FOR_EMULATED_USB) {
+        return;
+    }
+
+    if (added) {
+        g_assert_null(device);
+        device = spice_usb_backend_device_ref(dev);
+    } else {
+        g_assert_nonnull(device);
+        g_assert(device == dev);
+        spice_usb_backend_device_unref(dev);
+        device = NULL;
+    }
+}
+
+static void multiple(const void *param)
+{
+    guint limit = GPOINTER_TO_UINT(param);
+    CdEmulationParams params = { "test-cd-emu.iso", 1 };
+    GError *err = NULL;
+    SpiceUsbBackend * be = spice_usb_backend_new(&err);
+    g_assert_nonnull(be);
+    g_assert_null(err);
+    spice_usb_backend_register_hotplug(be, NULL, test_hotplug_callback, &err);
+    g_assert_null(err);
+    for (int i = 0; i < limit; ++i) {
+        // allocate a CD emulation device
+        g_assert_true(create_emulated_cd(be, &params, &err));
+        g_assert_null(err);
+        g_assert_nonnull(device);
+
+        // emulate automatic CD ejection, this should release the
+        // object
+        spice_usb_backend_device_eject(be, device);
+        g_assert_null(device);
+    }
+    spice_usb_backend_deregister_hotplug(be);
+    spice_usb_backend_delete(be);
+}
+
+static void
+write_test_iso(void)
+{
+    uint8_t sector[2048];
+    FILE *f = fopen("test-cd-emu.iso", "wb");
+    g_assert_nonnull(f);
+    memset(sector, 0, sizeof(sector));
+    strcpy((char*) sector, "sector 0");
+    fwrite(sector, sizeof(sector), 1, f);
+    fclose(f);
+}
+
+int main(int argc, char* argv[])
+{
+    write_test_iso();
+
+    g_test_init(&argc, &argv, NULL);
+
+    g_test_add_data_func("/cd-emu/simple", GUINT_TO_POINTER(1), multiple);
+    g_test_add_data_func("/cd-emu/multiple", GUINT_TO_POINTER(128), multiple);
+
+    return g_test_run();
+}
diff --git a/tests/meson.build b/tests/meson.build
index 6c807762..39eac9c9 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -10,6 +10,10 @@  if spice_gtk_has_phodav
   tests_sources += 'pipe.c'
 endif
 
+if spice_gtk_has_usbredir
+  tests_sources += 'cd-emu.c'
+endif
+
 if spice_gtk_has_polkit
   tests_sources += [
     'usb-acl-helper.c',

Comments


> 
> Hi,
> 
> On Tue, Aug 27, 2019 at 10:22:37AM +0100, Frediano Ziglio wrote:
> > Just allocate and free to test for base leaks and reference
> > counting.
> > 
> > Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
> 
> Valgrind says ok here as well.
> 
> > ---
> >  tests/cd-emu.c    | 92 +++++++++++++++++++++++++++++++++++++++++++++++
> >  tests/meson.build |  4 +++
> >  2 files changed, 96 insertions(+)
> >  create mode 100644 tests/cd-emu.c
> > 
> > diff --git a/tests/cd-emu.c b/tests/cd-emu.c
> > new file mode 100644
> > index 00000000..7bf1fa3c
> > --- /dev/null
> > +++ b/tests/cd-emu.c
> > @@ -0,0 +1,92 @@
> > +/*
> > +   Copyright (C) 2019 Red Hat, Inc.
> > +
> > +   This library is free software; you can redistribute it and/or
> > +   modify it under the terms of the GNU Lesser General Public
> > +   License as published by the Free Software Foundation; either
> > +   version 2.1 of the License, or (at your option) any later version.
> > +
> > +   This library is distributed in the hope that it will be useful,
> > +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> > +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > +   Lesser General Public License for more details.
> > +
> > +   You should have received a copy of the GNU Lesser General Public
> > +   License along with this library; if not, see
> > <http://www.gnu.org/licenses/>.
> > +*/
> > +#include <gio/gio.h>
> > +
> > +#include "usb-device-cd.h"
> > +#include "usb-emulation.h"
> > +
> > +static SpiceUsbBackendDevice *device = NULL;
> > +
> > +/* simple usb manager hotplug callback emulation. */
> > +static void
> > +test_hotplug_callback(void *user_data, SpiceUsbBackendDevice *dev,
> > gboolean added)
> > +{
> > +    // ignore not emulated devices
> > +    const UsbDeviceInformation *info =
> > spice_usb_backend_device_get_info(dev);
> > +    if (info->bus != BUS_NUMBER_FOR_EMULATED_USB) {
> > +        return;
> > +    }
> > +
> > +    if (added) {
> > +        g_assert_null(device);
> > +        device = spice_usb_backend_device_ref(dev);
> > +    } else {
> > +        g_assert_nonnull(device);
> > +        g_assert(device == dev);
> > +        spice_usb_backend_device_unref(dev);
> > +        device = NULL;
> > +    }
> > +}
> > +
> > +static void multiple(const void *param)
> > +{
> > +    guint limit = GPOINTER_TO_UINT(param);
> > +    CdEmulationParams params = { "test-cd-emu.iso", 1 };
> > +    GError *err = NULL;
> > +    SpiceUsbBackend * be = spice_usb_backend_new(&err);
> > +    g_assert_nonnull(be);
> > +    g_assert_null(err);
> > +    spice_usb_backend_register_hotplug(be, NULL, test_hotplug_callback,
> > &err);
> > +    g_assert_null(err);
> > +    for (int i = 0; i < limit; ++i) {
> > +        // allocate a CD emulation device
> > +        g_assert_true(create_emulated_cd(be, &params, &err));
> > +        g_assert_null(err);
> > +        g_assert_nonnull(device);
> > +
> > +        // emulate automatic CD ejection, this should release the
> > +        // object
> > +        spice_usb_backend_device_eject(be, device);
> > +        g_assert_null(device);
> > +    }
> > +    spice_usb_backend_deregister_hotplug(be);
> > +    spice_usb_backend_delete(be);
> > +}
> > +
> > +static void
> > +write_test_iso(void)
> > +{
> > +    uint8_t sector[2048];
> > +    FILE *f = fopen("test-cd-emu.iso", "wb");
> > +    g_assert_nonnull(f);
> > +    memset(sector, 0, sizeof(sector));
> > +    strcpy((char*) sector, "sector 0");
> > +    fwrite(sector, sizeof(sector), 1, f);
> > +    fclose(f);
> > +}
> > +
> > +int main(int argc, char* argv[])
> > +{
> > +    write_test_iso();
> 
> We create the iso for testing but we don't remove it. There are a
> few things that comes to mind in regards to creating this file
> and removing it later that could be a problem. Ideally, we should
> have some sort of SPICE_CD_ROM_MOCKING in the source code that
> helps with unit test but honestly, i'm happy that we have a test
> and it works fine enough form now ;)
> 

I don't understand the SPICE_CD_ROM_MOCKING suggestion.
I would use:
1- atexit;
2- unlink after g_test_run (I would prefer this for this version);
3- file in repository and use the proper path with the help of meson
   (like in spice-server, this solution has possibly more advantages
   but is more complicated, IMHO too much for this version)

> Another way around this create but not removing is to use the
> g_test_add with _set_up() and _tear_down() functions. That's more
> verbose and slower than your approach but if I'm not mistaken,
> _tear_down() should be called even if test fails.
> 

but this would create the file for each single test, is only necessary
once.

> > +    g_test_init(&argc, &argv, NULL);
> > +
> > +    g_test_add_data_func("/cd-emu/simple", GUINT_TO_POINTER(1), multiple);
> > +    g_test_add_data_func("/cd-emu/multiple", GUINT_TO_POINTER(128),
> > multiple);
> > +
> > +    return g_test_run();
> > +}
> > diff --git a/tests/meson.build b/tests/meson.build
> > index 6c807762..39eac9c9 100644
> > --- a/tests/meson.build
> > +++ b/tests/meson.build
> > @@ -10,6 +10,10 @@ if spice_gtk_has_phodav
> >    tests_sources += 'pipe.c'
> >  endif
> >  
> > +if spice_gtk_has_usbredir
> > +  tests_sources += 'cd-emu.c'
> > +endif
> > +
> >  if spice_gtk_has_polkit
> >    tests_sources += [
> >      'usb-acl-helper.c',

Frediano