[asterisk-commits] mmichelson: testsuite/asterisk/trunk r6192 - in /asterisk/trunk: lib/python/a...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Jan 7 13:32:00 CST 2015


Author: mmichelson
Date: Wed Jan  7 13:31:55 2015
New Revision: 6192

URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=6192
Log:
Add tests for continuation and origination.

There was already a test for continuation, but this expands the test to cover many more
test cases.

This also adds a test originating calls to different dialplan locations to make sure that
different combinations of extension, context, priority, and label work as expected.

Review https://reviewboard.asterisk.org/r/4284


Added:
    asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/
    asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/configs/
    asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/configs/ast1/
    asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/configs/ast1/extensions.conf   (with props)
    asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/test-config.yaml   (with props)
Modified:
    asterisk/trunk/lib/python/asterisk/ari.py
    asterisk/trunk/tests/rest_api/channels/tests.yaml
    asterisk/trunk/tests/rest_api/continue/configs/ast1/extensions.conf
    asterisk/trunk/tests/rest_api/continue/rest_continue.py
    asterisk/trunk/tests/rest_api/continue/test-config.yaml

Modified: asterisk/trunk/lib/python/asterisk/ari.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/lib/python/asterisk/ari.py?view=diff&rev=6192&r1=6191&r2=6192
==============================================================================
--- asterisk/trunk/lib/python/asterisk/ari.py (original)
+++ asterisk/trunk/lib/python/asterisk/ari.py Wed Jan  7 13:31:55 2015
@@ -432,9 +432,10 @@
         :throws: requests.exceptions.HTTPError
         """
         url = self.build_url(*args)
+        json = kwargs.pop('json', None)
         LOGGER.info("PUT %s %r", url, kwargs)
         return self.raise_on_err(requests.put(url, params=kwargs,
-                                              auth=self.userpass))
+                                              json=json, auth=self.userpass))
 
     def post(self, *args, **kwargs):
         """Send a POST request to ARI.
@@ -445,9 +446,10 @@
         :throws: requests.exceptions.HTTPError
         """
         url = self.build_url(*args)
+        json = kwargs.pop('json', None)
         LOGGER.info("POST %s %r", url, kwargs)
         return self.raise_on_err(requests.post(url, params=kwargs,
-                                               auth=self.userpass))
+                                               json=json, auth=self.userpass))
 
     def delete(self, *args, **kwargs):
         """Send a DELETE request to ARI.

Added: asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/configs/ast1/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/configs/ast1/extensions.conf?view=auto&rev=6192
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/configs/ast1/extensions.conf (added)
+++ asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/configs/ast1/extensions.conf Wed Jan  7 13:31:55 2015
@@ -1,0 +1,41 @@
+[default]
+exten => echo,1,Answer()
+same => n,Echo()
+same => n,Hangup()
+
+exten => test,1,UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 2,Hangup()
+same => 3,UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 4,Hangup()
+same => 5(dopey),UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 6,Hangup()
+same => 7(doc),UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 8,Hangup()
+same => 9,UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 10,Hangup()
+same => 11,UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 12,Hangup()
+
+; Having an h extension prevents _. from matching when the channel hangs up
+exten => h,1,NoOp()
+
+exten => _.,1,UserEvent(Failed)
+
+[grumpy]
+exten => test,1,UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 2,Hangup()
+same => 3,UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 4,Hangup()
+same => 5(sleepy),UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 6,Hangup()
+same => 7(bashful),UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 8,Hangup()
+same => 9,UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 10,Hangup()
+same => 11,UserEvent(${IF($[${location} = ${EXTEN}@${CONTEXT}:${PRIORITY}]?Success:Failed)})
+same => 12,Hangup()
+
+; Having an h extension prevents _. from matching when the channel hangs up
+exten => h,1,NoOp()
+
+exten => _.,1,UserEvent(Failed)

Propchange: asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/configs/ast1/extensions.conf
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/configs/ast1/extensions.conf
------------------------------------------------------------------------------
    svn:keywords = 'Author Date Id Revision'

