SF.net SVN: fclient: [352] trunk/sandbox/fcp2/test_fcp/test_client.py
Status: Pre-Alpha
Brought to you by:
jurner
From: <jU...@us...> - 2008-03-09 12:56:42
|
Revision: 352 http://fclient.svn.sourceforge.net/fclient/?rev=352&view=rev Author: jUrner Date: 2008-03-09 05:56:43 -0700 (Sun, 09 Mar 2008) Log Message: ----------- rewrite in progress Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/test_client.py Modified: trunk/sandbox/fcp2/test_fcp/test_client.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_client.py 2008-03-09 12:56:27 UTC (rev 351) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-03-09 12:56:43 UTC (rev 352) @@ -47,9 +47,8 @@ ) fcpClient.ioHandler.setIOPrototype(DummyIO) - #fcpClient.connect() + - def __init__(self, *args, **kwargs): unittest.TestCase.__init__(self, *args, **kwargs) @@ -58,53 +57,54 @@ def _captureEventsFromClient(self, event, msg): + """Captures events the client send""" # have to copy message here, to get exact state msg = copy.deepcopy(msg) self.events.append( (event, msg) ) - - def clearClient(self): - """Clears all messages send, requests registered and events triggered so far""" - # clean up the mess we eventaully left behinf - self.events = [] - if self.ioOpen(): - self.fcpClient.ioHandler.io.readBuffer = '' - self.fcpClient.ioHandler.io.writeBuffer = '' - self.fcpClient._requests = {} - - def connectClient(self): """Connects to the client""" - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=20, timeout=0.1)): - if n == 1: - self.assertHasNextMessage( - consts.Message.ClientHello - ) + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + msg = self.getNextMessage() + if msg is not None: + self.failUnless(msg.name == 'ClientHello') self.sendResponseMessage( - 'NodeHello', - FCPVersion='2.0', - Node='Fred', - Version=str(self.fcpClient.ExpectedFcpVersion), - Revision='999999999999', - Build='9999999999', - ExRevision='9999999999', - Testnet='false', - CompressionCodecs='1', - ConnectionIdentifier='any', - NodeLanguage='en', - - callNext=False, - ) - - # check events the client triggered + 'NodeHello', + FCPVersion='2.0', + Build='9999999999', + + Node='Fred', + Version=str(self.fcpClient.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + self.assertHasNextEvent( - self.fcpClient.events.ClientConnected, - consts.Message.NodeHello, - ) - + self.fcpClient.events.ClientConnected, + consts.Message.NodeHello, + ) self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + def closeClient(self): + """Closes the client""" + self.fcpClient.close() + self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.Close), + ) + + def assertHasNextEvent(self, expectedEvent=None, messageName=None, @@ -256,7 +256,7 @@ return msg def sendResponseMessage(self, messageName, data=None, callNext=True, **params): - """Posts a message to the client""" + """Sends a message to the client""" if messageName in message.MessagesAll: msgClass = message.MessagesAll[messageName] else: @@ -267,7 +267,15 @@ self.fcpClient.next() + #NOTE: iohandler is buffered + # ..so be careful not to get messages you send + # + # 1. sendResponseMessage('blah') + # 2. getNextMessage() + # 3. >>> 'blah' def getNextMessage(self): + """Returns the next message the client send""" + # cheat a bit to get iohandler to read a message from writeBuffer if self.ioOpen(): self.fcpClient.ioHandler.io.setReverseDirection(True) @@ -281,10 +289,12 @@ def ioOpen(self): + """Checks if the clients io is open""" return self.fcpClient.ioHandler.isOpen() def getIO(self): + """Returns the clients io""" return self.fcpClient.ioHandler.io @@ -300,7 +310,9 @@ event -= self._captureEventsFromClient # clean up tmpfiles for fpath in self.tmpfiles: os.remove(fpath) - self.clearClient() + if self.fcpClient.isOpen(): + self.fcpClient.close() + #*********************************************************************************** # @@ -310,72 +322,221 @@ #*********************************************************************************** # #*********************************************************************************** -class TestConnect(BaseTestClient): +class Test_close(BaseTestClient): + def test_close(self): + self.fcpClient.close() + self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.Close), + ) + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_isOpen(BaseTestClient): - def XXXtestClose(self): - self.failIf(self.socket.closed) + def test_isOpen(self): + self.failIf(self.fcpClient.isOpen()) self.connectClient() + self.failUnless(self.fcpClient.isOpen()) + self.closeClient() + self.failIf(self.fcpClient.isOpen()) + +#*********************************************************************************** +#TODO: not idea how to test this +#*********************************************************************************** +class Test_connect(BaseTestClient): + pass + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_iterConnect(BaseTestClient): + + def test_iterConnect_success(self): + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + msg = self.getNextMessage() + if msg is not None: + self.failUnless(msg.name == 'ClientHello') + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Node='Fred', + Version=str(self.fcpClient.ExpectedFcpVersion), + Revision='999999999999', + Build='9999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.fcpClient.events.ClientConnected, + consts.Message.NodeHello, + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) self.fcpClient.close() - self.failUnless(self.socket.closed) - def XXXtestConnect(self): - nodeHello = self.fcpClient.connect(duration=10, timeout=0.1) + def test_iterConnect_ioRefusesConnection(self): + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + self.getIO().setAllowConnect(False) + self.failUnless(nodeHello is None) - #return + self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.IOConnectFailed), + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) - self.sendResponseMessage( - 'NodeHello', - FCPVersion='2.0', - Node='Fred', - Version=str(self.fcpClient.ExpectedFcpVersion), - Revision='999999999999', - Build='9999999999', - ExRevision='9999999999', - Testnet='false', - CompressionCodecs='1', - ConnectionIdentifier='any', - NodeLanguage='en', + + def test_iterConnect_nodeHelloNeverArrives(self): + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + pass + + self.failUnless(nodeHello is None) + self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.NoNodeHello), ) - nodeHello = self.fcpClient.connect(duration=10, timeout=0.1) - print nodeHello - #self.failIf(nodeHello is None) - - - def test_0_IterIterConnect_RFailure(self): + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)): - if n == 1: - self.assertHasNextMessage( - consts.Message.ClientHello + + def test_iterConnect_socketDies(self): + enum = self.fcpClient.iterConnect(duration=0.2, timeout=0.1) + errorRaised = False + while True: + try: + enum.next() + except StopIteration: + break + except iohandler.IOBroken, d: + errorRaised = True + self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.ConnectionDied), + #('Param', None), ) + break + self.getIO().setBroken(True) + + self.failUnless(errorRaised) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) - # check events the client triggered + + def test_iterIterConnect_unknownNodehello(self): + + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'i-am-invalid', + callNext=False, + ) + + self.failUnless(nodeHello is None) self.assertHasNextEvent( self.fcpClient.events.ClientDisconnected, consts.Message.ClientDisconnected, - ('DisconnectReason', consts.DisconnectReason.ConnectingFailed), + ('DisconnectReason', consts.DisconnectReason.UnknownNodeHello), ) - self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.failIf(self.ioOpen()) + + def test_iterIterConnect_connect(self): + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Build='9999999999', + + Node='Fred', + Version=str(self.fcpClient.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) - def test_1_IterConnect_Success(self): - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)): - if n == 1: - self.assertHasNextMessage( - consts.Message.ClientHello - ) - self.sendResponseMessage( + self.assertHasNextEvent( + self.fcpClient.events.ClientConnected, + consts.Message.NodeHello, + ) + self.assertHasNextEvent(None) + #self.assertHasNextMessage(None) # due to our message hacking, NodeHello is still in io + self.failUnless(self.ioOpen()) + self.closeClient() + + + def test_iterIterConnect_reconnect(self): + self.connectClient() + + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( 'NodeHello', FCPVersion='2.0', + Build='9999999999', + Node='Fred', Version=str(self.fcpClient.ExpectedFcpVersion), Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.Reconnect) + ) + self.assertHasNextEvent( + self.fcpClient.events.ClientConnected, + consts.Message.NodeHello, + ) + self.assertHasNextEvent(None) + #self.assertHasNextMessage(None) # due to our message hacking, NodeHello is still in io + self.failUnless(self.ioOpen()) + self.closeClient() + + + def test_iterIterConnect_VersionMissmatch_FCPVersion(self): + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'NodeHello', + FCPVersion='0.0', Build='9999999999', + + Node='Fred', + Version=str(self.fcpClient.ExpectedFcpVersion), + Revision='999999999999', ExRevision='9999999999', Testnet='false', CompressionCodecs='1', @@ -384,16 +545,99 @@ callNext=False, ) + + self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.VersionMissmatch) + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + self.closeClient() + + + def test_iterIterConnect_VersionMissmatch_Build(self): + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Build='0', + + Node='Fred', + Version=str(self.fcpClient.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.VersionMissmatch) + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + self.closeClient() + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_CloseConnectionDuplicateClientName(BaseTestClient): + + def test_CloseConnectionDuplicateClientName(self): + self.connectClient() + self.sendResponseMessage( + 'CloseConnectionDuplicateClientName', + ) - # check events the client triggered self.assertHasNextEvent( - self.fcpClient.events.ClientConnected, - consts.Message.NodeHello, + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.DuplicateClientName) + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + self.closeClient() + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_closeNode(BaseTestClient): + + def test_closeNode(self): + self.connectClient() + self.fcpClient.closeNode() + self.assertHasNextMessage('Shutdown') + self.sendResponseMessage( + 'ProtocolError', + Code='18' ) + self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.NodeClosing) + ) self.assertHasNextEvent(None) self.assertHasNextMessage(None) - + self.failIf(self.ioOpen()) + self.closeClient() + + +################################################### +################################################### +################################################### + + #*********************************************************************************** # #*********************************************************************************** @@ -1624,14 +1868,15 @@ #TODO: testRestoreClientPut and friends class TestRestoreRequests(BaseTestClient): - def test_4000_RestorePersistentGet_InvalidIdentifier(self): + def test_4000_RestorePersistentGet_InvalidClientToken(self): # throw an invalid PersistentRequest at the client - myIdentifier = 'true-invalid-request-identifier' + myIdentifier = '123456789' self.sendResponseMessage( 'PersistentGet', Identifier=myIdentifier, Global='false', + ClientToken='i-am-invalid', ReturnType='disk', Verbosity='1', PersistenceType='forever', @@ -2357,18 +2602,23 @@ def suite(): testCases = ( - TestConnect, - TestDisconnectReason, - TestClientGet, - TestClientPut, - TestRequests, - TestRestoreRequests, - TestResendRequests, - TestDDA, - TestCollisions, - TestPlugins, - TestGenerateKeypair, - TestSubscribeUSK, + Test_close, + Test_isOpen, + Test_connect, + Test_iterConnect, + Test_CloseConnectionDuplicateClientName, + Test_closeNode, + #TestDisconnectReason, + #TestClientGet, + #TestClientPut, + #TestRequests, + #TestRestoreRequests, + #TestResendRequests, + #TestDDA, + #TestCollisions, + #TestPlugins, + #TestGenerateKeypair, + #TestSubscribeUSK, ) suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |