2011-06-22 19:12:24 +00:00
/*
* Asterisk - - An open source telephony toolkit .
*
* Copyright ( C ) 2011 , Digium , Inc .
*
* Terry Wilson < twilson @ digium . com >
*
* See http : //www.asterisk.org for more information about
* the Asterisk project . Please do not directly contact
* any of the maintainers of this project for assistance ;
* the project provides a web site , mailing lists and IRC
* channels for your use .
*
* This program is free software , distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree .
*/
/*!
* \ file
* \ brief Netsock2 Unit Tests
*
* \ author Terry Wilson < twilson @ digium . com >
*
*/
/*** MODULEINFO
< depend > TEST_FRAMEWORK < / depend >
2011-09-29 20:55:15 +00:00
< support_level > core < / support_level >
2011-06-22 19:12:24 +00:00
* * */
# include "asterisk.h"
ASTERISK_FILE_VERSION ( __FILE__ , " " )
# include "asterisk/test.h"
# include "asterisk/module.h"
# include "asterisk/netsock2.h"
# include "asterisk/logger.h"
2011-11-09 19:31:27 +00:00
# include "asterisk/config.h" /* PARSE_PORT_* */
2011-06-22 19:12:24 +00:00
struct parse_test {
const char * address ;
int expected_result ;
} ;
AST_TEST_DEFINE ( parsing )
{
int res = AST_TEST_PASS ;
struct parse_test test_vals [ ] = {
{ " 192.168.1.0 " , 1 } ,
{ " 10.255.255.254 " , 1 } ,
{ " 172.18.5.4 " , 1 } ,
{ " 8.8.4.4 " , 1 } ,
{ " 0.0.0.0 " , 1 } ,
{ " 127.0.0.1 " , 1 } ,
{ " 1.256.3.4 " , 0 } ,
{ " 256.0.0.1 " , 0 } ,
{ " 1.2.3.4:5060 " , 1 } ,
{ " ::ffff:5.6.7.8 " , 1 } ,
{ " fdf8:f53b:82e4::53 " , 1 } ,
{ " fe80::200:5aee:feaa:20a2 " , 1 } ,
{ " 2001::1 " , 1 } ,
{ " 2001:0000:4136:e378:8000:63bf:3fff:fdd2 " , 1 } ,
{ " 2001:0002:6c::430 " , 1 } ,
{ " 2001:10:240:ab::a " , 1 } ,
{ " 2002:cb0a:3cdd:1::1 " , 1 } ,
{ " 2001:db8:8:4::2 " , 1 } , /* Documentation only, should never be used */
{ " ff01:0:0:0:0:0:0:2 " , 1 } , /* Multicast */
{ " [fdf8:f53b:82e4::53] " , 1 } ,
{ " [fe80::200:5aee:feaa:20a2] " , 1 } ,
{ " [2001::1] " , 1 } ,
{ " [2001:0000:4136:e378:8000:63bf:3fff:fdd2]:5060 " , 1 } ,
{ " 2001:0000:4136:e378:8000:63bf:3fff:fdd2:5060 " , 0 } , /* port, but no brackets */
2011-08-12 16:32:24 +00:00
{ " fe80::200::abcd " , 0 } , /* multiple zero expansions */
2011-06-22 19:12:24 +00:00
} ;
size_t x ;
struct ast_sockaddr addr = { { 0 , 0 , } } ;
int parse_result ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " parsing " ;
info - > category = " /main/netsock2/ " ;
info - > summary = " netsock2 parsing unit test " ;
info - > description =
" Test parsing of IPv4 and IPv6 network addresses " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
for ( x = 0 ; x < ARRAY_LEN ( test_vals ) ; x + + ) {
if ( ( parse_result = ast_sockaddr_parse ( & addr , test_vals [ x ] . address , 0 ) ) ! = test_vals [ x ] . expected_result ) {
ast_test_status_update ( test , " On '%s' expected %d but got %d \n " , test_vals [ x ] . address , test_vals [ x ] . expected_result , parse_result ) ;
res = AST_TEST_FAIL ;
}
if ( parse_result ) {
struct ast_sockaddr tmp_addr = { { 0 , 0 , } } ;
const char * tmp ;
tmp = ast_sockaddr_stringify ( & addr ) ;
ast_sockaddr_parse ( & tmp_addr , tmp , 0 ) ;
if ( ast_sockaddr_cmp_addr ( & addr , & tmp_addr ) ) {
2011-07-08 16:00:46 +00:00
char buf [ 64 ] ;
ast_copy_string ( buf , ast_sockaddr_stringify ( & addr ) , sizeof ( buf ) ) ;
ast_test_status_update ( test , " Re-parsed stringification of '%s' did not match: '%s' vs '%s' \n " , test_vals [ x ] . address , buf , ast_sockaddr_stringify ( & tmp_addr ) ) ;
2011-06-22 19:12:24 +00:00
res = AST_TEST_FAIL ;
}
}
}
return res ;
}
2011-11-09 19:31:27 +00:00
AST_TEST_DEFINE ( split_hostport )
{
int res = AST_TEST_PASS ;
char * host , * port , buf [ 128 ] ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " split_hostport " ;
info - > category = " /main/netsock2/ " ;
info - > summary = " netsock2 ast_sockaddr_split_hostport() unit test " ;
info - > description =
" Test splitting of IPv4 and IPv6 host:port strings " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
/* Assumes res, host, and port variables */
# define TEST_SPLIT_HOSTPORT(str, flags, expected_host, expected_port, expected_result) { \
int __res ; \
ast_copy_string ( buf , str , sizeof ( buf ) ) ; \
if ( ( __res = ast_sockaddr_split_hostport ( buf , & host , & port , flags ) ) ! = expected_result | | ( \
expected_result & & ( \
strcmp ( host , expected_host ) | | ( \
ast_strlen_zero ( expected_port ) ? ! ast_strlen_zero ( port ) : ( ! ast_strlen_zero ( port ) & & strcmp ( port , expected_port ) ) \
) \
) \
) \
) { \
res = AST_TEST_FAIL ; \
if ( __res ! = expected_result ) { \
ast_test_status_update ( test , " Expected %d, got %d \n " , expected_result , __res ) ; \
} else { \
ast_test_status_update ( test , " Failed parsing '%s' into expected host '%s' (got '%s') and port '%s' (got '%s') \n " , \
str , S_OR ( expected_host , " " ) , host , expected_port , S_OR ( port , " " ) ) ; \
} \
} \
}
/* Test various situations with flags = 0 */
TEST_SPLIT_HOSTPORT ( " 192.168.1.1 " , 0 , " 192.168.1.1 " , " " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " 192.168.1.1:5060 " , 0 , " 192.168.1.1 " , " 5060 " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " ::ffff:5.6.7.8 " , 0 , " ::ffff:5.6.7.8 " , " " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " [::ffff:5.6.7.8]:5060 " , 0 , " ::ffff:5.6.7.8 " , " 5060 " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " fdf8:f53b:82e4::53 " , 0 , " fdf8:f53b:82e4::53 " , " " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " fe80::200:5aee:feaa:20a2 " , 0 , " fe80::200:5aee:feaa:20a2 " , " " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " [fdf8:f53b:82e4::53] " , 0 , " fdf8:f53b:82e4::53 " , " " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " [fe80::200:5aee:feaa:20a2]:5060 " , 0 , " fe80::200:5aee:feaa:20a2 " , " 5060 " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " host:port " , 0 , " host " , " port " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " host " , 0 , " host " , " " , 1 ) ;
/* Make sure that flag conditions work when they should */
TEST_SPLIT_HOSTPORT ( " 192.168.1.1:5060 " , PARSE_PORT_IGNORE , " 192.168.1.1 " , " " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " 192.168.1.1:5060 " , PARSE_PORT_REQUIRE , " 192.168.1.1 " , " 5060 " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " 192.168.1.1 " , PARSE_PORT_FORBID , " 192.168.1.1 " , " " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " [::ffff:5.6.7.8]:5060 " , PARSE_PORT_IGNORE , " ::ffff:5.6.7.8 " , " " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " [::ffff:5.6.7.8]:5060 " , PARSE_PORT_REQUIRE , " ::ffff:5.6.7.8 " , " 5060 " , 1 ) ;
TEST_SPLIT_HOSTPORT ( " ::ffff:5.6.7.8 " , PARSE_PORT_FORBID , " ::ffff:5.6.7.8 " , " " , 1 ) ;
/* Make sure it fails when flag requirements are not met */
TEST_SPLIT_HOSTPORT ( " 192.168.1.1 " , PARSE_PORT_REQUIRE , " <undefined> " , " <undefined> " , 0 ) ;
TEST_SPLIT_HOSTPORT ( " 192.168.1.1:5060 " , PARSE_PORT_FORBID , " <undefined> " , " <undefined> " , 0 ) ;
TEST_SPLIT_HOSTPORT ( " ::ffff:5.6.7.8 " , PARSE_PORT_REQUIRE , " <undefined> " , " <undefined> " , 0 ) ;
TEST_SPLIT_HOSTPORT ( " [::ffff:5.6.7.8]:5060 " , PARSE_PORT_FORBID , " <undefined> " , " <undefined> " , 0 ) ;
return res ;
}
2011-06-22 19:12:24 +00:00
static int unload_module ( void )
{
AST_TEST_UNREGISTER ( parsing ) ;
2011-11-09 19:31:27 +00:00
AST_TEST_UNREGISTER ( split_hostport ) ;
2011-06-22 19:12:24 +00:00
return 0 ;
}
static int load_module ( void )
{
AST_TEST_REGISTER ( parsing ) ;
2011-11-09 19:31:27 +00:00
AST_TEST_REGISTER ( split_hostport ) ;
2011-06-22 19:12:24 +00:00
return AST_MODULE_LOAD_SUCCESS ;
}
AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY , " Netsock2 test module " ) ;