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"
# 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 ;
2016-06-09 08:20:33 -06:00
struct ast_sockaddr addr ;
2011-06-22 19:12:24 +00:00
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 + + ) {
2016-06-09 08:20:33 -06:00
memset ( & addr , 0 , sizeof ( addr ) ) ;
2011-06-22 19:12:24 +00:00
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 ) {
2016-06-09 08:20:33 -06:00
struct ast_sockaddr tmp_addr ;
2011-06-22 19:12:24 +00:00
const char * tmp ;
tmp = ast_sockaddr_stringify ( & addr ) ;
2016-06-09 08:20:33 -06:00
memset ( & tmp_addr , 0 , sizeof ( tmp_addr ) ) ;
2011-06-22 19:12:24 +00:00
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 " ) ;