[asterisk-commits] mjordan: branch mjordan/framework r3284 - in /asterisk/team/mjordan/framework...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Jun 26 17:41:33 CDT 2012
Author: mjordan
Date: Tue Jun 26 17:41:29 2012
New Revision: 3284
URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=3284
Log:
Make a branch for some of this framework stuff
Added:
asterisk/team/mjordan/framework/ (props changed)
- copied from r3281, asterisk/trunk/
asterisk/team/mjordan/framework/lib/python/asterisk/SimpleTestCase.py
- copied unchanged from r3282, asterisk/trunk/lib/python/asterisk/SimpleTestCase.py
asterisk/team/mjordan/framework/lib/python/asterisk/TestCase.py
- copied unchanged from r3282, asterisk/trunk/lib/python/asterisk/TestCase.py
asterisk/team/mjordan/framework/lib/python/asterisk/TestRunner.py
- copied unchanged from r3282, asterisk/trunk/lib/python/asterisk/TestRunner.py
asterisk/team/mjordan/framework/lib/python/asterisk/cdr.py
- copied unchanged from r3282, asterisk/trunk/lib/python/asterisk/cdr.py
asterisk/team/mjordan/framework/logger.conf
- copied unchanged from r3282, asterisk/trunk/logger.conf
asterisk/team/mjordan/framework/runtests.py
- copied unchanged from r3282, asterisk/trunk/runtests.py
asterisk/team/mjordan/framework/tests/cdr/ForkCdrModule.py
- copied unchanged from r3282, asterisk/trunk/tests/cdr/ForkCdrModule.py
asterisk/team/mjordan/framework/tests/cdr/batch_cdrs/
- copied from r3282, asterisk/trunk/tests/cdr/batch_cdrs/
asterisk/team/mjordan/framework/tests/cdr/cdr_accountcode/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/cdr_accountcode/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/cdr_fork_end_time/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/cdr_fork_end_time/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/cdr_originate_sip_congestion_log/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/cdr_originate_sip_congestion_log/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/cdr_unanswered_yes/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/cdr_unanswered_yes/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/cdr_userfield/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/cdr_userfield/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/console_dial_sip_answer/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/console_dial_sip_answer/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/console_dial_sip_busy/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/console_dial_sip_busy/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/console_dial_sip_congestion/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/console_dial_sip_congestion/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/console_dial_sip_transfer/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/console_dial_sip_transfer/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/console_fork_after_busy_forward/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/console_fork_after_busy_forward/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/console_fork_before_dial/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/console_fork_before_dial/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/nocdr/test-config.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/nocdr/test-config.yaml
asterisk/team/mjordan/framework/tests/cdr/tests.yaml
- copied unchanged from r3282, asterisk/trunk/tests/cdr/tests.yaml
Removed:
asterisk/team/mjordan/framework/tests/cdr/cdr_accountcode/run-test
asterisk/team/mjordan/framework/tests/cdr/cdr_fork_end_time/run-test
asterisk/team/mjordan/framework/tests/cdr/cdr_originate_sip_congestion_log/run-test
asterisk/team/mjordan/framework/tests/cdr/cdr_unanswered_yes/run-test
asterisk/team/mjordan/framework/tests/cdr/cdr_userfield/run-test
asterisk/team/mjordan/framework/tests/cdr/console_dial_sip_answer/run-test
asterisk/team/mjordan/framework/tests/cdr/console_dial_sip_busy/run-test
asterisk/team/mjordan/framework/tests/cdr/console_dial_sip_congestion/run-test
asterisk/team/mjordan/framework/tests/cdr/console_dial_sip_transfer/run-test
asterisk/team/mjordan/framework/tests/cdr/console_fork_after_busy_forward/run-test
asterisk/team/mjordan/framework/tests/cdr/console_fork_before_dial/run-test
asterisk/team/mjordan/framework/tests/cdr/nocdr/run-test
Modified:
asterisk/team/mjordan/framework/lib/python/asterisk/ami.py
Propchange: asterisk/team/mjordan/framework/
------------------------------------------------------------------------------
reviewboard:url = https://reviewboard.asterisk.org
Propchange: asterisk/team/mjordan/framework/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Jun 26 17:41:29 2012
@@ -1,0 +1,2 @@
+asterisk-test-suite-report.xml
+*.pyc
Propchange: asterisk/team/mjordan/framework/
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Tue Jun 26 17:41:29 2012
@@ -1,0 +1,2 @@
+/asterisk/team/group/cdr_test_log_congestion:1823-2951
+/asterisk/trunk:1112
Propchange: asterisk/team/mjordan/framework/
------------------------------------------------------------------------------
svnmerge-integrated = /asterisk/trunk:1-3246
Modified: asterisk/team/mjordan/framework/lib/python/asterisk/ami.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/team/mjordan/framework/lib/python/asterisk/ami.py?view=diff&rev=3284&r1=3281&r2=3284
==============================================================================
--- asterisk/team/mjordan/framework/lib/python/asterisk/ami.py (original)
+++ asterisk/team/mjordan/framework/lib/python/asterisk/ami.py Tue Jun 26 17:41:29 2012
@@ -1,10 +1,151 @@
+#!/usr/bin/env python
+'''Asterisk AMI functionality
+
+This module implements a variety of helper classes that interact with Asterisk
+AMI
+
+Copyright (C) 2012, 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.
+'''
+
from twisted.internet import reactor, protocol
from starpy import manager
import datetime
import sys
+import re
import logging
logger = logging.getLogger(__name__)
+
+class AMIEventModule:
+ ''' A pluggable component that listens for AMI events '''
+
+ def __init__(self, module_config, test_object):
+ ''' Constructor
+
+ Parameters:
+ module_config The yaml loaded configuration for this module
+ test_object A concrete implementation of TestClass
+ '''
+ self._test_object = test_object
+
+ # Build up the events we expect to listen for
+ for asterisk_config in module_config:
+ asterisk_instance = 1
+ expected_events = []
+ if 'asterisk-instance' in asterisk_config:
+ asterisk_instance = asterisk_config['asterisk-instance']
+ for _config in asterisk_instance['expected-events']:
+ sequence_type = 'any-order'
+ if 'sequence-type' in event_config:
+ sequence_type = event_config['sequence-type']
+ for event in event_config['events']:
+ pass_fileds = {}
+ raise_fields = {}
+ pass_type = 'ALL'
+ raise_type = 'ANY'
+ pass_fields = event_config['pass-fields']
+ raise_fields = event_config['raise-fields']
+ pass_type = event_config['pass-type']
+ raise_type = event_config['raise-type']
+ event = AMIEvent(self._test_object.ami[asterisk_instance - 1],
+ event_config['event'],
+ self._handle_event,
+ raise_fields,
+ raise_type,
+ pass_fields,
+ pass_type)
+ expected_events
+
+ def _handle_event(self, ami_event):
+ pass
+
+class AMIEvent:
+ ''' A class that tracks whether or not an AMI event has been received
+ '''
+
+ def __init__(self, ami, event_type, callback, raise_fields={}, raise_match_type='ALL',
+ pass_fields={}, pass_match_type='ANY'):
+ ''' Constructors
+
+ Parameters:
+ ami The AMI instance to register to
+ event_type The type of the event to track
+ callback Called when a match is made. The callback function should
+ receive a single argument, which will be this object.
+ raise_fields A dictionary of fields and values that, if we receive a match on,
+ implies that this event has been received.
+ raise_match_type Specifies whether we have to match on any of the fields, or
+ all of the fields in order to raise the callback. Valid values are ALL,
+ ANY, and ALWAYS (which implies that any event that gets passed the pass
+ fields will be raised).
+ pass_fields A dictionary of fields and values that, if we match on, implies
+ that we should ignore the event
+ pass_match_type Specifies whether we have to match on any of the pass fields to
+ ignore it, or match any of the fields
+ '''
+
+ self.raise_matches = {}
+ self.ami = ami
+ self.event_type = event_type
+ self._callback_fns = []
+ self._callback_fns.append(callback)
+ self._raise_fields = {}
+ for field in raise_fields:
+ self._raise_fields[field] = re.compile(raise_fields[field])
+ self._pass_fields = {}
+ for field in pass_fields:
+ self._pass_fields[field] = re.compile(pass_fields[field])
+ self._raise_match_type = raise_match_type
+ self._pass_match_type = pass_match_type
+ self.ami.registerEvent(self.event_type, self._event_handler)
+
+ def register_callback(self, callback):
+ ''' Register another callback function to be called when a match occurs
+
+ Parameters:
+ callback The function to call
+ '''
+ self._callback_fns.append(callback)
+
+ def _event_handler(self, ami, event):
+ ''' AMI event handler '''
+
+ # Determine if we should pass on this event
+ pass_matches = []
+ for key, value in self._pass_fields.items():
+ if key in event and value.match(event[key]) is not None:
+ pass_matches.append(key)
+ if (self._pass_match_type.upper() == 'ANY' and
+ len(pass_matches) > 0):
+ return
+ elif (self._pass_match_type.upper() == 'ALL' and
+ len(pass_matches) == len(self._pass_fields)):
+ return
+
+ # Determine the matching fields
+ for key, value in self._raise_fields.items():
+ if key in event and value.match(event[key]) is not None:
+ self.raise_matches[key] = True
+ else:
+ self.raise_matches[key] = False
+ matches = len([v for k, v in self.raise_matches.items() if v])
+ if (self._pass_match_type.upper() == 'ANY' and matches > 0):
+ self._raise_callback()
+ elif (self._pass_match_type.upper() == 'ALL' and
+ matches == len(self._raise_fields)):
+ self._raise_callback()
+ elif (self._pass_match_type.upper() == 'ALWAYS'):
+ self._raise_callback()
+
+ def _raise_callback(self):
+ ''' Raise the callbacks '''
+ for callback in self._callback_fns:
+ callback(self)
+
class AMI:
def __init__(self, on_login, on_error, timeout=60, user="mark", secret="mysecret", host="127.0.0.1", port=5038):
More information about the asterisk-commits
mailing list