2013-01-09 19:11:50 +04:00
/*
2013-10-18 15:52:03 +04:00
* Copyright ( C ) 2013 - 2014 Red Hat , Inc .
2013-01-09 19:11:50 +04:00
*
* 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>
2013-10-18 15:52:03 +04:00
# include <stdlib.h>
# include "virfile.h"
2014-02-26 04:24:58 +04:00
# include "testutils.h"
2013-01-09 19:11:50 +04:00
2014-03-03 21:29:28 +04:00
# if HAVE_DLFCN_H
# include <dlfcn.h>
# endif
2014-02-26 04:24:58 +04:00
2014-03-03 21:29:28 +04:00
# if defined(RTLD_NEXT)
2014-02-26 04:24:58 +04:00
# ifdef MOCK_HELPER
# include "internal.h"
# include <sys / socket.h>
# include <errno.h>
# include <arpa / inet.h>
# include <netinet / in.h>
# include <stdio.h>
2013-10-18 15:52:03 +04:00
static bool host_has_ipv6 = false ;
static int ( * realsocket ) ( int domain , int type , int protocol ) ;
static void init_syms ( void )
{
int fd ;
if ( realsocket )
return ;
realsocket = dlsym ( RTLD_NEXT , " socket " ) ;
if ( ! realsocket ) {
fprintf ( stderr , " Unable to find 'socket' symbol \n " ) ;
abort ( ) ;
}
fd = realsocket ( AF_INET6 , SOCK_STREAM , 0 ) ;
if ( fd < 0 )
return ;
host_has_ipv6 = true ;
VIR_FORCE_CLOSE ( fd ) ;
}
int socket ( int domain ,
int type ,
int protocol )
{
init_syms ( ) ;
if ( getenv ( " LIBVIRT_TEST_IPV4ONLY " ) & & domain = = AF_INET6 ) {
errno = EAFNOSUPPORT ;
return - 1 ;
}
return realsocket ( domain , type , protocol ) ;
}
2013-01-09 19:11:50 +04:00
int bind ( int sockfd ATTRIBUTE_UNUSED ,
const struct sockaddr * addr ,
socklen_t addrlen ATTRIBUTE_UNUSED )
{
2013-04-03 18:55:37 +04:00
struct sockaddr_in saddr ;
2013-01-09 19:11:50 +04:00
2013-04-03 18:55:37 +04:00
memcpy ( & saddr , addr , sizeof ( saddr ) ) ;
2013-10-18 15:52:03 +04:00
if ( host_has_ipv6 & & ! getenv ( " LIBVIRT_TEST_IPV4ONLY " ) ) {
if ( saddr . sin_port = = htons ( 5900 ) | |
( saddr . sin_family = = AF_INET & &
saddr . sin_port = = htons ( 5904 ) ) | |
( saddr . sin_family = = AF_INET6 & &
( saddr . sin_port = = htons ( 5905 ) | |
saddr . sin_port = = htons ( 5906 ) ) ) ) {
errno = EADDRINUSE ;
return - 1 ;
}
return 0 ;
}
2013-04-03 18:55:37 +04:00
if ( saddr . sin_port = = htons ( 5900 ) | |
saddr . sin_port = = htons ( 5904 ) | |
saddr . sin_port = = htons ( 5905 ) | |
saddr . sin_port = = htons ( 5906 ) ) {
2013-01-09 19:11:50 +04:00
errno = EADDRINUSE ;
return - 1 ;
}
return 0 ;
}
2014-02-26 04:24:58 +04:00
# else
2013-01-09 19:11:50 +04:00
2014-02-26 04:24:58 +04:00
# include "virutil.h"
# include "virerror.h"
# include "viralloc.h"
# include "virlog.h"
# include "virportallocator.h"
# include "virstring.h"
2013-01-09 19:11:50 +04:00
2014-02-26 04:24:58 +04:00
# define VIR_FROM_THIS VIR_FROM_RPC
2013-01-09 19:11:50 +04:00
2014-02-28 16:16:17 +04:00
VIR_LOG_INIT ( " tests.portallocatortest " ) ;
2013-01-09 19:11:50 +04:00
static int testAllocAll ( const void * args ATTRIBUTE_UNUSED )
{
2013-10-31 15:46:28 +04:00
virPortAllocatorPtr alloc = virPortAllocatorNew ( " test " , 5900 , 5909 ) ;
2013-01-09 19:11:50 +04:00
int ret = - 1 ;
unsigned short p1 , p2 , p3 , p4 , p5 , p6 , p7 ;
2013-09-25 18:35:44 +04:00
if ( ! alloc )
return - 1 ;
2013-01-09 19:11:50 +04:00
if ( virPortAllocatorAcquire ( alloc , & p1 ) < 0 )
goto cleanup ;
if ( p1 ! = 5901 ) {
if ( virTestGetDebug ( ) )
fprintf ( stderr , " Expected 5901, got %d " , p1 ) ;
goto cleanup ;
}
if ( virPortAllocatorAcquire ( alloc , & p2 ) < 0 )
goto cleanup ;
if ( p2 ! = 5902 ) {
if ( virTestGetDebug ( ) )
fprintf ( stderr , " Expected 5902, got %d " , p2 ) ;
goto cleanup ;
}
if ( virPortAllocatorAcquire ( alloc , & p3 ) < 0 )
goto cleanup ;
if ( p3 ! = 5903 ) {
if ( virTestGetDebug ( ) )
fprintf ( stderr , " Expected 5903, got %d " , p3 ) ;
goto cleanup ;
}
if ( virPortAllocatorAcquire ( alloc , & p4 ) < 0 )
goto cleanup ;
if ( p4 ! = 5907 ) {
if ( virTestGetDebug ( ) )
fprintf ( stderr , " Expected 5907, got %d " , p4 ) ;
goto cleanup ;
}
if ( virPortAllocatorAcquire ( alloc , & p5 ) < 0 )
goto cleanup ;
if ( p5 ! = 5908 ) {
if ( virTestGetDebug ( ) )
fprintf ( stderr , " Expected 5908, got %d " , p5 ) ;
goto cleanup ;
}
if ( virPortAllocatorAcquire ( alloc , & p6 ) < 0 )
goto cleanup ;
if ( p6 ! = 5909 ) {
if ( virTestGetDebug ( ) )
fprintf ( stderr , " Expected 5909, got %d " , p6 ) ;
goto cleanup ;
}
2013-10-31 15:49:04 +04:00
if ( virPortAllocatorAcquire ( alloc , & p7 ) = = 0 ) {
2013-01-09 19:11:50 +04:00
if ( virTestGetDebug ( ) )
2013-10-31 15:49:04 +04:00
fprintf ( stderr , " Expected error, got %d " , p7 ) ;
2013-01-09 19:11:50 +04:00
goto cleanup ;
}
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2013-01-09 19:11:50 +04:00
virObjectUnref ( alloc ) ;
return ret ;
}
static int testAllocReuse ( const void * args ATTRIBUTE_UNUSED )
{
2013-10-31 15:46:28 +04:00
virPortAllocatorPtr alloc = virPortAllocatorNew ( " test " , 5900 , 5910 ) ;
2013-01-09 19:11:50 +04:00
int ret = - 1 ;
unsigned short p1 , p2 , p3 , p4 ;
2013-09-25 18:35:44 +04:00
if ( ! alloc )
return - 1 ;
2013-01-09 19:11:50 +04:00
if ( virPortAllocatorAcquire ( alloc , & p1 ) < 0 )
goto cleanup ;
if ( p1 ! = 5901 ) {
if ( virTestGetDebug ( ) )
fprintf ( stderr , " Expected 5901, got %d " , p1 ) ;
goto cleanup ;
}
if ( virPortAllocatorAcquire ( alloc , & p2 ) < 0 )
goto cleanup ;
if ( p2 ! = 5902 ) {
if ( virTestGetDebug ( ) )
fprintf ( stderr , " Expected 5902, got %d " , p2 ) ;
goto cleanup ;
}
if ( virPortAllocatorAcquire ( alloc , & p3 ) < 0 )
goto cleanup ;
if ( p3 ! = 5903 ) {
if ( virTestGetDebug ( ) )
fprintf ( stderr , " Expected 5903, got %d " , p3 ) ;
goto cleanup ;
}
if ( virPortAllocatorRelease ( alloc , p2 ) < 0 )
goto cleanup ;
if ( virPortAllocatorAcquire ( alloc , & p4 ) < 0 )
goto cleanup ;
if ( p4 ! = 5902 ) {
if ( virTestGetDebug ( ) )
fprintf ( stderr , " Expected 5902, got %d " , p4 ) ;
goto cleanup ;
}
ret = 0 ;
2014-03-25 10:53:44 +04:00
cleanup :
2013-01-09 19:11:50 +04:00
virObjectUnref ( alloc ) ;
return ret ;
}
static int
mymain ( void )
{
int ret = 0 ;
2013-09-20 22:13:35 +04:00
if ( virtTestRun ( " Test alloc all " , testAllocAll , NULL ) < 0 )
2013-01-09 19:11:50 +04:00
ret = - 1 ;
2013-09-20 22:13:35 +04:00
if ( virtTestRun ( " Test alloc reuse " , testAllocReuse , NULL ) < 0 )
2013-01-09 19:11:50 +04:00
ret = - 1 ;
2013-10-18 15:52:03 +04:00
setenv ( " LIBVIRT_TEST_IPV4ONLY " , " really " , 1 ) ;
if ( virtTestRun ( " Test IPv4-only alloc all " , testAllocAll , NULL ) < 0 )
ret = - 1 ;
if ( virtTestRun ( " Test IPv4-only alloc reuse " , testAllocReuse , NULL ) < 0 )
ret = - 1 ;
2014-03-17 13:38:38 +04:00
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
2013-01-09 19:11:50 +04:00
}
VIRT_TEST_MAIN_PRELOAD ( mymain , abs_builddir " /.libs/libvirportallocatormock.so " )
2014-02-26 04:24:58 +04:00
# endif
2014-03-03 21:29:28 +04:00
# else /* ! defined(RTLD_NEXT) */
2014-02-26 04:24:58 +04:00
int
main ( void )
{
return EXIT_AM_SKIP ;
}
2013-01-09 19:11:50 +04:00
# endif