Propchange: asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/configs/ast1/extensions.conf
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/test-config.yaml?view=auto&rev=6192
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/test-config.yaml (added)
+++ asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/test-config.yaml Wed Jan  7 13:31:55 2015
@@ -1,0 +1,128 @@
+testinfo:
+    summary: 'Test ARI origination to dialplan locations'
+    description: |
+        'This attempts to test originating to the dialplan, using all
+        combinations of extension, context, priority, and label. The
+        originations go in the following order:
+        * Only extension specified
+        * Extension and priority specified
+        * Extension and label specified
+        * Extension, priority, and label specified
+        * Extension and numeric label specified
+        * Extension, priority, and numeric label specified
+        * All of the above repeated, this time specifying a context.
+
+        In total there are 12 originations performed. Each origination
+        sets a channel variable on the channel that specifies where we
+        expect the origination to end up. A user event is emitted from
+        the dialplan to indicate if the results meet expectations.'
+
+properties:
+    minversion: '13.2.0'
+    dependencies:
+        - python: autobahn.websocket
+        - python: requests
+        - python: twisted
+        - python: starpy
+        - asterisk: res_ari_channels
+        - asterisk: app_userevent
+        - asterisk: app_echo
+    tags:
+        - ARI
+
+test-modules:
+    test-object:
+        config-section: originate-config
+        typename: ari.AriOriginateTestObject
+    modules:
+        -
+            config-section: ami-config
+            typename: ami.AMIEventModule
+
+
+originate-config:
+    test-iterations:
+        -
+            endpoint: 'Local/echo at default'
+            extension: 'test'
+            json: {'variables': {'location': 'test at default:1'}}
+        -
+            endpoint: 'Local/echo at default'
+            extension: 'test'
+            priority: 3
+            json: {'variables': {'location': 'test at default:3'}}
+        -
+            endpoint: 'Local/echo at default'
+            extension: 'test'
+            label: 'dopey'
+            json: {'variables': {'location': 'test at default:5'}}
+        -
+            endpoint: 'Local/echo at default'
+            extension: 'test'
+            priority: 5
+            label: 'doc'
+            json: {'variables': {'location': 'test at default:7'}}
+        -
+            endpoint: 'Local/echo at default'
+            extension: 'test'
+            label: '9'
+            json: {'variables': {'location': 'test at default:9'}}
+        -
+            endpoint: 'Local/echo at default'
+            extension: 'test'
+            priority: 5
+            label: '11'
+            json: {'variables': {'location': 'test at default:11'}}
+        -
+            endpoint: 'Local/echo at default'
+            context: 'grumpy'
+            extension: 'test'
+            json: {'variables': {'location': 'test at grumpy:1'}}
+        -
+            endpoint: 'Local/echo at default'
+            context: 'grumpy'
+            extension: 'test'
+            priority: 3
+            json: {'variables': {'location': 'test at grumpy:3'}}
+        -
+            endpoint: 'Local/echo at default'
+            context: 'grumpy'
+            extension: 'test'
+            label: 'sleepy'
+            json: {'variables': {'location': 'test at grumpy:5'}}
+        -
+            endpoint: 'Local/echo at default'
+            context: 'grumpy'
+            extension: 'test'
+            priority: 5
+            label: 'bashful'
+            json: {'variables': {'location': 'test at grumpy:7'}}
+        -
+            endpoint: 'Local/echo at default'
+            context: 'grumpy'
+            extension: 'test'
+            label: '9'
+            json: {'variables': {'location': 'test at grumpy:9'}}
+        -
+            endpoint: 'Local/echo at default'
+            context: 'grumpy'
+            extension: 'test'
+            priority: 5
+            label: '11'
+            json: {'variables': {'location': 'test at grumpy:11'}}
+
+ami-config:
+    -
+        type: 'headermatch'
+        conditions:
+            match:
+                Event: 'UserEvent'
+                UserEvent: 'Success'
+        count: '12'
+    -
+        type: 'headermatch'
+        conditions:
+            match:
+                Event: 'UserEvent'
+                UserEvent: 'Failed'
+        count: '0'

Propchange: asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/test-config.yaml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/test-config.yaml
------------------------------------------------------------------------------
    svn:keywords = 'Author Date Id Revision'

Propchange: asterisk/trunk/tests/rest_api/channels/originate_to_dialplan/test-config.yaml
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: asterisk/trunk/tests/rest_api/channels/tests.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/channels/tests.yaml?view=diff&rev=6192&r1=6191&r2=6192
==============================================================================
--- asterisk/trunk/tests/rest_api/channels/tests.yaml (original)
+++ asterisk/trunk/tests/rest_api/channels/tests.yaml Wed Jan  7 13:31:55 2015
@@ -9,3 +9,4 @@
     - test: 'snoop_id'
     - dir: 'playback'
     - test: 'connected_line_update'
+    - test: 'originate_to_dialplan'

Modified: asterisk/trunk/tests/rest_api/continue/configs/ast1/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/continue/configs/ast1/extensions.conf?view=diff&rev=6192&r1=6191&r2=6192
==============================================================================
--- asterisk/trunk/tests/rest_api/continue/configs/ast1/extensions.conf (original)
+++ asterisk/trunk/tests/rest_api/continue/configs/ast1/extensions.conf Wed Jan  7 13:31:55 2015
@@ -1,7 +1,63 @@
 [default]
 
