[asterisk-commits] mjordan: testsuite/asterisk/trunk r2507 - in /asterisk/trunk: ./ lib/python/a...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Oct 11 12:04:21 CDT 2011


Author: mjordan
Date: Tue Oct 11 12:04:14 2011
New Revision: 2507

URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=2507
Log:
Added test execution modes to the test suite

This change adds the ability for a test configuration to be defined
at a global level, enabling or disabling features for all tests that
are executed.  This global information is shared with all tests that
inherit from the python TestCase class.

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

Added:
    asterisk/trunk/lib/python/asterisk/ChannelTestCondition.py   (with props)
    asterisk/trunk/test-config.yaml   (with props)
Modified:
    asterisk/trunk/README.txt
    asterisk/trunk/lib/python/asterisk/FdTestCondition.py
    asterisk/trunk/lib/python/asterisk/TestCase.py
    asterisk/trunk/lib/python/asterisk/TestConditions.py
    asterisk/trunk/lib/python/asterisk/TestConfig.py
    asterisk/trunk/runtests.py
    asterisk/trunk/tests/apps/voicemail/authenticate_extensions/run-test
    asterisk/trunk/tests/apps/voicemail/authenticate_extensions/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/authenticate_invalid_mailbox/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/authenticate_invalid_password/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/authenticate_nominal/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_callback/configs/ast1/extensions.conf
    asterisk/trunk/tests/apps/voicemail/check_voicemail_callback/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_delete/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_dialout/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_envelope/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_forward/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_forward_hangup/configs/ast2/extensions.conf
    asterisk/trunk/tests/apps/voicemail/check_voicemail_forward_hangup/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_forward_with_prepend/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_new_user/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_new_user_hangup/configs/ast2/extensions.conf
    asterisk/trunk/tests/apps/voicemail/check_voicemail_new_user_hangup/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_nominal/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_options_change_password/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_options_record_busy/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_options_record_name/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_options_record_temp/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_options_record_unavail/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_reply/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/check_voicemail_while_leaving_msg/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/func_vmcount/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/leave_voicemail_contexts/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/leave_voicemail_external_notification/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/leave_voicemail_forwarding/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/leave_voicemail_forwarding_auto_urgent/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/leave_voicemail_nominal/test-config.yaml
    asterisk/trunk/tests/apps/voicemail/leave_voicemail_priority/test-config.yaml

Modified: asterisk/trunk/README.txt
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/README.txt?view=diff&rev=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/README.txt (original)
+++ asterisk/trunk/README.txt Tue Oct 11 12:04:14 2011
@@ -279,13 +279,86 @@
 #
 # Example test configuration file - test-config.yaml
 #
-# All elements are required unless explicitly noted as OPTIONAL
+# All elements are required unless explicitly noted as OPTIONAL.  If marked
+# GLOBAL, those elements are only processed if they exist in the top level
+# test-config.yaml file, which applies global options across the test.
 #
 
