2018-03-20 01:45:51 +03:00
/*
* Copyright ( C ) 2011 - 2013 Red Hat , Inc .
*
* 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/>.
*
*/
# include <config.h>
# include "virjson.h"
# include "virbuffer.h"
# include "virxml.h"
2020-08-07 17:02:03 +03:00
# include "virhash.h"
2018-03-20 01:45:51 +03:00
# include "testutils.h"
# include "testutilsqemu.h"
2020-08-07 17:02:03 +03:00
# include "tests/testutilsqemuschema.h"
2018-03-20 01:45:51 +03:00
# include "qemumonitortestutils.h"
# include "qemu/qemu_migration_params.h"
2018-12-13 17:53:50 +03:00
# define LIBVIRT_QEMU_MIGRATION_PARAMSPRIV_H_ALLOW
2018-03-20 01:45:51 +03:00
# include "qemu/qemu_migration_paramspriv.h"
# include "qemu/qemu_monitor.h"
# define VIR_FROM_THIS VIR_FROM_NONE
typedef struct _qemuMigParamsData qemuMigParamsData ;
struct _qemuMigParamsData {
2021-03-11 10:16:13 +03:00
virDomainXMLOption * xmlopt ;
2018-03-20 01:45:51 +03:00
const char * name ;
2020-10-22 20:04:18 +03:00
GHashTable * qmpschema ;
2018-03-20 01:45:51 +03:00
} ;
static void
2021-03-11 10:16:13 +03:00
qemuMigParamsTestFormatXML ( virBuffer * buf ,
qemuMigrationParams * migParams )
2018-03-20 01:45:51 +03:00
{
virBufferAddLit ( buf , " <test> \n " ) ;
virBufferAdjustIndent ( buf , 2 ) ;
if ( migParams )
qemuMigrationParamsFormat ( buf , migParams ) ;
virBufferAdjustIndent ( buf , - 2 ) ;
virBufferAddLit ( buf , " </test> \n " ) ;
}
static int
qemuMigParamsTestXML2XML ( const void * opaque )
{
const qemuMigParamsData * data = opaque ;
2020-07-03 02:35:41 +03:00
g_auto ( virBuffer ) buf = VIR_BUFFER_INITIALIZER ;
2020-07-28 22:57:28 +03:00
g_autofree char * xmlFile = NULL ;
2020-07-28 22:58:18 +03:00
g_autoptr ( xmlDoc ) doc = NULL ;
g_autoptr ( xmlXPathContext ) ctxt = NULL ;
g_autoptr ( qemuMigrationParams ) migParams = NULL ;
2020-07-28 22:57:28 +03:00
g_autofree char * actualXML = NULL ;
2018-03-20 01:45:51 +03:00
2019-10-22 16:26:14 +03:00
xmlFile = g_strdup_printf ( " %s/qemumigparamsdata/%s.xml " , abs_srcdir ,
data - > name ) ;
2018-03-20 01:45:51 +03:00
if ( ! ( doc = virXMLParseFileCtxt ( xmlFile , & ctxt ) ) )
2020-07-29 00:17:02 +03:00
return - 1 ;
2018-03-20 01:45:51 +03:00
if ( qemuMigrationParamsParse ( ctxt , & migParams ) < 0 )
2020-07-29 00:17:02 +03:00
return - 1 ;
2018-03-20 01:45:51 +03:00
qemuMigParamsTestFormatXML ( & buf , migParams ) ;
if ( ! ( actualXML = virBufferContentAndReset ( & buf ) ) )
2020-07-29 00:17:02 +03:00
return - 1 ;
2018-03-20 01:45:51 +03:00
if ( virTestCompareToFile ( actualXML , xmlFile ) < 0 )
2020-07-29 00:17:02 +03:00
return - 1 ;
2018-03-20 01:45:51 +03:00
2020-07-29 00:17:02 +03:00
return 0 ;
2018-03-20 01:45:51 +03:00
}
static int
qemuMigParamsTestXML ( const void * opaque )
{
const qemuMigParamsData * data = opaque ;
2020-07-03 02:35:41 +03:00
g_auto ( virBuffer ) buf = VIR_BUFFER_INITIALIZER ;
2020-07-28 22:57:28 +03:00
g_autofree char * replyFile = NULL ;
g_autofree char * xmlFile = NULL ;
2021-03-11 10:16:13 +03:00
qemuMonitorTest * mon = NULL ;
2020-07-28 22:58:18 +03:00
g_autoptr ( virJSONValue ) params = NULL ;
g_autoptr ( qemuMigrationParams ) migParams = NULL ;
2020-07-28 22:57:28 +03:00
g_autofree char * actualXML = NULL ;
2018-03-20 01:45:51 +03:00
int ret = - 1 ;
2019-10-22 16:26:14 +03:00
replyFile = g_strdup_printf ( " %s/qemumigparamsdata/%s.reply " ,
abs_srcdir , data - > name ) ;
xmlFile = g_strdup_printf ( " %s/qemumigparamsdata/%s.xml " ,
abs_srcdir , data - > name ) ;
2018-03-20 01:45:51 +03:00
if ( ! ( mon = qemuMonitorTestNewFromFile ( replyFile , data - > xmlopt , true ) ) )
goto cleanup ;
if ( qemuMonitorGetMigrationParams ( qemuMonitorTestGetMonitor ( mon ) ,
& params ) < 0 )
goto cleanup ;
if ( ! ( migParams = qemuMigrationParamsFromJSON ( params ) ) )
goto cleanup ;
qemuMigParamsTestFormatXML ( & buf , migParams ) ;
if ( ! ( actualXML = virBufferContentAndReset ( & buf ) ) )
goto cleanup ;
if ( virTestCompareToFile ( actualXML , xmlFile ) < 0 )
goto cleanup ;
ret = 0 ;
cleanup :
qemuMonitorTestFree ( mon ) ;
return ret ;
}
static int
qemuMigParamsTestJSON ( const void * opaque )
{
const qemuMigParamsData * data = opaque ;
2020-07-28 22:57:28 +03:00
g_autofree char * replyFile = NULL ;
g_autofree char * jsonFile = NULL ;
2021-03-11 10:16:13 +03:00
qemuMonitorTest * mon = NULL ;
2020-07-28 22:58:18 +03:00
g_autoptr ( virJSONValue ) paramsIn = NULL ;
g_autoptr ( virJSONValue ) paramsOut = NULL ;
g_autoptr ( qemuMigrationParams ) migParams = NULL ;
2020-07-28 22:57:28 +03:00
g_autofree char * actualJSON = NULL ;
2020-08-07 17:02:03 +03:00
g_auto ( virBuffer ) debug = VIR_BUFFER_INITIALIZER ;
2018-03-20 01:45:51 +03:00
int ret = - 1 ;
2019-10-22 16:26:14 +03:00
replyFile = g_strdup_printf ( " %s/qemumigparamsdata/%s.reply " ,
abs_srcdir , data - > name ) ;
jsonFile = g_strdup_printf ( " %s/qemumigparamsdata/%s.json " ,
abs_srcdir , data - > name ) ;
2018-03-20 01:45:51 +03:00
if ( ! ( mon = qemuMonitorTestNewFromFile ( replyFile , data - > xmlopt , true ) ) )
goto cleanup ;
if ( qemuMonitorGetMigrationParams ( qemuMonitorTestGetMonitor ( mon ) ,
& paramsIn ) < 0 )
goto cleanup ;
if ( ! ( migParams = qemuMigrationParamsFromJSON ( paramsIn ) ) )
goto cleanup ;
if ( ! ( paramsOut = qemuMigrationParamsToJSON ( migParams ) ) | |
! ( actualJSON = virJSONValueToString ( paramsOut , true ) ) )
goto cleanup ;
2020-08-07 17:02:03 +03:00
if ( testQEMUSchemaValidateCommand ( " migrate-set-parameters " ,
paramsOut ,
data - > qmpschema ,
false ,
false ,
& debug ) < 0 ) {
VIR_TEST_VERBOSE ( " failed to validate migration params '%s' against QMP schema: %s " ,
actualJSON , virBufferCurrentContent ( & debug ) ) ;
goto cleanup ;
}
2018-03-20 01:45:51 +03:00
if ( virTestCompareToFile ( actualJSON , jsonFile ) < 0 )
goto cleanup ;
ret = 0 ;
cleanup :
qemuMonitorTestFree ( mon ) ;
return ret ;
}
static int
mymain ( void )
{
2020-10-22 20:04:18 +03:00
g_autoptr ( GHashTable ) qmpschema = NULL ;
2018-03-20 01:45:51 +03:00
virQEMUDriver driver ;
int ret = 0 ;
2019-09-16 19:44:23 +03:00
if ( qemuTestDriverInit ( & driver ) < 0 )
2018-03-20 01:45:51 +03:00
return EXIT_FAILURE ;
virEventRegisterDefaultImpl ( ) ;
2020-08-07 17:02:03 +03:00
if ( ! ( qmpschema = testQEMUSchemaLoadLatest ( " x86_64 " ) ) ) {
VIR_TEST_VERBOSE ( " failed to load QMP schema " ) ;
return EXIT_FAILURE ;
}
2018-03-20 01:45:51 +03:00
# define DO_TEST(name) \
do { \
qemuMigParamsData data = { \
2020-08-07 17:02:03 +03:00
driver . xmlopt , name , qmpschema \
2018-03-20 01:45:51 +03:00
} ; \
if ( virTestRun ( name " (xml) " , qemuMigParamsTestXML , & data ) < 0 ) \
ret = - 1 ; \
if ( virTestRun ( name " (json) " , qemuMigParamsTestJSON , & data ) < 0 ) \
ret = - 1 ; \
if ( virTestRun ( name " (xml2xml) " , qemuMigParamsTestXML2XML , & data ) < 0 ) \
ret = - 1 ; \
} while ( 0 )
DO_TEST ( " unsupported " ) ;
2018-03-20 01:46:46 +03:00
DO_TEST ( " empty " ) ;
DO_TEST ( " basic " ) ;
2018-03-20 01:42:01 +03:00
DO_TEST ( " tls " ) ;
DO_TEST ( " tls-enabled " ) ;
DO_TEST ( " tls-hostname " ) ;
2018-03-20 01:45:51 +03:00
qemuTestDriverFree ( & driver ) ;
return ( ret = = 0 ) ? EXIT_SUCCESS : EXIT_FAILURE ;
}
VIR_TEST_MAIN ( mymain )