[asterisk-commits] mnicholson: branch mnicholson/fancy-versions r2408 - /asterisk/team/mnicholso...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Sep 22 14:05:51 CDT 2011


Author: mnicholson
Date: Thu Sep 22 14:05:47 2011
New Revision: 2408

URL: http://svnview.digium.com/svn/testsuite?view=rev&rev=2408
Log:
added fine grained control over which tests will run with which versions of
asterisk down to the revision level

Modified:
    asterisk/team/mnicholson/fancy-versions/lib/python/asterisk/TestConfig.py

Modified: asterisk/team/mnicholson/fancy-versions/lib/python/asterisk/TestConfig.py
URL: http://svnview.digium.com/svn/testsuite/asterisk/team/mnicholson/fancy-versions/lib/python/asterisk/TestConfig.py?view=diff&rev=2408&r1=2407&r2=2408
==============================================================================
--- asterisk/team/mnicholson/fancy-versions/lib/python/asterisk/TestConfig.py (original)
+++ asterisk/team/mnicholson/fancy-versions/lib/python/asterisk/TestConfig.py Thu Sep 22 14:05:47 2011
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+# vim: et sw=4:
 '''Asterisk external test suite driver.
 
 Copyright (C) 2011, Digium, Inc.
@@ -16,6 +17,7 @@
 import time
 import yaml
 import socket
+import unittest
 
 sys.path.append("lib/python")
 
@@ -222,7 +224,7 @@
     by that tests test.yaml file.
     """
 
-    def __init__(self, test_name):
+    def __init__(self, test_name, dummy_config = None):
         """
         Create a new TestConfig
 
@@ -241,7 +243,8 @@
         self.deps = []
         self.expectPass = True
 
-        self.__parse_config()
+        self.__parse_config(dummy_config)
+
 
     def __process_testinfo(self):
         self.summary = "(none)"
@@ -284,19 +287,23 @@
                 print "ERROR: '%s' is not a valid value for expectedResult" %\
                         properties["expectedResult"]
 
-    def __parse_config(self):
-        test_config = "%s/test-config.yaml" % self.test_name
-        try:
-            f = open(test_config, "r")
-        except IOError:
-            print "Failed to open %s" % test_config
-            return
-        except:
-            print "Unexpected error: %s" % sys.exc_info()[0]
-            return
-
-        self.config = yaml.load(f)
-        f.close()
+    def __parse_config(self, dummy_config = None):
+
+        if dummy_config:
+            self.config = yaml.load(dummy_config)
+        else:
+            test_config = "%s/test-config.yaml" % self.test_name
+            try:
+                f = open(test_config, "r")
+            except IOError:
+                print "Failed to open %s" % test_config
+                return
+            except:
+                print "Unexpected error: %s" % sys.exc_info()[0]
+                return
+
+            self.config = yaml.load(f)
+            f.close()
 
         if not self.config:
             print "ERROR: Failed to load configuration for test '%s'" % \
@@ -326,6 +333,80 @@
             conditions.append(c)
 
         return conditions
+
+    def __version_is_compatible(self, ast_version): 
+        """
+        Check whether or not this test should run against this version of asterisk
+
+        Arguments:
+        ast_version -- The AsteriskVersion object containing the version of Asterisk that
+            will be executed
+        """
+
+        def branch_is_compatible(ast_version, branch):
+            return ast_version.has_major_version(str(branch))
+
+        def release_is_compatible(ast_version, release):
+            return ast_version == AsteriskVersion(release)
+
+        def svn_is_compatible(ast_version, svn):
+            def rev(r):
+                # prepend "branch-" to certain version numbers
+                if isinstance(branch, int) \
+                or isinstance(branch, float) \
+                or (isinstance(branch, str) \
+                    and '.' in branch \
+                    and not branch.startswith("branch-")):
+
+                    return AsteriskVersion("SVN-branch-%s-r%s" % (branch, r))
+                else:
+                    return AsteriskVersion("SVN-%s-r%s" % (branch, r))
+
+            branch = ast_version.branch
+            if "branch" in svn:
+                branch = svn["branch"]
+                if isinstance(branch, int) or isinstance(branch, float) or '.' in branch:
+                    if ast_version.branch != "branch-" + str(branch):
+                        return False
+                else:
+                    if ast_version.branch != branch:
+                        return False
+
+            if "to" in svn:
+                if ast_version > rev(svn["to"]):
+                    return False
+
+            if "from" in svn:
+                if ast_version < rev(svn["from"]):
+                    return False
+
+            if "revision" in svn:
+                # XXX should we parse a standard SVN revision string (e.g. 1:20,22,25,30:35)?
+                if ast_version != rev(svn["revision"]):
+                    return False
+
+            return True
+
+
+        compatibility_checks = {
+            "branch": branch_is_compatible,
+            "release": release_is_compatible,
+            "tag": release_is_compatible,
+            "svn": svn_is_compatible,
+        }
+
+        for item in self.config["properties"].get("versions") or []:
+            key, value = item.items()[0]
+
+            if key not in compatibility_checks:
+                print "ERROR: unknown version spec '%s'" % key
+                continue
+
+            if not compatibility_checks[key](ast_version, value):
+                return False
+
+        return True
+
 
     def check_deps(self, ast_version):
         """
@@ -357,8 +438,142 @@
             self.maxversion_check = False
             return self.can_run
 
+        if not self.__version_is_compatible(ast_version):
+            self.can_run = False
+            return self.can_run
+
         for d in self.deps:
             if d.met is False:
                 self.can_run = False
                 break
-        return self.can_run
+        return self.can_run
+
+
+class TestConfigUnitTest(unittest.TestCase):
+    def __versions_stub(self, versions):
+        import re
+        versions = re.sub(r'\n', '\n  ', versions)
+        return TestConfig("test",
+"""
+testinfo:
+ summary: 'sample test'
+ description: 'sample test'
+
+properties:
+ versions:
+ """ + versions)
+
+    def test_version_compatibility_svn_from(self):
+        config = self.__versions_stub(
+"""
+- svn:
+   branch: 1.8
+   from: 1234
+""")
+        self.assertTrue(config.check_deps(AsteriskVersion("SVN-branch-1.8-r1234")))
+        self.assertFalse(config.check_deps(AsteriskVersion("SVN-branch-1.8-r1233")))
+
+    def test_version_compatibility_svn_to(self):
+        config = self.__versions_stub(
+"""
+- svn:
+   branch: 1.8
+   to: 1234
+""")
+        self.assertTrue(config.check_deps(AsteriskVersion("SVN-branch-1.8-r1234")))
+        self.assertFalse(config.check_deps(AsteriskVersion("SVN-branch-1.8-r1235")))
+
+    def test_version_compatibility_svn_branch(self):
+        config = self.__versions_stub(
+"""
+- svn:
+   branch: rmudgett-parking
+""")
+
+        self.assertTrue(config.check_deps(AsteriskVersion("SVN-rmudgett-parking-r332175-/branches/1.8")))
+        
+        config = self.__versions_stub(
+"""
+- svn:
+   branch: rmudgett-parking
+   revision: 332175
+""")
+        self.assertTrue(config.check_deps(AsteriskVersion("SVN-rmudgett-parking-r332175-/branches/1.8")))
+        self.assertFalse(config.check_deps(AsteriskVersion("SVN-rmudgett-parking-r332174-/branches/1.8")))
+        self.assertFalse(config.check_deps(AsteriskVersion("SVN-rmudgett-parking-r332176-/branches/1.8")))
+        
+        config = self.__versions_stub(
+"""
+- svn:
+   branch: rmudgett-parking
+   from: 332174
+   to: 332176
+""")
+        self.assertTrue(config.check_deps(AsteriskVersion("SVN-rmudgett-parking-r332175-/branches/1.8")))
+        self.assertFalse(config.check_deps(AsteriskVersion("SVN-rmudgett-parking-r332177-/branches/1.8")))
+        self.assertFalse(config.check_deps(AsteriskVersion("SVN-rmudgett-parking-r332173-/branches/1.8")))
+
+    def test_version_compatibility_svn_wrong_branch(self):
+        config = self.__versions_stub(
+"""
+- svn:
+   branch: 10
+   to: 1234
+""")
+        self.assertFalse(config.check_deps(AsteriskVersion("SVN-branch-1.8-r1234")))
+        self.assertFalse(config.check_deps(AsteriskVersion("SVN-branch-1.8-r1233")))
+
+    def test_version_compatibility_svn_revision(self):
+        config = self.__versions_stub(
+"""
+- svn:
+   revision: 1234
+""")
+        self.assertTrue(config.check_deps(AsteriskVersion("SVN-branch-1.8-r1234")))
+        self.assertTrue(config.check_deps(AsteriskVersion("SVN-branch-10-r1234")))
+        self.assertFalse(config.check_deps(AsteriskVersion("SVN-branch-10-r1233")))
+
+    def test_version_compatibility_branch(self):
+        config = self.__versions_stub(
+"""
+- branch: 1.8
+""")
+        self.assertTrue(config.check_deps(AsteriskVersion("1.8.2")))
+        self.assertFalse(config.check_deps(AsteriskVersion("10")))
+        
+        config = self.__versions_stub(
+"""
+- branch: 10
+""")
+        self.assertTrue(config.check_deps(AsteriskVersion("10.1")))
+        self.assertFalse(config.check_deps(AsteriskVersion("1.6.2")))
+
+        config = self.__versions_stub(
+"""
+- branch: 1.6.2.1
+""")
+        self.assertTrue(config.check_deps(AsteriskVersion("1.6.2")))
+        self.assertFalse(config.check_deps(AsteriskVersion("10")))
+
+    def test_version_compatibility_release(self):
+        config = self.__versions_stub(
+"""
+- tag: 1.8.0.0
+""")
+        self.assertTrue(config.check_deps(AsteriskVersion("1.8.0.0")))
+        self.assertFalse(config.check_deps(AsteriskVersion("1.8.2.0")))
+        self.assertFalse(config.check_deps(AsteriskVersion("SVN-branch-10-r1233")))
+        self.assertFalse(config.check_deps(AsteriskVersion("SVN-rmudgett-parking-r332176-/branches/1.8")))
+        
+        config = self.__versions_stub(
+"""
+- release: 1.8.7.0-rc1
+""")
+        self.assertTrue(config.check_deps(AsteriskVersion("1.8.7.0-rc1")))
+        self.assertFalse(config.check_deps(AsteriskVersion("1.8.7.0")))
+        self.assertFalse(config.check_deps(AsteriskVersion("1.6.2.1")))
+
+
+if __name__ == "__main__":
+    unittest.main()
+




More information about the asterisk-commits mailing list