[svn-commits] asanders: testsuite/asterisk/trunk r6326 - in /asterisk/trunk/tests/rest_api/...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Jan 20 14:10:02 CST 2015


Author: asanders
Date: Tue Jan 20 14:09:54 2015
New Revision: 6326

URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=6326
Log:
Added the missing files from revision 6319.


Added:
    asterisk/trunk/tests/rest_api/bridges/error/
    asterisk/trunk/tests/rest_api/bridges/error/configs/
    asterisk/trunk/tests/rest_api/bridges/error/configs/ast1/
    asterisk/trunk/tests/rest_api/bridges/error/configs/ast1/extensions.conf   (with props)
    asterisk/trunk/tests/rest_api/bridges/error/error.py   (with props)
    asterisk/trunk/tests/rest_api/bridges/error/test-config.yaml   (with props)

Added: asterisk/trunk/tests/rest_api/bridges/error/configs/ast1/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/bridges/error/configs/ast1/extensions.conf?view=auto&rev=6326
==============================================================================
--- asterisk/trunk/tests/rest_api/bridges/error/configs/ast1/extensions.conf (added)
+++ asterisk/trunk/tests/rest_api/bridges/error/configs/ast1/extensions.conf Tue Jan 20 14:09:54 2015
@@ -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/bridges/error/configs/ast1/extensions.conf
------------------------------------------------------------------------------
    svn:eol-style = native

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

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

