<p>Benjamin Keith Ford has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/10897">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">testsuite: Added test for 'move' REST API call.<br><br>Added a new test that covers some simple use cases of the new 'move'<br>REST API call, which moves a channel from one application to another<br>without having to leave Stasis and re-enter dialplan. It tests a few<br>basic scenarios by putting a channel into Stasis and calling 'move' in<br>various ways, including trying to move to an application that doesn't<br>exist, moving to an application without specifying arguments, moving to<br>an application while specifying a single argument, and moving to an<br>application while specifying multiple arguments. If the channel leaves<br>Stasis and enters dialplan for any reason, a UserEvent is in place that<br>will catch it and fail the test.<br><br>Change-Id: I83a2da829dc363727de8c7b56680d21692011e40<br>---<br>A tests/rest_api/move/configs/ast1/extensions.conf<br>A tests/rest_api/move/rest_move.py<br>A tests/rest_api/move/test-config.yaml<br>M tests/rest_api/tests.yaml<br>4 files changed, 169 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/testsuite refs/changes/97/10897/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/rest_api/move/configs/ast1/extensions.conf b/tests/rest_api/move/configs/ast1/extensions.conf</span><br><span>new file mode 100644</span><br><span>index 0000000..64b8b3d</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rest_api/move/configs/ast1/extensions.conf</span><br><span>@@ -0,0 +1,10 @@</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 => _.,1,UserEvent(Failed)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+exten => s,1,Answer()</span><br><span style="color: hsl(120, 100%, 40%);">+ same => n,Stasis(testsuite,destination)</span><br><span style="color: hsl(120, 100%, 40%);">+ same => n,UserEvent(Failed)</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%);">+exten => h,1,NoOp()</span><br><span>diff --git a/tests/rest_api/move/rest_move.py b/tests/rest_api/move/rest_move.py</span><br><span>new file mode 100644</span><br><span>index 0000000..5777abc</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rest_api/move/rest_move.py</span><br><span>@@ -0,0 +1,37 @@</span><br><span style="color: hsl(120, 100%, 40%);">+'''</span><br><span style="color: hsl(120, 100%, 40%);">+Copyright (C) 2019, Digium, Inc.</span><br><span style="color: hsl(120, 100%, 40%);">+Ben Ford <bford@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 logging</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 on_start(ari, event, test_object):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    app = event['application']</span><br><span style="color: hsl(120, 100%, 40%);">+    chan_id = event['channel']['id']</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if app == "testsuite":</span><br><span style="color: hsl(120, 100%, 40%);">+        # Do this post first - nothing should happen</span><br><span style="color: hsl(120, 100%, 40%);">+        ari.post('channels', chan_id, 'move', app="i-dont-exist")</span><br><span style="color: hsl(120, 100%, 40%);">+        ari.post('channels', chan_id, 'move', app='no-args')</span><br><span style="color: hsl(120, 100%, 40%);">+    elif app == "no-args":</span><br><span style="color: hsl(120, 100%, 40%);">+        ari.post('channels', chan_id, 'move', app='one-arg', appArgs='apples')</span><br><span style="color: hsl(120, 100%, 40%);">+    elif app == "one-arg":</span><br><span style="color: hsl(120, 100%, 40%);">+        ari.post('channels', chan_id, 'move', app="multiple-args", appArgs='apples,bananas,carrots')</span><br><span style="color: hsl(120, 100%, 40%);">+    elif app == "multiple-args":</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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+def on_end(ari, event, test_object):</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if event['application'] == "multiple-args":</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGGER.info("Final StasisEnd received. Stopping reactor")</span><br><span style="color: hsl(120, 100%, 40%);">+        test_object.stop_reactor()</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/move/test-config.yaml b/tests/rest_api/move/test-config.yaml</span><br><span>new file mode 100644</span><br><span>index 0000000..e35ff18</span><br><span>--- /dev/null</span><br><span>+++ b/tests/rest_api/move/test-config.yaml</span><br><span>@@ -0,0 +1,121 @@</span><br><span style="color: hsl(120, 100%, 40%);">+testinfo:</span><br><span style="color: hsl(120, 100%, 40%);">+    summary: Test moving from one Stasis application to another.</span><br><span style="color: hsl(120, 100%, 40%);">+    description: |</span><br><span style="color: hsl(120, 100%, 40%);">+        "Test that moving from one Stasis application to another via the</span><br><span style="color: hsl(120, 100%, 40%);">+        move REST API call. That channel should remain in Stasis for the</span><br><span style="color: hsl(120, 100%, 40%);">+        entire duration of the test, until the very end. A UserEvent is</span><br><span style="color: hsl(120, 100%, 40%);">+        in place to ensure that the channel does not leave Stasis, and</span><br><span style="color: hsl(120, 100%, 40%);">+        will fail the test if triggered.</span><br><span style="color: hsl(120, 100%, 40%);">+        </span><br><span style="color: hsl(120, 100%, 40%);">+        A few different scenarios are covered:</span><br><span style="color: hsl(120, 100%, 40%);">+            - Moving from one app to another</span><br><span style="color: hsl(120, 100%, 40%);">+            - Switching apps and supplying one argument</span><br><span style="color: hsl(120, 100%, 40%);">+            - Switching apps and supplying multiple arguments</span><br><span style="color: hsl(120, 100%, 40%);">+            - Attempting to switch to a non-existent app"</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%);">+        -   config-section: ami-config</span><br><span style="color: hsl(120, 100%, 40%);">+            typename: ami.AMIEventModule</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%);">+    apps: testsuite,no-args,one-arg,multiple-args</span><br><span style="color: hsl(120, 100%, 40%);">+    stop-on-end: False</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%);">+    events:</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%);">+            callback:</span><br><span style="color: hsl(120, 100%, 40%);">+                module: rest_move</span><br><span style="color: hsl(120, 100%, 40%);">+                method: on_start</span><br><span style="color: hsl(120, 100%, 40%);">+            count: '1'</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%);">+            callback:</span><br><span style="color: hsl(120, 100%, 40%);">+                module: rest_move</span><br><span style="color: hsl(120, 100%, 40%);">+                method: on_end</span><br><span style="color: hsl(120, 100%, 40%);">+            count: '1'</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: no-args</span><br><span style="color: hsl(120, 100%, 40%);">+            callback:</span><br><span style="color: hsl(120, 100%, 40%);">+                module: rest_move</span><br><span style="color: hsl(120, 100%, 40%);">+                method: on_start</span><br><span style="color: hsl(120, 100%, 40%);">+            count: '1'</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: no-args</span><br><span style="color: hsl(120, 100%, 40%);">+            callback:</span><br><span style="color: hsl(120, 100%, 40%);">+                module: rest_move</span><br><span style="color: hsl(120, 100%, 40%);">+                method: on_end</span><br><span style="color: hsl(120, 100%, 40%);">+            count: '1'</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: one-arg</span><br><span style="color: hsl(120, 100%, 40%);">+                    args: ['apples']</span><br><span style="color: hsl(120, 100%, 40%);">+            callback:</span><br><span style="color: hsl(120, 100%, 40%);">+                module: rest_move</span><br><span style="color: hsl(120, 100%, 40%);">+                method: on_start</span><br><span style="color: hsl(120, 100%, 40%);">+            count: '1'</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: one-arg</span><br><span style="color: hsl(120, 100%, 40%);">+            callback:</span><br><span style="color: hsl(120, 100%, 40%);">+                module: rest_move</span><br><span style="color: hsl(120, 100%, 40%);">+                method: on_end</span><br><span style="color: hsl(120, 100%, 40%);">+            count: '1'</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: multiple-args</span><br><span style="color: hsl(120, 100%, 40%);">+                    args: ['apples','bananas','carrots']</span><br><span style="color: hsl(120, 100%, 40%);">+            callback:</span><br><span style="color: hsl(120, 100%, 40%);">+                module: rest_move</span><br><span style="color: hsl(120, 100%, 40%);">+                method: on_start</span><br><span style="color: hsl(120, 100%, 40%);">+            count: '1'</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: multiple-args</span><br><span style="color: hsl(120, 100%, 40%);">+            callback:</span><br><span style="color: hsl(120, 100%, 40%);">+                module: rest_move</span><br><span style="color: hsl(120, 100%, 40%);">+                method: on_end</span><br><span style="color: hsl(120, 100%, 40%);">+            count: '1'</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ami-config:</span><br><span style="color: hsl(120, 100%, 40%);">+    -</span><br><span style="color: hsl(120, 100%, 40%);">+        type: 'headermatch'</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%);">+                Event: 'UserEvent'</span><br><span style="color: hsl(120, 100%, 40%);">+                UserEvent: 'Failed'</span><br><span style="color: hsl(120, 100%, 40%);">+        count: '0'</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%);">+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%);">+        - asterisk : app_echo</span><br><span style="color: hsl(120, 100%, 40%);">+    tags:</span><br><span style="color: hsl(120, 100%, 40%);">+        - ARI</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/tests.yaml b/tests/rest_api/tests.yaml</span><br><span>index ac9303c..8968f8f 100644</span><br><span>--- a/tests/rest_api/tests.yaml</span><br><span>+++ b/tests/rest_api/tests.yaml</span><br><span>@@ -17,3 +17,4 @@</span><br><span>     - dir:  'events'</span><br><span>     - dir:  'message'</span><br><span>     - dir:  'external_interaction'</span><br><span style="color: hsl(120, 100%, 40%);">+    - test: 'move'</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/10897">change 10897</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/10897"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: testsuite </div>
<div style="display:none"> Gerrit-Branch: 13 </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I83a2da829dc363727de8c7b56680d21692011e40 </div>
<div style="display:none"> Gerrit-Change-Number: 10897 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Benjamin Keith Ford <bford@digium.com> </div>