|
Packit Service |
ea0369 |
/*
|
|
Packit Service |
ea0369 |
* test-events.c: unit tests for libvirt/glib mainloop integration
|
|
Packit Service |
ea0369 |
*
|
|
Packit Service |
ea0369 |
* Copyright (C) 2014 Red Hat, Inc.
|
|
Packit Service |
ea0369 |
*
|
|
Packit Service |
ea0369 |
* This library is free software; you can redistribute it and/or
|
|
Packit Service |
ea0369 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit Service |
ea0369 |
* License as published by the Free Software Foundation; either
|
|
Packit Service |
ea0369 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit Service |
ea0369 |
*
|
|
Packit Service |
ea0369 |
* This library is distributed in the hope that it will be useful,
|
|
Packit Service |
ea0369 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
ea0369 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
ea0369 |
* Lesser General Public License for more details.
|
|
Packit Service |
ea0369 |
*
|
|
Packit Service |
ea0369 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
ea0369 |
* License along with this library. If not, see
|
|
Packit Service |
ea0369 |
* <http://www.gnu.org/licenses/>.
|
|
Packit Service |
ea0369 |
*
|
|
Packit Service |
ea0369 |
* Author: Christophe Fergeau <cfergeau@redhat.com>
|
|
Packit Service |
ea0369 |
*/
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
#include <config.h>
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
#include <libvirt-glib/libvirt-glib.h>
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
#include <libvirt/libvirt.h>
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
#include <errno.h>
|
|
Packit Service |
ea0369 |
#include <fcntl.h>
|
|
Packit Service |
ea0369 |
#include <unistd.h>
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
static GMainLoop *main_loop;
|
|
Packit Service |
ea0369 |
static int watch_fd;
|
|
Packit Service |
ea0369 |
static int watch_id;
|
|
Packit Service |
ea0369 |
static int timeout_id;
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
static void watch_destroyed(void *opaque)
|
|
Packit Service |
ea0369 |
{
|
|
Packit Service |
ea0369 |
gint *watch = opaque;
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
g_assert_cmpint(*watch, >=, 0);
|
|
Packit Service |
ea0369 |
g_assert_cmpint(*watch, ==, watch_id);
|
|
Packit Service |
ea0369 |
g_message("destroyed watch %d", *watch);
|
|
Packit Service |
ea0369 |
*watch = -1;
|
|
Packit Service |
ea0369 |
}
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
static gboolean check_destroyed(gpointer user_data)
|
|
Packit Service |
ea0369 |
{
|
|
Packit Service |
ea0369 |
gint *id = user_data;
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
g_assert_cmpint(*id, ==, -1);
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
ea0369 |
}
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
static void watch_cb(int watch, int fd, int events, void *opaque G_GNUC_UNUSED)
|
|
Packit Service |
ea0369 |
{
|
|
Packit Service |
ea0369 |
g_assert_cmpint(watch_id, !=, -1);
|
|
Packit Service |
ea0369 |
g_assert_cmpint(watch, ==, watch_id);
|
|
Packit Service |
ea0369 |
g_assert_cmpint(fd, ==, watch_fd);
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
g_message("got event(s) %x on fd %d (watch %d)", events, fd, watch);
|
|
Packit Service |
ea0369 |
}
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
static gboolean idle_quit_cb(gpointer user_data G_GNUC_UNUSED)
|
|
Packit Service |
ea0369 |
{
|
|
Packit Service |
ea0369 |
g_main_loop_quit(main_loop);
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
ea0369 |
}
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
static gboolean test_watch(gpointer user_data G_GNUC_UNUSED)
|
|
Packit Service |
ea0369 |
{
|
|
Packit Service |
ea0369 |
int removal_status;
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
watch_id = virEventAddHandle(watch_fd,
|
|
Packit Service |
ea0369 |
VIR_EVENT_HANDLE_READABLE | VIR_EVENT_HANDLE_WRITABLE,
|
|
Packit Service |
ea0369 |
watch_cb, &watch_id, watch_destroyed);
|
|
Packit Service |
ea0369 |
virEventUpdateHandle(watch_id, 0);
|
|
Packit Service |
ea0369 |
removal_status = virEventRemoveHandle(watch_id);
|
|
Packit Service |
ea0369 |
g_assert_cmpint(removal_status, ==, 0);
|
|
Packit Service |
ea0369 |
virEventUpdateHandle(watch_id, VIR_EVENT_HANDLE_READABLE);
|
|
Packit Service |
ea0369 |
removal_status = virEventRemoveHandle(watch_id);
|
|
Packit Service |
ea0369 |
g_assert_cmpint(removal_status, ==, -1);
|
|
Packit Service |
ea0369 |
g_idle_add_full(G_PRIORITY_LOW, check_destroyed, &watch_id, NULL);
|
|
Packit Service |
ea0369 |
g_idle_add_full(G_PRIORITY_LOW,
|
|
Packit Service |
ea0369 |
idle_quit_cb,
|
|
Packit Service |
ea0369 |
main_loop,
|
|
Packit Service |
ea0369 |
NULL);
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
ea0369 |
}
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
static void test_remove_disabled_watch(void)
|
|
Packit Service |
ea0369 |
{
|
|
Packit Service |
ea0369 |
main_loop = g_main_loop_new(NULL, FALSE);
|
|
Packit Service |
ea0369 |
watch_fd = open("/dev/null", O_RDONLY);
|
|
Packit Service |
ea0369 |
g_idle_add(test_watch, NULL);
|
|
Packit Service |
ea0369 |
g_main_loop_run(main_loop);
|
|
Packit Service |
ea0369 |
g_main_loop_unref(main_loop);
|
|
Packit Service |
ea0369 |
close(watch_fd);
|
|
Packit Service |
ea0369 |
watch_fd = -1;
|
|
Packit Service |
ea0369 |
g_assert_cmpint(watch_id, ==, -1);
|
|
Packit Service |
ea0369 |
}
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
static void timeout_destroyed(void *opaque)
|
|
Packit Service |
ea0369 |
{
|
|
Packit Service |
ea0369 |
gint *timeout = opaque;
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
g_assert_cmpint(*timeout, !=, -1);
|
|
Packit Service |
ea0369 |
g_assert_cmpint(*timeout, ==, timeout_id);
|
|
Packit Service |
ea0369 |
g_message("destroyed timeout %d", *timeout);
|
|
Packit Service |
ea0369 |
*timeout = -1;
|
|
Packit Service |
ea0369 |
}
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
static void timeout_cb(int timer, void *opaque G_GNUC_UNUSED)
|
|
Packit Service |
ea0369 |
{
|
|
Packit Service |
ea0369 |
g_assert_cmpint(timeout_id, !=, -1);
|
|
Packit Service |
ea0369 |
g_assert_cmpint(timer, ==, timeout_id);
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
g_message("timer %d fired", timer);
|
|
Packit Service |
ea0369 |
}
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
static gboolean test_timeout(gpointer user_data G_GNUC_UNUSED)
|
|
Packit Service |
ea0369 |
{
|
|
Packit Service |
ea0369 |
int removal_status;
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
timeout_id = virEventAddTimeout(10000, timeout_cb, &timeout_id, timeout_destroyed);
|
|
Packit Service |
ea0369 |
virEventUpdateTimeout(timeout_id, -1);
|
|
Packit Service |
ea0369 |
removal_status = virEventRemoveTimeout(timeout_id);
|
|
Packit Service |
ea0369 |
g_assert_cmpint(removal_status, ==, 0);
|
|
Packit Service |
ea0369 |
virEventUpdateTimeout(timeout_id, 20000);
|
|
Packit Service |
ea0369 |
removal_status = virEventRemoveTimeout(timeout_id);
|
|
Packit Service |
ea0369 |
g_assert_cmpint(removal_status, ==, -1);
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
g_idle_add_full(G_PRIORITY_LOW, check_destroyed, &timeout_id, NULL);
|
|
Packit Service |
ea0369 |
g_idle_add_full(G_PRIORITY_LOW,
|
|
Packit Service |
ea0369 |
(GSourceFunc)g_main_loop_quit,
|
|
Packit Service |
ea0369 |
main_loop,
|
|
Packit Service |
ea0369 |
NULL);
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
return G_SOURCE_REMOVE;
|
|
Packit Service |
ea0369 |
}
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
static void test_remove_disabled_timeout(void)
|
|
Packit Service |
ea0369 |
{
|
|
Packit Service |
ea0369 |
main_loop = g_main_loop_new(NULL, FALSE);
|
|
Packit Service |
ea0369 |
g_idle_add(test_timeout, NULL);
|
|
Packit Service |
ea0369 |
g_main_loop_run(main_loop);
|
|
Packit Service |
ea0369 |
g_main_loop_unref(main_loop);
|
|
Packit Service |
ea0369 |
g_assert_cmpint(timeout_id, ==, -1);
|
|
Packit Service |
ea0369 |
}
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
int main(int argc, char **argv)
|
|
Packit Service |
ea0369 |
{
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
gvir_init(&argc, &argv);
|
|
Packit Service |
ea0369 |
g_test_init(&argc, &argv, NULL);
|
|
Packit Service |
ea0369 |
gvir_event_register();
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
g_test_add_func("/libvirt-glib/remove-disabled-watch",
|
|
Packit Service |
ea0369 |
test_remove_disabled_watch);
|
|
Packit Service |
ea0369 |
g_test_add_func("/libvirt-glib/remove-disabled-timeout",
|
|
Packit Service |
ea0369 |
test_remove_disabled_timeout);
|
|
Packit Service |
ea0369 |
|
|
Packit Service |
ea0369 |
return g_test_run();
|
|
Packit Service |
ea0369 |
}
|