-exten => s,1,NoOp()
-	same => n,Answer()
-	same => n,Stasis(testsuite)
-	same => n,Stasis(testsuite,fin)
-	same => n,Hangup()
+;Having an h extension prevents the _. from matching when the channel hangs up
+exten => h,1,NoOp()
+
+exten => _.,1,UserEvent(Failed)
+
+exten => s,1,Answer()
+	same => 2,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 3,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 4,UserEvent(Failed)
+	same => 5,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 6,UserEvent(Failed)
+	same => 7(eggs),Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 8,UserEvent(Failed)
+	same => 9(toast),Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 10,UserEvent(Failed)
+	same => 11,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 12,UserEvent(Failed)
+	same => 13,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+
+exten => bacon,1,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 2,UserEvent(Failed)
+	same => 3,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 4,UserEvent(Failed)
+	same => 5(muffin),Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 6,UserEvent(Failed)
+	same => 7(bagel),Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 8,UserEvent(Failed)
+	same => 9,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 10,UserEvent(Failed)
+	same => 11,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+
+[taters]
+
+;Having an h extension prevents the _. from matching when the channel hangs up
+exten => h,1,NoOp()
+
+exten => _.,1,UserEvent(Failed)
+
+exten => s,1,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 2,UserEvent(Failed)
+	same => 3,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 4,UserEvent(Failed)
+	same => 5(hollandaise),Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 6,UserEvent(Failed)
+	same => 7(cereal),Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 8,UserEvent(Failed)
+	same => 9,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 10,UserEvent(Failed)
+	same => 11,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+
+exten => biscuit,1,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 2,UserEvent(Failed)
+	same => 3,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 4,UserEvent(Failed)
+	same => 5(sausage),Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 6,UserEvent(Failed)
+	same => 7(pancakes),Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 8,UserEvent(Failed)
+	same => 9,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})
+	same => 10,UserEvent(Failed)
+	same => 11,Stasis(testsuite,${EXTEN}@${CONTEXT}:${PRIORITY})

