I'd like to merge the following tests I wrote for pokerclient.py into trunk. This should be a non-controversial patch and should not need too much review, since it's just test-coverage. Please let me know very soon on IRC if you have objections to merging this patch into trunk.
Here is the commit log on the merge I expect to use: Merged from coverage-poker-network: some pokerclient.py test coverage. Detailed logs of implementation of these tests can be found in r5761-r5802, r5995-r5996 on coverage-poker-network branch. This patch is copyrighted by me and licensed AGPLv3-or-later.
diff --git a/poker-network/ChangeLog b/poker-network/ChangeLog index 020b3f0..83f9feb 100644 --- a/poker-network/ChangeLog +++ b/poker-network/ChangeLog @@ -1,3 +1,61 @@ +2009-07-03 Bradley M. Kuhn <[email protected]> + + * tests/test-pokerclient.py.in + (PokerClientFactoryUnitMethodCoverageTestCase.test11_restartNoDisplay): + Finished test. + (PokerClientFactoryUnitMethodCoverageTestCase.setupMockChildrenReactorOs): + No longer mock-up os. + +2009-06-06 Bradley M. Kuhn <[email protected]> + + * tests/test-pokerclient.py.in + (PokerClientFactoryUnitMethodCoverageTestCase.test09_upgradeTick): + Wrote test. + (PokerClientFactoryUnitMethodCoverageTestCase.test10_upgradeTick_noDisplay): + Wrote test. + + * pokernetwork/pokerclient.py + (PokerClientFactory.networkNotAvailable): "no cover". pass + statements cannot be covered. + (PokerClientFactory.networkAvailable): "no cover". pass + statements cannot be covered. + + * tests/test-pokerclient.py.in + (PokerClientFactoryUnitMethodCoverageTestCase.test08_checkNetwork_ForceHostNotResolved): + Wrote test. + +2009-05-31 Bradley M. Kuhn <[email protected]> + + * tests/test-pokerclient.py.in (PokerSkinMethodUnitTest): Created + test class. + (PokerSkinMethodUnitTest.test00_destroyDoesNothing): Wrote test. + (PokerSkinMethodUnitTest.test01_interfaceReadyDoesNothing): + Wrote test. + (PokerSkinMethodUnitTest.test02_getAndSetURL): Wrote test. + (PokerSkinMethodUnitTest.test04_hideOutfitEditorDoesNothing): + Wrote test. + (PokerSkinMethodUnitTest.test05_showOutfitEditorDoesNothing): + Wrote test. + (PokerClientLogErrorFunctionTestCase): Created test class. + (PokerClientLogErrorFunctionTestCase.test00_errLogTest): Wrote test. + (PokerClientFactoryUnitMethodCoverageTestCase): Created test class. + (PokerClientFactoryUnitMethodCoverageTestCase.test00_initWithBadConfig): + Wrote test. + (PokerClientFactoryUnitMethodCoverageTestCase.test01_initWithEmptySequence): + Wrote test. + (PokerClientFactoryUnitMethodCoverageTestCase.test02_initWithstringValues): + Wrote test. + (PokerClientFactoryUnitMethodCoverageTestCase.test03_init_configWithProperInts): + Wrote test. + (PokerClientFactoryUnitMethodCoverageTestCase.test04_init_missingChatMissingDelays): + Wrote test. + (PokerClientFactoryUnitMethodCoverageTestCase.test05_init_roundPositionOverrides): + Wrote test. + (PokerClientFactoryUnitMethodCoverageTestCase.test07_resolve): + Wrote test. + (PokerClientFactoryUnitMethodCoverageTestCase.test06_delRemovesGames): + Wrote test. + 2009-05-19 Bradley M. Kuhn <[email protected]> * tests/run.in (COVERAGE_100_PERCENT): pokerserver.py now covered diff --git a/poker-network/pokernetwork/pokerclient.py b/poker-network/pokernetwork/pokerclient.py index 94fee42..18df983 100644 --- a/poker-network/pokernetwork/pokerclient.py +++ b/poker-network/pokernetwork/pokerclient.py @@ -198,10 +198,10 @@ class PokerClientFactory(UGAMEClientFactory): self.networkAvailable() def networkNotAvailable(self): - pass + pass #pragma: no cover def networkAvailable(self): - pass + pass #pragma: no cover def upgradeTick(self, ratio, message): self.display.tickProgressBar(ratio, message) diff --git a/poker-network/tests/test-pokerclient.py.in b/poker-network/tests/test-pokerclient.py.in index f45332b..45992e7 100644 --- a/poker-network/tests/test-pokerclient.py.in +++ b/poker-network/tests/test-pokerclient.py.in @@ -1338,12 +1338,383 @@ class SettingMockup: return None # ------------------------------------------------------ +from pokernetwork.pokerclient import PokerSkin + +class PokerSkinMethodUnitTest(unittest.TestCase): + # --------------------------------------------------------------------------- + def setUp(self): + pass + # --------------------------------------------------------------------------- + def tearDown(self): + pass + # --------------------------------------------------------------------------- + def test00_destroyDoesNothing(self): + skin = PokerSkin(settings = 'testing') + skin.destroy() + self.assertEquals(skin.url, "random") + self.assertEquals(skin.outfit, "random") + self.assertEquals(skin.settings, "testing") + # --------------------------------------------------------------------------- + def test01_interfaceReadyDoesNothing(self): + skin = PokerSkin(settings = 'testing') + skin.interfaceReady(None, None) + self.assertEquals(skin.url, "random") + self.assertEquals(skin.outfit, "random") + self.assertEquals(skin.settings, "testing") + # --------------------------------------------------------------------------- + def test02_getAndSetURL(self): + skin = PokerSkin(settings = 'testing') + self.assertEquals(skin.getUrl(), "random") + skin.setUrl("http://www.example.org/poker") + self.assertEquals(skin.getUrl(), "http://www.example.org/poker") + # --------------------------------------------------------------------------- + def test03_getAndSetOutfit(self): + skin = PokerSkin(settings = 'testing') + self.assertEquals(skin.getOutfit(), "random") + skin.setOutfit("naked") + self.assertEquals(skin.getOutfit(), "naked") + # --------------------------------------------------------------------------- + def test04_hideOutfitEditorDoesNothing(self): + skin = PokerSkin(settings = 'testing') + skin.hideOutfitEditor() + self.assertEquals(skin.url, "random") + self.assertEquals(skin.outfit, "random") + self.assertEquals(skin.settings, "testing") + # --------------------------------------------------------------------------- + def test05_showOutfitEditorDoesNothing(self): + skin = PokerSkin(settings = 'testing') + skin.showOutfitEditor(None) + self.assertEquals(skin.url, "random") + self.assertEquals(skin.outfit, "random") + self.assertEquals(skin.settings, "testing") +# ------------------------------------------------------ +class PokerClientLogErrorFunctionTestCase(unittest.TestCase): + # --------------------------------------------------------------------------- + def setUp(self): + pass + # --------------------------------------------------------------------------- + def tearDown(self): + pass + # --------------------------------------------------------------------------- + def test00_errLogTest(self): + from twisted.python import log as twistedLog + from pokernetwork import pokerclient as pc + + saveLogErr = pc.log_err + + global myLogErrorCallCount + myLogErrorCallCount = 0 + def myLogErr(firstArg, secondArg, thirdArg = None): + global myLogErrorCallCount + myLogErrorCallCount += 1 + self.assertEquals(firstArg, "FirstOne") + self.assertEquals(secondArg, "SecondOne") + self.assertEquals(thirdArg, "ThirdOne") + pc.log_err = myLogErr + + self.failIf(twistedLog.error_occurred, + "Twisted Log should not have an error occurred yet") + + pc.err("FirstOne", "SecondOne", thirdArg = "ThirdOne") + self.assertEquals(myLogErrorCallCount, 1) + self.failUnless(twistedLog.error_occurred, + "Twisted Log should have logged an error occurred") + + pc.log_err = saveLogErr +# ------------------------------------------------------ +settings_xml_client_noChatNoDelays = """<?xml version="1.0" encoding="ISO-8859-1"?> +<settings display2d="yes" display3d="no" ping="15000" verbose="6" delays="true" tcptimeout="2000" upgrades="no"> + <screen fullscreen="no" width="1024" height="768"/> + <name>user1</name> + <passwd>password1</passwd> + <remember>yes</remember> + <muck>yes</muck> + <auto_post>no</auto_post> + <web browser="/usr/bin/firefox">http://localhost/poker-web/</web> + <sound>yes</sound> + <tournaments currency_serial="1" type="sit_n_go" sort="name"/> + <lobby currency_serial="1" type="holdem" sort="name"/> + <shadow>yes</shadow> + <vprogram>yes</vprogram> + + <user path="~/.poker2d"/> + <path>.. ../@srcdir@ @POKER_ENGINE_PKGSYSCONFDIR@ @POKER_NETWORK_PKGSYSCONFDIR@</path> + <rsync path="/usr/bin/rsync" dir="." source="rsync.pok3d.com::pok3d/linux-gnu" target="/tmp/installed" upgrades="share/poker-network/upgrades"/> + <data path="data" sounds="data/sounds"/> + <handlist start="0" count="10"/> +</settings> +""" + +settings_xml_client_delaysWithRoundNoBlindAnte = """<?xml version="1.0" encoding="ISO-8859-1"?> +<settings display2d="yes" display3d="no" ping="15000" verbose="6" delays="true" tcptimeout="2000" upgrades="no"> + <delays position="66" round="42" begin_round="77" end_round="99" end_round_last="0" showdown="0" lag="60"/> + <screen fullscreen="no" width="1024" height="768"/> + <name>user1</name> + <passwd>password1</passwd> + <remember>yes</remember> + <muck>yes</muck> + <auto_post>no</auto_post> + <web browser="/usr/bin/firefox">http://localhost/poker-web/</web> + <sound>yes</sound> + <tournaments currency_serial="1" type="sit_n_go" sort="name"/> + <lobby currency_serial="1" type="holdem" sort="name"/> + <shadow>yes</shadow> + <vprogram>yes</vprogram> + + <user path="~/.poker2d"/> + <path>.. ../@srcdir@ @POKER_ENGINE_PKGSYSCONFDIR@ @POKER_NETWORK_PKGSYSCONFDIR@</path> + <rsync path="/usr/bin/rsync" dir="." source="rsync.pok3d.com::pok3d/linux-gnu" target="/tmp/installed" upgrades="share/poker-network/upgrades"/> + <data path="data" sounds="data/sounds"/> + <handlist start="0" count="10"/> +</settings> +""" + +class PokerClientFactoryUnitMethodCoverageTestCase(unittest.TestCase): + """These tests cover the methods in PokerClientFactory that are not + otherwise covered by other tests in this file. They are not + particularly "aware" tests, they simply exercise various parts of the + code to be sure the expected behavior occurs in the context of the + individual methods.""" + # --------------------------------------------------------------------------- + def setUp(self): + self.settings = pokernetworkconfig.Config([]) + self.settings.doc = libxml2.parseMemory(settings_xml_client, len(settings_xml_client)) + self.settings.header = self.settings.doc.xpathNewContext() + # --------------------------------------------------------------------------- + def tearDown(self): pass + # --------------------------------------------------------------------------- + def test00_initWithBadConfig(self): + config_xml = """<?xml version="1.0" encoding="ISO-8859-1"?> +<nothing/>""" + config = pokernetworkconfig.Config([]) + config.doc = libxml2.parseMemory(config_xml, len(config_xml)) + config.header = config.doc.xpathNewContext() + caughtIt = False + try: + clientFactory = pokerclient.PokerClientFactory( + settings = self.settings, config = config) + self.fail("previous line should have thrown exception") + except UserWarning, uw: + self.assertEquals(uw.__str__(), "PokerClientFactory: no /sequence/chips found in None") + caughtIt = True + self.failUnless(caughtIt, "Should have caught an Exception") + # --------------------------------------------------------------------------- + def test01_initWithEmptySequence(self): + config_xml = """<?xml version="1.0" encoding="ISO-8859-1"?> +<sequence> +</sequence>""" + config = pokernetworkconfig.Config([]) + config.doc = libxml2.parseMemory(config_xml, len(config_xml)) + config.header = config.doc.xpathNewContext() + caughtIt = False + try: + clientFactory = pokerclient.PokerClientFactory( + settings = self.settings, config = config) + self.fail("previous line should have thrown exception") + except UserWarning, uw: + self.assertEquals(uw.__str__(), "PokerClientFactory: no /sequence/chips found in None") + caughtIt = True + self.failUnless(caughtIt, "Should have caught an Exception") + # --------------------------------------------------------------------------- + def test02_initWithstringValues(self): + config_xml = """<?xml version="1.0" encoding="ISO-8859-1"?> +<sequence> +<chips>10 bar</chips> +</sequence>""" + config = pokernetworkconfig.Config([]) + config.doc = libxml2.parseMemory(config_xml, len(config_xml)) + config.header = config.doc.xpathNewContext() + caughtIt = False + try: + clientFactory = pokerclient.PokerClientFactory( + settings = self.settings, config = config) + self.fail("previous line should have thrown exception") + except ValueError, ve: + self.assertEquals(ve.__str__(), + "invalid literal for int() with base 10: 'bar'") + caughtIt = True + self.failUnless(caughtIt, "Should have caught an Exception") + # --------------------------------------------------------------------------- + def test03_init_configWithProperInts(self): + config_xml = """<?xml version="1.0" encoding="ISO-8859-1"?> +<sequence> +<chips>5 200 10 15 20</chips> +</sequence>""" + config = pokernetworkconfig.Config([]) + config.doc = libxml2.parseMemory(config_xml, len(config_xml)) + config.header = config.doc.xpathNewContext() + + clientFactory = pokerclient.PokerClientFactory(settings = self.settings, + config = config) + self.assertEquals(clientFactory.chips_values, + [5, 200, 10, 15, 20]) + # --------------------------------------------------------------------------- + def test04_init_missingChatMissingDelays(self): + settings = pokernetworkconfig.Config([]) + settings.doc = libxml2.parseMemory(settings_xml_client_noChatNoDelays, + len(settings_xml_client_noChatNoDelays)) + settings.header = settings.doc.xpathNewContext() + clientFactory = pokerclient.PokerClientFactory(settings = settings) + self.assertEquals(clientFactory.delays, {}) + self.assertEquals(clientFactory.chat_config, {}) + # --------------------------------------------------------------------------- + def test05_init_roundPositionOverrides(self): + settings = pokernetworkconfig.Config([]) + settings.doc = libxml2.parseMemory(settings_xml_client_delaysWithRoundNoBlindAnte, + len(settings_xml_client_delaysWithRoundNoBlindAnte)) + settings.header = settings.doc.xpathNewContext() + + # Confirm the delays are properly read from the file before init'ing + # PokerClientFactory + delays = settings.headerGetProperties("/settings/delays")[0] + for (key, value) in delays.iteritems(): + delays[key] = float(value) + self.assertEquals(delays["end_round"], 99) + self.assertEquals(delays["begin_round"], 77) + self.assertEquals(delays["round"], 42) + self.assertEquals(delays["position"], 66) + self.failIf(delays.has_key("blind_ante_position")) + + clientFactory = pokerclient.PokerClientFactory(settings = settings) + + self.assertEquals(len(clientFactory.delays.keys()), 7) + self.assertEquals(clientFactory.delays['lag'], 60.0) + self.assertEquals(clientFactory.delays['end_round_last'], 0.0) + self.assertEquals(clientFactory.delays['showdown'], 0.0) + self.assertEquals(clientFactory.delays['blind_ante_position'], 66.0) + self.assertEquals(clientFactory.delays['begin_round'], 42.0) + self.assertEquals(clientFactory.delays['position'], 66.0) + self.assertEquals(clientFactory.delays['end_round'], 42.0) + # --------------------------------------------------------------------------- + def test06_delRemovesGames(self): + clientFactory = pokerclient.PokerClientFactory(settings = self.settings) + global mockGamesDelCount + mockGamesDelCount = 0 + class MockGames(): + def __del__(self): + global mockGamesDelCount + mockGamesDelCount += 1 + clientFactory.games = MockGames() + clientFactory.__del__() + self.assertEquals(mockGamesDelCount, 1) + # --------------------------------------------------------------------------- + def test07_resolve(self): + clientFactory = pokerclient.PokerClientFactory(settings = self.settings) + + realResolve = reactor.resolve + + global myResolveCallCount + myResolveCallCount = 0 + def myResolve(url, stuff): + global myResolveCallCount + myResolveCallCount += 1 + self.assertEquals(url, "http://example.org") + self.assertEquals(stuff, (1,1)) + + reactor.resolve = myResolve + clientFactory.resolve("http://example.org") + reactor.resolve = realResolve + self.assertEquals(myResolveCallCount, 1) + # --------------------------------------------------------------------------- + def test08_checkNetwork_ForceHostNotResolved(self): + clientFactory = pokerclient.PokerClientFactory(settings = self.settings) + + realResolve = reactor.resolve + saveNetworkNotAvailable = clientFactory.networkNotAvailable + + resolveDeferred = defer.Deferred() + def myResolve(url, stuff): + return resolveDeferred + + mustGetCalledBackForTestSuccessDefferred = defer.Deferred() + def myNetworkNotAvailable(): + reactor.resolve = realResolve # Restore reactor's resolve + clientFactory.networkNotAvailable = saveNetworkNotAvailable + mustGetCalledBackForTestSuccessDefferred.callback(True) + + reactor.resolve = myResolve + clientFactory.networkNotAvailable = myNetworkNotAvailable + + resolveDeferred.errback(True) + return defer.DeferredList([ + clientFactory.checkNetwork("http://example.org"), + mustGetCalledBackForTestSuccessDefferred]) + # --------------------------------------------------------------------------- + def test09_upgradeTick(self): + clientFactory = pokerclient.PokerClientFactory(settings = self.settings) + class MockDisplay(): + def tickProgressBar(mdSelf, ratio, message): + self.assertEquals(ratio, "TEST RATIO") + self.assertEquals(message, "TEST MESSAGE") + clientFactory.display = MockDisplay() + clientFactory.upgradeTick("TEST RATIO", "TEST MESSAGE") + # --------------------------------------------------------------------------- + def test10_upgradeTick_noDisplay(self): + clientFactory = pokerclient.PokerClientFactory(settings = self.settings) + caughtIt = False + try: + clientFactory.upgradeTick("TEST RATIO", "TEST MESSAGE") + self.fail("previous line should have thrown exception") + except AttributeError, ae: + self.assertEquals(ae.__str__(), + "'NoneType' object has no attribute 'tickProgressBar'") + caughtIt = True + self.failUnless(caughtIt, "Should have caught an Exception") + # --------------------------------------------------------------------------- + # Next two helper fuctions are for coverage tests on restart() + def setupMockChildrenReactorOs(self, clientFactory): + import os + class MockChildren(): + def __init__(mcSelf): mcSelf.killallCount = 0 + def killall(mcSelf): mcSelf.killallCount += 1 + + clientFactory.children = MockChildren() + + self.reactorDisconnectAllCount = 0 + def mockReactorDisconnectAll(): + self.reactorDisconnectAllCount += 1 + + self.saveReactorDisconnectAll = reactor.disconnectAll + reactor.disconnectAll = mockReactorDisconnectAll + + self.saveSysArgv = sys.argv + self.saveExecutable = sys.executable + sys.executable = "testprogram_should_not_ever_exist" + sys.argv = ['onearg', 'twoarg', 'threearg' ] + + # --------------------------------------------------------------------------- + def restoreReactorOs(self): + sys.argv = self.saveSysArgv + sys.executable = self.saveExecutable + reactor.disconnectAll = self.saveReactorDisconnectAll + # --------------------------------------------------------------------------- + def test11_restartNoDisplay(self): + import exceptions + clientFactory = pokerclient.PokerClientFactory(settings = self.settings) + + clientFactory.display = None + + os = self.setupMockChildrenReactorOs(clientFactory) + caughtIt = False + try: + clientFactory.restart() + except exceptions.OSError, oe: + caughtIt = True + self.assertEquals(oe.__str__(), '[Errno 2] No such file or directory') + self.failUnless(caughtIt, "restart() call should have caught exceptions.OSError") + self.assertEquals(clientFactory.children.killallCount, 1) + self.assertEquals(self.reactorDisconnectAllCount, 1) + self.restoreReactorOs() +# ------------------------------------------------------ def Run(): loader = runner.TestLoader() -# loader.methodPrefix = "test15" +# loader.methodPrefix = "test_trynow_" suite = loader.suiteFactory() suite.addTest(loader.loadClass(PokerClientTestCase)) suite.addTest(loader.loadClass(PokerClientFactoryTestCase)) + suite.addTest(loader.loadClass(PokerSkinMethodUnitTest)) + suite.addTest(loader.loadClass(PokerClientLogErrorFunctionTestCase)) + suite.addTest(loader.loadClass(PokerClientFactoryUnitMethodCoverageTestCase)) return runner.TrialRunner( reporter.VerboseTextReporter, # tracebackFormat='verbose', @@ -1359,5 +1730,5 @@ if __name__ == '__main__': # Interpreted by emacs # Local Variables: -# compile-command: "( cd .. ; ./config.status tests/test-pokerclient.py ) ; ( cd ../tests ; make COVERAGE_FILES='../pokernetwork/pokeravatar.py ../pokernetwork/pokertable.py ../pokernetwork/pokerservice.py ../pokernetwork/pokerclient.py ../pokernetwork/pokerserver.py' TESTS='coverage-reset test-pokerclient.py coverage-report' check )" +# compile-command: "( cd .. ; ./config.status tests/test-pokerclient.py ) ; ( cd ../tests ; make COVERAGE_FILES='../pokernetwork/pokerclient.py' TESTS='coverage-reset test-pokerclient.py coverage-report' check )" # End:
-- -- bkuhn
_______________________________________________ Pokersource-users mailing list [email protected] https://mail.gna.org/listinfo/pokersource-users
