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@confbridge', + self._tests = [{'channel':'local/record_default@confbridge', 'file': ''}, - {'channel': 'local/record-conf@confbridge', + {'channel': 'local/record_conf@confbridge', 'file': ''}, - {'channel': 'local/record-func@confbridge', + {'channel': 'local/record_func@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@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@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': -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits