[asterisk-commits] jrose: testsuite/asterisk/trunk r3341 - in /asterisk/trunk: lib/python/asteri...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Jul 19 14:24:44 CDT 2012


Author: jrose
Date: Thu Jul 19 14:24:39 2012
New Revision: 3341

URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=3341
Log:
AMI Event Module: Add ordered header matching mode

Also fixes a missed inclusion from the ForkCdrModule that made tests
using it end prematurely without indicating failure properly.

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

Modified:
    asterisk/trunk/lib/python/asterisk/TestCase.py
    asterisk/trunk/lib/python/asterisk/ami.py
    asterisk/trunk/sample-yaml/ami-config.yaml.sample
    asterisk/trunk/tests/cdr/ForkCdrModule.py

Modified: asterisk/trunk/lib/python/asterisk/TestCase.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/lib/python/asterisk/TestCase.py?view=diff&rev=3341&r1=3340&r2=3341
==============================================================================
--- asterisk/trunk/lib/python/asterisk/TestCase.py (original)
+++ asterisk/trunk/lib/python/asterisk/TestCase.py Thu Jul 19 14:24:39 2012
@@ -331,6 +331,7 @@
                 except twisted.internet.error.ReactorNotRunning:
                     # Something stopped it between our checks - at least we're stopped
                     pass
+            return result
         if not self._stopping:
             self._stopping = True
             df = self.__stop_asterisk()

Modified: asterisk/trunk/lib/python/asterisk/ami.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/lib/python/asterisk/ami.py?view=diff&rev=3341&r1=3340&r2=3341
==============================================================================
--- asterisk/trunk/lib/python/asterisk/ami.py (original)
+++ asterisk/trunk/lib/python/asterisk/ami.py Thu Jul 19 14:24:39 2012
@@ -8,7 +8,7 @@
 logger = logging.getLogger(__name__)
 
 class AMIEventInstance(object):
-    ''' 
+    '''
     Base class for specific instances of AMI event observers
 
     This handles common elements for both headermatch and callback
@@ -149,6 +149,57 @@
         self.test_object.set_passed(self.passed)
         return callback_param
 
+class AMIOrderedHeaderMatchInstance(AMIEventInstance):
+    '''
+    A subclass of AMIEventInstance that operates by matching headers of
+    AMI events to expected values. If a header does not match its expected
+    value, then the test will fail. This differs from AMIHeaderMatchInstance
+    in that the order of specification is used to define an expected order
+    for the events to arrive in which must be matched in order for the test
+    to pass.
+    '''
+    def __init__(self, instance_config, test_object):
+        super(AMIOrderedHeaderMatchInstance, self).__init__(instance_config, test_object)
+        logger.debug("Initializing an AMIOrderedHeaderMatchInstance")
+        self.match_index = 0
+        self.match_requirements = []
+        self.nonmatch_requirements = []
+        for instance in instance_config['requirements']:
+            self.match_requirements.append(
+                    instance.get('match', {}))
+            self.nonmatch_requirements.append(
+                    instance.get('nomatch', {}))
+
+    def event_callback(self, ami, event):
+        if self.match_index >= len(self.match_requirements):
+            logger.debug("Event received and not defined: %s" % event)
+            return
+
+        for k,v in self.match_requirements[self.match_index].items():
+            if not re.match(v, event.get(k.lower())):
+                logger.warning("Requirement %s: %s does not match %s: %s in event" %
+                        (k, v, k, event.get(k.lower())))
+                self.passed = False
+            else:
+                logger.debug("Requirement %s: %s matches %s: %s in event" %
+                        (k, v, k, event.get(k.lower())))
+
+        for k,v in self.nonmatch_requirements[self.match_index].items():
+            if re.match(v, event.get(k.lower(), '')):
+                logger.warning("Requirement %s: %s matches %s: %s in event" %
+                        (k, v, k, event.get(k.lower(), '')))
+                self.passed = False
+            else:
+                logger.debug("Requirement %s: %s does not match %s: %s in event" %
+                        (k, v, k, event.get(k.lower(), '')))
+
+        self.match_index += 1
+        return (ami, event)
+
+    def check_result(self, callback_param):
+        self.test_object.set_passed(self.passed)
+        return callback_param
+
 class AMICallbackInstance(AMIEventInstance):
     '''
     Subclass of AMIEventInstance that operates by calling a user-defined
@@ -178,6 +229,9 @@
         if instance_type == "headermatch":
             logger.debug("instance type is 'headermatch'")
             return AMIHeaderMatchInstance(instance_config, test_object)
+        elif instance_type == "orderedheadermatch":
+            logger.debug("instance type is 'orderedheadermatch'")
+            return AMIOrderedHeaderMatchInstance(instance_config, test_object)
         elif instance_type == "callback":
             logger.debug("instance type is 'callback'")
             return AMICallbackInstance(instance_config, test_object)

Modified: asterisk/trunk/sample-yaml/ami-config.yaml.sample
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/sample-yaml/ami-config.yaml.sample?view=diff&rev=3341&r1=3340&r2=3341
==============================================================================
--- asterisk/trunk/sample-yaml/ami-config.yaml.sample (original)
+++ asterisk/trunk/sample-yaml/ami-config.yaml.sample Thu Jul 19 14:24:39 2012
@@ -47,6 +47,46 @@
         # must occur 3 or more times.
         count: '>3'
     -
+        # The "orderedheadermatch" type indicates that when a condition match is
+        # made, there is a list of ordered requirements. The first time the match
+        # occurs, the first requirement in the list is expected and if it doesn't
+        # match, then the test is failed. If it succeeded, it will expect the
+        # second requirement in the requirements list and it will continue until
+        # either a mismatch occurs and the test fails or the list or requirements
+        # is exhausted.
+        type: 'orderedheadermatch'
+
+        # Conditions are handled exactly the same as for "headermatch" types.
+        conditions:
+            match:
+                Event: 'Bridge'
+                BridgeState: 'Link'
+            nomatch:
+                CallerID1: 'Bob.*'
+
+        # If the parameters in the "conditions" section match, then
+        # the first item in the list in the "requirements" section will be checked.
+        # If any of the requirements should fail, then the test has failed. If they
+        # all succeed, the next time the event is handled the next requirement list
+        # item will be used instead. If a condition matches and the requirements
+        # list is already exhausted, then the event will be allowed without
+        # affecting success or failure of the test.
+        requirements:
+            -
+                match:
+                    uniqueid1: '1234.*'
+                    BridgeType: 'core'
+            -
+                match:
+                    uniqueid1: '5678.*'
+                    BridgeType: 'core'
+
+        # The number of times this event is expected. If just a number is
+        # provided, then the event must happen exactly that number of times.
+        # Normally, this should probably be the number of requirements specified
+        # above.
+        count: '2'
+    -
         # The "callback" type indicates that when event conditions are fulfilled
         # A callback should be called into. This is useful if pass/fail conditions
         # depend on more than just having specific headers match what is expected.

Modified: asterisk/trunk/tests/cdr/ForkCdrModule.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/cdr/ForkCdrModule.py?view=diff&rev=3341&r1=3340&r2=3341
==============================================================================
--- asterisk/trunk/tests/cdr/ForkCdrModule.py (original)
+++ asterisk/trunk/tests/cdr/ForkCdrModule.py Thu Jul 19 14:24:39 2012
@@ -12,6 +12,7 @@
 
 sys.path.append("lib/python")
 from cdr import CDRModule
+from cdr import AsteriskCSVCDR
 
 logger = logging.getLogger(__name__)
 




More information about the asterisk-commits mailing list