[asterisk-commits] mjordan: testsuite/asterisk/trunk r6442 - in /asterisk/trunk/tests/apps/confb...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sun Feb 15 11:46:14 CST 2015
Author: mjordan
Date: Sun Feb 15 11:46:12 2015
New Revision: 6442
URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=6442
Log:
tests/apps/confbridge/confbridge_recording: Handle race conditions in recording
When recording a conference, there is a race condition between the MixMonitor
on the recording channel being finished before/after the conference finishes.
This can cause the test to fail during the sound checking portion.
This patch does the following:
(1) It makes it so that the end of the conference logic (wihch triggers the
sound detection) is fired either from the MixMonitor end logic or the
hangup of the channel in the ConfBridge. In both cases, the logic checks
to see if the other condition already occurred, and only triggers the
sound checking logic if the other one did occur.
(2) The sound checking logic is now a bit more careful about not firing twice,
as that can cause the test logic itself to execute more times than it
should.
Modified:
asterisk/trunk/tests/apps/confbridge/confbridge_recording/configs/ast1/extensions.conf
asterisk/trunk/tests/apps/confbridge/confbridge_recording/run-test
Modified: asterisk/trunk/tests/apps/confbridge/confbridge_recording/configs/ast1/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/apps/confbridge/confbridge_recording/configs/ast1/extensions.conf?view=diff&rev=6442&r1=6441&r2=6442
==============================================================================
--- asterisk/trunk/tests/apps/confbridge/confbridge_recording/configs/ast1/extensions.conf (original)
+++ asterisk/trunk/tests/apps/confbridge/confbridge_recording/configs/ast1/extensions.conf Sun Feb 15 11:46:12 2015
@@ -26,17 +26,17 @@
[confbridge]
-exten => record-default,1,NoOp()
+exten => record_default,1,NoOp()
same => n,Set(CONFBRIDGE(bridge,template)=default_bridge)
same => n,Set(CONFBRIDGE(bridge,record_conference)=yes)
same => n,ConfBridge(1)
same => n,Hangup()
-exten => record-conf,1,NoOp()
+exten => record_conf,1,NoOp()
same => n,ConfBridge(1,bridge_record_file,default_user)
same => n,Hangup()
-exten => record-func,1,NoOp()
+exten => record_func,1,NoOp()
same => n,Set(CONFBRIDGE(bridge,template)=default_bridge)
same => n,Set(CONFBRIDGE(bridge,record_conference)=yes)
same => n,Set(CONFBRIDGE(bridge,record_file)=${RECORD_FILE})
Modified: asterisk/trunk/tests/apps/confbridge/confbridge_recording/run-test
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/apps/confbridge/confbridge_recording/run-test?view=diff&rev=6442&r1=6441&r2=6442
==============================================================================
--- asterisk/trunk/tests/apps/confbridge/confbridge_recording/run-test (original)
+++ asterisk/trunk/tests/apps/confbridge/confbridge_recording/run-test Sun Feb 15 11:46:12 2015
@@ -55,6 +55,9 @@
return
logger.debug("Detected variable MIXMONITOR_FILENAME: %s" % event['file'])
self.test_case.set_recording_file("%s.wav" % event['file'])
+ if self.test_case.expected_events['channelhungup']:
+ self.test_case.confbridge_ended()
+
def handle_confbridge_join_event(self, ami, event):
""" ConfBridgeJoin event handler """
@@ -160,11 +163,11 @@
# A dictionary is used to set the parameters for each test.
# This includes the channel to create, and, if applicable, the
# recording file to set for the ConfBridge.
- self._tests = [{'channel':'local/record-default at confbridge',
+ self._tests = [{'channel':'local/record_default at confbridge',
'file': ''},
- {'channel': 'local/record-conf at confbridge',
+ {'channel': 'local/record_conf at confbridge',
'file': ''},
- {'channel': 'local/record-func at confbridge',
+ {'channel': 'local/record_func at confbridge',
'file': 'confbridge_recording_func.wav'},]
self._test_results = []
self._current_test = 0
@@ -181,6 +184,8 @@
self.expected_events['recordingfilename'] = False
self.expected_events['confbridgeleave'] = False
self.expected_events['confbridgeend'] = False
+ self.expected_events['channelhungup'] = False
+ self.expected_events['talkdetectiontriggered'] = False
def confbridge_ended(self):
""" Called when the confbridge channels have hung up. This
@@ -188,6 +193,10 @@
if we've recorded anything, and if we received all expected
events from the test states.
"""
+
+ if self.expected_events['talkdetectiontriggered']:
+ return
+ self.expected_events['talkdetectiontriggered'] = True
# Check that we got all the expected events
failed_events = [e for e, v in self.expected_events.items() if not v]
@@ -201,11 +210,13 @@
self._test_results.append(True)
# Check the recorded file
- logger.debug("Performing talk detection on file %s " % self._record_file[:len(self._record_file) - 4])
- self.ami[0].originate(channel = "Local/detect_audio at talkdetect",
- context = 'talkdetect', exten='playback', priority='1',
- variable = {'TESTAUDIO': '"%s"' % (self._record_file[:len(self._record_file) - 4])}
- ).addErrback(self.handle_originate_failure)
+ logger.info("Performing talk detection on file %s " % self._record_file[:len(self._record_file) - 4])
+ self.ami[0].originate(channel="Local/detect_audio at talkdetect",
+ context='talkdetect',
+ exten='playback',
+ priority='1',
+ variable={'TESTAUDIO': '"%s"' % (self._record_file[:len(self._record_file) - 4])}
+ ).addErrback(self.handle_originate_failure)
def set_recording_file(self, filename):
""" Called by the test states when the recorded file is known """
@@ -245,9 +256,9 @@
variable = {}
if self._tests[self._current_test]['file']:
variable["RECORD_FILE"] = self._tests[self._current_test]['file']
- ami.originate(channel = channel,
- context = 'caller', exten='wait', priority='1',
- variable = variable
+ ami.originate(channel=channel,
+ context='caller', exten='wait', priority='1',
+ variable=variable
).addErrback(self.handle_originate_failure)
def new_exten_event_handler(self, ami, event):
@@ -284,7 +295,9 @@
if event['channel'] != self._confbridge_channel:
return
logger.debug("Hangup detected of ConfBridge channel %s" % self._confbridge_channel)
- self.confbridge_ended()
+ self.expected_events['channelhungup'] = True
+ if self.expected_events['recordingfilename']:
+ self.confbridge_ended()
def new_channel_handler(self, ami, event):
""" Record all new non-Bridge channels. This lets us later determine
@@ -305,6 +318,9 @@
return
if 'status' not in event or 'message' not in event:
return
+ if self._current_test > len(self._tests):
+ return
+
logger.debug("Received status %s: %s" % (event['status'], event['message']))
# Note that we only want to override the test results if it Failed
if event['status'] == 'fail':
More information about the asterisk-commits
mailing list