mirror of
https://github.com/libvirt/libvirt.git
synced 2026-10-02 12:20:06 -05:00
event: make deregister return value match docs
Ever since their introduction (commit1509b80in v0.5.0 for virConnectDomainEventRegister, commit4445723in v0.8.0 for virConnectDomainEventDeregisterAny), the event deregistration functions have been documented as returning 0 on success; likewise for older registration (only the newer RegisterAny must return a non-zero callbackID). And now that we are adding virConnectNetworkEventDeregisterAny for v1.2.1, it should have the same semantics. Fortunately, all of the stateful drivers have been obeying the docs and returning 0, thanks to the way the remote_driver tracks things (in fact, the RPC wire protocol is unable to send a return value for DomainEventRegisterAny, at least not without adding a new RPC number). Well, except for vbox, which was always failing deregistration, due to failure to set the return value to anything besides its initial -1. But for local drivers, such as test:///default, we've been returning non-zero numbers; worse, the non-zero numbers have differed over time. For example, in Fedora 12 (libvirt 0.8.2), calling Register twice would return 0 and 1 [the callbackID generated under the hood]; while in Fedora 20 (libvirt 1.1.3), it returns 1 and 2 [the number of callbacks registered for that event type]. Since we have changed the behavior over time, and since it differs by local vs. remote, we can safely argue that no one could have been reasonably relying on any particular behavior, so we might as well obey the docs, as well as prepare callers that might deal with older clients to not be surprised if the docs are not strictly followed. For consistency, this patch fixes the code for all drivers, even though it only makes an impact for vbox and for local drivers. By fixing all drivers, future copy and paste from a remote driver to a local driver is less likely to reintroduce the bug. Finally, update the testsuite to gain some coverage of the issue for local drivers, including the first test of old-style domain event registration via function pointer instead of event id. * src/libvirt.c (virConnectDomainEventRegister) (virConnectDomainEventDeregister) (virConnectDomainEventDeregisterAny): Clarify docs. * src/libxl/libxl_driver.c (libxlConnectDomainEventRegister) (libxlConnectDomainEventDeregister) (libxlConnectDomainEventDeregisterAny): Match documentation. * src/lxc/lxc_driver.c (lxcConnectDomainEventRegister) (lxcConnectDomainEventDeregister) (lxcConnectDomainEventDeregisterAny): Likewise. * src/test/test_driver.c (testConnectDomainEventRegister) (testConnectDomainEventDeregister) (testConnectDomainEventDeregisterAny) (testConnectNetworkEventDeregisterAny): Likewise. * src/uml/uml_driver.c (umlConnectDomainEventRegister) (umlConnectDomainEventDeregister) (umlConnectDomainEventDeregisterAny): Likewise. * src/vbox/vbox_tmpl.c (vboxConnectDomainEventRegister) (vboxConnectDomainEventDeregister) (vboxConnectDomainEventDeregisterAny): Likewise. * src/xen/xen_driver.c (xenUnifiedConnectDomainEventRegister) (xenUnifiedConnectDomainEventDeregister) (xenUnifiedConnectDomainEventDeregisterAny): Likewise. * src/network/bridge_driver.c (networkConnectNetworkEventDeregisterAny): Likewise. * tests/objecteventtest.c (testDomainCreateXMLOld): New test. (mymain): Run it. (testDomainCreateXML): Check return values. Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
1 parent
088ff08ce9
commit
31b5bad9ff
9 files changed
+185
-105
No files matched your search
+61
-12
@@ -1,4 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Red Hat, Inc.
|
||||
* Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -125,36 +126,80 @@ networkLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
testDomainCreateXMLOld(const void *data)
|
||||
{
|
||||
const objecteventTest *test = data;
|
||||
lifecycleEventCounter counter;
|
||||
virDomainPtr dom = NULL;
|
||||
int ret = -1;
|
||||
bool registered = false;
|
||||
|
||||
lifecycleEventCounter_reset(&counter);
|
||||
|
||||
if (virConnectDomainEventRegister(test->conn,
|
||||
domainLifecycleCb,
|
||||
&counter, NULL) != 0)
|
||||
goto cleanup;
|
||||
registered = true;
|
||||
dom = virDomainCreateXML(test->conn, domainDef, 0);
|
||||
|
||||
if (dom == NULL || virEventRunDefaultImpl() < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (counter.startEvents != 1 || counter.unexpectedEvents > 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virConnectDomainEventDeregister(test->conn, domainLifecycleCb) != 0)
|
||||
goto cleanup;
|
||||
registered = false;
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
if (registered)
|
||||
virConnectDomainEventDeregister(test->conn, domainLifecycleCb);
|
||||
if (dom) {
|
||||
virDomainDestroy(dom);
|
||||
virDomainFree(dom);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
testDomainCreateXML(const void *data)
|
||||
{
|
||||
const objecteventTest *test = data;
|
||||
lifecycleEventCounter counter;
|
||||
int eventId = VIR_DOMAIN_EVENT_ID_LIFECYCLE;
|
||||
virDomainPtr dom;
|
||||
virDomainPtr dom = NULL;
|
||||
int id;
|
||||
int ret = 0;
|
||||
int ret = -1;
|
||||
|
||||
lifecycleEventCounter_reset(&counter);
|
||||
|
||||
id = virConnectDomainEventRegisterAny(test->conn, NULL, eventId,
|
||||
VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
|
||||
&counter, NULL);
|
||||
if (id < 0)
|
||||
goto cleanup;
|
||||
dom = virDomainCreateXML(test->conn, domainDef, 0);
|
||||
|
||||
if (dom == NULL || virEventRunDefaultImpl() < 0) {
|
||||
ret = -1;
|
||||
if (dom == NULL || virEventRunDefaultImpl() < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (counter.startEvents != 1 || counter.unexpectedEvents > 0) {
|
||||
ret = -1;
|
||||
if (counter.startEvents != 1 || counter.unexpectedEvents > 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virConnectDomainEventDeregisterAny(test->conn, id) != 0)
|
||||
goto cleanup;
|
||||
id = -1;
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virConnectDomainEventDeregisterAny(test->conn, id);
|
||||
if (dom != NULL) {
|
||||
if (id >= 0)
|
||||
virConnectDomainEventDeregisterAny(test->conn, id);
|
||||
if (dom) {
|
||||
virDomainDestroy(dom);
|
||||
virDomainFree(dom);
|
||||
}
|
||||
@@ -168,7 +213,7 @@ testDomainDefine(const void *data)
|
||||
const objecteventTest *test = data;
|
||||
lifecycleEventCounter counter;
|
||||
int eventId = VIR_DOMAIN_EVENT_ID_LIFECYCLE;
|
||||
virDomainPtr dom;
|
||||
virDomainPtr dom = NULL;
|
||||
int id;
|
||||
int ret = 0;
|
||||
|
||||
@@ -388,7 +433,11 @@ mymain(void)
|
||||
virtTestQuiesceLibvirtErrors(false);
|
||||
|
||||
/* Domain event tests */
|
||||
if (virtTestRun("Domain createXML start event ", testDomainCreateXML, &test) < 0)
|
||||
if (virtTestRun("Domain createXML start event (old API)",
|
||||
testDomainCreateXMLOld, &test) < 0)
|
||||
ret = EXIT_FAILURE;
|
||||
if (virtTestRun("Domain createXML start event (new API)",
|
||||
testDomainCreateXML, &test) < 0)
|
||||
ret = EXIT_FAILURE;
|
||||
if (virtTestRun("Domain (un)define events", testDomainDefine, &test) < 0)
|
||||
ret = EXIT_FAILURE;
|
||||
|
||||
Reference in new issue
Block a user