2014-03-26 20:53:49 +04:00
# include <config.h>
# include "testutils.h"
# ifdef WITH_BHYVE
# include "datatypes.h"
2014-04-08 21:18:00 +04:00
# include "bhyve / bhyve_capabilities.h"
2017-01-05 15:31:35 +03:00
# include "bhyve / bhyve_domain.h"
2014-03-26 20:53:49 +04:00
# include "bhyve / bhyve_utils.h"
# include "bhyve / bhyve_command.h"
# define VIR_FROM_THIS VIR_FROM_BHYVE
static bhyveConn driver ;
2015-12-13 06:17:15 +03:00
typedef enum {
FLAG_EXPECT_FAILURE = 1 < < 0 ,
FLAG_EXPECT_PARSE_ERROR = 1 < < 1 ,
} virBhyveXMLToArgvTestFlags ;
2014-03-26 20:53:49 +04:00
static int testCompareXMLToArgvFiles ( const char * xml ,
2014-11-08 19:48:31 +03:00
const char * cmdline ,
const char * ldcmdline ,
2015-12-13 06:17:15 +03:00
const char * dmcmdline ,
unsigned int flags )
2014-03-26 20:53:49 +04:00
{
2014-11-08 19:48:31 +03:00
char * actualargv = NULL , * actualld = NULL , * actualdm = NULL ;
2014-03-26 20:53:49 +04:00
virDomainDefPtr vmdef = NULL ;
2014-11-08 19:48:31 +03:00
virCommandPtr cmd = NULL , ldcmd = NULL ;
2014-08-14 20:15:57 +04:00
virConnectPtr conn ;
2014-03-26 20:53:49 +04:00
int ret = - 1 ;
2014-08-14 20:15:57 +04:00
if ( ! ( conn = virGetConnect ( ) ) )
goto out ;
2014-03-26 20:53:49 +04:00
if ( ! ( vmdef = virDomainDefParseFile ( xml , driver . caps , driver . xmlopt ,
2016-09-22 18:14:17 +03:00
NULL , VIR_DOMAIN_DEF_PARSE_INACTIVE ) ) ) {
2017-01-05 17:38:20 +03:00
if ( flags & FLAG_EXPECT_PARSE_ERROR ) {
2015-12-13 06:17:15 +03:00
ret = 0 ;
2017-01-05 17:38:20 +03:00
} else if ( flags & FLAG_EXPECT_FAILURE ) {
ret = 0 ;
VIR_TEST_DEBUG ( " Got expected error: %s \n " ,
virGetLastErrorMessage ( ) ) ;
virResetLastError ( ) ;
}
2014-03-26 20:53:49 +04:00
goto out ;
2015-12-13 06:17:15 +03:00
}
2014-03-26 20:53:49 +04:00
2014-11-08 19:48:36 +03:00
conn - > privateData = & driver ;
2014-03-26 20:53:49 +04:00
2015-12-13 06:17:15 +03:00
cmd = virBhyveProcessBuildBhyveCmd ( conn , vmdef , false ) ;
2016-06-30 06:00:04 +03:00
if ( vmdef - > os . loader )
ldcmd = virCommandNew ( " dummy " ) ;
else
ldcmd = virBhyveProcessBuildLoadCmd ( conn , vmdef , " <device.map> " ,
& actualdm ) ;
2015-12-13 06:17:15 +03:00
if ( ( cmd = = NULL ) | | ( ldcmd = = NULL ) ) {
if ( flags & FLAG_EXPECT_FAILURE ) {
ret = 0 ;
VIR_TEST_DEBUG ( " Got expected error: %s \n " ,
virGetLastErrorMessage ( ) ) ;
virResetLastError ( ) ;
}
2014-03-26 20:53:49 +04:00
goto out ;
2015-12-13 06:17:15 +03:00
}
2014-03-26 20:53:49 +04:00
if ( ! ( actualargv = virCommandToString ( cmd ) ) )
goto out ;
2014-11-08 19:48:31 +03:00
if ( actualdm ! = NULL )
virTrimSpaces ( actualdm , NULL ) ;
if ( ! ( actualld = virCommandToString ( ldcmd ) ) )
goto out ;
2016-05-26 18:01:53 +03:00
if ( virTestCompareToFile ( actualargv , cmdline ) < 0 )
2014-03-26 20:53:49 +04:00
goto out ;
2016-05-26 18:01:53 +03:00
if ( virTestCompareToFile ( actualld , ldcmdline ) < 0 )
2014-11-08 19:48:31 +03:00
goto out ;
2015-04-23 18:14:26 +03:00
if ( virFileExists ( dmcmdline ) | | actualdm ) {
2016-05-26 18:01:53 +03:00
if ( virTestCompareToFile ( actualdm , dmcmdline ) < 0 )
2015-04-23 18:14:26 +03:00
goto out ;
2014-11-08 19:48:31 +03:00
}
2014-03-26 20:53:49 +04:00
ret = 0 ;
out :
2018-02-06 12:09:06 +03:00
if ( vmdef & &
vmdef - > ngraphics = = 1 & &
vmdef - > graphics [ 0 ] - > type = = VIR_DOMAIN_GRAPHICS_TYPE_VNC ) {
if ( vmdef - > graphics [ 0 ] - > data . vnc . autoport )
2018-02-06 12:09:08 +03:00
virPortAllocatorRelease ( vmdef - > graphics [ 0 ] - > data . vnc . port ) ;
2018-02-06 12:09:06 +03:00
else
2018-02-06 12:09:07 +03:00
virPortAllocatorSetUsed ( vmdef - > graphics [ 0 ] - > data . vnc . port , false ) ;
2018-02-06 12:09:06 +03:00
}
2014-03-26 20:53:49 +04:00
VIR_FREE ( actualargv ) ;
2014-11-08 19:48:31 +03:00
VIR_FREE ( actualld ) ;
VIR_FREE ( actualdm ) ;
2014-03-26 20:53:49 +04:00
virCommandFree ( cmd ) ;
2014-11-08 19:48:31 +03:00
virCommandFree ( ldcmd ) ;
2014-03-26 20:53:49 +04:00
virDomainDefFree ( vmdef ) ;
2016-11-13 13:01:34 +03:00
virObjectUnref ( conn ) ;
2014-03-26 20:53:49 +04:00
return ret ;
}
2015-12-13 06:17:15 +03:00
struct testInfo {
const char * name ;
unsigned int flags ;
} ;
2014-03-26 20:53:49 +04:00
static int
testCompareXMLToArgvHelper ( const void * data )
{
int ret = - 1 ;
2015-12-13 06:17:15 +03:00
const struct testInfo * info = data ;
2014-03-26 20:53:49 +04:00
char * xml = NULL ;
2014-11-08 19:48:31 +03:00
char * args = NULL , * ldargs = NULL , * dmargs = NULL ;
2014-03-26 20:53:49 +04:00
if ( virAsprintf ( & xml , " %s/bhyvexml2argvdata/bhyvexml2argv-%s.xml " ,
2015-12-13 06:17:15 +03:00
abs_srcdir , info - > name ) < 0 | |
2014-03-26 20:53:49 +04:00
virAsprintf ( & args , " %s/bhyvexml2argvdata/bhyvexml2argv-%s.args " ,
2015-12-13 06:17:15 +03:00
abs_srcdir , info - > name ) < 0 | |
2014-11-08 19:48:31 +03:00
virAsprintf ( & ldargs , " %s/bhyvexml2argvdata/bhyvexml2argv-%s.ldargs " ,
2015-12-13 06:17:15 +03:00
abs_srcdir , info - > name ) < 0 | |
2014-11-08 19:48:31 +03:00
virAsprintf ( & dmargs , " %s/bhyvexml2argvdata/bhyvexml2argv-%s.devmap " ,
2015-12-13 06:17:15 +03:00
abs_srcdir , info - > name ) < 0 )
2014-03-26 20:53:49 +04:00
goto cleanup ;
2015-12-13 06:17:15 +03:00
ret = testCompareXMLToArgvFiles ( xml , args , ldargs , dmargs , info - > flags ) ;
2014-03-26 20:53:49 +04:00
cleanup :
VIR_FREE ( xml ) ;
VIR_FREE ( args ) ;
2016-11-13 13:01:34 +03:00
VIR_FREE ( ldargs ) ;
VIR_FREE ( dmargs ) ;
2014-03-26 20:53:49 +04:00
return ret ;
}
static int
mymain ( void )
{
int ret = 0 ;
2014-04-08 21:18:00 +04:00
if ( ( driver . caps = virBhyveCapsBuild ( ) ) = = NULL )
2014-03-26 20:53:49 +04:00
return EXIT_FAILURE ;
2017-01-05 15:31:35 +03:00
if ( ( driver . xmlopt = virBhyveDriverCreateXMLConf ( & driver ) ) = = NULL )
2014-03-26 20:53:49 +04:00
return EXIT_FAILURE ;
2018-02-06 12:09:09 +03:00
if ( ! ( driver . remotePorts = virPortAllocatorRangeNew ( " display " , 5900 , 65535 ) ) )
2017-05-08 13:36:43 +03:00
return EXIT_FAILURE ;
2017-11-03 15:09:47 +03:00
# define DO_TEST_FULL(name, flags) \
do { \
static struct testInfo info = { \
name , ( flags ) \
} ; \
if ( virTestRun ( " BHYVE XML-2-ARGV " name , \
2015-12-13 06:17:15 +03:00
testCompareXMLToArgvHelper , & info ) < 0 ) \
2017-11-03 15:09:47 +03:00
ret = - 1 ; \
2014-03-26 20:53:49 +04:00
} while ( 0 )
2017-11-03 15:09:47 +03:00
# define DO_TEST(name) \
2015-12-13 06:17:15 +03:00
DO_TEST_FULL ( name , 0 )
2017-11-03 15:09:47 +03:00
# define DO_TEST_FAILURE(name) \
2015-12-13 06:17:15 +03:00
DO_TEST_FULL ( name , FLAG_EXPECT_FAILURE )
2017-11-03 15:09:47 +03:00
# define DO_TEST_PARSE_ERROR(name) \
2015-12-13 06:17:15 +03:00
DO_TEST_FULL ( name , FLAG_EXPECT_PARSE_ERROR )
2014-11-08 19:48:36 +03:00
driver . grubcaps = BHYVE_GRUB_CAP_CONSDEV ;
2016-06-30 06:00:04 +03:00
driver . bhyvecaps = BHYVE_CAP_RTC_UTC | BHYVE_CAP_AHCI32SLOT | \
2017-02-12 17:06:23 +03:00
BHYVE_CAP_NET_E1000 | BHYVE_CAP_LPC_BOOTROM | \
2017-03-20 16:58:51 +03:00
BHYVE_CAP_FBUF | BHYVE_CAP_XHCI ;
2014-03-26 20:53:49 +04:00
DO_TEST ( " base " ) ;
DO_TEST ( " acpiapic " ) ;
2014-07-19 19:15:26 +04:00
DO_TEST ( " disk-cdrom " ) ;
2014-03-26 20:53:49 +04:00
DO_TEST ( " disk-virtio " ) ;
DO_TEST ( " macaddr " ) ;
2014-03-30 15:54:52 +04:00
DO_TEST ( " serial " ) ;
DO_TEST ( " console " ) ;
2014-11-08 19:48:33 +03:00
DO_TEST ( " grub-defaults " ) ;
2014-11-13 01:31:53 +03:00
DO_TEST ( " grub-bootorder " ) ;
DO_TEST ( " grub-bootorder2 " ) ;
2015-12-13 06:17:15 +03:00
DO_TEST ( " bhyveload-bootorder " ) ;
DO_TEST ( " bhyveload-bootorder1 " ) ;
DO_TEST_FAILURE ( " bhyveload-bootorder2 " ) ;
DO_TEST ( " bhyveload-bootorder3 " ) ;
2014-11-08 19:48:33 +03:00
DO_TEST ( " bhyveload-explicitargs " ) ;
2015-12-13 06:17:15 +03:00
DO_TEST_FAILURE ( " bhyveload-bootorder4 " ) ;
DO_TEST_PARSE_ERROR ( " bhyveload-bootorder5 " ) ;
2014-11-08 19:48:33 +03:00
DO_TEST ( " custom-loader " ) ;
DO_TEST ( " disk-cdrom-grub " ) ;
2014-11-08 19:48:36 +03:00
DO_TEST ( " serial-grub " ) ;
2015-07-19 11:20:35 +03:00
DO_TEST ( " localtime " ) ;
2016-08-27 15:30:34 +03:00
DO_TEST ( " net-e1000 " ) ;
2016-06-30 06:00:04 +03:00
DO_TEST ( " uefi " ) ;
2017-02-12 17:06:23 +03:00
DO_TEST ( " vnc " ) ;
2017-05-09 13:48:30 +03:00
DO_TEST ( " vnc-vgaconf-on " ) ;
DO_TEST ( " vnc-vgaconf-off " ) ;
DO_TEST ( " vnc-vgaconf-io " ) ;
2017-05-08 13:36:43 +03:00
DO_TEST ( " vnc-autoport " ) ;
2014-11-08 19:48:36 +03:00
2017-01-05 17:38:20 +03:00
/* Address allocation tests */
DO_TEST ( " addr-single-sata-disk " ) ;
DO_TEST ( " addr-multiple-sata-disks " ) ;
DO_TEST ( " addr-more-than-32-sata-disks " ) ;
2017-02-01 19:19:31 +03:00
DO_TEST ( " addr-single-virtio-disk " ) ;
DO_TEST ( " addr-multiple-virtio-disks " ) ;
2017-01-05 17:38:20 +03:00
/* The same without 32 devs per controller support */
driver . bhyvecaps ^ = BHYVE_CAP_AHCI32SLOT ;
DO_TEST ( " addr-no32devs-single-sata-disk " ) ;
DO_TEST ( " addr-no32devs-multiple-sata-disks " ) ;
DO_TEST_FAILURE ( " addr-no32devs-more-than-32-sata-disks " ) ;
2017-03-20 16:58:51 +03:00
/* USB xhci tablet */
DO_TEST ( " input-xhci-tablet " ) ;
DO_TEST_FAILURE ( " xhci-multiple-controllers " ) ;
DO_TEST_FAILURE ( " xhci-no-devs " ) ;
DO_TEST_FAILURE ( " xhci-multiple-devs " ) ;
driver . bhyvecaps ^ = BHYVE_CAP_XHCI ;
DO_TEST_FAILURE ( " input-xhci-tablet " ) ;
2014-11-08 19:48:36 +03:00
driver . grubcaps = 0 ;
DO_TEST ( " serial-grub-nocons " ) ;
2014-03-26 20:53:49 +04:00
2016-08-27 15:30:34 +03:00
driver . bhyvecaps & = ~ BHYVE_CAP_NET_E1000 ;
DO_TEST_FAILURE ( " net-e1000 " ) ;
2016-06-30 06:00:04 +03:00
driver . bhyvecaps & = ~ BHYVE_CAP_LPC_BOOTROM ;
DO_TEST_FAILURE ( " uefi " ) ;
2017-02-12 17:06:23 +03:00
driver . bhyvecaps & = ~ BHYVE_CAP_FBUF ;
DO_TEST_FAILURE ( " vnc " ) ;
2014-03-26 20:53:49 +04:00
virObjectUnref ( driver . caps ) ;
virObjectUnref ( driver . xmlopt ) ;
2018-02-06 12:09:06 +03:00
virPortAllocatorRangeFree ( driver . remotePorts ) ;
2014-03-26 20:53:49 +04:00
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
}
2017-03-29 17:45:42 +03:00
VIR_TEST_MAIN_PRELOAD ( mymain , abs_builddir " /.libs/bhyvexml2argvmock.so " )
2014-03-26 20:53:49 +04:00
# else
int main ( void )
{
return EXIT_AM_SKIP ;
}
# endif /* WITH_BHYVE */