2014-01-30 03:33:42 +04:00
/*
* Copyright ( C ) 2014 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 "testutils.h"
# ifdef __linux__
2018-12-13 17:53:50 +03:00
# define LIBVIRT_VIRCOMMANDPRIV_H_ALLOW
2014-03-11 14:59:58 +04:00
# include "vircommandpriv.h"
2014-01-30 03:33:42 +04:00
# include "virkmod.h"
# include "virstring.h"
struct testInfo {
const char * module ;
const char * exp_cmd ;
bool useBlacklist ;
} ;
# define VIR_FROM_THIS VIR_FROM_NONE
static int
testKModConfig ( const void * args ATTRIBUTE_UNUSED )
{
int ret = - 1 ;
char * outbuf = NULL ;
/* This will return the contents of a 'modprobe -c' which can differ
* from machine to machine - be happy that we get something .
*/
outbuf = virKModConfig ( ) ;
if ( ! outbuf ) {
fprintf ( stderr , " Failed to get config \n " ) ;
goto cleanup ;
}
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2014-01-30 03:33:42 +04:00
VIR_FREE ( outbuf ) ;
return ret ;
}
static int
checkOutput ( virBufferPtr buf , const char * exp_cmd )
{
int ret = - 1 ;
char * actual_cmd = NULL ;
if ( ! ( actual_cmd = virBufferContentAndReset ( buf ) ) ) {
int err = virBufferError ( buf ) ;
if ( err )
fprintf ( stderr , " buffer's in error state: %d " , err ) ;
else
fprintf ( stderr , " cannot compare buffer to exp: %s " , exp_cmd ) ;
goto cleanup ;
}
if ( STRNEQ ( exp_cmd , actual_cmd ) ) {
2016-05-26 18:01:51 +03:00
virTestDifference ( stderr , exp_cmd , actual_cmd ) ;
2014-01-30 03:33:42 +04:00
goto cleanup ;
}
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2014-01-30 03:33:42 +04:00
VIR_FREE ( actual_cmd ) ;
return ret ;
}
static int
testKModLoad ( const void * args )
{
int ret = - 1 ;
char * errbuf = NULL ;
const struct testInfo * info = args ;
const char * module = info - > module ;
bool useBlacklist = info - > useBlacklist ;
virBuffer buf = VIR_BUFFER_INITIALIZER ;
2014-03-07 15:39:48 +04:00
virCommandSetDryRun ( & buf , NULL , NULL ) ;
2014-01-30 03:33:42 +04:00
errbuf = virKModLoad ( module , useBlacklist ) ;
if ( errbuf ) {
fprintf ( stderr , " Failed to load, error: %s \n " , errbuf ) ;
goto cleanup ;
}
if ( checkOutput ( & buf , info - > exp_cmd ) < 0 )
goto cleanup ;
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2014-03-07 15:39:48 +04:00
virCommandSetDryRun ( NULL , NULL , NULL ) ;
2014-01-30 03:33:42 +04:00
VIR_FREE ( errbuf ) ;
return ret ;
}
static int
testKModUnload ( const void * args )
{
int ret = - 1 ;
char * errbuf = NULL ;
const struct testInfo * info = args ;
const char * module = info - > module ;
virBuffer buf = VIR_BUFFER_INITIALIZER ;
2014-03-07 15:39:48 +04:00
virCommandSetDryRun ( & buf , NULL , NULL ) ;
2014-01-30 03:33:42 +04:00
errbuf = virKModUnload ( module ) ;
if ( errbuf ) {
fprintf ( stderr , " Failed to unload, error: %s \n " , errbuf ) ;
goto cleanup ;
}
if ( checkOutput ( & buf , info - > exp_cmd ) < 0 )
goto cleanup ;
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2014-03-07 15:39:48 +04:00
virCommandSetDryRun ( NULL , NULL , NULL ) ;
2014-01-30 03:33:42 +04:00
VIR_FREE ( errbuf ) ;
return ret ;
}
static int
mymain ( void )
{
int ret = 0 ;
2016-05-26 18:01:50 +03:00
if ( virTestRun ( " config " , testKModConfig , NULL ) < 0 )
2014-01-30 03:33:42 +04:00
ret = - 1 ;
/* Although we cannot run the command on the host, we can compare
* the output of the created command against what we ' d expect to be
* created . So let ' s at least do that .
*/
2017-11-03 15:09:47 +03:00
# define DO_TEST(_name, _cb, _blkflag, _exp_cmd) \
do { \
struct testInfo data = { . module = " vfio-pci " , \
. exp_cmd = _exp_cmd , \
. useBlacklist = _blkflag } ; \
if ( virTestRun ( _name , _cb , & data ) < 0 ) \
ret = - 1 ; \
2014-01-30 03:33:42 +04:00
} while ( 0 )
DO_TEST ( " load " , testKModLoad , false , MODPROBE " vfio-pci \n " ) ;
DO_TEST ( " unload " , testKModUnload , false , RMMOD " vfio-pci \n " ) ;
DO_TEST ( " blklist " , testKModLoad , true , MODPROBE " -b vfio-pci \n " ) ;
2014-03-17 13:38:38 +04:00
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
2014-01-30 03:33:42 +04:00
}
2017-03-29 17:45:42 +03:00
VIR_TEST_MAIN ( mymain ) ;
2014-01-30 03:33:42 +04:00
# else
int
main ( void )
{
return EXIT_AM_SKIP ;
}
# endif