2010-01-26 16:30:08 +00:00
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2010, Digium, Inc.
*
* David Vossel <dvossel@digium.com>
2010-02-09 23:32:14 +00:00
* Russell Bryant <russell@digium.com>
2010-01-26 16:30:08 +00:00
*
* 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.
*/
2010-02-09 23:32:14 +00:00
/*!
* \file
2010-01-26 16:30:08 +00:00
* \brief Unit Tests for utils API
*
* \author David Vossel <dvossel@digium.com>
2010-02-09 23:32:14 +00:00
* \author Russell Bryant <russell@digium.com>
2010-01-26 16:30:08 +00:00
*/
/*** MODULEINFO
<depend>TEST_FRAMEWORK</depend>
***/
# include "asterisk.h"
ASTERISK_FILE_VERSION ( __FILE__ , " $Revision$ " ) ;
# include "asterisk/utils.h"
# include "asterisk/test.h"
2010-07-14 20:48:59 +00:00
# include "asterisk/crypto.h"
# include "asterisk/adsi.h"
# include "asterisk/agi.h"
# include "asterisk/channel.h"
2010-01-26 16:30:08 +00:00
# include "asterisk/module.h"
AST_TEST_DEFINE ( uri_encode_decode_test )
{
int res = AST_TEST_PASS ;
const char * in = " abcdefghijklmnopurstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 ~`!@#$%^&*()_-+={[}]| \\ :; \" '<,>.?/ " ;
const char * expected1 = " abcdefghijklmnopurstuvwxyz%20ABCDEFGHIJKLMNOPQRSTUVWXYZ%201234567890%20~%60!%40%23%24%25%5E%26*()_-%2B%3D%7B%5B%7D%5D%7C%5C%3A%3B%22'%3C%2C%3E.%3F%2F " ;
const char * expected2 = " abcdefghijklmnopurstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 ~`!@#$%25^&*()_-+={[}]| \\ :; \" '<,>.?/ " ;
char out [ 256 ] = { 0 } ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " uri_encode_decode_test " ;
2010-07-09 17:00:22 +00:00
info - > category = " /main/utils/ " ;
2010-01-26 16:30:08 +00:00
info - > summary = " encode and decode a hex escaped string " ;
info - > description = " encode a string, verify encoded string matches what we expect. Decode the encoded string, verify decoded string matches the original string. " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
2010-02-09 23:32:14 +00:00
ast_test_status_update ( test , " Input before executing ast_uri_encode: \n %s \n " , in ) ;
ast_test_status_update ( test , " Output expected for ast_uri_encode with enabling do_special_char: %s \n " , expected1 ) ;
ast_test_status_update ( test , " Output expected for ast_uri_encode with out enabling do_special_char: %s \n \n " , expected2 ) ;
2010-01-26 16:30:08 +00:00
/* Test with do_special_char enabled */
ast_uri_encode ( in , out , sizeof ( out ) , 1 ) ;
2010-02-09 23:32:14 +00:00
ast_test_status_update ( test , " Output after enabling do_special_char: \n %s \n " , out ) ;
2010-01-26 16:30:08 +00:00
if ( strcmp ( expected1 , out ) ) {
2010-02-09 23:32:14 +00:00
ast_test_status_update ( test , " ENCODE DOES NOT MATCH EXPECTED, FAIL \n " ) ;
2010-01-26 16:30:08 +00:00
res = AST_TEST_FAIL ;
}
/* Verify uri decode matches original */
ast_uri_decode ( out ) ;
if ( strcmp ( in , out ) ) {
2010-02-09 23:32:14 +00:00
ast_test_status_update ( test , " Decoded string did not match original input \n " ) ;
2010-01-26 16:30:08 +00:00
res = AST_TEST_FAIL ;
} else {
2010-02-09 23:32:14 +00:00
ast_test_status_update ( test , " Decoded string matched original input \n " ) ;
2010-01-26 16:30:08 +00:00
}
/* Test with do_special_char disabled */
out [ 0 ] = ' \0 ' ;
ast_uri_encode ( in , out , sizeof ( out ) , 0 ) ;
2010-02-09 23:32:14 +00:00
ast_test_status_update ( test , " Output after disabling do_special_char: %s \n " , out ) ;
2010-01-26 16:30:08 +00:00
if ( strcmp ( expected2 , out ) ) {
2010-02-09 23:32:14 +00:00
ast_test_status_update ( test , " ENCODE DOES NOT MATCH EXPECTED, FAIL \n " ) ;
2010-01-26 16:30:08 +00:00
res = AST_TEST_FAIL ;
}
/* Verify uri decode matches original */
ast_uri_decode ( out ) ;
if ( strcmp ( in , out ) ) {
2010-02-09 23:32:14 +00:00
ast_test_status_update ( test , " Decoded string did not match original input \n " ) ;
2010-01-26 16:30:08 +00:00
res = AST_TEST_FAIL ;
} else {
2010-02-09 23:32:14 +00:00
ast_test_status_update ( test , " Decoded string matched original input \n " ) ;
}
return res ;
}
AST_TEST_DEFINE ( md5_test )
{
static const struct {
const char * input ;
const char * expected_output ;
} tests [ ] = {
{ " apples " , " daeccf0ad3c1fc8c8015205c332f5b42 " } ,
{ " bananas " , " ec121ff80513ae58ed478d5c5787075b " } ,
{ " reallylongstringaboutgoatcheese " , " 0a2d9280d37e2e37545cfef6e7e4e890 " } ,
} ;
enum ast_test_result_state res = AST_TEST_PASS ;
int i ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " md5_test " ;
2010-07-09 17:00:22 +00:00
info - > category = " /main/utils/ " ;
2010-02-09 23:32:14 +00:00
info - > summary = " MD5 test " ;
info - > description =
" This test exercises MD5 calculations. "
" " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
ast_test_status_update ( test , " Testing MD5 ... \n " ) ;
for ( i = 0 ; i < ARRAY_LEN ( tests ) ; i + + ) {
char md5_hash [ 32 ] ;
ast_md5_hash ( md5_hash , tests [ i ] . input ) ;
if ( strcasecmp ( md5_hash , tests [ i ] . expected_output ) ) {
ast_test_status_update ( test ,
" input: '%s' hash: '%s' expected hash: '%s' \n " ,
tests [ i ] . input , md5_hash , tests [ i ] . expected_output ) ;
res = AST_TEST_FAIL ;
}
2010-01-26 16:30:08 +00:00
}
2010-02-09 23:32:14 +00:00
return res ;
}
AST_TEST_DEFINE ( sha1_test )
{
static const struct {
const char * input ;
const char * expected_output ;
} tests [ ] = {
{ " giraffe " ,
" fac8f1a31d2998734d6a5253e49876b8e6a08239 " } ,
{ " platypus " ,
" 1dfb21b7a4d35e90d943e3a16107ccbfabd064d5 " } ,
{ " ParastratiosphecomyiaStratiosphecomyioides " ,
" 58af4e8438676f2bd3c4d8df9e00ee7fe06945bb " } ,
} ;
enum ast_test_result_state res = AST_TEST_PASS ;
int i ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " sha1_test " ;
2010-07-09 17:00:22 +00:00
info - > category = " /main/utils/ " ;
2010-02-09 23:32:14 +00:00
info - > summary = " SHA1 test " ;
info - > description =
" This test exercises SHA1 calculations. "
" " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
ast_test_status_update ( test , " Testing SHA1 ... \n " ) ;
for ( i = 0 ; i < ARRAY_LEN ( tests ) ; i + + ) {
char sha1_hash [ 64 ] ;
ast_sha1_hash ( sha1_hash , tests [ i ] . input ) ;
if ( strcasecmp ( sha1_hash , tests [ i ] . expected_output ) ) {
ast_test_status_update ( test ,
" input: '%s' hash: '%s' expected hash: '%s' \n " ,
tests [ i ] . input , sha1_hash , tests [ i ] . expected_output ) ;
res = AST_TEST_FAIL ;
}
}
2010-01-26 16:30:08 +00:00
return res ;
}
2010-03-02 23:38:29 +00:00
AST_TEST_DEFINE ( base64_test )
{
static const struct {
const char * input ;
const char * decoded ;
} tests [ ] = {
{ " giraffe " ,
" Z2lyYWZmZQ== " } ,
{ " platypus " ,
" cGxhdHlwdXM= " } ,
{ " ParastratiosphecomyiaStratiosphecomyioides " ,
" UGFyYXN0cmF0aW9zcGhlY29teWlhU3RyYXRpb3NwaGVjb215aW9pZGVz " } ,
} ;
int i ;
enum ast_test_result_state res = AST_TEST_PASS ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " base64_test " ;
2010-07-09 17:00:22 +00:00
info - > category = " /main/utils/ " ;
2010-03-02 23:38:29 +00:00
info - > summary = " base64 test " ;
info - > description = " This test exercises the base64 conversions. " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
for ( i = 0 ; i < ARRAY_LEN ( tests ) ; i + + ) {
char tmp [ 64 ] ;
ast_base64encode ( tmp , ( unsigned char * ) tests [ i ] . input , strlen ( tests [ i ] . input ) , sizeof ( tmp ) ) ;
if ( strcasecmp ( tmp , tests [ i ] . decoded ) ) {
ast_test_status_update ( test ,
" input: '%s' base64 output: '%s' expected base64 output: '%s' \n " ,
tests [ i ] . input , tmp , tests [ i ] . decoded ) ;
res = AST_TEST_FAIL ;
}
memset ( tmp , 0 , sizeof ( tmp ) ) ;
ast_base64decode ( ( unsigned char * ) tmp , tests [ i ] . decoded , ( sizeof ( tmp ) - 1 ) ) ;
if ( strcasecmp ( tmp , tests [ i ] . input ) ) {
ast_test_status_update ( test ,
" base64 input: '%s' output: '%s' expected output: '%s' \n " ,
tests [ i ] . decoded , tmp , tests [ i ] . input ) ;
res = AST_TEST_FAIL ;
}
}
return res ;
}
2010-07-14 20:48:59 +00:00
AST_TEST_DEFINE ( crypto_loaded_test )
{
switch ( cmd ) {
case TEST_INIT :
info - > name = " crypto_loaded_test " ;
info - > category = " /res/crypto/ " ;
info - > summary = " Crypto loaded into memory " ;
info - > description = " Verifies whether the crypto functions overrode the stubs " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
2010-09-28 18:20:20 +00:00
#if 0 /* Not defined on Solaris */
2010-07-14 20:48:59 +00:00
ast_test_status_update(test,
"address of __stub__ast_crypto_loaded is %p\n",
__stub__ast_crypto_loaded);
2010-07-16 04:23:02 +00:00
#ifndef HAVE_ATTRIBUTE_weak_import
2010-07-14 20:48:59 +00:00
ast_test_status_update(test,
"address of __ref__ast_crypto_loaded is %p\n",
__ref__ast_crypto_loaded);
2010-07-16 04:23:02 +00:00
#endif
2010-07-14 20:48:59 +00:00
ast_test_status_update(test,
"pointer to ast_crypto_loaded is %p\n",
ast_crypto_loaded);
2010-09-28 18:20:20 +00:00
#endif
2010-07-14 20:48:59 +00:00
return ast_crypto_loaded ( ) ? AST_TEST_PASS : AST_TEST_FAIL ;
}
AST_TEST_DEFINE ( adsi_loaded_test )
{
struct ast_channel c = { . adsicpe = AST_ADSI_AVAILABLE , } ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " adsi_loaded_test " ;
info - > category = " /res/adsi/ " ;
info - > summary = " ADSI loaded into memory " ;
info - > description = " Verifies whether the adsi functions overrode the stubs " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
return ast_adsi_available ( & c ) ? AST_TEST_PASS : AST_TEST_FAIL ;
}
static int handle_noop ( struct ast_channel * chan , AGI * agi , int arg , const char * const argv [ ] )
{
ast_agi_send ( agi - > fd , chan , " 200 result=0 \n " ) ;
return RESULT_SUCCESS ;
}
AST_TEST_DEFINE ( agi_loaded_test )
{
int res = AST_TEST_PASS ;
struct agi_command noop_command =
{ { " testnoop " , NULL } , handle_noop , NULL , NULL , 0 } ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " agi_loaded_test " ;
info - > category = " /res/agi/ " ;
info - > summary = " AGI loaded into memory " ;
info - > description = " Verifies whether the agi functions overrode the stubs " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
2010-09-28 18:20:20 +00:00
#if 0
2010-07-14 20:48:59 +00:00
ast_test_status_update(test,
"address of __stub__ast_agi_register is %p\n",
__stub__ast_agi_register);
2010-07-16 04:23:02 +00:00
#ifndef HAVE_ATTRIBUTE_weak_import
2010-07-14 20:48:59 +00:00
ast_test_status_update(test,
"address of __ref__ast_agi_register is %p\n",
__ref__ast_agi_register);
2010-07-16 04:23:02 +00:00
#endif
2010-07-14 20:48:59 +00:00
ast_test_status_update(test,
"pointer to ast_agi_register is %p\n",
ast_agi_register);
2010-09-28 18:20:20 +00:00
#endif
2010-07-14 20:48:59 +00:00
if ( ast_agi_register ( ast_module_info - > self , & noop_command ) = = AST_OPTIONAL_API_UNAVAILABLE ) {
2010-09-30 20:40:08 +00:00
ast_test_status_update ( test , " Unable to register testnoop command, because res_agi is not loaded. \n " ) ;
2010-07-14 20:48:59 +00:00
return AST_TEST_FAIL ;
}
# ifndef HAVE_NULLSAFE_PRINTF
/* Test for condition without actually crashing Asterisk */
if ( noop_command . usage = = NULL ) {
2010-09-30 20:40:08 +00:00
ast_test_status_update ( test , " AGI testnoop usage was not updated properly. \n " ) ;
2010-07-14 20:48:59 +00:00
res = AST_TEST_FAIL ;
}
if ( noop_command . syntax = = NULL ) {
2010-09-30 20:40:08 +00:00
ast_test_status_update ( test , " AGI testnoop syntax was not updated properly. \n " ) ;
2010-07-14 20:48:59 +00:00
res = AST_TEST_FAIL ;
}
# endif
ast_agi_unregister ( ast_module_info - > self , & noop_command ) ;
return res ;
}
2010-03-02 23:38:29 +00:00
2010-01-26 16:30:08 +00:00
static int unload_module ( void )
{
2010-02-08 23:34:01 +00:00
AST_TEST_UNREGISTER ( uri_encode_decode_test ) ;
2010-02-09 23:32:14 +00:00
AST_TEST_UNREGISTER ( md5_test ) ;
AST_TEST_UNREGISTER ( sha1_test ) ;
2010-03-02 23:38:29 +00:00
AST_TEST_UNREGISTER ( base64_test ) ;
2010-07-14 20:48:59 +00:00
AST_TEST_UNREGISTER ( crypto_loaded_test ) ;
AST_TEST_UNREGISTER ( adsi_loaded_test ) ;
AST_TEST_UNREGISTER ( agi_loaded_test ) ;
2010-01-26 16:30:08 +00:00
return 0 ;
}
static int load_module ( void )
{
AST_TEST_REGISTER ( uri_encode_decode_test ) ;
2010-02-09 23:32:14 +00:00
AST_TEST_REGISTER ( md5_test ) ;
AST_TEST_REGISTER ( sha1_test ) ;
2010-03-02 23:38:29 +00:00
AST_TEST_REGISTER ( base64_test ) ;
2010-07-14 20:48:59 +00:00
AST_TEST_REGISTER ( crypto_loaded_test ) ;
AST_TEST_REGISTER ( adsi_loaded_test ) ;
AST_TEST_REGISTER ( agi_loaded_test ) ;
2010-01-26 16:30:08 +00:00
return AST_MODULE_LOAD_SUCCESS ;
}
AST_MODULE_INFO_STANDARD ( ASTERISK_GPL_KEY , " Utils test module " ) ;