-# The testinfo section contains information that describes the purpose of the
-# test.
+# The global settings section, which defines which test configuration to execute
+# and other non-test specific information
+global-settings: # GLOBAL
+    # The active test configuration.  The value must match a subsequent key
+    # in this file, which defines the global settings to apply to the test execution
+    # run.
+    test-configuration: config-pessimistic # GLOBAL
+
+    # The following sequence defines for any test configuration the available pre-
+    # and post-test conditions.  The 'name' field specifies how the test configurations
+    # refer to the pre- and post-test conditions in order to activate them.
+    condition-definitions: # GLOBAL
+            -
+                name: 'threads'
+                # A pre-test condition, which specifies that the object will be evaluated
+                # prior to test execution
+                pre:
+                    # The fully qualified Python typename of the object to create using
+                    # introspection
+                    typename: 'asterisk.ThreadTestCondition.ThreadPreTestCondition'
+                post:
+                    typename: 'asterisk.ThreadTestCondition.ThreadPostTestCondition'
+                    # The fully qualified Python typename of the object to pass to the evaluate
+                    # function of this object
+                    related-type: 'asterisk.ThreadTestCondition.ThreadPreTestCondition'
+            -
+                name: 'sip-dialogs'
+                pre:
+                    typename: 'asterisk.SipDialogTestCondition.SipDialogPreTestCondition'
+                post:
+                    typename: 'asterisk.SipDialogTestCondition.SipDialogPostTestCondition'
+            -
+                name: 'locks'
+                pre:
+                    typename: 'asterisk.LockTestCondition.LockTestCondition'
+                post:
+                    typename: 'asterisk.LockTestCondition.LockTestCondition'
+            -
+                name: 'file-descriptors'
+                pre:
+                    typename: 'asterisk.FdTestCondition.FdPreTestCondition'
+                post:
+                    typename: 'asterisk.FdTestCondition.FdPostTestCondition'
+                    related-type: 'asterisk.FdTestCondition.FdPreTestCondition'
+            -
+                name: 'channels'
+                pre:
+                    typename: 'asterisk.ChannelTestCondition.ChannelTestCondition'
+                post:
+                    typename: 'asterisk.ChannelTestCondition.ChannelTestCondition'
+
+# A global test definition.  This name can be anything, but must be referenced
+# by the global-settings.test-configuration key.
+config-pessimistic: # GLOBAL
+    # A list of tests to explicitly exclude from execution.  This overrides the
+    # test listsing in the tests.yaml files.
+    exclude-tests: # GLOBAL
+        # The name of a test to exclude.  Name matching is done using the Python
+        # in operator.
+        - 'authenticate_invalid_password'
+    properties:
+        # The test conditions to apply to all tests.  See specific configuration
+        # information for the test conditions in the individual test configuration
+        # section below.
+        testconditions:
+            - name: 'threads'
+            - name: 'sip-dialogs'
+            - name: 'locks'
+            - name: 'file-descriptors'
+            - name: 'channels'
+
+# The testinfo section contains information that describes the purpose of an
+# individual test
 testinfo:
-    skip : 'Breif reason for skipping test' # OPTIONAL
+    skip : 'Brief reason for skipping test' # OPTIONAL
     summary     : 'Put a short one liner summary of the test here'
     issues      : |
         # List of issue numbers associated with this test
@@ -300,6 +373,7 @@
 # dependencies for this test.
 properties:
     minversion : '1.4' # minimum Asterisk version compatible with this test
+    buildoption : 'TEST_FRAMEWORK' # OPTIONAL - Asterisk compilation flag
     maxversion : '1.8' # OPTIONAL
     dependencies : |   # OPTIONAL
         # List dependencies that must be met for this test to run
@@ -312,6 +386,11 @@
         # import a module by this name to determine whether the dependency is
         # met.
         - python : 'yaml'
+
+        # A 'module' dependency is an Asterisk module that must be loaded by
+        # Asterisk in order for this test to execute.  If the module is not loaded,
+        # the test will not execute.
+        - module : 'app_dial'
 
         # 'custom' dependency can be anything.  Checking for this dependency is
         # done by calling a corresponding method in the Dependency class in
@@ -319,7 +398,61 @@
         # depend_ipv6() method is called to determine if the dependency is met.
         - custom : 'ipv6'
         - custom : 'fax'
-
+    testconditions: # OPTIONAL
+        #
+        # List of overrides for pre-test and post-test conditions.  If a condition is
+        # defined for a test, the configuration of that condition in the test overrides
+        # the setting defined in the global test configuration file.
+        #
+        -   # Check for thread usage in Asterisk.  Any threads present in Asterisk after test
+            # execution - and any threads that were detected prior to test execution
+            # that are no longer present - will be flagged as a test error.
+            name: 'threads'
+            #
+            # Disable execution of this condition.  This setting applies to any defined condition.
+            # Any other value but 'False' will result in the condition being executed.
+            enabled: 'False'
+            #
+            # Execute the condition, but expect the condition to fail
+            expectedResult: 'Fail'
+            #
+            # The thread test condition allows for certain detected threads to be
+            # ignored.  This is a list of the thread names, as reported by the CLI
+            # command 'core show threads'
+            ignoredThreads:
+                - 'netconsole'
+                - 'pbx_thread'
+        #
+        -   # Check for SIP dialog usage.  This looks for any SIP dialogs present
+            # in the system before and after a run; if any are present and are not
+            # scheduled for destruction, an error is raised.
+            name: 'sip-dialogs'
+            #
+            # In addition to checking for scheduled destruction, a test can request that
+            # certain entries should appear in the SIP history.  If the entries do not
+            # appear, an error is raised.
+            sipHistoryRequirements:
+                - 'NewChan'
+                - 'Hangup'
+        #
+        -   # Check for held locks in Asterisk after test execution.  A lock is determined to
+            # be in potential error if threads are detected holding mutexes and waiting on
+            # other threads that are also holding mutexes.
+            name: 'locks'
+        #
+        -   # Check for active channels in Asterisk.  If active channels are detected, flag
+            # an error
+            name: 'channels'
+            #
+            # The number of allowed active channels that can exist when the condition is checked.
+            # If the number of channels detected is greater than this value, an error is raised.
+            # By default, this value is 0.
+            allowedchannels: 1
+        #
+        -   # Check for active file descriptors in Asterisk.  File descriptors detected before
+            # test execution are tracked throughout the test; if any additional file descriptors
+            # after test execution are detected, the test condition fails.
+            name: 'file-descriptors'
 
 
 --------------------------------------------------------------------------------

Added: asterisk/trunk/lib/python/asterisk/ChannelTestCondition.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/lib/python/asterisk/ChannelTestCondition.py?view=auto&rev=2507
==============================================================================
--- asterisk/trunk/lib/python/asterisk/ChannelTestCondition.py (added)
+++ asterisk/trunk/lib/python/asterisk/ChannelTestCondition.py Tue Oct 11 12:04:14 2011
@@ -1,0 +1,49 @@
+#!/usr/bin/env python
+'''
+Copyright (C) 2011, 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
+import logging.config
+import unittest
+
+from TestConditions import TestCondition
+
+logger = logging.getLogger(__name__)
+
+class ChannelTestCondition(TestCondition):
+    """
+    Test condition that checks for the existance of channels.  If channels
+    are detected and the number of active channels is greater than the
+    configured amount, an error is raised.
+
+    By default, the number of allowed active channels is 0.
+    """
+
+    def __init__(self, test_config):
+        super(ChannelTestCondition, self).__init__(test_config)
+
+        self.allowed_channels = 0
+        if ('allowedchannels' in test_config.config):
+            self.allowed_channels = test_config.config['allowedchannels']
+
+    def evaluate(self, related_test_condition = None):
+        for ast in self.ast:
+            """ For logging / debug purposes, do a full core show channels """
+            channel_lines = ast.cli_exec('core show channels')
+            channel_tokens = channel_lines.strip().split('\n')
+            active_channels = 0
+            for token in channel_tokens:
+                if 'active channels' in token:
+                    active_channel_tokens = token.partition(' ')
+                    active_channels = int(active_channel_tokens[0].strip())
+            if active_channels > self.allowed_channels:
+                super(ChannelTestCondition, self).failCheck(
+                    'Detected number of active channels %d is greater than the allowed %d on Asterisk %s' % (active_channels, self.allowed_channels, ast.host))
+        """ Set to pass if we haven't detected any failures """
+        super(ChannelTestCondition, self).passCheck()
+

Propchange: asterisk/trunk/lib/python/asterisk/ChannelTestCondition.py
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: asterisk/trunk/lib/python/asterisk/ChannelTestCondition.py
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: asterisk/trunk/lib/python/asterisk/ChannelTestCondition.py
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: asterisk/trunk/lib/python/asterisk/FdTestCondition.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/lib/python/asterisk/FdTestCondition.py?view=diff&rev=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/lib/python/asterisk/FdTestCondition.py (original)
+++ asterisk/trunk/lib/python/asterisk/FdTestCondition.py Tue Oct 11 12:04:14 2011
@@ -51,12 +51,29 @@
             return
 
         lines = ast.cli_exec("core show fd")
+        if 'No such command' in lines:
+            return
+
         """ Trim off the first and last lines """
         lines = lines[lines.find('\n'):].strip()
         lines = lines[:lines.find("Asterisk ending")].strip()
         line_tokens = lines.split('\n')
         fds = []
         for line in line_tokens:
+            """
+            chan_sip is going to create sockets for the active channels and won't close them until
+            the dialog is reclaimed - 32 seconds after the test.  We ignore the UDP socket file
+            descriptors because of this.
+            """
+            if 'socket(PF_INET,SOCK_DGRAM,"udp")' in line:
+                logger.debug("Ignoring created UDP socket: " + line)
+                continue
+            """
+            If we have MALLOC_DEBUG on and are writing out to the mmlog, ignore
+            """
+            if '__ast_mm_init' in line:
+                logger.debug("Ignoring malloc debug: " + line)
+                continue
             fd = FileDescriptor(line)
             if fd.number != -1:
                 logger.debug("Tracking %d [%s]", fd.number, fd.info)

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=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/lib/python/asterisk/TestCase.py (original)
+++ asterisk/trunk/lib/python/asterisk/TestCase.py Tue Oct 11 12:04:14 2011
@@ -46,7 +46,8 @@
         self.defaultLogLevel = "WARN"
         self.defaultLogFileName = "logger.conf"
         self.timeoutId = None
-        self.test_config = TestConfig(self.test_name)
+        self.global_config = TestConfig(os.getcwd())
+        self.test_config = TestConfig(self.test_name, self.global_config)
         self.testStateController = None
 
         """ Set up logging """
@@ -72,7 +73,19 @@
         Register pre and post-test conditions.  Note that we have to first register condition checks
         without related conditions, so that those that have dependencies can find them
         """
+        self.global_conditions = self.global_config.get_conditions()
         self.conditions = self.test_config.get_conditions()
+
+        """ If there are no global conditions return """
+        if (len(self.global_conditions) == 0):
+            return
+
+        """ Get those global conditions that are not in the self conditions """
+        for g in self.global_conditions:
+            disallowed = [i for i in self.conditions if i[0].getName() == g[0].getName() and i[1] == g[1]]
+            if (len(disallowed) == 0):
+                self.conditions.append(g)
+
         for c in self.conditions:
             """ c is a 3-tuple of object, pre-post type, and related name """
             if (c[2] == ""):

Modified: asterisk/trunk/lib/python/asterisk/TestConditions.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/lib/python/asterisk/TestConditions.py?view=diff&rev=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/lib/python/asterisk/TestConditions.py (original)
+++ asterisk/trunk/lib/python/asterisk/TestConditions.py Tue Oct 11 12:04:14 2011
@@ -121,13 +121,13 @@
             if (check[0].check_build_options()):
                 for ast in self.__ast:
                     check[0].register_asterisk_instance(ast)
-
-                logger.debug("Evaluating %s" % check[0].getName())
-                if (check[1] != None):
-                    check[0].evaluate(check[1])
-                else:
-                    check[0].evaluate()
-                self.__check_observers(check[0])
+                if (check[0].getEnabled()):
+                    logger.debug("Evaluating %s" % check[0].getName())
+                    if (check[1] != None):
+                        check[0].evaluate(check[1])
+                    else:
+                        check[0].evaluate()
+                    self.__check_observers(check[0])
 
     def __check_observers(self, test_condition):
         for observerTuple in self.__observers:
@@ -141,6 +141,7 @@
         if (test_condition.getStatus() == 'Inconclusive'):
             logger.warning(test_condition)
         elif (test_condition.getStatus() == 'Failed'):
+            logger.info(str(test_condition.pass_expected))
             if test_condition.pass_expected:
                 logger.error(test_condition)
             else:
@@ -169,6 +170,7 @@
         self.__testStatus = TestStatuses.Inconclusive
         self.ast = []
         self.build_options = []
+        self.__enabled = test_config.enabled
         self.pass_expected = test_config.passExpected
 
     def __str__(self):
@@ -229,6 +231,12 @@
         """
         pass
 
+    def getEnabled(self):
+        """
+        True if the condition is enabled and should run, false otherwise
+        """
+        return self.__enabled
+
     def getName(self):
         """
         Return the name of the test condition

Modified: asterisk/trunk/lib/python/asterisk/TestConfig.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/lib/python/asterisk/TestConfig.py?view=diff&rev=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/lib/python/asterisk/TestConfig.py (original)
+++ asterisk/trunk/lib/python/asterisk/TestConfig.py Tue Oct 11 12:04:14 2011
@@ -31,27 +31,30 @@
     object that derives from TestCondition based on that configuration
     """
 
-    def __init__(self, config):
-        """
-        Construct a new test condition from a config sequence constructed
-        from the test-config.yaml file
-        """
-        self.classTypeName = ""
+    def __init__(self, config, definition, pre_post_type):
+        """
+        Construct a new test condition
+
+        config - the test condition specific configuration, from a test-config.yaml file
+        definition - the global type information, obtained from the global test-config.yaml file
+        pre_post_type - 'pre' or 'post', depending on the type to build
+        """
         self.passExpected = True
-        self.type = ""
         self.relatedCondition = ""
-        if 'name' in config:
-            self.classTypeName = config['name']
+        self.type = pre_post_type.upper().strip()
+        self.classTypeName = definition[pre_post_type.lower()]['typename']
+        self.enabled = True
+        if 'related-type' in definition[pre_post_type.lower()]:
+            self.relatedCondition = definition[pre_post_type.lower()]['related-type'].strip()
+        if 'enabled' in config:
+            if config ['enabled'].upper().strip() == 'FALSE':
+                self.enabled = False
         if 'expectedResult' in config:
             try:
                 self.passExpected = not (config["expectedResult"].upper().strip() == "FAIL")
             except:
                 self.passExpected = False
                 print "ERROR: '%s' is not a valid value for expectedResult" % config["expectedResult"]
-        if 'type' in config:
-            self.type = config['type'].upper().strip()
-        if 'relatedCondition' in config:
-            self.relatedCondition = config['relatedCondition'].strip()
         """ Let non-standard configuration items be obtained from the config object """
         self.config = config
 
@@ -222,7 +225,7 @@
     by that tests test.yaml file.
     """
 
-    def __init__(self, test_name):
+    def __init__(self, test_name, global_test_config = None):
         """
         Create a new TestConfig
 
@@ -240,12 +243,40 @@
         self.minversion_check = False
         self.deps = []
         self.expectPass = True
-
+        self.excludedTests = []
+        self.test_configuration = "(none)"
+        self.condition_definitions = []
+        self.global_test_config = global_test_config
         self.__parse_config()
+
+    def __process_global_settings(self):
+        """
+        These settings only apply to the 'global' test-yaml config file.  If we were passed in
+        the global settings, grab what we need and return
+        """
+        if self.global_test_config != None:
+            self.condition_definitions = self.global_test_config.condition_definitions
+            return
+
+        if "global-settings" in self.config:
+            global_settings = self.config['global-settings']
+            if "condition-definitions" in global_settings:
+                self.condition_definitions = global_settings['condition-definitions']
+            if "test-configuration" in global_settings:
+                self.test_configuration = global_settings['test-configuration']
+                if self.test_configuration in self.config:
+                    self.config = self.config[self.test_configuration]
+
+                    if self.config != None and 'exclude-tests' in self.config:
+                        self.excludedTests = self.config['exclude-tests']
+                else:
+                    print "WARNING - test configuration [%s] not found in config file" % self.test_configuration
 
     def __process_testinfo(self):
         self.summary = "(none)"
         self.description = "(none)"
+        if self.config == None:
+            return
         if "testinfo" not in self.config:
             return
         testinfo = self.config["testinfo"]
@@ -259,6 +290,8 @@
 
     def __process_properties(self):
         self.minversion = AsteriskVersion("1.4")
+        if self.config == None:
+            return
         if "properties" not in self.config:
             return
         properties = self.config["properties"]
@@ -303,6 +336,7 @@
                     self.test_name
             return
 
+        self.__process_global_settings()
         self.__process_testinfo()
         self.__process_properties()
 
@@ -316,12 +350,21 @@
             2: The name of the related condition that this one depends on
         """
         conditions = []
-        if not self.config:
+        conditions_temp = []
+        if not self.config or 'properties' not in self.config or 'testconditions' not in self.config['properties']:
             return conditions
 
-        conditionsTemp = [TestConditionConfig(c) for c in self.config["properties"].get("testconditions") or [] ]
-
-        for cond in conditionsTemp:
+        for c in self.config['properties'].get('testconditions'):
+            matched_definition = [d for d in self.condition_definitions if d['name'] == c['name']]
+            if len(matched_definition) != 1:
+                print "Unknown or too many matches for condition: " + c['name']
+            else:
+                pre_cond = TestConditionConfig(c, matched_definition[0], "Pre")
+                post_cond = TestConditionConfig(c, matched_definition[0], "Post")
+                conditions_temp.append(pre_cond)
+                conditions_temp.append(post_cond)
+
+        for cond in conditions_temp:
             c = cond.make_condition(), cond.get_type(), cond.get_related_condition()
             conditions.append(c)
 

Modified: asterisk/trunk/runtests.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/runtests.py?view=diff&rev=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/runtests.py (original)
+++ asterisk/trunk/runtests.py Tue Oct 11 12:04:14 2011
@@ -99,6 +99,15 @@
                         except shutil.Error, err:
                             for e in err:
                                 print "Exception occurred while archiving logs from %s to %s: %s" % (e[0], e[1], e[2])
+                    except IOError, io:
+                        """ Don't let an IOError blow out the whole test run """
+                        print "IOError Exception occured while archiving logs"
+                        try:
+                            (code, message) = io
+                        except:
+                            code = 0
+                            message = io
+                        print "ErrNo: %d - %s" % code, message
             else:
                 break
             i += 1
@@ -116,10 +125,13 @@
 
         self.tests = []
         self.tests = self._parse_test_yaml("tests", ast_version)
-
+        self.global_config = self._parse_global_config()
         self.total_time = 0.0
         self.total_count = 0
         self.total_failures = 0
+
+    def _parse_global_config(self):
+        return TestConfig(os.getcwd())
 
     def _parse_test_yaml(self, test_dir, ast_version):
         tests = []
@@ -189,6 +201,14 @@
                     print "--- --> Dependency: %s - %s" % (d.name, str(d.met))
                 print
                 continue
+            if self.global_config != None:
+                exclude = False
+                for excluded in self.global_config.excludedTests:
+                    if excluded in t.test_name:
+                        print "--- ---> Excluded test: %s" % excluded
+                        exclude = True
+                if exclude:
+                    continue
 
             print "--> Running test '%s' ...\n" % t.test_name
 

Added: asterisk/trunk/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/test-config.yaml?view=auto&rev=2507
==============================================================================
--- asterisk/trunk/test-config.yaml (added)
+++ asterisk/trunk/test-config.yaml Tue Oct 11 12:04:14 2011
@@ -1,0 +1,93 @@
+# This configuration file defines global settings for test execution.
+# The test suite will attempt to apply these settings to all tests that
+# support them.
+
+# Global settings
+global-settings:
+    # The active test configuration.  The value must match a subsequent key
+    # in this file, which defines the global settings to apply to the test execution
+    # run.
+    test-configuration: config-fast
+
+    # The following sequence defines for any test configuration the available pre-
+    # and post-test conditions.  The 'name' field specifies how the test configurations
+    # refer to the pre- and post-test conditions in order to activate them.
+    condition-definitions:
+            -
+                name: 'threads'
+                pre:
+                    typename: 'asterisk.ThreadTestCondition.ThreadPreTestCondition'
+                post:
+                    typename: 'asterisk.ThreadTestCondition.ThreadPostTestCondition'
+                    related-type: 'asterisk.ThreadTestCondition.ThreadPreTestCondition'
+            -
+                name: 'sip-dialogs'
+                pre:
+                    typename: 'asterisk.SipDialogTestCondition.SipDialogPreTestCondition'
+                post:
+                    typename: 'asterisk.SipDialogTestCondition.SipDialogPostTestCondition'
+            -
+                name: 'locks'
+                pre:
+                    typename: 'asterisk.LockTestCondition.LockTestCondition'
+                post:
+                    typename: 'asterisk.LockTestCondition.LockTestCondition'
+            -
+                name: 'file-descriptors'
+                pre:
+                    typename: 'asterisk.FdTestCondition.FdPreTestCondition'
+                post:
+                    typename: 'asterisk.FdTestCondition.FdPostTestCondition'
+                    related-type: 'asterisk.FdTestCondition.FdPreTestCondition'
+            -
+                name: 'channels'
+                pre:
+                    typename: 'asterisk.ChannelTestCondition.ChannelTestCondition'
+                post:
+                    typename: 'asterisk.ChannelTestCondition.ChannelTestCondition'
+
+# Exclude all long-running tests (greater than one minute)
+config-fast:
+    exclude-tests:
+        - 'authenticate_invalid_password'
+        - 'check_voicemail_callback'
+        - 'check_voicemail_delete'
+        - 'check_voicemail_dialout'
+        - 'check_voicemail_envelope'
+        - 'check_voicemail_new_user'
+        - 'check_voicemail_nominal'
+        - 'check_voicemail_reply'
+        - 'leave_voicemail_external_notification'
+        - 'leave_voicemail_nominal'
+        - 'gateway_g711_t38'
+        - 'gateway_mix1'
+        - 'gateway_mix2'
+        - 'gateway_mix3'
+        - 'gateway_mix4'
+        - 'gateway_native_t38'
+        - 'gateway_native_t38_ced'
+        - 'gateway_no_t38'
+        - 'gateway_t38_g711'
+        - 'gateway_timeout1'
+        - 'gateway_timeout2'
+        - 'gateway_timeout3'
+        - 'gateway_timeout4'
+        - 'gateway_timeout5'
+
+# Include all tests that can run under the installed version of Asterisk.
+# It is included merely for completeness.
+config-standard:
+
+# This test enables the pre- and post-test condition checking on all tests
+# that support it.  Individual tests can override the behavior of a pre-
+# and post-test in their test-config.yaml files.
+config-pessimistic:
+    properties:
+        testconditions:
+            - name: 'threads'
+            - name: 'sip-dialogs'
+            - name: 'locks'
+            - name: 'file-descriptors'
+            - name: 'channels'
+
+

Propchange: asterisk/trunk/test-config.yaml
------------------------------------------------------------------------------
    svn:eol-style = native

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

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

Modified: asterisk/trunk/tests/apps/voicemail/authenticate_extensions/run-test
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/apps/voicemail/authenticate_extensions/run-test?view=diff&rev=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/tests/apps/voicemail/authenticate_extensions/run-test (original)
+++ asterisk/trunk/tests/apps/voicemail/authenticate_extensions/run-test Tue Oct 11 12:04:14 2011
@@ -28,6 +28,7 @@
 
         self.reactor_timeout = 60
         self.create_asterisk(2)
+        self.pass_results = 0
 
     def ami_connect(self, ami):
         super(AuthenticateExtensions, self).ami_connect(ami)
@@ -55,15 +56,17 @@
             return
 
         if event['result'] == 'pass':
-            self.passed = self.passed and True
+            self.pass_results += 1
+            if self.pass_results == 2:
+                self.passed = True
+                self.stop_reactor()
             logger.info("Received pass result from VMAuthenticate test")
         else:
             logger.warn("VMAuthenticate Failure:")
             logger.warn("result: %s" % (event['result'],))
             logger.warn("error: %s" % (event['status'],))
             self.passed = False
-
-        self.stop_reactor()
+            self.stop_reactor()
 
     def run(self):
         super(AuthenticateExtensions, self).run()

Modified: asterisk/trunk/tests/apps/voicemail/authenticate_extensions/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/apps/voicemail/authenticate_extensions/test-config.yaml?view=diff&rev=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/tests/apps/voicemail/authenticate_extensions/test-config.yaml (original)
+++ asterisk/trunk/tests/apps/voicemail/authenticate_extensions/test-config.yaml Tue Oct 11 12:04:14 2011
@@ -6,6 +6,15 @@
 
 properties:
     minversion: '1.8'
+    testconditions:
+        - name: 'threads'
+          ignoredThreads:
+            - 'netconsole'
+            - 'pbx_thread'
+        - name: 'sip-dialogs'
+          sipHistoryRequirements:
+            - 'NewChan'
+            - 'Hangup'
     dependencies:
         - python : 'twisted'
         - python : 'starpy'

Modified: asterisk/trunk/tests/apps/voicemail/authenticate_invalid_mailbox/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/apps/voicemail/authenticate_invalid_mailbox/test-config.yaml?view=diff&rev=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/tests/apps/voicemail/authenticate_invalid_mailbox/test-config.yaml (original)
+++ asterisk/trunk/tests/apps/voicemail/authenticate_invalid_mailbox/test-config.yaml Tue Oct 11 12:04:14 2011
@@ -6,6 +6,15 @@
 
 properties:
     minversion: '1.8'
+    testconditions:
+        - name: 'threads'
+          ignoredThreads:
+            - 'netconsole'
+            - 'pbx_thread'
+        - name: 'sip-dialogs'
+          sipHistoryRequirements:
+            - 'NewChan'
+            - 'Hangup'
     dependencies:
         - python : 'twisted'
         - python : 'starpy'

Modified: asterisk/trunk/tests/apps/voicemail/authenticate_invalid_password/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/apps/voicemail/authenticate_invalid_password/test-config.yaml?view=diff&rev=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/tests/apps/voicemail/authenticate_invalid_password/test-config.yaml (original)
+++ asterisk/trunk/tests/apps/voicemail/authenticate_invalid_password/test-config.yaml Tue Oct 11 12:04:14 2011
@@ -6,6 +6,15 @@
 
 properties:
     minversion: '1.8'
+    testconditions:
+        - name: 'threads'
+          ignoredThreads:
+            - 'netconsole'
+            - 'pbx_thread'
+        - name: 'sip-dialogs'
+          sipHistoryRequirements:
+            - 'NewChan'
+            - 'Hangup'
     dependencies:
         - python : 'twisted'
         - python : 'starpy'

Modified: asterisk/trunk/tests/apps/voicemail/authenticate_nominal/test-config.yaml
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/apps/voicemail/authenticate_nominal/test-config.yaml?view=diff&rev=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/tests/apps/voicemail/authenticate_nominal/test-config.yaml (original)
+++ asterisk/trunk/tests/apps/voicemail/authenticate_nominal/test-config.yaml Tue Oct 11 12:04:14 2011
@@ -8,31 +8,14 @@
 properties:
     minversion: '1.8'
     testconditions:
-        -
-            name: 'asterisk.ThreadTestCondition.ThreadPreTestCondition'
-            type: 'Pre'
-        -
-            name: 'asterisk.ThreadTestCondition.ThreadPostTestCondition'
-            type: 'Post'
-            ignoredThreads:
-                - 'netconsole'
-                - 'pbx_thread'
-            relatedCondition: 'asterisk.ThreadTestCondition.ThreadPreTestCondition'
-        -
-            name: 'asterisk.SipDialogTestCondition.SipDialogPreTestCondition'
-            type: 'Pre'
-        -
-            name: 'asterisk.SipDialogTestCondition.SipDialogPostTestCondition'
-            type: 'Post'
-            sipHistoryRequirements:
-                - 'NewChan'
-                - 'Hangup'
-        -
-            name: 'asterisk.LockTestCondition.LockTestCondition'
-            type: 'Pre'
-        -
-            name: 'asterisk.LockTestCondition.LockTestCondition'
-            type: 'Post'
+        - name: 'threads'
+          ignoredThreads:
+            - 'netconsole'
+            - 'pbx_thread'
+        - name: 'sip-dialogs'
+          sipHistoryRequirements:
+            - 'NewChan'
+            - 'Hangup'
     dependencies:
         - python : 'twisted'
         - python : 'starpy'

Modified: asterisk/trunk/tests/apps/voicemail/check_voicemail_callback/configs/ast1/extensions.conf
URL: http://svnview.digium.com/svn/testsuite/asterisk/trunk/tests/apps/voicemail/check_voicemail_callback/configs/ast1/extensions.conf?view=diff&rev=2507&r1=2506&r2=2507
==============================================================================
--- asterisk/trunk/tests/apps/voicemail/check_voicemail_callback/configs/ast1/extensions.conf (original)
+++ asterisk/trunk/tests/apps/voicemail/check_voicemail_callback/configs/ast1/extensions.conf Tue Oct 11 12:04:14 2011
@@ -7,7 +7,6 @@

[... 896 lines stripped ...]



More information about the asterisk-commits mailing list