Attached please find a patch for poker-network that currently reflects
the differences between r5755 on coverage-poker-network branch and trunk
at the same revision.

This patch implements tests necessary to get full test coverage for
pokerserver.py.

If there are no objections, I will merge this patch into trunk on
Saturday 2009-05-23.  Please respond by then if you have objections.

The attached patch is copyrighted by me and licensed under
AGPLv3-or-later.

diff --git a/poker-network/ChangeLog b/poker-network/ChangeLog
index 7be7f65..020b3f0 100644
--- a/poker-network/ChangeLog
+++ b/poker-network/ChangeLog
@@ -1,5 +1,67 @@
+2009-05-19  Bradley M. Kuhn  <[email protected]>
+
+	* tests/run.in (COVERAGE_100_PERCENT): pokerserver.py now covered
+	100%!
+
+	* pokernetwork/pokerserver.py (__main__): Added pragma No cover
+	for main.
+
+2009-05-18  Bradley M. Kuhn  <[email protected]>
+
+	* tests/test-pokerserver-run-load.py.in
+	(PokerServerLoadingSSLTestCase.test01_openSSLMissing): Wrote basic
+	test to cover OpenSSL missing.
+
+2009-05-17  Bradley M. Kuhn  <[email protected]>
+
+	* tests/test-pokerserver.py.in
+	(PokerServerMakeApplicationCoverageTestCase.test02_validConfig):
+	Wrote test.
+	(PokerServerMakeApplicationCoverageTestCase.test01_missingConfigFileGivenOnCLI_sysVersionDitched):
+	Wrote test.
+	(PokerServerMakeApplicationCoverageTestCase.test00_missingConfigFileGivenOnCLI):
+	Wrote test.
+	(PokerServerMakeServiceCoverageTestCase.test08_plainREST): Wrote test.
+	(PokerServerMakeServiceCoverageTestCase.test09_plainHTTP): Wrote test.
+	(PokerServerMakeApplicationCoverageTestCase): Wrote test class.
+	(PokerServerMakeServiceCoverageTestCase.test_trynow_10_everythingOn):
+	Wrote test.
+	(PokerServerRunCoverageTestCase): Created class.
+	(PokerServerRunCoverageTestCase.test00_missingConfigFileGivenOnCLI):
+	Wrote test.
+	(PokerServerRunCoverageTestCase.test01_missingConfigFileGivenOnCLI_forceReactorInstall):
+	Wrote test.
+
 2009-05-16  Bradley M. Kuhn  <[email protected]>
 
+	* tests/test-pokerserver.py.in (PokerServerMakeServiceTestCase):
+	Renamed class.
+	(PokerServerMakeServiceCoverageTestCase): Created class.
+	(PokerServerMakeServiceCoverageTestCase.test00_missingSettingsFile):
+	Wrote test.
+	(PokerServerMakeServiceCoverageTestCase.test01_emptySettingsFile):
+	Wrote test.
+	(PokerServerMakeServiceManholeTestCase.test01_manhole): Added
+	additional asserts.
+	(PokerServerMakeServiceCoverageTestCase.test02_tcpSsl_hasSSL):
+	Wrote test.
+	(PokerServerMakeServiceCoverageTestCase.test03_tcpSsl_hasSSL_noPemFile):
+	Wrote test.
+	(PokerServerMakeServiceManholeTestCase.tearDown): Changed
+	os.remove() to shutil.rmtree()
+	(PokerServerMakeServiceCoverageTestCase.createPemFile): Created
+	helper method.
+	(PokerServerMakeServiceCoverageTestCase.createConfig): Created
+	helper method.
+	(PokerServerMakeServiceCoverageTestCase.test04_httpSSL_hasSSL_noPemFile):
+	Wrote test.
+	(PokerServerMakeServiceCoverageTestCase.test05_httpSSL_hasSSL):
+	Wrote test.
+	(PokerServerMakeServiceCoverageTestCase.test06_restSSL_hasSSL_noPemFile):
+	Wrote test.
+	(PokerServerMakeServiceCoverageTestCase.test07_restSSL_hasSSL):
+	Wrote test.
+
 	* tests/Makefile.am (TESTS): Added test-proxy.py.
 
 	* configure.ac: Added test-proxy.py.
