2009-05-21 18:22:51 +04:00
# include <config.h>
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <string.h>
# include <sys/types.h>
# include <fcntl.h>
2013-04-16 17:41:44 +04:00
# include "testutils.h"
2009-05-21 18:22:51 +04:00
# ifdef WITH_QEMU
2010-03-09 21:22:22 +03:00
# include "internal.h"
2010-12-17 19:41:51 +03:00
# include "qemu / qemu_command.h"
2010-03-09 21:22:22 +03:00
# include "testutilsqemu.h"
2013-04-03 14:36:23 +04:00
# include "virstring.h"
2009-05-21 18:22:51 +04:00
2013-06-07 19:10:28 +04:00
# define VIR_FROM_THIS VIR_FROM_NONE
2012-11-28 20:43:10 +04:00
static virQEMUDriver driver ;
2009-05-21 18:22:51 +04:00
static int blankProblemElements ( char * data )
{
if ( virtTestClearLineRegex ( " <name>[[:alnum:]]+</name> " , data ) < 0 | |
virtTestClearLineRegex ( " <uuid>([[:alnum:]]|-)+</uuid> " , data ) < 0 | |
2012-02-23 04:48:38 +04:00
virtTestClearLineRegex ( " <memory.*>[[:digit:]]+</memory> " , data ) < 0 | |
virtTestClearLineRegex ( " <currentMemory.*>[[:digit:]]+</currentMemory> " ,
data ) < 0 | |
2009-05-21 18:22:51 +04:00
virtTestClearLineRegex ( " <readonly/> " , data ) < 0 | |
virtTestClearLineRegex ( " <sharable/> " , data ) < 0 )
return - 1 ;
return 0 ;
}
static int testCompareXMLToArgvFiles ( const char * xml ,
tests: silence qemuargv2xmltest noise
Before this patch, the testsuite was noisy:
TEST: qemuargv2xmltest
........................................ 40
................20:41:28.046: warning : qemuParseCommandLine:6565 : unknown QEMU argument '-unknown', adding to the qemu namespace
20:41:28.046: warning : qemuParseCommandLine:6565 : unknown QEMU argument 'parameter', adding to the qemu namespace
. 57 OK
PASS: qemuargv2xmltest
It's not a real failure (which is why the test was completing
successfully), so much as an intentional warning to the user that use
of the qemu namespace has the potential for undefined effects that
leaked through the default logging behavior. After this patch series,
all tests can access any logged data, and this particular test can
explicitly check for the presence or absence of the warning, such that
the test output becomes:
TEST: qemuargv2xmltest
........................................ 40
................. 57 OK
PASS: qemuargv2xmltest
* tests/testutils.h (virtTestLogContentAndReset): New prototype.
* tests/testutils.c (struct virtTestLogData): New struct.
(virtTestLogOutput, virtTestLogClose, virtTestLogContentAndReset):
New functions.
(virtTestMain): Always capture log data emitted during tests.
* tests/qemuargv2xmltest.c (testCompareXMLToArgvHelper, mymain):
Use flag to mark which tests expect noisy stderr.
(testCompareXMLToArgvFiles): Add parameter to test whether stderr
was appropriately silent.
2010-09-10 20:25:49 +04:00
const char * cmdfile ,
bool expect_warning ) {
2011-04-25 02:25:10 +04:00
char * expectxml = NULL ;
2009-05-21 18:22:51 +04:00
char * actualxml = NULL ;
2011-04-25 02:25:10 +04:00
char * cmd = NULL ;
2009-05-21 18:22:51 +04:00
int ret = - 1 ;
virDomainDefPtr vmdef = NULL ;
2011-04-25 02:25:10 +04:00
if ( virtTestLoadFile ( cmdfile , & cmd ) < 0 )
2009-05-21 18:22:51 +04:00
goto fail ;
2011-04-25 02:25:10 +04:00
if ( virtTestLoadFile ( xml , & expectxml ) < 0 )
2009-05-21 18:22:51 +04:00
goto fail ;
2013-03-31 22:03:42 +04:00
if ( ! ( vmdef = qemuParseCommandLineString ( driver . caps , driver . xmlopt ,
2013-03-05 19:17:24 +04:00
cmd , NULL , NULL , NULL ) ) )
2009-05-21 18:22:51 +04:00
goto fail ;
Introduce new OOM testing support
The previous OOM testing support would re-run the entire "main"
method each iteration, failing a different malloc each time.
When a test suite has 'n' allocations, the number of repeats
requires is (n * (n + 1) ) / 2. This gets very large, very
quickly.
This new OOM testing support instead integrates at the
virtTestRun level, so each individual test case gets repeated,
instead of the entire test suite. This means the values of
'n' are orders of magnitude smaller.
The simple usage is
$ VIR_TEST_OOM=1 ./qemuxml2argvtest
...
29) QEMU XML-2-ARGV clock-utc ... OK
Test OOM for nalloc=36 .................................... OK
30) QEMU XML-2-ARGV clock-localtime ... OK
Test OOM for nalloc=36 .................................... OK
31) QEMU XML-2-ARGV clock-france ... OK
Test OOM for nalloc=38 ...................................... OK
...
the second lines reports how many mallocs have to be failed, and thus
how many repeats of the test will be run.
If it crashes, then running under valgrind will often show the problem
$ VIR_TEST_OOM=1 ../run valgrind ./qemuxml2argvtest
When debugging problems it is also helpful to select an individual
test case
$ VIR_TEST_RANGE=30 VIR_TEST_OOM=1 ../run valgrind ./qemuxml2argvtest
When things get really tricky, it is possible to request that just
specific allocs are failed. eg to fail allocs 5 -> 12, use
$ VIR_TEST_RANGE=30 VIR_TEST_OOM=1:5-12 ../run valgrind ./qemuxml2argvtest
In the worse case, you might want to know the stack trace of the
alloc which was failed then VIR_TEST_OOM_TRACE can be set. If it
is set to 1 then it will only print if it thinks a mistake happened.
This is often not reliable, so setting it to 2 will make it print
the stack trace for every alloc that is failed.
$ VIR_TEST_OOM_TRACE=2 VIR_TEST_RANGE=30 VIR_TEST_OOM=1:5-5 ../run valgrind ./qemuxml2argvtest
30) QEMU XML-2-ARGV clock-localtime ... OK
Test OOM for nalloc=36 !virAllocN
/home/berrange/src/virt/libvirt/src/util/viralloc.c:180
virHashCreateFull
/home/berrange/src/virt/libvirt/src/util/virhash.c:144
virDomainDefParseXML
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:11745
virDomainDefParseNode
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12646
virDomainDefParse
/home/berrange/src/virt/libvirt/src/conf/domain_conf.c:12590
testCompareXMLToArgvFiles
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:106
virtTestRun
/home/berrange/src/virt/libvirt/tests/testutils.c:250
mymain
/home/berrange/src/virt/libvirt/tests/qemuxml2argvtest.c:418 (discriminator 2)
virtTestMain
/home/berrange/src/virt/libvirt/tests/testutils.c:750
??
??:0
_start
??:?
FAILED
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-09-23 17:21:52 +04:00
if ( ! virtTestOOMActive ( ) ) {
char * log ;
if ( ( log = virtTestLogContentAndReset ( ) ) = = NULL )
goto fail ;
if ( ( * log ! = ' \0 ' ) ! = expect_warning ) {
VIR_FREE ( log ) ;
goto fail ;
}
2012-02-03 03:16:43 +04:00
VIR_FREE ( log ) ;
tests: silence qemuargv2xmltest noise
Before this patch, the testsuite was noisy:
TEST: qemuargv2xmltest
........................................ 40
................20:41:28.046: warning : qemuParseCommandLine:6565 : unknown QEMU argument '-unknown', adding to the qemu namespace
20:41:28.046: warning : qemuParseCommandLine:6565 : unknown QEMU argument 'parameter', adding to the qemu namespace
. 57 OK
PASS: qemuargv2xmltest
It's not a real failure (which is why the test was completing
successfully), so much as an intentional warning to the user that use
of the qemu namespace has the potential for undefined effects that
leaked through the default logging behavior. After this patch series,
all tests can access any logged data, and this particular test can
explicitly check for the presence or absence of the warning, such that
the test output becomes:
TEST: qemuargv2xmltest
........................................ 40
................. 57 OK
PASS: qemuargv2xmltest
* tests/testutils.h (virtTestLogContentAndReset): New prototype.
* tests/testutils.c (struct virtTestLogData): New struct.
(virtTestLogOutput, virtTestLogClose, virtTestLogContentAndReset):
New functions.
(virtTestMain): Always capture log data emitted during tests.
* tests/qemuargv2xmltest.c (testCompareXMLToArgvHelper, mymain):
Use flag to mark which tests expect noisy stderr.
(testCompareXMLToArgvFiles): Add parameter to test whether stderr
was appropriately silent.
2010-09-10 20:25:49 +04:00
}
2014-01-10 21:18:03 +04:00
if ( ! virDomainDefCheckABIStability ( vmdef , vmdef ) ) {
fprintf ( stderr , " ABI stability check failed on %s " , xml ) ;
goto fail ;
}
2010-02-09 21:58:01 +03:00
if ( ! ( actualxml = virDomainDefFormat ( vmdef , 0 ) ) )
2009-05-21 18:22:51 +04:00
goto fail ;
if ( blankProblemElements ( expectxml ) < 0 | |
blankProblemElements ( actualxml ) < 0 )
goto fail ;
if ( STRNEQ ( expectxml , actualxml ) ) {
virtTestDifference ( stderr , expectxml , actualxml ) ;
goto fail ;
}
ret = 0 ;
fail :
2012-02-03 03:16:43 +04:00
VIR_FREE ( expectxml ) ;
VIR_FREE ( actualxml ) ;
VIR_FREE ( cmd ) ;
2009-05-21 18:22:51 +04:00
virDomainDefFree ( vmdef ) ;
return ret ;
}
struct testInfo {
const char * name ;
2010-02-09 16:06:56 +03:00
unsigned long long extraFlags ;
2009-05-21 18:22:51 +04:00
const char * migrateFrom ;
} ;
2011-04-25 02:25:10 +04:00
static int
testCompareXMLToArgvHelper ( const void * data )
{
int result = - 1 ;
2009-05-21 18:22:51 +04:00
const struct testInfo * info = data ;
2011-04-25 02:25:10 +04:00
char * xml = NULL ;
char * args = NULL ;
if ( virAsprintf ( & xml , " %s/qemuxml2argvdata/qemuxml2argv-%s.xml " ,
abs_srcdir , info - > name ) < 0 | |
virAsprintf ( & args , " %s/qemuxml2argvdata/qemuxml2argv-%s.args " ,
abs_srcdir , info - > name ) < 0 )
goto cleanup ;
result = testCompareXMLToArgvFiles ( xml , args , ! ! info - > extraFlags ) ;
cleanup :
2012-02-03 03:16:43 +04:00
VIR_FREE ( xml ) ;
VIR_FREE ( args ) ;
2011-04-25 02:25:10 +04:00
return result ;
2009-05-21 18:22:51 +04:00
}
static int
2011-04-29 20:21:20 +04:00
mymain ( void )
2009-05-21 18:22:51 +04:00
{
int ret = 0 ;
2013-01-11 01:03:14 +04:00
driver . config = virQEMUDriverConfigNew ( false ) ;
2009-05-21 18:22:51 +04:00
if ( ( driver . caps = testQemuCapsInit ( ) ) = = NULL )
return EXIT_FAILURE ;
2013-03-11 13:24:29 +04:00
if ( ! ( driver . xmlopt = virQEMUDriverCreateXMLConf ( & driver ) ) )
2013-03-05 19:17:24 +04:00
return EXIT_FAILURE ;
2013-09-20 22:13:35 +04:00
# define DO_TEST_FULL(name, extraFlags, migrateFrom) \
2009-05-21 18:22:51 +04:00
do { \
const struct testInfo info = { name , extraFlags , migrateFrom } ; \
if ( virtTestRun ( " QEMU ARGV-2-XML " name , \
2013-09-20 22:13:35 +04:00
testCompareXMLToArgvHelper , & info ) < 0 ) \
2009-05-21 18:22:51 +04:00
ret = - 1 ; \
} while ( 0 )
2010-09-10 06:32:50 +04:00
# define DO_TEST(name) \
DO_TEST_FULL ( name , 0 , NULL )
2009-05-21 18:22:51 +04:00
setenv ( " PATH " , " /bin " , 1 ) ;
setenv ( " USER " , " test " , 1 ) ;
setenv ( " LOGNAME " , " test " , 1 ) ;
setenv ( " HOME " , " /home/test " , 1 ) ;
unsetenv ( " TMPDIR " ) ;
unsetenv ( " LD_PRELOAD " ) ;
unsetenv ( " LD_LIBRARY_PATH " ) ;
/* Can't roundtrip vcpu cpuset attribute */
2011-02-07 17:54:08 +03:00
/*DO_TEST("minimal", QEMU_CAPS_NAME);*/
2012-08-15 12:16:36 +04:00
DO_TEST ( " machine-core-on " ) ;
DO_TEST ( " machine-core-off " ) ;
2010-09-10 06:32:50 +04:00
DO_TEST ( " boot-cdrom " ) ;
DO_TEST ( " boot-network " ) ;
DO_TEST ( " boot-floppy " ) ;
2012-01-27 17:49:52 +04:00
DO_TEST ( " kvmclock " ) ;
/* This needs <emulator>./qemu.sh</emulator> which doesn't work here. */
/*DO_TEST("cpu-kvmclock");*/
2009-05-21 18:22:51 +04:00
/* Can't roundtrip xenner arch */
2010-09-10 06:32:50 +04:00
/*DO_TEST("bootloader");*/
2012-09-18 14:32:07 +04:00
DO_TEST ( " reboot-timeout-enabled " ) ;
DO_TEST ( " reboot-timeout-disabled " ) ;
2010-09-10 06:32:50 +04:00
DO_TEST ( " clock-utc " ) ;
DO_TEST ( " clock-localtime " ) ;
DO_TEST ( " disk-cdrom " ) ;
DO_TEST ( " disk-cdrom-empty " ) ;
DO_TEST ( " disk-floppy " ) ;
DO_TEST ( " disk-many " ) ;
DO_TEST ( " disk-virtio " ) ;
DO_TEST ( " disk-xenvbd " ) ;
DO_TEST ( " disk-drive-boot-disk " ) ;
DO_TEST ( " disk-drive-boot-cdrom " ) ;
DO_TEST ( " disk-drive-fmt-qcow " ) ;
2009-05-21 18:22:51 +04:00
/* Can't roundtrip shareable+cache mode option */
2010-09-10 06:32:50 +04:00
/*DO_TEST("disk-drive-shared");*/
2009-05-21 18:22:51 +04:00
/* Can't roundtrip v1 writethrough option */
2010-09-10 06:32:50 +04:00
/*DO_TEST("disk-drive-cache-v1-wt");*/
DO_TEST ( " disk-drive-cache-v1-wb " ) ;
DO_TEST ( " disk-drive-cache-v1-none " ) ;
DO_TEST ( " disk-drive-error-policy-stop " ) ;
DO_TEST ( " disk-drive-error-policy-enospace " ) ;
2011-10-04 22:17:06 +04:00
DO_TEST ( " disk-drive-error-policy-wreport-rignore " ) ;
2010-09-10 06:32:50 +04:00
DO_TEST ( " disk-drive-cache-v2-wt " ) ;
DO_TEST ( " disk-drive-cache-v2-wb " ) ;
DO_TEST ( " disk-drive-cache-v2-none " ) ;
2011-09-02 17:36:58 +04:00
DO_TEST ( " disk-drive-cache-directsync " ) ;
2011-09-22 23:33:47 +04:00
DO_TEST ( " disk-drive-cache-unsafe " ) ;
2010-12-07 22:57:33 +03:00
DO_TEST ( " disk-drive-network-nbd " ) ;
2013-02-25 21:44:23 +04:00
DO_TEST ( " disk-drive-network-nbd-export " ) ;
2013-02-25 21:44:25 +04:00
DO_TEST ( " disk-drive-network-nbd-ipv6 " ) ;
DO_TEST ( " disk-drive-network-nbd-ipv6-export " ) ;
2013-02-25 21:44:24 +04:00
DO_TEST ( " disk-drive-network-nbd-unix " ) ;
2013-03-21 15:53:49 +04:00
DO_TEST ( " disk-drive-network-iscsi " ) ;
2012-11-22 22:10:41 +04:00
DO_TEST ( " disk-drive-network-gluster " ) ;
2010-12-07 22:57:33 +03:00
DO_TEST ( " disk-drive-network-rbd " ) ;
2013-01-25 06:45:31 +04:00
DO_TEST ( " disk-drive-network-rbd-ipv6 " ) ;
2011-11-01 05:29:07 +04:00
/* older format using CEPH_ARGS env var */
DO_TEST ( " disk-drive-network-rbd-ceph-env " ) ;
2010-12-07 22:57:33 +03:00
DO_TEST ( " disk-drive-network-sheepdog " ) ;
2010-09-10 06:32:50 +04:00
DO_TEST ( " disk-usb " ) ;
DO_TEST ( " graphics-vnc " ) ;
2011-01-08 00:03:07 +03:00
DO_TEST ( " graphics-vnc-socket " ) ;
2013-04-30 18:26:43 +04:00
DO_TEST ( " graphics-vnc-websocket " ) ;
2013-05-21 18:31:49 +04:00
DO_TEST ( " graphics-vnc-policy " ) ;
2009-05-21 18:22:51 +04:00
2010-09-10 06:32:50 +04:00
DO_TEST ( " graphics-vnc-sasl " ) ;
DO_TEST ( " graphics-vnc-tls " ) ;
2009-05-21 18:22:51 +04:00
2010-09-10 06:32:50 +04:00
DO_TEST ( " graphics-sdl " ) ;
DO_TEST ( " graphics-sdl-fullscreen " ) ;
DO_TEST ( " nographics-vga " ) ;
DO_TEST ( " input-usbmouse " ) ;
DO_TEST ( " input-usbtablet " ) ;
2009-05-21 18:22:51 +04:00
/* Can't rountrip xenner arch */
2010-09-10 06:32:50 +04:00
/*DO_TEST("input-xen");*/
DO_TEST ( " misc-acpi " ) ;
2012-08-02 14:18:16 +04:00
DO_TEST ( " misc-disable-s3 " ) ;
DO_TEST ( " misc-disable-suspends " ) ;
DO_TEST ( " misc-enable-s4 " ) ;
2010-09-10 06:32:50 +04:00
DO_TEST ( " misc-no-reboot " ) ;
DO_TEST ( " misc-uuid " ) ;
DO_TEST ( " net-user " ) ;
DO_TEST ( " net-virtio " ) ;
DO_TEST ( " net-eth " ) ;
DO_TEST ( " net-eth-ifname " ) ;
DO_TEST ( " serial-vc " ) ;
DO_TEST ( " serial-pty " ) ;
DO_TEST ( " serial-dev " ) ;
DO_TEST ( " serial-file " ) ;
DO_TEST ( " serial-unix " ) ;
DO_TEST ( " serial-tcp " ) ;
DO_TEST ( " serial-udp " ) ;
DO_TEST ( " serial-tcp-telnet " ) ;
DO_TEST ( " serial-many " ) ;
DO_TEST ( " parallel-tcp " ) ;
DO_TEST ( " console-compat " ) ;
DO_TEST ( " sound " ) ;
DO_TEST ( " watchdog " ) ;
DO_TEST ( " hostdev-usb-address " ) ;
DO_TEST ( " hostdev-pci-address " ) ;
2010-09-30 01:58:47 +04:00
DO_TEST ( " smp " ) ;
2012-10-17 16:55:18 +04:00
DO_TEST ( " hyperv " ) ;
2013-04-25 12:46:04 +04:00
DO_TEST ( " pseries-nvram " ) ;
2013-11-22 21:27:25 +04:00
DO_TEST ( " pseries-disk " ) ;
2013-04-25 12:46:04 +04:00
2013-05-14 09:25:50 +04:00
DO_TEST ( " nosharepages " ) ;
2010-09-10 06:32:50 +04:00
DO_TEST_FULL ( " restore-v1 " , 0 , " stdio " ) ;
DO_TEST_FULL ( " restore-v2 " , 0 , " stdio " ) ;
DO_TEST_FULL ( " restore-v2 " , 0 , " exec:cat " ) ;
DO_TEST_FULL ( " migrate " , 0 , " tcp:10.0.0.1:5000 " ) ;
tests: silence qemuargv2xmltest noise
Before this patch, the testsuite was noisy:
TEST: qemuargv2xmltest
........................................ 40
................20:41:28.046: warning : qemuParseCommandLine:6565 : unknown QEMU argument '-unknown', adding to the qemu namespace
20:41:28.046: warning : qemuParseCommandLine:6565 : unknown QEMU argument 'parameter', adding to the qemu namespace
. 57 OK
PASS: qemuargv2xmltest
It's not a real failure (which is why the test was completing
successfully), so much as an intentional warning to the user that use
of the qemu namespace has the potential for undefined effects that
leaked through the default logging behavior. After this patch series,
all tests can access any logged data, and this particular test can
explicitly check for the presence or absence of the warning, such that
the test output becomes:
TEST: qemuargv2xmltest
........................................ 40
................. 57 OK
PASS: qemuargv2xmltest
* tests/testutils.h (virtTestLogContentAndReset): New prototype.
* tests/testutils.c (struct virtTestLogData): New struct.
(virtTestLogOutput, virtTestLogClose, virtTestLogContentAndReset):
New functions.
(virtTestMain): Always capture log data emitted during tests.
* tests/qemuargv2xmltest.c (testCompareXMLToArgvHelper, mymain):
Use flag to mark which tests expect noisy stderr.
(testCompareXMLToArgvFiles): Add parameter to test whether stderr
was appropriately silent.
2010-09-10 20:25:49 +04:00
DO_TEST_FULL ( " qemu-ns-no-env " , 1 , NULL ) ;
2010-04-21 01:22:49 +04:00
2013-01-11 01:03:14 +04:00
virObjectUnref ( driver . config ) ;
2013-02-01 16:26:18 +04:00
virObjectUnref ( driver . caps ) ;
2013-03-31 22:03:42 +04:00
virObjectUnref ( driver . xmlopt ) ;
2009-05-21 18:22:51 +04:00
2012-03-22 15:33:35 +04:00
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
2009-05-21 18:22:51 +04:00
}
VIRT_TEST_MAIN ( mymain )
# else
2011-07-28 19:48:12 +04:00
int
main ( void )
{
return EXIT_AM_SKIP ;
}
2009-05-21 18:22:51 +04:00
# endif /* WITH_QEMU */