[asterisk-commits] mjordan: testsuite/asterisk/trunk r3379 - in /asterisk/trunk: lib/python/aste...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Jul 31 13:56:19 CDT 2012
Author: mjordan
Date: Tue Jul 31 13:56:13 2012
New Revision: 3379
URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=3379
Log:
Add test for subscribing for MWI notifications from external sources
This test introduces a fairly straight forward test that covers Asterisk
sending a SUBSCRIBE request for MWI notifications, and receiving a
corresponding NOTIFY request from the external source. This test does not
attempt to cover the event system's dispensing of MWI notifications to Asterisk
modules; rather it only attempts to cover chan_sip's responsibilities in
sending a SIP SUBCRIBE request/receiving a SIP NOTIFY request.
This also adds a new test object for the pluggable framework that orchestrates
SIPp scenarios against a single instance of Asterisk.
(issue ASTERISK-19827)
(closes issue ASTERISK-19939)
Reported by: mjordan
Review: https://reviewboard.asterisk.org/r/2059
Added:
asterisk/trunk/sample-yaml/sipptestcase-config.yaml.sample (with props)
asterisk/trunk/tests/channels/SIP/subscribe/
asterisk/trunk/tests/channels/SIP/subscribe/configs/
asterisk/trunk/tests/channels/SIP/subscribe/configs/ast1/
asterisk/trunk/tests/channels/SIP/subscribe/configs/ast1/sip.conf (with props)
asterisk/trunk/tests/channels/SIP/subscribe/sipp/
asterisk/trunk/tests/channels/SIP/subscribe/sipp/uas_subscribe_mwi.xml (with props)
asterisk/trunk/tests/channels/SIP/subscribe/test-config.yaml (with props)
Modified:
asterisk/trunk/lib/python/asterisk/sipp.py
asterisk/trunk/tests/channels/SIP/tests.yaml
Modified: asterisk/trunk/lib/python/asterisk/sipp.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/lib/python/asterisk/sipp.py?view=diff&rev=3379&r1=3378&r2=3379
==============================================================================
--- asterisk/trunk/lib/python/asterisk/sipp.py (original)
+++ asterisk/trunk/lib/python/asterisk/sipp.py Tue Jul 31 13:56:13 2012
@@ -20,53 +20,263 @@
from asterisk import Asterisk
from TestCase import TestCase
-logger = logging.getLogger(__name__)
+LOGGER = logging.getLogger(__name__)
+
+class SIPpTestCase(TestCase):
+ ''' A SIPp test object for the pluggable framework.
+
+ In addition to the 'normal' entry points that TestCase defines for
+ modules to attach themselves, this Test Object defines the following:
+
+ register_scenario_started_observer - add a callback function that will be
+ called every time a SIPp Scenario starts
+
+ register_scenario_stopped_observer - add a callback function that will be
+ called every time a SIPp Scenario stops
+
+ register_intermediate_observer - add a callback function that will be called
+ between sets of SIPp Scenarios run in parallel
+
+ register_final_observer - add a callback function that will be called when
+ all SIPp Scenarios have finished, but before the reactor is stopped
+ '''
+
+ def __init__(self, test_path, test_config):
+ ''' Constructor
+
+ Parameters:
+ test_path path to the location of the test directory
+ test_config yaml loaded object containing config information
+ '''
+ super(SIPpTestCase, self).__init__(test_path)
+
+ if not test_config:
+ raise ValueError('SIPpTestObject requires a test config')
+
+ self._scenario_started_observers = []
+ self._scenario_stopped_observers = []
+ self._intermediate_observers = []
+ self._final_observers = []
+ self._test_config = test_config
+ self._current_test = 0
+ if 'fail-on-any' in self._test_config:
+ self._fail_on_any = self._test_config['fail-on-any']
+ else:
+ self._fail_on_any = True
+
+ self.register_intermediate_obverver(self._handle_scenario_finished)
+ self.create_asterisk()
+
+
+ def run(self):
+ ''' Override of the run method. Create an AMI factory in case anyone
+ wants it '''
+ super(SIPpTestCase, self).run()
+ self.create_ami_factory()
+
+ self.ast[0].cli_exec('sip set debug on')
+
+
+ def ami_connect(self, ami):
+ ''' Handler for the AMI connect event '''
+ super(SIPpTestCase, self).ami_connect(ami)
+
+ self._execute_test()
+
+
+ def register_scenario_started_observer(self, observer):
+ ''' Register a function to be called when a SIPp scenario starts.
+
+ Keywords:
+ observer The function to be called. The function should take in a
+ single parameter, the SIPpScenario object that started.
+ '''
+ self._scenario_started_observers.append(observer)
+
+
+ def register_scenario_started_observer(self, observer):
+ ''' Register a function to be called when a SIPp scenario stops.
+
+ Keywords:
+ observer The function to be called. The function should take in a
+ single parameter, the SIPpScenario object that stopped.
+ '''
+ self._scenario_stopped_observers.append(observer)
+
+
+ def register_intermediate_obverver(self, observer):
+ ''' Register a function to be called in between SIPp scenarios.
+
+ Keywords:
+ observer The function to be called. The function should take in a
+ single parameter, a list of tuples. Each tuple will be
+ (success, result), where success is the pass/fail status of the
+ SIPpScenario, and result is the SIPpScenario object.
+ '''
+
+ self._intermediate_observers.append(observer)
+
+
+ def register_final_observer(self, observer):
+ ''' Register a final observer, called when all SIPp scenarios are done
+ in a given sequence
+
+ Keywords:
+ observer The function to be called. The function should take in two
+ parameters: an integer value indicating which test iteration is
+ being executed, and this object.
+ '''
+
+ self._final_observers.append(observer)
+
+
+ def _handle_scenario_finished(self, result):
+ ''' Handle whether or not a scenario finished successfully '''
+ for (success, scenario) in result:
+ if (success):
+ LOGGER.info("Scenario %s passed" %
+ (scenario.name))
+ self.set_passed(True)
+ else:
+ # Note: the SIPpSequence/Scenario objects will auto fail this test
+ # if configured to do so. Merely report pass/fail here.
+ LOGGER.warning("Scenario %s failed" %
+ (scenario.name))
+ self.set_passed(False)
+
+
+ def _execute_test(self):
+ def _final_deferred_callback(result):
+ for observer in self._final_observers:
+ observer(self._current_test, self)
+ return result
+
+ def _finish_test(result):
+ LOGGER.info("All SIPp Scenarios executed; stopping reactor")
+ self.stop_reactor()
+ return result
+
+ scenarios = []
+ for defined_scenario_set in self._test_config['test-iterations']:
+
+ scenario_set = defined_scenario_set['scenarios']
+ # Build a list of SIPpScenario objects to run in parallel from
+ # each set of scenarios in the YAML config
+ scenarios.append([SIPpScenario(self.test_name,
+ scenario['key-args'],
+ [] if 'ordered-args' not in scenario else scenario['ordered-args'])
+ for scenario in scenario_set])
+
+ final_deferred = defer.Deferred()
+ final_deferred.addCallback(_final_deferred_callback)
+ final_deferred.addCallback(_finish_test)
+ sipp_sequence = SIPpScenarioSequence(self,
+ scenarios,
+ self._fail_on_any,
+ self._intermediate_callback_fn,
+ final_deferred)
+ sipp_sequence.register_scenario_start_callback(self._scenario_start_callback_fn)
+ sipp_sequence.register_scenario_stop_callback(self._scenario_stop_callback_fn)
+ sipp_sequence.execute()
+
+
+ def _intermediate_callback_fn(self, result):
+ for observer in self._intermediate_observers:
+ observer(result)
+ return result
+
+
+ def _scenario_start_callback_fn(self, result):
+ for observer in self._scenario_started_observers:
+ observer(result)
+ return result
+
+
+ def _scenario_stop_callback_fn(self, result):
+ for observer in self._scenario_stopped_observers:
+ observer(result)
+ return result
+
class SIPpScenarioSequence:
- """ Execute a sequence of SIPp Scenarios in sequence.
+ ''' Execute a sequence of SIPp Scenarios in sequence.
This class manages the execution of multiple SIPpScenarios in sequence.
- """
-
- def __init__(self, test_case, sipp_scenarios = [], fail_on_any = False, intermediate_cb_fn = None, final_deferred = None):
- """ Create a new sequence of scenarios
+ '''
+
+ def __init__(self, test_case, sipp_scenarios = [],
+ fail_on_any = False,
+ intermediate_cb_fn = None,
+ final_deferred = None):
+ ''' Create a new sequence of scenarios
Keyword Arguments:
test_case - the TestCase derived object to pass to the SIPpScenario objects
- sipp_scenarios - a list of SIPpScenario objects to execute
+ sipp_scenarios - a list of SIPpScenario objects to execute, or a list of
+ lists of SIPpScenario objects to execute in parallel
fail_on_any - if any scenario fails, stop the reactor and kill the test.
- intermediate_cb_fn - a callback function suitable as a Deferred callback
- that will be added to each test
+ intermediate_cb_fn - a callback function suitable as a DeferredList callback
+ that will be added to each SIPpScenario. What is received will be
+ a list of (success, result) tuples for each scenario that was
+ executed, where the result object is the SIPpScenario. This will be
+ called for each set of SIPpScenario objects.
final_deferred - a deferred object that will be called when all tests have
- executed, but before the reactor is stopped
- """
+ executed, but before the reactor is stopped. The parameter passed
+ to the deferred callback function will be this object.
+ '''
self.__sipp_scenarios = sipp_scenarios
self.__test_case = test_case
self.__fail_on_any = fail_on_any
self.__test_counter = 0
self.__intermediate_cb_fn = intermediate_cb_fn
self.__final_deferred = final_deferred
+ self.__scenario_start_fn = None
+ self.__scenario_stop_fn = None
+
+
+ def register_scenario_start_callback(self, callback_fn):
+ ''' Register a callback function that will be called on the start of
+ every SIPpScenario
+
+ Keyword Arguments:
+ callback_fn A function that takes in a single parameter. That parameter
+ will be the SIPpScenario object that was just started
+ '''
+ self.__scenario_start_fn = callback_fn
+
+
+ def register_scenario_stop_callback(self, callback_fn):
+ ''' Register a callback function that will be called at the end of
+ every SIPpScenario
+
+ Keyword Arguments:
+ callback_fn A function that acts as a deferred callback. It takes in
+ a single parameter that will be the SIPpScenario object.
+ '''
+ self.__scenario_stop_fn = callback_fn
+
def register_scenario(self, sipp_scenario):
- """ Register a new scenario with the sequence
+ ''' Register a new scenario with the sequence
Registers a SIPpScenario object with the sequence of scenarios to execute
Keyword Arguments:
sipp_scenario - the SIPpScenario object to execute
- """
+ '''
self.__sipp_scenarios.append(sipp_scenario)
def execute(self):
- """ Execute the tests in sequence
- """
+ ''' Execute the tests in sequence
+ '''
def __execute_next(result):
- """ Execute the next SIPp scenario in the sequence """
+ ''' Execute the next SIPp scenario in the sequence '''
# Only evaluate for failure if we're responsible for failing the test case -
# otherwise the SIPpScenario will do it for us
- if not self.__fail_on_any and not result.passed:
- logger.warning("SIPp Scenario %s Failed" % result.scenario['scenario'])
- self.__test_case.passed = False
+ for (success, scenario) in result:
+ if not self.__fail_on_any and (not scenario.passed or not success):
+ LOGGER.warning("SIPp Scenario %s Failed" % scenario.name)
+ self.__test_case.set_passed(False)
self.__test_counter += 1
if self.__test_counter < len(self.__sipp_scenarios):
self.execute()
@@ -76,15 +286,34 @@
self.__test_case.stop_reactor()
return result
- # If we fail on any, let the SIPp scenario handle it by passing it the
- # TestCase object
- if self.__fail_on_any:
- df = self.__sipp_scenarios[self.__test_counter].run(self.__test_case)
- else:
- df = self.__sipp_scenarios[self.__test_counter].run(None)
- df.addCallback(__execute_next)
+ scenarios = self.__sipp_scenarios[self.__test_counter]
+ # Turn the scenario into a list if all we got was a single scenario to
+ # execute
+ if type(scenarios) is not list:
+ scenarios = [scenarios]
+
+ deferds = []
+ for scenario in scenarios:
+ # If we fail on any, let the SIPp scenario handle it by passing it
+ # the TestCase object
+ if self.__fail_on_any:
+ df = scenario.run(self.__test_case)
+ else:
+ df = scenario.run(None)
+ # Order here is slightly important. Add all the callbacks to the
+ # scenario's deferred object first, then add it to the list.
+ # Afterwards, notify start observers that we're started.
+ if self.__scenario_stop_fn:
+ df.addCallback(self.__scenario_stop_fn)
+ if self.__scenario_start_fn:
+ self.__scenario_start_fn(scenario)
+ deferds.append(df)
+
+ dl = defer.DeferredList(deferds)
if self.__intermediate_cb_fn:
- df.addCallback(self.__intermediate_cb_fn)
+ dl.addCallback(self.__intermediate_cb_fn)
+ dl.addCallback(__execute_next)
+
class SIPpScenario:
"""
@@ -124,6 +353,7 @@
'-key', 'user_addr', 'sip:myname at myhost')
"""
self.scenario = scenario
+ self.name = scenario['scenario']
self.positional_args = tuple(positional_args) # don't allow caller to mangle his own list
self.test_dir = test_dir
self.default_port = 5061
@@ -148,26 +378,26 @@
def __output_callback(result):
""" Callback from getProcessOutputAndValue """
out, err, code = result
- logger.debug("Launching SIPp Scenario %s exited %d"
+ LOGGER.debug("Launching SIPp Scenario %s exited %d"
% (self.scenario['scenario'], code))
if (code == 0):
self.passed = True
- logger.info("SIPp Scenario %s Exited" % (self.scenario['scenario']))
+ LOGGER.info("SIPp Scenario %s Exited" % (self.scenario['scenario']))
else:
- logger.warning("SIPp Scenario %s Failed [%d, %s]" % (self.scenario['scenario'], code, err))
+ LOGGER.warning("SIPp Scenario %s Failed [%d, %s]" % (self.scenario['scenario'], code, err))
self.__exit_deferred.callback(self)
def __error_callback(result):
""" Errback from getProcessOutputAndValue """
out, err, code = result
- logger.warning("SIPp Scenario %s Failed [%d, %s]" % (self.scenario['scenario'], code, err))
+ LOGGER.warning("SIPp Scenario %s Failed [%d, %s]" % (self.scenario['scenario'], code, err))
self.__exit_deferred.callback(self)
def __evalute_scenario_results(result):
""" Convenience function. If the test case is injected into this method,
then auto-fail the test if the scenario fails. """
if not self.passed:
- logger.warning("SIPp Scenario %s Failed" % self.scenario['scenario'])
+ LOGGER.warning("SIPp Scenario %s Failed" % self.scenario['scenario'])
self.__test_case.passed = False
self.__test_case.stop_reactor()
@@ -178,7 +408,7 @@
'-skip_rlimit',
]
default_args = {
- '-p' : self.default_port,
+ '-p' : str(self.default_port),
'-m' : '1',
'-i' : '127.0.0.1',
'-timeout' : '20s'
@@ -192,8 +422,8 @@
sipp_args.extend([ key, val ])
sipp_args.extend(self.positional_args)
- logger.info("Executing SIPp scenario: %s" % self.scenario['scenario'])
- logger.debug(sipp_args)
+ LOGGER.info("Executing SIPp scenario: %s" % self.scenario['scenario'])
+ LOGGER.debug(sipp_args)
self.__exit_deferred = defer.Deferred()
@@ -262,11 +492,13 @@
def __check_result(result):
""" Append the result of the test to our list of results """
self.result.append(result.passed)
+ return result
def __set_pass_fail(result):
""" Check if all tests have passed - if any have failed, set our passed status to False """
self.passed = (self.result.count(False) == 0)
self.stop_reactor()
+ return result
TestCase.run(self)
Added: asterisk/trunk/sample-yaml/sipptestcase-config.yaml.sample
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/sample-yaml/sipptestcase-config.yaml.sample?view=auto&rev=3379
==============================================================================
--- asterisk/trunk/sample-yaml/sipptestcase-config.yaml.sample (added)
+++ asterisk/trunk/sample-yaml/sipptestcase-config.yaml.sample Tue Jul 31 13:56:13 2012
@@ -1,0 +1,36 @@
+# Configuration sample for the SIPpTestCase object, a test object derived from
+# TestCase that manages a single instance of Asterisk and SIPp scenarios
+# executed against that instance
+
+test-object-config:
+
+ # If set to True, then any SIPp scenario failure will automatically stop
+ # and fail the test. Default is True.
+ fail-on-any: False
+
+ # The test iterations block define a sequence of sets of scenarios to run
+ # sequentially
+ test-iterations:
+ -
+ # The scenarios tag defines a set of scenario to run in parallel.
+ scenarios:
+ # Scenarios are a dictionary of key value pairs. At least one
+ # entry in the dictionary must be the 'key-args' key/value
+ # pair, which defines the keyed arguments to pass to SIPp.
+ # 'ordered-args' is optional, and defines arguments whose
+ # order is maintained when passed to SIPp.
+ # By default, the following keyed arguments are always passed
+ # to the SIPp scenario, unless they are overridden here:
+ # -p <port> - Unless otherwise specified, the port number will
+ # be 5060 + <scenario list index, starting at 1>.
+ # So, the first SIPp sceario will use port 5061.
+ # -m 1 - Stop the test after 1 'call' is processed.
+ # -i 127.0.0.1 - Use this as the local IP address for the Contact
+ # headers, Via headers, etc.
+ # -timeout 20s - Set a global test timeout of 20 seconds.
+ - { 'key-args': { 'scenario': 'scenario_1.xml'} }
+ - { 'key-args': {'scenario': 'scenario_2.xml'},
+ 'ordered-args': ['-keys', 'foo', 'bar'] }
+ -
+ scenarios:
+ - { 'key-args': {'scenario': 'scenario_3.xml'} }
Propchange: asterisk/trunk/sample-yaml/sipptestcase-config.yaml.sample
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/sample-yaml/sipptestcase-config.yaml.sample
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/sample-yaml/sipptestcase-config.yaml.sample
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/channels/SIP/subscribe/configs/ast1/sip.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/channels/SIP/subscribe/configs/ast1/sip.conf?view=auto&rev=3379
==============================================================================
--- asterisk/trunk/tests/channels/SIP/subscribe/configs/ast1/sip.conf (added)
+++ asterisk/trunk/tests/channels/SIP/subscribe/configs/ast1/sip.conf Tue Jul 31 13:56:13 2012
@@ -1,0 +1,13 @@
+[general]
+udpbindaddr = 127.0.0.1:5060
+sipdebug = yes
+mwi => alice:secret at 127.0.0.1:5061/1234
+
+[alice]
+type = friend
+fromuser = alice
+host = 127.0.0.1
+port = 5061
+mailbox = 1234 at SIP_Remote
+subscribemwi = yes
+unsolicited_mailbox = 1234
Propchange: asterisk/trunk/tests/channels/SIP/subscribe/configs/ast1/sip.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/channels/SIP/subscribe/configs/ast1/sip.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/channels/SIP/subscribe/configs/ast1/sip.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/channels/SIP/subscribe/sipp/uas_subscribe_mwi.xml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/channels/SIP/subscribe/sipp/uas_subscribe_mwi.xml?view=auto&rev=3379
==============================================================================
--- asterisk/trunk/tests/channels/SIP/subscribe/sipp/uas_subscribe_mwi.xml (added)
+++ asterisk/trunk/tests/channels/SIP/subscribe/sipp/uas_subscribe_mwi.xml Tue Jul 31 13:56:13 2012
@@ -1,0 +1,60 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE scenario SYSTEM "sipp.dtd">
+
+<scenario name="Basic Sipstone UAC">
+
+ <recv request="SUBSCRIBE" crlf="true">
+ </recv>
+
+ <send>
+ <![CDATA[
+
+ SIP/2.0 200 OK
+ [last_Via:]
+ [last_From:]
+ [last_To:]
+ [last_Call-ID:]
+ [last_CSeq:]
+ Contact: <sip:[local_ip]:[local_port];transport=[transport]>
+ Content-Length: 0
+
+ ]]>
+ </send>
+
+ <pause/>
+
+ <send retrans="500">
+ <![CDATA[
+ NOTIFY sip:alice@[remote_ip]:[remote_port] SIP/2.0
+ Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
+ Max-Forwards: 70
+ From: "alice" <sip:alice@[local_ip]:[local_port]>;tag=[pid]SIPpTag00[call_number]
+ To: <sip:alice@[remote_ip]:[remote_port]>[peer_tag_param]
+ Contact: <sip:alice@[local_ip]:[local_port]>
+ Call-ID: [call_id]
+ CSeq: [cseq] NOTIFY
+ User-Agent: Alice
+ Event: message-summary
+ Content-Type: application/simple-message-summary
+ Content-Length: [len]
+
+ Messages-Waiting: yes
+ Message-Account: sip:alice at 127.0.0.1:5061
+ Voice-Message: 1/2 (0/0)
+ ]]>
+ </send>
+
+ <recv response="200">
+ <action>
+ <exec int_cmd="stop_gracefully"/>
+ </action>
+ </recv>
+
+ <!-- definition of the response time repartition table (unit is ms) -->
+ <ResponseTimeRepartition value="10, 20, 30, 40, 50, 100, 150, 200"/>
+
+ <!-- definition of the call length repartition table (unit is ms) -->
+ <CallLengthRepartition value="10, 50, 100, 500, 1000, 5000, 10000"/>
+
+</scenario>
+
Propchange: asterisk/trunk/tests/channels/SIP/subscribe/sipp/uas_subscribe_mwi.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/channels/SIP/subscribe/sipp/uas_subscribe_mwi.xml
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/channels/SIP/subscribe/sipp/uas_subscribe_mwi.xml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/channels/SIP/subscribe/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/channels/SIP/subscribe/test-config.yaml?view=auto&rev=3379
==============================================================================
--- asterisk/trunk/tests/channels/SIP/subscribe/test-config.yaml (added)
+++ asterisk/trunk/tests/channels/SIP/subscribe/test-config.yaml Tue Jul 31 13:56:13 2012
@@ -1,0 +1,29 @@
+testinfo:
+ summary: 'Test subscribing for MWI notifications from an external source'
+ description: |
+ 'This tests subscribing for MWI notifications from an external source.
+ Asterisk, when it starts, should send a SUBSCRIBE request for MWI
+ notifications. The SIPp scenario, upon processing the SUBSCRIBE
+ request, sends a single NOTIFY request. Asterisk should, if it
+ processes the NOTIFY request properly, send a 200 OK.'
+
+test-modules:
+ test-object:
+ config-section: test-object-config
+ typename: 'sipp.SIPpTestCase'
+
+test-object-config:
+ fail-on-any: False
+ test-iterations:
+ -
+ scenarios:
+ - { 'key-args': {'scenario': 'uas_subscribe_mwi.xml'} }
+
+properties:
+ minversion: '1.8.14.0'
+ dependencies:
+ - python: 'starpy'
+ - sipp:
+ version: 'v3.1'
+ tags:
+ - sip
Propchange: asterisk/trunk/tests/channels/SIP/subscribe/test-config.yaml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/channels/SIP/subscribe/test-config.yaml
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/channels/SIP/subscribe/test-config.yaml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: asterisk/trunk/tests/channels/SIP/tests.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/channels/SIP/tests.yaml?view=diff&rev=3379&r1=3378&r2=3379
==============================================================================
--- asterisk/trunk/tests/channels/SIP/tests.yaml (original)
+++ asterisk/trunk/tests/channels/SIP/tests.yaml Tue Jul 31 13:56:13 2012
@@ -49,4 +49,6 @@
- test: 'invite_no_totag'
- test: 'sip2cause'
- test: 'sip_outbound_proxy'
+ - test: 'subscribe'
- test: 'rfc2833_dtmf_detect'
+
More information about the asterisk-commits
mailing list