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