fclient-commit Mailing List for fclient (Page 25)
Status: Pre-Alpha
Brought to you by:
jurner
You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(23) |
Nov
(54) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(17) |
Feb
(209) |
Mar
(63) |
Apr
(31) |
May
(7) |
Jun
(39) |
Jul
(390) |
Aug
(122) |
Sep
(6) |
Oct
|
Nov
|
Dec
|
From: <jU...@us...> - 2008-03-11 01:04:01
|
Revision: 362 http://fclient.svn.sourceforge.net/fclient/?rev=362&view=rev Author: jUrner Date: 2008-03-10 18:04:02 -0700 (Mon, 10 Mar 2008) Log Message: ----------- continued rewriting tests 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-11 01:03:34 UTC (rev 361) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-03-11 01:04:02 UTC (rev 362) @@ -41,12 +41,12 @@ class BaseTestClient(unittest.TestCase): """Base class for all tests""" - fcpClient = Client( + client = Client( #debugVerbosity=Client.consts.DebugVerbosity.Debug debugVerbosity=Client.consts.DebugVerbosity.Quiet ) - fcpClient.ioHandler.setIOPrototype(DummyIO) + client.ioHandler.setIOPrototype(DummyIO) def __init__(self, *args, **kwargs): @@ -65,7 +65,7 @@ def connectClient(self): """Connects to the client""" - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): msg = self.getNextMessage() if msg is not None: self.failUnless(msg.name == 'ClientHello') @@ -75,7 +75,7 @@ Build='9999999999', Node='Fred', - Version=str(self.fcpClient.ExpectedFcpVersion), + Version=str(self.client.ExpectedFcpVersion), Revision='999999999999', ExRevision='9999999999', Testnet='false', @@ -87,7 +87,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.ClientConnected, + self.client.events.ClientConnected, consts.Message.NodeHello, ) self.assertHasNextEvent(None) @@ -97,9 +97,9 @@ def closeClient(self): """Closes the client""" - self.fcpClient.close() + self.client.close() self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.Close), ) @@ -262,9 +262,9 @@ else: msgClass = message.newMessageType(messageName) msg = msgClass(data=data, **params) - self.fcpClient.ioHandler.io.readBuffer += msg.toString() + self.client.ioHandler.io.readBuffer += msg.toString() if callNext: - self.fcpClient.next() + self.client.next() #NOTE: iohandler is buffered @@ -278,40 +278,40 @@ # cheat a bit to get iohandler to read a message from writeBuffer if self.ioOpen(): - self.fcpClient.ioHandler.io.setReverseDirection(True) + self.client.ioHandler.io.setReverseDirection(True) try: - msg = self.fcpClient.ioHandler.readMessage() - except iohandler.IOTimeout: + msg = self.client.ioHandler.readMessage() + except self.client.ioHandler.IOTimeout: return None finally: - self.fcpClient.ioHandler.io.setReverseDirection(False) + self.client.ioHandler.io.setReverseDirection(False) return msg def ioOpen(self): """Checks if the clients io is open""" - return self.fcpClient.ioHandler.isOpen() + return self.client.ioHandler.isOpen() def getIO(self): """Returns the clients io""" - return self.fcpClient.ioHandler.io + return self.client.ioHandler.io def setUp(self): # conect all events self.events = [] # events received from the client - for event in self.fcpClient.events: + for event in self.client.events: event += self._captureEventsFromClient def tearDown(self): # disconnect all events - for event in self.fcpClient.events: + for event in self.client.events: event -= self._captureEventsFromClient # clean up tmpfiles for fpath in self.tmpfiles: os.remove(fpath) - if self.fcpClient.isOpen(): - self.fcpClient.close() + if self.client.isOpen(): + self.client.close() #*********************************************************************************** @@ -325,9 +325,9 @@ class Test_close(BaseTestClient): def test_close(self): - self.fcpClient.close() + self.client.close() self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.Close), ) @@ -339,11 +339,11 @@ class Test_isOpen(BaseTestClient): def test_isOpen(self): - self.failIf(self.fcpClient.isOpen()) + self.failIf(self.client.isOpen()) self.connectClient() - self.failUnless(self.fcpClient.isOpen()) + self.failUnless(self.client.isOpen()) self.closeClient() - self.failIf(self.fcpClient.isOpen()) + self.failIf(self.client.isOpen()) #*********************************************************************************** #TODO: not idea how to test this @@ -358,7 +358,7 @@ class Test_iterConnect(BaseTestClient): def test_iterConnect_success(self): - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): msg = self.getNextMessage() if msg is not None: self.failUnless(msg.name == 'ClientHello') @@ -366,7 +366,7 @@ 'NodeHello', FCPVersion='2.0', Node='Fred', - Version=str(self.fcpClient.ExpectedFcpVersion), + Version=str(self.client.ExpectedFcpVersion), Revision='999999999999', Build='9999999999', ExRevision='9999999999', @@ -379,22 +379,22 @@ ) self.assertHasNextEvent( - self.fcpClient.events.ClientConnected, + self.client.events.ClientConnected, consts.Message.NodeHello, ) self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.failUnless(self.ioOpen()) - self.fcpClient.close() + self.client.close() def test_iterConnect_ioRefusesConnection(self): - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): self.getIO().setAllowConnect(False) self.failUnless(nodeHello is None) self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.IOConnectFailed), ) @@ -404,12 +404,12 @@ def test_iterConnect_nodeHelloNeverArrives(self): - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): pass self.failUnless(nodeHello is None) self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.NoNodeHello), ) @@ -419,17 +419,17 @@ def test_iterConnect_socketDies(self): - enum = self.fcpClient.iterConnect(duration=0.2, timeout=0.1) + enum = self.client.iterConnect(duration=0.2, timeout=0.1) errorRaised = False while True: try: enum.next() except StopIteration: break - except iohandler.IOBroken, d: + except self.client.ioHandler.IOBroken, d: errorRaised = True self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.ConnectionDied), #('Param', None), @@ -445,7 +445,7 @@ def test_iterIterConnect_unknownNodehello(self): - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): self.sendResponseMessage( 'i-am-invalid', callNext=False, @@ -453,7 +453,7 @@ self.failUnless(nodeHello is None) self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.UnknownNodeHello), ) @@ -463,14 +463,14 @@ def test_iterIterConnect_connect(self): - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): self.sendResponseMessage( 'NodeHello', FCPVersion='2.0', Build='9999999999', Node='Fred', - Version=str(self.fcpClient.ExpectedFcpVersion), + Version=str(self.client.ExpectedFcpVersion), Revision='999999999999', ExRevision='9999999999', Testnet='false', @@ -482,7 +482,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.ClientConnected, + self.client.events.ClientConnected, consts.Message.NodeHello, ) self.assertHasNextEvent(None) @@ -494,14 +494,14 @@ def test_iterIterConnect_reconnect(self): self.connectClient() - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): self.sendResponseMessage( 'NodeHello', FCPVersion='2.0', Build='9999999999', Node='Fred', - Version=str(self.fcpClient.ExpectedFcpVersion), + Version=str(self.client.ExpectedFcpVersion), Revision='999999999999', ExRevision='9999999999', Testnet='false', @@ -513,12 +513,12 @@ ) self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.Reconnect) ) self.assertHasNextEvent( - self.fcpClient.events.ClientConnected, + self.client.events.ClientConnected, consts.Message.NodeHello, ) self.assertHasNextEvent(None) @@ -528,14 +528,14 @@ def test_iterIterConnect_VersionMissmatch_FCPVersion(self): - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): self.sendResponseMessage( 'NodeHello', FCPVersion='0.0', Build='9999999999', Node='Fred', - Version=str(self.fcpClient.ExpectedFcpVersion), + Version=str(self.client.ExpectedFcpVersion), Revision='999999999999', ExRevision='9999999999', Testnet='false', @@ -547,7 +547,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.VersionMissmatch) ) @@ -558,14 +558,14 @@ def test_iterIterConnect_VersionMissmatch_Build(self): - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): self.sendResponseMessage( 'NodeHello', FCPVersion='2.0', Build='0', Node='Fred', - Version=str(self.fcpClient.ExpectedFcpVersion), + Version=str(self.client.ExpectedFcpVersion), Revision='999999999999', ExRevision='9999999999', Testnet='false', @@ -577,7 +577,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.VersionMissmatch) ) @@ -599,7 +599,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.DuplicateClientName) ) @@ -615,7 +615,7 @@ def test_closeNode(self): self.connectClient() - self.fcpClient.closeNode() + self.client.closeNode() self.assertHasNextMessage('Shutdown') self.sendResponseMessage( 'ProtocolError', @@ -623,7 +623,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.NodeClosing) ) @@ -632,7 +632,237 @@ self.failIf(self.ioOpen()) self.closeClient() +#*********************************************************************************** +# TODO: no idea how t test this +#*********************************************************************************** +class Test_startNode(BaseTestClient): + pass + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_get_setConnectionName(BaseTestClient): + + def test_get_setConnectionName(self): + + self.failIf(self.client.setConnectionName() == 'foo') + self.client.setConnectionName('foo') + self.failIf(self.client.getConnectionName() != 'foo') + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_get_setDebugVerbosity(BaseTestClient): + + + def test_get_setDebugVerbosity(self): + oldVerbosity = self.client.getDebugVerbosity() + self.client.setDebugVerbosity(self.client.consts.DebugVerbosity.Quiet) + self.client.setDebugVerbosity(oldVerbosity) + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_versionCheckNodeHello(BaseTestClient): + + + def test_get_versionCheckNodeHello(self): + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion, + 'Build':self.client.ExpectedNodeBuild, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == True) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion -1, + 'Build':self.client.ExpectedNodeBuild, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == False) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion, + 'Build':self.client.ExpectedNodeBuild -1, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == False) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion +1, + 'Build':self.client.ExpectedNodeBuild, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == False) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion, + 'Build':self.client.ExpectedNodeBuild +1, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == True) + +#*********************************************************************************** +# TODO: not tested +#*********************************************************************************** +class Test_handleMessage(BaseTestClient): + pass + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_next(BaseTestClient): + + def test_idle(self): + self.connectClient() + msg = self.client.next() + msg2 = self.assertHasNextEvent( + self.client.events.Idle, + self.client.message.ClientSocketTimeout.name, + ) + self.failUnless(msg == msg2) + + + def test_io_broken(self): + self.connectClient() + self.getIO().setBroken(True) + + self.assertRaises(self.client.ioHandler.IOBroken, self.client.next, ) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.ConnectionDied) + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_hasMessage(self): + self.connectClient() + self.sendResponseMessage( + 'HiThere', + callNext=False + ) + msg = self.client.next() + self.assertEqual(msg.name, 'HiThere') + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + +#*********************************************************************************** +#TODO: not tested yet +#*********************************************************************************** +class Test_run(BaseTestClient): + + pass + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_sendMessage(BaseTestClient): + + def test_io_broken(self): + self.connectClient() + self.getIO().setBroken(True) + + self.assertRaises(self.client.ioHandler.IOBroken, self.client.sendMessage, self.client.message.ClientHello()) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + consts.Message.ClientDisconnected, + ('DisconnectReason', consts.DisconnectReason.ConnectionDied) + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_messageSend(self): + self.connectClient() + self.client.sendMessage(self.client.message.ClientHello()) + msg = self.client.next() + self.assertHasNextMessage('ClientHello') + self.assertHasNextEvent(self.client.events.Idle) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_getConfig(BaseTestClient): + + def test_getConfig(self): + self.connectClient() + self.client.getConfig( + withCurrent=True, + withDefaults=True, + withExpertFlag=True, + withForceWriteFlag=True, + withSortOrder=True, + withShortDescription=True, + withLongDescription=True, + withDataTypes=True, + ) + msg = self.client.next() + self.assertHasNextMessage('GetConfig', + ('WithCurrent', True), + ('WithDefaults', True), + ('WithExpertFlag', True), + ('WithForceWriteFlag', True), + ('WithSortOrder', True), + ('WithShortDescription', True), + ('WithLongDescription', True), + ('WithDataTypes', True), + ) + self.assertHasNextEvent(self.client.events.Idle) + + + self.sendResponseMessage('ConfigData', + foo='1234', + ) + self.assertHasNextEvent( + self.client.events.ConfigData, + consts.Message.ConfigData, + ('foo', '1234') + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_modifyConfig(BaseTestClient): + + def test_getConfig(self): + self.connectClient() + self.client.modifyConfig( + {'foo': '1234'} + ) + msg = self.client.next() + self.assertHasNextMessage('ModifyConfig', + ('foo', '1234'), + ) + self.assertHasNextEvent(self.client.events.Idle) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + + ################################################### ################################################### ################################################### @@ -647,7 +877,7 @@ self.sendResponseMessage('CloseConnectionDuplicateClientName') msg = self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.DuplicateClientName), ) @@ -656,7 +886,7 @@ self.failIf(self.ioOpen()) self.assertHasNextEvent(None) - #print self.fcpClient.test_messagesSend[0].name + #print self.client.test_messagesSend[0].name self.assertHasNextMessage(None) self.connectClient() @@ -665,11 +895,11 @@ def test_1001_SocketDied_Receive(self): self.getIO().setBroken(True) - self.assertRaises(iohandler.IOBroken, self.fcpClient.next) + self.assertRaises(iohandler.IOBroken, self.client.next) # check if ClientDisconnected events has been triggered msg = self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.SocketDied), #('Param', ClientSocketDiedMessage) # can not test here @@ -689,11 +919,11 @@ self.getIO().setBroken(True) # send a test message - self.assertRaises(iohandler.IOBroken, self.fcpClient.sendMessage, message.newMessageType('test')()) + self.assertRaises(iohandler.IOBroken, self.client.sendMessage, message.newMessageType('test')()) # check if ClientDisconnected events has been triggered msg = self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.SocketDied), #('Param', ClientSocketDiedMessage) # can not test here @@ -710,7 +940,7 @@ def test_1003_Shutdown(self): - self.fcpClient.closeFreenet() + self.client.closeFreenet() msg = self.assertHasNextMessage(consts.Message.Shutdown) self.sendResponseMessage( @@ -720,7 +950,7 @@ # check events the client triggered msg = self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.Shutdown) #('Param', NodeHelloMessage) # can not test here @@ -738,7 +968,7 @@ def test_1004_VersionMismatch(self): - for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)): + for n, nodeHello in enumerate(self.client.iterConnect(duration=1, timeout=0.1)): if n == 1: self.assertHasNextMessage( consts.Message.ClientHello @@ -747,7 +977,7 @@ 'NodeHello', FCPVersion='0.0', Node='Fred', - Version=str(self.fcpClient.ExpectedFcpVersion), + Version=str(self.client.ExpectedFcpVersion), Revision='0', Build='0', ExRevision='0', @@ -761,7 +991,7 @@ # check events the client triggered msg = self.assertHasNextEvent( - self.fcpClient.events.ClientDisconnected, + self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, ('DisconnectReason', consts.DisconnectReason.VersionMissmatch) #('Param', NodeHelloMessage) # can not test here @@ -782,11 +1012,11 @@ def test_2000_ClientGetRegistered(self): # request a arbitrary file - myIdentifier = self.fcpClient.getData( + myIdentifier = self.client.getData( 'arbitrary-uri', ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) self.assertHasNextEvent(None) @@ -806,11 +1036,11 @@ def test_2001_GetData_Success(self): # request a arbitrary file - myIdentifier = self.fcpClient.getData( + myIdentifier = self.client.getData( 'arbitrary-uri', ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) @@ -833,7 +1063,7 @@ Succeeded=1, ) self.assertHasNextEvent( - self.fcpClient.events.RequestProgress, + self.client.events.RequestProgress, ) # finalize request @@ -861,7 +1091,7 @@ # client should complete and remove the request self.assertHasNextEvent( - self.fcpClient.events.RequestCompleted, + self.client.events.RequestCompleted, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | @@ -890,7 +1120,7 @@ # client should complete but not remove the request self.assertHasNextEvent( - self.fcpClient.events.RequestCompleted, + self.client.events.RequestCompleted, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.Completed), data=data @@ -908,11 +1138,11 @@ def test_2002_GetData_Failure(self): # request a arbitrary file - myIdentifier = self.fcpClient.getData( + myIdentifier = self.client.getData( 'arbitrary-uri', ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) @@ -934,7 +1164,7 @@ # client should complete request and remove it self.assertHasNextEvent( - self.fcpClient.events.RequestFailed, + self.client.events.RequestFailed, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Error | consts.RequestStatus.RemovedFromQueue | @@ -964,7 +1194,7 @@ # client should complete but not remove the request self.assertHasNextEvent( - self.fcpClient.events.RequestFailed, + self.client.events.RequestFailed, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Error | consts.RequestStatus.Completed), ) @@ -979,12 +1209,12 @@ def test_2003_GetFile_Success(self): # request a arbitrary file - myIdentifier = self.fcpClient.getFile( + myIdentifier = self.client.getFile( 'arbitrary-uri', 'arbitryry.txt' ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) @@ -1008,7 +1238,7 @@ **params ) self.assertHasNextEvent( - self.fcpClient.events.RequestCompleted, + self.client.events.RequestCompleted, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | @@ -1026,12 +1256,12 @@ def test_2004_GetFile_Failure(self): # request a arbitrary file - myIdentifier = self.fcpClient.getFile( + myIdentifier = self.client.getFile( 'arbitrary-uri', 'arbitryry.txt' ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) @@ -1052,7 +1282,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.RequestFailed, + self.client.events.RequestFailed, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Error | consts.RequestStatus.RemovedFromQueue | @@ -1069,11 +1299,11 @@ def test_2005_GetKeyInfo_Success(self): # request a arbitrary uri - myIdentifier = self.fcpClient.getKeyInfo( + myIdentifier = self.client.getKeyInfo( 'arbitrary-uri', ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) @@ -1097,7 +1327,7 @@ **params ) self.assertHasNextEvent( - self.fcpClient.events.RequestCompleted, + self.client.events.RequestCompleted, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | @@ -1116,11 +1346,11 @@ # test specdial case where ProtocolError.TooBig is handled as success # request a arbitrary uri - myIdentifier = self.fcpClient.getKeyInfo( + myIdentifier = self.client.getKeyInfo( 'arbitrary-uri', ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) @@ -1140,7 +1370,7 @@ # blah.. more here ) self.assertHasNextEvent( - self.fcpClient.events.RequestCompleted, + self.client.events.RequestCompleted, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | @@ -1158,11 +1388,11 @@ def test_2007_GetKeyInfo_Failure(self): # request a arbitrary file - myIdentifier = self.fcpClient.getKeyInfo( + myIdentifier = self.client.getKeyInfo( 'arbitrary-uri', ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) @@ -1182,7 +1412,7 @@ # blah.. more here ) self.assertHasNextEvent( - self.fcpClient.events.RequestFailed, + self.client.events.RequestFailed, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Error | consts.RequestStatus.RemovedFromQueue | @@ -1207,12 +1437,12 @@ def testPutRedirect_Success(self): # request a arbitrary file - myIdentifier = self.fcpClient.putRedirect( + myIdentifier = self.client.putRedirect( 'my-redirect-name', 'SSK@arbitrary-uri', ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientPut) self.failUnless(myIdentifier in requestsAll) @@ -1224,7 +1454,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.RequestCompleted, + self.client.events.RequestCompleted, consts.Message.ClientPut, ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | @@ -1239,12 +1469,12 @@ def testPutRedirect_Failure(self): # request a arbitrary file - myIdentifier = self.fcpClient.putRedirect( + myIdentifier = self.client.putRedirect( 'my-redirect-name', 'SSK@arbitrary-uri', ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientPut) self.failUnless(myIdentifier in requestsAll) @@ -1256,7 +1486,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.RequestFailed, + self.client.events.RequestFailed, consts.Message.ClientPut, ('RequestStatus', consts.RequestStatus.Error | consts.RequestStatus.RemovedFromQueue | @@ -1271,11 +1501,11 @@ def testCHKPutData_Success(self): # request a arbitrary file - myIdentifier = self.fcpClient.chkPutData( + myIdentifier = self.client.chkPutData( 'arbitrary data' ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientPut) self.failUnless(myIdentifier in requestsAll) @@ -1287,7 +1517,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.RequestCompleted, + self.client.events.RequestCompleted, consts.Message.ClientPut, ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | @@ -1302,11 +1532,11 @@ def testCHKPutData_Failure(self): # request a arbitrary file - myIdentifier = self.fcpClient.chkPutData( + myIdentifier = self.client.chkPutData( 'arbitrary data' ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientPut) self.failUnless(myIdentifier in requestsAll) @@ -1318,7 +1548,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.RequestFailed, + self.client.events.RequestFailed, consts.Message.ClientPut, ('RequestStatus', consts.RequestStatus.Error | consts.RequestStatus.RemovedFromQueue | @@ -1333,11 +1563,11 @@ def testCHKPutDir_Success(self): # request a arbitrary file - myIdentifier = self.fcpClient.chkPutDir( + myIdentifier = self.client.chkPutDir( 'myDirectory' ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientPutDiskDir) self.failUnless(myIdentifier in requestsAll) @@ -1349,7 +1579,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.RequestCompleted, + self.client.events.RequestCompleted, consts.Message.ClientPutDiskDir, ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | @@ -1364,11 +1594,11 @@ def testCHKPutDir_Failure(self): # request a arbitrary file - myIdentifier = self.fcpClient.chkPutDir( + myIdentifier = self.client.chkPutDir( 'myDirectory' ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientPutDiskDir) self.failUnless(myIdentifier in requestsAll) @@ -1380,7 +1610,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.RequestFailed, + self.client.events.RequestFailed, consts.Message.ClientPutDiskDir, ('RequestStatus', consts.RequestStatus.Error | consts.RequestStatus.RemovedFromQueue | @@ -1395,11 +1625,11 @@ def testCHKPutFile_Success(self): # request a arbitrary file - myIdentifier = self.fcpClient.chkPutFile( + myIdentifier = self.client.chkPutFile( 'myFile.txt' ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientPut) self.failUnless(myIdentifier in requestsAll) @@ -1411,7 +1641,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.RequestCompleted, + self.client.events.RequestCompleted, consts.Message.ClientPut, ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | @@ -1426,11 +1656,11 @@ def testCHKPutFile_Failure(self): # request a arbitrary file - myIdentifier = self.fcpClient.chkPutFile( + myIdentifier = self.client.chkPutFile( 'myFile.txt' ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientPut) self.failUnless(myIdentifier in requestsAll) @@ -1442,7 +1672,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.RequestFailed, + self.client.events.RequestFailed, consts.Message.ClientPut, ('RequestStatus', consts.RequestStatus.Error | consts.RequestStatus.RemovedFromQueue | @@ -1482,11 +1712,11 @@ ] # request a arbitrary file - myIdentifier = self.fcpClient.chkPutMultiple( + myIdentifier = self.client.chkPutMultiple( items ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() msg = self.assertHasNextMessage( consts.Message.ClientPutComplexDir, @@ -1521,7 +1751,7 @@ ) self.assertHasNextEvent( - self.fcpClient.events.RequestCompleted, + self.client.events.RequestCompleted, consts.Message.ClientPutComplexDir, ('RequestStatus', consts.RequestStatus.Success | consts.RequestStatus.RemovedFromQueue | @@ -1545,7 +1775,7 @@ 'Name': 'myItem0', }, ] - self.assertRaises(ValueError, self.fcpClient.chkPutMultiple, items) + self.assertRaises(ValueError, self.client.chkPutMultiple, items) #TODO: how to test required params? # ...just some samples below @@ -1558,7 +1788,7 @@ 'Name': 'myItem0', }, ] - self.assertRaises(ValueError, self.fcpClient.chkPutMultiple, items) + self.assertRaises(ValueError, self.client.chkPutMultiple, items) # param missing (we enforce all required parameters) items = [ @@ -1568,12 +1798,12 @@ #'Name': 'myItem0', }, ] - self.assertRaises(ValueError, self.fcpClient.chkPutMultiple, items) + self.assertRaises(ValueError, self.client.chkPutMultiple, items) # some sloppy tests for other key types def testSSKPutData(self): - myIdentifier = self.fcpClient.chkPutData( + myIdentifier = self.client.chkPutData( 'arbitrary data' ) @@ -1590,15 +1820,15 @@ def test_3000_ModifyRequest_Persistent(self): # request a arbitrary file - myIdentifier = self.fcpClient.getFile( + myIdentifier = self.client.getFile( 'arbitrary-uri', 'arbitryry.txt', persistentUserData='foo', priorityClass=consts.Priority.Medium, persistence=consts.Persistence.Reboot, ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) @@ -1612,7 +1842,7 @@ # test modify persistent user data - self.fcpClient.modifyRequest(myIdentifier, persistentUserData='bar', priorityClass=consts.Priority.High) + self.client.modifyRequest(myIdentifier, persistentUserData='bar', priorityClass=consts.Priority.High) msg = self.assertHasNextMessage(consts.Message.ModifyPersistentRequest) # respond to the file request @@ -1620,7 +1850,7 @@ 'PersistentRequestModified', **msg.params ) - self.assertHasNextEvent(self.fcpClient.events.RequestModified) + self.assertHasNextEvent(self.client.events.RequestModified) self.failUnless(consts.RequestModified.PersistentUserData in myRequest['Modified']) self.failUnless(consts.RequestModified.PriorityClass in myRequest['Modified']) @@ -1637,14 +1867,14 @@ def test_3001_ModifyRequest_NonPersistent(self): # request a arbitrary file - myIdentifier = self.fcpClient.getFile( + myIdentifier = self.client.getFile( 'arbitrary-uri', 'arbitryry.txt', persistentUserData='foo', priorityClass=consts.Priority.Medium, ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) @@ -1656,7 +1886,7 @@ ) # test modify persistent user data - self.fcpClient.modifyRequest(myIdentifier, persistentUserData='bar', priorityClass=consts.Priority.High) + self.client.modifyRequest(myIdentifier, persistentUserData='bar', priorityClass=consts.Priority.High) # no way to modify priority in Fcp. The client ignores all attempts to do so currently # no message is send,instead the event is triggered emidiately @@ -1668,7 +1898,7 @@ # **msg.params # ) - self.assertHasNextEvent(self.fcpClient.events.RequestModified) + self.assertHasNextEvent(self.client.events.RequestModified) self.failUnless(consts.RequestModified.PersistentUserData in myRequest['Modified']) #self.failUnless(consts.RequestModified.PriorityClass in myRequest['Modified']) @@ -1685,12 +1915,12 @@ def test_3002_RemoveRequest_NonPersistent(self): # request a file - myIdentifier = self.fcpClient.getFile( + myIdentifier = self.client.getFile( 'arbitrary-uri', 'arbitrary.txt' ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) # respond to the file request @@ -1705,25 +1935,25 @@ self.messages = [] # now cancel request - self.fcpClient.removeRequest(myIdentifier) + self.client.removeRequest(myIdentifier) # of our request should be removed emidiately, self.assertEqual(myRequest['RequestStatus'], consts.RequestStatus.Removed | consts.RequestStatus.RemovedFromQueue | consts.RequestStatus.Completed ) - self.failIf(myIdentifier in self.fcpClient.getRequests()) + self.failIf(myIdentifier in self.client.getRequests()) # now the request should have been removed self.assertHasNextEvent( - self.fcpClient.events.RequestRemoved, + self.client.events.RequestRemoved, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Removed | consts.RequestStatus.RemovedFromQueue | consts.RequestStatus.Completed ), ) - self.failIf(self.fcpClient.getRequests()) + self.failIf(self.client.getRequests()) self.assertHasNextEvent(None) self.assertHasNextMessage(None) @@ -1733,13 +1963,13 @@ def test_3003_RemoveRequest_persistent(self): # request a file - myIdentifier = self.fcpClient.getFile( + myIdentifier = self.client.getFile( 'arbitrary-uri', 'arbitrary.txt', persistence=consts.Persistence.Reboot, ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) @@ -1755,12 +1985,12 @@ self.messages = [] # now cancel request - self.fcpClient.removeRequest(myIdentifier) + self.client.removeRequest(myIdentifier) # status of our request should be set to removed emidiately, but it should # not be removed from the client self.assertEqual(myRequest['RequestStatus'], consts.RequestStatus.Removed | consts.RequestStatus.Completed) - self.failUnless(myIdentifier in self.fcpClient.getRequests()) + self.failUnless(myIdentifier in self.client.getRequests()) # client schould send a RemovePersistentRequest self.assertHasNextMessage(consts.Message.RemovePersistentRequest) @@ -1775,7 +2005,7 @@ self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.RemovedFromQueue) self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent( - self.fcpClient.events.RequestRemoved, + self.client.events.RequestRemoved, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Removed | consts.RequestStatus.RemovedFromQueue | @@ -1783,7 +2013,7 @@ ), ) - self.failIf(self.fcpClient.getRequests()) + self.failIf(self.client.getRequests()) self.assertHasNextEvent(None) self.assertHasNextMessage(None) @@ -1793,19 +2023,19 @@ def test_3004_ResendRequest_NonPersistent(self): - myIdentifier = self.fcpClient.getData('any-key') - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myIdentifier = self.client.getData('any-key') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) - newIdentifier = self.fcpClient.resendRequest(myRequest) + newIdentifier = self.client.resendRequest(myRequest) # client should remove old request emidiately self.failIf(myIdentifier == newIdentifier) self.failIf(myIdentifier in requestsAll) self.failUnless(newIdentifier in requestsAll) self.assertHasNextEvent( - self.fcpClient.events.RequestRemoved, + self.client.events.RequestRemoved, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Removed | consts.RequestStatus.RemovedFromQueue | @@ -1824,12 +2054,12 @@ def test_3005_ResendRequest_Persistent(self): - myIdentifier = self.fcpClient.getData('any-key', persistence=consts.Persistence.Reboot) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myIdentifier = self.client.getData('any-key', persistence=consts.Persistence.Reboot) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) - newIdentifier = self.fcpClient.resendRequest(myRequest) + newIdentifier = self.client.resendRequest(myRequest) self.failIf(myIdentifier == newIdentifier) self.failUnless(newIdentifier in requestsAll) @@ -1847,7 +2077,7 @@ Identifier=myIdentifier, ) self.assertHasNextEvent( - self.fcpClient.events.RequestRemoved, + self.client.events.RequestRemoved, consts.Message.ClientGet, ('RequestStatus', consts.RequestStatus.Removed | consts.RequestStatus.RemovedFromQueue | @@ -1890,7 +2120,7 @@ ('Identifier', myIdentifier) ) - requests = self.fcpClient.getRequests() + requests = self.client.getRequests() self.failIf(requests) # the client should not trigger any events @@ -1901,16 +2131,16 @@ def test_4001_RestorePersistentGet_ValidIdentifier(self): # we need a valid identifier to restore a request, so hack a bit - myIdentifier = self.fcpClient.getFile( + myIdentifier = self.client.getFile( 'arbitrary-uri', 'arbitryry.txt' ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.ClientGet) - self.fcpClient.removeRequest(myIdentifier) + self.client.removeRequest(myIdentifier) self.sendResponseMessage( 'PersistentRequestRemoved', Identifier=myIdentifier, @@ -1932,7 +2162,7 @@ # check if the client restored the request msg = self.assertHasNextEvent( - self.fcpClient.events.RequestRestored, + self.client.events.RequestRestored, consts.Message.ClientGet, ('Identifier', myIdentifier), ('RequestStatus', consts.RequestStatus.Restored), # no RequestStatus.Pending flag should be set here @@ -1957,12 +2187,12 @@ def test_5000_DDAWriteDenied(self): # request a file - myIdentifier = self.fcpClient.getFile( + myIdentifier = self.client.getFile( 'arbitrary-uri', os.path.join(DIR, 'DDATest.txt') ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() # client schould send a ClientGet self.assertHasNextMessage(consts.Message.ClientGet) @@ -2035,7 +2265,7 @@ **msg.params ) - requests = self.fcpClient.getRequests() + requests = self.client.getRequests() self.assertEqual(len(requests), 1) self.assertHasNextEvent(None) @@ -2057,12 +2287,12 @@ def test_6000_IdentifierCollision(self): # request a file - myIdentifier = self.fcpClient.getFile( + myIdentifier = self.client.getFile( 'arbitrary-uri', os.path.join(DIR, 'test.txt') ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() # client schould send a ClientGet self.assertHasNextMessage(consts.Message.ClientGet) @@ -2079,7 +2309,7 @@ # check if RequestModified event has been triggered msg = self.assertHasNextEvent( - self.fcpClient.events.RequestModified, + self.client.events.RequestModified, consts.Message.ClientGet, ) @@ -2103,13 +2333,13 @@ open(fpath, 'wb').close() self.tmpfiles.append(fpath) - myIdentifier = self.fcpClient.getFile( + myIdentifier = self.client.getFile( 'arbitrary-uri', fpath, filenameCollision=consts.FilenameCollision.HandleRename, ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() # client schould send a ClientGet self.assertHasNextMessage(consts.Message.ClientGet) @@ -2127,7 +2357,7 @@ # client schould send a new ClientGet with a different filename self.assertHasNextMessage(consts.Message.ClientGet) msg = self.assertHasNextEvent( - self.fcpClient.events.RequestModified, + self.client.events.RequestModified, consts.Message.ClientGet ) @@ -2157,19 +2387,19 @@ open(fpath, 'wb').close() self.tmpfiles.append(fpath) - myIdentifier = self.fcpClient.getFile( + myIdentifier = self.client.getFile( 'arbitrary-uri', fpath, filenameCollision=consts.FilenameCollision.HandleNever, ) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() # client schould send a ClientGet self.assertHasNextMessage(consts.Message.ClientGet) # check if our request was registered - requests = self.fcpClient.getRequests() + requests = self.client.getRequests() self.failUnless(len(requests) == 1) # now respond with a ProtocolError @@ -2183,10 +2413,10 @@ ) # client schould send no messages and trigger a RequestFailed event - self.assertHasNextEvent(self.fcpClient.events.RequestFailed) + self.assertHasNextEvent(self.client.events.RequestFailed) # request should have been removed - self.failIf(self.fcpClient.getRequests()) + self.failIf(self.client.getRequests()) self.assertHasNextEvent(None) self.assertHasNextMessage(None) @@ -2209,11 +2439,11 @@ URI=myKey, Persistence=consts.Persistence.Connection, ) - self.fcpClient._registerRequest(msg, consts.RequestType.PutData) + self.client._registerRequest(msg, consts.RequestType.PutData) myIdentifier = msg['Identifier'] - requestsAll = self.fcpClient.getRequests() + requestsAll = self.client.getRequests() - newIdentifier = self.fcpClient.resendRequest(msg) + newIdentifier = self.client.resendRequest(msg) self.failIf(myIdentifier in requestsAll) self.failUnless(newIdentifier in requestsAll) @@ -2229,12 +2459,12 @@ URI=myKey + '/foo', Persistence=consts.Persistence.Connection, ) - self.fcpClient._registerRequest(msg, consts.RequestType.PutData) + self.client._registerRequest(msg, consts.RequestType.PutData) msg['PrivateKey'] = myKey myIdentifier = msg['Identifier'] - requestsAll = self.fcpClient.getRequests() + requestsAll = self.client.getRequests() - newIdentifier = self.fcpClient.resendRequest(msg) + newIdentifier = self.client.resendRequest(msg) self.failIf(myIdentifier in requestsAll) self.failUnless(newIdentifier in requestsAll) @@ -2251,12 +2481,12 @@ URI=myKey + '/foo/0', Persistence=consts.Persistence.Connection, ) - self.fcpClient._registerRequest(msg, consts.RequestType.PutData) + self.client._registerRequest(msg, consts.RequestType.PutData) msg['PrivateKey'] = myKey myIdentifier = msg['Identifier'] - requestsAll = self.fcpClient.getRequests() + requestsAll = self.client.getRequests() - newIdentifier = self.fcpClient.resendRequest(msg) + newIdentifier = self.client.resendRequest(msg) self.failIf(myIdentifier in requestsAll) self.failUnless(newIdentifier in requestsAll) @@ -2272,12 +2502,12 @@ URI=myKey, Persistence=consts.Persistence.Connection, ) - self.fcpClient._registerRequest(msg, consts.RequestType.PutData) + self.client._registerRequest(msg, consts.RequestType.PutData) msg['PrivateKey'] = myKey myIdentifier = msg['Identifier'] - requestsAll = self.fcpClient.getRequests() + requestsAll = self.client.getRequests() - newIdentifier = self.fcpClient.resendRequest(msg) + newIdentifier = self.client.resendRequest(msg) self.failIf(myIdentifier in requestsAll) self.failUnless(newIdentifier in requestsAll) @@ -2312,9 +2542,9 @@ def testGet_8000_PluginInfo_Success(self): - myIdentifier = self.fcpClient.getPluginInfo('hi there') - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myIdentifier = self.client.getPluginInfo('hi there') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.failUnless(myIdentifier in requestsAll) self.assertHasNextMessage( @@ -2330,7 +2560,7 @@ ) msg = self.assertHasNextEvent( - self.fcpClient.events.PluginInfo, + self.client.events.PluginInfo, consts.Message.GetPluginInfo, ('Identifier', myIdentifier), ('PluginName', 'hi there'), @@ -2351,9 +2581,9 @@ def test_8001_GetPluginInfo_Failure(self): - myIdentifier = self.fcpClient.getPluginInfo('hi there') - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myIdentifier = self.client.getPluginInfo('hi there') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.failUnless(myIdentifier in requestsAll) self.assertHasNextMessage( @@ -2369,7 +2599,7 @@ ) msg = self.assertHasNextEvent( - self.fcpClient.events.PluginInfoFailed, + self.client.events.PluginInfoFailed, consts.Message.GetPluginInfo, #('PluginName', 'hi there'), ('Identifier', myIdentifier), @@ -2391,8 +2621,8 @@ def test_8002_SendPluginMessage_Success(self): myIdentifier = '123456789' - myRequest = self.fcpClient.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) + requestsAll = self.client.getRequests() self.failIf(myIdentifier in requestsAll) self.assertHasNextMessage( @@ -2410,7 +2640,7 @@ ) msg = self.assertHasNextEvent( - self.fcpClient.events.PluginMessage, + self.client.events.PluginMessage, consts.Message.FCPPluginReply, ('PluginName', 'hi there'), ('Identifier', myIdentifier), @@ -2425,8 +2655,8 @@ def test_8003_GetSendPluginMessage_Failure(self): myIdentifier = '1234567889' - myRequest = self.fcpClient.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) + requestsAll = self.client.getRequests() self.failIf(myIdentifier in requestsAll) self.assertHasNextMessage( @@ -2443,7 +2673,7 @@ ) msg = self.assertHasNextEvent( - self.fcpClient.events.ProtocolError, + self.client.events.ProtocolError, consts.Message.ProtocolError, ('Identifier', myIdentifier), ) @@ -2457,8 +2687,8 @@ def test_8003_GetSendPluginMessage_Identifiercollision(self): myIdentifier = '1234567889' - myRequest = self.fcpClient.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) - requestsAll = self.fcpClient.getRequests() + myRequest = self.client.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) + requestsAll = self.client.getRequests() self.failIf(myIdentifier in requestsAll) self.assertHasNextMessage( @@ -2474,7 +2704,7 @@ ) msg = self.assertHasNextEvent( - self.fcpClient.events.IdentifierCollision, + self.client.events.IdentifierCollision, consts.Message.IdentifierCollision, ('Identifier', myIdentifier), ) @@ -2495,9 +2725,9 @@ class TestGenerateKeypair(BaseTestClient): def test_10000_GeberateSSKKeypair(self): - myIdentifier = self.fcpClient.generateKeypair(consts.KeyType.SSK) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myIdentifier = self.client.generateKeypair(consts.KeyType.SSK) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.GenerateSSK) self.sendResponseMessage( @@ -2508,7 +2738,7 @@ ) msg = self.assertHasNextEvent( - self.fcpClient.events.KeypairGenerated, + self.client.events.KeypairGenerated, consts.Message.GenerateSSK, ('Identifier', myIdentifier), ('PublicKey','SSK@public'), @@ -2527,9 +2757,9 @@ def test_10001_GeberateUSKKeypair(self): - myIdentifier = self.fcpClient.generateKeypair(consts.KeyType.USK) - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myIdentifier = self.client.generateKeypair(consts.KeyType.USK) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.assertHasNextMessage(consts.Message.GenerateSSK) self.sendResponseMessage( @@ -2540,7 +2770,7 @@ ) msg = self.assertHasNextEvent( - self.fcpClient.events.KeypairGenerated, + self.client.events.KeypairGenerated, consts.Message.GenerateSSK, ('Identifier', myIdentifier), ('PublicKey','USK@public'), @@ -2566,9 +2796,9 @@ def test_11000_Subscribe(self): - myIdentifier = self.fcpClient.subscribeUSK('arbitrary') - myRequest = self.fcpClient.getRequest(myIdentifier) - requestsAll = self.fcpClient.getRequests() + myIdentifier = self.client.subscribeUSK('arbitrary') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() self.failUnless(myIdentifier in requestsAll) self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.Completed) @@ -2582,7 +2812,7 @@ ) msg = self.assertHasNextEvent( - self.fcpClient.events.USKUpdated, + self.client.events.USKUpdated, consts.Message.SubscribedUSKUpdate, ('Identifier', myIdentifier), ('Edition', 99), @@ -2608,6 +2838,17 @@ Test_iterConnect, Test_CloseConnectionDuplicateClientName, Test_closeNode, + Test_get_setConnectionName, + Test_get_setDebugVerbosity, + Test_startNode, + Test_versionCheckNodeHello, + Test_handleMessage, + Test_next, + Test_run, + Test_sendMessage, + Test_getConfig, + Test_modifyConfig, + #TestDisconnectReason, #TestClientGet, #TestClientPut, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-11 01:03:28
|
Revision: 361 http://fclient.svn.sourceforge.net/fclient/?rev=361&view=rev Author: jUrner Date: 2008-03-10 18:03:34 -0700 (Mon, 10 Mar 2008) Log Message: ----------- adapts Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/dummy_io.py Modified: trunk/sandbox/fcp2/test_fcp/dummy_io.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/dummy_io.py 2008-03-11 01:03:20 UTC (rev 360) +++ trunk/sandbox/fcp2/test_fcp/dummy_io.py 2008-03-11 01:03:34 UTC (rev 361) @@ -33,30 +33,30 @@ def connect(self, **kwargs): if not self._allowConnect: - raise iohandler.IOConnectFailed('Refused') + raise iohandler.IOHandler.IOConnectFailed('Refused') self._isOpen = True def read(self, n): if self._isBroken: - raise iohandler.IOBroken('Broken') + raise iohandler.IOHandler.IOBroken('Broken') if not self.isOpen(): - raise iohandler.IOClosed('Closed') + raise iohandler.IOHandler.IOClosed('Closed') if self._reverseDirection: if not self.writeBuffer: - raise iohandler.IOTimeout('Timeout') + raise iohandler.IOHandler.IOTimeout('Timeout') bytes, self.writeBuffer = self.writeBuffer[ :n], self.writeBuffer[n: ] else: if not self.readBuffer: - raise iohandler.IOTimeout('Timeout') + raise iohandler.IOHandler.IOTimeout('Timeout') bytes, self.readBuffer = self.readBuffer[ :n], self.readBuffer[n: ] return bytes def write(self, bytes): if self._isBroken: - raise iohandler.IOBroken('Broken') + raise iohandler.IOHandler.IOBroken('Broken') if not self.isOpen(): - raise iohandler.IOClosed('Closed') + raise iohandler.IOHandler.IOClosed('Closed') self.writeBuffer += bytes def close(self): @@ -68,7 +68,7 @@ self.readBuffer = '' self.writeBuffer = '' else: - raise iohandler.IOClosed('Closed') + raise iohandler.IOHandler.IOClosed('Closed') def isOpen(self): return self._isOpen This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-11 01:03:15
|
Revision: 360 http://fclient.svn.sourceforge.net/fclient/?rev=360&view=rev Author: jUrner Date: 2008-03-10 18:03:20 -0700 (Mon, 10 Mar 2008) Log Message: ----------- no longer needed Removed Paths: ------------- trunk/sandbox/fcp2/fcparams.py Deleted: trunk/sandbox/fcp2/fcparams.py =================================================================== --- trunk/sandbox/fcp2/fcparams.py 2008-03-11 01:02:55 UTC (rev 359) +++ trunk/sandbox/fcp2/fcparams.py 2008-03-11 01:03:20 UTC (rev 360) @@ -1,144 +0,0 @@ -"""Handling of additional persistent parameters for requests""" - -import sys, os -import base64 -import time - -#--> rel import hack -class _RelImportHack(object): - def __init__(self, n): - fpath = os.path.abspath(__file__) - for i in xrange(n): fpath = os.path.dirname(fpath) - sys.path.insert(0, fpath) - def __del__(self): sys.path.pop(0) -hack = _RelImportHack(2) - -from fcp2.fcp_lib import uuid - - -del hack -#<-- rel import hack -#********************************************************************************************* -# -#********************************************************************************************* -def validateFcpBool(value): - if value in ('true', 'false'): - return str(value) - return None - -def validateFloat(value): - try: - return float(value) - except ValueError: - return None - -def validateInt(value): - try: - return int(value) - except ValueError: - return None - -def validateString(value): - try: - return str(value) - except UnicodeEncodeError: - return None - -def validateUuid(value): - result = uuid.UUID_EXACT_MATCH_PAT.match(value) - if result: - return str(result.group(0)) - return None - -#********************************************************************************************* -# -#********************************************************************************************* -FcParamsSep = '\x01' -MAGIC = '{8a7808d0-3934-465a-b1b4-b7150ed109a5}' # magic string to identify our requests - -FcParams = ( - ('RequestType', validateInt), - ('InitTime', validateFloat), # can not take it from uuid cos requests may be resend multiple times - ('FilenameCollision', validateInt), - ('PersistentUserData', validateString), - ) - -IRequestType = 0 -IInitTime = 1 -IFilenameCollision = 2 -IPersistentUserData = 3 - -def paramsFromRequest(msg): - """Extracts fclient parameters from the identifier of a request - @param msg: message to extract the parameters from - @return: (list) parameters or None if something went wrong - - """ - userData = msg.get('ClientToken', None) - if userData is None: - return None - - params = userData.split(FcParamsSep) - if len(params) != len(FcParams) +1: - return None - - # validate and drop our magic string - uuid_ = params.pop(0) - result = validateUuid(uuid_) - if result is None: - return None - if result != MAGIC: - return None - - for i, (paramName, paramValidator) in enumerate(FcParams): - result = paramValidator(params[i]) - if result is None: - return None - params[i] = result - - # decode user data - try: - params[IPersistentUserData] = base64.b64decode(params[IPersistentUserData]) - except TypeError: - return None - - return params - - -def messageToParams(msg): - """Generates fc params from a message - @param msg: message to create the identifier from - @return: (str) params - - """ - params = [] - for paramName, paramValidator in FcParams: - params.append( str(msg[paramName]) ) - - # encode user data - params[IPersistentUserData] = base64.b64encode(params[IPersistentUserData]) - params.insert(0, MAGIC) - - return FcParamsSep.join(params) - - -def newUuid(uuids=None): - """Creates a new unique identifier - @param uuids: if desired any iterable containing uuids to enshure the identifier is unique in the iterable - @return: (str) uuid - - """ - uuid_ = uuid.uuid_time() - if uuids is not None: - while uuid_ in uuids: - uuid_ = uuid_time() - return uuid_ - -#********************************************************************************* -# -#********************************************************************************* -if __name__ == '__main__2': - import doctest - doctest.testmod() - - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-11 01:02:50
|
Revision: 359 http://fclient.svn.sourceforge.net/fclient/?rev=359&view=rev Author: jUrner Date: 2008-03-10 18:02:55 -0700 (Mon, 10 Mar 2008) Log Message: ----------- a few fixes Modified Paths: -------------- trunk/sandbox/fcp2/message.py Modified: trunk/sandbox/fcp2/message.py =================================================================== --- trunk/sandbox/fcp2/message.py 2008-03-11 01:02:27 UTC (rev 358) +++ trunk/sandbox/fcp2/message.py 2008-03-11 01:02:55 UTC (rev 359) @@ -145,6 +145,12 @@ return '\n'.join(out) + + + def updatePersistentParams(self): + pass + + #TODO: # 1. if one setter / getter fails no setter / getter result should assumed to be valid # 2. log errors @@ -679,7 +685,7 @@ return True def updatePersistentParams(self): - self['ClientToken'] = MessageBase.getPersistentParams(self) + self['ClientToken'] = MessageBase._getPersistentParams(self) class ClientPutComplexDir(ClientPut): @@ -799,6 +805,7 @@ 'WithLongDescription': types.FcpTypeBool, 'WithShortDescription': types.FcpTypeBool, 'WithSortOrder': types.FcpTypeBool, + 'WithDataTypes': types.FcpTypeBool, } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-11 01:02:24
|
Revision: 358 http://fclient.svn.sourceforge.net/fclient/?rev=358&view=rev Author: jUrner Date: 2008-03-10 18:02:27 -0700 (Mon, 10 Mar 2008) Log Message: ----------- moved exceptions ti IOHandler for easier access Modified Paths: -------------- trunk/sandbox/fcp2/iohandler.py Modified: trunk/sandbox/fcp2/iohandler.py =================================================================== --- trunk/sandbox/fcp2/iohandler.py 2008-03-11 01:01:33 UTC (rev 357) +++ trunk/sandbox/fcp2/iohandler.py 2008-03-11 01:02:27 UTC (rev 358) @@ -32,22 +32,6 @@ #***************************************************************************** # #***************************************************************************** -class MessageParseError(Exception): - """Exception raised when a message could not be parsed succesfuly""" - -class IOConnectFailed(Exception): - """Exception raised if the object can not be connected""" - -class IOClosed(Exception): - """Exception raised if the object is closed""" - -class IOBroken(Exception): - """Exception raised if the IO connection is broken""" - -class IOTimeout(Exception): - """Exception raised when the io connection is closed""" - - class IOObjectBase(object): """Base class for io objects @@ -70,7 +54,7 @@ @return: always None @raise L{IOConnectFailed}: in case something goes wrong """ - raise IOConnectFailed('Failed') + raise IOHandler.IOConnectFailed('Failed') def read(self, n): """Should read n bytes from the device @@ -79,7 +63,7 @@ @raise L{IOBroken}: in case something goes wrong @raise L{IOTimeout}: if the read operation times out """ - raise IOBroken('Broken') + raise OHandler.IOBroken('Broken') def write(self, bytes): """Should write bytes to the device @@ -87,7 +71,7 @@ @return: always None @raise L{IOBroken}: in case something goes wrong """ - raise IOBroken('Broken') + raise OHandler.IOBroken('Broken') def close(self): """Should close the io device @@ -95,7 +79,7 @@ @return: always None @raise L{IOClosed}: if the device is already closed """ - raise IOClosed('Closed') + raise OHandler.IOClosed('Closed') def isOpen(self): """Should check if the device is open @@ -137,7 +121,7 @@ try: self.socket.connect((host, port)) except socket.error, details: - raise IOConnectFailed(details) + raise IOHandler.IOConnectFailed(details) def read(self, n): try: @@ -145,10 +129,10 @@ if p == '': raise socket.error('Socket closed by host') except socket.timeout, details: - raise IOTimeout(details) + raise IOHandler.IOTimeout(details) except socket.error, details: self.close() - raise IOBroken(details) + raise IOHandler.IOBroken(details) else: return p @@ -157,11 +141,11 @@ self.socket.sendall(bytes) except socket.error, details: self.close() - raise IOBroken(details) + raise IOHandler.IOBroken(details) def close(self): if self.socket is None: - raise IOClosed('Closed') + raise IOHandler.IOClosed('Closed') self.socket.close() self.socket = None @@ -178,6 +162,23 @@ """Handles message io """ + class MessageParseError(Exception): + """Exception raised when a message could not be parsed succesfuly""" + + class IOConnectFailed(Exception): + """Exception raised if the object can not be connected""" + + class IOClosed(Exception): + """Exception raised if the object is closed""" + + class IOBroken(Exception): + """Exception raised if the IO connection is broken""" + + class IOTimeout(Exception): + """Exception raised when the io connection is closed""" + + + TerminatorEndMessage = '\nEndMessage\n' TerminatorData = '\nData\n' @@ -227,8 +228,8 @@ yield False # have to yield at least once to make unittests work (io has to be created!!) try: self.io.connect(**kwargs) - except IOConnectFailed, details: - self._log.info(consts.LogMessages.ConnectingFailed + ' %s %s' % (IOConnectFailed, details)) + except self.IOConnectFailed, details: + self._log.info(consts.LogMessages.ConnectingFailed + ' %s %s' % (self.IOConnectFailed, details)) yield False else: self.io.setTimeout(self.io.Timeout) @@ -273,14 +274,14 @@ if not p: raise ValueError('No bytes received and IO did not raise as expected?!?') self._receiveBuffer += p - except IOBroken, details: + except self.IOBroken, details: self._log.critical(consts.LogMessages.SocketDied) self.close() - raise IOBroken(details) - except IOTimeout, details: # nothing in the queue - raise IOTimeout(details) + raise self.IOBroken(details) + except self.IOTimeout, details: # nothing in the queue + raise self.IOTimeout(details) except Exception, details: - self._log.critical(consts.LogMessages.CaughtException + '\n' + traceback.traceback.format_exc()) + self._log.critical(consts.LogMessages.CaughtException + '\n' + traceback.format_exc()) self.close() raise Exception(details) @@ -317,7 +318,7 @@ p = [i for i in chunk.split('\n') if i] # Fcp ignores empty lines, so do we p.pop() if not p: - raise MessageParseError('No message name present') + raise self.MessageParseError('No message name present') msgName = p.pop(0) msgClass = message.MessagesAll.get(msgName, None) if msgClass is None: @@ -328,7 +329,7 @@ # process param --> value fields params = dict([line.split('=', 1) for line in p]) if not msg._restoreParams(params): - raise MessageParseError('Invalid message parameters') + raise self.MessageParseError('Invalid message parameters') # get associated data if necessary if mayHaveData: @@ -351,19 +352,8 @@ return msg - def sendMessage(self, name, data=None, **params): + def sendMessage(self, msg): """Sends a message to freenet - @param name: name of the message to send - @param data: data to atatch to the message - @param params: {para-name: param-calue, ...} of parameters to pass along - with the message (see freenet protocol) - @raise L{IOBroken}: if the connection to the io dies unexpectedly - """ - return self.sendMessageEx(message.Message(name, data=data, **params)) - - - def sendMessageEx(self, msg): - """Sends a message to freenet @param msg: (Message) message to send @return: Message @raise L{IOBroken}: if the connection to the io dies unexpectedly @@ -371,12 +361,12 @@ self._log.debug(consts.LogMessages.Sending + msg.pprint()) try: self.io.write(msg.toString()) - except IOBroken, details: + except self.IOBroken, details: self._log.critical(consts.LogMessages.SocketDied) self.close() - raise IOBroken(details) + raise self.IOBroken(details) except Exception, details: - self._log.critical(consts.LogMessages.CaughtException + '\n' + traceback.traceback.format_exc()) + self._log.critical(consts.LogMessages.CaughtException + '\n' + traceback.format_exc()) self.close() raise Exception(details) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-11 01:01:28
|
Revision: 357 http://fclient.svn.sourceforge.net/fclient/?rev=357&view=rev Author: jUrner Date: 2008-03-10 18:01:33 -0700 (Mon, 10 Mar 2008) Log Message: ----------- a few fixes Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-03-10 13:03:53 UTC (rev 356) +++ trunk/sandbox/fcp2/client.py 2008-03-11 01:01:33 UTC (rev 357) @@ -206,7 +206,6 @@ from fcp2 import consts from fcp2 import config from fcp2 import events -from fcp2 import fcparams from fcp2 import message from fcp2 import iohandler from fcp2 import types @@ -254,7 +253,6 @@ consts = consts config = config message = message - fcparams = fcparams types = types key = key @@ -529,14 +527,14 @@ self._close(disconnectMsg) raise StopIteration - + #TESTED def getConnectionName(self): """Returns the connection name used by the client @return: (str) connection name """ return self._connectionName - - + + #TESTED def setConnectionName(self, connectionName=None): """Sets the connection name to be used by the client @param connectionName: (str) connection name or None to use an arbitrary connection name @@ -544,17 +542,26 @@ """ self._connectionName = self._newUuid() if connectionName is None else connectionName return self._connectionName + + #TESTED + def getDebugVerbosity(self): + """Returns the current verbosity level of the client + @return: L{consts.DebugVerbosity} + """ + for logger in self._loggers.values(): + return logger.getEffectiveLevel() - + #TESTED def setDebugVerbosity(self, debugVerbosity): """Sets the verbosity level of the client - @note: see L{consts.DebugVerbosity} + @param debugVerbosity: L{consts.DebugVerbosity} """ for logger in self._loggers.values(): logger.setLevel(debugVerbosity) self.ioHandler.setDebugVerbosity(debugVerbosity) + #TESTED def startNode(self, cmdline): """Starts the freenet node @param cmdline: commandline to start freenet (like '/freenet/run.sh start' or 'c:\freenet\start.bat') @@ -571,7 +578,7 @@ stdout, stderr = p.communicate() return stdout - + #TESTED def versionCheckNodeHello(self, nodeHelloMessage): """Performa a version check of the client against the specified NodeHello message @return: (bool) True if version is ok, False otherwise @@ -588,13 +595,14 @@ ## runtime related methods ## ######################################################### + #TESTED def handleMessage(self, msg): """Handles a message from the freenet node @param msg: (Message) to handle @return: True if the message was handled, False otherwise """ - CancelPersistentRequests = 0 # for testing... if True, cancels all PersistentRequests + CancelPersistentRequests = 1 # for testing... if True, cancels all PersistentRequests # check if we have an initial request corrosponding to msg requestIdentifier = msg.get('Identifier', None) @@ -865,6 +873,15 @@ # unknown request... try to restore it if initialRequest is None: + if CancelPersistentRequests: + self.sendMessage( + message.RemovePersistentRequest( + Identifier=msg['Identifier'], + Global=msg['Global'], + ) + ) + return True + #NOTE: there is no distinction between ClientPutDiskDir and ClientPutComplexDir # so a bit of additional work here requestType = msg['RequestType'] @@ -1095,7 +1112,7 @@ # default return False - + #TESTED def next(self, dispatch=True): """Pumps the next message waiting @param dispatch: if True the message is dispatched to L{handleMessage} @@ -1104,22 +1121,22 @@ """ try: msg = self.ioHandler.readMessage() - except iohandler.IOTimeout, details: + except self.ioHandler.IOTimeout, details: msg = message.ClientSocketTimeout() if dispatch: self.events.Idle(msg) - except iohandler.IOBroken, details: + except self.ioHandler.IOBroken, details: msg = message.ClientDisconnected( DisconnectReason=consts.DisconnectReason.ConnectionDied, ) self._close(msg) - raise iohandler.IOBroken(details) + raise self.ioHandler.IOBroken(details) else: if dispatch: self.handleMessage(msg) return msg - + #TESTED def run(self): """Runs the client unconditionally untill all requests have completed @note: a KeyboardInterrupt will stop the client @@ -1162,7 +1179,7 @@ if msg == message.ClientSocketDied: break - + #TESTED def sendMessage(self, msg): """Sends a message to freenet @param msg: (L{message.Message}) message to send @@ -1178,19 +1195,20 @@ # if socket dies on sendall ther is no way to determine if and how much data was send # ...so assume data was send, cos there is no way to proove it was not send try: - self.ioHandler.sendMessageEx(msg) - except iohandler.IOBroken, details: + self.ioHandler.sendMessage(msg) + except self.ioHandler.IOBroken, details: errorMsg = message.ClientDisconnected( DisconnectReason=consts.DisconnectReason.ConnectionDied, ) self._close(errorMsg) - raise iohandler.IOBroken(details) + raise self.ioHandler.IOBroken(details) ######################################################### ## ## config related methods ## ######################################################### + #TESTED def getConfig(self, withCurrent=True, withDefaults=True, @@ -1218,6 +1236,7 @@ ) + #TESTED def modifyConfig(self, params): """Modifies node configuration values @param params: (dict) containing parameters to modify @@ -1225,8 +1244,7 @@ msg = message.ModifyConfig() msg.params = params self.sendMessage(msg) - - + ######################################################## ## ## ClientGet related methods @@ -1573,7 +1591,6 @@ data = '' for n, item in enumerate(items): - n += 10 requestType = item.get('RequestType', None) if requestType is None: raise ValueError('No request type specified for item: %s' % n) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-10 13:03:49
|
Revision: 356 http://fclient.svn.sourceforge.net/fclient/?rev=356&view=rev Author: jUrner Date: 2008-03-10 06:03:53 -0700 (Mon, 10 Mar 2008) Log Message: ----------- io was broken. fixed now Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/dummy_io.py Modified: trunk/sandbox/fcp2/test_fcp/dummy_io.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/dummy_io.py 2008-03-10 13:03:44 UTC (rev 355) +++ trunk/sandbox/fcp2/test_fcp/dummy_io.py 2008-03-10 13:03:53 UTC (rev 356) @@ -22,7 +22,7 @@ #******************************************************************** class DummyIO(iohandler.IOObjectBase): - def __init__(self, **kwargs): + def __init__(self): self.readBuffer = '' # buffer client reads from self.writeBuffer = '' # buffer client writes to @@ -60,7 +60,9 @@ self.writeBuffer += bytes def close(self): - self.reset() + self._isBroken = False + self._allowConnect = True + self._reverseDirection = False if self.isOpen(): self._isOpen = False self.readBuffer = '' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-10 13:03:41
|
Revision: 355 http://fclient.svn.sourceforge.net/fclient/?rev=355&view=rev Author: jUrner Date: 2008-03-10 06:03:44 -0700 (Mon, 10 Mar 2008) Log Message: ----------- some fixes for mesages Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-03-10 13:03:35 UTC (rev 354) +++ trunk/sandbox/fcp2/client.py 2008-03-10 13:03:44 UTC (rev 355) @@ -379,7 +379,7 @@ @return: (str) identifer of therequest @note: the identifier returned is unique to the client but may not be unique to the node """ - identifier = self.newUuid(uuids=self._requests) if identifier is None else identifier + identifier = self._newUuid(uuids=self._requests) if identifier is None else identifier # equip requests with some additional params @@ -865,27 +865,19 @@ # unknown request... try to restore it if initialRequest is None: - #FIXME: PutComplexDir??? - if msg == message.PersistentGet: + #NOTE: there is no distinction between ClientPutDiskDir and ClientPutComplexDir + # so a bit of additional work here + requestType = msg['RequestType'] + if requestType & consts.RequestType.MaskGet: initialRequest = message.ClientGet() - elif msg == message.PersistentPut: + elif requestType == consts.RequestType.PutMultiple: + initialRequest = message.ClientPutComplexDir() + elif requestType == consts.RequestType.PutDir: + initialRequest = message.ClientPutdiskDir() + else: initialRequest = message.ClientPut() - elif msg == message.PersistentPutDir: - initialRequest = message.ClientPutDiskDir() - - initialRequest.params.update(msg.params) - result = initialRequest.restorePersistentParams() - if not result or CancelPersistentRequests: - if not result: - self._loggers['Runtime'].critical(consts.LogMessages.InvalidPersistentParams) - self.sendMessage( - message.RemovePersistentRequest( - Identifier=requestIdentifier, - Global=msg['Global'], - ) - ) - return True + initialRequest.params.update(msg.params) self._requests[initialRequest['Identifier']] = initialRequest #FIX: remove Started param from PersistentGet / Put @@ -1581,6 +1573,7 @@ data = '' for n, item in enumerate(items): + n += 10 requestType = item.get('RequestType', None) if requestType is None: raise ValueError('No request type specified for item: %s' % n) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-10 13:03:35
|
Revision: 354 http://fclient.svn.sourceforge.net/fclient/?rev=354&view=rev Author: jUrner Date: 2008-03-10 06:03:35 -0700 (Mon, 10 Mar 2008) Log Message: ----------- some fixes for mesages Modified Paths: -------------- trunk/sandbox/fcp2/iohandler.py Modified: trunk/sandbox/fcp2/iohandler.py =================================================================== --- trunk/sandbox/fcp2/iohandler.py 2008-03-10 13:03:23 UTC (rev 353) +++ trunk/sandbox/fcp2/iohandler.py 2008-03-10 13:03:35 UTC (rev 354) @@ -60,13 +60,13 @@ BufferSize = 4096 def __init__(self, **kwargs): + """ """ - @param kwargs: any additional keyword arguments passed to L{IOHandler.connect} - """ def connect(self, **kwargs): """Should connect to the io device + @param kwargs: any additional keyword arguments passed to L{IOHandler.connect} @return: always None @raise L{IOConnectFailed}: in case something goes wrong """ @@ -223,7 +223,7 @@ self.close() self._log.info(consts.LogMessages.Connecting + ' %r' % kwargs) - self.io = self._ioPrototype(**kwargs) + self.io = self._ioPrototype() yield False # have to yield at least once to make unittests work (io has to be created!!) try: self.io.connect(**kwargs) @@ -283,9 +283,8 @@ self._log.critical(consts.LogMessages.CaughtException + '\n' + traceback.traceback.format_exc()) self.close() raise Exception(details) + - - def readMessage(self): """Reads the next message from io device @return: (Message) next message from the socket @@ -299,7 +298,7 @@ # node end with "Data" if data is passed. Alternative would be to check for both # and rely on the 'DataLength' member to indicate if data is included. This # should work for all messages except 'DataFound' - hasData = False + mayHaveData = False eof = -1 while eof < 0: eof = self._receiveBuffer.find(self.TerminatorEndMessage) @@ -309,7 +308,7 @@ eof = self._receiveBuffer.find(self.TerminatorData) if eof > -1: eof += len(self.TerminatorData) - hasData = True + mayHaveData = True if eof < 0: self.readBytes(self.io.BufferSize) @@ -318,52 +317,25 @@ p = [i for i in chunk.split('\n') if i] # Fcp ignores empty lines, so do we p.pop() if not p: - raise MessageParseError('Missing message name') + raise MessageParseError('No message name present') msgName = p.pop(0) msgClass = message.MessagesAll.get(msgName, None) - # TODO: log? if msgClass is None: self._log.debug(consts.LogMessages.CreatingNewMessageType + ' "%s"' % msgClassname) msgClass = message.newMessageType(msgName) msg = msgClass() # process param --> value fields - # - #NOTE:usually if data is passed DataLength determines how much have to handle - # special case ClientPutComplexDir where it is passed in Files.(N).DataLength. - # Additionally Files.(N).DataLength is converted to int here. - clientPutComplexDirDataLength = 0 - isClientPutComplexDir = msgName == consts.Message.ClientPutComplexDir - for line in p: - paramName, sep, paramValue = line.partition('=') - - # covert fcp to python value if necessary - paramType = msg._param_types_.get(paramName, None) - if paramType is not None: - paramValue = paramType.fcpToPython(paramValue) - msg[paramName] = paramValue - - #TODO: move to message.ClientPutComplexDir - - # handle special case PutComplexDir - if isClientPutComplexDir: - tmp_paramName = paramName.split('.') - if len(tmp_paramName) == 3: - if tmp_paramName[-1] == 'DataLength': - n = types.FcpTypeInt.fcpToPython(paramValue) - clientPutComplexDirDataLength += n - msg[paramName] = n - + params = dict([line.split('=', 1) for line in p]) + if not msg._restoreParams(params): + raise MessageParseError('Invalid message parameters') + # get associated data if necessary - if hasData: - if isClientPutComplexDir: - n = clientPutComplexDirDataLength - else: - # make shure DataLength is int, otherwise we might loop here forever - try: - n = int(msg['DataLength']) - except ValueError: - raise MessageParseError('DataLength param must be type(int)') + if mayHaveData: + n = msg._getDataLength() + if not isinstance(n, (int, long)): + raise ValueError('DataLength must be type(int)') + if n > 0: while self._receiveBuffer: if len(self._receiveBuffer) >= n: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-10 13:03:22
|
Revision: 353 http://fclient.svn.sourceforge.net/fclient/?rev=353&view=rev Author: jUrner Date: 2008-03-10 06:03:23 -0700 (Mon, 10 Mar 2008) Log Message: ----------- some fixes for mesages ++ getting tired working around the messed up protocol Modified Paths: -------------- trunk/sandbox/fcp2/message.py Modified: trunk/sandbox/fcp2/message.py =================================================================== --- trunk/sandbox/fcp2/message.py 2008-03-09 12:56:43 UTC (rev 352) +++ trunk/sandbox/fcp2/message.py 2008-03-10 13:03:23 UTC (rev 353) @@ -150,7 +150,7 @@ # 2. log errors # # - def setPersistentParams(self, persistentData): + def _setPersistentParams(self, persistentData): params = persistentData.split(PersistentParamsSep) if len(params) > len(self._persistent_params_): raise ValueError('Too many parameters in data') @@ -160,7 +160,7 @@ setter(self, params[n]) - def getPersistentParams(self): + def _getPersistentParams(self): out = [] for n, (getter, setter) in enumerate(self._persistent_params_): #TODO: check if PersistentParamsSep is in data returned @@ -168,6 +168,19 @@ return PersistentParamsSep.join(out) + def _restoreParams(self, params): + for paramName, paramValue in params.items(): + paramType = self._param_types_.get(paramName, None) + if paramType is not None: + paramValue = paramType.fcpToPython(paramValue) + self[paramName] = paramValue + return True + + + def _getDataLength(self): + return 0 + + #*************************************************************************************** # # param types for config message @@ -617,16 +630,17 @@ 'Verbosity': types.FcpTypeInt, } - def restorePersistentParams(self): + def _restoreParams(self, params): + MessageBase._restoreParams(self, params) try: - MessageBase.setPersistentParams(self, self['ClientToken']) + MessageBase._setPersistentParams(self, self['ClientToken']) except Exception, d: #print Exception, d return False return True def updatePersistentParams(self): - self['ClientToken'] = MessageBase.getPersistentParams(self) + self['ClientToken'] = MessageBase._getPersistentParams(self) class ClientHello(MessageBase): @@ -652,13 +666,18 @@ 'Verbosity': types.FcpTypeInt, } - def restorePersistentParams(self): + def _getDataLength(self): + return self['DataLength'] + + def _restoreParams(self, params): + MessageBase._restoreParams(self, params) try: - MessageBase.setPersistentParams(self, self['ClientToken']) + MessageBase._setPersistentParams(self, self['ClientToken']) except Exception, d: + #print Exception, d return False return True - + def updatePersistentParams(self): self['ClientToken'] = MessageBase.getPersistentParams(self) @@ -666,6 +685,29 @@ class ClientPutComplexDir(ClientPut): name = consts.Message.ClientPutComplexDir + + def __init__(self, *args, **kwargs): + ClientPut.__init__(self, *args, **kwargs) + self._dataLength = 0 + + + def _restoreParams(self, params): + result = ClientPut._restoreParams(self, params) + + for paramName, paramValue in self.params.items(): + tmp_paramName = paramName.split('.') + if len(tmp_paramName) == 3: + if tmp_paramName[-1] == 'DataLength': + n = types.FcpTypeInt.fcpToPython(paramValue) + self._dataLength += n + self[paramName] = n + return result + + + def _getDataLength(self): + return self._dataLength + + class ClientPutDiskDir(ClientPut): name = consts.Message.ClientPutDiskDir @@ -1022,26 +1064,64 @@ class PersistentGet(MessageBase): name = consts.Message.PersistentGet _additional_params_ = {} - _param_types_ = { - } + _persistent_params_ = PersistentParamsGet + _param_types_ = ClientGet._param_types_.copy() + _param_types_['Started'] = types.FcpTypeBool + + def _restoreParams(self, params): + MessageBase._restoreParams(self, params) + try: + MessageBase._setPersistentParams(self, self['ClientToken']) + except Exception, d: + #print Exception, d + return False + return True - ####################################### ####################################### class PersistentPut(MessageBase): name = consts.Message.PersistentPut - _additional_params_ = {} - _param_types_ = { - } + _additional_params_ = AdditionalPutParams + _persistent_params_ = PersistentParamsPut + _param_types_ = ClientPut._param_types_.copy() + _param_types_['Started'] = types.FcpTypeBool + def _restoreParams(self, params): + MessageBase._restoreParams(self, params) + try: + MessageBase._setPersistentParams(self, self['ClientToken']) + except Exception, d: + #print Exception, d + return False + return True + class PersistentPutDir(MessageBase): name = consts.Message.PersistentPutDir - _additional_params_ = {} - _param_types_ = { - } + _additional_params_ = AdditionalPutParams + _persistent_params_ = PersistentParamsPut + _param_types_ = ClientPutDiskDir._param_types_.copy() + _param_types_['Started'] = types.FcpTypeBool + + + def _restoreParams(self, params): + MessageBase._restoreParams(self, params) + for paramName, paramValue in self.params.items(): + tmp_paramName = paramName.split('.') + if len(tmp_paramName) == 3: + if tmp_paramName[-1] == 'DataLength': + n = types.FcpTypeInt.fcpToPython(paramValue) + self[paramName] = n + try: + MessageBase._setPersistentParams(self, self['ClientToken']) + except Exception, d: + #print Exception, d + return False + return True + + class PersistentRequestModified(MessageBase): name = consts.Message.PersistentRequestModified _additional_params_ = {} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
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. |
From: <jU...@us...> - 2008-03-09 12:56:26
|
Revision: 351 http://fclient.svn.sourceforge.net/fclient/?rev=351&view=rev Author: jUrner Date: 2008-03-09 05:56:27 -0700 (Sun, 09 Mar 2008) Log Message: ----------- fixes and beautification Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/dummy_io.py Modified: trunk/sandbox/fcp2/test_fcp/dummy_io.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/dummy_io.py 2008-03-09 12:55:05 UTC (rev 350) +++ trunk/sandbox/fcp2/test_fcp/dummy_io.py 2008-03-09 12:56:27 UTC (rev 351) @@ -22,16 +22,18 @@ #******************************************************************** class DummyIO(iohandler.IOObjectBase): - def __init__(self, ): + def __init__(self, **kwargs): self.readBuffer = '' # buffer client reads from self.writeBuffer = '' # buffer client writes to self._isOpen = False self._isBroken = False - self._disallowConnect = False + self._allowConnect = True self._reverseDirection = False def connect(self, **kwargs): + if not self._allowConnect: + raise iohandler.IOConnectFailed('Refused') self._isOpen = True def read(self, n): @@ -58,9 +60,7 @@ self.writeBuffer += bytes def close(self): - self._isBroken = False - self._disallowConnect = False - self._reverseDirection = False + self.reset() if self.isOpen(): self._isOpen = False self.readBuffer = '' @@ -84,13 +84,12 @@ def setBroken(self, flag): self._isBroken = flag - def setDissallowConnect(self, flag): - self.disallowConnect = flag + def setAllowConnect(self, flag): + self._allowConnect = flag def setReverseDirection(self, flag): self._reverseDirection = flag - def sendResponseMessage(self, name, data=None, **params): buf = [name, ] for name, value in params.items(): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-09 12:55:12
|
Revision: 350 http://fclient.svn.sourceforge.net/fclient/?rev=350&view=rev Author: jUrner Date: 2008-03-09 05:55:05 -0700 (Sun, 09 Mar 2008) Log Message: ----------- many comb overs Modified Paths: -------------- trunk/sandbox/fcp2/consts.py Modified: trunk/sandbox/fcp2/consts.py =================================================================== --- trunk/sandbox/fcp2/consts.py 2008-03-09 12:54:35 UTC (rev 349) +++ trunk/sandbox/fcp2/consts.py 2008-03-09 12:55:05 UTC (rev 350) @@ -192,24 +192,27 @@ class DisconnectReason(BaseBitFlags): """Reasons for client disconnect - @cvar Close: the clent has been closed - @cvar ConnectingFailed: connection could not be established + @cvar Close: the clent is about to close down + @cvar ConnectionDied: the connection died unexpectedly @cvar DuplicateClientName: another client opend a connection with the same connection name - @cvar Shutdown: regular shutdown of the connection - @cvar SocketDied: connection to the node died unexpectingly - @cvar SocketShutdown: the node shut down the connection unexpectingly - @cvar VersionMissmatch: node or Fcp version did not match + @cvar IOConnectFailed: io connection could not be established + @cvar NodeClosing: freenet node is closing down + @cvar NoNodeHello: NodeHello message did not arrive in time + @cvar Reconnect: the clent is about to be reconnected + @cvar UnknonNodeHello: some unknow message insteadof NodeHello was encountered durin g connect + @cvar VersionMissmatch: nodebuild or Fcp version did not match """ - Close = 0x0 - ConnectingFailed = 0x1 - DuplicateClientName = 0x2 - Shutdown = 0x4 - SocketDied = 0x8 - SocketShutdown = 0x10 - VersionMissmatch = 0x20 - UnknownNodeHello = 0x40 + Close = 0 + ConnectionDied = 1 + DuplicateClientName = 2 + IOConnectFailed = 3 + NodeClosing = 4 + NoNodeHello = 5 + Reconnect = 6 + UnknownNodeHello = 7 + VersionMissmatch = 8 + - class FilenameCollision(BaseBitFlags): """Filename collision flags @cvar HandleNever: don't handle filename collisions @@ -272,6 +275,7 @@ SocketDied = 'Socket died' SocketShutdown = 'Socket shutdown by node' + CaughtException = 'Caught exception' KeyboardInterrupt = 'keyboard interrupt' # kick out SocketDied = 'socket died' @@ -279,7 +283,7 @@ EventTriggered = 'triggered: ' - RequestInvalidClientToken = 'Request invalid client token' + InvalidPersistentParams = 'Invalid peristent params' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-09 12:54:37
|
Revision: 349 http://fclient.svn.sourceforge.net/fclient/?rev=349&view=rev Author: jUrner Date: 2008-03-09 05:54:35 -0700 (Sun, 09 Mar 2008) Log Message: ----------- many comb overs Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-03-09 12:53:45 UTC (rev 348) +++ trunk/sandbox/fcp2/client.py 2008-03-09 12:54:35 UTC (rev 349) @@ -177,6 +177,14 @@ # TODO: check if this is a bug in Fcp # NOTE: seems to be fixed in [build 1112], fixes removed #------------------------------------------------------------------------------------------------------------------------------------------------- +# PutComplexDir +# +# x. currently not handled on PersistentPut. have to test this +# +# +#------------------------------------------------------------------------------------------------------------------------------------------------ + + import os, sys import atexit @@ -205,7 +213,8 @@ from fcp2 import key from fcp2.fcp_lib import namespace -from fcp2.fcp_lib import tools +from fcp2.fcp_lib import tools +from fcp2.fcp_lib import uuid del hack @@ -301,7 +310,8 @@ self._ddaTests = [] self._requests = {} - self.ioHandler.close() + if self.ioHandler.isOpen(): + self.ioHandler.close() if msg is not None: self.events.ClientDisconnected(msg) @@ -334,6 +344,19 @@ del self._requests[request['Identifier']] + + def _newUuid(self, uuids=None): + """Creates a new unique identifier + @param uuids: if desired any iterable containing uuids to enshure the identifier is unique in the iterable + @return: (str) uuid + + """ + uuid_ = uuid.uuid_time() + if uuids is not None: + while uuid_ in uuids: + uuid_ = uuid_time() + return uuid_ + def _registerRequest(self, msg, requestType, @@ -356,7 +379,7 @@ @return: (str) identifer of therequest @note: the identifier returned is unique to the client but may not be unique to the node """ - identifier = fcparams.newUuid(uuids=self._requests) if identifier is None else identifier + identifier = self.newUuid(uuids=self._requests) if identifier is None else identifier # equip requests with some additional params @@ -373,18 +396,22 @@ @requestparam: B{RequestType:} one or more of the L{consts.RequestType} flags @requestparam: B{Identifier:} identifier of the request """ - msg['Identifier'] = fcparams.newUuid(uuids=self._requests) if identifier is None else identifier + msg['Identifier'] = self._newUuid(uuids=self._requests) if identifier is None else identifier msg['RequestType'] = requestType msg['InitTime'] = time.time() if initTime is None else initTime if requestType & consts.RequestType.MaskGet: msg['FilenameCollision'] = filenameCollision msg['UserData'] = userData msg['PersistentUserData'] = persistentUserData - msg['ClientToken'] = fcparams.messageToParams(msg) + msg['ClientToken'] = '' + msg.updatePersistentParams() + elif requestType & consts.RequestType.MaskPut: msg['UserData'] = userData msg['PersistentUserData'] = persistentUserData - msg['ClientToken'] = fcparams.messageToParams(msg) + msg['ClientToken'] = '' + msg.updatePersistentParams() + elif requestType & consts.RequestType.MaskGenerateKeypair: pass elif requestType & consts.RequestType.SubscribeUSK: @@ -401,18 +428,18 @@ ## connection related methods ## ############################################################### + #TESTED def close(self): """Closes the client @note: make shure to call close() when done with the client """ msg = message.ClientDisconnected( DisconnectReason=consts.DisconnectReason.Close, - Param=None, ) self._close(msg) - - - def closeFreenet(self): + + #TESTED + def closeNode(self): """Shuts down the freenet node""" self.sendMessage(message.Shutdown()) @@ -431,7 +458,15 @@ pass return nodeHello + #TESTED + def isOpen(self): + """Checks if the clients connection is open + @return: (bool) True if so, False otherwise + """ + return self.ioHandler.isOpen() + + #TESTED def iterConnect(self, host=DefaultFcpHost, port=DefaultFcpPort, duration=20, timeout=0.5): """Iterator to stablish a connection to a freenet node @param host: (str) host of th node @@ -446,53 +481,50 @@ #TODO: we have to yield a few round here to make NodeHello injection work in unittests # no idea exactly how many... - disconnectReason = None - disconnectParam = None + if self.ioHandler.isOpen(): + disconnectMsg = message.ClientDisconnected( + DisconnectReason=consts.DisconnectReason.Reconnect, + ) + self._close(disconnectMsg) + + disconnectReason = consts.DisconnectReason.IOConnectFailed t0 = time.time() for result in self.ioHandler.iterConnect(duration=duration, timeout=timeout, host=host, port=port): yield None - timeElapsed = time.time() - t0 - + # try to get handshake + timeElapsed = time.time() - t0 if result: - errorMsg = self.sendMessage( + self.sendMessage( message.ClientHello( Name=self._connectionName, ExpectedVersion=self.ExpectedFcpVersion, ) ) - yield None - if errorMsg is None: - timeElapsed = 0 - while timeElapsed <= duration: + + while timeElapsed <= duration: + yield None + msg = self.next(dispatch=False) + if msg == message.ClientSocketTimeout: + disconnectReason = consts.DisconnectReason.NoNodeHello + timeElapsed += max(self.ioHandler.io.Timeout, 0.1) yield None - msg = self.next(dispatch=False) - if msg == message.ClientSocketTimeout: - timeElapsed += max(self.ioHandler.io.Timeout, 0.1) - yield None - - elif msg == message.NodeHello: - self._nodeHelloMessage = msg - # check if version is ok - if self.versionCheckNodeHello(msg): - self.events.ClientConnected(msg) - yield self._nodeHelloMessage - raise StopIteration - else: - disconnectReason = consts.DisconnectReason.VersionMissmatch - disconnectParam = msg - break - + elif msg == message.NodeHello: + self._nodeHelloMessage = msg + # check if version is ok + if self.versionCheckNodeHello(msg): + self.events.ClientConnected(msg) + yield self._nodeHelloMessage + raise StopIteration else: - disconnectReason = consts.DisconnectReason.UnknownNodeHello - disconnectParam = msg - break + disconnectReason = consts.DisconnectReason.VersionMissmatch + break + else: + disconnectReason = consts.DisconnectReason.UnknownNodeHello + break - if disconnectReason is None: - disconnectReason=consts.DisconnectReason.ConnectingFailed disconnectMsg = message.ClientDisconnected( DisconnectReason=disconnectReason, - Param=disconnectParam, ) self._close(disconnectMsg) raise StopIteration @@ -510,7 +542,7 @@ @param connectionName: (str) connection name or None to use an arbitrary connection name @return: (str) connection name """ - self._connectionName = fcparams.newUuid() if connectionName is None else connectionName + self._connectionName = self._newUuid() if connectionName is None else connectionName return self._connectionName @@ -523,8 +555,8 @@ self.ioHandler.setDebugVerbosity(debugVerbosity) - def startFreenet(self, cmdline): - """Starts freenet + def startNode(self, cmdline): + """Starts the freenet node @param cmdline: commandline to start freenet (like '/freenet/run.sh start' or 'c:\freenet\start.bat') @return: (str) whatever freenet returns @@ -543,10 +575,10 @@ def versionCheckNodeHello(self, nodeHelloMessage): """Performa a version check of the client against the specified NodeHello message @return: (bool) True if version is ok, False otherwise - @note: if this check returns False the client will emidiately disconnect in L{connect()} - and triggers a ClientDisconnected event. Overwrite to adjust + @note: this implementation checks for FCPVersion == L{ExpectedFcpVersion} + and a Build >= L{ExpectedNodeBuild} """ - if nodeHelloMessage['FCPVersion'] >= self.ExpectedFcpVersion: + if nodeHelloMessage['FCPVersion'] == self.ExpectedFcpVersion: if nodeHelloMessage['Build'] >= self.ExpectedNodeBuild: return True return False @@ -578,7 +610,7 @@ return False # resend request with new identifier - newIdentifier = fcparams.newUuid(uuids=self._requests) + newIdentifier = self._newUuid(uuids=self._requests) self._requests[newIdentifier] = initialRequest del self._requests[requestIdentifier] initialRequest['Identifier'] = newIdentifier @@ -592,8 +624,7 @@ code = msg['Code'] if code == consts.ProtocolError.ShuttingDown: disconnectMsg = message.ClientDisconnected( - DisconnectReason=consts.DisconnectReason.Shutdown, - Param=None, + DisconnectReason=consts.DisconnectReason.NodeClosing, ) self._close(disconnectMsg) return True @@ -829,16 +860,24 @@ return True - elif msg == message.PersistentGet: + elif msg == message.PersistentGet or msg == message.PersistentPut or msg == message.PersistentPutDir: # unknown request... try to restore it if initialRequest is None: - fcParams = fcparams.paramsFromRequest(msg) - - # not one of our requests... so cancel it - if fcParams is None or CancelPersistentRequests: - if fcParams is None: - self._loggers['Runtime'].critical(consts.LogMessages.RequestInvalidClientToken) + + #FIXME: PutComplexDir??? + if msg == message.PersistentGet: + initialRequest = message.ClientGet() + elif msg == message.PersistentPut: + initialRequest = message.ClientPut() + elif msg == message.PersistentPutDir: + initialRequest = message.ClientPutDiskDir() + + initialRequest.params.update(msg.params) + result = initialRequest.restorePersistentParams() + if not result or CancelPersistentRequests: + if not result: + self._loggers['Runtime'].critical(consts.LogMessages.InvalidPersistentParams) self.sendMessage( message.RemovePersistentRequest( Identifier=requestIdentifier, @@ -847,18 +886,8 @@ ) return True - initialRequest = message.ClientGet() - self._registerRequest( - initialRequest, - fcParams[fcparams.IRequestType], - identifier=requestIdentifier, - initTime=fcParams[fcparams.IInitTime], - userData=None, - persistentUserData=fcParams[fcparams.IPersistentUserData], - filenameCollision=fcParams[fcparams.IFilenameCollision], - ) - - initialRequest.params.update(msg.params) + self._requests[initialRequest['Identifier']] = initialRequest + #FIX: remove Started param from PersistentGet / Put del initialRequest.params['Started'] #FIX: [0001965: Persistence vs PersistenceType] @@ -868,7 +897,7 @@ self.events.RequestRestored(initialRequest) return True - # known request ..we don't handle that + # known request ..don't handle it return False @@ -879,23 +908,22 @@ modified = {} # check if PersistentUserData has changed - params = fcparams.paramsFromRequest(initialRequest) - if params is not None: - clientToken = msg.get('ClientToken', None) - if clientToken is not None: + clientToken = msg.get('ClientToken', None) + if clientToken is not None: + modified[consts.RequestModified.PersistentUserData] = None + + #TODO: its more or less a guess that PersistentUserData has changed + # ...as long as no other param is changed at runtime we are ok + # otherwise we would have to set flags to indicate wich member + # of ClientToken changed. See --> modifyRequest() + # + # hmm ..thinking again, this would only work if we could make shure + # PersistentUserData can only be modified through modifyRequest(). + # So no way. + + #TODO: ??? try ...except + initialRequest.restorePersistentParams() - #TODO: its more or less a guess that PersistentUserData has changed - # ...as long as no other param is changed at runtime we are ok - # otherwise we would have to set flags to indicate wich member - # of ClientToken changed. See --> modifyRequest() - # - # hmm ..thinking again, this would only work if we could make shure - # PersistentUserData can only be modified through modifyRequest(). - # So no way. - modified[consts.RequestModified.PersistentUserData] = None - for i, fcParam in enumerate(fcparams.FcParams): - initialRequest[fcParam] = params[i] - # check if PriorityClass has changed priorityClass = msg.get('PriorityClass', None) if priorityClass is not None: @@ -930,52 +958,6 @@ ## put related - elif msg == message.PersistentPut or msg == message.PersistentPutDir: - - # unknown request... try to restore it - if initialRequest is None: - fcParams = fcparams.paramsFromRequest(msg) - - # not one of our requests... so cancel it - if fcParams is None or CancelPersistentRequests: - if fcParams is None: - self._loggers['Runtime'].critical(consts.LogMessages.RequestInvalidClientToken) - self.sendMessage( - message.RemovePersistentRequest( - Identifier=requestIdentifier, - Global=msg['Global'], - ) - ) - return True - - requestType = fcParams[fcparams.IRequestType] - if requestType in (consts.RequestType.PutData, consts.RequestType.PutFile): - initialRequest = message.ClientPut() - elif requestType == consts.RequestType.PutDir: - initialRequest = message.ClientPutDiskDir() - elif request == consts.RequestType.PutMultiple: - initialRequest = message.ClientPutComplexDir() - - self._registerRequest( - initialRequest, - requestType, - identifier=requestIdentifier, - initTime=fcParams[fcparams.IInitTime], - userData=None, - persistentUserData=fcParams[fcparams.IPersistentUserData], - filenameCollision=fcParams[fcparams.IFilenameCollision], - ) - - #FIX: remove Started param from PersistentGet / Put - del initialRequest.params['Started'] - initialRequest['RequestStatus'] |= consts.RequestStatus.Restored - self.events.RequestRestored(initialRequest) - return True - - # known request ..we don't handle that - return False - - elif msg == message.PutFailed: if initialRequest is None: return False @@ -1088,7 +1070,6 @@ elif msg == message.CloseConnectionDuplicateClientName: disconnectMsg = message.ClientDisconnected( DisconnectReason=consts.DisconnectReason.DuplicateClientName, - Param=None, ) self._close(disconnectMsg) return True @@ -1137,8 +1118,7 @@ self.events.Idle(msg) except iohandler.IOBroken, details: msg = message.ClientDisconnected( - DisconnectReason=consts.DisconnectReason.SocketDied, - Param=details, + DisconnectReason=consts.DisconnectReason.ConnectionDied, ) self._close(msg) raise iohandler.IOBroken(details) @@ -1200,19 +1180,20 @@ @note: you can use this method to send a message to the node, bypassing all track keeping methods of the client """ - errorMsg = None + + # Reminder to self: + # + # if socket dies on sendall ther is no way to determine if and how much data was send + # ...so assume data was send, cos there is no way to proove it was not send try: self.ioHandler.sendMessageEx(msg) except iohandler.IOBroken, details: errorMsg = message.ClientDisconnected( - DisconnectReason=consts.DisconnectReason.SocketDied, - Param=details + DisconnectReason=consts.DisconnectReason.ConnectionDied, ) self._close(errorMsg) raise iohandler.IOBroken(details) - return errorMsg - - + ######################################################### ## ## config related methods @@ -2121,7 +2102,7 @@ if persistentUserData is not None: initialRequest['PersistentUserData'] = persistentUserData - initialRequest['ClientToken'] = fcparams.messageToParams(initialRequest) + initialRequest['ClientToken'] = initialRequest.updatePersistentParams() modified[consts.RequestModified.PersistentUserData] = None initialRequest['Modified'] = modified @@ -2134,7 +2115,7 @@ ) if persistentUserData is not None: initialRequest['PersistentUserData'] = persistentUserData - msg['ClientToken'] = fcparams.messageToParams(initialRequest) + msg['ClientToken'] = initialRequest.updatePersistentParams() if priorityClass is not None: msg['PriorityClass'] = priorityClass @@ -2207,10 +2188,12 @@ if requestKey.filename: newRequest['URI'] += '/' + requestKey.filename + + filenameCollision = newRequest.get('FilenameCollision', None) self._registerRequest( newRequest, requestType, - filenameCollision=newRequest['FilenameCollision'] & consts.FilenameCollision.MaskHandle, + filenameCollision= None if filenameCollision is None else filenameCollision & consts.FilenameCollision.MaskHandle, #initTime=time.time(), persistentUserData=newRequest['PersistentUserData'], userData=oldUserData, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-09 12:53:43
|
Revision: 348 http://fclient.svn.sourceforge.net/fclient/?rev=348&view=rev Author: jUrner Date: 2008-03-09 05:53:45 -0700 (Sun, 09 Mar 2008) Log Message: ----------- logging and python like style handling Modified Paths: -------------- trunk/sandbox/fcp2/iohandler.py Modified: trunk/sandbox/fcp2/iohandler.py =================================================================== --- trunk/sandbox/fcp2/iohandler.py 2008-03-09 12:28:33 UTC (rev 347) +++ trunk/sandbox/fcp2/iohandler.py 2008-03-09 12:53:45 UTC (rev 348) @@ -1,9 +1,14 @@ +"""Message io handling +The module can be used to handle reading and writing of messages io from sockeet, file or whatever + +""" import os, sys import logging import socket import time +import traceback #--> rel import hack @@ -211,15 +216,15 @@ raise ValueError('duration must be >= 0') if not timeout >= 0: raise ValueError('timeout must be >= 0') - - if self.isOpen(): - self.close() timeElapsed = 0 while timeElapsed <= duration: + if self.isOpen(): + self.close() self._log.info(consts.LogMessages.Connecting + ' %r' % kwargs) - self.io = self._ioPrototype() + self.io = self._ioPrototype(**kwargs) + yield False # have to yield at least once to make unittests work (io has to be created!!) try: self.io.connect(**kwargs) except IOConnectFailed, details: @@ -243,7 +248,7 @@ """Closes the handler""" self._log.debug(consts.LogMessages.Closing) self._receiveBuffer = '' - if self.io is not None and self.io.isOpen(): + if self.io is not None: self.io.close() self.io = None @@ -269,12 +274,16 @@ raise ValueError('No bytes received and IO did not raise as expected?!?') self._receiveBuffer += p except IOBroken, details: + self._log.critical(consts.LogMessages.SocketDied) self.close() - self._log.critical(consts.LogMessages.SocketDied) - return IOBroken, details + raise IOBroken(details) except IOTimeout, details: # nothing in the queue - return IOTimeout, details - return None, None + raise IOTimeout(details) + except Exception, details: + self._log.critical(consts.LogMessages.CaughtException + '\n' + traceback.traceback.format_exc()) + self.close() + raise Exception(details) + def readMessage(self): @@ -302,10 +311,8 @@ eof += len(self.TerminatorData) hasData = True if eof < 0: - exception, details = self.readBytes(self.io.BufferSize) - if exception is not None: - raise exception(details) - + self.readBytes(self.io.BufferSize) + # prep message chunk, self._receiveBuffer = self._receiveBuffer[ :eof], self._receiveBuffer[eof: ] p = [i for i in chunk.split('\n') if i] # Fcp ignores empty lines, so do we @@ -362,13 +369,12 @@ if len(self._receiveBuffer) >= n: msg.data, self._receiveBuffer = self._receiveBuffer[ :n], self._receiveBuffer[n: ] break - - exception, details = self.readBytes(self.io.BufferSize) - if exception == IOTimeout: # try again later + try: + self.readBytes(self.io.BufferSize) + except IOTimeout, details: # try again later self._receiveBuffer = chunk + self._receiveBuffer - elif exception is not None: - raise exception(details) - + raise IOTimeout(details) + self._log.debug(consts.LogMessages.Received + msg.pprint()) return msg @@ -394,9 +400,13 @@ try: self.io.write(msg.toString()) except IOBroken, details: + self._log.critical(consts.LogMessages.SocketDied) self.close() - self._log.critical(consts.LogMessages.SocketDied) raise IOBroken(details) + except Exception, details: + self._log.critical(consts.LogMessages.CaughtException + '\n' + traceback.traceback.format_exc()) + self.close() + raise Exception(details) def setDebugVerbosity(self, debugVerbosity): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-09 12:28:36
|
Revision: 347 http://fclient.svn.sourceforge.net/fclient/?rev=347&view=rev Author: jUrner Date: 2008-03-09 05:28:33 -0700 (Sun, 09 Mar 2008) Log Message: ----------- moved persistent params handling to message Modified Paths: -------------- trunk/sandbox/fcp2/message.py Modified: trunk/sandbox/fcp2/message.py =================================================================== --- trunk/sandbox/fcp2/message.py 2008-03-08 11:15:48 UTC (rev 346) +++ trunk/sandbox/fcp2/message.py 2008-03-09 12:28:33 UTC (rev 347) @@ -1,7 +1,8 @@ -"""Freennet Client Protocol message +"""Freennet Client Protocol messages """ import os, sys +import base64 import socket #--> rel import hack @@ -30,6 +31,7 @@ # #******************************************************************************** MessagesAll = {} +PersistentParamsSep = '0x01' class MessageMeta(type): @@ -45,105 +47,127 @@ # #******************************************************************************** class MessageBase(object): - """Class wrapping a Fcp message - - Sample use:: + """Class wrapping a Fcp message + + Sample use:: - msg = Messsage( - consts.Message.ClientHello, - ExpectedVersion='2.0', - Name='MyConnectionName' - ) - msg['Name'] = 'another' - msg['Name'] - >> 'another' - - msg.send(mySocket) - - @ivar data: (bytes) data carried along with the message or None - @ivar name: (str) message name - @ivar params: (dict) message params + msg = Message.ClientHello( + ExpectedVersion='2.0', + Name='MyConnectionName' + ) + msg['Name'] = 'another' + msg['Name'] + >> 'another' + + + @ivar data: (bytes) data carried along with the message or None + @ivar name: (str) message name + @ivar params: (dict) message params + """ + __metaclass__ = MessageMeta + + name = '' + _additional_params_ = {} + _param_types_ = {} + _persistent_params_ = () + + + @classmethod + def __eq__(klass, other): + return klass.name == other.name + + @classmethod + def __ne__(klass, other): + return klass.name != other.name + + + def __init__(self, data=None, **params): """ - __metaclass__ = MessageMeta + @param data: data associated to the message + @param params: {field-name: value, ...} of parameters of the message + """ + params.update(self._additional_params_.copy()) - name = '' - _additional_params_ = {} - _param_types_ = {} - + self.data = data + self.params = params - @classmethod - def __eq__(klass, other): - return klass.name == other.name - - @classmethod - def __ne__(klass, other): - return klass.name != other.name - - - def __init__(self, data=None, **params): - """ - @param data: data associated to the message - @param params: {field-name: value, ...} of parameters of the message - """ - params.update(self._additional_params_.copy()) - self.data = data - self.params = params - - - def get(self, name, default=None): - """Returns the message parameter 'name' or 'default' """ - return self.params.get(name, default) + def get(self, name, default=None): + """Returns the message parameter 'name' or 'default' """ + return self.params.get(name, default) + + + def __getitem__(self, name): + """Returns the message parameter 'name' """ + return self.params[name] + + + def __setitem__(self, name, value): + """Sets the message parameter 'name' to 'value' """ + self.params[name] = value + + def pprint(self): + """Returns the message as nicely formated human readable string""" + out = ['', '>>' + self.name, ] + for param, value in self.params.items(): + if isinstance(param, PrivateParam): + continue + out.append('>> %s=%s' % (param, value)) - def __getitem__(self, name): - """Returns the message parameter 'name' """ - return self.params[name] - - - def __setitem__(self, name, value): - """Sets the message parameter 'name' to 'value' """ - self.params[name] = value + if self.data is None: + out.append('>>EndMessage') + else: + out.append('>>Data') + out.append(self.data) + return '\n'.join(out) + + + def toString(self): + """Returns the message as formated string ready to be send""" + out = [self.name, ] + for param, value in self.params.items(): + if isinstance(param, PrivateParam): + continue + # convert python to fcp value if necessary + paramType = self._param_types_.get(param, None) + if paramType is not None: + value = paramType.pythonToFcp(value) + + out.append('%s=%s' % (param, value)) - def pprint(self): - """Returns the message as nicely formated human readable string""" - out = ['', '>>' + self.name, ] - for param, value in self.params.items(): - if isinstance(param, PrivateParam): - continue - out.append('>> %s=%s' % (param, value)) - - if self.data is None: - out.append('>>EndMessage') - else: - out.append('>>Data') - out.append(self.data) - return '\n'.join(out) + if self.data is None: + out.append('EndMessage\n') + else: + out.append('Data') + out.append(self.data) + return '\n'.join(out) + + + #TODO: + # 1. if one setter / getter fails no setter / getter result should assumed to be valid + # 2. log errors + # + # + def setPersistentParams(self, persistentData): + params = persistentData.split(PersistentParamsSep) + if len(params) > len(self._persistent_params_): + raise ValueError('Too many parameters in data') + elif len(params) < len(self._persistent_params_): + raise ValueError('Too few parameters in data') + for n, (getter, setter) in enumerate(self._persistent_params_): + setter(self, params[n]) + + def getPersistentParams(self): + out = [] + for n, (getter, setter) in enumerate(self._persistent_params_): + #TODO: check if PersistentParamsSep is in data returned + out.append(getter(self)) + return PersistentParamsSep.join(out) - def toString(self): - """Returns the message as formated string ready to be send""" - out = [self.name, ] - for param, value in self.params.items(): - if isinstance(param, PrivateParam): - continue - - # convert python to fcp value if necessary - paramType = self._param_types_.get(param, None) - if paramType is not None: - value = paramType.pythonToFcp(value) - - out.append('%s=%s' % (param, value)) - - if self.data is None: - out.append('EndMessage\n') - else: - out.append('Data') - out.append(self.data) - return '\n'.join(out) - #*************************************************************************************** # # param types for config message @@ -437,7 +461,6 @@ PrivateParam('InitTime'): 0, # when was the request started? #TODO: not really necessary, but we need it for persistent params - PrivateParam('FilenameCollision'): consts.FilenameCollision.HandleNever, PrivateParam('PersistentUserData'): '', # any user defined persistent data # non persistent params @@ -488,18 +511,56 @@ PrivateParam('InitTime'): 0, # when was the request started? } + +PersistentParamsGet = ( + ( + lambda msg: str(msg.__getitem__('RequestType')), + lambda msg, value: msg.__setitem__('Requesttype', int(value)), + ), + ( + lambda msg: str(msg.__getitem__('InitTime')), + lambda msg, value: msg.__setitem__('InitTime', float(value)), + ), + ( + lambda msg: str(msg.__getitem__('FilenameCollision')), + lambda msg, value: msg.__setitem__('FilenameCollision', int(value)), + ), + ( + lambda msg: base64.b64encode(msg.__getitem__('PersistentUserData')), + lambda msg, value: msg.__setitem__('PersistentUserData', base64.b64decode(value)), + ), + ) + +PersistentParamsPut = ( + ( + lambda msg: str(msg.__getitem__('RequestType')), + lambda msg, value: msg.__setitem__('Requesttype', int(value)), + ), + ( + lambda msg: str(msg.__getitem__('InitTime')), + lambda msg, value: msg.__setitem__('InitTime', float(value)), + ), + ( + lambda msg: base64.b64encode(msg.__getitem__('PersistentUserData')), + lambda msg, value: msg.__setitem__('PersistentUserData', base64.b64decode(value)), + ), + ) #******************************************************************************** # #******************************************************************************** #TODO: register new message type? -def newMessageType(name, paramTypes=None, additionalParams=None): +def newMessageType(name, paramTypes=None, additionalParams=None, persistentParams=None): kws = { 'name': name, - '_additional_params_': additionalParams if additionalParams is not None else {}, - '_param_types_': paramTypes if paramTypes is not None else {}, + '_additional_params_': {} if additionalParams is None else additionalParams, + '_persistent_params_': () if persistentParams is None else persistentParams, + '_param_types_': {} if paramTypes is None else paramTypes, } return type(name, (MessageBase, ), kws) + +#TODO: _persistent_params_ ...define in all message classes or not? Bogus for most, +# but makes customization of individual classes harder for useres #******************************************************************************** # some additional messages we define for uniformity #******************************************************************************** @@ -544,6 +605,7 @@ class ClientGet(MessageBase): name = consts.Message.ClientGet _additional_params_ = AdditionalGetParams + _persistent_params_ = PersistentParamsGet _param_types_ = { 'BinaryBlob': types.FcpTypeBool, 'DSOnly': types.FcpTypeBool, @@ -554,6 +616,17 @@ 'MaxTempSize': types.FcpTypeInt, 'Verbosity': types.FcpTypeInt, } + + def restorePersistentParams(self): + try: + MessageBase.setPersistentParams(self, self['ClientToken']) + except Exception, d: + #print Exception, d + return False + return True + + def updatePersistentParams(self): + self['ClientToken'] = MessageBase.getPersistentParams(self) class ClientHello(MessageBase): @@ -567,6 +640,7 @@ class ClientPut(MessageBase): name = consts.Message.ClientPut _additional_params_ = AdditionalPutParams + _persistent_params_ = PersistentParamsPut _param_types_ = { 'BinaryBlob': types.FcpTypeBool, 'DataLength': types.FcpTypeInt, @@ -577,34 +651,24 @@ 'MaxRetries': types.FcpTypeInt, 'Verbosity': types.FcpTypeInt, } + + def restorePersistentParams(self): + try: + MessageBase.setPersistentParams(self, self['ClientToken']) + except Exception, d: + return False + return True + + def updatePersistentParams(self): + self['ClientToken'] = MessageBase.getPersistentParams(self) -class ClientPutComplexDir(MessageBase): +class ClientPutComplexDir(ClientPut): name = consts.Message.ClientPutComplexDir - _additional_params_ = AdditionalGetParams - _param_types_ = { - 'BinaryBlob': types.FcpTypeBool, - 'DontCompress': types.FcpTypeBool, - 'EarlyEncode': types.FcpTypeBool, - 'GetCHKOnly': types.FcpTypeBool, - 'Global': types.FcpTypeBool, - 'MaxRetries': types.FcpTypeInt, - 'Verbosity': types.FcpTypeInt, - } + - -class ClientPutDiskDir(MessageBase): +class ClientPutDiskDir(ClientPut): name = consts.Message.ClientPutDiskDir - _additional_params_ = AdditionalGetParams - _param_types_ = { - 'BinaryBlob': types.FcpTypeBool, - 'DontCompress': types.FcpTypeBool, - 'EarlyEncode': types.FcpTypeBool, - 'GetCHKOnly': types.FcpTypeBool, - 'Global': types.FcpTypeBool, - 'MaxRetries': types.FcpTypeInt, - 'Verbosity': types.FcpTypeInt, - } class CloseConnectionDuplicateClientName(MessageBase): @@ -927,7 +991,7 @@ 'Build': types.FcpTypeInt, 'CompressionCodecs': types.FcpTypeInt, 'ExtBuild': types.FcpTypeInt, - 'FcpVersion': types.FcpTypeFloat, + 'FCPVersion': types.FcpTypeFloat, 'Testnet': types.FcpTypeBool, } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-08 11:15:43
|
Revision: 346 http://fclient.svn.sourceforge.net/fclient/?rev=346&view=rev Author: jUrner Date: 2008-03-08 03:15:48 -0800 (Sat, 08 Mar 2008) Log Message: ----------- tests for keys Added Paths: ----------- trunk/sandbox/fcp2/test_fcp/test_key.py Added: trunk/sandbox/fcp2/test_fcp/test_key.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_key.py (rev 0) +++ trunk/sandbox/fcp2/test_fcp/test_key.py 2008-03-08 11:15:48 UTC (rev 346) @@ -0,0 +1,52 @@ +"""Unittests for fcp2.key.py""" + +import os, sys +import socket +import unittest + +#--> rel import hack +class _RelImportHack(object): + def __init__(self, n): + fpath = os.path.abspath(__file__) + for i in xrange(n): fpath = os.path.dirname(fpath) + sys.path.insert(0, fpath) + def __del__(self): sys.path.pop(0) +hack = _RelImportHack(3) + +from fcp2.client import Client +from fcp2 import consts +from fcp2 import types + + + +del hack +#<-- rel import hack +#**************************************************************************************** +# +#**************************************************************************************** +class TestKeys(unittest.TestCase): + + pass + + +#********************************************************************************* +# +#********************************************************************************* +def suite(): + tests = ( + TestKeys, + ) + + suite = unittest.TestSuite() + for test in tests: + suite.addTest(unittest.makeSuite(test)) + return suite + + +def test(): + unittest.TextTestRunner(verbosity=1).run(suite()) + +if __name__ == '__main__': + test() + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-08 11:15:19
|
Revision: 345 http://fclient.svn.sourceforge.net/fclient/?rev=345&view=rev Author: jUrner Date: 2008-03-08 03:15:21 -0800 (Sat, 08 Mar 2008) Log Message: ----------- tests for iohandler Added Paths: ----------- trunk/sandbox/fcp2/test_fcp/test_iohandler.py Added: trunk/sandbox/fcp2/test_fcp/test_iohandler.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_iohandler.py (rev 0) +++ trunk/sandbox/fcp2/test_fcp/test_iohandler.py 2008-03-08 11:15:21 UTC (rev 345) @@ -0,0 +1,53 @@ +"""Unittests for fcp2.iohandler.py""" + +import os, sys +import socket +import unittest + +#--> rel import hack +class _RelImportHack(object): + def __init__(self, n): + fpath = os.path.abspath(__file__) + for i in xrange(n): fpath = os.path.dirname(fpath) + sys.path.insert(0, fpath) + def __del__(self): sys.path.pop(0) +hack = _RelImportHack(3) + +from fcp2.client import Client +from fcp2.client import iohandler +from fcp2 import consts +from fcp2 import types + + + +del hack +#<-- rel import hacks +#**************************************************************************************** +# +#**************************************************************************************** +class TestIOHandler(unittest.TestCase): + + def test(self): + pass + + + +#********************************************************************************* +# +#********************************************************************************* +def suite(): + tests = ( + TestIOHandler, + ) + + suite = unittest.TestSuite() + for test in tests: + suite.addTest(unittest.makeSuite(test)) + return suite + + +def test(): + unittest.TextTestRunner(verbosity=1).run(suite()) + +if __name__ == '__main__': + test() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-08 11:15:05
|
Revision: 344 http://fclient.svn.sourceforge.net/fclient/?rev=344&view=rev Author: jUrner Date: 2008-03-08 03:15:03 -0800 (Sat, 08 Mar 2008) Log Message: ----------- added IdentifierCollision event. We may need it for plugin messages Modified Paths: -------------- trunk/sandbox/fcp2/events.py Modified: trunk/sandbox/fcp2/events.py =================================================================== --- trunk/sandbox/fcp2/events.py 2008-03-08 11:14:24 UTC (rev 343) +++ trunk/sandbox/fcp2/events.py 2008-03-08 11:15:03 UTC (rev 344) @@ -45,6 +45,9 @@ class Idle(events.Event): """Client is idele currently""" + class IdentifierCollision(events.Event): + """An identifier collision occured""" + class KeypairGenerated(events.Event): """A public / private keypair has been generated""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-08 11:14:24
|
Revision: 343 http://fclient.svn.sourceforge.net/fclient/?rev=343&view=rev Author: jUrner Date: 2008-03-08 03:14:24 -0800 (Sat, 08 Mar 2008) Log Message: ----------- beautifications Modified Paths: -------------- trunk/sandbox/fcp2/consts.py Modified: trunk/sandbox/fcp2/consts.py =================================================================== --- trunk/sandbox/fcp2/consts.py 2008-03-08 11:13:42 UTC (rev 342) +++ trunk/sandbox/fcp2/consts.py 2008-03-08 11:14:24 UTC (rev 343) @@ -268,6 +268,7 @@ Sending = 'Sending' Received = 'Received' + CreatingNewMessageType = 'Creating new message type' SocketDied = 'Socket died' SocketShutdown = 'Socket shutdown by node' @@ -405,35 +406,6 @@ NoSuchPlugin = 32 -class RequestStatus(BaseBitFlags): - """Request status flags - @cvar Null: no status - @cvar Restored: the request was restored when the client was started - @cvar Compressing: the request is about to be compressed - @cvar Compressed: compressing is completed - @cvar Success: the request has completed successfuly - @cvar Error: the request has completed with an error - @cvar Removed: the request is completed because it will be or has been removed - - @cvar Completed: processing of the request is completed - @cvar RemovedFromQueue: the request is no longer present in the nodes queue. The client will remove the request - from its own queue as soon as all event listeners have been notified. - - @note: the FcStatus member of the params dict of a request should contain one or more - of the bitflags it picked up while running through the client. - """ - Null = 0x0 - Restored = 0x1 - Compressing = 0x2 - Compressed = 0x4 - Success = 0x8 - Error = 0x10 - Removed = 0x20 - - Completed =0x10000000 - RemovedFromQueue = 0x2000000 - - class PeerNodeStatus: Connected = 'CONNECTED' BackedOff = 'BACKED OFF' @@ -471,6 +443,52 @@ Low = '4' +class RequestModified(BaseBitFlags): + """Flags indicating what aspect of a request has been modified + @cvar Filename: the filename has been modified + @cvar Identifier: the identifier has been moodified + @cvar PersistentUserData: persistent user data has been modified + @cvar PriorityClass: the priority class has been modified + + @note: the FcModified member of the params dict of a request may contain + one or more of the bitflags + """ + Null = 0x0 + Filename = 0x8 + Identifier = 0x4 + PersistentUserData = 0x1 + PriorityClass = 0x2 + + +class RequestStatus(BaseBitFlags): + """Request status flags + @cvar Null: no status + @cvar Restored: the request was restored when the client was started + @cvar Compressing: the request is about to be compressed + @cvar Compressed: compressing is completed + @cvar Success: the request has completed successfuly + @cvar Error: the request has completed with an error + @cvar Removed: the request is completed because it will be or has been removed + + @cvar Completed: processing of the request is completed + @cvar RemovedFromQueue: the request is no longer present in the nodes queue. The client will remove the request + from its own queue as soon as all event listeners have been notified. + + @note: the FcStatus member of the params dict of a request should contain one or more + of the bitflags it picked up while running through the client. + """ + Null = 0x0 + Restored = 0x1 + Compressing = 0x2 + Compressed = 0x4 + Success = 0x8 + Error = 0x10 + Removed = 0x20 + + Completed =0x10000000 + RemovedFromQueue = 0x2000000 + + class RequestType(BaseBitFlags): """Consts indicating the type of a request""" @@ -496,24 +514,9 @@ MaskGenerateKeypair = GenerateSSKKeypair | GenerateUSKKeypair MaskPlugin = PluginInfo | PluginMessage MaskPut = PutData | PutFile | PutDir | PutMultiple | PutRedirect + -class RequestModified(BaseBitFlags): - """Flags indicating what aspect of a request has been modified - @cvar Filename: the filename has been modified - @cvar Identifier: the identifier has been moodified - @cvar PersistentUserData: persistent user data has been modified - @cvar PriorityClass: the priority class has been modified - - @note: the FcModified member of the params dict of a request may contain - one or more of the bitflags - """ - Null = 0x0 - Filename = 0x8 - Identifier = 0x4 - PersistentUserData = 0x1 - PriorityClass = 0x2 - class ReturnType: Direct = 'direct' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-08 11:13:37
|
Revision: 342 http://fclient.svn.sourceforge.net/fclient/?rev=342&view=rev Author: jUrner Date: 2008-03-08 03:13:42 -0800 (Sat, 08 Mar 2008) Log Message: ----------- adapt to new message handling Modified Paths: -------------- trunk/sandbox/fcp2/config.py Modified: trunk/sandbox/fcp2/config.py =================================================================== --- trunk/sandbox/fcp2/config.py 2008-03-08 11:13:11 UTC (rev 341) +++ trunk/sandbox/fcp2/config.py 2008-03-08 11:13:42 UTC (rev 342) @@ -59,6 +59,7 @@ from fcp2 import consts from fcp2 import types +from fcp2 import message from fcp2.fcp_lib import uuid @@ -129,7 +130,6 @@ self.parent = None self.name = None self.children = {} - self._configMessageParams = types.ConfigMessageParams() self._log = logging.getLogger(consts.LoggerNames.Config) if configDataMsg is not None: @@ -162,14 +162,14 @@ @note: if the item does not already exist it is created @note: if the key is unknown its type will always be set to L{types.FcpType} """ - paramClass, components = self._configMessageParams.splitParamClass(key) - paramType = self._configMessageParams.get(key, None) + paramClass, components = message.ConfigMessageParamTypes.splitParamClass(key) + paramType = message.ConfigMessageParamTypes.get(key, None) if paramType is None: paramType = types.FcpType self._log.warning('Unknown key: %r' % components) # find or create new config item if necessary - components = self._configMessageParams.splitAll(components) + components = message.ConfigMessageParamTypes.splitAll(components) parent = self for component in components: item = parent.children.get(component, None) @@ -187,8 +187,8 @@ @return: (str) key @note: if the key does not contain the paramClass it is returned unchanged """ - head, tail = self._configMessageParams.splitParamClass(key) - if head in self._configMessageParams.ParamClasses: + head, tail = message.ConfigMessageParamTypes.splitParamClass(key) + if head in message.ConfigMessageParamTypes.ParamClasses: return tail return tail This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-08 11:13:09
|
Revision: 341 http://fclient.svn.sourceforge.net/fclient/?rev=341&view=rev Author: jUrner Date: 2008-03-08 03:13:11 -0800 (Sat, 08 Mar 2008) Log Message: ----------- minor changes Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/test_config.py Modified: trunk/sandbox/fcp2/test_fcp/test_config.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_config.py 2008-03-08 11:12:52 UTC (rev 340) +++ trunk/sandbox/fcp2/test_fcp/test_config.py 2008-03-08 11:13:11 UTC (rev 341) @@ -1,4 +1,4 @@ -"""Unittests for fcp2_0_config""" +"""Unittests for fcp2.config.py""" import os, sys import socket @@ -15,7 +15,6 @@ from fcp2.client import Client from fcp2 import consts -Message = Client.message.Message from fcp2 import types This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-08 11:12:47
|
Revision: 340 http://fclient.svn.sourceforge.net/fclient/?rev=340&view=rev Author: jUrner Date: 2008-03-08 03:12:52 -0800 (Sat, 08 Mar 2008) Log Message: ----------- minor changes Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/test_message.py Modified: trunk/sandbox/fcp2/test_fcp/test_message.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_message.py 2008-03-08 11:12:22 UTC (rev 339) +++ trunk/sandbox/fcp2/test_fcp/test_message.py 2008-03-08 11:12:52 UTC (rev 340) @@ -1,4 +1,4 @@ -"""Unittests for fcp2_0_message""" +"""Unittests for fcp2.message.py""" import os, sys import socket @@ -14,7 +14,6 @@ hack = _RelImportHack(3) from fcp2.client import Client -Message =Client.message.Message from fcp2 import consts This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-08 11:12:22
|
Revision: 339 http://fclient.svn.sourceforge.net/fclient/?rev=339&view=rev Author: jUrner Date: 2008-03-08 03:12:22 -0800 (Sat, 08 Mar 2008) Log Message: ----------- adapt to new message handling 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-08 11:11:57 UTC (rev 338) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-03-08 11:12:22 UTC (rev 339) @@ -1,4 +1,4 @@ -"""Unittests for fcp2_0_client""" +"""Unittests for fcp2.client.py""" from __future__ import with_statement import os, sys @@ -22,6 +22,7 @@ from fcp2 import consts from fcp2 import iohandler +from fcp2 import message del hack #<-- rel import hack @@ -256,7 +257,11 @@ def sendResponseMessage(self, messageName, data=None, callNext=True, **params): """Posts a message to the client""" - msg = Client.message.Message(messageName, data=data, **params) + if messageName in message.MessagesAll: + msgClass = message.MessagesAll[messageName] + else: + msgClass = message.newMessageType(messageName) + msg = msgClass(data=data, **params) self.fcpClient.ioHandler.io.readBuffer += msg.toString() if callNext: self.fcpClient.next() @@ -440,7 +445,7 @@ self.getIO().setBroken(True) # send a test message - self.assertRaises(iohandler.IOBroken, self.fcpClient.sendMessage, 'test' ) + self.assertRaises(iohandler.IOBroken, self.fcpClient.sendMessage, message.newMessageType('test')()) # check if ClientDisconnected events has been triggered msg = self.assertHasNextEvent( @@ -476,6 +481,7 @@ ('DisconnectReason', consts.DisconnectReason.Shutdown) #('Param', NodeHelloMessage) # can not test here ) + self.failUnless('Param' in msg.params) self.assertEqual(msg['Param'], None) @@ -1954,8 +1960,7 @@ def test_resend_CHK(self): myKey = 'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo' - msg = client.message.Message( - consts.Message.ClientPut, + msg = message.ClientPut( URI=myKey, Persistence=consts.Persistence.Connection, ) @@ -1975,8 +1980,7 @@ def test_resend_SSK(self): myKey = 'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA' - msg = client.message.Message( - consts.Message.ClientPut, + msg = message.ClientPut( URI=myKey + '/foo', Persistence=consts.Persistence.Connection, ) @@ -1998,8 +2002,7 @@ def test_resend_USK(self): myKey = 'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA' - msg = client.message.Message( - consts.Message.ClientPut, + msg = message.ClientPut( URI=myKey + '/foo/0', Persistence=consts.Persistence.Connection, ) @@ -2020,8 +2023,7 @@ def test_resend_KSK(self): myKey = 'KSK@abs' - msg = client.message.Message( - consts.Message.ClientPut, + msg = message.ClientPut( URI=myKey, Persistence=consts.Persistence.Connection, ) @@ -2143,11 +2145,11 @@ def test_8002_SendPluginMessage_Success(self): - myIdentifier = self.fcpClient.sendPluginMessage('hi there', {'foo': "bar"}) - myRequest = self.fcpClient.getRequest(myIdentifier) + myIdentifier = '123456789' + myRequest = self.fcpClient.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) requestsAll = self.fcpClient.getRequests() - self.failUnless(myIdentifier in requestsAll) + self.failIf(myIdentifier in requestsAll) self.assertHasNextMessage( consts.Message.FCPPluginMessage, ('Identifier', myIdentifier), @@ -2164,19 +2166,11 @@ msg = self.assertHasNextEvent( self.fcpClient.events.PluginMessage, - consts.Message.FCPPluginMessage, + consts.Message.FCPPluginReply, ('PluginName', 'hi there'), ('Identifier', myIdentifier), - ('RequestStatus', consts.RequestStatus.Success | - consts.RequestStatus.RemovedFromQueue | - consts.RequestStatus.Completed - ), + ('baz', '12345'), ) - reply = msg['PluginReply'] - self.failUnless(reply.params.get('baz', None) == '12345') - - self.failIf(myIdentifier in requestsAll) - self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.Completed) self.assertHasNextEvent(None) self.assertHasNextMessage(None) @@ -2185,11 +2179,11 @@ def test_8003_GetSendPluginMessage_Failure(self): - myIdentifier = self.fcpClient.sendPluginMessage('hi there', {'foo': "bar"}) - myRequest = self.fcpClient.getRequest(myIdentifier) + myIdentifier = '1234567889' + myRequest = self.fcpClient.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) requestsAll = self.fcpClient.getRequests() - self.failUnless(myIdentifier in requestsAll) + self.failIf(myIdentifier in requestsAll) self.assertHasNextMessage( consts.Message.FCPPluginMessage, ('Identifier', myIdentifier), @@ -2204,24 +2198,49 @@ ) msg = self.assertHasNextEvent( - self.fcpClient.events.PluginMessageFailed, - consts.Message.FCPPluginMessage, - #('PluginName', 'hi there'), + self.fcpClient.events.ProtocolError, + consts.Message.ProtocolError, ('Identifier', myIdentifier), - ('RequestStatus', consts.RequestStatus.Error | - consts.RequestStatus.RemovedFromQueue | - consts.RequestStatus.Completed - ), ) self.failIf(myIdentifier in requestsAll) - self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.Completed) - + self.assertHasNextEvent(None) self.assertHasNextMessage(None) self.failIf(requestsAll) + def test_8003_GetSendPluginMessage_Identifiercollision(self): + myIdentifier = '1234567889' + myRequest = self.fcpClient.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"}) + requestsAll = self.fcpClient.getRequests() + + self.failIf(myIdentifier in requestsAll) + self.assertHasNextMessage( + consts.Message.FCPPluginMessage, + ('Identifier', myIdentifier), + ('PluginName', 'hi there'), + ('foo', 'bar'), + ) + + self.sendResponseMessage( + consts.Message.IdentifierCollision, + Identifier=myIdentifier, + ) + + msg = self.assertHasNextEvent( + self.fcpClient.events.IdentifierCollision, + consts.Message.IdentifierCollision, + ('Identifier', myIdentifier), + ) + + self.failIf(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + #*********************************************************************************** #TODO: class TestConfig(BaseTestConnectedClient): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-08 11:11:53
|
Revision: 338 http://fclient.svn.sourceforge.net/fclient/?rev=338&view=rev Author: jUrner Date: 2008-03-08 03:11:57 -0800 (Sat, 08 Mar 2008) Log Message: ----------- adapt to new message handling Modified Paths: -------------- trunk/sandbox/fcp2/iohandler.py Modified: trunk/sandbox/fcp2/iohandler.py =================================================================== --- trunk/sandbox/fcp2/iohandler.py 2008-03-08 11:10:20 UTC (rev 337) +++ trunk/sandbox/fcp2/iohandler.py 2008-03-08 11:11:57 UTC (rev 338) @@ -181,13 +181,13 @@ """ @paran ioPrototype: (L{IOObjectBase}) derrived class to handle message io """ - self._ioPrototype = ioPrototype self._log = logging.getLogger(consts.LoggerNames.IOHandler) self._receiveBuffer = '' - self.io = None - + self.io = None + + def connect(self, duration=20, timeout=0.5, **kwargs): """Connect to the io device @@ -313,9 +313,13 @@ if not p: raise MessageParseError('Missing message name') msgName = p.pop(0) - msg = message.Message(msgName) - paramTypes = types.MessageParamTypes.get(msgName, None) - + msgClass = message.MessagesAll.get(msgName, None) + # TODO: log? + if msgClass is None: + self._log.debug(consts.LogMessages.CreatingNewMessageType + ' "%s"' % msgClassname) + msgClass = message.newMessageType(msgName) + msg = msgClass() + # process param --> value fields # #NOTE:usually if data is passed DataLength determines how much have to handle @@ -327,12 +331,13 @@ paramName, sep, paramValue = line.partition('=') # covert fcp to python value if necessary - if paramTypes is not None: - paramType = paramTypes.get(paramName, None) - if paramType is not None: - paramValue = paramType.fcpToPython(paramValue) + paramType = msg._param_types_.get(paramName, None) + if paramType is not None: + paramValue = paramType.fcpToPython(paramValue) msg[paramName] = paramValue + #TODO: move to message.ClientPutComplexDir + # handle special case PutComplexDir if isClientPutComplexDir: tmp_paramName = paramName.split('.') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |