[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