diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 4975ca8feb..87b09e5406 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -3180,7 +3180,6 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void if (!sofia_glue_init_sql(profile)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Cannot Open SQL Database [%s]!\n", profile->name); sofia_profile_start_failure(profile, profile->name); - sofia_glue_del_profile(profile); goto end; } @@ -3332,7 +3331,6 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void } sofia_profile_start_failure(profile, profile->name); - sofia_glue_del_profile(profile); goto end; } @@ -3500,6 +3498,20 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void } } + /* Do gateway cleanups */ + sofia_glue_del_every_gateway(profile); + sofia_reg_check_gateway(profile, switch_epoch_time_now(NULL)); + sofia_sub_check_gateway(profile, switch_epoch_time_now(NULL)); + sofia_glue_fire_events(profile); + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Waiting for worker thread\n"); + + if (worker_thread) { + switch_thread_join(&st, worker_thread); + } + else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: Sofia worker thead failed to start\n"); + } sofia_reg_unregister(profile); nua_shutdown(profile->nua); @@ -3514,13 +3526,6 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void sofia_clear_pflag_locked(profile, PFLAG_RUNNING); sofia_clear_pflag_locked(profile, PFLAG_SHUTDOWN); - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Waiting for worker thread\n"); - - if ( worker_thread ) { - switch_thread_join(&st, worker_thread); - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR: Sofia worker thead failed to start\n"); - } sanity = 4; while (profile->inuse) { @@ -3569,6 +3574,7 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void } } + end: switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Write lock %s\n", profile->name); switch_thread_rwlock_wrlock(profile->rwlock); @@ -3590,7 +3596,6 @@ void *SWITCH_THREAD_FUNC sofia_profile_thread_run(switch_thread_t *thread, void sofia_profile_destroy(profile); - end: switch_mutex_lock(mod_sofia_globals.mutex); mod_sofia_globals.threads--; switch_mutex_unlock(mod_sofia_globals.mutex); diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am index 2511a143c2..231225c5aa 100644 --- a/tests/unit/Makefile.am +++ b/tests/unit/Makefile.am @@ -2,7 +2,7 @@ include $(top_srcdir)/build/modmake.rulesam noinst_PROGRAMS = switch_event switch_hash switch_ivr_originate switch_utils switch_core switch_console switch_vpx switch_core_file \ switch_ivr_play_say switch_core_codec switch_rtp switch_xml -noinst_PROGRAMS += switch_core_video switch_core_db switch_vad switch_core_asr +noinst_PROGRAMS += switch_core_video switch_core_db switch_vad switch_core_asr test_sofia AM_LDFLAGS += -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) $(openssl_LIBS) AM_LDFLAGS += $(FREESWITCH_LIBS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS) diff --git a/tests/unit/conf_sofia/freeswitch.xml b/tests/unit/conf_sofia/freeswitch.xml new file mode 100644 index 0000000000..793ac5a04a --- /dev/null +++ b/tests/unit/conf_sofia/freeswitch.xml @@ -0,0 +1,144 @@ +<?xml version="1.0"?> +<document type="freeswitch/xml"> + <section name="configuration" description="Various Configuration"> + + <configuration name="modules.conf" description="Modules"> + <modules> + <load module="mod_sofia"/> + </modules> + </configuration> + + <configuration name="console.conf" description="Console Logger"> + <mappings> + <map name="all" value="console,debug,info,notice,warning,err,crit,alert"/> + </mappings> + <settings> + <param name="colorize" value="true"/> + <param name="uuid" value="true"/> + <param name="loglevel" value="debug"/> + </settings> + </configuration> + <configuration name="sofia.conf" description="SofiaSIP"> + <profiles> + <profile name="external"> + <gateways> + <gateway name="faxtest"> + <param name="username" value="not-used"/> + <param name="password" value="not-used"/> + <param name="proxy" value="$${local_ip_v4}:61060"/> + <param name="register" value="false"/> + <param name="retry-seconds" value="30"/> + <param name="dtmf-type" value="rfc2833"/> + <variables> + <variable name="rtp_secure_media" value="false" direction="outbound"/> + </variables> + </gateway> + </gateways> + + <domains> + <domain name="all" alias="false" parse="true"/> + </domains> + + <settings> + <param name="debug" value="1"/> + <param name="shutdown-on-fail" value="true"/> + <param name="p-asserted-id-parse" value="verbatim"/> + <param name="username" value="SignalWire-STACK"/> + <param name="user-agent-string" value="SignalWire STACK Unit Test"/> + <param name="sip-trace" value="yes"/> + <param name="sip-capture" value="no"/> + <param name="rfc2833-pt" value="101"/> + <param name="sip-port" value="61060"/> + <param name="dialplan" value="XML"/> + <param name="context" value="default"/> + <param name="dtmf-duration" value="2000"/> + <param name="inbound-codec-prefs" value="PCMU"/> + <param name="outbound-codec-prefs" value="PCMU"/> + <param name="rtp-timer-name" value="soft"/> + <param name="local-network-acl" value="localnet.auto"/> + <param name="manage-presence" value="false"/> + <param name="inbound-codec-negotiation" value="generous"/> + <param name="nonce-ttl" value="60"/> + <param name="inbound-late-negotiation" value="true"/> + <param name="inbound-zrtp-passthru" value="false"/> + <param name="rtp-ip" value="$${local_ip_v4}"/> + <param name="sip-ip" value="$${local_ip_v4}"/> + <param name="ext-rtp-ip" value="$${local_ip_v4}"/> + <param name="ext-sip-ip" value="$${local_ip_v4}"/> + <param name="rtp-timeout-sec" value="300"/> + <param name="rtp-hold-timeout-sec" value="1800"/> + <param name="session-timeout" value="600"/> + <param name="minimum-session-expires" value="90"/> + <param name="tls" value="false"/> + </settings> + </profile> + + <profile name="internal"> + <gateways> + </gateways> + + <domains> + <domain name="all" alias="false" parse="true"/> + </domains> + + <settings> + <param name="debug" value="1"/> + <param name="shutdown-on-fail" value="true"/> + <param name="p-asserted-id-parse" value="verbatim"/> + <param name="username" value="SignalWire-STACK"/> + <param name="user-agent-string" value="SignalWire STACK Unit Test"/> + <param name="sip-trace" value="yes"/> + <param name="sip-capture" value="no"/> + <param name="rfc2833-pt" value="101"/> + <param name="sip-port" value="61061"/> + <param name="dialplan" value="XML"/> + <param name="context" value="default"/> + <param name="dtmf-duration" value="2000"/> + <param name="inbound-codec-prefs" value="PCMU"/> + <param name="outbound-codec-prefs" value="PCMU"/> + <param name="rtp-timer-name" value="soft"/> + <param name="local-network-acl" value="localnet.auto"/> + <param name="manage-presence" value="false"/> + <param name="inbound-codec-negotiation" value="generous"/> + <param name="nonce-ttl" value="60"/> + <param name="inbound-late-negotiation" value="true"/> + <param name="inbound-zrtp-passthru" value="false"/> + <param name="rtp-ip" value="$${local_ip_v4}"/> + <param name="sip-ip" value="$${local_ip_v4}"/> + <param name="ext-rtp-ip" value="$${local_ip_v4}"/> + <param name="ext-sip-ip" value="$${local_ip_v4}"/> + <param name="rtp-timeout-sec" value="300"/> + <param name="rtp-hold-timeout-sec" value="1800"/> + <param name="session-timeout" value="600"/> + <param name="minimum-session-expires" value="90"/> + <param name="tls" value="false"/> + </settings> + </profile> + + </profiles> + </configuration> + + <configuration name="switch.conf" description="Switch"> + <param name="rtp-start-port" value="20000"/> + <param name="rtp-end-port" value="30000"/> + <param name="threaded-system-exec" value="true"/> + </configuration> + + <configuration name="timezones.conf" description="Timezones"> + <timezones> + <zone name="GMT" value="GMT0" /> + </timezones> + </configuration> + </section> + + <section name="dialplan" description="Regex/XML Dialplan"> + <context name="default"> + <extension name="sample"> + <condition> + <action application="info"/> + </condition> + </extension> + + </context> + </section> +</document> diff --git a/tests/unit/test_sofia.c b/tests/unit/test_sofia.c new file mode 100644 index 0000000000..e45bd5d3fd --- /dev/null +++ b/tests/unit/test_sofia.c @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2018-2019, Signalwire, Inc. ALL RIGHTS RESERVED + * test_sofia.c -- Tests mod_sofia for memory leaks + */ + +#include <switch.h> +#include <test/switch_test.h> + +FST_CORE_DB_BEGIN("conf_sofia") +{ + FST_SUITE_BEGIN(switch_sofia) + { + FST_SETUP_BEGIN() + { + fst_requires_module("mod_sofia"); + } + FST_SETUP_END() + + FST_TEARDOWN_BEGIN() + { + } + FST_TEARDOWN_END() + + FST_TEST_BEGIN(sofia_leaks) + { + } + FST_TEST_END() + } + FST_SUITE_END() +} +FST_CORE_END()