Added domain start/stop/define/undefine event unit tests
These unit tests are aiming at providing some help during the domain events refactoring.
This commit is contained in:
parent
81764660ae
commit
b775b48e94
1
.gitignore
vendored
1
.gitignore
vendored
@ -159,6 +159,7 @@
|
|||||||
/tests/networkxml2argvtest
|
/tests/networkxml2argvtest
|
||||||
/tests/nodeinfotest
|
/tests/nodeinfotest
|
||||||
/tests/nwfilterxml2xmltest
|
/tests/nwfilterxml2xmltest
|
||||||
|
/tests/objecteventtest
|
||||||
/tests/object-locking
|
/tests/object-locking
|
||||||
/tests/object-locking-files.txt
|
/tests/object-locking-files.txt
|
||||||
/tests/object-locking.cm[ix]
|
/tests/object-locking.cm[ix]
|
||||||
|
@ -303,6 +303,8 @@ EXTRA_DIST += \
|
|||||||
$(NULL)
|
$(NULL)
|
||||||
endif ! WITH_LIBVIRTD
|
endif ! WITH_LIBVIRTD
|
||||||
|
|
||||||
|
test_programs += objecteventtest
|
||||||
|
|
||||||
if WITH_SECDRIVER_APPARMOR
|
if WITH_SECDRIVER_APPARMOR
|
||||||
test_scripts += virt-aa-helper-test
|
test_scripts += virt-aa-helper-test
|
||||||
else ! WITH_SECDRIVER_APPARMOR
|
else ! WITH_SECDRIVER_APPARMOR
|
||||||
@ -895,6 +897,11 @@ fdstreamtest_SOURCES = \
|
|||||||
fdstreamtest.c testutils.h testutils.c
|
fdstreamtest.c testutils.h testutils.c
|
||||||
fdstreamtest_LDADD = $(LDADDS)
|
fdstreamtest_LDADD = $(LDADDS)
|
||||||
|
|
||||||
|
objecteventtest_SOURCES = \
|
||||||
|
objecteventtest.c \
|
||||||
|
testutils.c testutils.h
|
||||||
|
objecteventtest_LDADD = $(LDADDS)
|
||||||
|
|
||||||
if WITH_LINUX
|
if WITH_LINUX
|
||||||
fchosttest_SOURCES = \
|
fchosttest_SOURCES = \
|
||||||
fchosttest.c testutils.h testutils.c
|
fchosttest.c testutils.h testutils.c
|
||||||
|
251
tests/objecteventtest.c
Normal file
251
tests/objecteventtest.c
Normal file
@ -0,0 +1,251 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||||
|
*
|
||||||
|
* 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/>.
|
||||||
|
*
|
||||||
|
* Author: Cedric Bosdonnat <cbosdonnat@suse.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "testutils.h"
|
||||||
|
|
||||||
|
#include "virerror.h"
|
||||||
|
#include "virxml.h"
|
||||||
|
|
||||||
|
#define VIR_FROM_THIS VIR_FROM_NONE
|
||||||
|
|
||||||
|
|
||||||
|
static const char domainDef[] =
|
||||||
|
"<domain type='test'>"
|
||||||
|
" <name>test-domain</name>"
|
||||||
|
" <uuid>77a6fc12-07b5-9415-8abb-a803613f2a40</uuid>"
|
||||||
|
" <memory>8388608</memory>"
|
||||||
|
" <currentMemory>2097152</currentMemory>"
|
||||||
|
" <vcpu>2</vcpu>"
|
||||||
|
" <os>"
|
||||||
|
" <type>hvm</type>"
|
||||||
|
" </os>"
|
||||||
|
"</domain>";
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int startEvents;
|
||||||
|
int stopEvents;
|
||||||
|
int defineEvents;
|
||||||
|
int undefineEvents;
|
||||||
|
int unexpectedEvents;
|
||||||
|
} lifecycleEventCounter;
|
||||||
|
|
||||||
|
static void
|
||||||
|
lifecycleEventCounter_reset(lifecycleEventCounter *counter)
|
||||||
|
{
|
||||||
|
counter->startEvents = 0;
|
||||||
|
counter->stopEvents = 0;
|
||||||
|
counter->defineEvents = 0;
|
||||||
|
counter->undefineEvents = 0;
|
||||||
|
counter->unexpectedEvents = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
virConnectPtr conn;
|
||||||
|
} objecteventTest;
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
domainLifecycleCb(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||||
|
virDomainPtr dom ATTRIBUTE_UNUSED,
|
||||||
|
int event,
|
||||||
|
int detail ATTRIBUTE_UNUSED,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
lifecycleEventCounter *counter = opaque;
|
||||||
|
|
||||||
|
switch (event) {
|
||||||
|
case VIR_DOMAIN_EVENT_STARTED:
|
||||||
|
counter->startEvents++;
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_EVENT_STOPPED:
|
||||||
|
counter->stopEvents++;
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_EVENT_DEFINED:
|
||||||
|
counter->defineEvents++;
|
||||||
|
break;
|
||||||
|
case VIR_DOMAIN_EVENT_UNDEFINED:
|
||||||
|
counter->undefineEvents++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Ignore other events */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
testDomainCreateXML(const void *data)
|
||||||
|
{
|
||||||
|
const objecteventTest *test = data;
|
||||||
|
lifecycleEventCounter counter;
|
||||||
|
int eventId = VIR_DOMAIN_EVENT_ID_LIFECYCLE;
|
||||||
|
virDomainPtr dom;
|
||||||
|
int id;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
lifecycleEventCounter_reset(&counter);
|
||||||
|
|
||||||
|
id = virConnectDomainEventRegisterAny(test->conn, NULL, eventId,
|
||||||
|
VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
|
||||||
|
&counter, NULL);
|
||||||
|
dom = virDomainCreateXML(test->conn, domainDef, 0);
|
||||||
|
|
||||||
|
if (dom == NULL || virEventRunDefaultImpl() < 0) {
|
||||||
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (counter.startEvents != 1 || counter.unexpectedEvents > 0) {
|
||||||
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virConnectDomainEventDeregisterAny(test->conn, id);
|
||||||
|
if (dom != NULL) {
|
||||||
|
virDomainDestroy(dom);
|
||||||
|
virDomainFree(dom);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
testDomainDefine(const void *data)
|
||||||
|
{
|
||||||
|
const objecteventTest *test = data;
|
||||||
|
lifecycleEventCounter counter;
|
||||||
|
int eventId = VIR_DOMAIN_EVENT_ID_LIFECYCLE;
|
||||||
|
virDomainPtr dom;
|
||||||
|
int id;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
lifecycleEventCounter_reset(&counter);
|
||||||
|
|
||||||
|
id = virConnectDomainEventRegisterAny(test->conn, NULL, eventId,
|
||||||
|
VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
|
||||||
|
&counter, NULL);
|
||||||
|
|
||||||
|
/* Make sure the define event is triggered */
|
||||||
|
dom = virDomainDefineXML(test->conn, domainDef);
|
||||||
|
|
||||||
|
if (dom == NULL || virEventRunDefaultImpl() < 0) {
|
||||||
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (counter.defineEvents != 1 || counter.unexpectedEvents > 0) {
|
||||||
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure the undefine event is triggered */
|
||||||
|
virDomainUndefine(dom);
|
||||||
|
|
||||||
|
if (virEventRunDefaultImpl() < 0) {
|
||||||
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (counter.undefineEvents != 1 || counter.unexpectedEvents > 0) {
|
||||||
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virConnectDomainEventDeregisterAny(test->conn, id);
|
||||||
|
if (dom != NULL)
|
||||||
|
virDomainFree(dom);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
testDomainStartStopEvent(const void *data)
|
||||||
|
{
|
||||||
|
const objecteventTest *test = data;
|
||||||
|
lifecycleEventCounter counter;
|
||||||
|
int eventId = VIR_DOMAIN_EVENT_ID_LIFECYCLE;
|
||||||
|
int id;
|
||||||
|
int ret = 0;
|
||||||
|
virDomainPtr dom;
|
||||||
|
|
||||||
|
lifecycleEventCounter_reset(&counter);
|
||||||
|
|
||||||
|
dom = virDomainLookupByName(test->conn, "test");
|
||||||
|
if (dom == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
id = virConnectDomainEventRegisterAny(test->conn, dom, eventId,
|
||||||
|
VIR_DOMAIN_EVENT_CALLBACK(&domainLifecycleCb),
|
||||||
|
&counter, NULL);
|
||||||
|
|
||||||
|
/* Test domain is started */
|
||||||
|
virDomainDestroy(dom);
|
||||||
|
virDomainCreate(dom);
|
||||||
|
|
||||||
|
if (virEventRunDefaultImpl() < 0) {
|
||||||
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (counter.startEvents != 1 || counter.stopEvents != 1 ||
|
||||||
|
counter.unexpectedEvents > 0) {
|
||||||
|
ret = -1;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virConnectDomainEventDeregisterAny(test->conn, id);
|
||||||
|
virDomainFree(dom);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
mymain(void)
|
||||||
|
{
|
||||||
|
objecteventTest test;
|
||||||
|
int ret = EXIT_SUCCESS;
|
||||||
|
|
||||||
|
virEventRegisterDefaultImpl();
|
||||||
|
|
||||||
|
if (!(test.conn = virConnectOpen("test:///default")))
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
|
virtTestQuiesceLibvirtErrors(false);
|
||||||
|
|
||||||
|
/* Domain event tests */
|
||||||
|
if (virtTestRun("Domain createXML start event ", testDomainCreateXML, &test) < 0)
|
||||||
|
ret = EXIT_FAILURE;
|
||||||
|
if (virtTestRun("Domain (un)define events", testDomainDefine, &test) < 0)
|
||||||
|
ret = EXIT_FAILURE;
|
||||||
|
if (virtTestRun("Domain start stop events", testDomainStartStopEvent, &test) < 0)
|
||||||
|
ret = EXIT_FAILURE;
|
||||||
|
|
||||||
|
virConnectClose(test.conn);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIRT_TEST_MAIN(mymain)
|
Loading…
x
Reference in New Issue
Block a user