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>
2020-03-24 12:43:37 +01:00
<depend>res_agi</depend>
<depend>res_crypto</depend>
<depend>crypto</depend>
2011-08-16 20:15:23 +00:00
<support_level>core</support_level>
2010-01-26 16:30:08 +00:00
***/
#include "asterisk.h"
#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"
2013-07-03 17:58:45 +00:00
#include <sys/stat.h>
2010-01-26 16:30:08 +00:00
AST_TEST_DEFINE ( uri_encode_decode_test )
{
int res = AST_TEST_PASS ;
const char * in = "abcdefghijklmnopurstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 ~`!@#$%^&*()_-+={[}]| \\ :; \" '<,>.?/" ;
char out [ 256 ] = { 0 };
2011-01-24 18:59:22 +00:00
char small [ 4 ] = { 0 };
const struct ast_flags none = { 0 };
int i = 0 ;
static struct {
const char * spec_str ;
struct ast_flags spec ;
char * buf ;
size_t buflen ;
const char * input ;
const char * output ;
const char * decoded_output ;
} tests [ 5 ];
#define INIT_ENCODE_TEST(s, buffer, in, out, dec_out) do { \
if (i < ARRAY_LEN(tests)) { \
tests[i].spec_str = #s; \
tests[i].spec = s; \
tests[i].buf = buffer; \
tests[i].buflen = sizeof(buffer); \
tests[i].input = in; \
tests[i].output = out; \
tests[i].decoded_output = dec_out; \
i++; \
} else { \
ast_test_status_update(test, "error: 'tests' array too small\n"); \
res = AST_TEST_FAIL; \
} \
} while (0)
INIT_ENCODE_TEST ( ast_uri_http , out , in ,
"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" , in );
INIT_ENCODE_TEST ( ast_uri_http_legacy , out , in ,
"abcdefghijklmnopurstuvwxyz+ABCDEFGHIJKLMNOPQRSTUVWXYZ+1234567890+~%60!%40%23%24%25%5E%26*()_-%2B%3D%7B%5B%7D%5D%7C%5C%3A%3B%22'%3C%2C%3E.%3F%2F" , in );
INIT_ENCODE_TEST ( ast_uri_sip_user , out , in ,
"abcdefghijklmnopurstuvwxyz%20ABCDEFGHIJKLMNOPQRSTUVWXYZ%201234567890%20~%60!%40%23$%25%5E&*()_-+=%7B%5B%7D%5D%7C%5C%3A;%22'%3C,%3E.?/" , in );
INIT_ENCODE_TEST ( none , small , in , "%61" , "a" );
INIT_ENCODE_TEST ( ast_uri_http , small , in , "abc" , "abc" );
2010-01-26 16:30:08 +00:00
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 ;
}
2011-01-24 18:59:22 +00:00
for ( i = 0 ; i < ARRAY_LEN ( tests ); i ++ ) {
ast_uri_encode ( tests [ i ]. input , tests [ i ]. buf , tests [ i ]. buflen , tests [ i ]. spec );
if ( strcmp ( tests [ i ]. output , tests [ i ]. buf )) {
ast_test_status_update ( test , "encoding with %s did not match expected output, FAIL \n " , tests [ i ]. spec_str );
ast_test_status_update ( test , "original: %s \n " , tests [ i ]. input );
ast_test_status_update ( test , "expected: %s \n " , tests [ i ]. output );
ast_test_status_update ( test , "result: %s \n " , tests [ i ]. buf );
res = AST_TEST_FAIL ;
continue ;
}
2010-01-26 16:30:08 +00:00
2011-01-24 18:59:22 +00:00
ast_uri_decode ( tests [ i ]. buf , tests [ i ]. spec );
if ( strcmp ( tests [ i ]. decoded_output , tests [ i ]. buf )) {
ast_test_status_update ( test , "decoding with %s did not match the original input (or expected decoded output) \n " , tests [ i ]. spec_str );
ast_test_status_update ( test , "original: %s \n " , tests [ i ]. input );
ast_test_status_update ( test , "expected: %s \n " , tests [ i ]. decoded_output );
ast_test_status_update ( test , "decoded: %s \n " , tests [ i ]. buf );
res = AST_TEST_FAIL ;
}
2010-01-26 16:30:08 +00:00
}
2011-01-24 18:59:22 +00:00
return res ;
}
2010-01-26 16:30:08 +00:00
2011-01-24 18:59:22 +00:00
AST_TEST_DEFINE ( quoted_escape_test )
{
int res = AST_TEST_PASS ;
const char * in = "a \" bcdefg \" hijkl \\ mnopqrs tuv \t wxyz" ;
int i ;
2023-06-09 08:41:32 -06:00
#define LONG_SIZE 256
#define SHORT_SIZE 4
2011-01-24 18:59:22 +00:00
static struct {
char * buf ;
const size_t buflen ;
const char * output ;
} tests [] = {
2023-06-09 08:41:32 -06:00
{ NULL , LONG_SIZE ,
2011-01-24 18:59:22 +00:00
"a \\\" bcdefg \\\" hijkl \\\\ mnopqrs tuv \t wxyz" },
2023-06-09 08:41:32 -06:00
{ NULL , SHORT_SIZE ,
2011-01-24 18:59:22 +00:00
"a \\\" " },
};
2023-06-09 08:41:32 -06:00
tests [ 0 ]. buf = ast_alloca ( LONG_SIZE );
tests [ 1 ]. buf = ast_alloca ( SHORT_SIZE );
2011-01-24 18:59:22 +00:00
switch ( cmd ) {
case TEST_INIT :
info -> name = "quoted_escape_test" ;
info -> category = "/main/utils/" ;
info -> summary = "escape a quoted string" ;
info -> description = "Escape a string to be quoted and check the result." ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
2010-01-26 16:30:08 +00:00
}
2011-01-24 18:59:22 +00:00
for ( i = 0 ; i < ARRAY_LEN ( tests ); i ++ ) {
ast_escape_quoted ( in , tests [ i ]. buf , tests [ i ]. buflen );
if ( strcmp ( tests [ i ]. output , tests [ i ]. buf )) {
ast_test_status_update ( test , "ESCAPED DOES NOT MATCH EXPECTED, FAIL \n " );
ast_test_status_update ( test , "original: %s \n " , in );
ast_test_status_update ( test , "expected: %s \n " , tests [ i ]. output );
ast_test_status_update ( test , "result: %s \n " , tests [ i ]. buf );
res = AST_TEST_FAIL ;
}
2010-02-09 23:32:14 +00:00
}
2023-06-09 08:41:32 -06:00
#undef LONG_SIZE
#undef SHORT_SIZE
2010-02-09 23:32:14 +00:00
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 ++ ) {
2014-01-03 21:13:30 +00:00
char md5_hash [ 33 ];
2010-02-09 23:32:14 +00:00
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 ;
}
return ast_crypto_loaded () ? AST_TEST_PASS : AST_TEST_FAIL ;
}
AST_TEST_DEFINE ( adsi_loaded_test )
{
2012-02-23 01:53:17 +00:00
struct ast_channel * c ;
int res ;
2010-07-14 20:48:59 +00:00
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 ;
}
2019-09-04 16:19:55 -05:00
if ( ! ast_module_check ( "res_adsi.so" )) {
ast_test_status_update ( test , "This test skipped because deprecated module res_adsi.so is not built by default. \n " );
return AST_TEST_PASS ;
}
2012-02-23 01:53:17 +00:00
if ( ! ( c = ast_dummy_channel_alloc ())) {
return AST_TEST_FAIL ;
}
ast_channel_adsicpe_set ( c , AST_ADSI_AVAILABLE );
res = ast_adsi_available ( c ) ? AST_TEST_PASS : AST_TEST_FAIL ;
c = ast_channel_unref ( c );
return res ;
2010-07-14 20:48:59 +00:00
}
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 ;
}
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
2017-12-29 03:57:17 -05:00
ast_agi_unregister ( & noop_command );
2010-07-14 20:48:59 +00:00
return res ;
}
2010-03-02 23:38:29 +00:00
2013-07-03 17:58:45 +00:00
AST_TEST_DEFINE ( safe_mkdir_test )
{
char base_path [] = "/tmp/safe_mkdir.XXXXXX" ;
char path [ 80 ] = {};
int res ;
struct stat actual ;
switch ( cmd ) {
case TEST_INIT :
info -> name = __func__ ;
info -> category = "/main/utils/" ;
info -> summary = "Safe mkdir test" ;
info -> description =
"This test ensures that ast_safe_mkdir does what it is "
"supposed to" ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
if ( mkdtemp ( base_path ) == NULL ) {
ast_test_status_update ( test , "Failed to create tmpdir for test \n " );
return AST_TEST_FAIL ;
}
snprintf ( path , sizeof ( path ), "%s/should_work" , base_path );
res = ast_safe_mkdir ( base_path , path , 0777 );
ast_test_validate ( test , 0 == res );
res = stat ( path , & actual );
ast_test_validate ( test , 0 == res );
ast_test_validate ( test , S_ISDIR ( actual . st_mode ));
snprintf ( path , sizeof ( path ), "%s/should/also/work" , base_path );
res = ast_safe_mkdir ( base_path , path , 0777 );
ast_test_validate ( test , 0 == res );
res = stat ( path , & actual );
ast_test_validate ( test , 0 == res );
ast_test_validate ( test , S_ISDIR ( actual . st_mode ));
snprintf ( path , sizeof ( path ), "%s/even/this/../should/work" , base_path );
res = ast_safe_mkdir ( base_path , path , 0777 );
ast_test_validate ( test , 0 == res );
snprintf ( path , sizeof ( path ), "%s/even/should/work" , base_path );
res = stat ( path , & actual );
ast_test_validate ( test , 0 == res );
ast_test_validate ( test , S_ISDIR ( actual . st_mode ));
snprintf ( path , sizeof ( path ),
"%s/surprisingly/this/should//////////////////work" , base_path );
res = ast_safe_mkdir ( base_path , path , 0777 );
ast_test_validate ( test , 0 == res );
snprintf ( path , sizeof ( path ),
"%s/surprisingly/this/should/work" , base_path );
res = stat ( path , & actual );
ast_test_validate ( test , 0 == res );
ast_test_validate ( test , S_ISDIR ( actual . st_mode ));
snprintf ( path , sizeof ( path ), "/should_not_work" );
res = ast_safe_mkdir ( base_path , path , 0777 );
ast_test_validate ( test , 0 != res );
ast_test_validate ( test , EPERM == errno );
res = stat ( path , & actual );
ast_test_validate ( test , 0 != res );
ast_test_validate ( test , ENOENT == errno );
snprintf ( path , sizeof ( path ), "%s/../nor_should_this" , base_path );
res = ast_safe_mkdir ( base_path , path , 0777 );
ast_test_validate ( test , 0 != res );
ast_test_validate ( test , EPERM == errno );
strncpy ( path , "/tmp/nor_should_this" , sizeof ( path ));
res = stat ( path , & actual );
ast_test_validate ( test , 0 != res );
ast_test_validate ( test , ENOENT == errno );
snprintf ( path , sizeof ( path ),
"%s/this/especially/should/not/../../../../../work" , base_path );
res = ast_safe_mkdir ( base_path , path , 0777 );
ast_test_validate ( test , 0 != res );
ast_test_validate ( test , EPERM == errno );
strncpy ( path , "/tmp/work" , sizeof ( path ));
res = stat ( path , & actual );
ast_test_validate ( test , 0 != res );
ast_test_validate ( test , ENOENT == errno );
return AST_TEST_PASS ;
}
2013-07-03 16:32:00 +00:00
AST_TEST_DEFINE ( crypt_test )
{
RAII_VAR ( char * , password_crypted , NULL , ast_free );
RAII_VAR ( char * , blank_crypted , NULL , ast_free );
const char * password = "Passw0rd" ;
const char * not_a_password = "not-a-password" ;
switch ( cmd ) {
case TEST_INIT :
info -> name = "crypt_test" ;
info -> category = "/main/utils/" ;
info -> summary = "Test ast_crypt wrappers" ;
info -> description = "Verifies that the ast_crypt wrappers work as expected." ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
password_crypted = ast_crypt_encrypt ( password );
ast_test_validate ( test , NULL != password_crypted );
ast_test_validate ( test , 0 != strcmp ( password , password_crypted ));
ast_test_validate ( test , ast_crypt_validate ( password , password_crypted ));
ast_test_validate ( test ,
! ast_crypt_validate ( not_a_password , password_crypted ));
blank_crypted = ast_crypt_encrypt ( "" );
ast_test_validate ( test , NULL != blank_crypted );
ast_test_validate ( test , 0 != strcmp ( blank_crypted , "" ));
ast_test_validate ( test , ast_crypt_validate ( "" , blank_crypted ));
ast_test_validate ( test ,
! ast_crypt_validate ( not_a_password , blank_crypted ));
return AST_TEST_PASS ;
}
2014-08-27 15:39:35 +00:00
struct quote_set {
char * input ;
char * output ;
};
AST_TEST_DEFINE ( quote_mutation )
{
char escaped [ 64 ];
static const struct quote_set escape_sets [] = {
{ " \" string \" " , " \\\" string \\\" " },
{ " \" string" , " \\\" string" },
{ "string \" " , "string \\\" " },
{ "string" , "string" },
{ "str \" ing" , "str \\\" ing" },
{ " \" " , " \\\" " },
{ " \\\" " , " \\\\\\\" " },
};
int i ;
switch ( cmd ) {
case TEST_INIT :
info -> name = "quote_mutation" ;
info -> category = "/main/utils/" ;
info -> summary = "Test mutation of quotes in strings" ;
info -> description =
"This tests escaping and unescaping of quotes in strings to "
"verify that the original string is recovered." ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
for ( i = 0 ; i < ARRAY_LEN ( escape_sets ); i ++ ) {
ast_escape_quoted ( escape_sets [ i ]. input , escaped , sizeof ( escaped ));
if ( strcmp ( escaped , escape_sets [ i ]. output )) {
ast_test_status_update ( test ,
"Expected escaped string '%s' instead of '%s' \n " ,
escape_sets [ i ]. output , escaped );
return AST_TEST_FAIL ;
}
ast_unescape_quoted ( escaped );
if ( strcmp ( escaped , escape_sets [ i ]. input )) {
ast_test_status_update ( test ,
"Expected unescaped string '%s' instead of '%s' \n " ,
escape_sets [ i ]. input , escaped );
return AST_TEST_FAIL ;
}
}
return AST_TEST_PASS ;
}
AST_TEST_DEFINE ( quote_unescaping )
{
static const struct quote_set escape_sets [] = {
{ " \" string \" " , " \" string \" " },
{ " \\\" string \" " , " \" string \" " },
{ " \" string \\\" " , " \" string \" " },
{ "str \\ ing" , "string" },
{ "string \\ " , "string" },
{ " \\ string" , "string" },
};
int i ;
switch ( cmd ) {
case TEST_INIT :
info -> name = "quote_unescaping" ;
info -> category = "/main/utils/" ;
info -> summary = "Test unescaping of off-nominal strings" ;
info -> description =
"This tests unescaping of strings which contain a mix of "
"escaped and unescaped sequences." ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
for ( i = 0 ; i < ARRAY_LEN ( escape_sets ); i ++ ) {
RAII_VAR ( char * , escaped , ast_strdup ( escape_sets [ i ]. input ), ast_free );
ast_unescape_quoted ( escaped );
if ( strcmp ( escaped , escape_sets [ i ]. output )) {
ast_test_status_update ( test ,
"Expected unescaped string '%s' instead of '%s' \n " ,
escape_sets [ i ]. output , escaped );
return AST_TEST_FAIL ;
}
}
return AST_TEST_PASS ;
}
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 );
2011-01-24 18:59:22 +00:00
AST_TEST_UNREGISTER ( quoted_escape_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 );
2013-07-03 17:58:45 +00:00
AST_TEST_UNREGISTER ( safe_mkdir_test );
2013-07-03 16:32:00 +00:00
AST_TEST_UNREGISTER ( crypt_test );
2014-08-27 15:39:35 +00:00
AST_TEST_UNREGISTER ( quote_mutation );
AST_TEST_UNREGISTER ( quote_unescaping );
2010-01-26 16:30:08 +00:00
return 0 ;
}
static int load_module ( void )
{
AST_TEST_REGISTER ( uri_encode_decode_test );
2011-01-24 18:59:22 +00:00
AST_TEST_REGISTER ( quoted_escape_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 );
2013-07-03 17:58:45 +00:00
AST_TEST_REGISTER ( safe_mkdir_test );
2013-07-03 16:32:00 +00:00
AST_TEST_REGISTER ( crypt_test );
2014-08-27 15:39:35 +00:00
AST_TEST_REGISTER ( quote_mutation );
AST_TEST_REGISTER ( quote_unescaping );
2010-01-26 16:30:08 +00:00
return AST_MODULE_LOAD_SUCCESS ;
}
2018-01-18 10:01:26 -05:00
AST_MODULE_INFO ( ASTERISK_GPL_KEY , AST_MODFLAG_DEFAULT , "Utils test module" ,
. support_level = AST_MODULE_SUPPORT_CORE ,
. load = load_module ,
. unload = unload_module ,
. requires = "res_agi,res_crypto" ,
);