<p>George Joseph has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/testsuite/+/12783">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">rest-api:  Tests for external media<br><br>Change-Id: I0ebd6bc75ea853ba5912bdf300dd60af8bb76ae8<br>---<br>A tests/rest_api/channels/external_media/nominal/configs/ast1/extensions.conf<br>A tests/rest_api/channels/external_media/nominal/create_with_vars.py<br>A tests/rest_api/channels/external_media/nominal/test-config.yaml<br>A tests/rest_api/channels/external_media/off-nominal/configs/ast1/extensions.conf<br>A tests/rest_api/channels/external_media/off-nominal/off_nominal.py<br>A tests/rest_api/channels/external_media/off-nominal/test-config.yaml<br>A tests/rest_api/channels/external_media/tests.yaml<br>M tests/rest_api/channels/tests.yaml<br>8 files changed, 213 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/testsuite refs/changes/83/12783/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/rest_api/channels/external_media/nominal/configs/ast1/extensions.conf b/tests/rest_api/channels/external_media/nominal/configs/ast1/extensions.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..6741734</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rest_api/channels/external_media/nominal/configs/ast1/extensions.conf</span><br><span>@@ -0,0 +1,8 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[default]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+exten => s,1,NoOp()</span><br><span style="color: hsl(120, 100%, 40%);">+        same => n,Answer()</span><br><span style="color: hsl(120, 100%, 40%);">+ same => n,Stasis(testsuite)</span><br><span style="color: hsl(120, 100%, 40%);">+        same => n,Hangup()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/rest_api/channels/external_media/nominal/create_with_vars.py b/tests/rest_api/channels/external_media/nominal/create_with_vars.py</span><br><span>new file mode 100644</span><br><span>index 0000000..7154fda</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rest_api/channels/external_media/nominal/create_with_vars.py</span><br><span>@@ -0,0 +1,31 @@</span><br><span style="color: hsl(120, 100%, 40%);">+'''</span><br><span style="color: hsl(120, 100%, 40%);">+Copyright (C) 2019, Sangoma Technologies Corporation</span><br><span style="color: hsl(120, 100%, 40%);">+George Joseph <gjoseph@digium.com></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This program is free software, distributed under the terms of</span><br><span style="color: hsl(120, 100%, 40%);">+the GNU General Public License Version 2.</span><br><span style="color: hsl(120, 100%, 40%);">+'''</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import json</span><br><span style="color: hsl(120, 100%, 40%);">+import requests</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def on_start(ari, event, obj):</span><br><span style="color: hsl(120, 100%, 40%);">+    params = {</span><br><span style="color: hsl(120, 100%, 40%);">+        'channelId': 'testsuite-default-id',</span><br><span style="color: hsl(120, 100%, 40%);">+        'external_host': '127.0.0.1:59999',</span><br><span style="color: hsl(120, 100%, 40%);">+        'app': 'testsuite',</span><br><span style="color: hsl(120, 100%, 40%);">+        'encapsulation': 'rtp',</span><br><span style="color: hsl(120, 100%, 40%);">+        'transport': 'udp',</span><br><span style="color: hsl(120, 100%, 40%);">+        'format': 'ulaw',</span><br><span style="color: hsl(120, 100%, 40%);">+        'json': {'variables': {'CALLERID(name)': 'foo'}}</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    resp = ari.post('channels', 'externalMedia', **params)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    assert resp.json()['caller']['name'] == 'foo'</span><br><span style="color: hsl(120, 100%, 40%);">+    # Delete the channel we just created</span><br><span style="color: hsl(120, 100%, 40%);">+    ari.delete('channels', resp.json()['id'])</span><br><span style="color: hsl(120, 100%, 40%);">+    # Delete the implicit channel created by the test object</span><br><span style="color: hsl(120, 100%, 40%);">+    ari.delete('channels', event['channel']['id'])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return True</span><br><span>diff --git a/tests/rest_api/channels/external_media/nominal/test-config.yaml b/tests/rest_api/channels/external_media/nominal/test-config.yaml</span><br><span>new file mode 100644</span><br><span>index 0000000..02826b1</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rest_api/channels/external_media/nominal/test-config.yaml</span><br><span>@@ -0,0 +1,45 @@</span><br><span style="color: hsl(120, 100%, 40%);">+testinfo:</span><br><span style="color: hsl(120, 100%, 40%);">+    summary: Test External Media channel creation</span><br><span style="color: hsl(120, 100%, 40%);">+    description: |</span><br><span style="color: hsl(120, 100%, 40%);">+        Creates an externalMedia channel and checks to make sure the specified</span><br><span style="color: hsl(120, 100%, 40%);">+        channel variable(s) got set.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test-modules:</span><br><span style="color: hsl(120, 100%, 40%);">+    add-test-to-search-path: True</span><br><span style="color: hsl(120, 100%, 40%);">+    test-object:</span><br><span style="color: hsl(120, 100%, 40%);">+        config-section: test-object-config</span><br><span style="color: hsl(120, 100%, 40%);">+        typename: ari.AriTestObject</span><br><span style="color: hsl(120, 100%, 40%);">+    modules:</span><br><span style="color: hsl(120, 100%, 40%);">+        -   config-section: ari-config</span><br><span style="color: hsl(120, 100%, 40%);">+            typename: ari.WebSocketEventModule</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test-object-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    stop-on-end: True</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ari-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    apps: testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+    events:</span><br><span style="color: hsl(120, 100%, 40%);">+       # This is the StasisStart for the implicit Local channel</span><br><span style="color: hsl(120, 100%, 40%);">+       # created by the test object.  When we get it, we create</span><br><span style="color: hsl(120, 100%, 40%);">+       # the externalMedia channel.</span><br><span style="color: hsl(120, 100%, 40%);">+        -   conditions:</span><br><span style="color: hsl(120, 100%, 40%);">+                match:</span><br><span style="color: hsl(120, 100%, 40%);">+                    type: StasisStart</span><br><span style="color: hsl(120, 100%, 40%);">+                    application: testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+                    args: []</span><br><span style="color: hsl(120, 100%, 40%);">+                    channel:</span><br><span style="color: hsl(120, 100%, 40%);">+                       name: 'Local'</span><br><span style="color: hsl(120, 100%, 40%);">+            count: 1</span><br><span style="color: hsl(120, 100%, 40%);">+            callback:</span><br><span style="color: hsl(120, 100%, 40%);">+                module: create_with_vars</span><br><span style="color: hsl(120, 100%, 40%);">+                method: on_start</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+properties:</span><br><span style="color: hsl(120, 100%, 40%);">+    dependencies:</span><br><span style="color: hsl(120, 100%, 40%);">+        - python : autobahn.websocket</span><br><span style="color: hsl(120, 100%, 40%);">+        - python : requests</span><br><span style="color: hsl(120, 100%, 40%);">+        - python : twisted</span><br><span style="color: hsl(120, 100%, 40%);">+        - python : starpy</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : res_ari_channels</span><br><span style="color: hsl(120, 100%, 40%);">+    tags:</span><br><span style="color: hsl(120, 100%, 40%);">+        - ARI</span><br><span>diff --git a/tests/rest_api/channels/external_media/off-nominal/configs/ast1/extensions.conf b/tests/rest_api/channels/external_media/off-nominal/configs/ast1/extensions.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..6741734</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rest_api/channels/external_media/off-nominal/configs/ast1/extensions.conf</span><br><span>@@ -0,0 +1,8 @@</span><br><span style="color: hsl(120, 100%, 40%);">+[default]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+exten => s,1,NoOp()</span><br><span style="color: hsl(120, 100%, 40%);">+     same => n,Answer()</span><br><span style="color: hsl(120, 100%, 40%);">+ same => n,Stasis(testsuite)</span><br><span style="color: hsl(120, 100%, 40%);">+        same => n,Hangup()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/tests/rest_api/channels/external_media/off-nominal/off_nominal.py b/tests/rest_api/channels/external_media/off-nominal/off_nominal.py</span><br><span>new file mode 100644</span><br><span>index 0000000..9de234a</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rest_api/channels/external_media/off-nominal/off_nominal.py</span><br><span>@@ -0,0 +1,62 @@</span><br><span style="color: hsl(120, 100%, 40%);">+'''</span><br><span style="color: hsl(120, 100%, 40%);">+Copyright (C) 2019, Sangoma Technologies Corporation</span><br><span style="color: hsl(120, 100%, 40%);">+George Joseph <gjoseph@digium.com></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This program is free software, distributed under the terms of</span><br><span style="color: hsl(120, 100%, 40%);">+the GNU General Public License Version 2.</span><br><span style="color: hsl(120, 100%, 40%);">+'''</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import json</span><br><span style="color: hsl(120, 100%, 40%);">+import logging</span><br><span style="color: hsl(120, 100%, 40%);">+from requests.exceptions import HTTPError</span><br><span style="color: hsl(120, 100%, 40%);">+import requests</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+LOGGER = logging.getLogger(__name__)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def try_create(ari, channel_id, host, format, encapsulation, transport, resp_code):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    params = {</span><br><span style="color: hsl(120, 100%, 40%);">+        'channelId': channel_id,</span><br><span style="color: hsl(120, 100%, 40%);">+        'app': 'testsuite'</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+    if host:</span><br><span style="color: hsl(120, 100%, 40%);">+        params['external_host'] = host</span><br><span style="color: hsl(120, 100%, 40%);">+    if format:</span><br><span style="color: hsl(120, 100%, 40%);">+        params['format'] = format</span><br><span style="color: hsl(120, 100%, 40%);">+    if encapsulation:</span><br><span style="color: hsl(120, 100%, 40%);">+        params['encapsulation'] = encapsulation</span><br><span style="color: hsl(120, 100%, 40%);">+    if transport:</span><br><span style="color: hsl(120, 100%, 40%);">+        params['transport'] = transport</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    try:</span><br><span style="color: hsl(120, 100%, 40%);">+        resp = ari.post('channels', 'externalMedia', **params)</span><br><span style="color: hsl(120, 100%, 40%);">+    except HTTPError as e:</span><br><span style="color: hsl(120, 100%, 40%);">+        if e.response.status_code != resp_code:</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGGER.error("Unexpected response {0}".format(e.response))</span><br><span style="color: hsl(120, 100%, 40%);">+            return False</span><br><span style="color: hsl(120, 100%, 40%);">+        return True</span><br><span style="color: hsl(120, 100%, 40%);">+    except:</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGGER.error("Unexpected exception when originating")</span><br><span style="color: hsl(120, 100%, 40%);">+        return False</span><br><span style="color: hsl(120, 100%, 40%);">+    else:</span><br><span style="color: hsl(120, 100%, 40%);">+        if resp_code != 200:</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGGER.error("Originate succeeded when we expected failure")</span><br><span style="color: hsl(120, 100%, 40%);">+            return False</span><br><span style="color: hsl(120, 100%, 40%);">+        return True</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def on_start(ari, event, obj):</span><br><span style="color: hsl(120, 100%, 40%);">+    if event['args'] == ['FAIL']:</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGGER.error("Unexpected StasisStart on duplicate ID channel")</span><br><span style="color: hsl(120, 100%, 40%);">+        return False</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    passed = (</span><br><span style="color: hsl(120, 100%, 40%);">+        try_create(ari, "test1", "127.0.0.1:59999", "ulaw", "rtp", "XXX", 501)     # bad transport</span><br><span style="color: hsl(120, 100%, 40%);">+        and try_create(ari, "test2", "127.0.0.1:59999", "ulaw", "YYY", "udp", 501) # bad encapsulation</span><br><span style="color: hsl(120, 100%, 40%);">+        and try_create(ari, "test3", "127.0.0.1:59999", "ulaw", "YYY", "XXX", 501) # both bad</span><br><span style="color: hsl(120, 100%, 40%);">+        and try_create(ari, "test4", None, "ulaw", "rtp", "udp", 400)              # no host</span><br><span style="color: hsl(120, 100%, 40%);">+        and try_create(ari, "test5", "127.0.0.1:59999", None, "rtp", "udp", 400)   # no format</span><br><span style="color: hsl(120, 100%, 40%);">+        and try_create(ari, "test6", "127.0.0.1:59999", "XXX", "rtp", "udp", 400)  # bad format</span><br><span style="color: hsl(120, 100%, 40%);">+        and try_create(ari, "test7", "127.0.0.1", "ulaw", "rtp", "udp", 400)       # bad host</span><br><span style="color: hsl(120, 100%, 40%);">+        )</span><br><span style="color: hsl(120, 100%, 40%);">+    ari.delete("channels", event['channel']['id'])</span><br><span style="color: hsl(120, 100%, 40%);">+    return passed</span><br><span>diff --git a/tests/rest_api/channels/external_media/off-nominal/test-config.yaml b/tests/rest_api/channels/external_media/off-nominal/test-config.yaml</span><br><span>new file mode 100644</span><br><span>index 0000000..e5c37f9</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rest_api/channels/external_media/off-nominal/test-config.yaml</span><br><span>@@ -0,0 +1,53 @@</span><br><span style="color: hsl(120, 100%, 40%);">+testinfo:</span><br><span style="color: hsl(120, 100%, 40%);">+    summary: Test External Media channel failure</span><br><span style="color: hsl(120, 100%, 40%);">+    description: |</span><br><span style="color: hsl(120, 100%, 40%);">+        Attempts to create an externalMedia channel with unsupported</span><br><span style="color: hsl(120, 100%, 40%);">+        or missing parameters.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test-modules:</span><br><span style="color: hsl(120, 100%, 40%);">+    add-test-to-search-path: True</span><br><span style="color: hsl(120, 100%, 40%);">+    test-object:</span><br><span style="color: hsl(120, 100%, 40%);">+        config-section: test-object-config</span><br><span style="color: hsl(120, 100%, 40%);">+        typename: ari.AriTestObject</span><br><span style="color: hsl(120, 100%, 40%);">+    modules:</span><br><span style="color: hsl(120, 100%, 40%);">+        -   config-section: ari-config</span><br><span style="color: hsl(120, 100%, 40%);">+            typename: ari.WebSocketEventModule</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+test-object-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    stop-on-end: True</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ari-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    apps: testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+    events:</span><br><span style="color: hsl(120, 100%, 40%);">+       # This is the StasisStart for the implicit Local channel</span><br><span style="color: hsl(120, 100%, 40%);">+       # created by the test object.  When we get it, we</span><br><span style="color: hsl(120, 100%, 40%);">+       # try to create the externalMedia channels.</span><br><span style="color: hsl(120, 100%, 40%);">+        -   conditions:</span><br><span style="color: hsl(120, 100%, 40%);">+                match:</span><br><span style="color: hsl(120, 100%, 40%);">+                    type: StasisStart</span><br><span style="color: hsl(120, 100%, 40%);">+                    application: testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+                    args: []</span><br><span style="color: hsl(120, 100%, 40%);">+                    channel:</span><br><span style="color: hsl(120, 100%, 40%);">+                       name: 'Local'</span><br><span style="color: hsl(120, 100%, 40%);">+            count: 1</span><br><span style="color: hsl(120, 100%, 40%);">+            callback:</span><br><span style="color: hsl(120, 100%, 40%);">+                module: off_nominal</span><br><span style="color: hsl(120, 100%, 40%);">+                method: on_start</span><br><span style="color: hsl(120, 100%, 40%);">+#        -   conditions:</span><br><span style="color: hsl(120, 100%, 40%);">+#                match:</span><br><span style="color: hsl(120, 100%, 40%);">+#                    type: StasisEnd</span><br><span style="color: hsl(120, 100%, 40%);">+#                    application: testsuite</span><br><span style="color: hsl(120, 100%, 40%);">+#                    channel:</span><br><span style="color: hsl(120, 100%, 40%);">+#                       name: '^Local'</span><br><span style="color: hsl(120, 100%, 40%);">+#            count: 1</span><br><span style="color: hsl(120, 100%, 40%);">+#            stop_test:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+properties:</span><br><span style="color: hsl(120, 100%, 40%);">+    dependencies:</span><br><span style="color: hsl(120, 100%, 40%);">+        - python : autobahn.websocket</span><br><span style="color: hsl(120, 100%, 40%);">+        - python : requests</span><br><span style="color: hsl(120, 100%, 40%);">+        - python : twisted</span><br><span style="color: hsl(120, 100%, 40%);">+        - python : starpy</span><br><span style="color: hsl(120, 100%, 40%);">+        - asterisk : res_ari_channels</span><br><span style="color: hsl(120, 100%, 40%);">+    tags:</span><br><span style="color: hsl(120, 100%, 40%);">+        - ARI</span><br><span>diff --git a/tests/rest_api/channels/external_media/tests.yaml b/tests/rest_api/channels/external_media/tests.yaml</span><br><span>new file mode 100644</span><br><span>index 0000000..1253ff8</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rest_api/channels/external_media/tests.yaml</span><br><span>@@ -0,0 +1,4 @@</span><br><span style="color: hsl(120, 100%, 40%);">+# Enter tests here in the order they should be considered for execution:</span><br><span style="color: hsl(120, 100%, 40%);">+tests:</span><br><span style="color: hsl(120, 100%, 40%);">+    - test: 'nominal'</span><br><span style="color: hsl(120, 100%, 40%);">+    - test: 'off-nominal'</span><br><span>diff --git a/tests/rest_api/channels/tests.yaml b/tests/rest_api/channels/tests.yaml</span><br><span>index 090788e..b585099 100644</span><br><span>--- a/tests/rest_api/channels/tests.yaml</span><br><span>+++ b/tests/rest_api/channels/tests.yaml</span><br><span>@@ -15,4 +15,5 @@</span><br><span>     - dir: 'hold'</span><br><span>     - test: 'originate_duplicate_id'</span><br><span>     - test: 'create_duplicate_id'</span><br><span style="color: hsl(0, 100%, 40%);">-    - dir: 'rtp_statistics'</span><br><span>\ No newline at end of file</span><br><span style="color: hsl(120, 100%, 40%);">+    - dir: 'rtp_statistics'</span><br><span style="color: hsl(120, 100%, 40%);">+    - dir: 'external_media'</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/testsuite/+/12783">change 12783</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/testsuite/+/12783"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: testsuite </div>
<div style="display:none"> Gerrit-Branch: 16 </div>
<div style="display:none"> Gerrit-Change-Id: I0ebd6bc75ea853ba5912bdf300dd60af8bb76ae8 </div>
<div style="display:none"> Gerrit-Change-Number: 12783 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>