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

Victor Toso victortoso at redhat.com
Tue Aug 27 13:28:11 UTC 2019


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 at 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 ;)

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.

> +    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',
> -- 
> 2.20.1
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20190827/7345d94f/attachment.sig>


More information about the Spice-devel mailing list