2013-11-27 19:19:49 +04:00
/*
* Copyright ( C ) 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/>.
*
* Author : Daniel P . Berrange < berrange @ redhat . com >
*/
# include <config.h>
# include <stdlib.h>
# include "testutils.h"
# include "virfile.h"
# include "virstring.h"
# if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R
static int testFileCheckMounts ( const char * prefix ,
char * * gotmounts ,
size_t gotnmounts ,
const char * const * wantmounts ,
size_t wantnmounts )
{
size_t i ;
if ( gotnmounts ! = wantnmounts ) {
fprintf ( stderr , " Expected %zu mounts under %s, but got %zu \n " ,
wantnmounts , prefix , gotnmounts ) ;
return - 1 ;
}
for ( i = 0 ; i < gotnmounts ; i + + ) {
if ( STRNEQ ( gotmounts [ i ] , wantmounts [ i ] ) ) {
fprintf ( stderr , " Expected mount[%zu] '%s' but got '%s' \n " ,
i , wantmounts [ i ] , gotmounts [ i ] ) ;
return - 1 ;
}
}
return 0 ;
}
struct testFileGetMountSubtreeData {
const char * path ;
const char * prefix ;
const char * const * mounts ;
size_t nmounts ;
bool rev ;
} ;
static int testFileGetMountSubtree ( const void * opaque )
{
int ret = - 1 ;
char * * gotmounts = NULL ;
size_t gotnmounts = 0 ;
const struct testFileGetMountSubtreeData * data = opaque ;
if ( data - > rev ) {
if ( virFileGetMountReverseSubtree ( data - > path ,
data - > prefix ,
& gotmounts ,
& gotnmounts ) < 0 )
goto cleanup ;
} else {
if ( virFileGetMountSubtree ( data - > path ,
data - > prefix ,
& gotmounts ,
& gotnmounts ) < 0 )
goto cleanup ;
}
ret = testFileCheckMounts ( data - > prefix ,
gotmounts , gotnmounts ,
data - > mounts , data - > nmounts ) ;
cleanup :
virStringFreeList ( gotmounts ) ;
return ret ;
}
# endif /* ! defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R */
2015-04-08 11:27:30 +03:00
struct testFileSanitizePathData
{
const char * path ;
const char * expect ;
} ;
static int
testFileSanitizePath ( const void * opaque )
{
const struct testFileSanitizePathData * data = opaque ;
int ret = - 1 ;
char * actual ;
if ( ! ( actual = virFileSanitizePath ( data - > path ) ) )
return - 1 ;
if ( STRNEQ ( actual , data - > expect ) ) {
fprintf ( stderr , " \n expect: '%s' \n actual: '%s' \n " , data - > expect , actual ) ;
goto cleanup ;
}
ret = 0 ;
cleanup :
VIR_FREE ( actual ) ;
return ret ;
}
2013-11-27 19:19:49 +04:00
static int
mymain ( void )
{
int ret = 0 ;
2015-04-08 11:27:30 +03:00
struct testFileSanitizePathData data1 ;
2013-11-27 19:19:49 +04:00
# if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R
# define MTAB_PATH1 abs_srcdir " / virfiledata / mounts1.txt"
# define MTAB_PATH2 abs_srcdir " / virfiledata / mounts2.txt"
static const char * wantmounts1 [ ] = {
" /proc " , " /proc/sys/fs/binfmt_misc " , " /proc/sys/fs/binfmt_misc " ,
} ;
static const char * wantmounts1rev [ ] = {
" /proc/sys/fs/binfmt_misc " , " /proc/sys/fs/binfmt_misc " , " /proc "
} ;
2013-11-27 19:21:41 +04:00
static const char * wantmounts2a [ ] = {
" /etc/aliases "
} ;
static const char * wantmounts2b [ ] = {
" /etc/aliases.db "
} ;
2013-11-27 19:19:49 +04:00
# define DO_TEST_MOUNT_SUBTREE(name, path, prefix, mounts, rev) \
do { \
struct testFileGetMountSubtreeData data = { \
path , prefix , mounts , ARRAY_CARDINALITY ( mounts ) , rev \
} ; \
2016-05-26 18:01:50 +03:00
if ( virTestRun ( name , testFileGetMountSubtree , & data ) < 0 ) \
2013-11-27 19:19:49 +04:00
ret = - 1 ; \
} while ( 0 )
DO_TEST_MOUNT_SUBTREE ( " /proc normal " , MTAB_PATH1 , " /proc " , wantmounts1 , false ) ;
DO_TEST_MOUNT_SUBTREE ( " /proc reverse " , MTAB_PATH1 , " /proc " , wantmounts1rev , true ) ;
2013-11-27 19:21:41 +04:00
DO_TEST_MOUNT_SUBTREE ( " /etc/aliases " , MTAB_PATH2 , " /etc/aliases " , wantmounts2a , false ) ;
DO_TEST_MOUNT_SUBTREE ( " /etc/aliases.db " , MTAB_PATH2 , " /etc/aliases.db " , wantmounts2b , false ) ;
2013-11-27 19:19:49 +04:00
# endif /* ! defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R */
2015-04-08 11:27:30 +03:00
# define DO_TEST_SANITIZE_PATH(PATH, EXPECT) \
do { \
data1 . path = PATH ; \
data1 . expect = EXPECT ; \
2016-05-26 18:02:06 +03:00
if ( virTestRun ( virTestCounterNext ( ) , testFileSanitizePath , \
2016-05-26 18:01:50 +03:00
& data1 ) < 0 ) \
2015-04-08 11:27:30 +03:00
ret = - 1 ; \
} while ( 0 )
2015-04-08 11:57:07 +03:00
# define DO_TEST_SANITIZE_PATH_SAME(PATH) DO_TEST_SANITIZE_PATH(PATH, PATH)
2016-05-26 18:01:57 +03:00
virTestCounterReset ( " testFileSanitizePath " ) ;
2015-04-08 11:27:30 +03:00
DO_TEST_SANITIZE_PATH ( " " , " " ) ;
DO_TEST_SANITIZE_PATH ( " / " , " / " ) ;
DO_TEST_SANITIZE_PATH ( " /path " , " /path " ) ;
DO_TEST_SANITIZE_PATH ( " /path/to/blah " , " /path/to/blah " ) ;
DO_TEST_SANITIZE_PATH ( " /path/ " , " /path " ) ;
DO_TEST_SANITIZE_PATH ( " /////// " , " / " ) ;
DO_TEST_SANITIZE_PATH ( " // " , " // " ) ;
DO_TEST_SANITIZE_PATH ( " . " , " . " ) ;
DO_TEST_SANITIZE_PATH ( " ../ " , " .. " ) ;
DO_TEST_SANITIZE_PATH ( " ../../ " , " ../.. " ) ;
DO_TEST_SANITIZE_PATH ( " //foo//bar " , " //foo/bar " ) ;
DO_TEST_SANITIZE_PATH ( " /bar//foo " , " /bar/foo " ) ;
2015-04-08 11:57:07 +03:00
DO_TEST_SANITIZE_PATH_SAME ( " gluster://bar.baz/foo/hoo " ) ;
DO_TEST_SANITIZE_PATH_SAME ( " gluster://bar.baz//fooo/hoo " ) ;
DO_TEST_SANITIZE_PATH_SAME ( " gluster://bar.baz//////fooo/hoo " ) ;
DO_TEST_SANITIZE_PATH_SAME ( " gluster://bar.baz/fooo//hoo " ) ;
DO_TEST_SANITIZE_PATH_SAME ( " gluster://bar.baz/fooo///////hoo " ) ;
2015-04-08 11:27:30 +03:00
2013-11-27 19:19:49 +04:00
return ret ! = 0 ? EXIT_FAILURE : EXIT_SUCCESS ;
}
VIRT_TEST_MAIN ( mymain )