@ -36,6 +36,7 @@
# include "asterisk/stream.h"
# include "asterisk/format.h"
# include "asterisk/format_cap.h"
# include "asterisk/format_cache.h"
AST_TEST_DEFINE ( stream_create )
{
@ -222,6 +223,394 @@ AST_TEST_DEFINE(stream_set_state)
return AST_TEST_PASS ;
}
AST_TEST_DEFINE ( stream_topology_create )
{
RAII_VAR ( struct ast_stream_topology * , topology , NULL , ast_stream_topology_destroy ) ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " stream_topology_create " ;
info - > category = " /main/stream/ " ;
info - > summary = " stream topology creation unit test " ;
info - > description =
" Test that creating a stream topology works " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
topology = ast_stream_topology_create ( ) ;
if ( ! topology ) {
ast_test_status_update ( test , " Failed to create media stream topology \n " ) ;
return AST_TEST_FAIL ;
}
return AST_TEST_PASS ;
}
AST_TEST_DEFINE ( stream_topology_clone )
{
RAII_VAR ( struct ast_stream_topology * , topology , NULL , ast_stream_topology_destroy ) ;
RAII_VAR ( struct ast_stream_topology * , cloned , NULL , ast_stream_topology_destroy ) ;
struct ast_stream * audio_stream , * video_stream ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " stream_topology_clone " ;
info - > category = " /main/stream/ " ;
info - > summary = " stream topology cloning unit test " ;
info - > description =
" Test that cloning a stream topology results in a clone with the same contents " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
topology = ast_stream_topology_create ( ) ;
if ( ! topology ) {
ast_test_status_update ( test , " Failed to create media stream topology \n " ) ;
return AST_TEST_FAIL ;
}
audio_stream = ast_stream_create ( " audio " , AST_MEDIA_TYPE_AUDIO ) ;
if ( ! audio_stream ) {
ast_test_status_update ( test , " Failed to create an audio stream for testing stream topology \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_append_stream ( topology , audio_stream ) = = - 1 ) {
ast_test_status_update ( test , " Failed to append valid audio stream to stream topology \n " ) ;
ast_stream_destroy ( audio_stream ) ;
return AST_TEST_FAIL ;
}
video_stream = ast_stream_create ( " video " , AST_MEDIA_TYPE_VIDEO ) ;
if ( ! video_stream ) {
ast_test_status_update ( test , " Failed to create a video stream for testing stream topology \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_append_stream ( topology , video_stream ) = = - 1 ) {
ast_test_status_update ( test , " Failed to append valid video stream to stream topology \n " ) ;
ast_stream_destroy ( video_stream ) ;
return AST_TEST_FAIL ;
}
cloned = ast_stream_topology_clone ( topology ) ;
if ( ! cloned ) {
ast_test_status_update ( test , " Failed to clone a perfectly good stream topology \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_count ( cloned ) ! = ast_stream_topology_get_count ( topology ) ) {
ast_test_status_update ( test , " Cloned stream topology does not contain same number of streams as original \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_get_type ( ast_stream_topology_get_stream ( cloned , 0 ) ) ! = ast_stream_get_type ( ast_stream_topology_get_stream ( topology , 0 ) ) ) {
ast_test_status_update ( test , " Cloned audio stream does not contain same type as original \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_get_type ( ast_stream_topology_get_stream ( cloned , 1 ) ) ! = ast_stream_get_type ( ast_stream_topology_get_stream ( topology , 1 ) ) ) {
ast_test_status_update ( test , " Cloned video stream does not contain same type as original \n " ) ;
return AST_TEST_FAIL ;
}
return AST_TEST_PASS ;
}
AST_TEST_DEFINE ( stream_topology_append_stream )
{
RAII_VAR ( struct ast_stream_topology * , topology , NULL , ast_stream_topology_destroy ) ;
struct ast_stream * audio_stream , * video_stream ;
int position ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " stream_topology_append_stream " ;
info - > category = " /main/stream/ " ;
info - > summary = " stream topology stream appending unit test " ;
info - > description =
" Test that appending streams to a stream topology works " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
topology = ast_stream_topology_create ( ) ;
if ( ! topology ) {
ast_test_status_update ( test , " Failed to create media stream topology \n " ) ;
return AST_TEST_FAIL ;
}
audio_stream = ast_stream_create ( " audio " , AST_MEDIA_TYPE_AUDIO ) ;
if ( ! audio_stream ) {
ast_test_status_update ( test , " Failed to create an audio stream for testing stream topology \n " ) ;
return AST_TEST_FAIL ;
}
position = ast_stream_topology_append_stream ( topology , audio_stream ) ;
if ( position = = - 1 ) {
ast_test_status_update ( test , " Failed to append valid audio stream to stream topology \n " ) ;
ast_stream_destroy ( audio_stream ) ;
return AST_TEST_FAIL ;
} else if ( position ! = 0 ) {
ast_test_status_update ( test , " Appended audio stream to stream topology but position is '%d' instead of 0 \n " ,
position ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_count ( topology ) ! = 1 ) {
ast_test_status_update ( test , " Appended an audio stream to the stream topology but stream count is '%d' on it, not 1 \n " ,
ast_stream_topology_get_count ( topology ) ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_stream ( topology , 0 ) ! = audio_stream ) {
ast_test_status_update ( test , " Appended an audio stream to the stream topology but returned stream doesn't match \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_get_position ( audio_stream ) ! = 0 ) {
ast_test_status_update ( test , " Appended audio stream says it is at position '%d' instead of 0 \n " ,
ast_stream_get_position ( audio_stream ) ) ;
return AST_TEST_FAIL ;
}
video_stream = ast_stream_create ( " video " , AST_MEDIA_TYPE_VIDEO ) ;
if ( ! video_stream ) {
ast_test_status_update ( test , " Failed to create a video stream for testing stream topology \n " ) ;
return AST_TEST_FAIL ;
}
position = ast_stream_topology_append_stream ( topology , video_stream ) ;
if ( position = = - 1 ) {
ast_test_status_update ( test , " Failed to append valid video stream to stream topology \n " ) ;
ast_stream_destroy ( video_stream ) ;
return AST_TEST_FAIL ;
} else if ( position ! = 1 ) {
ast_test_status_update ( test , " Appended video stream to stream topology but position is '%d' instead of 1 \n " ,
position ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_count ( topology ) ! = 2 ) {
ast_test_status_update ( test , " Appended a video stream to the stream topology but stream count is '%d' on it, not 2 \n " ,
ast_stream_topology_get_count ( topology ) ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_stream ( topology , 1 ) ! = video_stream ) {
ast_test_status_update ( test , " Appended a video stream to the stream topology but returned stream doesn't match \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_get_position ( video_stream ) ! = 1 ) {
ast_test_status_update ( test , " Appended video stream says it is at position '%d' instead of 1 \n " ,
ast_stream_get_position ( video_stream ) ) ;
return AST_TEST_FAIL ;
}
return AST_TEST_PASS ;
}
AST_TEST_DEFINE ( stream_topology_set_stream )
{
RAII_VAR ( struct ast_stream_topology * , topology , NULL , ast_stream_topology_destroy ) ;
struct ast_stream * audio_stream , * video_stream ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " stream_topology_set_stream " ;
info - > category = " /main/stream/ " ;
info - > summary = " stream topology stream setting unit test " ;
info - > description =
" Test that setting streams at a specific position in a topology works " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
topology = ast_stream_topology_create ( ) ;
if ( ! topology ) {
ast_test_status_update ( test , " Failed to create media stream topology \n " ) ;
return AST_TEST_FAIL ;
}
audio_stream = ast_stream_create ( " audio " , AST_MEDIA_TYPE_AUDIO ) ;
if ( ! audio_stream ) {
ast_test_status_update ( test , " Failed to create an audio stream for testing stream topology \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_set_stream ( topology , 0 , audio_stream ) ) {
ast_test_status_update ( test , " Failed to set an audio stream to a position where it is permitted \n " ) ;
ast_stream_destroy ( audio_stream ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_count ( topology ) ! = 1 ) {
ast_test_status_update ( test , " Set an audio stream on the stream topology but stream count is '%d' on it, not 1 \n " ,
ast_stream_topology_get_count ( topology ) ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_stream ( topology , 0 ) ! = audio_stream ) {
ast_test_status_update ( test , " Set an audio stream on the stream topology but returned stream doesn't match \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_get_position ( audio_stream ) ! = 0 ) {
ast_test_status_update ( test , " Set audio stream says it is at position '%d' instead of 0 \n " ,
ast_stream_get_position ( audio_stream ) ) ;
return AST_TEST_FAIL ;
}
video_stream = ast_stream_create ( " video " , AST_MEDIA_TYPE_VIDEO ) ;
if ( ! video_stream ) {
ast_test_status_update ( test , " Failed to create a video stream for testing stream topology \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_set_stream ( topology , 0 , video_stream ) ) {
ast_test_status_update ( test , " Failed to set a video stream to a position where it is permitted \n " ) ;
ast_stream_destroy ( video_stream ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_count ( topology ) ! = 1 ) {
ast_test_status_update ( test , " Set a video stream on the stream topology but stream count is '%d' on it, not 1 \n " ,
ast_stream_topology_get_count ( topology ) ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_stream ( topology , 0 ) ! = video_stream ) {
ast_test_status_update ( test , " Set a video stream on the stream topology but returned stream doesn't match \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_get_position ( video_stream ) ! = 0 ) {
ast_test_status_update ( test , " Set video stream says it is at position '%d' instead of 0 \n " ,
ast_stream_get_position ( video_stream ) ) ;
return AST_TEST_FAIL ;
}
audio_stream = ast_stream_create ( " audio " , AST_MEDIA_TYPE_AUDIO ) ;
if ( ! audio_stream ) {
ast_test_status_update ( test , " Failed to create an audio stream for testing stream topology \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_set_stream ( topology , 1 , audio_stream ) ) {
ast_test_status_update ( test , " Failed to set an audio stream to a position where it is permitted \n " ) ;
ast_stream_destroy ( audio_stream ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_count ( topology ) ! = 2 ) {
ast_test_status_update ( test , " Set an audio stream on the stream topology but stream count is '%d' on it, not 2 \n " ,
ast_stream_topology_get_count ( topology ) ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_stream ( topology , 1 ) ! = audio_stream ) {
ast_test_status_update ( test , " Set an audio stream on the stream topology but returned stream doesn't match \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_get_position ( audio_stream ) ! = 1 ) {
ast_test_status_update ( test , " Set audio stream says it is at position '%d' instead of 1 \n " ,
ast_stream_get_position ( audio_stream ) ) ;
return AST_TEST_FAIL ;
}
return AST_TEST_PASS ;
}
AST_TEST_DEFINE ( stream_topology_create_from_format_cap )
{
RAII_VAR ( struct ast_stream_topology * , topology , NULL , ast_stream_topology_destroy ) ;
RAII_VAR ( struct ast_format_cap * , caps , NULL , ao2_cleanup ) ;
switch ( cmd ) {
case TEST_INIT :
info - > name = " stream_topology_create_from_format_cap " ;
info - > category = " /main/stream/ " ;
info - > summary = " stream topology creation from format capabilities unit test " ;
info - > description =
" Test that creating a stream topology from format capabilities results in the expected streams " ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
caps = ast_format_cap_alloc ( AST_FORMAT_CAP_FLAG_DEFAULT ) ;
if ( ! caps ) {
ast_test_status_update ( test , " Could not allocate an empty format capabilities structure \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_format_cap_append ( caps , ast_format_ulaw , 0 ) ) {
ast_test_status_update ( test , " Failed to append a ulaw format to capabilities for stream topology creation \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_format_cap_append ( caps , ast_format_alaw , 0 ) ) {
ast_test_status_update ( test , " Failed to append an alaw format to capabilities for stream topology creation \n " ) ;
return AST_TEST_FAIL ;
}
topology = ast_stream_topology_create_from_format_cap ( caps ) ;
if ( ! topology ) {
ast_test_status_update ( test , " Failed to create a stream topology using a perfectly good format capabilities \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_count ( topology ) ! = 1 ) {
ast_test_status_update ( test , " Expected a stream topology with 1 stream but it has %d streams \n " ,
ast_stream_topology_get_count ( topology ) ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_get_type ( ast_stream_topology_get_stream ( topology , 0 ) ) ! = AST_MEDIA_TYPE_AUDIO ) {
ast_test_status_update ( test , " Produced stream topology has a single stream of type %s instead of audio \n " ,
ast_codec_media_type2str ( ast_stream_get_type ( ast_stream_topology_get_stream ( topology , 0 ) ) ) ) ;
return AST_TEST_FAIL ;
}
ast_stream_topology_destroy ( topology ) ;
topology = NULL ;
ast_format_cap_append ( caps , ast_format_h264 , 0 ) ;
topology = ast_stream_topology_create_from_format_cap ( caps ) ;
if ( ! topology ) {
ast_test_status_update ( test , " Failed to create a stream topology using a perfectly good format capabilities \n " ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_topology_get_count ( topology ) ! = 2 ) {
ast_test_status_update ( test , " Expected a stream topology with 2 streams but it has %d streams \n " ,
ast_stream_topology_get_count ( topology ) ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_get_type ( ast_stream_topology_get_stream ( topology , 0 ) ) ! = AST_MEDIA_TYPE_AUDIO ) {
ast_test_status_update ( test , " Produced stream topology has a first stream of type %s instead of audio \n " ,
ast_codec_media_type2str ( ast_stream_get_type ( ast_stream_topology_get_stream ( topology , 0 ) ) ) ) ;
return AST_TEST_FAIL ;
}
if ( ast_stream_get_type ( ast_stream_topology_get_stream ( topology , 1 ) ) ! = AST_MEDIA_TYPE_VIDEO ) {
ast_test_status_update ( test , " Produced stream topology has a second stream of type %s instead of video \n " ,
ast_codec_media_type2str ( ast_stream_get_type ( ast_stream_topology_get_stream ( topology , 1 ) ) ) ) ;
return AST_TEST_FAIL ;
}
return AST_TEST_PASS ;
}
static int unload_module ( void )
{
AST_TEST_UNREGISTER ( stream_create ) ;
@ -229,6 +618,12 @@ static int unload_module(void)
AST_TEST_UNREGISTER ( stream_set_type ) ;
AST_TEST_UNREGISTER ( stream_set_formats ) ;
AST_TEST_UNREGISTER ( stream_set_state ) ;
AST_TEST_UNREGISTER ( stream_topology_create ) ;
AST_TEST_UNREGISTER ( stream_topology_clone ) ;
AST_TEST_UNREGISTER ( stream_topology_clone ) ;
AST_TEST_UNREGISTER ( stream_topology_append_stream ) ;
AST_TEST_UNREGISTER ( stream_topology_set_stream ) ;
AST_TEST_UNREGISTER ( stream_topology_create_from_format_cap ) ;
return 0 ;
}
@ -239,6 +634,11 @@ static int load_module(void)
AST_TEST_REGISTER ( stream_set_type ) ;
AST_TEST_REGISTER ( stream_set_formats ) ;
AST_TEST_REGISTER ( stream_set_state ) ;
AST_TEST_REGISTER ( stream_topology_create ) ;
AST_TEST_REGISTER ( stream_topology_clone ) ;
AST_TEST_REGISTER ( stream_topology_append_stream ) ;
AST_TEST_REGISTER ( stream_topology_set_stream ) ;
AST_TEST_REGISTER ( stream_topology_create_from_format_cap ) ;
return AST_MODULE_LOAD_SUCCESS ;
}