[asterisk-commits] mjordan: testsuite/asterisk/trunk r5268 - in /asterisk/trunk/tests/rest_api/r...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Fri Jul 18 16:58:26 CDT 2014
Author: mjordan
Date: Fri Jul 18 16:58:21 2014
New Revision: 5268
URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=5268
Log:
recording/stored: Add nominal and off-nominal tests for copy operation
This patch adds tests to the Asterisk Test Suite for copying a stored
recording. Two tests are added for the operation, nominal and off-nominal.
* nominal - makes a live recording and finishes it. When finished, it takes
the resulting stored recording and copies it. The resulting stored
recording object is checked to see if it has the expected name and format.
* off nominal - makes a live recording and finishes it. When finished, it
makes a copy in the same fashion as nominal. Two off nominal checks are
then made:
- an attempt to copy the recording again to the same location. This
verifies that we get a 409.
- an attempt to copy an unknown stored recording. This verifies that we
get a 404.
Review: https://reviewboard.asterisk.org/r/3769/
ASTERISK-24036
Added:
asterisk/trunk/tests/rest_api/recording/stored/
asterisk/trunk/tests/rest_api/recording/stored/copy/
asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/
asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/configs/
asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/configs/ast1/
asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/configs/ast1/extensions.conf (with props)
asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/recording.py (with props)
asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/test-config.yaml (with props)
asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/
asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/configs/
asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/configs/ast1/
asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/configs/ast1/extensions.conf (with props)
asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/recording.py (with props)
asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/test-config.yaml (with props)
asterisk/trunk/tests/rest_api/recording/stored/copy/tests.yaml (with props)
asterisk/trunk/tests/rest_api/recording/stored/tests.yaml (with props)
Modified:
asterisk/trunk/tests/rest_api/recording/tests.yaml
Added: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/configs/ast1/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/configs/ast1/extensions.conf?view=auto&rev=5268
==============================================================================
--- asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/configs/ast1/extensions.conf (added)
+++ asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/configs/ast1/extensions.conf Fri Jul 18 16:58:21 2014
@@ -1,0 +1,6 @@
+[default]
+
+exten => s,1,NoOp()
+ same => n,Answer()
+ same => n,Stasis(testsuite)
+ same => n,Hangup()
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/recording.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/recording.py?view=auto&rev=5268
==============================================================================
--- asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/recording.py (added)
+++ asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/recording.py Fri Jul 18 16:58:21 2014
@@ -1,0 +1,140 @@
+"""
+Copyright (C) 2014, Digium, Inc.
+Joshua Colp <jcolp at digium.com>
+Matt Jordan <mjordan at digium.com>
+
+This program is free software, distributed under the terms of
+the GNU General Public License Version 2.
+"""
+
+import logging
+import requests
+from twisted.internet import reactor
+
+LOGGER = logging.getLogger(__name__)
+
+class TestLogic(object):
+ """A small object used to hold test data between events"""
+
+ def __init__(self):
+ """Constructor"""
+ self.channel_id = None
+ self.test_object = None
+ self.ari = None
+
+TEST = TestLogic()
+
+
+def fail_test():
+ """Fail the running test
+ """
+ TEST.test_object.set_passed(False)
+ TEST.test_object.stop_reactor()
+
+
+def on_start(ari, event, test_object):
+ """Handle StasisStart event
+
+ This will kick off a recording of superfly
+
+ Keyword Arguments:
+ event The StasisStart event
+ test_object Our one and only test object
+ """
+ TEST.test_object = test_object
+ TEST.ari = ari
+
+ TEST.channel_id = event['channel']['id']
+
+ LOGGER.info("Channel '%s' connected to Stasis. Starting the test")
+ TEST.ari.post('channels', TEST.channel_id, 'answer')
+ try:
+ TEST.ari.post('channels', TEST.channel_id, 'record',
+ name="superfly", format="wav")
+ except requests.exceptions.HTTPError:
+ LOGGER.error("Failed to record.")
+ fail_test()
+ return
+ LOGGER.info("Baseline recording started successfully.")
+ return True
+
+def on_recording_started(ari, event, test_object):
+ """Handler for the RecordingStarted event
+
+ This will stop the recording after 2 seconds
+
+ Keyword Arguments:
+ event The RecordingStarted event
+ test_object Our one and only test object
+ """
+ LOGGER.info("Recording started")
+
+ def _stop_recording(ari):
+ """Stop the live recording
+
+ Keyword Arguments:
+ ari The ARI object, passed in as a convenience
+ """
+ LOGGER.info("Now stopping recording")
+ try:
+ ari.post('recordings/live', 'superfly', 'stop')
+ except requests.exceptions.HTTPError:
+ LOGGER.error('Failed to stop recording.')
+ fail_test()
+ return True
+
+ reactor.callLater(2, _stop_recording, TEST.ari)
+ return True
+
+def on_recording_finished(ari, event, test_object):
+ """Handler for the RecordingFinished
+
+ Verify we have superfly as a stored recording, then
+ make a copy of it as superfreak in a subfolder 'copy'
+
+ Keyword Arguments:
+ event The RecordingFinished event
+ test_object Our one and only test object
+ """
+ LOGGER.info("Recording finished")
+
+ try:
+ stored = TEST.ari.get('recordings/stored', 'superfly').json()
+ except requests.exceptions.HTTPError:
+ LOGGER.error('Failed to get stored recording of superfly')
+ fail_test()
+ return
+
+ if stored['name'] != 'superfly':
+ LOGGER.error('Stored recording of superfly has incorrect name')
+ fail_test()
+ return
+ elif stored['format'] != 'wav':
+ LOGGER.error('Stored recording of superfly has incorrect format')
+ fail_test()
+ return
+
+ try:
+ superfreak = TEST.ari.post('recordings/stored', 'superfly', 'copy',
+ destinationRecordingName='copy/superfreak').json()
+ except requests.exceptions.HTTPError:
+ LOGGER.error('Failed to get copied recording superfreak')
+ fail_test()
+
+ if superfreak['name'] != 'copy/superfreak':
+ LOGGER.error('Stored recording of superfreak has incorrect name')
+ fail_test()
+ return
+ elif superfreak['format'] != 'wav':
+ LOGGER.error('Stored recording of superfreak has incorrect format')
+ fail_test()
+ return
+
+ LOGGER.info("Recording stopped and copied successfully. Leave Stasis.")
+ try:
+ TEST.ari.post('channels', TEST.channel_id, 'continue')
+ except requests.exceptions.HTTPError:
+ LOGGER.error('Failed to leave stasis. Crud.')
+ fail_test()
+ return
+ return True
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/recording.py
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/recording.py
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/recording.py
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/test-config.yaml?view=auto&rev=5268
==============================================================================
--- asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/test-config.yaml (added)
+++ asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/test-config.yaml Fri Jul 18 16:58:21 2014
@@ -1,0 +1,61 @@
+testinfo:
+ summary: Test copying a stored recording.
+ description: |
+ This test does the following:
+ - Makes a recording
+ - Verifies that we have a stored recording
+ - Copies the stored recording
+
+test-modules:
+ add-test-to-search-path: True
+ test-object:
+ config-section: test-object-config
+ typename: ari.AriTestObject
+ modules:
+ - config-section: ari-config
+ typename: ari.WebSocketEventModule
+
+ari-config:
+ apps: testsuite
+ events:
+ - conditions:
+ match:
+ type: StasisStart
+ application: testsuite
+ args: []
+ count: 1
+ callback:
+ module: recording
+ method: on_start
+ - conditions:
+ match:
+ type: RecordingStarted
+ callback:
+ module: recording
+ method: on_recording_started
+ count: 1
+ - conditions:
+ match:
+ type: RecordingFinished
+ callback:
+ module: recording
+ method: on_recording_finished
+ count: 1
+ - conditions:
+ match:
+ type: StasisEnd
+ application: testsuite
+ count: 1
+
+properties:
+ minversion: '12.5.0'
+ dependencies:
+ - python : autobahn.websocket
+ - python : requests
+ - python : twisted
+ - python : starpy
+ - asterisk : res_ari_channels
+ - asterisk : res_ari_recordings
+ - asterisk : app_echo
+ tags:
+ - ARI
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/test-config.yaml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/test-config.yaml
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/nominal/test-config.yaml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/configs/ast1/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/configs/ast1/extensions.conf?view=auto&rev=5268
==============================================================================
--- asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/configs/ast1/extensions.conf (added)
+++ asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/configs/ast1/extensions.conf Fri Jul 18 16:58:21 2014
@@ -1,0 +1,6 @@
+[default]
+
+exten => s,1,NoOp()
+ same => n,Answer()
+ same => n,Stasis(testsuite)
+ same => n,Hangup()
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/configs/ast1/extensions.conf
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/recording.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/recording.py?view=auto&rev=5268
==============================================================================
--- asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/recording.py (added)
+++ asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/recording.py Fri Jul 18 16:58:21 2014
@@ -1,0 +1,142 @@
+"""
+Copyright (C) 2014, Digium, Inc.
+Joshua Colp <jcolp at digium.com>
+Matt Jordan <mjordan at digium.com>
+
+This program is free software, distributed under the terms of
+the GNU General Public License Version 2.
+"""
+
+import logging
+import requests
+from twisted.internet import reactor
+
+LOGGER = logging.getLogger(__name__)
+
+class TestLogic(object):
+ """A small object used to hold test data between events"""
+
+ def __init__(self):
+ """Constructor"""
+ self.channel_id = None
+ self.test_object = None
+ self.ari = None
+
+TEST = TestLogic()
+
+
+def fail_test():
+ """Fail the running test
+ """
+ TEST.test_object.set_passed(False)
+ TEST.test_object.stop_reactor()
+
+
+def on_start(ari, event, test_object):
+ """Handle StasisStart event
+
+ This will kick off a recording of superfly
+
+ Keyword Arguments:
+ event The StasisStart event
+ test_object Our one and only test object
+ """
+ TEST.test_object = test_object
+ TEST.ari = ari
+
+ TEST.channel_id = event['channel']['id']
+
+ LOGGER.info("Channel '%s' connected to Stasis. Starting the test")
+ TEST.ari.post('channels', TEST.channel_id, 'answer')
+ try:
+ TEST.ari.post('channels', TEST.channel_id, 'record',
+ name="superfly", format="wav")
+ except requests.exceptions.HTTPError:
+ LOGGER.error("Failed to record.")
+ fail_test()
+ return
+ LOGGER.info("Baseline recording started successfully.")
+ return True
+
+def on_recording_started(ari, event, test_object):
+ """Handler for the RecordingStarted event
+
+ This will stop the recording after 2 seconds
+
+ Keyword Arguments:
+ event The RecordingStarted event
+ test_object Our one and only test object
+ """
+ LOGGER.info("Recording started")
+
+ def _stop_recording(ari):
+ """Stop the live recording
+
+ Keyword Arguments:
+ ari The ARI object, passed in as a convenience
+ """
+ LOGGER.info("Now stopping recording")
+ try:
+ ari.post('recordings/live', 'superfly', 'stop')
+ except requests.exceptions.HTTPError:
+ LOGGER.error('Failed to stop recording.')
+ fail_test()
+ return True
+
+ reactor.callLater(2, _stop_recording, TEST.ari)
+ return True
+
+def on_recording_finished(ari, event, test_object):
+ """Handler for the RecordingFinished
+
+ Verify we have superfly as a stored recording, then
+ make a copy of it as superfreak in a subfolder 'copy'
+
+ Keyword Arguments:
+ event The RecordingFinished event
+ test_object Our one and only test object
+ """
+ LOGGER.info("Recording finished")
+ got_exception = False
+
+ try:
+ stored = TEST.ari.get('recordings/stored', 'superfly').json()
+ except requests.exceptions.HTTPError:
+ LOGGER.error('Failed to get stored recording of superfly')
+ fail_test()
+ return
+
+ try:
+ superfreak = TEST.ari.post('recordings/stored', 'superfly', 'copy',
+ destinationRecordingName='copy/superfreak').json()
+ except requests.exceptions.HTTPError:
+ LOGGER.error('Failed to get copied recording superfreak')
+ fail_test()
+ return
+
+ # Start the off nominal tests
+ TEST.ari.set_allow_errors(True)
+
+ bad_recording = TEST.ari.post('recordings/stored', 'superfly', 'copy',
+ destinationRecordingName='copy/superfreak')
+ if bad_recording.status_code != 409:
+ LOGGER.error('Expected to get response 409, got %d' % bad_recording.status_code)
+ fail_test()
+ return
+
+ bad_recording = TEST.ari.post('recordings/stored', 'not-superfly', 'copy',
+ destinationRecordingName='copy/super-duper-freak')
+ if bad_recording.status_code != 404:
+ LOGGER.error('Expected to get response 404, got %d' % bad_recording.status_code)
+ fail_test()
+ return
+
+ TEST.ari.set_allow_errors(False)
+ LOGGER.info("Recording stopped and copied successfully. Leave Stasis.")
+ try:
+ TEST.ari.post('channels', TEST.channel_id, 'continue')
+ except requests.exceptions.HTTPError:
+ LOGGER.error('Failed to leave stasis. Crud.')
+ fail_test()
+ return
+ return True
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/recording.py
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/recording.py
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/recording.py
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/test-config.yaml?view=auto&rev=5268
==============================================================================
--- asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/test-config.yaml (added)
+++ asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/test-config.yaml Fri Jul 18 16:58:21 2014
@@ -1,0 +1,64 @@
+testinfo:
+ summary: Test off nominal copying of a stored recording.
+ description: |
+ This test does the following:
+ - Makes a recording
+ - Verifies that we have a stored recording
+ - Attempts to copy a non-existant recording
+ - Attempts to overwrite a copy
+ All of these are expected to fail with appropriate
+ error codes.
+
+test-modules:
+ add-test-to-search-path: True
+ test-object:
+ config-section: test-object-config
+ typename: ari.AriTestObject
+ modules:
+ - config-section: ari-config
+ typename: ari.WebSocketEventModule
+
+ari-config:
+ apps: testsuite
+ events:
+ - conditions:
+ match:
+ type: StasisStart
+ application: testsuite
+ args: []
+ count: 1
+ callback:
+ module: recording
+ method: on_start
+ - conditions:
+ match:
+ type: RecordingStarted
+ callback:
+ module: recording
+ method: on_recording_started
+ count: 1
+ - conditions:
+ match:
+ type: RecordingFinished
+ callback:
+ module: recording
+ method: on_recording_finished
+ count: 1
+ - conditions:
+ match:
+ type: StasisEnd
+ application: testsuite
+ count: 1
+
+properties:
+ minversion: '12.5.0'
+ dependencies:
+ - python : autobahn.websocket
+ - python : requests
+ - python : twisted
+ - python : starpy
+ - asterisk : res_ari_channels
+ - asterisk : res_ari_recordings
+ - asterisk : app_echo
+ tags:
+ - ARI
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/test-config.yaml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/test-config.yaml
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/off-nominal/test-config.yaml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/recording/stored/copy/tests.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/recording/stored/copy/tests.yaml?view=auto&rev=5268
==============================================================================
--- asterisk/trunk/tests/rest_api/recording/stored/copy/tests.yaml (added)
+++ asterisk/trunk/tests/rest_api/recording/stored/copy/tests.yaml Fri Jul 18 16:58:21 2014
@@ -1,0 +1,4 @@
+# Enter tests here in the order they should be considered for execution:
+tests:
+ - test: 'nominal'
+ - test: 'off-nominal'
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/tests.yaml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/tests.yaml
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/recording/stored/copy/tests.yaml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: asterisk/trunk/tests/rest_api/recording/stored/tests.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/recording/stored/tests.yaml?view=auto&rev=5268
==============================================================================
--- asterisk/trunk/tests/rest_api/recording/stored/tests.yaml (added)
+++ asterisk/trunk/tests/rest_api/recording/stored/tests.yaml Fri Jul 18 16:58:21 2014
@@ -1,0 +1,2 @@
+tests:
+ - dir: 'copy'
Propchange: asterisk/trunk/tests/rest_api/recording/stored/tests.yaml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: asterisk/trunk/tests/rest_api/recording/stored/tests.yaml
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange: asterisk/trunk/tests/rest_api/recording/stored/tests.yaml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: asterisk/trunk/tests/rest_api/recording/tests.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/recording/tests.yaml?view=diff&rev=5268&r1=5267&r2=5268
==============================================================================
--- asterisk/trunk/tests/rest_api/recording/tests.yaml (original)
+++ asterisk/trunk/tests/rest_api/recording/tests.yaml Fri Jul 18 16:58:21 2014
@@ -3,3 +3,4 @@
- test: 'file_conflicts'
- test: 'format_unavailable'
- test: 'nominal'
+ - dir: 'stored'
More information about the asterisk-commits
mailing list