2016-06-07 19:54:43 +03:00
/*
* Copyright ( C ) 2016 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/>.
*
* Author : Ján Tomko < jtomko @ redhat . com >
*/
# include <config.h>
# include "testutils.h"
# include "virerror.h"
# include "viralloc.h"
# include "virlog.h"
# include "virxml.h"
# define VIR_FROM_THIS VIR_FROM_NONE
VIR_LOG_INIT ( " tests.schematest " ) ;
struct testSchemaData {
virXMLValidatorPtr validator ;
2017-03-28 14:28:02 +03:00
const char * schema ;
2016-06-07 19:54:43 +03:00
const char * xml_path ;
} ;
static int
testSchemaFile ( const void * args )
{
const struct testSchemaData * data = args ;
bool shouldFail = virFileHasSuffix ( data - > xml_path , " -invalid.xml " ) ;
xmlDocPtr xml = NULL ;
int ret = - 1 ;
if ( ! ( xml = virXMLParseFile ( data - > xml_path ) ) )
return - 1 ;
if ( virXMLValidatorValidate ( data - > validator , xml ) < 0 ) {
if ( ! shouldFail )
goto cleanup ;
} else {
if ( shouldFail )
goto cleanup ;
}
ret = 0 ;
cleanup :
xmlFreeDoc ( xml ) ;
return ret ;
}
static int
testSchemaDir ( const char * schema ,
virXMLValidatorPtr validator ,
const char * dir_path )
{
DIR * dir = NULL ;
struct dirent * ent ;
int ret = 0 ;
int rc ;
char * test_name = NULL ;
char * xml_path = NULL ;
struct testSchemaData data = {
. validator = validator ,
} ;
2016-06-21 17:34:08 +03:00
if ( virDirOpen ( & dir , dir_path ) < 0 )
2016-06-07 19:54:43 +03:00
return - 1 ;
while ( ( rc = virDirRead ( dir , & ent , dir_path ) ) > 0 ) {
if ( ! virFileHasSuffix ( ent - > d_name , " .xml " ) )
continue ;
if ( virAsprintf ( & xml_path , " %s/%s " , dir_path , ent - > d_name ) < 0 )
goto cleanup ;
if ( virAsprintf ( & test_name , " Checking %s against %s " ,
ent - > d_name , schema ) < 0 )
goto cleanup ;
data . xml_path = xml_path ;
2016-05-26 18:01:50 +03:00
if ( virTestRun ( test_name , testSchemaFile , & data ) < 0 )
2016-06-07 19:54:43 +03:00
ret = - 1 ;
VIR_FREE ( test_name ) ;
VIR_FREE ( xml_path ) ;
}
if ( rc < 0 )
ret = - 1 ;
cleanup :
VIR_FREE ( test_name ) ;
VIR_FREE ( xml_path ) ;
2016-06-21 13:40:29 +03:00
VIR_DIR_CLOSE ( dir ) ;
2016-06-07 19:54:43 +03:00
return ret ;
}
static int
2016-08-02 10:11:33 +03:00
testSchemaDirs ( const char * schema , virXMLValidatorPtr validator , . . . )
2016-06-07 19:54:43 +03:00
{
va_list args ;
int ret = 0 ;
char * dir_path = NULL ;
const char * dir ;
2016-08-02 10:11:33 +03:00
va_start ( args , validator ) ;
2016-06-07 19:54:43 +03:00
while ( ( dir = va_arg ( args , char * ) ) ) {
if ( virAsprintf ( & dir_path , " %s/%s " , abs_srcdir , dir ) < 0 ) {
ret = - 1 ;
goto cleanup ;
}
2016-06-08 12:04:04 +03:00
if ( testSchemaDir ( schema , validator , dir_path ) < 0 )
2016-06-07 19:54:43 +03:00
ret = - 1 ;
VIR_FREE ( dir_path ) ;
}
cleanup :
VIR_FREE ( dir_path ) ;
va_end ( args ) ;
return ret ;
}
2016-08-02 10:11:33 +03:00
static int
testSchemaGrammar ( const void * opaque )
{
2017-03-28 14:28:02 +03:00
struct testSchemaData * data = ( struct testSchemaData * ) opaque ;
2016-08-02 10:11:33 +03:00
char * schema_path ;
int ret = - 1 ;
if ( virAsprintf ( & schema_path , " %s/docs/schemas/%s " ,
abs_topsrcdir , data - > schema ) < 0 )
return - 1 ;
if ( ! ( data - > validator = virXMLValidatorInit ( schema_path ) ) )
goto cleanup ;
ret = 0 ;
cleanup :
VIR_FREE ( schema_path ) ;
return ret ;
}
2016-06-07 19:54:43 +03:00
static int
mymain ( void )
{
int ret = 0 ;
2017-03-28 14:28:02 +03:00
struct testSchemaData data ;
2016-08-02 10:11:33 +03:00
2016-08-12 13:19:44 +03:00
memset ( & data , 0 , sizeof ( data ) ) ;
2017-11-03 15:09:47 +03:00
# define DO_TEST_DIR(sch, ...) \
do { \
data . schema = sch ; \
if ( virTestRun ( " test schema grammar file: " sch , \
testSchemaGrammar , & data ) = = 0 ) { \
/* initialize the validator even if the schema test \
* was skipped because of VIR_TEST_RANGE */ \
if ( ! data . validator & & testSchemaGrammar ( & data ) < 0 ) { \
ret = - 1 ; \
break ; \
} \
if ( testSchemaDirs ( sch , data . validator , __VA_ARGS__ , NULL ) < 0 ) \
ret = - 1 ; \
\
virXMLValidatorFree ( data . validator ) ; \
data . validator = NULL ; \
} else { \
ret = - 1 ; \
} \
2016-08-02 10:11:33 +03:00
} while ( 0 )
2016-06-07 19:54:43 +03:00
2017-11-03 15:09:47 +03:00
# define DO_TEST_FILE(sch, xmlfile) \
do { \
data . schema = sch ; \
data . xml_path = abs_srcdir " / " xmlfile ; \
if ( virTestRun ( " test schema grammar file: " sch , \
testSchemaGrammar , & data ) = = 0 ) { \
/* initialize the validator even if the schema test \
* was skipped because of VIR_TEST_RANGE */ \
if ( ! data . validator & & testSchemaGrammar ( & data ) < 0 ) { \
ret = - 1 ; \
break ; \
} \
if ( virTestRun ( " Checking " xmlfile " against " sch , \
testSchemaFile , & data ) < 0 ) \
ret = - 1 ; \
\
virXMLValidatorFree ( data . validator ) ; \
data . validator = NULL ; \
} else { \
ret = - 1 ; \
} \
2017-03-28 14:28:02 +03:00
} while ( 0 )
2018-03-29 01:20:24 +03:00
DO_TEST_DIR ( " capability.rng " , " capabilityschemadata " , " vircaps2xmldata " ) ;
2017-03-28 14:28:02 +03:00
DO_TEST_DIR ( " domain.rng " , " domainschemadata " , " qemuargv2xmldata " ,
" qemuxml2argvdata " , " sexpr2xmldata " , " xmconfigdata " ,
" xml2sexprdata " , " qemuxml2xmloutdata " , " lxcxml2xmldata " ,
" lxcxml2xmloutdata " , " bhyvexml2argvdata " , " genericxml2xmlindata " ,
2017-11-29 20:43:29 +03:00
" genericxml2xmloutdata " , " xlconfigdata " , " libxlxml2domconfigdata " ,
2017-03-28 14:28:02 +03:00
" qemuhotplugtestdomains " ) ;
DO_TEST_DIR ( " domaincaps.rng " , " domaincapsschemadata " ) ;
DO_TEST_DIR ( " domainsnapshot.rng " , " domainsnapshotxml2xmlin " ,
" domainsnapshotxml2xmlout " ) ;
DO_TEST_DIR ( " interface.rng " , " interfaceschemadata " ) ;
DO_TEST_DIR ( " network.rng " , " ../src/network " , " networkxml2xmlin " ,
" networkxml2xmlout " , " networkxml2confdata " ) ;
DO_TEST_DIR ( " nodedev.rng " , " nodedevschemadata " ) ;
2018-06-21 09:07:17 +03:00
DO_TEST_DIR ( " nwfilter.rng " , " nwfilterxml2xmlout " , " ../examples/xml/nwfilter " ) ;
2018-05-15 20:00:16 +03:00
DO_TEST_DIR ( " nwfilterbinding.rng " , " virnwfilterbindingxml2xmldata " ) ;
2017-03-28 14:28:02 +03:00
DO_TEST_DIR ( " secret.rng " , " secretxml2xmlin " ) ;
DO_TEST_DIR ( " storagepool.rng " , " storagepoolxml2xmlin " , " storagepoolxml2xmlout " ,
" storagepoolschemadata " ) ;
DO_TEST_DIR ( " storagevol.rng " , " storagevolxml2xmlin " , " storagevolxml2xmlout " ,
" storagevolschemadata " ) ;
2016-06-07 19:54:43 +03:00
2017-04-05 10:51:51 +03:00
DO_TEST_FILE ( " ../news.rng " , " ../docs/news.xml " ) ;
2017-03-28 14:35:05 +03:00
2016-06-07 19:54:43 +03:00
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
}
2017-03-29 17:45:42 +03:00
VIR_TEST_MAIN ( mymain )