SF.net SVN: fclient: [314] trunk/sandbox/fcp2/test_fcp/test_client.py
Status: Pre-Alpha
Brought to you by:
jurner
From: <ju...@us...> - 2008-03-06 12:00:07
|
Revision: 314 http://fclient.svn.sourceforge.net/fclient/?rev=314&view=rev Author: jurner Date: 2008-03-06 04:00:08 -0800 (Thu, 06 Mar 2008) Log Message: ----------- reworked test to use new iohandler 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-06 11:59:34 UTC (rev 313) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-03-06 12:00:08 UTC (rev 314) @@ -21,113 +21,32 @@ from fcp2.client import Client from fcp2 import consts +from fcp2 import iohandler del hack #<-- rel import hack -from dummy_socket import DummySocket +from dummy_socket import TestIO #*********************************************************************************** # #*********************************************************************************** DIR = os.path.dirname(os.path.abspath(__file__)) -TestAgainstNode = 0 # don't know how to test against node. Do not touch this! +##TestAgainstNode = 0 # don't know how to test against node. Do not touch this! -#*********************************************************************************** -# -#*********************************************************************************** -class MyFcpClient(Client): - """Customized client recording all messages it sends - """ - def __init__(self, *args, **kwargs): - Client.__init__(self, *args, **kwargs) - self.test_messagesSend = [] - - def sendMessageEx(self, msg): - Client.sendMessageEx(self, msg) - # deepcopy here, we need exact state - msg = copy.deepcopy(msg) - self.test_messagesSend.append(msg) - def clearMessagesSend(self): - self.test_messagesSend = [] - #*********************************************************************************** # -#*********************************************************************************** -class DummySocketModule(object): - """Dummy socket module we inject into the client module for testing - - """ - AF_INET = socket.AF_INET - SOCK_STREAM = socket.SOCK_STREAM - error = socket.error - socket = DummySocket() - - def __init__(self): - self.lastSocket = None - - def __getattribute__(self, name): - obj = object.__getattribute__(self, name) - if name == 'socket': - self.lastSocket = obj - return obj - #*********************************************************************************** -# -#*********************************************************************************** -class MySocketFactory(object): - """Real and alive socket. Can be used to test against the running node. Not used currently - - Usage:: - - DummySocketModule.socket = MySocketFactory() - - """ - def __init__(self, *args, **kwargs): - self.socket = None - self.closed = False - - def __call__(self, *args, **kwargs): - self.socket = socket.socket(*args, **kwargs) - return self - - def sendResponseMessage(self, *args, **kwargs): - pass - - def connect(self, *args, **kwargs): - return self.socket.connect(*args, **kwargs) - - def sendall(self, bytes): - return self.socket.sendall(bytes) - - def settimeout(self, n): - return self.socket.settimeout(n) - - def recv(self, n): - return self.socket.recv(n) - - def close(self): - self.closed = True - result = self.socket.close() - self.socket = None - return result - -#*********************************************************************************** -# -#*********************************************************************************** class BaseTestClient(unittest.TestCase): """Base class for all tests""" - if TestAgainstNode: - DummySocketModule.socket = MySocketFactory() - fcpClient = MyFcpClient( + fcpClient = Client( #debugVerbosity=Client.consts.DebugVerbosity.Debug debugVerbosity=Client.consts.DebugVerbosity.Quiet ) - # inject our customized socket module - socketModule = DummySocketModule() - client.socket = socketModule + fcpClient.ioHandler.setIOPrototype(TestIO) + #fcpClient.connect() def __init__(self, *args, **kwargs): @@ -147,14 +66,17 @@ """Clears all messages send, requests registered and events triggered so far""" # clean up the mess we eventaully left behinf self.events = [] - self.fcpClient.clearMessagesSend() + 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 == 0: + if n == 1: self.assertHasNextMessage( consts.Message.ClientHello ) @@ -261,11 +183,11 @@ @return: message if a message was received or None """ + msg = self.getNextMessage() if messageName is None: - self.failIf(self.fcpClient.test_messagesSend) + self.failUnless(msg is None) else: - self.failUnless(self.fcpClient.test_messagesSend) - msg = self.fcpClient.test_messagesSend.pop(0) + self.failIf(msg is None) self.assertEqual(msg.name, messageName) if param1 is not None: param1, value1 = param1 @@ -334,11 +256,33 @@ def sendResponseMessage(self, messageName, data=None, callNext=True, **params): """Posts a message to the client""" - self.socketModule.lastSocket.sendResponseMessage(messageName, data=data, **params) - if not TestAgainstNode: - if callNext: - self.fcpClient.next() + msg = Client.message.Message(messageName, data=data, **params) + self.fcpClient.ioHandler.io.readBuffer += msg.toString() + if callNext: + self.fcpClient.next() + + def getNextMessage(self): + # cheat a bit to get iohandler to read a message from writeBuffer + if self.ioOpen(): + self.fcpClient.ioHandler.io.setReverseDirection(True) + try: + msg = self.fcpClient.ioHandler.readMessage() + except iohandler.IOTimeout: + return None + finally: + self.fcpClient.ioHandler.io.setReverseDirection(False) + return msg + + + def ioOpen(self): + return self.fcpClient.ioHandler.isOpen() + + + def getIO(self): + return self.fcpClient.ioHandler.io + + def setUp(self): # conect all events self.events = [] # events received from the client @@ -371,17 +315,12 @@ self.failUnless(self.socket.closed) - def XXXtestConnect(self): nodeHello = self.fcpClient.connect(duration=10, timeout=0.1) - self.failIf(nodeHello is None) - return + self.failUnless(nodeHello is None) + #return - - nodeHello = self.fcpClient.connect(duration=0, timeout=0) - self.failIf(nodeHello is not None) - - self.socketModule.lastSocket.sendResponseMessage( + self.sendResponseMessage( 'NodeHello', FCPVersion='2.0', Node='Fred', @@ -395,37 +334,33 @@ NodeLanguage='en', ) nodeHello = self.fcpClient.connect(duration=10, timeout=0.1) - self.failIf(nodeHello is None) + print nodeHello + #self.failIf(nodeHello is None) def test_0_IterIterConnect_RFailure(self): - # we cannot test against node here - if not TestAgainstNode: - - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)): - if n == 0: - self.assertHasNextMessage( - consts.Message.ClientHello - ) - - # check events the client triggered - self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, - consts.Message.ClientDisconnected, - ('DisconnectReason', consts.DisconnectReason.ConnectingFailed), + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)): + if n == 1: + self.assertHasNextMessage( + consts.Message.ClientHello ) - - self.assertHasNextEvent(None) - self.assertHasNextMessage(None) - self.failUnless(self.socketModule.lastSocket.closed) - - #self.fcpClient.connect(duration=20, timeout=0.1) - + # check events the client triggered + self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.ConnectingFailed), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + def test_1_IterConnect_Success(self): - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=20, timeout=0.1)): - if n == 0: + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)): + if n == 1: self.assertHasNextMessage( consts.Message.ClientHello ) @@ -460,7 +395,7 @@ class TestDisconnectReason(BaseTestClient): def test_1000_DuplicateClientName(self): - + self.sendResponseMessage('CloseConnectionDuplicateClientName') msg = self.assertHasNextEvent( self.fcpClient.events.ClientDisconnected, @@ -470,8 +405,9 @@ self.failUnless('Param' in msg.params) self.assertEqual(msg['Param'], None) - self.failUnless(self.socketModule.lastSocket.closed) + self.failIf(self.ioOpen()) self.assertHasNextEvent(None) + #print self.fcpClient.test_messagesSend[0].name self.assertHasNextMessage(None) self.connectClient() @@ -479,9 +415,9 @@ def test_1001_SocketDied_Receive(self): - self.socketModule.lastSocket.close() - self.fcpClient.next() - + self.getIO().setBroken(True) + self.assertRaises(iohandler.IOBroken, self.fcpClient.next) + # check if ClientDisconnected events has been triggered msg = self.assertHasNextEvent( self.fcpClient.events.ClientDisconnected, @@ -490,21 +426,21 @@ #('Param', ClientSocketDiedMessage) # can not test here ) self.failUnless('Param' in msg.params) - self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied) + # Param is now details of IOBroken exception, no idea how to test + #self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied) - self.failUnless(self.socketModule.lastSocket.closed) + self.failIf(self.ioOpen()) self.assertHasNextEvent(None) self.assertHasNextMessage(None) - self.connectClient() def test_1002_SocketDied_Send(self): - self.socketModule.lastSocket.close() - + self.getIO().setBroken(True) + # send a test message - self.assertRaises(socket.error, self.fcpClient.sendMessage, 'test' ) + self.assertRaises(iohandler.IOBroken, self.fcpClient.sendMessage, 'test' ) # check if ClientDisconnected events has been triggered msg = self.assertHasNextEvent( @@ -514,9 +450,10 @@ #('Param', ClientSocketDiedMessage) # can not test here ) self.failUnless('Param' in msg.params) - self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied) + # Param is now details of IOBroken exception, no idea how to test + #self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied) - self.failUnless(self.socketModule.lastSocket.closed) + self.failIf(self.ioOpen()) self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.connectClient() @@ -542,7 +479,7 @@ self.failUnless('Param' in msg.params) self.assertEqual(msg['Param'], None) - self.failUnless(self.socketModule.lastSocket.closed) + self.failIf(self.ioOpen()) self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.connectClient() @@ -551,33 +488,27 @@ def test_1004_VersionMismatch(self): - # cheat a bit and reconnect client - enum = self.fcpClient.iterConnect(duration=0.2, timeout=0.1) - msg = enum.next() - self.failIf(msg is not None) - - # check messages the client send message - self.assertHasNextMessage(consts.Message.ClientHello) - - #NOTE: have to send directly via socket here (our sendResponseMessage - # calls client.next() autkmatically) - self.socketModule.lastSocket.sendResponseMessage( - 'NodeHello', - FCPVersion='0.0', - Node='Fred', - Version=str(self.fcpClient.ExpectedFcpVersion), - Revision='0', - Build='0', - ExRevision='0', - Testnet='false', - CompressionCodecs='1', - ConnectionIdentifier='any', - NodeLanguage='en', - - callNext=False - ) - msg = enum.next() + for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)): + if n == 1: + self.assertHasNextMessage( + consts.Message.ClientHello + ) + self.sendResponseMessage( + 'NodeHello', + FCPVersion='0.0', + Node='Fred', + Version=str(self.fcpClient.ExpectedFcpVersion), + Revision='0', + Build='0', + ExRevision='0', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + callNext=False + ) + # check events the client triggered msg = self.assertHasNextEvent( self.fcpClient.events.ClientDisconnected, @@ -588,7 +519,7 @@ self.failUnless('Param' in msg.params) self.assertEqual(msg['Param'].name, consts.Message.NodeHello) - self.failUnless(self.socketModule.lastSocket.closed) + self.failIf(self.ioOpen()) self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.connectClient() @@ -2433,7 +2364,6 @@ if __name__ == "__main__": test() -test() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |