SF.net SVN: fclient: [118] trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py
Status: Pre-Alpha
Brought to you by:
jurner
|
From: <ju...@us...> - 2008-02-02 18:27:37
|
Revision: 118
http://fclient.svn.sourceforge.net/fclient/?rev=118&view=rev
Author: jurner
Date: 2008-02-02 10:27:42 -0800 (Sat, 02 Feb 2008)
Log Message:
-----------
refactore unittests
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-02 18:27:21 UTC (rev 117)
+++ trunk/sandbox/fcp/test_fcp/test_fcp2_0_client.py 2008-02-02 18:27:42 UTC (rev 118)
@@ -18,6 +18,7 @@
import fcp2_0_client
from fcp2_0_client import FcpClient
+import fcp2_0_consts as consts
sys.path.pop(0)
@@ -32,7 +33,8 @@
#***********************************************************************************
#
#***********************************************************************************
-class TestFcpClient(unittest.TestCase):
+class BaseTestClient(unittest.TestCase):
+ """Base class that does not connect to FcpClient prior to each test"""
def __init__(self, *args, **kwargs):
@@ -52,8 +54,8 @@
self.events = [] # events received from the client
self.messages = [] # messages the client sent
self.tmpfiles = [] # temp files used for testing (will be removed on tearDown)
-
- def _captureBytesFromClient(self, bytes):
+
+ def _captureMessagesFromClient(self, bytes):
s = DummySocket()
s.setResponse(bytes)
self.messages.append(self.fcpClient.Message.fromSocket(s))
@@ -62,17 +64,21 @@
self.events.append( (event, msg) )
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)
- self.socket.setResponseMessage(
+ #NOTE: have to send directly via socket here (our sendResponseMessage
+ # calls client.next() autkmatically)
+ self.socket.sendResponseMessage(
'NodeHello',
FCPVersion='2.0',
Node='Fred',
- Version='???',
- Revision='???',
- Build='???',
- ExRevision='???',
+ Version=str(self.fcpClient.ExpectedFcpVersion),
+ Revision='99999999',
+ Build='999999',
+ ExRevision='999999',
Testnet='false',
CompressionCodecs='1',
ConnectionIdentifier='any',
@@ -81,32 +87,115 @@
msg = enum.next()
self.messages.pop(0)
self.events.pop(0)
+
+
+ def assertHasNextEvent(self,
+ expectedEvent=None,
+ messageName=None,
+ param1=None,
+ param2=None,
+ param3=None,
+ param4=None,
+ param5=None,
+ data=None
+ ):
+ """Tests if we received a certain event from the client
+ @param expectedEvent: the event expected or None if no event is expected
+ @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 expectedEvent is None:
+ self.failIf(self.events)
+ else:
+ self.failUnless(self.events)
+ event, msg = self.events.pop(0)
+ self.assertEqual(event, expectedEvent)
+
+ if messageName is not None:
+ self.assertEqual(msg.name, messageName)
+ if param1 is not None:
+ param1, value1 = param1
+ self.failUnless(param1 in msg.params)
+ self.assertEqual(value1, msg[param1])
+ if param2 is not None:
+ param2, value2 = param2
+ self.failUnless(param2 in msg.params)
+ self.assertEqual(value2, msg[param2])
+ if param3 is not None:
+ param3, value3 = param3
+ self.failUnless(param3 in msg.params)
+ self.assertEqual(value3, msg[param3])
+ if param4 is not None:
+ param4, value4 = param4
+ self.failUnless(param4 in msg.params)
+ self.assertEqual(value4, msg[param4])
+ if param5 is not None:
+ param5, value5 = param5
+ self.failUnless(param5 in msg.params)
+ self.assertEqual(value5, msg[param5])
+
+ if data is not None:
+ self.assertEqual(data, msg.data)
+
+ return msg
+
+ def assertHasNextMessage(self,
+ 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
+ """
+ if messageName is None:
+ self.failIf(self.messages)
+ else:
+ msg = self.messages.pop(0)
+ self.assertEqual(msg.name, messageName)
+ if param1 is not None:
+ param1, value1 = param1
+ self.failUnless(param1 in msg.params)
+ self.assertEqual(value1, msg[param1])
+ if param2 is not None:
+ param2, value2 = param2
+ self.failUnless(param2 in msg.params)
+ self.assertEqual(value2, msg[param2])
+ if param3 is not None:
+ param3, value3 = param3
+ self.failUnless(param3 in msg.params)
+ self.assertEqual(value3, msg[param3])
+ if param4 is not None:
+ param4, value4 = param4
+ self.failUnless(param4 in msg.params)
+ self.assertEqual(value4, msg[param4])
+ if param5 is not None:
+ param5, value5 = param5
+ self.failUnless(param5 in msg.params)
+ self.assertEqual(value5, msg[param5])
+
+ if data is not None:
+ self.assertEqual(data, msg.data)
+ return msg
+
- def nextMessage(self):
- """Returns the next message the client send or None"""
- if self.messages:
- return self.messages.pop(0)
- return None
+ def sendResponseMessage(self, messageName, data=None, **params):
+ """Posts a message to the client"""
+ self.socket.sendResponseMessage(messageName, data=data, **params)
+ self.fcpClient.next()
- def nextEvent(self):
- """Returns the next tuple(event, message) the client triggered or (None, None)"""
- if self.events:
- return self.events.pop(0)
- return (None, None)
-
- def hasNextEvent(self):
- return bool(self.events)
-
- def hasNextMessage(self):
- return bool(self.messages)
-
-
-
- #####################################################
- ##
- #####################################################
+
def setUp(self):
self.oldSocketModule = fcp2_0_client.socket
fcp2_0_client.socket = self.socketModule
@@ -121,7 +210,7 @@
# capture all messages the client sent
self.messages = [] # messages the client send
- self.socket.setBytesReceiver(self._captureBytesFromClient)
+ self.socket.setBytesReceiver(self._captureMessagesFromClient)
@@ -135,22 +224,37 @@
# clean up tmpfiles
for fpath in self.tmpfiles: os.remove(fpath)
+
+#***********************************************************************************
+#
+#***********************************************************************************
+class BaseTestConnectedClient(BaseTestClient):
+ """Base class that automatically connects to FcpClient prior to each test"""
+ def setUp(self):
+ BaseTestClient.setUp(self)
+ self.connectClient()
- #######################################################
- ##
- ## connect() test cases
- ##
- #######################################################
+
+#***********************************************************************************
+#
+#***********************************************************************************
+#TODO: class Test.... set/getDebugVerbosity / connectionName and friends... (BaseTestConnectedClient):
+
+#***********************************************************************************
+#
+#***********************************************************************************
+class TestConnect(BaseTestClient):
+
+
def testClose(self):
-
self.failIf(self.socket.closed)
self.connectClient()
self.fcpClient.close()
self.failUnless(self.socket.closed)
- def testConnectingFailed(self):
+ def testConnectFailed(self):
# simulate a failed connection attempt
enum = self.fcpClient.connect(duration=0.2, timeout=0.1)
@@ -162,160 +266,271 @@
else:
raise RuntimeError('Fell trough')
+
# check messages the client send
- self.failUnless(len(self.messages) == 1)
- msg = self.messages.pop(0)
- self.failUnless(msg.name == self.fcpClient.Message.MessageClientHello)
-
+ self.assertHasNextMessage(consts.Message.ClientHello)
+
# check events the client triggered
- self.failUnless(len(self.events) == 1)
- event, msg = self.events.pop(0)
- self.failUnless(event.name == self.fcpClient.events.ClientDisconnected.name)
- self.failUnless(msg.get('DisconnectReason', None) == FcpClient.DisconnectReason.ConnectingFailed)
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.ConnectingFailed),
+ )
+ self.assertHasNextEvent(None)
+
# did the client clean up our socket?
self.failUnless(self.socket.closed)
- def testConnectingSucceeded(self):
+ def testConnecSucceeded(self):
# simulate a successful connection attempt
enum = self.fcpClient.connect(duration=0.2, timeout=0.1)
msg = enum.next()
self.failIf(msg is not None)
- self.socket.setResponseMessage(
+ # 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='2.0',
Node='Fred',
- Version='???',
- Revision='???',
- Build='???',
- ExRevision='???',
+ Version=str(self.fcpClient.ExpectedFcpVersion),
+ Revision='99999999',
+ Build='999999',
+ ExRevision='999999',
Testnet='false',
CompressionCodecs='1',
ConnectionIdentifier='any',
NodeLanguage='en',
)
msg = enum.next()
+
+ # check events the client triggered
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientConnected,
+ consts.Message.NodeHello,
+ )
- # check messages the client received our response
- self.failIf(msg is None)
- self.failUnless(msg.name == self.fcpClient.Message.MessageNodeHello)
+ self.assertHasNextEvent(None)
+
+
+#***********************************************************************************
+#
+#***********************************************************************************
+#TODO: testCloseOnVersionMismatch
+#TODO: testCloseOnDuplicateConnectionName
+#TODO: testShutdown
+
+class TestConnection(BaseTestConnectedClient):
+
+ def testBrokenSocket(self):
- # check events the client triggered
- self.failUnless(len(self.events) == 1)
- event, msg = self.events.pop(0)
- self.failUnless(event.name == self.fcpClient.events.ClientConnected.name)
- self.failUnless(msg.name == self.fcpClient.Message.MessageNodeHello)
+ self.socket.close()
+ # send a test message
+ self.assertRaises(socket.error, self.fcpClient.sendMessage, 'test' )
+
+ # check if ClientDisconnected events has been triggered
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientSocketDied,
+ )
+ self.assertHasNextEvent(None)
+
- ####################################################
- ##
- ## PersistentGet test cases
- ##
- ####################################################
- def testEventRequestStarted(self):
-
- self.connectClient()
+#***********************************************************************************
+#
+#***********************************************************************************
+class TestClientGet(BaseTestConnectedClient):
+
+ def testClientGetRegistered(self):
# request a arbitrary file
- myIdentifier = self.fcpClient.getFile(
+ myIdentifier = self.fcpClient.getData(
'arbitrary-uri',
- 'arbitryry.txt'
)
-
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageClientGet)
- self.failIf(self.hasNextEvent() ) # no events should be triggered up to now
+ self.assertHasNextMessage(
+ consts.Message.ClientGet,
+ )
+ self.assertHasNextEvent(None)
+
self.failUnless(self.fcpClient.getRequests() )
myRequest = self.fcpClient.getRequest(myIdentifier)
self.assertEqual(myIdentifier, myRequest['Identifier'])
- self.assertEqual(myRequest['FcStatus'], self.fcpClient.Message.StatusPending)
+ self.assertEqual(myRequest['FcStatus'], consts.MessageStatus.Pending)
+
+ def testGetData(self):
+
+ # request a arbitrary file
+ myIdentifier = self.fcpClient.getData(
+ 'arbitrary-uri',
+ )
+ myRequest = self.fcpClient.getRequest(myIdentifier)
+
# respond to the file request
- self.socket.setResponseMessage(
+ self.sendResponseMessage(
'PersistentGet',
Started='false',
**myRequest.params
)
- self.fcpClient.next()
-
- event, msg = self.nextEvent()
- self.failIf(event is None)
- self.assertEqual(event, self.fcpClient.events.RequestStarted)
- self.assertEqual(msg, myRequest) # ??? looks like an implemenation detail
- self.assertEqual(myRequest['FcStatus'], self.fcpClient.Message.StatusStarted)
+ self.assertHasNextEvent(
+ self.fcpClient.events.RequestStarted,
+ consts.Message.ClientGet,
+ ('FcStatus', consts.MessageStatus.Started)
+ )
+ self.assertHasNextEvent(None)
+
+ # simulate a progress
+ self.sendResponseMessage(
+ 'SimpleProgress',
+ Identifier=myIdentifier,
+ Total=10,
+ Required=8,
+ Failed=0,
+ FatallyFailed=0,
+ FinalizedTotal='true',
+ Succeeded=1,
+ )
+ self.assertHasNextEvent(
+ self.fcpClient.events.RequestProgress,
+ )
- self.failIf(self.hasNextEvent() )
-
-
+ # finalize request
+ data = 'foo'
+ params = {
+ 'Identifier': myIdentifier,
+ 'Global': 'false',
+ 'DataLength': len(data),
+ 'Metadata.ContentType': 'any',
+ }
+ self.sendResponseMessage(
+ 'DataFound',
+ **params
+ )
+ # we don't expect an event here....
+ self.assertHasNextEvent(None)
+
+ self.sendResponseMessage(
+ 'AllData',
+ data=data,
+ Identifier=myIdentifier,
+ Global='false',
+ DataLength=len(data),
+ )
+ self.assertHasNextEvent(
+ self.fcpClient.events.RequestCompleted,
+ data=data
+ )
+ self.assertHasNextEvent(None)
+
- def testEventRequestModified(self):
-
- self.connectClient()
-
+ def testgetFile(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
+ 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)
+
+#***********************************************************************************
+#
+#***********************************************************************************
+#TODO: class TestClientPut(BaseTestConnectedClient):
+
+#***********************************************************************************
+#
+#***********************************************************************************
+#TODO: testGetRequest()
+#TODO: testGetRequest()
+#TODO: testResendRequest()
+
+class TestRequests(BaseTestConnectedClient):
+
+ def testModifyRequest(self):
+
+ # request a arbitrary file
+ myIdentifier = self.fcpClient.getFile(
+ 'arbitrary-uri',
'arbitryry.txt',
persistentUserData='foo',
- priorityClass=self.fcpClient.Priority.Medium,
+ priorityClass=consts.Priority.Medium,
)
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageClientGet)
+ myRequest = self.fcpClient.getRequest(myIdentifier)
+ self.assertHasNextMessage(consts.Message.ClientGet)
# respond to the file request
- self.socket.setResponseMessage(
+ self.sendResponseMessage(
'PersistentGet',
Started='false',
- **msg.params
+ **myRequest.params
)
- self.fcpClient.next()
- event, msg = self.nextEvent()
- self.failIf(event is None)
- self.assertEqual(event, self.fcpClient.events.RequestStarted)
-
-
- myRequest = self.fcpClient.getRequest(myIdentifier)
-
-
+ self.assertHasNextEvent(self.fcpClient.events.RequestStarted )
+
# test modify persistent user data
- self.fcpClient.modifyRequest(myIdentifier, persistentUserData='bar', priorityClass=self.fcpClient.Priority.High)
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageModifyPersistentRequest)
+ self.fcpClient.modifyRequest(myIdentifier, persistentUserData='bar', priorityClass=consts.Priority.High)
+ msg = self.assertHasNextMessage(consts.Message.ModifyPersistentRequest)
# respond to the file request
- self.socket.setResponseMessage(
+ self.sendResponseMessage(
'PersistentRequestModified',
**msg.params
)
- self.fcpClient.next()
+ self.assertHasNextEvent(self.fcpClient.events.RequestModified)
- event, eventMsg = self.nextEvent()
- self.failIf(event is None)
- self.assertEqual(event, self.fcpClient.events.RequestModified)
- self.failUnless(self.fcpClient.Message.ModifiedRequestPersistentUserData in eventMsg['FcModified'])
- self.failUnless(self.fcpClient.Message.ModifiedRequestPriorityClass in eventMsg['FcModified'])
+ self.failUnless(consts.RequestModified.PersistentUserData in myRequest['FcModified'])
+ self.failUnless(consts.RequestModified.PriorityClass in myRequest['FcModified'])
self.assertEqual('bar', myRequest['FcPersistentUserData'])
- self.assertEqual(self.fcpClient.Priority.High, myRequest['PriorityClass'])
- self.failIf(self.events)
+ self.assertEqual(consts.Priority.High, myRequest['PriorityClass'])
-
-
-
-
+ self.assertHasNextEvent(None)
def testRemoveRequest(self):
-
- self.connectClient()
-
+
# request a file
myIdentifier = self.fcpClient.getFile(
'arbitrary-uri',
@@ -324,75 +539,50 @@
myRequest = self.fcpClient.getRequest(myIdentifier)
# respond to the file request
- self.socket.setResponseMessage(
+ self.sendResponseMessage(
'PersistentGet',
Started='false',
**myRequest.params
)
- self.fcpClient.next()
-
-
+
# ignore events and messages so far
self.events = []
self.messages = []
-
# now cancel request
self.fcpClient.removeRequest(myIdentifier)
# status of our request should be set to removed emidiately, but it should
# not be removed from the client
- self.assertEqual(myRequest['FcStatus'], self.fcpClient.Message.StatusRemoved)
+ self.assertEqual(myRequest['FcStatus'], consts.MessageStatus.Removed)
self.failUnless(myIdentifier in self.fcpClient.getRequests())
# client schould send a RemovePersistentRequest
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageRemovePersistentRequest)
-
+ self.assertHasNextMessage(consts.Message.RemovePersistentRequest)
+
# respond with a PersistentRequestRemoved
- self.socket.setResponseMessage(
+ self.sendResponseMessage(
'PersistentRequestRemoved',
- Identifier=msg['Identifier']
+ Identifier=myIdentifier,
)
- self.fcpClient.next()
-
+
# now the request should have been removed
self.failIf(self.fcpClient.getRequests())
- self.failIf(self.hasNextEvent() )
+ # client never sends an event here
+ self.assertHasNextEvent(None)
+
+#***********************************************************************************
+#
+#***********************************************************************************
+#TODO: testRestoreClientPut and friends
+class TestRestoreRequests(BaseTestConnectedClient):
-
- ####################################################
- ##
- ## modifyRequest test cases
- ##
- ####################################################
-
-
- ####################################################
- ##
- ## removeRequest test cases
- ##
- ####################################################
-
+ def testRestorePersistentGet_InvalidIdentifier(self):
-
-
- ####################################################
- ##
- ## restore persistent request test cases
- ##
- ## should be run after removeRequest test cases
- ###
- ####################################################
- def testRestorePersistentRequest_InvalidIdentifier(self):
-
- self.connectClient()
-
# throw an invalid PersistentRequest at the client
myIdentifier = 'true-invalid-request-identifier'
- self.socket.setResponseMessage(
+ self.sendResponseMessage(
'PersistentGet',
Identifier=myIdentifier,
ReturnType='disk',
@@ -401,27 +591,23 @@
Started='false',
Global='false',
)
- self.fcpClient.next()
-
+
# the client should now to cancel the request
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageRemovePersistentRequest)
- self.failUnless(msg['Identifier'] == myIdentifier)
+ self.assertHasNextMessage(
+ consts.Message.RemovePersistentRequest,
+ ('Identifier', myIdentifier)
+ )
requests = self.fcpClient.getRequests()
self.failIf(requests)
# the client should not trigger any events
- self.failIf(self.hasNextEvent() )
-
-
- def testRestorePersistentRequest_ValidIdentifier(self):
-
- self.connectClient()
-
+ self.assertHasNextEvent(None)
+
+
+ def testRestorePersistentGet_ValidIdentifier(self):
+
# we need a valid identifier to restore a request, so hack a bit
-
myIdentifier = self.fcpClient.getFile(
'arbitrary-uri',
'arbitryry.txt'
@@ -430,17 +616,16 @@
identifier = myRequest['Identifier']
self.fcpClient.removeRequest(myIdentifier)
- self.socket.setResponseMessage(
+ self.sendResponseMessage(
'PersistentRequestRemoved',
Identifier=identifier,
)
- self.fcpClient.next()
self.messages = []
self.events = []
# throw a PersistentGet at the client with the identifier we hacked
- self.socket.setResponseMessage(
+ self.sendResponseMessage(
'PersistentGet',
Identifier=identifier,
ReturnType='disk',
@@ -449,47 +634,127 @@
Started='false',
ClientToken=myRequest['ClientToken']
)
- self.fcpClient.next()
-
+
# check if the client restored the request
- event, msg = self.nextEvent()
- self.failIf(event is None)
- self.assertEqual(event, self.fcpClient.events.RequestRestored)
+ self.assertHasNextEvent(
+ self.fcpClient.events.RequestRestored,
+ consts.Message.ClientGet,
+ ('Identifier', myIdentifier)
+ )
- requests = self.fcpClient.getRequests()
- self.failUnless(requests)
- self.assertEqual(identifier, requests[msg['Identifier']]['Identifier'])
+ self.assertHasNextEvent(None)
+
+#***********************************************************************************
+#
+#***********************************************************************************
+#TODO: testDDAReadDenied_ReadDissallowed
+#TODO: testDDAWriteDenied
+#TODO: testDDAWriteDenied_WriteDisallowed
+
+class TestDDA(BaseTestConnectedClient):
+
+ def testDDAWriteDenied(self):
+
+ # request a file
+ myIdentifier = self.fcpClient.getFile(
+ 'arbitrary-uri',
+ os.path.join(DIR, 'DDATest.txt')
+ )
- self.failIf(self.hasNextEvent() )
+ # client schould send a ClientGet
+ self.assertHasNextMessage(consts.Message.ClientGet)
+ # respond with a ProtocolError
+ self.sendResponseMessage(
+ 'ProtocolError',
+ Code=25, # DDADenied
+ Identifier=myIdentifier,
+ ExtraDescription='An error occured',
+ Fatal='false',
+ Global='false',
+ )
+
+ # client should respond with a TestDDARequest
+ self.assertHasNextMessage(
+ consts.Message.TestDDARequest,
+ ('Directory', DIR),
+ ('WantWriteDirectory', True)
+ )
- ####################################################
- ##
- ## error test cases
- ##
- ####################################################
- def testBrokenSocket(self):
+ #msg = self.nextMessage()
+ #self.failIf(msg is None)
+ #self.assertEqual(msg.name, consts.Message.TestDDARequest)
+ ##self.assertEqual(msg['Directory'], DIR)
+ #self.failIf(not msg['WantWriteDirectory'])
- self.connectClient()
- self.socket.close()
- # send a test message
- self.assertRaises(socket.error, self.fcpClient.sendMessage, 'test' )
+ # respond with a TestDDAReply message
+ writeContent = 'blah'
+ fd, fpath = tempfile.mkstemp(dir=DIR)
+ os.close(fd)
+ self.sendResponseMessage(
+ 'TestDDAReply',
+ Directory=DIR,
+ WriteFilename=fpath,
+ ContentToWrite=writeContent,
+ )
+
+ # client should respond with a TestDDAResponse
+ self.assertHasNextMessage(
+ consts.Message.TestDDAResponse,
+ ('Directory', DIR)
+ )
+
+ # check if content was written
+ with open(fpath) as fp:
+ self.failUnless(fp.read() == writeContent)
+
+ # respond with a TestDDAComplete message
+ self.sendResponseMessage(
+ 'TestDDAComplete',
+ Directory=DIR,
+ WriteDirectoryAllowed='true',
+ )
+
+ # check if our tempfile was removed
+ self.failIf(os.path.isfile(fpath))
+
+ # client sahould send a new ClientGet
+ msg = self.assertHasNextMessage(consts.Message.ClientGet)
+
+ # no events should have been triggered upo to now
+ self.assertHasNextEvent(None)
- # check if ClientDisconnected events has been triggered
- event, msg = self.nextEvent()
- self.failIf(event is None)
- self.assertEqual(event, self.fcpClient.events.ClientDisconnected)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageClientSocketDied)
+ # respond with a PersistentGet
+ self.sendResponseMessage(
+ 'PersistentGet',
+ Started='false',
+ **msg.params
+ )
+
+ # check if client send expected events
+ self.assertHasNextEvent(
+ self.fcpClient.events.RequestStarted,
+ consts.Message.ClientGet,
+ ('Identifier', myIdentifier)
+ )
+ self.assertHasNextEvent(None)
- self.failIf(self.hasNextEvent() )
+ requests = self.fcpClient.getRequests()
+ self.assertEqual(len(requests), 1)
+
+
+ #def testDDAReadDenied(self):
-
+ # pass
+
+#***********************************************************************************
+#
+#***********************************************************************************
+class TestCollisions(BaseTestConnectedClient):
def testIdentifierCollision(self):
-
- self.connectClient()
-
+
# request a file
myIdentifier = self.fcpClient.getFile(
'arbitrary-uri',
@@ -497,50 +762,37 @@
)
# client schould send a ClientGet
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageClientGet)
+ self.assertHasNextMessage(consts.Message.ClientGet)
- # check if our request was registered
- requests = self.fcpClient.getRequests()
- self.failUnless(len(requests) == 1)
# respond with an IdentifierCollision
- self.socket.setResponseMessage(
+ self.sendResponseMessage(
'IdentifierCollision',
- Identifier=msg['Identifier']
+ Identifier=myIdentifier,
)
- self.fcpClient.next()
-
+
# client schould send a new ClientGet
- msg2 = self.nextMessage()
- self.failIf(msg2 is None)
- self.assertEqual(msg2.name, self.fcpClient.Message.MessageClientGet)
-
+ self.assertHasNextMessage(consts.Message.ClientGet)
+
# check client state
requests = self.fcpClient.getRequests()
self.assertEqual(len(requests), 1)
# check if RequestModified event has been triggered
- event, eventMsg = self.nextEvent()
- self.failIf(event is None)
- self.assertEqual(event, self.fcpClient.events.RequestModified)
- self.failUnless(self.fcpClient.Message.ModifiedRequestIdentifier in eventMsg['FcModified'])
- self.assertEqual(eventMsg['FcModified'][self.fcpClient.Message.ModifiedRequestIdentifier], myIdentifier)
- self.assertNotEqual(eventMsg['Identifier'], myIdentifier)
+ msg = self.assertHasNextEvent(
+ self.fcpClient.events.RequestModified,
+ consts.Message.ClientGet,
+ )
- self.failIf(self.events)
+ self.failUnless(consts.RequestModified.Identifier in msg['FcModified'])
+ self.assertEqual(msg['FcModified'][consts.RequestModified.Identifier], myIdentifier)
+ self.assertNotEqual(msg['Identifier'], myIdentifier)
+
+ self.assertHasNextEvent(None)
- ####################################################
- ##
- ## test filename collisions
- ##
- ####################################################
def testFilenameCollision_HandleRename(self):
-
- self.connectClient()
-
+
# request a file
fpath = os.path.join(DIR, 'test.txt')
open(fpath, 'wb').close()
@@ -549,62 +801,49 @@
myIdentifier = self.fcpClient.getFile(
'arbitrary-uri',
fpath,
- filenameCollision=self.fcpClient.FilenameCollision.HandleRename,
+ filenameCollision=consts.FilenameCollision.HandleRename,
)
# client schould send a ClientGet
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageClientGet)
+ self.assertHasNextMessage(consts.Message.ClientGet)
# check if our request was registered
requests = self.fcpClient.getRequests()
self.failUnless(len(requests) == 1)
# now respond with a ProtocolError
- self.socket.setResponseMessage(
+ self.sendResponseMessage(
'ProtocolError',
- Identifier=msg['Identifier'],
+ Identifier=myIdentifier,
Code='10', # disk target exists
ExtraDescription='An error occured',
Fatal='false',
Global='false',
)
- self.fcpClient.next()
-
+
# client schould send a new ClientGet with a differing filename
- msg2 = self.nextMessage()
- self.failIf(msg2 is None)
- self.assertEqual(msg2.name, self.fcpClient.Message.MessageClientGet)
+ msg = self.assertHasNextEvent(
+ self.fcpClient.events.RequestModified,
+ consts.Message.ClientGet
+ )
+
+ self.failUnless(consts.RequestModified.Filename in msg['FcModified'])
+ self.assertEqual(msg['FcModified'][consts.RequestModified.Filename], fpath)
+ self.assertNotEqual(msg['Filename'], fpath)
- # check if filename was replaced
- self.failIf(msg['Filename'] == msg2['Filename'])
-
- event, eventMsg = self.nextEvent()
- self.failIf(event is None)
- self.assertEqual(event, self.fcpClient.events.RequestModified)
- self.failUnless(self.fcpClient.Message.ModifiedRequestFilename in eventMsg['FcModified'])
- self.assertEqual(eventMsg['FcModified'][self.fcpClient.Message.ModifiedRequestFilename], fpath)
- self.assertNotEqual(eventMsg['Filename'], fpath)
-
# check flags
- filenameCollision = eventMsg['FcFilenameCollision']
+ filenameCollision = msg['FcFilenameCollision']
self.assertEqual(
- filenameCollision & self.fcpClient.FilenameCollision.MaskHandle,
- self.fcpClient.FilenameCollision.HandleRename
+ filenameCollision & consts.FilenameCollision.MaskHandle,
+ consts.FilenameCollision.HandleRename
)
- self.failUnless(filenameCollision & self.fcpClient.FilenameCollision.CollisionHandled)
+ self.failUnless(filenameCollision & consts.FilenameCollision.CollisionHandled)
+ self.assertHasNextEvent(None)
- self.failIf(self.events)
-
-
-
def testFilenameCollision_HandleNever(self):
-
- self.connectClient()
-
+
# request a file
fpath = os.path.join(DIR, 'test.txt')
open(fpath, 'wb').close()
@@ -613,169 +852,92 @@
myIdentifier = self.fcpClient.getFile(
'arbitrary-uri',
fpath,
- filenameCollision=self.fcpClient.FilenameCollision.HandleNever,
+ filenameCollision=consts.FilenameCollision.HandleNever,
)
myRequest = self.fcpClient.getRequest(myIdentifier)
# client schould send a ClientGet
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageClientGet)
+ self.assertHasNextMessage(consts.Message.ClientGet)
# check if our request was registered
requests = self.fcpClient.getRequests()
self.failUnless(len(requests) == 1)
# now respond with a ProtocolError
- self.socket.setResponseMessage(
+ self.sendResponseMessage(
'ProtocolError',
- Identifier=msg['Identifier'],
+ Identifier=myIdentifier,
Code='10', # disk target exists
ExtraDescription='An error occured',
Fatal='false',
Global='false',
)
- self.fcpClient.next()
-
+
# client schould send no messages and trigger a RequestFailed event
- msg2 = self.nextMessage()
- self.failUnless(msg2 is None)
-
- event, eventMsg = self.nextEvent()
- self.failIf(event is None)
- self.assertEqual(event, self.fcpClient.events.RequestFailed)
- #TODO: more checks here
+ self.assertHasNextEvent(self.fcpClient.events.RequestFailed)
# request should have been removed
self.failIf(self.fcpClient.getRequests())
- self.failIf(self.events)
+ self.assertHasNextEvent(None)
- ####################################################
- ##
- ## DDA test cases
- ##
- ####################################################
- def testDDAWriteDenied(self):
-
- self.connectClient()
-
- # request a file
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- os.path.join(DIR, 'DDATest.txt')
- )
-
-
- # client schould send a ClientGet
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageClientGet)
-
- # check client state
- requests = self.fcpClient.getRequests()
- self.failUnless(len(requests) == 1)
-
- # respond with a ProtocolError
- self.socket.setResponseMessage(
- 'ProtocolError',
- Code=25, # DDADenied
- Identifier=msg['Identifier'],
- ExtraDescription='An error occured',
- Fatal='false',
- Global='false',
- )
- self.fcpClient.next()
-
- # client should respond with a TestDDARequest
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageTestDDARequest)
- self.assertEqual(msg['Directory'], DIR)
- self.failIf(not msg['WantWriteDirectory'])
-
-
- # respond with a TestDDAReply message
- writeContent = 'blah'
- fd, fpath = tempfile.mkstemp(dir=DIR)
- os.close(fd)
- self.socket.setResponseMessage(
- 'TestDDAReply',
- Directory=msg['Directory'],
- WriteFilename=fpath,
- ContentToWrite=writeContent,
- )
- self.fcpClient.next()
-
- # client should respond with a TestDDAResponse
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageTestDDAResponse)
- self.assertEqual(msg['Directory'], DIR)
-
- # check if content was written
- with open(fpath) as fp:
- self.failUnless(fp.read() == writeContent)
-
- # respond with a TestDDAComplete message
- self.socket.setResponseMessage(
- 'TestDDAComplete',
- Directory=msg['Directory'],
- WriteDirectoryAllowed='true',
- )
- self.fcpClient.next()
-
- # check if our tempfile was removed
- self.failIf(os.path.isfile(fpath))
-
- # client sahould send a new ClientGet
- msg = self.nextMessage()
- self.failIf(msg is None)
- self.assertEqual(msg.name, self.fcpClient.Message.MessageClientGet)
-
- # no events should have been triggered upo to now
- self.failIf(self.events)
-
- # respond with a PersistentGet
- self.socket.setResponseMessage(
- 'PersistentGet',
- Started='false',
- **msg.params
- )
- self.fcpClient.next()
-
- # check if client send expected events
- event, eventMsg = self.nextEvent()
- self.failIf(event is None)
- self.assertEqual(event, self.fcpClient.events.RequestStarted)
-
- # check client state
- self.failUnless(msg['Identifier'] == myIdentifier)
- requests = self.fcpClient.getRequests()
- self.assertEqual(len(requests), 1)
-
- ####################################################
- ##
- ##
- ##
- ####################################################
-
+#***********************************************************************************
+#
+#***********************************************************************************
+#TODO: class TestNodeAndPeers(BaseTestConnectedClient):
+#***********************************************************************************
+#
+#***********************************************************************************
+#TODO: class TestPlugins(BaseTestConnectedClient):
+
+#***********************************************************************************
+#TODO: class TestConfig(BaseTestConnectedClient):
+
+#***********************************************************************************
+#
+#***********************************************************************************
+#TODO: class TestSSKKeypair(BaseTestConnectedClient):
+
+#***********************************************************************************
+#
+#***********************************************************************************
+#TODO: class TestSubscribeUSK(BaseTestConnectedClient):
+
+
+
#*********************************************************************************
#
#*********************************************************************************
def suite():
- return unittest.TestLoader().loadTestsFromTestCase(TestFcpClient)
+ tests = (
+ TestConnect,
+ TestConnection,
+ TestClientGet,
+ TestRequests,
+ TestRestoreRequests,
+ TestDDA,
+ TestCollisions,
+ )
+
+ suite = unittest.TestSuite()
+ for test in tests:
+ suite.addTest(unittest.makeSuite(test))
+ return suite
+
def test():
- unittest.main()
+ unittest.TextTestRunner(verbosity=1).run(suite())
-if __name__ == '__main__':
- test()
+if __name__ == "__main__":
+ test()
+
+
+
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|