[CalendarServer-changes] [1388] CalendarServer/trunk/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Wed Mar 14 14:10:20 PDT 2007


Revision: 1388
          http://trac.macosforge.org/projects/calendarserver/changeset/1388
Author:   dreid at apple.com
Date:     2007-03-14 14:10:20 -0700 (Wed, 14 Mar 2007)

Log Message:
-----------
Add unittests for the Slave service, as well as the makeService dispatcher, make sure all test case classes have a proper teardown that completely resets the config object

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/tap.py
    CalendarServer/trunk/twistedcaldav/test/test_tap.py

Modified: CalendarServer/trunk/twistedcaldav/tap.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/tap.py	2007-03-14 21:09:06 UTC (rev 1387)
+++ CalendarServer/trunk/twistedcaldav/tap.py	2007-03-14 21:10:20 UTC (rev 1388)
@@ -126,7 +126,7 @@
 
         parseConfig(self['config'])
 
-        config.update(self.overrides)
+        config.updateDefaults(self.overrides)
 
         uid, gid = None, None
 
@@ -440,15 +440,15 @@
 
         for bindAddress in config.BindAddresses:
             if config.BindHTTPPorts:
-                if not config.HTTPPort:
+                if config.HTTPPort == -1:
                     raise UsageError("HTTPPort required if BindHTTPPorts is not empty")
-            elif config.HTTPPort:
+            elif config.HTTPPort != -1:
                     config.BindHTTPPorts = [config.HTTPPort]
 
             if config.BindSSLPorts:
-                if not config.SSLPort:
+                if config.SSLPort == -1:
                     raise UsageError("SSLPort required if BindSSLPorts is not empty")
-            elif config.SSLPort:
+            elif config.SSLPort != -1:
                 config.BindSSLPorts = [config.SSLPort]
 
             if config.BindSSLPorts:

Modified: CalendarServer/trunk/twistedcaldav/test/test_tap.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_tap.py	2007-03-14 21:09:06 UTC (rev 1387)
+++ CalendarServer/trunk/twistedcaldav/test/test_tap.py	2007-03-14 21:10:20 UTC (rev 1388)
@@ -72,7 +72,10 @@
         self.config.parent['gid'] = 0
         self.config.parent['nodaemon'] = False
 