diff --git a/poker-network/configure.ac b/poker-network/configure.ac
index 1ac1370..028ef42 100644
--- a/poker-network/configure.ac
+++ b/poker-network/configure.ac
@@ -363,6 +363,7 @@ AC_CONFIG_FILES([
 	tests/test-leak-reference.py
 	tests/test-leak-exarkun.py
 	tests/test-pokerserver.py
+	tests/test-pokerserver-run-load.py
         tests/testcurrency.php
         tests/testpoker.php
         tests/testbirthday.php
diff --git a/poker-network/pokernetwork/pokerserver.py b/poker-network/pokernetwork/pokerserver.py
index be18c6c..b3dda32 100644
--- a/poker-network/pokernetwork/pokerserver.py
+++ b/poker-network/pokernetwork/pokerserver.py
@@ -147,4 +147,5 @@ def run():
     reactor.run()
 
 if __name__ == '__main__':
-    run()
+    run() # pragma: no cover
+          # Do not need coverage since we call run directly in the tests.
diff --git a/poker-network/tests/Makefile.am b/poker-network/tests/Makefile.am
index 2804a12..0ecd09d 100644
--- a/poker-network/tests/Makefile.am
+++ b/poker-network/tests/Makefile.am
@@ -121,6 +121,7 @@ TESTS = coverage-reset \
 	test-proxyfilter.py \
 	test-proxy.py \
 	test-pokerserver.py \
+	test-pokerserver-run-load.py \
 	testcurrency.php \
 	testpoker.php \
 	testbirthday.php \
diff --git a/poker-network/tests/run.in b/poker-network/tests/run.in
index 7647aed..37280af 100644
--- a/poker-network/tests/run.in
+++ b/poker-network/tests/run.in
@@ -76,6 +76,7 @@ COVERAGE_100_PERCENT="
 ../pokernetwork/pokerdatabase
 ../pokernetwork/pokermemcache
 ../pokernetwork/pokerservice
+../pokernetwork/pokerserver
 ../pokernetwork/pokerauth
 ../pokernetwork/protocol
 ../pokernetwork/server
diff --git a/poker-network/tests/test-pokerserver-run-load.py.in b/poker-network/tests/test-pokerserver-run-load.py.in
new file mode 100644
index 0000000..fe22645
--- /dev/null
+++ b/poker-network/tests/test-pokerserver-run-load.py.in
@@ -0,0 +1,177 @@
+...@python@
+# -*- mode: python; coding: iso-8859-1 -*-
+# more information about the above line at http://www.python.org/dev/peps/pep-0263/
+#
+# Copyright (C) 2009 Bradley M. Kuhn <[email protected]>
+#
+# This software's license gives you freedom; you can copy, convey,
+# propagate, redistribute and/or modify this program under the terms of
+# the GNU Affero General Public License (AGPL) as published by the Free
+# Software Foundation (FSF), either version 3 of the License, or (at your
+# option) any later version of the AGPL published by the FSF.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero
+# General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program in a file in the toplevel directory called
+# "AGPLv3".  If not, see <http://www.gnu.org/licenses/>.
+#
+
+import sys, os, tempfile, shutil
+sys.path.insert(0, "@top_srcdir@")
+
+import unittest
+from twisted.internet import reactor, defer
+
+from cStringIO import StringIO
+
+settings_xml_server_open_options = """<?xml version="1.0" encoding="ISO-8859-1"?>
+<server verbose="6" ping="300000" autodeal="yes" simultaneous="4" chat="yes" >
+  <delays autodeal="20" round="0" position="0" showdown="0" autodeal_max="1" finish="0" messages="60" />
+
+  <table name="Table1" variant="holdem" betting_structure="100-200-no-limit" seats="10" player_timeout="60" currency_serial="1" />
+  <table name="Table2" variant="holdem" betting_structure="100-200-no-limit" seats="10" player_timeout="60" currency_serial="1" />
+
+  <listen tcp="19481" %(listen_options)s />
+  <resthost host="127.0.0.1" port="19481" path="/POKER_REST" />
+
+  <cashier acquire_timeout="5" pokerlock_queue_timeout="30" user_create="yes" />
+  <database name="pokernetworktest" host="localhost" user="pokernetworktest" password="pokernetwork"
+            root_user="@MYSQL_TEST_DBROOT@" root_password="@MYSQL_TEST_DBROOT_PASSWORD@" schema="@srcdir@/../../database/schema.sql" command="@MYSQL@" />
+  <path>.. ../@srcdir@ @POKER_ENGINE_PKGSYSCONFDIR@ @POKER_NETWORK_PKGSYSCONFDIR@ %(additional_path)s</path>
+  <users temporary="BOT"/>
+</server>
+"""
+# ------------------------------------------------------------    
+class PokerServerRunTestCase(unittest.TestCase):
+    def destroyDb(self, arg = None):
+        if len("@MYSQL_TEST_DBROOT_PASSWORD@") > 0:
+            os.system("@MYSQL@ -u @MYSQL_TEST_DBROOT@ --password='@MYSQL_TEST_DBROOT_PASSWORD@' -e 'DROP DATABASE IF EXISTS pokernetworktest'")
+        else:
+            os.system("@MYSQL@ -u @MYSQL_TEST_DBROOT@ -e 'DROP DATABASE IF EXISTS pokernetworktest'")
+    # -------------------------------------------------------------------------
+    def setUp(self):
+        self.destroyDb()
+        self.tmpdir = tempfile.mkdtemp()
+        self.saveSysout = None
+        self.saveArgv = None
+    # -------------------------------------------------------------------------
+    def tearDown(self):
+        shutil.rmtree(self.tmpdir)
+        if self.saveSysout:
+            value = sys.stdout.getvalue()
+            if self.expectedOutput:
+                self.failUnless(value.find(self.expectedOutput) >= 0,
+                                "Unable to find " + self.expectedOutput + " in " + value)
+            sys.stdout = self.saveSysout
+        if self.saveArgv:
+            sys.argv = self.saveArgv
+    # -------------------------------------------------------------------------
+    def holdStdout(self):
+        self.saveSysout = sys.stdout
+        sys.stdout = StringIO()
+    # -------------------------------------------------------------------------
+    def setArgv(self, newArgv):
+        self.saveArgv = sys.argv
+        sys.argv = newArgv
+    # -------------------------------------------------------------------------
+    def test01_validConfig_mockupStartApplication(self):
+        """test01_validConfig_mockupStartApplication
+        Test that the pokerserver application runs properly.  Since the
+        reactor.run() is called by pokerserver's run(), this test might
+        HANG INDEFINITELY for some types of test failures.  Unlikely but
+        possible."""
+        from pokernetwork.pokerserver import run as pokerServerRun
+
+        from twisted.application import app
+        configFile = os.path.join(self.tmpdir, "ourconfig.xml")
+        configFH = open(configFile, "w")
+        configFH.write(settings_xml_server_open_options % { 'listen_options' : '', 
+                                                            'additional_path' : self.tmpdir})
+        self.setArgv([configFile])
+        configFH.close()
+
+        def mockStartApplication(application, val):
+            from twisted.python.components import Componentized
+            self.failUnless(isinstance(application, Componentized))
+            self.assertEquals(val, None)
+        savedStartApplication = app.startApplication
+        app.startApplication = mockStartApplication
+
+        def doCallback(val):
+            self.assertEquals(val, "done")
+            app.startApplication = savedStartApplication
+            reactor.stop()
+
+        defferedStillRunningMeansReactorNotStarted = defer.Deferred()
+        defferedStillRunningMeansReactorNotStarted.addCallback(doCallback)
+        
+        reactor.callLater(1, lambda: defferedStillRunningMeansReactorNotStarted.callback("done"))
+        pokerServerRun()
+# ------------------------------------------------------------    
+class PokerServerLoadingSSLTestCase(unittest.TestCase):
+    # ----------------------------------------------------------------
+    def test01_openSSLMissing(self):
+        """test01_openSSLMissing"""
+        import sys
+
+        for mod in ['OpenSSL', 'pokernetwork', 'pokerserver']:
+            if sys.modules.has_key(mod): del sys.modules[mod]
+
+        realImporter = __builtins__.__import__
+        global sslImportCounter
+        sslImportCounter = 0
+
+        def succeedOnceThenFailSSLImport(moduleName, *args, **kwargs):
+            global sslImportCounter
+            if moduleName == "OpenSSL" and sslImportCounter == 0:
+                sslImportCounter += 1
+                return realImporter(moduleName, *args, **kwargs)
+            elif moduleName == "OpenSSL" and sslImportCounter == 1:
+                sslImportCounter += 1
+                raise Exception("SSL was imported again")
+            else:
+                return realImporter(moduleName, *args, **kwargs)
+
+        __builtins__.__import__  = succeedOnceThenFailSSLImport
+
+        oldStout = sys.stdout
+        sys.stdout = StringIO()
+
+        from pokernetwork import pokerserver as ps
+
+        value = sys.stdout.getvalue()
+        sys.stdout = oldStout
+
+        self.failIf(ps.HAS_OPENSSL, "HAS_OPENSSL should be False when OpenSSL.SSL is not available")
+        self.assertEquals(value, 'openSSL not available.\n')
+
+        __builtins__.__import__  = realImporter
+# ------------------------------------------------------------
+def GetTestSuite():
+    suite = unittest.TestSuite()
+    # Make sure you do the LoadingSSLTestCase FIRST.
+    suite.addTest(unittest.makeSuite(PokerServerLoadingSSLTestCase))
+    suite.addTest(unittest.makeSuite(PokerServerRunTestCase))
+
+    # Comment out above and use line below this when you wish to run just
+    # one test by itself (changing prefix as needed).
+#    suite.addTest(unittest.makeSuite(PokerGameHistoryTestCase, prefix = "test2"))
+    return suite
+# -----------------------------------------------------------------------------
+def Run(verbose = 2):
+    return unittest.TextTestRunner(verbosity=verbose).run(GetTestSuite())
+# -----------------------------------------------------------------------------
+if __name__ == '__main__':
+    if Run().wasSuccessful():
+        sys.exit(0)
+    else:
+        sys.exit(1)
+
+# Interpreted by emacs
+# Local Variables:
+# compile-command: "( cd .. ; ./config.status tests/test-pokerserver-run-load.py tests/test-pokerserver.py ) ; ( cd ../tests ; make VERBOSE_T=-1 COVERAGE_FILES='../pokernetwork/pokerserver.py' TESTS='coverage-reset test-pokerserver-run-load.py test-pokerserver.py coverage-report' check )"
+# End:
diff --git a/poker-network/tests/test-pokerserver.py.in b/poker-network/tests/test-pokerserver.py.in
index 7b7dfda..ced2360 100644
--- a/poker-network/tests/test-pokerserver.py.in
+++ b/poker-network/tests/test-pokerserver.py.in
@@ -2,6 +2,7 @@
 # -*- mode: python; coding: iso-8859-1 -*-
 # more information about the above line at http://www.python.org/dev/peps/pep-0263/
 #
+# Copyright (C) 2009 Bradley M. Kuhn <[email protected]>
 # Copyright (C) 2008 Johan Euphrosine <[email protected]>
 #
 # This software's license gives you freedom; you can copy, convey,
@@ -19,17 +20,30 @@
 # along with this program in a file in the toplevel directory called
 # "AGPLv3".  If not, see <http://www.gnu.org/licenses/>.
 #
-import sys, os, tempfile
+import sys, os, tempfile, shutil, exceptions, libxml2
+from cStringIO import StringIO
+
 sys.path.insert(0, "@srcdir@/..")
 sys.path.insert(0, "..")
 
 from twisted.trial import unittest, runner, reporter
 from twisted.application import service
 from twisted.internet import reactor, defer
-from pokernetwork.pokerserver import makeService
+from pokernetwork.pokerserver import makeService, makeApplication
+from pokernetwork.pokerserver import run as pokerServerRun
 from twisted.manhole import telnet
+from twisted.application.internet import SSLServer
+from twisted.application.internet import TCPServer
+from twisted.web.server import Site as TwistedSite
+from pokernetwork.pokerservice import PokerService, PokerRestTree, PokerFactoryFromPokerService, SSLContextFactory
+from pokernetwork.pokersite import PokerSite
+from pokernetwork.pokertable import PokerTable
+
+from tests.testmessages import silence_all_messages, search_output, clear_all_messages, get_messages
+verbose = int(os.environ.get('VERBOSE_T', '-1'))
+silence_all_messages()
 
-settings_xml_server = """<?xml version="1.0" encoding="ISO-8859-1"?>
+settings_xml_server_manhole = """<?xml version="1.0" encoding="ISO-8859-1"?>
 <server verbose="6" ping="300000" autodeal="yes" simultaneous="4" chat="yes" >
   <delays autodeal="20" round="0" position="0" showdown="0" autodeal_max="1" finish="0" messages="60" />
 
@@ -47,40 +61,701 @@ settings_xml_server = """<?xml version="1.0" encoding="ISO-8859-1"?>
 </server>
 """
 
-class PokerServerMakeServiceTestCase(unittest.TestCase):
+# Dummy CERT borrowed from Debian's snake-oil certificate.  Including it
+# here since I can't assume what distribution I am on.
+
+snake_oil_cert = """-----BEGIN CERTIFICATE-----
+MIIDKzCCApQCCQDEKuqSPjfcEDANBgkqhkiG9w0BAQUFADCB2TELMAkGA1UEBhMC
+WFgxKjAoBgNVBAgTIVRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgb3V0c2lkZSBVUzET
+MBEGA1UEBxMKRXZlcnl3aGVyZTEOMAwGA1UEChMFT0NPU0ExPDA6BgNVBAsTM09m
+ZmljZSBmb3IgQ29tcGxpY2F0aW9uIG9mIE90aGVyd2lzZSBTaW1wbGUgQWZmYWly
+czEXMBUGA1UEAxMObWFwbGUuc2ZsYy12cG4xIjAgBgkqhkiG9w0BCQEWE3Jvb3RA
+bWFwbGUuc2ZsYy12cG4wHhcNMDkwMTAyMTg1NzA0WhcNMDkwMjAxMTg1NzA0WjCB
+2TELMAkGA1UEBhMCWFgxKjAoBgNVBAgTIVRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcg
+b3V0c2lkZSBVUzETMBEGA1UEBxMKRXZlcnl3aGVyZTEOMAwGA1UEChMFT0NPU0Ex
+PDA6BgNVBAsTM09mZmljZSBmb3IgQ29tcGxpY2F0aW9uIG9mIE90aGVyd2lzZSBT
+aW1wbGUgQWZmYWlyczEXMBUGA1UEAxMObWFwbGUuc2ZsYy12cG4xIjAgBgkqhkiG
+9w0BCQEWE3Jvb3RAbWFwbGUuc2ZsYy12cG4wgZ8wDQYJKoZIhvcNAQEBBQADgY0A
+MIGJAoGBAO0t+HjxiiliSHO9kge943+cXHGCtJp4/RPpHDN7hbpblY+FYCjuCmW/
+/m2G59aMMl2Uwj1BO8cDwdGDtkNV21vcIo0siSD9VREFiYcLthaOK98muqD+Tfqa
+MuGzZyui1RKuirCZzqyJPS2SXOtWSXUW8YQa75y/o4vcQSWWZ3VDAgMBAAEwDQYJ
+KoZIhvcNAQEFBQADgYEApx7Q+PzLgdJu7OQJ776Kr+EI+Ho03pM5Nb5e26P5ZL6h
+hk+gRLfBt8q3bihx4qjBSOpx1Qxq+BAMg6SAkDzkz+tN2CSr/vv2uuc26cDaf1co
+oKCay2gMThIoURl+FSPeWAraGWbrcVy9ctoCipxMza9fn42dbn9OHxP/M+0qgvY=
+-----END CERTIFICATE-----
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQDtLfh48YopYkhzvZIHveN/nFxxgrSaeP0T6Rwze4W6W5WPhWAo
+7gplv/5thufWjDJdlMI9QTvHA8HRg7ZDVdtb3CKNLIkg/VURBYmHC7YWjivfJrqg
+/k36mjLhs2crotUSroqwmc6siT0tklzrVkl1FvGEGu+cv6OL3EEllmd1QwIDAQAB
+AoGBAL4ws+QABIOE/YZaSKSOn8Rv1S1s23hXdtGlh2i9L5It6LOrB14q7AmFuPeJ
+S5We3LBwHoZSLiY7nAtvLBO44GmwpSiJuLaI0z/7YIqkS6KjiDy1GFdQ5IEaRzxK
+nyDcvES4h4QdOa/UeMEWg8TmasEoG3Wm3+aZt5KRz57HQQJRAkEA/uN0aw+1jqVP
+YKbG89k7DEdNOdfgLjFofXruwXPfQmEFNg3Vp5ke1SeaR0tzYDXgZ5fDlwnR0EgA
+HrR0om3PKwJBAO42vxdAVjrfMt0ws0wTmKS7mLlY8p7dKVKKIwP6F2b/61QyEX7z
+czjyBaegw8qbX93OD0g2TETms73Py4WFJkkCQBV97FUSsAZlHfpSVbg9+uKgKHzW
+HQsIE31xHiylro+USrIyHG/TU2w5uKKGVCYqpM9XVqCnrU9Yotnz8Vm41J0CQQCf
+VccjikkjP8AJ61VCgakMJt7UuwYt9Mh7CSK6ukGFB5Ek1AiX3ccoQ9o8cXAEyUCq
+X/Yg2xDQ1W9Mev0q5hDhAkBKSJF0V/24bz27z1yUSzHRHO3FAKXepkR81g6IRl41
+r9nOQTOBo04TLBXtyP+o7GFNzBjEm6fVaqwk5SVsdQ+t
+-----END RSA PRIVATE KEY-----
+"""
+settings_xml_server_open_options = """<?xml version="1.0" encoding="ISO-8859-1"?>
+<server verbose="6" ping="300000" autodeal="yes" simultaneous="4" chat="yes" >
+  <delays autodeal="20" round="0" position="0" showdown="0" autodeal_max="1" finish="0" messages="60" />
+
+  <table name="Table1" variant="holdem" betting_structure="100-200-no-limit" seats="10" player_timeout="60" currency_serial="1" />
+  <table name="Table2" variant="holdem" betting_structure="100-200-no-limit" seats="10" player_timeout="60" currency_serial="1" />
+
+  <listen tcp="19481" %(listen_options)s />
+  <resthost host="127.0.0.1" port="19481" path="/POKER_REST" />
+
+  <cashier acquire_timeout="5" pokerlock_queue_timeout="30" user_create="yes" />
+  <database name="pokernetworktest" host="localhost" user="pokernetworktest" password="pokernetwork"
+            root_user="@MYSQL_TEST_DBROOT@" root_password="@MYSQL_TEST_DBROOT_PASSWORD@" schema="@srcdir@/../../database/schema.sql" command="@MYSQL@" />
+  <path>.. ../@srcdir@ @POKER_ENGINE_PKGSYSCONFDIR@ @POKER_NETWORK_PKGSYSCONFDIR@ %(additional_path)s</path>
+  <users temporary="BOT"/>
+</server>
+"""
+# ----------------------------------------------------------------
+class PokerServerMakeServiceManholeTestCase(unittest.TestCase):
     def destroyDb(self, arg = None):
         if len("@MYSQL_TEST_DBROOT_PASSWORD@") > 0:
             os.system("@MYSQL@ -u @MYSQL_TEST_DBROOT@ --password='@MYSQL_TEST_DBROOT_PASSWORD@' -e 'DROP DATABASE IF EXISTS pokernetworktest'")
         else:
             os.system("@MYSQL@ -u @MYSQL_TEST_DBROOT@ -e 'DROP DATABASE IF EXISTS pokernetworktest'")
+    # -------------------------------------------------------------------------
     def setUp(self):
         self.destroyDb()
         self.tmpdir = tempfile.mkdtemp()
         self.filename = os.path.join(self.tmpdir, "poker.server.xml")
         f = open(self.filename, "w")
         self.manhole_port = 33333
-        f.write(settings_xml_server % {'manhole_port' : self.manhole_port})
+        f.write(settings_xml_server_manhole % {'manhole_port' : self.manhole_port})
         f.close()
         argv =  [self.filename]
         self.service = makeService(self.filename)
         self.service.startService()
+    # -------------------------------------------------------------------------
     def tearDown(self):
-        os.remove(self.filename)
+        shutil.rmtree(self.tmpdir)
         return self.service.stopService()
+    # -------------------------------------------------------------------------
     def test01_manhole(self):
+        self.assertEquals(self.service.namedServices.keys(), ['manhole'])
         manhole = self.service.getServiceNamed('manhole')
         self.assertNotEqual(None, manhole)
         self.assertEqual(self.manhole_port, manhole._port.port)
         self.assertEqual('127.0.0.1', manhole._port.interface)
         self.assertEqual(telnet.Shell, manhole._port.factory.protocol)
+        self.assertEquals(manhole._port.connected, 1)
+        self.assertEquals(manhole.parent, self.service)
+        self.failUnless(manhole.running)
+        self.assertNotEqual(None, manhole._port.factory.namespace['poker_service'])
+        self.assertNotEqual(None, manhole._port.factory.namespace['poker_site'])
+# ----------------------------------------------------------------
+class PokerServerMakeServiceCoverageTestCase(unittest.TestCase):
+    def destroyDb(self, arg = None):
+        if len("@MYSQL_TEST_DBROOT_PASSWORD@") > 0:
+            os.system("@MYSQL@ -u @MYSQL_TEST_DBROOT@ --password='@MYSQL_TEST_DBROOT_PASSWORD@' -e 'DROP DATABASE IF EXISTS pokernetworktest'")
+        else:
+            os.system("@MYSQL@ -u @MYSQL_TEST_DBROOT@ -e 'DROP DATABASE IF EXISTS pokernetworktest'")
+    # -------------------------------------------------------------------------
+    def setUp(self):
+        self.destroyDb()
+        self.tmpdir = tempfile.mkdtemp()
+        self.filename = os.path.join(self.tmpdir, "poker.server.xml")
+    # -------------------------------------------------------------------------
+    def createService(self):
+        self.service = makeService(self.filename)
+        self.service.startService()
+    # -------------------------------------------------------------------------
+    def tearDown(self):
+        shutil.rmtree(self.tmpdir)
+        if hasattr(self, 'service'):
+            return self.service.stopService()
+        else:
+            return None
+    # -------------------------------------------------------------------------
+    def createConfig(self, optionsDict):
+        configFH = open(self.filename, "w")
+        configFH.write(settings_xml_server_open_options % optionsDict)
+        configFH.close()
+    # -------------------------------------------------------------------------
+    def createPemFile(self):
+        pemFile = os.path.join(self.tmpdir, "poker.pem")
+        pemFH = open(pemFile, "w")
+        pemFH.write(snake_oil_cert)
+        pemFH.close()
+    # -------------------------------------------------------------------------
+    def test00_missingSettingsFile(self):
+        caughtIt = False
+        try:
+            self.createService()
+            self.fail("previous line should have thrown exception")
+        except exceptions.SystemExit, e:
+            self.assertEquals(e.__str__(), "1")
+            caughtIt = True
+        self.failUnless(caughtIt, "Should have caught an Exception")
+    # -------------------------------------------------------------------------
+    def test01_emptySettingsFile(self):
+        f = open(self.filename, "w")
+        f.close()
+        caughtIt = False
+        try:
+            self.createService()
+            self.fail("previous line should have thrown exception")
+        except libxml2.parserError, e:
+            self.assertEquals(e.__str__(),'xmlParseFile() failed')
+            caughtIt = True
+        self.failUnless(caughtIt, "Should have caught an Exception")
+    # -------------------------------------------------------------------------
+    def test02_tcpSsl_hasSSL(self):
+        self.createConfig({'listen_options' : 'tcp_ssl="3234"',
+                          'additional_path' : self.tmpdir})
+        self.createPemFile()
+
+        self.createService()
+
+        # Only named service that we could possibly expect is manhole, and
+        # that's not turned on here.  Hence:
+        self.assertEquals(self.service.namedServices, {})
+
+        self.assertEquals(len(self.service.services), 3)
+        for service in self.service.services:
+            self.assertEquals(service.parent, self.service)
+            if isinstance(service, PokerService):
+                self.assertEquals(len(service.tables.keys()), 2)
+                self.failUnless(isinstance(service.tables[1], PokerTable))
+                self.failUnless(isinstance(service.tables[2], PokerTable))
+            elif isinstance(service, TCPServer):
+                self.failUnless(service._port.__str__().find("<<class 'twisted.internet.tcp.Port'> of pokernetwork.pokerservice.PokerFactoryFromPokerService on") == 0)
+                self.failUnless(service._port.port > 1024)
+                self.assertNotEquals(service._port.port, 3234)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.failIf(hasattr(service._port, 'ctxFactory'))
+                self.failUnless(service.running)
+            elif isinstance(service, SSLServer):
+                self.failUnless(isinstance(service.args[1], PokerFactoryFromPokerService))
+                self.failUnless(isinstance(service.args[2], SSLContextFactory))
+                self.assertEquals(service._port.__str__(),
+                                  "<<class 'twisted.internet.ssl.Port'> of pokernetwork.pokerservice.PokerFactoryFromPokerService on 3234>")
+                self.assertEquals(service._port.port, 3234)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.assertNotEquals(service._port.ctxFactory, None)
+                self.assertEquals(service._port.ctxFactory, service.args[2])
+                self.failUnless(service.running)
+            else:
+                self.fail("Unknown service found in multiservice list")
+    # -------------------------------------------------------------------------
+    def test03_tcpSsl_hasSSL_noPemFile(self):
+        self.createConfig({'listen_options' : 'tcp_ssl="3234"',
+                          'additional_path' : self.tmpdir})
+        caughtIt = False
+        try:
+            self.createService()
+            self.fail("previous line should have thrown exception")
+        except exceptions.TypeError, ee:
+            self.assertEquals(ee.__str__(),'use_certificate_file() argument 1 must be string, not None')
+            caughtIt = True
+        self.failUnless(caughtIt, "Should have caught an Exception")
+    # -------------------------------------------------------------------------
+    def test04_httpSSL_hasSSL_noPemFile(self):
+        self.createConfig({'listen_options' : 'http_ssl="3234"',
+                          'additional_path' : self.tmpdir})
+        caughtIt = False
+        try:
+            self.createService()
+            self.fail("previous line should have thrown exception")
+        except exceptions.TypeError, ee:
+            self.assertEquals(ee.__str__(),'use_certificate_file() argument 1 must be string, not None')
+            caughtIt = True
+        self.failUnless(caughtIt, "Should have caught an Exception")
+    # -------------------------------------------------------------------------
+    def test05_httpSSL_hasSSL(self):
+        self.createConfig({'listen_options' : 'http_ssl="9356"',
+                          'additional_path' : self.tmpdir})
+        self.createPemFile()
+
+        self.createService()
+
+        # Only named service that we could possibly expect is manhole, and
+        # that's not turned on here.  Hence:
+        self.assertEquals(self.service.namedServices, {})
+
+        self.assertEquals(len(self.service.services), 3)
+        for service in self.service.services:
+            self.assertEquals(service.parent, self.service)
+            if isinstance(service, PokerService):
+                self.assertEquals(len(service.tables.keys()), 2)
+                self.failUnless(isinstance(service.tables[1], PokerTable))
+                self.failUnless(isinstance(service.tables[2], PokerTable))
+            elif isinstance(service, TCPServer):
+                self.failUnless(service._port.__str__().find("<<class 'twisted.internet.tcp.Port'> of pokernetwork.pokerservice.PokerFactoryFromPokerService on") == 0)
+                self.failUnless(service._port.port > 1024)
+                self.assertNotEquals(service._port.port, 9356)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.failIf(hasattr(service._port, 'ctxFactory'))
+                self.failUnless(service.running)
+            elif isinstance(service, SSLServer):
+                self.failUnless(isinstance(service.args[1], TwistedSite))
+                self.failUnless(isinstance(service.args[2], SSLContextFactory))
+                self.assertEquals(service._port.__str__(),
+                                  "<<class 'twisted.internet.ssl.Port'> of twisted.web.server.Site on 9356>")
+                self.assertEquals(service._port.port, 9356)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.assertEquals(service._port.ctxFactory, service.args[2])
+                self.failUnless(service.running)
+            else:
+                self.fail("Unknown service found in multiservice list")
+    # -------------------------------------------------------------------------
+    def test06_restSSL_hasSSL_noPemFile(self):
+        self.createConfig({'listen_options' : 'rest_ssl="10234"',
+                          'additional_path' : self.tmpdir})
+        caughtIt = False
+        try:
+            self.createService()
+            self.fail("previous line should have thrown exception")
+        except exceptions.TypeError, ee:
+            self.assertEquals(ee.__str__(),'use_certificate_file() argument 1 must be string, not None')
+            caughtIt = True
+        self.failUnless(caughtIt, "Should have caught an Exception")
+    # -------------------------------------------------------------------------
+    def test07_restSSL_hasSSL(self):
+        self.createConfig({'listen_options' : 'rest_ssl="10234"',
+                          'additional_path' : self.tmpdir})
+        self.createPemFile()
+
+        self.createService()
+
+        # Only named service that we could possibly expect is manhole, and
+        # that's not turned on here.  Hence:
+        self.assertEquals(self.service.namedServices, {})
+
+        self.assertEquals(len(self.service.services), 3)
+        for service in self.service.services:
+            self.assertEquals(service.parent, self.service)
+            if isinstance(service, PokerService):
+                self.assertEquals(len(service.tables.keys()), 2)
+                self.failUnless(isinstance(service.tables[1], PokerTable))
+                self.failUnless(isinstance(service.tables[2], PokerTable))
+            elif isinstance(service, TCPServer):
+                self.failUnless(service._port.__str__().find("<<class 'twisted.internet.tcp.Port'> of pokernetwork.pokerservice.PokerFactoryFromPokerService on") == 0)
+                self.failUnless(service._port.port > 1024)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.failIf(hasattr(service._port, 'ctxFactory'))
+                self.failUnless(service.running)
+            elif isinstance(service, SSLServer):
+                self.failUnless(isinstance(service.args[1], PokerSite))
+                self.failUnless(isinstance(service.args[1].resource, PokerRestTree))
+                self.failUnless(isinstance(service.args[2], SSLContextFactory))
+                self.assertEquals(service._port.__str__(),
+                                  "<<class 'twisted.internet.ssl.Port'> of pokernetwork.pokersite.PokerSite on 10234>")
+                self.assertEquals(service._port.port, 10234)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.assertEquals(service._port.ctxFactory, service.args[2])
+                self.failUnless(service.running)
+            else:
+                self.fail("Unknown service found in multiservice list")
+    # -------------------------------------------------------------------------
+    def test08_plainREST(self):
+        self.createConfig({'listen_options' : 'rest="11944"',
+                          'additional_path' : self.tmpdir})
+        self.createService()
+
+        # Only named service that we could possibly expect is manhole, and
+        # that's not turned on here.  Hence:
+        self.assertEquals(self.service.namedServices, {})
+
+        self.assertEquals(len(self.service.services), 3)
+        count = 0
+        for service in self.service.services:
+            self.assertEquals(service.parent, self.service)
+            if isinstance(service, PokerService):
+                count += 1
+                self.assertEquals(len(service.tables.keys()), 2)
+                self.failUnless(isinstance(service.tables[1], PokerTable))
+                self.failUnless(isinstance(service.tables[2], PokerTable))
+            elif isinstance(service, TCPServer) and service._port.port == 11944:
+                count += 1
+                self.failUnless(service._port.__str__().find("<<class 'twisted.internet.tcp.Port'> of pokernetwork.pokersite.PokerSite on 11944>") == 0)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.failIf(hasattr(service._port, 'ctxFactory'))
+                self.failUnless(service.running)
+            elif isinstance(service, TCPServer):
+                count += 1
+                self.failUnless(service._port.__str__().find("<<class 'twisted.internet.tcp.Port'> of pokernetwork.pokerservice.PokerFactoryFromPokerService on") == 0)
+                self.failUnless(service._port.port > 1024)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.failIf(hasattr(service._port, 'ctxFactory'))
+                self.failUnless(service.running)
+            else:
+                self.fail("Unknown service found in multiservice list")
+        self.assertEquals(len(self.service.services), count)
+    # -------------------------------------------------------------------------
+    def test09_plainHTTP(self):
+        self.createConfig({'listen_options' : 'http="10235"',
+                          'additional_path' : self.tmpdir})
+        self.createService()
+
+        # Only named service that we could possibly expect is manhole, and
+        # that's not turned on here.  Hence:
+        self.assertEquals(self.service.namedServices, {})
+
+        self.assertEquals(len(self.service.services), 3)
+        count = 0
+        for service in self.service.services:
+            self.assertEquals(service.parent, self.service)
+            if isinstance(service, PokerService):
+                count += 1
+                self.assertEquals(len(service.tables.keys()), 2)
+                self.failUnless(isinstance(service.tables[1], PokerTable))
+                self.failUnless(isinstance(service.tables[2], PokerTable))
+            elif isinstance(service, TCPServer) and service._port.port == 10235:
+                count += 1
+                self.failUnless(service._port.__str__().find("<<class 'twisted.internet.tcp.Port'> of twisted.web.server.Site on 10235>") == 0)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.failIf(hasattr(service._port, 'ctxFactory'))
+                self.failUnless(service.running)
+            elif isinstance(service, TCPServer):
+                count += 1
+                self.failUnless(service._port.__str__().find("<<class 'twisted.internet.tcp.Port'> of pokernetwork.pokerservice.PokerFactoryFromPokerService on") == 0)
+                self.failUnless(service._port.port > 1024)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.failIf(hasattr(service._port, 'ctxFactory'))
+                self.failUnless(service.running)
+            else:
+                self.fail("Unknown service found in multiservice list")
+        self.assertEquals(len(self.service.services), count)
+    # -------------------------------------------------------------------------
+    def test10_everythingOn(self):
+        #"19481"
+        self.createConfig({'listen_options' :
+        'http="7658" http_ssl="6675" rest="5563" rest_ssl="7765" tcp_ssl="9123" manhole="10143"',
+                          'additional_path' : self.tmpdir})
+        self.createPemFile()
+        self.createService()
+
+        self.assertEquals(self.service.namedServices.keys(), ['manhole'])
+        self.failUnless(isinstance(self.service.namedServices['manhole'], TCPServer))
+
+        # Check Manhole first
+        manhole = self.service.getServiceNamed('manhole')
+        self.assertNotEqual(None, manhole)
+        self.assertEqual(10143, manhole._port.port)
+        self.assertEqual('127.0.0.1', manhole._port.interface)
+        self.assertEqual(telnet.Shell, manhole._port.factory.protocol)
+        self.assertEquals(manhole._port.connected, 1)
+        self.assertEquals(manhole.parent, self.service)
+        self.failUnless(manhole.running)
         self.assertNotEqual(None, manhole._port.factory.namespace['poker_service'])
         self.assertNotEqual(None, manhole._port.factory.namespace['poker_site'])
 
+        self.assertEquals(len(self.service.services), 8)
+        count = 0
+        for service in self.service.services:
+            self.assertEquals(service.parent, self.service)
+            if isinstance(service, PokerService):
+                count += 1
+                self.assertEquals(len(service.tables.keys()), 2)
+                self.failUnless(isinstance(service.tables[1], PokerTable))
+                self.failUnless(isinstance(service.tables[2], PokerTable))
+            elif isinstance(service, TCPServer) and service._port.port == 19481:
+                count += 1
+                self.failUnless(service._port.__str__().find("<<class 'twisted.internet.tcp.Port'> of pokernetwork.pokerservice.PokerFactoryFromPokerService on 19481") == 0)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.failIf(hasattr(service._port, 'ctxFactory'))
+                self.failUnless(service.running)
+            elif isinstance(service, TCPServer) and service._port.port == 10143:
+                count += 1
+                print service._port.__str__()
+                self.failUnless(service._port.__str__().find("<<class 'twisted.internet.tcp.Port'> of twisted.manhole.telnet.ShellFactory on 10143>") == 0)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '127.0.0.1')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.failIf(hasattr(service._port, 'ctxFactory'))
+                self.failUnless(service.running)
+            elif isinstance(service, SSLServer) and service._port.port == 9123:
+                count += 1
+                self.failUnless(isinstance(service.args[1], PokerFactoryFromPokerService))
+                self.failUnless(isinstance(service.args[2], SSLContextFactory))
+                self.assertEquals(service._port.__str__(),
+                                  "<<class 'twisted.internet.ssl.Port'> of pokernetwork.pokerservice.PokerFactoryFromPokerService on 9123>")
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.assertNotEquals(service._port.ctxFactory, None)
+                self.assertEquals(service._port.ctxFactory, service.args[2])
+                self.failUnless(service.running)
+            elif isinstance(service, SSLServer) and service._port.port == 6675:
+                count += 1
+                self.failUnless(isinstance(service.args[1], TwistedSite))
+                self.failUnless(isinstance(service.args[2], SSLContextFactory))
+                self.assertEquals(service._port.__str__(),
+                                  "<<class 'twisted.internet.ssl.Port'> of twisted.web.server.Site on 6675>")
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.assertEquals(service._port.ctxFactory, service.args[2])
+                self.failUnless(service.running)
+            elif isinstance(service, SSLServer) and service._port.port == 7765:
+                count += 1
+                self.failUnless(isinstance(service.args[1], PokerSite))
+                self.failUnless(isinstance(service.args[1].resource, PokerRestTree))
+                self.failUnless(isinstance(service.args[2], SSLContextFactory))
+                self.assertEquals(service._port.__str__(),
+                                  "<<class 'twisted.internet.ssl.Port'> of pokernetwork.pokersite.PokerSite on 7765>")
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.assertEquals(service._port.ctxFactory, service.args[2])
+                self.failUnless(service.running)
+            elif isinstance(service, TCPServer) and service._port.port == 5563:
+                count += 1
+                self.failUnless(service._port.__str__().find("<<class 'twisted.internet.tcp.Port'> of pokernetwork.pokersite.PokerSite on 5563>") == 0)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.failIf(hasattr(service._port, 'ctxFactory'))
+                self.failUnless(service.running)
+            elif isinstance(service, TCPServer) and service._port.port == 7658:
+                count += 1
+                self.failUnless(service._port.__str__().find("<<class 'twisted.internet.tcp.Port'> of twisted.web.server.Site on 7658>") == 0)
+                self.assertEquals(service._port.port, service._port._realPortNumber) 
+                self.assertEquals(service._port.interface, '')
+                self.assertEquals(service._port.connected, 1)
+                self.assertNotEquals(service._port.socket, None)
+                self.failIf(hasattr(service._port, 'ctxFactory'))
+                self.failUnless(service.running)
+            else:
+                self.fail("Unknown service found in multiservice list")
+        self.assertEquals(len(self.service.services), count)
+# ----------------------------------------------------------------
+class PokerServerMakeApplicationCoverageTestCase(unittest.TestCase):
+    def destroyDb(self, arg = None):
+        if len("@MYSQL_TEST_DBROOT_PASSWORD@") > 0:
+            os.system("@MYSQL@ -u @MYSQL_TEST_DBROOT@ --password='@MYSQL_TEST_DBROOT_PASSWORD@' -e 'DROP DATABASE IF EXISTS pokernetworktest'")
+        else:
+            os.system("@MYSQL@ -u @MYSQL_TEST_DBROOT@ -e 'DROP DATABASE IF EXISTS pokernetworktest'")
+    # -------------------------------------------------------------------------
+    def setUp(self):
+        self.destroyDb()
+        self.tmpdir = tempfile.mkdtemp()
+    # -------------------------------------------------------------------------
+    def tearDown(self):
+        shutil.rmtree(self.tmpdir)
+    # -------------------------------------------------------------------------
+    def test00_missingConfigFileGivenOnCLI(self):
+        doesNotExistFile = os.path.join(self.tmpdir, "thisdoesnotexist.xml")
+        caughtIt = False
+        try:
+            makeApplication([doesNotExistFile])
+            self.fail("previous line should have thrown exception")
+        except exceptions.SystemExit, e:
+            self.assertEquals(e.__str__(), "1")
+            caughtIt = True
+        self.failUnless(caughtIt, "Should have caught an Exception")
+    # -------------------------------------------------------------------------
+    def test01_missingConfigFileGivenOnCLI_sysVersionDitched(self):
+        doesNotExistFile = os.path.join(self.tmpdir, "doesnotexists.xml")
+        saveSysVersion = sys.version
+        sys.version = "BMK"
+        caughtIt = False
+        try:
+            makeApplication([doesNotExistFile])
+            self.fail("previous line should have thrown exception")
+        except exceptions.SystemExit, e:
+            self.assertEquals(e.__str__(), "1")
+            caughtIt = True
+        self.failUnless(caughtIt, "Should have caught an Exception")
+        sys.version = saveSysVersion
+    # -------------------------------------------------------------------------
+    def test02_validConfig(self):
+        configFile = os.path.join(self.tmpdir, "ourconfig.xml")
+        configFH = open(configFile, "w")
+        configFH.write(settings_xml_server_open_options % { 'listen_options' : '', 
+                                                            'additional_path' : ''})
+        configFH.close()
+        application =  makeApplication([configFile])
+        from twisted.python.components import Componentized
+        self.failUnless(isinstance(application, Componentized))
+# ----------------------------------------------------------------
+class PokerServerRunCoverageTestCase(unittest.TestCase):
+    def destroyDb(self, arg = None):
+        if len("@MYSQL_TEST_DBROOT_PASSWORD@") > 0:
+            os.system("@MYSQL@ -u @MYSQL_TEST_DBROOT@ --password='@MYSQL_TEST_DBROOT_PASSWORD@' -e 'DROP DATABASE IF EXISTS pokernetworktest'")
+        else:
+            os.system("@MYSQL@ -u @MYSQL_TEST_DBROOT@ -e 'DROP DATABASE IF EXISTS pokernetworktest'")
+    # -------------------------------------------------------------------------
+    def setUp(self):
+        self.destroyDb()
+        self.tmpdir = tempfile.mkdtemp()
+        self.saveSysout = None
+        self.saveArgv = None
+    # -------------------------------------------------------------------------
+    def tearDown(self):
+        shutil.rmtree(self.tmpdir)
+        if self.saveSysout:
+            value = sys.stdout.getvalue()
+            if self.expectedOutput:
+                self.failUnless(value.find(self.expectedOutput) >= 0,
+                                "Unable to find " + self.expectedOutput + " in " + value)
+            sys.stdout = self.saveSysout
+        if self.saveArgv:
+            sys.argv = self.saveArgv
+    # -------------------------------------------------------------------------
+    def holdStdout(self):
+        self.saveSysout = sys.stdout
+        sys.stdout = StringIO()
+    # -------------------------------------------------------------------------
+    def setArgv(self, newArgv):
+        self.saveArgv = sys.argv
+        sys.argv = newArgv
+    # -------------------------------------------------------------------------
+    def test00_missingConfigFileGivenOnCLI(self):
+        doesNotExistFile = os.path.join(self.tmpdir, "thisdoesnotexist.xml")
+        caughtIt = False
+        self.holdStdout()
+        try:
+            pokerServerRun()
+            self.fail("previous line should have thrown exception")
+        except exceptions.SystemExit, e:
+            self.assertEquals(e.__str__(), "1")
+            caughtIt = True
+        self.failUnless(caughtIt, "Should have caught an Exception")
+
+        self.expectedOutput = "poll reactor already installed"
+    # -------------------------------------------------------------------------
+    def test01_missingConfigFileGivenOnCLI_forceReactorInstall(self):
+        """This test looks for an error when attempting to install the
+        poll.reactor if it wasn't already there.  We had some debate about
+        whether this is the behavior we want.  This may be a FIXME."""
+
+        # Some discussion of this test happened on IRC, see:
+        # http://pokersource.info/irc/[email protected]/2009-05-18.html
+        import platform
+        from twisted.internet import pollreactor
+        doesNotExistFile = os.path.join(self.tmpdir, "thisdoesnotexist.xml")
+        caughtIt = False
+        self.holdStdout()
+
+        saveSystem = platform.system
+        if platform.system() == "Windows":
+            def fakeSystem():
+                return "NotWindowsButReallyIs"
+            platform.system = fakeSystem
+
+        reactorCalled = False
+        def reactorFake():
+            reactorCalled = True
+        saveReactor = pollreactor.install
+        pollreactor.install = reactorFake
+
+        reactorModulesSave = sys.modules['twisted.internet.reactor']
+        del sys.modules['twisted.internet.reactor']
+
+        try:
+            pokerServerRun()
+            self.fail("previous line should have thrown exception")
+        except exceptions.UnboundLocalError, e:
+            self.assertEquals(e.__str__(), "local variable 'pollreactor' referenced before assignment")
+            caughtIt = True
+        self.failUnless(caughtIt, "Should have caught an Exception")
+
+        self.expectedOutput = "installing poll reactor"
+
+        self.failIf(reactorCalled, "Poll reactor can't be called because it is not imported")
+
+        if saveSystem:
+            platform.system = saveSystem
+        pollreactor.install = saveReactor
+        sys.modules['twisted.internet.reactor'] = reactorModulesSave
+    # -------------------------------------------------------------------------
+    # This alternative test01 should probably pass.  It does not currently.
+    def alt_test01_missingConfigFileGivenOnCLI_forceReactorInstall(self):
+        import platform
+        from twisted.internet import pollreactor
+        doesNotExistFile = os.path.join(self.tmpdir, "thisdoesnotexist.xml")
+        caughtIt = False
+        self.holdStdout()
+
+        saveSystem = platform.system
+        if platform.system() == "Windows":
+            def fakeSystem():
+                return "NotWindowsButReallyIs"
+            platform.system = fakeSystem
+
+        reactorCalled = False
+        def reactorFake():
+            reactorCalled = True
+        saveReactor = pollreactor.install
+        pollreactor.install = reactorFake
+
+        reactorModulesSave = sys.modules['twisted.internet.reactor']
+        del sys.modules['twisted.internet.reactor']
+
+        try:
+            pokerServerRun()
+            self.fail("previous line should have thrown exception")
+        except exceptions.SystemExit, e:
+            self.assertEquals(e.__str__(), "1")
+            caughtIt = True
+        self.failUnless(caughtIt, "Should have caught an Exception")
+
+        self.expectedOutput = "installing poll reactor"
+
+        self.failIf(reactorCalled, "Poll reactor should have been installed")
+
+        if saveSystem:
+            platform.system = saveSystem
+        pollreactor.install = saveReactor
+        sys.modules['twisted.internet.reactor'] = reactorModulesSave
+# ----------------------------------------------------------------
 def Run():
     loader = runner.TestLoader()
-#    loader.methodPrefix = "test01"
+#    loader.methodPrefix = "test_trynow"
     suite = loader.suiteFactory()
-    suite.addTest(loader.loadClass(PokerServerMakeServiceTestCase))
+    suite.addTest(loader.loadClass(PokerServerMakeServiceManholeTestCase))
+    suite.addTest(loader.loadClass(PokerServerMakeServiceCoverageTestCase))
+    suite.addTest(loader.loadClass(PokerServerMakeApplicationCoverageTestCase))
+    suite.addTest(loader.loadClass(PokerServerRunCoverageTestCase))
     return runner.TrialRunner(
         reporter.VerboseTextReporter,
 #       reporter.TextReporter,
@@ -96,5 +771,5 @@ if __name__ == '__main__':
 
 # Interpreted by emacs
 # Local Variables:
-# compile-command: "( cd .. ; ./config.status tests/test-pokerserver.py ) ; ( cd ../tests ; make COVERAGE_FILES='../pokernetwork/pokerserver.py' TESTS='coverage-reset test-pokerserver.py coverage-report' check )"
+# compile-command: "( cd .. ; ./config.status tests/test-pokerserver.py tests/test-pokerserver-run-load.py ) ; ( cd ../tests ; make VERBOSE_T=-1 COVERAGE_FILES='../pokernetwork/pokerserver.py' TESTS='coverage-reset test-pokerserver.py test-pokerserver-run-load.py coverage-report' check )"
 # End:
-- 

   -- bkuhn
_______________________________________________
Pokersource-users mailing list
[email protected]
https://mail.gna.org/listinfo/pokersource-users

Reply via email to