Added: asterisk/trunk/tests/rest_api/bridges/error/error.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/bridges/error/error.py?view=auto&rev=6326
==============================================================================
--- asterisk/trunk/tests/rest_api/bridges/error/error.py (added)
+++ asterisk/trunk/tests/rest_api/bridges/error/error.py Tue Jan 20 14:09:54 2015
@@ -1,0 +1,297 @@
+"""
+Copyright (C) 2014, Digium, Inc.
+Ashley Sanders <asanders at digium.com>
+
+This program is free software, distributed under the terms of
+the GNU General Public License Version 2.
+"""
+
+import logging
+import requests
+import uuid
+
+LOGGER = logging.getLogger(__name__)
+
+
+class BridgeInfo(object):
+    """Lightweight helper class for storing bridge information."""
+
+    def __init__(self, name='', bridge_type=''):
+        """Constructor.
+
+        Keyword Arguments:
+        name          --  The name of the bridge (optional)
+        bridge_type   --  The type of bridge (optional)
+        """
+
+        self.name = name
+        self.bridge_type = bridge_type
+        self.uid = str(uuid.uuid4())
+
+
+class BridgeErrorTest(object):
+    """Responsible for testing error conditions during bridge creation."""
+
+    DEFAULT_TEST_NAME = "acme"
+
+    DEFAULT_TEST_TYPE = "proxy_media"
+
+    def __init__(self, ari, event):
+        """Constructor.
+
+        Keyword Arguments:
+        ari     --  The wrapper object for ARI
+        event   --  The ARI StasisStart event object
+        """
+
+        # The pass/fail state variable for this test.
+        # Note: Value is only set to 'True' during initialization.
+        self.passing = True
+
+        # Initialize the baseline bridge info objects used during the tests
+        self.baseline_bridges = [BridgeInfo('road-runner'),
+                                 BridgeInfo(),
+                                 BridgeInfo('wiley-coyote', 'holding'),
+                                 BridgeInfo('', 'mixing')]
+
+        # The channel id that stasis gives us in the event argument
+        # Needed later for tearing down the test
+        self.stasis_channel_id = event['channel']['id'] or None
+
+        # Record state of ari.allow_errors so that it can
+        # correctly be reset at the end of the test
+        self.__set_ari_allow_errors = ari.allow_errors or False
+
+    def run_test(self, ari):
+        """Runs the test.
+
+        Tries to set up the state needed by the test and running the test
+        against all baseline bridges created during setup. Then tears
+        down the state created during setup.
+
+        Keyword Arguments:
+        ari   --  The wrapper object for ARI
+        """
+
+        try:
+            self.__setup_test(ari)
+            for i in range(len(self.baseline_bridges)):
+                self.__create_duplicate_bridges(ari, self.baseline_bridges[i])
+        finally:
+            self.__tear_down_test(ari)
+        return self.passing
+
+    def __setup_test(self, ari):
+        """Sets up the state needed for the test to execute.
+
+        Configures ARI to run the test and builds two baseline bridges to use
+        during the test.
+
+        Keyword Arguments:
+        ari   --  The wrapper object for ARI
+        """
+
+        LOGGER.debug("Performing test setup ...")
+
+        # Disable ARI auto-exceptions on HTTP errors
+        ari.set_allow_errors(True)
+
+        # Create a baseline bridge using bridge 0's id and name, but no type
+        self.__create_bridge(ari,
+                             'ok',
+                             None,
+                             self.baseline_bridges[0].uid,
+                             name=self.baseline_bridges[0].name)
+
+        # Create a baseline bridge without a name or type, using bridge 1's id
+        self.__create_bridge(ari,
+                             'ok',
+                             None,
+                             self.baseline_bridges[1].uid)
+
+        # Create a baseline bridge using bridge 2's id, name, and type
+        self.__create_bridge(ari,
+                             'ok',
+                             None,
+                             self.baseline_bridges[2].uid,
+                             name=self.baseline_bridges[2].name,
+                             type=self.baseline_bridges[2].bridge_type)
+
+        # Create a baseline bridge without a name, using bridge 3's id and type
+        self.__create_bridge(ari,
+                             'ok',
+                             None,
+                             self.baseline_bridges[3].uid,
+                             name=self.baseline_bridges[3].name,
+                             type=self.baseline_bridges[3].bridge_type)
+        return
+
+    def __tear_down_test(self, ari):
+        """Tears down the state created during test setup.
+
+        Restores ARI to its previous configuration and deletes the channel
+        and bridges used during test execution.
+
+        Keyword Arguments:
+        ari   --  The wrapper object for ARI
+        """
+        LOGGER.debug("Performing test tear down ...")
+
+        # Delete stasis channel used during the test
+        ari.delete('channels', self.stasis_channel_id)
+
+        # Delete bridges created during setup
+        for i in range(len(self.baseline_bridges)):
+            self.__delete_bridge(ari, self.baseline_bridges[i])
+
+        # Restore ARI auto-exceptions on HTTP errors to its original value
+        ari.set_allow_errors(self.__set_ari_allow_errors or False)
+
+        LOGGER.debug("Test tear down complete.")
+        return
+
+    def __validate_server_response(self, expected, resp):
+        """Validates the server response against the expected response.
+
+        Keyword Arguments:
+        expected   --  The expected http status code from the server.
+        resp       --  The server response object.
+        """
+
+        expected_code = requests.codes[expected]
+        if expected_code != resp.status_code:
+            self.passing = False
+            LOGGER.error("Test Failed. Expected %d (%s), got %s (%r)",
+                         expected_code,
+                         expected,
+                         resp.status_code,
+                         resp.json())
+            return False
+        return True
+
+    def __delete_bridge(self, ari, bridge_info):
+        """Deletes the bridge using the id of the bridge_info parameter.
+
+        Keyword Arguments:
+        ari           --  ARI wrapper object.
+        bridge_info   --  Object containing info about the bridge to delete.
+        """
+
+        LOGGER.debug("Deleting bridge [%s] with id: [%s]",
+                     bridge_info.name,
+                     bridge_info.uid)
+        ari.delete('bridges', bridge_info.uid)
+        return
+
+    def __create_bridge(self,
+                        ari,
+                        expected_status_code,
+                        description,
+                        bridge_uid,
+                        **kwargs):
+
+        """Creates a bridge with the expectation of failure.
+
+        Using the parameters given, posts to the 'bridges' endpoint. Then,
+        validates the server responded with the expected status code.
+
+        Keyword Arguments:
+        ari                   --  The wrapper object for ARI
+        expected_status_code  --  The expected response from the server
+        description           --  The text to write to the log
+        bridge_uid            --  The unique id for the bridge to create
+        kwargs                --  The query parameters
+        """
+
+        if description:
+            LOGGER.debug(description)
+        resp = ari.post('bridges',
+                        bridge_uid,
+                        **kwargs)
+        self.__validate_server_response(expected_status_code, resp)
+        return
+
+    def __create_duplicate_bridges(self, ari, bridge_info):
+        """Attempts to create a duplicate bridges.
+
+        Using the details of an existing bridge provided by the bridge_info
+        parameter, exercises fifteen state combinations to post to the
+        'bridges' endpoint.
+
+        Keyword Arguments:
+        ari           --  The wrapper object for ARI
+        bridge_info   --  The baseline bridge's information to use
+        """
+
+        LOGGER.debug("Current baseline bridge: [%s]", bridge_info.uid)
+
+        # Test AD
+        description = "Attempting to create a bridge using the same id \
+                       as the current baseline bridge, but with no name \
+                       and a different type specified"
+        self.__create_bridge(ari,
+                             'internal_server_error',
+                             description,
+                             bridge_info.uid,
+                             type=self.DEFAULT_TEST_TYPE)
+
+        # Test CD
+        description = "Attempting to create a bridge, using the same id \
+                       and name as the current baseline bridge but a \
+                       different type specified"
+        self.__create_bridge(ari,
+                             'internal_server_error',
+                             description,
+                             bridge_info.uid,
+                             name=bridge_info.name,
+                             type=self.DEFAULT_TEST_TYPE)
+
+        # Test DA
+        description = "Attempting to create a bridge using the same id \
+                       as the current baseline bridge but with a \
+                       different name and no type specified"
+        self.__create_bridge(ari,
+                             'internal_server_error',
+                             description,
+                             bridge_info.uid,
+                             name=self.DEFAULT_TEST_NAME)
+
+        # Test DC
+        description = "Attempting to create a bridge, using the same id \
+                       and type as the current baseline bridge but with a \
+                       different name specified"
+        self.__create_bridge(ari,
+                             'internal_server_error',
+                             description,
+                             bridge_info.uid,
+                             name=self.DEFAULT_TEST_NAME,
+                             type=bridge_info.bridge_type)
+
+        # Test DD
+        description = "Attempting to create a bridge using the same id \
+                       as the current baseline bridge but with a \
+                       different name and a different type"
+        self.__create_bridge(ari,
+                             'internal_server_error',
+                             description,
+                             bridge_info.uid,
+                             name=self.DEFAULT_TEST_NAME,
+                             type=self.DEFAULT_TEST_TYPE)
+        return
+
+
+def on_start(ari, event, test_object):
+    """Event handler for the StasisStart event.
+
+    Keyword Arguments:
+    ari           --  The wrapper object for ARI
+    event         --  The ARI StasisStart event object
+    test_object   --  The TestCase object running the test
+    """
+
+    LOGGER.debug("Starting bridge error test: on_start(%r)", event)
+    test = BridgeErrorTest(ari, event)
+    result = test.run_test(ari)
+    LOGGER.debug("Finsihed testing for bridge creation error conditions.")
+    test_object.stop_reactor()
+    return result

Propchange: asterisk/trunk/tests/rest_api/bridges/error/error.py
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: asterisk/trunk/tests/rest_api/bridges/error/error.py
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: asterisk/trunk/tests/rest_api/bridges/error/error.py
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: asterisk/trunk/tests/rest_api/bridges/error/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/rest_api/bridges/error/test-config.yaml?view=auto&rev=6326
==============================================================================
--- asterisk/trunk/tests/rest_api/bridges/error/test-config.yaml (added)
+++ asterisk/trunk/tests/rest_api/bridges/error/test-config.yaml Tue Jan 20 14:09:54 2015
@@ -1,0 +1,48 @@
+testinfo:
+    summary: Test for verifying that posts to the 'bridges' endpoint fails when expected.
+    description: |
+    The following combinations of variable states are the expected failure conditions:
+    Case AD:  name/none, type/different
+    Case CD:  name/same, type/different
+    Case DA:  name/different, type/none
+    Case DB:  name/different, type/empty
+    Case DC:  name/different, type/same
+    Case DD:  name/different, type/different
+
+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
+
+test-object-config:
+    stop-on-end: False
+
+ari-config:
+    apps: testsuite
+    events:
+        -   conditions:
+                match:
+                    type: StasisStart
+                    application: testsuite
+                    args: []
+            count: 1
+            callback:
+                module: error
+                method: on_start
+
+properties:
+    minversion: '13.2.0'
+    dependencies:
+        - python : autobahn.websocket
+        - python : requests
+        - python : twisted
+        - python : starpy
+        - asterisk : res_ari_channels
+        - asterisk : app_echo
+        - asterisk : res_ari_bridges
+    tags:
+        - ARI

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

Propchange: asterisk/trunk/tests/rest_api/bridges/error/test-config.yaml
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

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




More information about the svn-commits mailing list