-        config_mod.parseConfig('non-existant-config')
+    def tearDown(self):
+        config.loadConfig(None)
+        config.setDefaults(config_mod.defaultConfig)
+        config.reload()
 
     def test_overridesConfig(self):
         """
@@ -149,3 +152,237 @@
 
         self.assertEquals(config.Authentication['Basic']['Enabled'],
                           myConfig['Authentication']['Basic']['Enabled'])
+
+
+class BaseServiceMakerTests(unittest.TestCase):
+    """
+    Utility class for ServiceMaker tests.
+    """
+
+    def setUp(self):
+        self.options = TestCalDAVOptions()
+        self.options.parent = Options()
+        self.options.parent['gid'] = None
+        self.options.parent['uid'] = None
+        self.options.parent['nodaemon'] = None
+
+        self.config = deepcopy(config_mod.defaultConfig)
+
+        accountsFile = sibpath(os.path.dirname(__file__),
+                               'directory/test/accounts.xml')
+
+        self.config['DirectoryService'] = {
+            'params': {'xmlFile': accountsFile},
+            'type': 'twistedcaldav.directory.xmlfile.XMLDirectoryService'
+            }
+
+        self.config['DocumentRoot'] = self.mktemp()
+
+        self.config['SSLPrivateKey'] = sibpath(__file__, 'data/server.pem')
+        self.config['SSLCertificate'] = sibpath(__file__, 'data/server.pem')
+
+        self.config['SudoersFile'] = ''
+
+        os.mkdir(self.config['DocumentRoot'])
+
+        self.configFile = self.mktemp()
+
+        self.writeConfig()
+
+    def tearDown(self):
+        config.loadConfig(None)
+        config.setDefaults(config_mod.defaultConfig)
+        config.reload()
+
+    def writeConfig(self):
+        """
+        Flush self.config out to self.configFile
+        """
+
+        writePlist(self.config, self.configFile)
+
+    def makeService(self):
+        """
+        Create a service by calling into CalDAVServiceMaker with
+        self.configFile
+        """
+
+        self.options.parseOptions(['-f', self.configFile])
+
+        return CalDAVServiceMaker().makeService(self.options)
+
+    def getSite(self):
+        """
+        Get the server.Site from the service by finding the HTTPFactory
+        """
+
+        service = self.makeService()
+
+        return service.services[0].args[1].protocolArgs['requestFactory']
+
+
+class CalDAVServiceMakerTests(BaseServiceMakerTests):
+    """
+    Test the service maker's behavior
+    """
+
+    def test_makeServiceDispatcher(self):
+        """
+        Test the default options of the dispatching makeService
+        """
+        validServices = ['Slave', 'Master', 'Combined']
+
+        for service in validServices:
+            self.config['ServerType'] = service
+            self.writeConfig()
+            self.makeService()
+
+        self.config['ServerType'] = 'Unknown Service'
+        self.writeConfig()
+        self.assertRaises(UsageError, self.makeService)
+
+
+class SlaveServiceTest(BaseServiceMakerTests):
+    """
+    Test various configurations of the Slave service
+    """
+
+    def test_defaultService(self):
+        """
+        Test the value of a Slave service in it's simplest
+        configuration.
+        """
+        self.config['HTTPPort'] = 8008
+        self.config['SSLPort'] = 8443
+        self.writeConfig()
+
+        service = self.makeService()
+
+        self.failUnless(IService(service),
+                        "%s does not provide IService" % (service,))
+
+        self.failUnless(service.services,
+                        "No services configured")
+
+        self.failUnless(isinstance(service, tap.CalDAVService),
+                        "%s is not a tap.CalDAVService" % (service,))
+
+    def test_defaultListeners(self):
+        """
+        Test that the Slave service has sub services with the
+        default TCP and SSL configuration
+        """
+        self.config['HTTPPort'] = 8008
+        self.config['SSLPort'] = 8443
+        self.writeConfig()
+
+        service = self.makeService()
+
+        expectedSubServices = ((internet.TCPServer, self.config['HTTPPort']),
+                               (internet.SSLServer, self.config['SSLPort']))
+
+        configuredSubServices = [(s.__class__, s.args)
+                                 for s in service.services]
+
+        for serviceClass, serviceArgs in configuredSubServices:
+            self.failUnless(
+                serviceClass in (s[0] for s in expectedSubServices))
+
+            self.assertEquals(serviceArgs[0],
+                              dict(expectedSubServices)[serviceClass])
+
+    def test_SSLKeyConfiguration(self):
+        """
+        Test that the configuration of the SSLServer reflect the config file's
+        SSL Private Key and SSL Certificate
+        """
+        self.config['SSLPort'] = 8443
+        self.writeConfig()
+
+        service = self.makeService()
+
+        sslService = None
+        for s in service.services:
+            if isinstance(s, internet.SSLServer):
+                sslService = s
+                break
+
+        self.failIf(sslService is None, "No SSL Service found")
+
+        context = sslService.args[2]
+
+        self.assertEquals(self.config['SSLPrivateKey'],
+                          context.privateKeyFileName)
+
+        self.assertEquals(self.config['SSLCertificate'],
+                          context.certificateFileName)
+
+    def test_noSSL(self):
+        """
+        Test the single service to make sure there is no SSL Service when SSL
+        is disabled
+        """
+        service = self.makeService()
+
+        self.assertNotIn(
+            internet.SSLServer, [s.__class__ for s in service.services])
+
+    def test_noHTTP(self):
+        """
+        Test the single service to make sure there is no TCPServer when
+        HTTPPort is not configured
+        """
+        service = self.makeService()
+
+        self.assertNotIn(
+            internet.TCPServer, [s.__class__ for s in service.services])
+
+    def test_singleBindAddresses(self):
+        """
+        Test that the TCPServer and SSLServers are bound to the proper address
+        """
+        self.config['SSLPort'] = 8443
+        self.config['HTTPPort'] = 8008
+
+        self.config['BindAddresses'] = ['127.0.0.1']
+        self.writeConfig()
+        service = self.makeService()
+
+        for s in service.services:
+            self.assertEquals(s.kwargs['interface'], '127.0.0.1')
+
+    def test_multipleBindAddresses(self):
+        """
+        Test that the TCPServer and SSLServers are bound to the proper
+        addresses.
+        """
+        self.config['SSLPort'] = 8443
+        self.config['HTTPPort'] = 8008
+
+        self.config['BindAddresses'] = ['127.0.0.1', '10.0.0.2', '172.53.13.123']
+        self.writeConfig()
+        service = self.makeService()
+
+        tcpServers = []
+        sslServers = []
+
+        for s in service.services:
+            if isinstance(s, internet.TCPServer):
+                tcpServers.append(s)
+            elif isinstance(s, internet.SSLServer):
+                sslServers.append(s)
+
+        self.assertEquals(len(tcpServers), len(self.config['BindAddresses']))
+        self.assertEquals(len(sslServers), len(self.config['BindAddresses']))
+
+        for addr in self.config['BindAddresses']:
+            for s in tcpServers:
+                if s.kwargs['interface'] == addr:
+                    tcpServers.remove(s)
+
+            for s in sslServers:
+                if s.kwargs['interface'] == addr:
+                    sslServers.remove(s)
+
+        self.assertEquals(len(tcpServers), 0)
+        self.assertEquals(len(sslServers), 0)

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20070314/2b705f9c/attachment.html


More information about the calendarserver-changes mailing list