From bb3792a8a7aeec996988be241927960a45e867ea Mon Sep 17 00:00:00 2001 From: Jeff Peeler Date: Tue, 2 Mar 2010 18:22:05 +0000 Subject: Add new application VMSayName for use with voicemail. VMSayName that will play the recorded name of the voicemail user if it exists, otherwise will play the mailbox number. A unit test has been written to verify correct functionality called test_voicemail_vmsayname. (closes issue #14973) Reported by: ghjm Review: https://reviewboard.asterisk.org/r/530/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@249889 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_voicemail.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 148 insertions(+), 3 deletions(-) (limited to 'apps/app_voicemail.c') diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index 61594fb9e..085451ac5 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -302,6 +302,21 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") mailbox. + + + Play the name of a voicemail user + + + + + + + + + This application will say the recorded name of the voicemail user specified as the + argument to this application. If no context is provided, default is assumed. + + Tell if a mailbox is configured. @@ -730,6 +745,8 @@ static char *app2 = "VoiceMailMain"; static char *app3 = "MailboxExists"; static char *app4 = "VMAuthenticate"; +static char *sayname_app = "VMSayName"; + static AST_LIST_HEAD_STATIC(users, ast_vm_user); static AST_LIST_HEAD_STATIC(zones, vm_zone); static char zonetag[80]; @@ -11593,6 +11610,126 @@ static int write_password_to_file(const char *secretfn, const char *password) { return 0; } +static int vmsayname_exec(struct ast_channel *chan, const char *data) +{ + char *context; + char *args_copy; + int res; + + if (ast_strlen_zero(data)) { + ast_log(LOG_WARNING, "VMSayName requires argument mailbox@context"); + return -1; + } + + args_copy = ast_strdupa(data); + if ((context = strchr(args_copy, '@'))) { + *context++ = '\0'; + } else { + context = "default"; + } + + if ((res = sayname(chan, args_copy, context) < 0)) { + ast_debug(3, "Greeting not found for '%s@%s', falling back to mailbox number.\n", args_copy, context); + res = ast_stream_and_wait(chan, "vm-extension", AST_DIGIT_ANY); + if (!res) { + res = ast_say_character_str(chan, args_copy, AST_DIGIT_ANY, chan->language); + } + } + + return res; +} + +#ifdef TEST_FRAMEWORK +static int fake_write(struct ast_channel *ast, struct ast_frame *frame) +{ + return 0; +} + +static struct ast_frame *fake_read(struct ast_channel *ast) +{ + return &ast_null_frame; +} + +AST_TEST_DEFINE(test_voicemail_vmsayname) +{ + char dir[PATH_MAX]; + char dir2[PATH_MAX]; + static const char TEST_CONTEXT[] = "very_long_unique_context_so_that_nobody_will_ever_have_the_same_one_configured_3141592653"; + static const char TEST_EXTENSION[] = "1234"; + + struct ast_channel *test_channel1 = NULL; + int res = -1; + + static const struct ast_channel_tech fake_tech = { + .write = fake_write, + .read = fake_read, + }; + + switch (cmd) { + case TEST_INIT: + info->name = "vmsayname_exec"; + info->category = "apps/app_voicemail/"; + info->summary = "Vmsayname unit test"; + info->description = + "This tests passing various parameters to vmsayname"; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + if (!(test_channel1 = ast_channel_alloc(0, AST_STATE_DOWN, NULL, NULL, NULL, + NULL, NULL, 0, 0, "TestChannel1"))) { + goto exit_vmsayname_test; + } + + /* normally this is done in the channel driver */ + test_channel1->nativeformats = AST_FORMAT_GSM; + test_channel1->writeformat = AST_FORMAT_GSM; + test_channel1->rawwriteformat = AST_FORMAT_GSM; + test_channel1->readformat = AST_FORMAT_GSM; + test_channel1->rawreadformat = AST_FORMAT_GSM; + test_channel1->tech = &fake_tech; + + ast_test_status_update(test, "Test playing of extension when greeting is not available...\n"); + snprintf(dir, sizeof(dir), "%s@%s", TEST_EXTENSION, TEST_CONTEXT); /* not a dir, don't get confused */ + if (!(res = vmsayname_exec(test_channel1, dir))) { + snprintf(dir, sizeof(dir), "%s%s/%s/greet", VM_SPOOL_DIR, TEST_CONTEXT, TEST_EXTENSION); + if (ast_fileexists(dir, NULL, NULL)) { + ast_test_status_update(test, "This should not happen, most likely means clean up from previous test failed\n"); + res = -1; + goto exit_vmsayname_test; + } else { + /* no greeting already exists as expected, let's create one to fully test sayname */ + if ((res = create_dirpath(dir, sizeof(dir), TEST_CONTEXT, TEST_EXTENSION, ""))) { + ast_log(AST_LOG_WARNING, "Failed to make test directory\n"); + goto exit_vmsayname_test; + } + snprintf(dir, sizeof(dir), "%s/sounds/beep.gsm", ast_config_AST_VAR_DIR); + snprintf(dir2, sizeof(dir2), "%s%s/%s/greet.gsm", VM_SPOOL_DIR, TEST_CONTEXT, TEST_EXTENSION); + /* we're not going to hear the sound anyway, just use a valid gsm audio file */ + symlink(dir, dir2); + ast_test_status_update(test, "Test playing created mailbox greeting...\n"); + snprintf(dir, sizeof(dir), "%s@%s", TEST_EXTENSION, TEST_CONTEXT); /* not a dir, don't get confused */ + res = vmsayname_exec(test_channel1, dir); + + /* TODO: there may be a better way to do this */ + unlink(dir2); + snprintf(dir2, sizeof(dir2), "%s%s/%s", VM_SPOOL_DIR, TEST_CONTEXT, TEST_EXTENSION); + rmdir(dir2); + snprintf(dir2, sizeof(dir2), "%s%s", VM_SPOOL_DIR, TEST_CONTEXT); + rmdir(dir2); + } + } + +exit_vmsayname_test: + + if (test_channel1) { + ast_hangup(test_channel1); + } + + return res ? AST_TEST_FAIL : AST_TEST_PASS; +} + AST_TEST_DEFINE(test_voicemail_msgcount) { int i, j, res = AST_TEST_PASS, syserr; @@ -11755,6 +11892,7 @@ AST_TEST_DEFINE(test_voicemail_msgcount) return res; } +#endif static int reload(void) { @@ -11771,6 +11909,10 @@ static int unload_module(void) res |= ast_unregister_application(app4); res |= ast_custom_function_unregister(&mailbox_exists_acf); res |= ast_manager_unregister("VoicemailUsersList"); +#ifdef TEST_FRAMEWORK + res |= AST_TEST_UNREGISTER(test_voicemail_vmsayname); + res |= AST_TEST_UNREGISTER(test_voicemail_msgcount); +#endif ast_cli_unregister_multiple(cli_voicemail, ARRAY_LEN(cli_voicemail)); ast_uninstall_vm_functions(); ao2_ref(inprocess_container, -1); @@ -11784,7 +11926,6 @@ static int unload_module(void) free_vm_users(); free_vm_zones(); - AST_TEST_UNREGISTER(test_voicemail_msgcount); return res; } @@ -11812,8 +11953,14 @@ static int load_module(void) res |= ast_register_application_xml(app2, vm_execmain); res |= ast_register_application_xml(app3, vm_box_exists); res |= ast_register_application_xml(app4, vmauthenticate); + res |= ast_register_application_xml(sayname_app, vmsayname_exec); res |= ast_custom_function_register(&mailbox_exists_acf); res |= ast_manager_register_xml("VoicemailUsersList", EVENT_FLAG_CALL | EVENT_FLAG_REPORTING, manager_list_voicemail_users); +#ifdef TEST_FRAMEWORK + res |= AST_TEST_REGISTER(test_voicemail_vmsayname); + res |= AST_TEST_REGISTER(test_voicemail_msgcount); +#endif + if (res) return res; @@ -11823,8 +11970,6 @@ static int load_module(void) ast_realtime_require_field("voicemail", "uniqueid", RQ_UINTEGER3, 11, "password", RQ_CHAR, 10, SENTINEL); ast_realtime_require_field("voicemail_data", "filename", RQ_CHAR, 30, "duration", RQ_UINTEGER3, 5, SENTINEL); - AST_TEST_REGISTER(test_voicemail_msgcount); - return res; } -- cgit v1.2.3