SF.net SVN: fclient: [127] trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py
Status: Pre-Alpha
Brought to you by:
jurner
From: <ju...@us...> - 2008-02-03 13:16:02
|
Revision: 127 http://fclient.svn.sourceforge.net/fclient/?rev=127&view=rev Author: jurner Date: 2008-02-03 05:16:02 -0800 (Sun, 03 Feb 2008) Log Message: ----------- a few more tests Modified Paths: -------------- trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py Modified: trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py =================================================================== --- trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py 2008-02-03 13:14:59 UTC (rev 126) +++ trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py 2008-02-03 13:16:02 UTC (rev 127) @@ -35,8 +35,7 @@ #*********************************************************************************** class BaseTestClient(unittest.TestCase): """Base class that does not connect to FcpClient prior to each test""" - - + def __init__(self, *args, **kwargs): unittest.TestCase.__init__(self, *args, **kwargs) @@ -65,7 +64,6 @@ def connectClient(self): """Connects to the client""" - enum = self.fcpClient.connect(duration=0.2, timeout=0.1) msg = enum.next() self.failIf(msg is not None) @@ -76,9 +74,9 @@ FCPVersion='2.0', Node='Fred', Version=str(self.fcpClient.ExpectedFcpVersion), - Revision='99999999', + Revision='999999999999', Build='999999', - ExRevision='999999', + ExRevision='9999999999', Testnet='false', CompressionCodecs='1', ConnectionIdentifier='any', @@ -88,7 +86,6 @@ self.messages.pop(0) self.events.pop(0) - def assertHasNextEvent(self, expectedEvent=None, messageName=None, @@ -142,23 +139,22 @@ return msg - def assertHasNextMessage(self, - messageName, - param1=None, - param2=None, - param3=None, - param4=None, - param5=None, - data=None - ): + messageName, + param1=None, + param2=None, + param3=None, + param4=None, + param5=None, + data=None + ): """Tests if we received a certain message from the client - @param messageName: expected mesageName or None if no message is expected - @param param1: tuple(paramName, value) of a message parameter expected - @param data: data expected along with the message or None - - @return: message if a message was received or None - """ + @param messageName: expected mesageName or None if no message is expected + @param param1: tuple(paramName, value) of a message parameter expected + @param data: data expected along with the message or None + + @return: message if a message was received or None + """ if messageName is None: self.failIf(self.messages) else: @@ -188,14 +184,12 @@ if data is not None: self.assertEqual(data, msg.data) return msg - - + def sendResponseMessage(self, messageName, data=None, **params): """Posts a message to the client""" self.socket.sendResponseMessage(messageName, data=data, **params) self.fcpClient.next() - def setUp(self): self.oldSocketModule = fcp2_0_client.socket fcp2_0_client.socket = self.socketModule @@ -211,9 +205,7 @@ # capture all messages the client sent self.messages = [] # messages the client send self.socket.setBytesReceiver(self._captureMessagesFromClient) - - - + def tearDown(self): fcp2_0_client.socket = self.oldSocketModule @@ -221,7 +213,6 @@ for eventName in self.fcpClient.Events._events_: event = getattr(self.fcpClient.events, eventName) event -= self._captureEventsFromClient - # clean up tmpfiles for fpath in self.tmpfiles: os.remove(fpath) @@ -254,7 +245,7 @@ self.failUnless(self.socket.closed) - def testConnectFailed(self): + def testConnect_Failure(self): # simulate a failed connection attempt enum = self.fcpClient.connect(duration=0.2, timeout=0.1) @@ -281,10 +272,9 @@ # did the client clean up our socket? self.failUnless(self.socket.closed) - - + - def testConnecSucceeded(self): + def testConnect_Success(self): # simulate a successful connection attempt enum = self.fcpClient.connect(duration=0.2, timeout=0.1) @@ -303,9 +293,9 @@ FCPVersion='2.0', Node='Fred', Version=str(self.fcpClient.ExpectedFcpVersion), - Revision='99999999', - Build='999999', - ExRevision='999999', + Revision='999999999999', + Build='9999999999', + ExRevision='9999999999', Testnet='false', CompressionCodecs='1', ConnectionIdentifier='any', @@ -321,32 +311,125 @@ self.assertHasNextEvent(None) - #*********************************************************************************** # #*********************************************************************************** -#TODO: testCloseOnVersionMismatch -#TODO: testCloseOnDuplicateConnectionName -#TODO: testShutdown - -class TestConnection(BaseTestConnectedClient): +class TestDisconnectReason(BaseTestConnectedClient): - def testBrokenSocket(self): + def testDuplicateClientName(self): + self.sendResponseMessage('CloseConnectionDuplicateClientName') + msg = self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.DuplicateClientName), + ) + self.failUnless('Param' in msg.params) + self.assertEqual(msg['Param'], None) + + self.assertHasNextEvent(None) + + + def testSocketDied_Receive(self): + self.socket.close() + self.fcpClient.next() + # check if ClientDisconnected events has been triggered + msg = self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.SocketDied), + #('Param', ClientSocketDiedMessage) # can not test here + ) + self.failUnless('Param' in msg.params) + self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied) + + self.assertHasNextEvent(None) + + + def testSocketDied_Send(self): + + self.socket.close() + # send a test message self.assertRaises(socket.error, self.fcpClient.sendMessage, 'test' ) # check if ClientDisconnected events has been triggered - self.assertHasNextEvent( + msg = self.assertHasNextEvent( self.fcpClient.events.ClientDisconnected, - consts.Message.ClientSocketDied, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.SocketDied), + #('Param', ClientSocketDiedMessage) # can not test here ) + self.failUnless('Param' in msg.params) + self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied) + self.assertHasNextEvent(None) - + + + def testShutdown(self): + + self.fcpClient.closeFreenet() + + msg = self.assertHasNextMessage(consts.Message.Shutdown) + self.sendResponseMessage( + 'ProtocolError', + Code='18', # Shutting down + ) + + # check events the client triggered + msg = self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.Shutdown) + #('Param', NodeHelloMessage) # can not test here + ) + self.failUnless('Param' in msg.params) + self.assertEqual(msg['Param'], None) + + self.assertHasNextEvent(None) + def testVersionMismatch(self): + + # cheat a bit and reconnect client + enum = self.fcpClient.connect(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.socket.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', + ) + msg = enum.next() + + # check events the client triggered + msg = self.assertHasNextEvent( + self.fcpClient.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.VersionMissmatch) + #('Param', NodeHelloMessage) # can not test here + ) + self.failUnless('Param' in msg.params) + self.assertEqual(msg['Param'].name, consts.Message.NodeHello) + + self.assertHasNextEvent(None) + #*********************************************************************************** # #*********************************************************************************** @@ -369,7 +452,7 @@ self.assertEqual(myRequest['FcStatus'], consts.MessageStatus.Pending) - def testGetData(self): + def testGetData_Success(self): # request a arbitrary file myIdentifier = self.fcpClient.getData( @@ -429,14 +512,53 @@ ) self.assertHasNextEvent( self.fcpClient.events.RequestCompleted, + consts.Message.ClientGet, + ('FcStatus', consts.MessageStatus.Complete), data=data ) self.assertHasNextEvent(None) - def testgetFile(self): + def testGetData_Failure(self): # request a arbitrary file + myIdentifier = self.fcpClient.getData( + 'arbitrary-uri', + ) + myRequest = self.fcpClient.getRequest(myIdentifier) + + # respond to the file request + self.sendResponseMessage( + 'PersistentGet', + Started='false', + **myRequest.params + ) + self.assertHasNextEvent( + self.fcpClient.events.RequestStarted, + consts.Message.ClientGet, + ('FcStatus', consts.MessageStatus.Started) + ) + self.assertHasNextEvent(None) + + # finalize request + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + self.assertHasNextEvent( + self.fcpClient.events.RequestFailed, + consts.Message.ClientGet, + ('FcStatus', consts.MessageStatus.Error) + ) + self.assertHasNextEvent(None) + + + def testGetFile_Success(self): + + # request a arbitrary file myIdentifier = self.fcpClient.getFile( 'arbitrary-uri', 'arbitryry.txt' @@ -476,6 +598,142 @@ ) self.assertHasNextEvent(None) + + def testGetFile_Failure(self): + + # request a arbitrary file + myIdentifier = self.fcpClient.getFile( + 'arbitrary-uri', + 'arbitryry.txt' + ) + myRequest = self.fcpClient.getRequest(myIdentifier) + self.assertHasNextMessage(consts.Message.ClientGet) + + # respond to the file request + self.sendResponseMessage( + 'PersistentGet', + Started='false', + **myRequest.params + ) + self.assertHasNextEvent( + self.fcpClient.events.RequestStarted, + consts.Message.ClientGet, + ('FcStatus', consts.MessageStatus.Started) + ) + self.assertHasNextEvent(None) + + # finalize request + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + self.assertHasNextEvent( + self.fcpClient.events.RequestFailed, + consts.Message.ClientGet, + ('FcStatus', consts.MessageStatus.Error) + ) + self.assertHasNextEvent(None) + + + + def testGetKeyInfo_Success(self): + + # request a arbitrary uri + myIdentifier = self.fcpClient.getKeyInfo( + 'arbitrary-uri', + persistence=consts.Persistence.Forever, # cheat a bit, so we can test multiple cases + ) + myRequest = self.fcpClient.getRequest(myIdentifier) + self.assertHasNextMessage(consts.Message.ClientGet) + + # respond to the file request + self.sendResponseMessage( + 'PersistentGet', + Started='false', + **myRequest.params + ) + self.assertHasNextEvent( + self.fcpClient.events.RequestStarted, + consts.Message.ClientGet, + ('FcStatus', consts.MessageStatus.Started) + ) + self.assertHasNextEvent(None) + + # finalize request + data = 'foo' + params = { + 'Identifier': myIdentifier, + 'Global': 'false', + 'DataLength': 123456, + 'Metadata.ContentType': 'any', + } + self.sendResponseMessage( + 'DataFound', + **params + ) + self.assertHasNextEvent( + self.fcpClient.events.RequestCompleted, + consts.Message.ClientGet, + ('FcStatus', consts.MessageStatus.Complete) + ) + self.assertHasNextEvent(None) + + # test specdial case where ProtocolError.TooBig is handled as success + self.sendResponseMessage( + 'GetFailed', + Code='21', # Too big + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + self.assertHasNextEvent( + self.fcpClient.events.RequestCompleted, + consts.Message.ClientGet, + ('FcStatus', consts.MessageStatus.Complete) + ) + self.assertHasNextEvent(None) + + + def testGetKeyInfo_Failure(self): + + # request a arbitrary file + myIdentifier = self.fcpClient.getKeyInfo( + 'arbitrary-uri', + ) + myRequest = self.fcpClient.getRequest(myIdentifier) + self.assertHasNextMessage(consts.Message.ClientGet) + + # respond to the file request + self.sendResponseMessage( + 'PersistentGet', + Started='false', + **myRequest.params + ) + self.assertHasNextEvent( + self.fcpClient.events.RequestStarted, + consts.Message.ClientGet, + ('FcStatus', consts.MessageStatus.Started) + ) + self.assertHasNextEvent(None) + + # finalize request + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + self.assertHasNextEvent( + self.fcpClient.events.RequestFailed, + consts.Message.ClientGet, + ('FcStatus', consts.MessageStatus.Error) + ) + self.assertHasNextEvent(None) + #*********************************************************************************** # #*********************************************************************************** @@ -585,6 +843,7 @@ self.sendResponseMessage( 'PersistentGet', Identifier=myIdentifier, + Global='false', ReturnType='disk', Verbosity='1', PersistenceType='forever', @@ -622,12 +881,12 @@ ) self.messages = [] self.events = [] - - + # throw a PersistentGet at the client with the identifier we hacked self.sendResponseMessage( 'PersistentGet', Identifier=identifier, + Global='false', ReturnType='disk', Verbosity='1', PersistenceType='forever', @@ -913,7 +1172,7 @@ tests = ( TestConnect, - TestConnection, + TestDisconnectReason, TestClientGet, TestRequests, TestRestoreRequests, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |