[asterisk-commits] mjordan: testsuite/asterisk/trunk r6134 - in /asterisk/trunk/tests/channels/p...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Dec 24 06:53:24 CST 2014


Author: mjordan
Date: Wed Dec 24 06:53:10 2014
New Revision: 6134

URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=6134
Log:
Add a test for PJSIP keep alive packets for connection oriented transports

This patch adds a test for the PJSIP keep_alive_interval option. It sets the
keep_alive_interval to 2 seconds, makes a TCP client connection to the PJSIP
stack, and then waits for 5 keep alives. Upon receiving 5 packets, it
disconnects and stops the test.

In all cases, the test verifies on stopping:
* That 5 total packets were received
* That the time deltas between packets were received within approximately 2
  seconds of each other
* That the keep alive values are all '\r\n\r\n'

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

Added:
    asterisk/trunk/tests/channels/pjsip/keep_alive/
    asterisk/trunk/tests/channels/pjsip/keep_alive/configs/
    asterisk/trunk/tests/channels/pjsip/keep_alive/configs/ast1/
    asterisk/trunk/tests/channels/pjsip/keep_alive/configs/ast1/pjsip.conf   (with props)
    asterisk/trunk/tests/channels/pjsip/keep_alive/keep_alive.py   (with props)
    asterisk/trunk/tests/channels/pjsip/keep_alive/test-config.yaml   (with props)
Modified:
    asterisk/trunk/tests/channels/pjsip/tests.yaml

Added: asterisk/trunk/tests/channels/pjsip/keep_alive/configs/ast1/pjsip.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/channels/pjsip/keep_alive/configs/ast1/pjsip.conf?view=auto&rev=6134
==============================================================================
--- asterisk/trunk/tests/channels/pjsip/keep_alive/configs/ast1/pjsip.conf (added)
+++ asterisk/trunk/tests/channels/pjsip/keep_alive/configs/ast1/pjsip.conf Wed Dec 24 06:53:10 2014
@@ -1,0 +1,8 @@
+[global]
+type=global
+keep_alive_interval=2
+
+[transport-tcp]
+type=transport
+protocol=tcp
+bind=0.0.0.0

Propchange: asterisk/trunk/tests/channels/pjsip/keep_alive/configs/ast1/pjsip.conf
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: asterisk/trunk/tests/channels/pjsip/keep_alive/configs/ast1/pjsip.conf
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: asterisk/trunk/tests/channels/pjsip/keep_alive/configs/ast1/pjsip.conf
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: asterisk/trunk/tests/channels/pjsip/keep_alive/keep_alive.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/channels/pjsip/keep_alive/keep_alive.py?view=auto&rev=6134
==============================================================================
--- asterisk/trunk/tests/channels/pjsip/keep_alive/keep_alive.py (added)
+++ asterisk/trunk/tests/channels/pjsip/keep_alive/keep_alive.py Wed Dec 24 06:53:10 2014
@@ -1,0 +1,122 @@
+"""Keep alive verification
+
+This module provides a pluggable module for the Asterisk Test Suite that
+verifies keep-alive packets (CRLF) received over a TCP connection with the
+PJSIP stack in Asterisk.
+
+Copyright (C) 2014, Digium, Inc.
+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
+from datetime import datetime
+
+from twisted.internet import reactor, protocol
+
+LOGGER = logging.getLogger(__name__)
+
+received_packets = []
+
+
+class KeepAliveProtocol(protocol.Protocol):
+    """Twisted protocol for Asterisk PJSIP keep alives"""
+
+    def __init__(self, test_object):
+        """Constructor
+
+        Keyword Arguments:
+        test_object The one and only test object
+        """
+        self.test_object = test_object
+
+    def dataReceived(self, data):
+        LOGGER.debug('Received packet: {}'.format(data))
+        received_packets.append((datetime.utcnow(), data))
+        if len(received_packets) == 5:
+            self.transport.loseConnection()
+
+
+class KeepAliveFactory(protocol.ClientFactory):
+    """Twisted protocol factory for KeepAliveProtocol"""
+
+    def __init__(self, test_object):
+        """Constructor
+
+        Keyword Arguments:
+        test_object The one and only test object
+        """
+        self.test_object = test_object
+
+    def buildProtocol(self, addr):
+        """Build a KeepAliveProtocol"""
+        return KeepAliveProtocol(self.test_object)
+
+    def clientConnectionFailed(self, connector, reason):
+        """twisted callback for a failed client connection"""
+        LOGGER.warn('Failed to connect to Asterisk on port 5060: {}'.format(
+            reason))
+        self.test_object.set_passed(False)
+        self.test_object.stop_reactor()
+
+    def clientConnectionLost(self, connector, reason):
+        """twisted callback for a lost client connection"""
+        LOGGER.info('Client connection dropped: {}'.format(reason))
+        self.test_object.stop_reactor()
+
+
+class KeepAliveReceiver(object):
+    """A pluggable module for verifying the keep_alive_interval option"""
+
+    def __init__(self, module_config, test_object):
+        """Constructor
+
+        Keyword Arguments:
+        module_config The configuration for this pluggable module
+        test_object   The one and only test object
+        """
+
+        # Use the AMI callback to know for sure we are fully booted
+        self.test_object = test_object
+        test_object.register_ami_observer(self.ami_connect_cb)
+        test_object.register_stop_observer(self.stop_cb)
+
+    def ami_connect_cb(self, ami):
+        """Callback called when AMI connects
+
+        Keyword Arguments:
+        ami The AMI manager object for our Asterisk instance
+        """
+        reactor.connectTCP('localhost', 5060,
+                           KeepAliveFactory(self.test_object))
+
+    def stop_cb(self, result):
+        """Deferred callback called when Asterisk is stopped
+
+        Used to verify that we got our packets.
+        """
+        if len(received_packets) != 5:
+            LOGGER.warn('Failed to get 5 packets: got {} instead'.format(
+                len(received_packets)))
+            self.test_object.set_passed(False)
+            return result
+
+        deltas = [round((j[0] - i[0]).total_seconds()) for i, j in
+                  zip(received_packets[:-1], received_packets[1:])]
+        if not all([d == 2 for d in deltas]):
+            LOGGER.warn('Failed to get expected deltas between keep-alives')
+            LOGGER.warn('Deltas: {}'.format(deltas))
+            LOGGER.warn('Received packets: {}'.format(received_packets))
+            self.test_object.set_passed(False)
+            return result
+
+        if not all([p[1] == '\r\n\r\n' for p in received_packets]):
+            LOGGER.warn('Failed to get expected keep-alive values')
+            LOGGER.warn('Received packets: {}'.format(received_packets))
+            self.test_object.set_passed(False)
+            return result
+
+        self.test_object.set_passed(True)
+        return result

Propchange: asterisk/trunk/tests/channels/pjsip/keep_alive/keep_alive.py
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: asterisk/trunk/tests/channels/pjsip/keep_alive/keep_alive.py
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: asterisk/trunk/tests/channels/pjsip/keep_alive/keep_alive.py
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: asterisk/trunk/tests/channels/pjsip/keep_alive/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/channels/pjsip/keep_alive/test-config.yaml?view=auto&rev=6134
==============================================================================
--- asterisk/trunk/tests/channels/pjsip/keep_alive/test-config.yaml (added)
+++ asterisk/trunk/tests/channels/pjsip/keep_alive/test-config.yaml Wed Dec 24 06:53:10 2014
@@ -1,0 +1,35 @@
+testinfo:
+    summary: 'Verify the keep_alive_interval setting for the PJSIP stack'
+    description: |
+        This test verifies the keep_alive_interval setting for the PJSIP stack
+        in Asterisk. It sets the keep_alive_interval to 2 seconds, makes a
+        TCP client connection to the PJSIP stack, and then waits for 5 keep
+        alives. Upon receiving 5 packets, it disconnects and stops the test.
+        In all cases, the test verifies on stopping:
+         * That 5 total packets were received
+         * That the time deltas between packets were received within
+           approximately 2 seconds of each other
+         * That the keep alive values are all '\r\n\r\n'
+
+test-modules:
+    add-test-to-search-path: True
+    test-object:
+        config-section: test-object-config
+        typename: 'test_case.TestCaseModule'
+    modules:
+        -
+            typename: 'keep_alive.KeepAliveReceiver'
+            config-section: dummy-config
+
+test-object-config:
+    asterisk-instances: 1
+    connect-ami: True
+
+dummy-config:
+
+properties:
+    minversion: '13.2.0'
+    dependencies:
+        - asterisk : 'res_pjsip'
+    tags:
+        - pjsip

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

Propchange: asterisk/trunk/tests/channels/pjsip/keep_alive/test-config.yaml
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

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

Modified: asterisk/trunk/tests/channels/pjsip/tests.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/channels/pjsip/tests.yaml?view=diff&rev=6134&r1=6133&r2=6134
==============================================================================
--- asterisk/trunk/tests/channels/pjsip/tests.yaml (original)
+++ asterisk/trunk/tests/channels/pjsip/tests.yaml Wed Dec 24 06:53:10 2014
@@ -30,3 +30,4 @@
     - dir: 'optimistic_srtp'
     - test: 'in_dialog_invite_replaces'
     - test: 'dtmf_incompatible'
+    - test: 'keep_alive'




More information about the asterisk-commits mailing list