Skip to content
Snippets Groups Projects
test_voicemail_api.c 60.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • 	VM_API_SNAPSHOT_CREATE("test_vm_api_1234", "default", "Family", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    	test_vm_api_update_test_snapshots(test_mbox_snapshot);
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    
    	VM_API_STRING_FIELD_VERIFY("Family", test_snapshots[0]->folder_name);
    	VM_API_STRING_FIELD_VERIFY("Family", test_snapshots[1]->folder_name);
    	VM_API_INT_VERIFY(0, test_snapshots[1]->msg_number);
    	VM_API_INT_VERIFY(1, test_snapshots[0]->msg_number);
    
    
    	/* Move both of the 2345 messages to Family */
    	ast_test_status_update(test, "Test move of test_vm_api_2345 messages from Inbox to Family\n");
    	VM_API_MOVE_MESSAGE("test_vm_api_2345", "default", 2, "INBOX", multi_msg_ids, "Family");
    
    	/* Take a snapshot and update the test snapshots for verification */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_2345", "default", "Family", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    	test_vm_api_update_test_snapshots(test_mbox_snapshot);
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    
    	VM_API_STRING_FIELD_VERIFY("Family", test_snapshots[2]->folder_name);
    	VM_API_STRING_FIELD_VERIFY("Family", test_snapshots[3]->folder_name);
    
    
    	ast_test_status_update(test, "Test move of test_vm_api_2345 message from Family to INBOX\n");
    	VM_API_MOVE_MESSAGE("test_vm_api_2345", "default", 2, "Family", multi_msg_ids, "INBOX");
    
    	VM_API_SNAPSHOT_CREATE("test_vm_api_2345", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    	test_vm_api_update_test_snapshots(test_mbox_snapshot);
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    
    	VM_API_STRING_FIELD_VERIFY("INBOX", test_snapshots[2]->folder_name);
    	VM_API_STRING_FIELD_VERIFY("INBOX", test_snapshots[3]->folder_name);
    
    
    	VM_API_TEST_CLEANUP;
    
    	return AST_TEST_PASS;
    }
    
    AST_TEST_DEFINE(voicemail_api_off_nominal_move)
    {
    	const char *inbox_msg_id;
    	const char *multi_msg_ids[4];
    
    	switch (cmd) {
    	case TEST_INIT:
    		info->name = "off_nominal_move";
    		info->category = "/main/voicemail_api/";
    		info->summary = "Off nominal mailbox message move tests";
    		info->description =
    			"Test nominal requests to move a voicemail to a different"
    			" folder.  This includes testing the following:\n"
    			" * Moving to a non-existent mailbox\n"
    			" * Moving to a NULL mailbox\n"
    			" * Moving to a non-existent context\n"
    			" * Moving to/from non-existent folder\n"
    			" * Moving to/from NULL folder\n"
    
    			" * Invalid message identifier(s)";
    
    		return AST_TEST_NOT_RUN;
    	case TEST_EXECUTE:
    		break;
    	}
    
    	VM_API_TEST_SETUP;
    
    	inbox_msg_id = test_snapshots[1]->msg_id;
    
    	multi_msg_ids[0] = test_snapshots[0]->msg_id;
    	multi_msg_ids[1] = test_snapshots[1]->msg_id;
    	multi_msg_ids[2] = test_snapshots[2]->msg_id;
    	multi_msg_ids[3] = test_snapshots[3]->msg_id;
    
    	ast_test_status_update(test, "Test move attempt for invalid mailbox test_vm_3456\n");
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL("test_vm_api_3456", "default", 1, "INBOX", &inbox_msg_id, "Family");
    
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL(NULL, "default", 1, "INBOX", &inbox_msg_id, "Family");
    
    	ast_test_status_update(test, "Test move attempt for invalid context test_vm_api_defunct\n");
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "test_vm_api_defunct", 1, "INBOX", &inbox_msg_id, "Family");
    
    	ast_test_status_update(test, "Test move attempt to invalid folder\n");
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 1, "INBOX", &inbox_msg_id, "SPAMALOT");
    
    	ast_test_status_update(test, "Test move attempt from invalid folder\n");
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 1, "MEATINACAN", &inbox_msg_id, "Family");
    
    	ast_test_status_update(test, "Test move attempt to NULL folder\n");
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 1, "INBOX", &inbox_msg_id, NULL);
    
    	ast_test_status_update(test, "Test move attempt from NULL folder\n");
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 1, NULL, &inbox_msg_id, "Family");
    
    	ast_test_status_update(test, "Test move attempt with non-existent message number\n");
    	inbox_msg_id = "6";
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 1, "INBOX", &inbox_msg_id, "Family");
    
    	ast_test_status_update(test, "Test move attempt with invalid message number\n");
    	inbox_msg_id = "";
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 1, "INBOX", &inbox_msg_id, "Family");
    
    	ast_test_status_update(test, "Test move attempt with 0 number of messages\n");
    	inbox_msg_id = test_snapshots[1]->msg_id;
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 0, "INBOX", &inbox_msg_id, "Family");
    
    	ast_test_status_update(test, "Test move attempt with invalid number of messages\n");
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", -30, "INBOX", &inbox_msg_id, "Family");
    
    	ast_test_status_update(test, "Test move attempt with non-existent multiple messages, where some messages exist\n");
    	VM_API_MOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 4, "INBOX", multi_msg_ids, "Family");
    
    	VM_API_TEST_CLEANUP;
    
    	return AST_TEST_PASS;
    }
    
    AST_TEST_DEFINE(voicemail_api_nominal_remove)
    {
    	struct ast_vm_mailbox_snapshot *test_mbox_snapshot = NULL;
    	const char *inbox_msg_id;
    	const char *old_msg_id;
    	const char *multi_msg_ids[2];
    
    	switch (cmd) {
    	case TEST_INIT:
    		info->name = "nominal_remove";
    		info->category = "/main/voicemail_api/";
    		info->summary = "Nominal mailbox remove message tests";
    		info->description =
    			"Tests removing messages from voicemail folders.  Includes"
    			" both removing messages one at a time, and in a set";
    		return AST_TEST_NOT_RUN;
    	case TEST_EXECUTE:
    		break;
    	}
    
    	VM_API_TEST_SETUP;
    
    	old_msg_id = test_snapshots[0]->msg_id;
    	inbox_msg_id = test_snapshots[1]->msg_id;
    
    	multi_msg_ids[0] = test_snapshots[2]->msg_id;
    	multi_msg_ids[1] = test_snapshots[3]->msg_id;
    
    	ast_test_status_update(test, "Test removing a single message from INBOX\n");
    	VM_API_REMOVE_MESSAGE("test_vm_api_1234", "default", 1, "INBOX", &inbox_msg_id);
    
    	ast_test_status_update(test, "Test removing a single message from Old\n");
    	VM_API_REMOVE_MESSAGE("test_vm_api_1234", "default", 1, "Old", &old_msg_id);
    
    	ast_test_status_update(test, "Test removing multiple messages from INBOX\n");
    	VM_API_REMOVE_MESSAGE("test_vm_api_2345", "default", 2, "INBOX", multi_msg_ids);
    
    	VM_API_TEST_CLEANUP;
    
    	return AST_TEST_PASS;
    }
    
    AST_TEST_DEFINE(voicemail_api_off_nominal_remove)
    {
    	const char *inbox_msg_id;
    	const char *multi_msg_ids[2];
    	const char *empty_msg_ids[] = { };
    
    	switch (cmd) {
    	case TEST_INIT:
    		info->name = "off_nominal_remove";
    		info->category = "/main/voicemail_api/";
    		info->summary = "Off nominal mailbox message removal tests";
    		info->description =
    			"Test off nominal requests for removing messages from "
    			"a mailbox.  This includes:\n"
    			" * Removing messages with an invalid mailbox\n"
    			" * Removing messages from a NULL mailbox\n"
    			" * Removing messages from an invalid context\n"
    			" * Removing messages from an invalid folder\n"
    			" * Removing messages from a NULL folder\n"
    
    			" * Removing messages with bad identifiers";
    
    		return AST_TEST_NOT_RUN;
    	case TEST_EXECUTE:
    		break;
    	}
    
    	VM_API_TEST_SETUP;
    
    	inbox_msg_id = test_snapshots[1]->msg_id;
    	multi_msg_ids[0] = test_snapshots[2]->msg_id;
    	multi_msg_ids[1] = test_snapshots[3]->msg_id;
    
    	ast_test_status_update(test, "Test removing a single message with an invalid mailbox\n");
    	VM_API_REMOVE_MESSAGE_OFF_NOMINAL("test_vm_api_3456", "default", 1, "INBOX", &inbox_msg_id);
    
    	ast_test_status_update(test, "Test removing a single message with a NULL mailbox\n");
    	VM_API_REMOVE_MESSAGE_OFF_NOMINAL(NULL, "default", 1, "INBOX", &inbox_msg_id);
    
    	ast_test_status_update(test, "Test removing a single message with an invalid context\n");
    	VM_API_REMOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "defunct", 1, "INBOX", &inbox_msg_id);
    
    	ast_test_status_update(test, "Test removing a single message with an invalid folder\n");
    	VM_API_REMOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 1, "SPAMINACAN", &inbox_msg_id);
    
    	ast_test_status_update(test, "Test removing a single message with a NULL folder\n");
    	VM_API_REMOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 1, NULL, &inbox_msg_id);
    
    	ast_test_status_update(test, "Test removing a single message with an invalid message number\n");
    	inbox_msg_id = "POOPOO";
    	VM_API_REMOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 1, "INBOX", &inbox_msg_id);
    
    	ast_test_status_update(test, "Test removing multiple messages with a single invalid message number\n");
    	multi_msg_ids[1] = "POOPOO";
    	VM_API_REMOVE_MESSAGE_OFF_NOMINAL("test_vm_api_2345", "default", 2, "INBOX", multi_msg_ids);
    
    	ast_test_status_update(test, "Test removing no messages with no message numbers\n");
    	VM_API_REMOVE_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", 0, "INBOX", empty_msg_ids);
    
    	ast_test_status_update(test, "Test removing multiple messages with an invalid size specifier\n");
    	VM_API_REMOVE_MESSAGE_OFF_NOMINAL("test_vm_api_2345", "default", -30, "INBOX", multi_msg_ids);
    
    	VM_API_TEST_CLEANUP;
    
    	return AST_TEST_PASS;
    }
    
    AST_TEST_DEFINE(voicemail_api_nominal_forward)
    {
    	struct ast_vm_mailbox_snapshot *test_mbox_snapshot = NULL;
    	const char *inbox_msg_id;
    	const char *multi_msg_ids[2];
    
    	switch (cmd) {
    	case TEST_INIT:
    		info->name = "nominal_forward";
    		info->category = "/main/voicemail_api/";
    		info->summary = "Nominal message forward tests";
    		info->description =
    			"Tests the nominal cases of forwarding messages"
    			" between mailboxes";
    		return AST_TEST_NOT_RUN;
    	case TEST_EXECUTE:
    		break;
    	}
    
    	VM_API_TEST_SETUP;
    
    	inbox_msg_id = test_snapshots[1]->msg_id;
    
    	multi_msg_ids[0] = test_snapshots[2]->msg_id;
    	multi_msg_ids[1] = test_snapshots[3]->msg_id;
    
    	ast_test_status_update(test, "Test forwarding message 0 from test_vm_api_1234 INBOX to test_vm_api_2345 INBOX\n");
    	VM_API_FORWARD_MESSAGE("test_vm_api_1234", "default", "INBOX", "test_vm_api_2345", "default", "INBOX", 1, &inbox_msg_id, 0);
    
    	/* Make sure we didn't delete the message */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_1234", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(1, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	/* We should now have a total of 3 messages in test_vm_api_2345 INBOX */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_2345", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(3, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	ast_test_status_update(test, "Test forwarding message 0 from test_vm_api_1234 INBOX with default context to test_vm_api_2345 INBOX\n");
    	VM_API_FORWARD_MESSAGE("test_vm_api_1234", NULL, "INBOX", "test_vm_api_2345", "default", "INBOX", 1, &inbox_msg_id, 0);
    
    	/* Make sure we didn't delete the message */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_1234", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(1, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	/* We should now have a total of 4 messages in test_vm_api_2345 INBOX */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_2345", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(4, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	ast_test_status_update(test, "Test forwarding message 0 from test_vm_api_1234 INBOX to test_vm_api_2345 INBOX with default context\n");
    	VM_API_FORWARD_MESSAGE("test_vm_api_1234", "default", "INBOX", "test_vm_api_2345", NULL, "INBOX", 1, &inbox_msg_id, 0);
    
    	/* Make sure we didn't delete the message */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_1234", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(1, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	/* We should now have a total of 5 messages in test_vm_api_2345 INBOX */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_2345", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(5, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	ast_test_status_update(test, "Test forwarding message 0 from test_vm_api_1234 INBOX to test_vm_api_2345 INBOX, deleting original\n");
    	VM_API_FORWARD_MESSAGE("test_vm_api_1234", "default", "INBOX", "test_vm_api_2345", NULL, "INBOX", 1, &inbox_msg_id, 1);
    
    	/* Make sure we deleted the message */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_1234", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(0, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	/* We should now have a total of 6 messages in test_vm_api_2345 INBOX */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_2345", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(6, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	ast_test_status_update(test, "Test forwarding 2 messages from test_vm_api_2345 INBOX to test_vm_api_1234 INBOX");
    	VM_API_FORWARD_MESSAGE("test_vm_api_2345", "default", "INBOX", "test_vm_api_1234", "default", "INBOX", 2, multi_msg_ids, 0);
    
    	/* Make sure we didn't delete the messages */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_2345", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(6, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	/* We should now have a total of 2 messages in test_vm_api_1234 INBOX */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_1234", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(2, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	ast_test_status_update(test, "Test forwarding 2 messages from test_vm_api_2345 INBOX to test_vm_api_1234 Family, deleting original\n");
    	VM_API_FORWARD_MESSAGE("test_vm_api_2345", "default", "INBOX", "test_vm_api_1234", "default", "Family", 2, multi_msg_ids, 1);
    	/* Make sure we deleted the messages */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_2345", "default", "INBOX", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(4, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	/* We should now have a total of 2 messages in test_vm_api_1234 Family */
    	VM_API_SNAPSHOT_CREATE("test_vm_api_1234", "default", "Family", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(2, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	VM_API_TEST_CLEANUP;
    
    	return AST_TEST_PASS;
    }
    
    AST_TEST_DEFINE(voicemail_api_off_nominal_forward)
    {
    	const char *inbox_msg_id;
    	const char *multi_msg_ids[4];
    
    	const char *empty_msg_ids[] = { };
    
    	switch (cmd) {
    	case TEST_INIT:
    		info->name = "off_nominal_forward";
    		info->category = "/main/voicemail_api/";
    		info->summary = "Off nominal message forwarding tests";
    		info->description =
    			"Test off nominal forwarding of messages.  This includes:\n"
    			" * Invalid/NULL from mailbox\n"
    			" * Invalid from context\n"
    			" * Invalid/NULL from folder\n"
    			" * Invalid/NULL to mailbox\n"
    			" * Invalid to context\n"
    			" * Invalid/NULL to folder\n"
    			" * Invalid message numbers\n"
    
    			" * Invalid number of messages";
    
    		return AST_TEST_NOT_RUN;
    	case TEST_EXECUTE:
    		break;
    	}
    
    	VM_API_TEST_SETUP;
    
    	inbox_msg_id = test_snapshots[1]->msg_id;
    
    	multi_msg_ids[0] = test_snapshots[0]->msg_id;
    	multi_msg_ids[1] = test_snapshots[1]->msg_id;
    	multi_msg_ids[2] = test_snapshots[2]->msg_id;
    	multi_msg_ids[3] = test_snapshots[3]->msg_id;
    
    	ast_test_status_update(test, "Test forwarding from an invalid mailbox\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_3456", "default", "INBOX", "test_vm_api_2345", "default", "INBOX", 1, &inbox_msg_id, 0);
    
    	ast_test_status_update(test, "Test forwarding from a NULL mailbox\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL(NULL, "default", "INBOX", "test_vm_api_2345", "default", "INBOX", 1, &inbox_msg_id, 0);
    
    	ast_test_status_update(test, "Test forwarding from an invalid context\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "defunct", "INBOX", "test_vm_api_2345", "default", "INBOX", 1, &inbox_msg_id, 0);
    
    	ast_test_status_update(test, "Test forwarding from an invalid folder\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", "POTTEDMEAT", "test_vm_api_2345", "default", "INBOX", 1, &inbox_msg_id, 0);
    
    	ast_test_status_update(test, "Test forwarding from a NULL folder\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", NULL, "test_vm_api_2345", "default", "INBOX", 1, &inbox_msg_id, 0);
    
    	ast_test_status_update(test, "Test forwarding to an invalid mailbox\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", "INBOX", "test_vm_api_3456", "default", "INBOX", 1, &inbox_msg_id, 0);
    
    	ast_test_status_update(test, "Test forwarding to a NULL mailbox\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", "INBOX", NULL, "default", "INBOX", 1, &inbox_msg_id, 0);
    
    	ast_test_status_update(test, "Test forwarding to an invalid context\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", "INBOX", "test_vm_api_2345", "defunct", "INBOX", 1, &inbox_msg_id, 0);
    
    	ast_test_status_update(test, "Test forwarding to an invalid folder\n");
    
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", "INBOX", "test_vm_api_2345", "default", "POTTEDMEAT", 1, &inbox_msg_id, 0);
    
    	ast_test_status_update(test, "Test forwarding to a NULL folder\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", "INBOX", "test_vm_api_2345", "default", NULL, 1, &inbox_msg_id, 0);
    
    	ast_test_status_update(test, "Test forwarding when no messages are select\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", "INBOX", "test_vm_api_2345", "default", "INBOX", 0, empty_msg_ids, 0);
    
    	ast_test_status_update(test, "Test forwarding a message that doesn't exist\n");
    	inbox_msg_id = "POOPOO";
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", "INBOX", "test_vm_api_2345", "default", "INBOX", 1, &inbox_msg_id, 0);
    
    	ast_test_status_update(test, "Test forwarding multiple messages, where some messages don't exist\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_2345", "default", "INBOX", "test_vm_api_1234", "default", "INBOX", 4, multi_msg_ids, 0);
    
    	ast_test_status_update(test, "Test forwarding a message with an invalid size specifier\n");
    	VM_API_FORWARD_MESSAGE_OFF_NOMINAL("test_vm_api_1234", "default", "INBOX", "test_vm_api_2345", "default", "INBOX", -30, &inbox_msg_id, 0);
    
    	VM_API_TEST_CLEANUP;
    
    	return AST_TEST_PASS;
    }
    
    AST_TEST_DEFINE(voicemail_api_nominal_msg_playback)
    {
    	struct ast_vm_mailbox_snapshot *test_mbox_snapshot = NULL;
    	struct ast_channel *test_channel;
    	const char *message_id_1234;
    	const char *message_id_2345[2];
    
    	switch (cmd) {
    	case TEST_INIT:
    		info->name = "nominal_msg_playback";
    		info->category = "/main/voicemail_api/";
    		info->summary = "Nominal message playback";
    		info->description =
    			"Tests playing back a message on a provided"
    
    			" channel or callback function";
    
    		return AST_TEST_NOT_RUN;
    	case TEST_EXECUTE:
    		break;
    	}
    
    	VM_API_TEST_SETUP;
    
    	message_id_1234 = test_snapshots[1]->msg_id;
    	message_id_2345[0] = test_snapshots[2]->msg_id;
    	message_id_2345[1] = test_snapshots[3]->msg_id;
    
    	if (!(test_channel = test_vm_api_create_mock_channel())) {
    		ast_log(AST_LOG_ERROR, "Failed to create mock channel for testing\n");
    		VM_API_TEST_CLEANUP;
    		return AST_TEST_FAIL;
    	}
    
    	ast_test_status_update(test, "Playing back message from test_vm_api_1234 to mock channel\n");
    	VM_API_PLAYBACK_MESSAGE(test_channel, "test_vm_api_1234", "default", "INBOX", message_id_1234, NULL);
    
    	ast_test_status_update(test, "Playing back message from test_vm_api_2345 to callback function\n");
    	VM_API_PLAYBACK_MESSAGE(test_channel, "test_vm_api_2345", "default", "INBOX", message_id_2345[0], &message_playback_callback_fn);
    
    	VM_API_INT_VERIFY(1, global_entered_playback_callback);
    
    	global_entered_playback_callback = 0;
    
    	ast_test_status_update(test, "Playing back message from test_vm_api_2345 to callback function with default context\n");
    	VM_API_PLAYBACK_MESSAGE(test_channel, "test_vm_api_2345", NULL, "INBOX", message_id_2345[1], &message_playback_callback_fn);
    
    	VM_API_INT_VERIFY(1, global_entered_playback_callback);
    
    	global_entered_playback_callback = 0;
    
    	VM_API_SNAPSHOT_CREATE("test_vm_api_1234", "default", "Old", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(2, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    	VM_API_SNAPSHOT_CREATE("test_vm_api_2345", "default", "Old", 0, AST_VM_SNAPSHOT_SORT_BY_TIME, 0);
    
    	VM_API_INT_VERIFY(2, test_mbox_snapshot->total_msg_num);
    
    	test_mbox_snapshot = ast_vm_mailbox_snapshot_destroy(test_mbox_snapshot);
    
    
    	ast_hangup(test_channel);
    
    	VM_API_TEST_CLEANUP;
    
    	return AST_TEST_PASS;
    }
    
    AST_TEST_DEFINE(voicemail_api_off_nominal_msg_playback)
    {
    	struct ast_channel *test_channel;
    	const char *msg_id;
    	const char *invalid_msg_id = "POOPOO";
    
    	switch (cmd) {
    	case TEST_INIT:
    		info->name = "off_nominal_msg_playback";
    		info->category = "/main/voicemail_api/";
    		info->summary = "Off nominal message playback";
    		info->description =
    			"Tests off nominal conditions in playing back a "
    			"message.  This includes:\n"
    			" * Invalid/NULL mailbox\n"
    			" * Invalid context\n"
    			" * Invalid/NULL folder\n"
    
    			" * Invalid message identifiers";
    
    		return AST_TEST_NOT_RUN;
    	case TEST_EXECUTE:
    		break;
    	}
    
    	VM_API_TEST_SETUP;
    	msg_id = test_snapshots[0]->msg_id;
    
    	if (!(test_channel = test_vm_api_create_mock_channel())) {
    		ast_log(AST_LOG_ERROR, "Failed to create mock channel for testing\n");
    		VM_API_TEST_CLEANUP;
    		return AST_TEST_FAIL;
    	}
    
    	ast_test_status_update(test, "Playing back message from invalid mailbox\n");
    	VM_API_PLAYBACK_MESSAGE_OFF_NOMINAL(test_channel, "test_vm_api_3456", "default", "INBOX", msg_id, NULL);
    
    	ast_test_status_update(test, "Playing back message from NULL mailbox\n");
    	VM_API_PLAYBACK_MESSAGE_OFF_NOMINAL(test_channel, NULL, "default", "INBOX", msg_id, NULL);
    
    	ast_test_status_update(test, "Playing back message from invalid context\n");
    	VM_API_PLAYBACK_MESSAGE_OFF_NOMINAL(test_channel, "test_vm_api_1234", "defunct", "INBOX", msg_id, NULL);
    
    	ast_test_status_update(test, "Playing back message from invalid folder\n");
    	VM_API_PLAYBACK_MESSAGE_OFF_NOMINAL(test_channel, "test_vm_api_1234", "default", "BACON", msg_id, NULL);
    
    	ast_test_status_update(test, "Playing back message from NULL folder\n");
    	VM_API_PLAYBACK_MESSAGE_OFF_NOMINAL(test_channel, "test_vm_api_1234", "default",  NULL, msg_id, NULL);
    
    	ast_test_status_update(test, "Playing back message with invalid message specifier\n");
    	VM_API_PLAYBACK_MESSAGE_OFF_NOMINAL(test_channel, "test_vm_api_1234", "default", "INBOX", invalid_msg_id, NULL);
    
    	ast_test_status_update(test, "Playing back message with NULL message specifier\n");
    	VM_API_PLAYBACK_MESSAGE_OFF_NOMINAL(test_channel, "test_vm_api_1234", "default", "INBOX", NULL, NULL);
    
    	ast_hangup(test_channel);
    
    	VM_API_TEST_CLEANUP;
    
    	return AST_TEST_PASS;
    }
    
    static int unload_module(void)
    {
    	/* Snapshot tests */
    	AST_TEST_UNREGISTER(voicemail_api_nominal_snapshot);
    	AST_TEST_UNREGISTER(voicemail_api_off_nominal_snapshot);
    
    	/* Move Tests */
    	AST_TEST_UNREGISTER(voicemail_api_nominal_move);
    	AST_TEST_UNREGISTER(voicemail_api_off_nominal_move);
    
    	/* Remove Tests */
    	AST_TEST_UNREGISTER(voicemail_api_nominal_remove);
    	AST_TEST_UNREGISTER(voicemail_api_off_nominal_remove);
    
    	/* Forward Tests */
    	AST_TEST_UNREGISTER(voicemail_api_nominal_forward);
    	AST_TEST_UNREGISTER(voicemail_api_off_nominal_forward);
    
    	/* Message Playback Tests */
    	AST_TEST_UNREGISTER(voicemail_api_nominal_msg_playback);
    	AST_TEST_UNREGISTER(voicemail_api_off_nominal_msg_playback);
    	return 0;
    }
    
    static int load_module(void)
    {
    	/* Snapshot tests */
    	AST_TEST_REGISTER(voicemail_api_nominal_snapshot);
    	AST_TEST_REGISTER(voicemail_api_off_nominal_snapshot);
    
    	/* Move Tests */
    	AST_TEST_REGISTER(voicemail_api_nominal_move);
    	AST_TEST_REGISTER(voicemail_api_off_nominal_move);
    
    	/* Remove Tests */
    	AST_TEST_REGISTER(voicemail_api_nominal_remove);
    	AST_TEST_REGISTER(voicemail_api_off_nominal_remove);
    
    	/* Forward Tests */
    	AST_TEST_REGISTER(voicemail_api_nominal_forward);
    	AST_TEST_REGISTER(voicemail_api_off_nominal_forward);
    
    	/* Message Playback Tests */
    	AST_TEST_REGISTER(voicemail_api_nominal_msg_playback);
    	AST_TEST_REGISTER(voicemail_api_off_nominal_msg_playback);
    
    	return AST_MODULE_LOAD_SUCCESS;
    }
    
    AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Core Voicemail API Tests");