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" );