2016-01-09 02:15:33 +03:00
# include <config.h>
# include <unistd.h>
# include <sys/types.h>
# include <fcntl.h>
# include "testutils.h"
# include "internal.h"
# include "virstring.h"
2019-12-03 15:49:04 +03:00
# include "conf/backup_conf.h"
2016-01-09 02:15:33 +03:00
# define VIR_FROM_THIS VIR_FROM_NONE
static virCapsPtr caps ;
static virDomainXMLOptionPtr xmlopt ;
struct testInfo {
const char * name ;
int different ;
bool inactive_only ;
2016-04-08 20:16:12 +03:00
testCompareDomXML2XMLResult expectResult ;
2016-01-09 02:15:33 +03:00
} ;
static int
testCompareXMLToXMLHelper ( const void * data )
{
const struct testInfo * info = data ;
char * xml_in = NULL ;
char * xml_out = NULL ;
int ret = - 1 ;
2019-10-22 16:26:14 +03:00
xml_in = g_strdup_printf ( " %s/genericxml2xmlindata/%s.xml " ,
abs_srcdir , info - > name ) ;
xml_out = g_strdup_printf ( " %s/genericxml2xmloutdata/%s.xml " ,
abs_srcdir , info - > name ) ;
2016-01-09 02:15:33 +03:00
ret = testCompareDomXML2XMLFiles ( caps , xmlopt , xml_in ,
info - > different ? xml_out : xml_in ,
2018-03-02 18:58:50 +03:00
! info - > inactive_only , 0 ,
2016-04-08 20:16:12 +03:00
info - > expectResult ) ;
2016-01-09 02:15:33 +03:00
VIR_FREE ( xml_in ) ;
VIR_FREE ( xml_out ) ;
return ret ;
}
2020-07-01 10:56:46 +03:00
struct testCompareBackupXMLData {
const char * testname ;
bool internal ;
} ;
2020-07-07 17:38:00 +03:00
static virDomainDiskDefPtr
testCompareBackupXMLGetFakeDomdisk ( const char * dst )
{
virDomainDiskDefPtr domdisk = NULL ;
if ( ! ( domdisk = virDomainDiskDefNew ( NULL ) ) )
abort ( ) ;
domdisk - > dst = g_strdup ( dst ) ;
domdisk - > src - > type = VIR_STORAGE_TYPE_FILE ;
domdisk - > src - > format = VIR_STORAGE_FILE_QCOW2 ;
domdisk - > src - > path = g_strdup_printf ( " /fake/%s.qcow2 " , dst ) ;
return domdisk ;
}
2019-12-03 15:49:04 +03:00
static int
2020-07-01 10:56:46 +03:00
testCompareBackupXML ( const void * opaque )
2019-12-03 15:49:04 +03:00
{
2020-07-01 10:56:46 +03:00
const struct testCompareBackupXMLData * data = opaque ;
const char * testname = data - > testname ;
2019-12-03 15:49:04 +03:00
g_autofree char * xml_in = NULL ;
g_autofree char * file_in = NULL ;
g_autofree char * file_out = NULL ;
g_autoptr ( virDomainBackupDef ) backup = NULL ;
g_auto ( virBuffer ) buf = VIR_BUFFER_INITIALIZER ;
g_autofree char * actual = NULL ;
2020-07-01 10:56:46 +03:00
unsigned int parseFlags = 0 ;
2020-07-07 17:38:00 +03:00
g_autoptr ( virDomainDef ) fakedef = NULL ;
size_t i ;
2020-07-01 10:56:46 +03:00
if ( data - > internal )
parseFlags | = VIR_DOMAIN_BACKUP_PARSE_INTERNAL ;
2019-12-03 15:49:04 +03:00
file_in = g_strdup_printf ( " %s/domainbackupxml2xmlin/%s.xml " ,
abs_srcdir , testname ) ;
file_out = g_strdup_printf ( " %s/domainbackupxml2xmlout/%s.xml " ,
abs_srcdir , testname ) ;
if ( virFileReadAll ( file_in , 1024 * 64 , & xml_in ) < 0 )
return - 1 ;
2020-07-01 10:56:46 +03:00
if ( ! ( backup = virDomainBackupDefParseString ( xml_in , xmlopt , parseFlags ) ) ) {
2019-12-03 15:49:04 +03:00
VIR_TEST_VERBOSE ( " failed to parse backup def '%s' " , file_in ) ;
return - 1 ;
}
2020-07-07 17:38:00 +03:00
/* create a fake definition and fill it with disks */
if ( ! ( fakedef = virDomainDefNew ( ) ) )
return - 1 ;
fakedef - > ndisks = backup - > ndisks + 1 ;
fakedef - > disks = g_new0 ( virDomainDiskDefPtr , fakedef - > ndisks ) ;
for ( i = 0 ; i < backup - > ndisks ; i + + )
fakedef - > disks [ i ] = testCompareBackupXMLGetFakeDomdisk ( backup - > disks [ i ] . name ) ;
fakedef - > disks [ fakedef - > ndisks - 1 ] = testCompareBackupXMLGetFakeDomdisk ( " vdextradisk " ) ;
if ( virDomainBackupAlignDisks ( backup , fakedef , " SUFFIX " ) < 0 ) {
VIR_TEST_VERBOSE ( " failed to align backup def '%s' " , file_in ) ;
return - 1 ;
}
2020-07-01 10:56:46 +03:00
if ( virDomainBackupDefFormat ( & buf , backup , data - > internal ) < 0 ) {
2019-12-03 15:49:04 +03:00
VIR_TEST_VERBOSE ( " failed to format backup def '%s' " , file_in ) ;
return - 1 ;
}
actual = virBufferContentAndReset ( & buf ) ;
return virTestCompareToFile ( actual , file_out ) ;
}
2016-01-09 02:15:33 +03:00
static int
mymain ( void )
{
int ret = 0 ;
if ( ! ( caps = virTestGenericCapsInit ( ) ) )
return EXIT_FAILURE ;
if ( ! ( xmlopt = virTestGenericDomainXMLConfInit ( ) ) )
return EXIT_FAILURE ;
2017-11-03 15:09:47 +03:00
# define DO_TEST_FULL(name, is_different, inactive, expectResult) \
do { \
const struct testInfo info = { name , is_different , inactive , \
expectResult } ; \
if ( virTestRun ( " GENERIC XML-2-XML " name , \
testCompareXMLToXMLHelper , & info ) < 0 ) \
ret = - 1 ; \
2016-01-09 02:15:33 +03:00
} while ( 0 )
# define DO_TEST(name) \
2016-04-08 20:16:12 +03:00
DO_TEST_FULL ( name , 0 , false , TEST_COMPARE_DOM_XML2XML_RESULT_SUCCESS )
2016-01-09 02:15:33 +03:00
# define DO_TEST_DIFFERENT(name) \
2016-04-08 20:16:12 +03:00
DO_TEST_FULL ( name , 1 , false , TEST_COMPARE_DOM_XML2XML_RESULT_SUCCESS )
2016-01-09 02:15:33 +03:00
DO_TEST_DIFFERENT ( " disk-virtio " ) ;
2020-11-23 20:39:53 +03:00
DO_TEST_DIFFERENT ( " disk-hyperv-physical " ) ;
DO_TEST_DIFFERENT ( " disk-hyperv-virtual " ) ;
2016-01-09 02:15:33 +03:00
2016-04-25 18:10:30 +03:00
DO_TEST_DIFFERENT ( " graphics-vnc-minimal " ) ;
DO_TEST_DIFFERENT ( " graphics-vnc-manual-port " ) ;
DO_TEST_DIFFERENT ( " graphics-vnc-socket " ) ;
DO_TEST_DIFFERENT ( " graphics-vnc-socket-listen " ) ;
2016-04-08 20:16:12 +03:00
DO_TEST_DIFFERENT ( " graphics-listen-back-compat " ) ;
DO_TEST_FULL ( " graphics-listen-back-compat-mismatch " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2016-04-25 18:10:30 +03:00
DO_TEST_DIFFERENT ( " graphics-vnc-listen-attr-only " ) ;
DO_TEST_DIFFERENT ( " graphics-vnc-listen-element-minimal " ) ;
DO_TEST_DIFFERENT ( " graphics-vnc-listen-element-with-address " ) ;
2016-06-08 16:18:25 +03:00
DO_TEST_DIFFERENT ( " graphics-vnc-socket-attr-listen-address " ) ;
DO_TEST_DIFFERENT ( " graphics-vnc-socket-attr-listen-socket " ) ;
DO_TEST_FULL ( " graphics-vnc-socket-attr-listen-socket-mismatch " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2017-01-25 19:42:07 +03:00
DO_TEST ( " graphics-vnc-autoport-no " ) ;
2016-04-08 20:16:12 +03:00
2016-06-23 16:13:49 +03:00
DO_TEST_FULL ( " name-slash-fail " , 0 , false ,
2016-04-26 18:23:12 +03:00
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2016-06-15 17:33:20 +03:00
DO_TEST ( " perf " ) ;
2016-08-02 18:58:43 +03:00
DO_TEST ( " vcpus-individual " ) ;
2017-04-24 16:56:31 +03:00
DO_TEST ( " disk-network-http " ) ;
2016-08-02 18:58:43 +03:00
2017-04-24 16:40:07 +03:00
DO_TEST ( " cpu-cache-emulate " ) ;
DO_TEST ( " cpu-cache-passthrough " ) ;
DO_TEST ( " cpu-cache-disable " ) ;
2020-07-13 12:44:13 +03:00
DO_TEST ( " network-interface-mac-check " ) ;
2017-08-17 13:45:48 +03:00
DO_TEST_DIFFERENT ( " chardev-tcp " ) ;
DO_TEST_FULL ( " chardev-tcp-missing-host " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
DO_TEST_FULL ( " chardev-tcp-missing-service " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2017-08-18 18:14:34 +03:00
DO_TEST_FULL ( " chardev-tcp-multiple-source " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2017-08-17 15:26:36 +03:00
DO_TEST_DIFFERENT ( " chardev-udp " ) ;
DO_TEST_FULL ( " chardev-udp-missing-connect-service " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2017-08-18 18:14:34 +03:00
DO_TEST_FULL ( " chardev-udp-multiple-source " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2017-08-17 15:55:11 +03:00
DO_TEST_DIFFERENT ( " chardev-unix " ) ;
DO_TEST_FULL ( " chardev-unix-smartcard-missing-path " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
DO_TEST_FULL ( " chardev-unix-redirdev-missing-path " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
DO_TEST_FULL ( " chardev-unix-rng-missing-path " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2017-08-23 18:48:14 +03:00
DO_TEST_DIFFERENT ( " chardev-reconnect " ) ;
DO_TEST_FULL ( " chardev-reconnect-missing-timeout " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
DO_TEST_FULL ( " chardev-reconnect-invalid-mode " , 0 , false ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2017-08-17 13:45:48 +03:00
2017-11-10 16:47:05 +03:00
DO_TEST ( " cachetune-small " ) ;
DO_TEST ( " cachetune-cdp " ) ;
2019-11-13 20:08:21 +03:00
DO_TEST_DIFFERENT ( " cachetune " ) ;
2018-02-01 16:36:09 +03:00
DO_TEST_DIFFERENT ( " cachetune-extra-tunes " ) ;
2017-11-10 16:47:05 +03:00
DO_TEST_FULL ( " cachetune-colliding-allocs " , false , true ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
DO_TEST_FULL ( " cachetune-colliding-tunes " , false , true ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
DO_TEST_FULL ( " cachetune-colliding-types " , false , true ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2018-11-12 16:31:44 +03:00
DO_TEST_FULL ( " cachetune-colliding-monitor " , false , true ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2019-12-13 18:34:10 +03:00
DO_TEST_DIFFERENT ( " memorytune " ) ;
2018-07-30 06:12:39 +03:00
DO_TEST_FULL ( " memorytune-colliding-allocs " , false , true ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
DO_TEST_FULL ( " memorytune-colliding-cachetune " , false , true ,
TEST_COMPARE_DOM_XML2XML_RESULT_FAIL_PARSE ) ;
2017-11-10 16:47:05 +03:00
2018-05-10 22:32:26 +03:00
DO_TEST ( " tseg " ) ;
2018-06-08 17:40:56 +03:00
DO_TEST ( " launch-security-sev " ) ;
2019-04-15 11:45:38 +03:00
DO_TEST_DIFFERENT ( " cputune " ) ;
2020-10-04 19:51:48 +03:00
DO_TEST ( " device-backenddomain " ) ;
2019-04-15 11:45:38 +03:00
2020-07-01 10:56:46 +03:00
# define DO_TEST_BACKUP_FULL(name, intrnl) \
do { \
const struct testCompareBackupXMLData data = { . testname = name , \
. internal = intrnl } ; \
if ( virTestRun ( " QEMU BACKUP XML-2-XML " name , testCompareBackupXML , & data ) < 0 ) \
ret = - 1 ; \
} while ( false )
2019-12-03 15:49:04 +03:00
# define DO_TEST_BACKUP(name) \
2020-07-01 10:56:46 +03:00
DO_TEST_BACKUP_FULL ( name , false )
2019-12-03 15:49:04 +03:00
DO_TEST_BACKUP ( " empty " ) ;
DO_TEST_BACKUP ( " backup-pull " ) ;
DO_TEST_BACKUP ( " backup-pull-seclabel " ) ;
2020-04-09 16:50:40 +03:00
DO_TEST_BACKUP ( " backup-pull-encrypted " ) ;
2019-12-03 15:49:04 +03:00
DO_TEST_BACKUP ( " backup-push " ) ;
DO_TEST_BACKUP ( " backup-push-seclabel " ) ;
2020-04-09 16:50:40 +03:00
DO_TEST_BACKUP ( " backup-push-encrypted " ) ;
2020-07-01 10:48:27 +03:00
DO_TEST_BACKUP_FULL ( " backup-pull-internal-invalid " , true ) ;
2019-12-03 15:49:04 +03:00
2016-01-09 02:15:33 +03:00
virObjectUnref ( caps ) ;
virObjectUnref ( xmlopt ) ;
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
}
2017-03-29 17:45:42 +03:00
VIR_TEST_MAIN ( mymain )