Modified: asterisk/trunk/tests/rest_api/continue/rest_continue.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/continue/rest_continue.py?view=diff&rev=6192&r1=6191&r2=6192
==============================================================================
--- asterisk/trunk/tests/rest_api/continue/rest_continue.py (original)
+++ asterisk/trunk/tests/rest_api/continue/rest_continue.py Wed Jan  7 13:31:55 2015
@@ -1,6 +1,7 @@
 '''
-Copyright (C) 2013, Digium, Inc.
+Copyright (C) 2013-2014, Digium, Inc.
 David M. Lee, II <dlee at digium.com>
+Mark Michelson <mmichelson at digium.com>
 
 This program is free software, distributed under the terms of
 the GNU General Public License Version 2.
@@ -8,35 +9,103 @@
 
 import logging
 
-logger = logging.getLogger(__name__)
+LOGGER = logging.getLogger(__name__)
 
-id = None
+# Successive places to continue the call in the dialplan
+CONTINUATIONS = [
+    None,
 
-STASIS_END_EVENTS = 0
+    # Specifying no context or extension
+    {},
+    {'priority': 5},
+    {'label': 'eggs'},
+    {'priority': 5, 'label': 'toast'},
+    {'label': '11'},
+    {'priority': 5, 'label': '13'},
 
+    # Specifying extension but no context
+    {'extension': 'bacon'},
+    {'extension': 'bacon', 'priority': 3},
+    {'extension': 'bacon', 'label': 'muffin'},
+    {'extension': 'bacon', 'priority': 5, 'label': 'bagel'},
+    {'extension': 'bacon', 'label': '9'},
+    {'extension': 'bacon', 'priority': 5, 'label': '11'},
+
+    # Specifying context but no extension
+    {'context': 'taters'},
+    {'context': 'taters', 'priority': 3},
+    {'context': 'taters', 'label': 'hollandaise'},
+    {'context': 'taters', 'priority': 5, 'label': 'cereal'},
+    {'context': 'taters', 'label': '9'},
+    {'context': 'taters', 'priority': 5, 'label': '11'},
+
+    # Specifying context and extension
+    {'context': 'taters', 'extension': 'biscuit'},
+    {'context': 'taters', 'extension': 'biscuit', 'priority': 3},
+    {'context': 'taters', 'extension': 'biscuit', 'label': 'sausage'},
+    {'context': 'taters', 'extension': 'biscuit', 'priority': 5, 'label': 'pancakes'},
+    {'context': 'taters', 'extension': 'biscuit', 'label': '9'},
+    {'context': 'taters', 'extension': 'biscuit', 'priority': 5, 'label': '11'},
+]
+
+# Spacing used in this list helps line up with continuations in previous list
+EXPECTATIONS = [
+    's at default:2',
+
+    's at default:3',
+    's at default:5',
+    's at default:7',
+    's at default:9',
+    's at default:11',
+    's at default:13',
+
+    'bacon at default:1',
+    'bacon at default:3',
+    'bacon at default:5',
+    'bacon at default:7',
+    'bacon at default:9',
+    'bacon at default:11',
+
+    's at taters:1',
+    's at taters:3',
+    's at taters:5',
+    's at taters:7',
+    's at taters:9',
+    's at taters:11',
+
+    'biscuit at taters:1',
+    'biscuit at taters:3',
+    'biscuit at taters:5',
+    'biscuit at taters:7',
+    'biscuit at taters:9',
+    'biscuit at taters:11',
+]
+
+CURRENT_EVENT = 0
 
 def on_start(ari, event, test_object):
-    logger.debug("on_start(%r)" % event)
-    global id
-    id = event['channel']['id']
-    ari.post('channels', id, 'continue')
+    location = event['args'][0]
+    global CURRENT_EVENT
+
+    if location != EXPECTATIONS[CURRENT_EVENT]:
+        LOGGER.error("Stasis entered from {0}, expected {1}".format(location,
+            EXPECTATIONS[CURRENT_EVENT]))
+        return False
+
+    LOGGER.info("Stasis entered from expected location {0}".format(location))
+    CURRENT_EVENT += 1
+    if CURRENT_EVENT == len(CONTINUATIONS):
+        ari.delete('channels', event['channel']['id'])
+        return True
+
+    ari.post('channels', event['channel']['id'], 'continue',
+             **CONTINUATIONS[CURRENT_EVENT])
     return True
 
-
 def on_end(ari, event, test_object):
-    global id
-    global STASIS_END_EVENTS
-
-    logger.debug("on_end(%r)" % event)
-    STASIS_END_EVENTS += 1
-    if (STASIS_END_EVENTS == 2):
+    # We don't really care about StasisEnd until the final one
+    if CURRENT_EVENT == len(CONTINUATIONS):
+        LOGGER.info("Final StasisEnd received. Stopping reactor")
         test_object.stop_reactor()
 
-    return id == event['channel']['id']
-
-
-def on_second_start(ari, event, test_object):
-    global id
-    logger.debug("on_second_start(%r)" % event)
-    ari.delete('channels', id)
-    return id == event['channel']['id']
+    return True

Modified: asterisk/trunk/tests/rest_api/continue/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/continue/test-config.yaml?view=diff&rev=6192&r1=6191&r2=6192
==============================================================================
--- asterisk/trunk/tests/rest_api/continue/test-config.yaml (original)
+++ asterisk/trunk/tests/rest_api/continue/test-config.yaml Wed Jan  7 13:31:55 2015
@@ -1,8 +1,16 @@
 testinfo:
     summary: Test continuing on from the RESTful API back to the dialplan
     description: |
-        This test simply waits for a call via the WebSocket, then hits the
-        continue controller to send it back to the dialplan.
+        "This exhaustively tests the continue operation on channel resource. The
+        channel is entered into Stasis and then continued to the dialplan in a particular
+        location. At that location, the channel then re-enters Stasis. Each time the
+        channel enters Stasis, the channel gives its current dialplan location as an
+        application argument. The Stasis application checks this against its expected
+        entrance locations in order to determine if the continuation put the channel
+        into the expected place in the dialplan.
+
+        The dialplan also has 'traps' that will emit UserEvents that will automatically
+        fail the test if the channel reaches that extension."
 
 test-modules:
     add-test-to-search-path: True
@@ -12,6 +20,8 @@
     modules:
         -   config-section: ari-config
             typename: ari.WebSocketEventModule
+        -   config-section: ami-config
+            typename: ami.AMIEventModule
 
 test-object-config:
     stop-on-end: False
@@ -22,31 +32,31 @@
                 match:
                     type: StasisStart
                     application: testsuite
-                    args: []
-            count: 1
             callback:
                 module: rest_continue
                 method: on_start
+            count: '25'
         -   conditions:
                 match:
                     type: StasisEnd
                     application: testsuite
-            count: 2
             callback:
                 module: rest_continue
                 method: on_end
-        -   conditions:
-                match:
-                    type: StasisStart
-                    application: testsuite
-                    args: [fin]
-            count: 1
-            callback:
-                module: rest_continue
-                method: on_second_start
+            count: '25'
+
+ami-config:
+    -
+        type: 'headermatch'
+        conditions:
+            match:
+                Event: 'UserEvent'
+                UserEvent: 'Failed'
+        count: '0'
+
 
 properties:
-    minversion: '12.0.0'
+    minversion: '13.2.0'
     dependencies:
         - python : autobahn.websocket
         - python : requests




More information about the asterisk-commits mailing list