fclient-commit Mailing List for fclient (Page 24)
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-04-09 07:45:28
|
Revision: 387 http://fclient.svn.sourceforge.net/fclient/?rev=387&view=rev Author: jUrner Date: 2008-04-09 00:45:33 -0700 (Wed, 09 Apr 2008) Log Message: ----------- moved more logging stuff to consts Modified Paths: -------------- trunk/sandbox/fcp2/iohandler.py Modified: trunk/sandbox/fcp2/iohandler.py =================================================================== --- trunk/sandbox/fcp2/iohandler.py 2008-04-09 07:45:07 UTC (rev 386) +++ trunk/sandbox/fcp2/iohandler.py 2008-04-09 07:45:33 UTC (rev 387) @@ -8,7 +8,6 @@ import logging import socket import time -import traceback #--> rel import hack, so we don't have to put the package on sys.path @@ -26,9 +25,6 @@ del hack #<-- rel import hack - -logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) -logging.addLevelName(consts.DebugVerbosity.Quiet, '') #***************************************************************************** # #***************************************************************************** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-09 07:45:03
|
Revision: 386 http://fclient.svn.sourceforge.net/fclient/?rev=386&view=rev Author: jUrner Date: 2008-04-09 00:45:07 -0700 (Wed, 09 Apr 2008) Log Message: ----------- moved more logging stuff to consts Modified Paths: -------------- trunk/sandbox/fcp2/config.py Modified: trunk/sandbox/fcp2/config.py =================================================================== --- trunk/sandbox/fcp2/config.py 2008-04-09 07:44:59 UTC (rev 385) +++ trunk/sandbox/fcp2/config.py 2008-04-09 07:45:07 UTC (rev 386) @@ -130,8 +130,7 @@ self.parent = None self.name = None self.children = {} - self._log = logging.getLogger(consts.LoggerNames.Config) - + if configDataMsg is not None: for key, value in configDataMsg.params.items(): self.addNewValue(key, value) @@ -166,7 +165,7 @@ paramType = message.ConfigMessageParamTypes.get(key, None) if paramType is None: paramType = types.FcpType - self._log.warning('Unknown key: %r' % components) + consts.Logger.Config.warning('Unknown key: %r' % components) # find or create new config item if necessary components = message.ConfigMessageParamTypes.splitAll(components) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-09 07:44:54
|
Revision: 385 http://fclient.svn.sourceforge.net/fclient/?rev=385&view=rev Author: jUrner Date: 2008-04-09 00:44:59 -0700 (Wed, 09 Apr 2008) Log Message: ----------- moved more logging stuff to consts Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-04-09 07:44:40 UTC (rev 384) +++ trunk/sandbox/fcp2/client.py 2008-04-09 07:44:59 UTC (rev 385) @@ -218,9 +218,6 @@ del hack #<-- rel import hack - -logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) -logging.addLevelName(consts.DebugVerbosity.Quiet, '') #************************************************************************************************* # #************************************************************************************************* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-09 07:44:36
|
Revision: 384 http://fclient.svn.sourceforge.net/fclient/?rev=384&view=rev Author: jUrner Date: 2008-04-09 00:44:40 -0700 (Wed, 09 Apr 2008) Log Message: ----------- moved more logging stuff to consts Modified Paths: -------------- trunk/sandbox/fcp2/consts.py Modified: trunk/sandbox/fcp2/consts.py =================================================================== --- trunk/sandbox/fcp2/consts.py 2008-04-09 07:35:09 UTC (rev 383) +++ trunk/sandbox/fcp2/consts.py 2008-04-09 07:44:40 UTC (rev 384) @@ -3,6 +3,7 @@ """Freennet Client Protocol consts and type mappings""" import logging +import sys #***************************************************************************** # exceptions #***************************************************************************** @@ -285,12 +286,16 @@ """Package loggers""" Fcp = logging.getLogger('Fcp') Client = logging.getLogger('Fcp.Client') + Config = logging.getLogger('Fcp.Config') Event = logging.getLogger('Fcp.Client.Event') IOHandler =logging.getLogger('Fcp.Client.IOHandler') IO =logging.getLogger('Fcp.Client.IOHandler.IO') Message = logging.getLogger('Fcp.Client.Message') - +logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) +logging.addLevelName(DebugVerbosity.Quiet, '') + + class LogMessages: """Strings used for log infos""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-09 07:35:10
|
Revision: 383 http://fclient.svn.sourceforge.net/fclient/?rev=383&view=rev Author: jUrner Date: 2008-04-09 00:35:09 -0700 (Wed, 09 Apr 2008) Log Message: ----------- adapt docs Modified Paths: -------------- trunk/sandbox/fcp2/iohandler.py Modified: trunk/sandbox/fcp2/iohandler.py =================================================================== --- trunk/sandbox/fcp2/iohandler.py 2008-04-09 07:32:18 UTC (rev 382) +++ trunk/sandbox/fcp2/iohandler.py 2008-04-09 07:35:09 UTC (rev 383) @@ -60,8 +60,8 @@ """Should read n bytes from the device @return: always None - @raise L{IOBroken}: in case something goes wrong - @raise L{IOTimeout}: if the read operation times out + @raise L{consts.IOBrokenError}: in case something goes wrong + @raise L{consts.IOTimeoutError}: if the read operation times out """ raise consts.IOBrokenError('Broken', consts.Logger.IO.error) @@ -69,7 +69,7 @@ """Should write bytes to the device @return: always None - @raise L{IOBroken}: in case something goes wrong + @raise L{consts.IOBrokenError}: in case something goes wrong """ raise consts.IOBrokenError('Broken', consts.Logger.IO.error) @@ -77,7 +77,7 @@ """Should close the io device @return: always None - @raise L{IOClosed}: if the device is already closed + @raise L{consts.IOClosedError}: if the device is already closed """ raise consts.IOClosedError('Closed', consts.Logger.IO.error) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-09 07:32:14
|
Revision: 382 http://fclient.svn.sourceforge.net/fclient/?rev=382&view=rev Author: jUrner Date: 2008-04-09 00:32:18 -0700 (Wed, 09 Apr 2008) Log Message: ----------- moved errors and loggers to consts for easier access 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-04-09 07:32:04 UTC (rev 381) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-04-09 07:32:18 UTC (rev 382) @@ -281,7 +281,7 @@ self.client.ioHandler.io.setReverseDirection(True) try: msg = self.client.ioHandler.readMessage() - except self.client.ioHandler.IOTimeout: + except consts.IOTimeoutError: return None finally: self.client.ioHandler.io.setReverseDirection(False) @@ -426,7 +426,7 @@ enum.next() except StopIteration: break - except self.client.ioHandler.IOBroken, d: + except consts.IOBrokenError, d: errorRaised = True self.assertHasNextEvent( self.client.events.ClientDisconnected, @@ -731,7 +731,7 @@ self.connectClient() self.getIO().setBroken(True) - self.assertRaises(self.client.ioHandler.IOBroken, self.client.next, ) + self.assertRaises(consts.IOBrokenError, self.client.next, ) self.assertHasNextEvent( self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, @@ -773,7 +773,7 @@ self.connectClient() self.getIO().setBroken(True) - self.assertRaises(self.client.ioHandler.IOBroken, self.client.sendMessage, self.client.message.ClientHello()) + self.assertRaises(consts.IOBrokenError, self.client.sendMessage, self.client.message.ClientHello()) self.assertHasNextEvent( self.client.events.ClientDisconnected, consts.Message.ClientDisconnected, @@ -1089,7 +1089,7 @@ callNext=False ) - self.assertRaises(self.client.ioHandler.MessageParseError, self.client.next) + self.assertRaises(consts.MessageParseError, self.client.next) self.failIf(myIdentifier in requestsAll) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-09 07:32:06
|
Revision: 381 http://fclient.svn.sourceforge.net/fclient/?rev=381&view=rev Author: jUrner Date: 2008-04-09 00:32:04 -0700 (Wed, 09 Apr 2008) Log Message: ----------- moved errors and loggers to consts for easier access 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-04-09 07:31:51 UTC (rev 380) +++ trunk/sandbox/fcp2/test_fcp/dummy_io.py 2008-04-09 07:32:04 UTC (rev 381) @@ -33,30 +33,30 @@ def connect(self, **kwargs): if not self._allowConnect: - raise iohandler.IOHandler.IOConnectFailed('Refused') + raise consts.IOConnectFailedError('Refused') self._isOpen = True def read(self, n): if self._isBroken: - raise iohandler.IOHandler.IOBroken('Broken') + raise consts.IOBrokenError('Broken') if not self.isOpen(): - raise iohandler.IOHandler.IOClosed('Closed') + raise consts.IOClosedError('Closed') if self._reverseDirection: if not self.writeBuffer: - raise iohandler.IOHandler.IOTimeout('Timeout') + raise consts.IOTimeoutError('Timeout') bytes, self.writeBuffer = self.writeBuffer[ :n], self.writeBuffer[n: ] else: if not self.readBuffer: - raise iohandler.IOHandler.IOTimeout('Timeout') + raise consts.IOTimeoutError('Timeout') bytes, self.readBuffer = self.readBuffer[ :n], self.readBuffer[n: ] return bytes def write(self, bytes): if self._isBroken: - raise iohandler.IOHandler.IOBroken('Broken') + raise consts.IOBrokenError('Broken') if not self.isOpen(): - raise iohandler.IOHandler.IOClosed('Closed') + raise consts.IOClosedError('Closed') self.writeBuffer += bytes def close(self): @@ -68,7 +68,7 @@ self.readBuffer = '' self.writeBuffer = '' else: - raise iohandler.IOHandler.IOClosed('Closed') + raise consts.IOClosedError('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-04-09 07:31:43
|
Revision: 380 http://fclient.svn.sourceforge.net/fclient/?rev=380&view=rev Author: jUrner Date: 2008-04-09 00:31:51 -0700 (Wed, 09 Apr 2008) Log Message: ----------- moved errors and loggers to consts for easier access Modified Paths: -------------- trunk/sandbox/fcp2/iohandler.py Modified: trunk/sandbox/fcp2/iohandler.py =================================================================== --- trunk/sandbox/fcp2/iohandler.py 2008-04-09 07:31:36 UTC (rev 379) +++ trunk/sandbox/fcp2/iohandler.py 2008-04-09 07:31:51 UTC (rev 380) @@ -54,7 +54,7 @@ @return: always None @raise L{IOConnectFailed}: in case something goes wrong """ - raise IOHandler.IOConnectFailed('Failed') + raise consts.IOConnectFailedError('Failed', consts.Logger.IO.error) def read(self, n): """Should read n bytes from the device @@ -63,7 +63,7 @@ @raise L{IOBroken}: in case something goes wrong @raise L{IOTimeout}: if the read operation times out """ - raise OHandler.IOBroken('Broken') + raise consts.IOBrokenError('Broken', consts.Logger.IO.error) def write(self, bytes): """Should write bytes to the device @@ -71,7 +71,7 @@ @return: always None @raise L{IOBroken}: in case something goes wrong """ - raise OHandler.IOBroken('Broken') + raise consts.IOBrokenError('Broken', consts.Logger.IO.error) def close(self): """Should close the io device @@ -79,7 +79,7 @@ @return: always None @raise L{IOClosed}: if the device is already closed """ - raise OHandler.IOClosed('Closed') + raise consts.IOClosedError('Closed', consts.Logger.IO.error) def isOpen(self): """Should check if the device is open @@ -121,7 +121,7 @@ try: self.socket.connect((host, port)) except socket.error, details: - raise IOHandler.IOConnectFailed(details) + raise consts.IOConnectFailedError(details, consts.Logger.IO.error) def read(self, n): try: @@ -129,10 +129,10 @@ if p == '': raise socket.error('Socket closed by host') except socket.timeout, details: - raise IOHandler.IOTimeout(details) + raise consts.IOTimeoutError(details, consts.Logger.IO.error) except socket.error, details: self.close() - raise IOHandler.IOBroken(details) + raise consts.IOBrokenError(details, consts.Logger.IO.error) else: return p @@ -144,11 +144,11 @@ totalSend += n except socket.error, details: self.close() - raise IOHandler.IOBroken(details) + raise consts.IOBrokenError(details, consts.Logger.IO.error) def close(self): if self.socket is None: - raise IOHandler.IOClosed('Closed') + raise consts.IOClosedError('Closed', consts.Logger.IO.error) self.socket.close() self.socket = None @@ -165,23 +165,6 @@ """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' @@ -191,7 +174,6 @@ @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 @@ -226,21 +208,21 @@ if self.isOpen(): self.close() - self._log.info(consts.LogMessages.Connecting + ' %r' % kwargs) + consts.Logger.IOHandler.info(consts.LogMessages.Connecting + ' %r' % 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) - except self.IOConnectFailed, details: - self._log.info(consts.LogMessages.ConnectingFailed + ' %s %s' % (self.IOConnectFailed, details)) + except consts.IOConnectFailedError, details: + consts.Logger.IOHandler.info(consts.LogMessages.ConnectingFailed + ' (%s)' % details) yield False else: - self._log.info(consts.LogMessages.Connected) + consts.Logger.IOHandler.info(consts.LogMessages.Connected) yield True break # continue polling - self._log.info(consts.LogMessages.Retry) + consts.Logger.IOHandler.info(consts.LogMessages.Retry) timeElapsed += timeout time.sleep(timeout) @@ -249,7 +231,7 @@ def close(self): """Closes the handler""" - self._log.debug(consts.LogMessages.Closing) + consts.Logger.IOHandler.debug(consts.LogMessages.Closing) self._receiveBuffer = '' if self.io is not None: self.io.close() @@ -273,21 +255,12 @@ try: #TODO: if \r\n is possible in Fcp, replace it by \n p = self.io.read(n) - if not p: - raise ValueError('No bytes received and IO did not raise as expected?!?') + assert p, 'No bytes received and IO did not raise as expected?!?' self._receiveBuffer += p - except self.IOBroken, details: - self._log.critical(consts.LogMessages.SocketDied) - self.close() - 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.format_exc()) - self.close() - raise Exception(details) + except consts.IOTimeoutError, details: # nothing in queue + raise consts.IOTimeoutError(details) + - def readMessage(self): """Reads the next message from io device @return: (Message) next message from the socket @@ -324,14 +297,14 @@ msgName = p.pop(0) msgClass = message.MessagesAll.get(msgName, None) if msgClass is None: - self._log.debug(consts.LogMessages.CreatingNewMessageType + ' "%s"' % msgClassname) + consts.Logger.IOHandler.debug(consts.LogMessages.CreatingNewMessageType + ' "%s"' % msgClassname) msgClass = message.newMessageType(msgName) msg = msgClass() # process param --> value fields params = dict([line.split('=', 1) for line in p]) if not msg._restoreParams(params): - raise self.MessageParseError('Invalid message parameters') + raise consts.MessageParseError('Invalid message parameters: ' + msg.pprint(), consts.Logger.IOHandler.error) # get associated data if necessary if mayHaveData: @@ -350,7 +323,7 @@ self._receiveBuffer = chunk + self._receiveBuffer raise IOTimeout(details) - self._log.debug(consts.LogMessages.Received + msg.pprint()) + consts.Logger.IOHandler.debug(consts.LogMessages.Received + msg.pprint()) return msg @@ -360,25 +333,10 @@ @return: Message @raise L{IOBroken}: if the connection to the io dies unexpectedly """ - self._log.debug(consts.LogMessages.Sending + msg.pprint()) - try: - self.io.write(msg.toString()) - except self.IOBroken, details: - self._log.critical(consts.LogMessages.SocketDied) - self.close() - raise self.IOBroken(details) - except Exception, details: - self._log.critical(consts.LogMessages.CaughtException + '\n' + traceback.format_exc()) - self.close() - raise Exception(details) - + consts.Logger.IOHandler.debug(consts.LogMessages.Sending + msg.pprint()) + self.io.write(msg.toString()) - def setDebugVerbosity(self, debugVerbosity): - """Adjusts the debug verbosity. See L{consts.DebugVerbosity} - """ - self._log.setLevel(debugVerbosity) - - + def setIOPrototype(self, ioObject): """Sets the io prototype to be used by the handler This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-09 07:31:32
|
Revision: 379 http://fclient.svn.sourceforge.net/fclient/?rev=379&view=rev Author: jUrner Date: 2008-04-09 00:31:36 -0700 (Wed, 09 Apr 2008) Log Message: ----------- moved errors and loggers to consts for easier access Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-04-09 07:30:07 UTC (rev 378) +++ trunk/sandbox/fcp2/client.py 2008-04-09 07:31:36 UTC (rev 379) @@ -269,10 +269,6 @@ self._connectionName = self.setConnectionName(connectionName) self._ddaTests = [] # currently running DDA tests (request0, ... requestN) self.events = events.Events() - self._loggers = { - 'Event': logging.getLogger(consts.LoggerNames.ClientEvents), - 'Runtime': logging.getLogger(consts.LoggerNames.ClientRuntime), - } self._nodeHelloMessage = None self._requests = {} # currently running requests (requestIdentifier --> request) self.ioHandler = iohandler.IOHandler() @@ -289,16 +285,16 @@ ############################################################### def _captureEvent(self, event, request): if event != self.events.Idle: - self._loggers['Event'].debug(consts.LogMessages.EventTriggered + event.name) - - + consts.Logger.Event.info(consts.LogMessages.EventTriggered + event.name) + + def _close(self, msg): """Closes the client @param msg: message to pass to the ClientDisconnected event or None to not inform listeners @todo: complain if the client is already closed? """ - self._loggers['Runtime'].info(consts.LogMessages.Closing) + consts.Logger.Client.info(consts.LogMessages.Closing) # clean left over DDA test tmp files for initialRequest in self._ddaTests: @@ -548,19 +544,17 @@ """Returns the current verbosity level of the client @return: L{consts.DebugVerbosity} """ - for logger in self._loggers.values(): - return logger.getEffectiveLevel() + return consts.Logger.Client.getEffectiveLevel() + #TESTED def setDebugVerbosity(self, debugVerbosity): """Sets the verbosity level of the client @param debugVerbosity: L{consts.DebugVerbosity} """ - for logger in self._loggers.values(): - logger.setLevel(debugVerbosity) - self.ioHandler.setDebugVerbosity(debugVerbosity) + consts.Logger.Client.setLevel(debugVerbosity) + - #TESTED def startNode(self, cmdline): """Starts the freenet node @@ -1129,16 +1123,16 @@ """ try: msg = self.ioHandler.readMessage() - except self.ioHandler.IOTimeout, details: + except consts.IOTimeoutError, details: msg = message.ClientSocketTimeout() if dispatch: self.events.Idle(msg) - except self.ioHandler.IOBroken, details: + except consts.IOBrokenError, details: msg = message.ClientDisconnected( DisconnectReason=consts.DisconnectReason.ConnectionDied, ) self._close(msg) - raise self.ioHandler.IOBroken(details) + raise consts.IOBrokenError(details) else: if dispatch: self.handleMessage(msg) @@ -1157,7 +1151,7 @@ try: msg = self.next() except KeyboardInterrupt: - self._loggers['Runtime'].info(consts.LogMessages.KeyboardInterrupt) + consts.Logger.Client.info(consts.LogMessages.KeyboardInterrupt) return if msg == message.ClientSocketDied: return @@ -1175,13 +1169,13 @@ break if not haveRunningRequests: - self._loggers['Runtime'].info(consts.LogMessages.AllRequestsCompleted) + consts.Logger.Client.info(consts.LogMessages.AllRequestsCompleted) break try: msg = self.next() except KeyboardInterrupt: - self._loggers['Runtime'].info(consts.LogMessages.KeyboardInterrupt) + sconsts.Logger.Client.info(consts.LogMessages.KeyboardInterrupt) break if msg == message.ClientSocketDied: @@ -1204,12 +1198,12 @@ # ...so assume data was send, cos there is no way to proove it was not send try: self.ioHandler.sendMessage(msg) - except self.ioHandler.IOBroken, details: + except consts.IOBrokenError, details: errorMsg = message.ClientDisconnected( DisconnectReason=consts.DisconnectReason.ConnectionDied, ) self._close(errorMsg) - raise self.ioHandler.IOBroken(details) + raise consts.IOBrokenError(details) ######################################################### ## This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-09 07:30:05
|
Revision: 378 http://fclient.svn.sourceforge.net/fclient/?rev=378&view=rev Author: jUrner Date: 2008-04-09 00:30:07 -0700 (Wed, 09 Apr 2008) Log Message: ----------- moved errors and loggers to consts for easier access Modified Paths: -------------- trunk/sandbox/fcp2/consts.py Modified: trunk/sandbox/fcp2/consts.py =================================================================== --- trunk/sandbox/fcp2/consts.py 2008-04-08 21:43:58 UTC (rev 377) +++ trunk/sandbox/fcp2/consts.py 2008-04-09 07:30:07 UTC (rev 378) @@ -3,6 +3,48 @@ """Freennet Client Protocol consts and type mappings""" import logging +#***************************************************************************** +# exceptions +#***************************************************************************** +class MessageParseError(Exception): + """Exception raised when a message could not be parsed succesfuly""" + def __init__(self, message, logMethod=None): + if logMethod is not None: + logMethod(self.__class__.__name__ + message) + Exception.__init__(self, message) + + +class IOConnectFailedError(Exception): + """Exception raised if the object can not be connected""" + def __init__(self, message, logMethod=None): + if logMethod is not None: + logMethod(self.__class__.__name__ + message) + Exception.__init__(self, message) + + +class IOClosedError(Exception): + """Exception raised if the object is closed""" + def __init__(self, message, logMethod=None): + if logMethod is not None: + logMethod(self.__class__.__name__ + message) + Exception.__init__(self, message) + + +class IOBrokenError(Exception): + """Exception raised if the IO connection is broken""" + def __init__(self, message, logMethod=None): + if logMethod is not None: + logMethod(self.__class__.__name__ + message) + Exception.__init__(self, message) + + +class IOTimeoutError(Exception): + """Exception raised when the io connection is closed""" + def __init__(self, message, logMethod=None): + if logMethod is not None: + logMethod(self.__class__.__name__ + message) + Exception.__init__(self, message) + #************************************************************************ # #************************************************************************ @@ -238,27 +280,16 @@ Invalid = '' TypesAll = (SSK, KSK, CHK, USK, SVK) + +class Logger: + """Package loggers""" + Fcp = logging.getLogger('Fcp') + Client = logging.getLogger('Fcp.Client') + Event = logging.getLogger('Fcp.Client.Event') + IOHandler =logging.getLogger('Fcp.Client.IOHandler') + IO =logging.getLogger('Fcp.Client.IOHandler.IO') + Message = logging.getLogger('Fcp.Client.Message') -class LoggerNames: - """Logger names used by the the package - - @cvar Fcp: root logger for the packsge - @cvar Client: root logger for the client - @cvar ClientEvents: logs events the client emits - @cvar ClientMessages: logs messages the client sends and receives - @cvar ClientRuntime: logs runtime information - - @cvar Config: logs config related information - """ - Fcp = 'Fcp' - - Client = Fcp + '.Client' - ClientEvents = Client + '.Events' - ClientRuntime = Client + '.Runtime' - Config = Fcp + '.Config' - - IOHandler = Fcp + '.IOHandler' - class LogMessages: """Strings used for log infos""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-08 21:43:52
|
Revision: 377 http://fclient.svn.sourceforge.net/fclient/?rev=377&view=rev Author: jUrner Date: 2008-04-08 14:43:58 -0700 (Tue, 08 Apr 2008) Log Message: ----------- socket io was broken. fixed Modified Paths: -------------- trunk/sandbox/fcp2/iohandler.py Modified: trunk/sandbox/fcp2/iohandler.py =================================================================== --- trunk/sandbox/fcp2/iohandler.py 2008-04-08 10:12:57 UTC (rev 376) +++ trunk/sandbox/fcp2/iohandler.py 2008-04-08 21:43:58 UTC (rev 377) @@ -114,10 +114,10 @@ @param host: (str) host to connect to @param port: (int) port to use """ - if self.isOpen(): self.close() self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.socket.settimeout(self.Timeout) try: self.socket.connect((host, port)) except socket.error, details: @@ -140,7 +140,7 @@ try: totalSend = 0 while totalSend < len(bytes): - n = self.io.write(bytes[totalSend: ]) + n = self.socket.send(bytes[totalSend: ]) totalSend += n except socket.error, details: self.close() @@ -228,7 +228,6 @@ self._log.info(consts.LogMessages.Connecting + ' %r' % kwargs) self.io = self._ioPrototype() - self.io.setTimeout(self.io.Timeout) yield False # have to yield at least once to make unittests work (io has to be created!!) try: self.io.connect(**kwargs) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-08 10:12:57
|
Revision: 376 http://fclient.svn.sourceforge.net/fclient/?rev=376&view=rev Author: jUrner Date: 2008-04-08 03:12:57 -0700 (Tue, 08 Apr 2008) Log Message: ----------- typo 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-04-08 10:11:37 UTC (rev 375) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-04-08 10:12:57 UTC (rev 376) @@ -1219,7 +1219,7 @@ #*********************************************************************************** # #*********************************************************************************** -class Test_getKeyinfo(BaseTestClient): +class Test_getKeyInfo(BaseTestClient): def test_100_request_registered(self): @@ -3370,7 +3370,7 @@ Test_modifyConfig, Test_getData, Test_getFile, - Test_getKeyinfo, + Test_getKeyInfo, Test_subscribeUSK, #TestDisconnectReason, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-08 10:12:16
|
Revision: 375 http://fclient.svn.sourceforge.net/fclient/?rev=375&view=rev Author: jUrner Date: 2008-04-08 03:11:37 -0700 (Tue, 08 Apr 2008) Log Message: ----------- whitespace 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-04-08 10:10:08 UTC (rev 374) +++ trunk/sandbox/fcp2/test_fcp/dummy_io.py 2008-04-08 10:11:37 UTC (rev 375) @@ -58,7 +58,7 @@ if not self.isOpen(): raise iohandler.IOHandler.IOClosed('Closed') self.writeBuffer += bytes - + def close(self): self._isBroken = False self._allowConnect = True This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-08 10:10:35
|
Revision: 374 http://fclient.svn.sourceforge.net/fclient/?rev=374&view=rev Author: jUrner Date: 2008-04-08 03:10:08 -0700 (Tue, 08 Apr 2008) Log Message: ----------- superfluous import Modified Paths: -------------- trunk/sandbox/fcp2/types.py Modified: trunk/sandbox/fcp2/types.py =================================================================== --- trunk/sandbox/fcp2/types.py 2008-04-08 10:08:08 UTC (rev 373) +++ trunk/sandbox/fcp2/types.py 2008-04-08 10:10:08 UTC (rev 374) @@ -17,7 +17,6 @@ hack =_RelImportHack(2) from fcp2 import consts -from fcp2.fcp_lib import numbers del hack This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-08 10:08:05
|
Revision: 373 http://fclient.svn.sourceforge.net/fclient/?rev=373&view=rev Author: jUrner Date: 2008-04-08 03:08:08 -0700 (Tue, 08 Apr 2008) Log Message: ----------- use pmstruct to handle persistent data Modified Paths: -------------- trunk/sandbox/fcp2/message.py Modified: trunk/sandbox/fcp2/message.py =================================================================== --- trunk/sandbox/fcp2/message.py 2008-04-08 10:07:36 UTC (rev 372) +++ trunk/sandbox/fcp2/message.py 2008-04-08 10:08:08 UTC (rev 373) @@ -16,6 +16,7 @@ from fcp2 import consts from fcp2 import types +from fcp2.fcp_lib import pmstruct from fcp2.fcp_lib import uuid @@ -157,9 +158,9 @@ def _setPersistentParams(self, persistentData): params = persistentData.split(PersistentParamsSep) if len(params) > len(self._persistent_params_): - raise ValueError('Too many parameters in data') + raise ValueError('Too many parameters in persistentData') elif len(params) < len(self._persistent_params_): - raise ValueError('Too few parameters in data') + raise ValueError('Too few parameters in persistentData') for n, (getter, setter) in enumerate(self._persistent_params_): setter(self, params[n]) @@ -388,8 +389,28 @@ ConfigMessageParamTypes = _ConfigMessageParamTypes() #******************************************************************************** -# +# equipment for messages with persustent params and additional params #******************************************************************************** +class PeristentParamsGet(pmstruct.PoorMansStruct): + _fields_ = ( + ('Flags', pmstruct.Int), + ('InitTime', pmstruct.Float), + ('PersistentUserData', pmstruct.Str), + ) + +PeristentParamsPut = PeristentParamsGet + + +class PersistentParams(object): + + def __init__(self, mapping): + self.mapping = mapping + + def fromString(self, string): + pass + + + PeerMessageParamTypes = { 'ark.number': types.FcpTypeInt, 'auth.negTypes': types.FcpTypeInt, @@ -698,7 +719,7 @@ ClientPut.__init__(self, *args, **kwargs) self._dataLength = 0 - + def _restoreParams(self, params): result = ClientPut._restoreParams(self, params) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-08 10:07:33
|
Revision: 372 http://fclient.svn.sourceforge.net/fclient/?rev=372&view=rev Author: jUrner Date: 2008-04-08 03:07:36 -0700 (Tue, 08 Apr 2008) Log Message: ----------- poor mans struct to handle persistent data Added Paths: ----------- trunk/sandbox/fcp2/fcp_lib/pmstruct.py Added: trunk/sandbox/fcp2/fcp_lib/pmstruct.py =================================================================== --- trunk/sandbox/fcp2/fcp_lib/pmstruct.py (rev 0) +++ trunk/sandbox/fcp2/fcp_lib/pmstruct.py 2008-04-08 10:07:36 UTC (rev 372) @@ -0,0 +1,140 @@ +"""Poor mans structure + + + +""" + +import base64 +#**************************************************************************** +# +#**************************************************************************** +Str = (base64.b64decode, base64.b64encode, (str, unicode)) +Int = (int, str, int) +Float = (float, float) + + + +class PoorMansStruct(object): + """Poor mans structure + + Converts a maping to a string and vice versa + + + Subclasses must define a _fields_ attribute wich is a mapping from field name + to conversion methods (fieldName, (getter, setter, fieldType)). getter() should convert + the fields value to the desired python type, setter should convert the python + type to string. Both will be called with one argument: the value to convert + and should rasise if the value can not be converted. fieldType is the data type + expected on mappping conversion. + + For convenience the module defines some standard types like Int, Float + and String. + + >>> class S(PoorMansStruct): + ... _fields_ = [ + ... ('Foo', (int, str, int)), + ... ('Bar', Str), + ... ] + + To convert a mapping to a string, call toString() with the mapping to convert + >>> p = S.toString({'Foo': 123456, 'Bar': 'abcdefg'}) + >>> p + '123456\\x01YWJjZGVmZw==' + + To convert a string to a mapping call fromString() with the string to convert + >>> d = S.fromString(p) + >>> sorted(d.items()) + [('Bar', 'abcdefg'), ('Foo', 123456)] + + + Field names must corrospond to mapping names + >>> p = S.toString({'IAmInvalid': 123456, 'Bar': 'abcdefg'}) + Traceback (most recent call last): + ... + KeyError: 'Foo' + + + All field names must be present in the mapping passed + >>> p = S.toString({'Bar': 'abcdefg'}) + Traceback (most recent call last): + ... + KeyError: 'Foo' + + types of the mapping have to corrospond to field types + >>> p = S.toString({'Foo': 'invalid-int', 'Bar': 'abcdefg'}) + Traceback (most recent call last): + ... + ValueError: Invalid type for field "Foo, expected: <type 'int'>" + + invalid field types are detected on converting the string back to a mapping + >>> p = 'invalid-int\\x01YWJjZGVmZw==' + >>> S.fromString(p) + Traceback (most recent call last): + ... + ValueError: Invalid field #0: (invalid literal for int() with base 10: 'invalid-int') + + too few fields in the input strig will be recognized + >>> p = 'YWJjZGVmZw==' + >>> S.fromString(p) + Traceback (most recent call last): + ... + ValueError: Too few fields in input string + + ...aswell as too many + >>> p = '999\x01123456\x01YWJjZGVmZw==' + >>> S.fromString(p) + Traceback (most recent call last): + ... + ValueError: Too many fields in input string + """ + + _sep_ = '\x01' + _fields_ = [] + + + @classmethod + def fromString(klass, string): + params = string.split(klass._sep_) + if len(params) > len(klass._fields_): + raise ValueError('Too many fields in input string') + if len(params) < len(klass._fields_): + raise ValueError('Too few fields in input string') + out = {} + for n, (fieldName, (getter, setter, fieldType)) in enumerate(klass._fields_): + try: + out[fieldName] = getter(params[n]) + except Exception, details: + raise ValueError('Invalid field #%s: (%s)' % (n, details)) + return out + + @classmethod + def toString(klass, mapping): + out = [] + for n, (fieldName, (getter, setter, fieldType)) in enumerate(klass._fields_): + value = mapping[fieldName] + if not isinstance(value, fieldType): + raise ValueError('Invalid type for field "%s, expected: %s"' % (fieldName, fieldType)) + try: + value = setter(value) + assert isinstance(value, str) + out.append(value) + except Exception, details: + raise ValueError('Invalid field "%s": (%s)' % (fieldName, details)) + return klass._sep_.join(out) + + +""" +class PersistentParams(PoorMansStruct): + _fields_ = [ + ('Flags', PoorMansStruct.Int), + ('InitTime', PoorMansStruct.Float), + ('PerisitstentUserData', PoorMansStruct.Str), + ] +""" +#**************************************************************************** +# +#**************************************************************************** +if __name__ == '__main__': + import doctest + print 'doctests failed: %s/%s' % doctest.testmod() + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-08 10:06:41
|
Revision: 371 http://fclient.svn.sourceforge.net/fclient/?rev=371&view=rev Author: jUrner Date: 2008-04-08 03:06:09 -0700 (Tue, 08 Apr 2008) Log Message: ----------- some fixes Modified Paths: -------------- trunk/sandbox/fcp2/iohandler.py Modified: trunk/sandbox/fcp2/iohandler.py =================================================================== --- trunk/sandbox/fcp2/iohandler.py 2008-04-08 10:05:01 UTC (rev 370) +++ trunk/sandbox/fcp2/iohandler.py 2008-04-08 10:06:09 UTC (rev 371) @@ -11,7 +11,7 @@ import traceback -#--> rel import hack +#--> rel import hack, so we don't have to put the package on sys.path class _RelImportHack(object): def __init__(self, n): fpath = os.path.abspath(__file__) @@ -138,7 +138,10 @@ def write(self, bytes): try: - self.socket.sendall(bytes) + totalSend = 0 + while totalSend < len(bytes): + n = self.io.write(bytes[totalSend: ]) + totalSend += n except socket.error, details: self.close() raise IOHandler.IOBroken(details) @@ -225,6 +228,7 @@ self._log.info(consts.LogMessages.Connecting + ' %r' % kwargs) self.io = self._ioPrototype() + self.io.setTimeout(self.io.Timeout) yield False # have to yield at least once to make unittests work (io has to be created!!) try: self.io.connect(**kwargs) @@ -232,7 +236,6 @@ self._log.info(consts.LogMessages.ConnectingFailed + ' %s %s' % (self.IOConnectFailed, details)) yield False else: - self.io.setTimeout(self.io.Timeout) self._log.info(consts.LogMessages.Connected) yield True break This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-08 10:05:12
|
Revision: 370 http://fclient.svn.sourceforge.net/fclient/?rev=370&view=rev Author: jUrner Date: 2008-04-08 03:05:01 -0700 (Tue, 08 Apr 2008) Log Message: ----------- adapt to rename event Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-04-08 10:04:42 UTC (rev 369) +++ trunk/sandbox/fcp2/client.py 2008-04-08 10:05:01 UTC (rev 370) @@ -887,6 +887,11 @@ requestType = msg['RequestType'] if requestType & consts.RequestType.MaskGet: initialRequest = message.ClientGet() + + #FIXME: does not work as expected + # ClientPutdiskDir is just a subtype of ClientPutComplexDir + # and will be passed as Files.N.* container + elif requestType == consts.RequestType.PutMultiple: initialRequest = message.ClientPutComplexDir() elif requestType == consts.RequestType.PutDir: @@ -1013,7 +1018,7 @@ if initialRequest is None: return False initialRequest['RequestStatus'] |= consts.RequestStatus.Compressed - self.events.RequestCompressionFinished(initialRequest) + self.events.RequestCompressionCompleted(initialRequest) return True elif msg == message.StartedCompression: @@ -1892,6 +1897,7 @@ ) + def chkPutMultiple(self, items, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-08 10:04:43
|
Revision: 369 http://fclient.svn.sourceforge.net/fclient/?rev=369&view=rev Author: jUrner Date: 2008-04-08 03:04:42 -0700 (Tue, 08 Apr 2008) Log Message: ----------- renamed event Modified Paths: -------------- trunk/sandbox/fcp2/events.py Modified: trunk/sandbox/fcp2/events.py =================================================================== --- trunk/sandbox/fcp2/events.py 2008-04-08 10:03:38 UTC (rev 368) +++ trunk/sandbox/fcp2/events.py 2008-04-08 10:04:42 UTC (rev 369) @@ -95,7 +95,7 @@ class RequestCompressionStarted(events.Event): """Compressing of a request has started""" - class RequestCompressionFinished(events.Event): + class RequestCompressionCompleted(events.Event): """Compressing of a request is finished""" class RequestFailed(events.Event): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-04-08 10:03:41
|
Revision: 368 http://fclient.svn.sourceforge.net/fclient/?rev=368&view=rev Author: jUrner Date: 2008-04-08 03:03:38 -0700 (Tue, 08 Apr 2008) Log Message: ----------- some consts where missing Modified Paths: -------------- trunk/sandbox/fcp2/consts.py Modified: trunk/sandbox/fcp2/consts.py =================================================================== --- trunk/sandbox/fcp2/consts.py 2008-03-11 11:21:11 UTC (rev 367) +++ trunk/sandbox/fcp2/consts.py 2008-04-08 10:03:38 UTC (rev 368) @@ -445,6 +445,8 @@ High = '2' Medium = '3' Low = '4' + Lower = '5' + Lowest = '6' class RequestModified(BaseBitFlags): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-11 11:21:07
|
Revision: 367 http://fclient.svn.sourceforge.net/fclient/?rev=367&view=rev Author: jUrner Date: 2008-03-11 04:21:11 -0700 (Tue, 11 Mar 2008) Log Message: ----------- continued rewrite of 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 11:20:32 UTC (rev 366) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-03-11 11:21:11 UTC (rev 367) @@ -861,8 +861,528 @@ self.failUnless(self.ioOpen()) +#*********************************************************************************** +# NOTE: all the in depth tests for getFile() getKeyInfo() are performed here +#*********************************************************************************** +class Test_getData(BaseTestClient): + + def test_100_request_registered(self): + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key') + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.GetData) + + def test_200_key_object_is_accepted(self): + self.connectClient() + key = self.client.key.CHK() + myIdentifier = self.client.getData(key) + requestsAll = self.client.getRequests() + + + def test_300_message_send(self): + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key') + requestsAll = self.client.getRequests() + + self.assertHasNextMessage( + 'ClientGet', + ('URI', 'arbitrary-key'), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + def test_400_progress(self): + + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key') + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + self.sendResponseMessage( + 'SimpleProgress', + Identifier=myIdentifier, + Total=0, + Required=0, + Failed=0, + FatallyFailed=0, + Succeeded=0, + ) + + self.assertHasNextEvent( + self.client.events.RequestProgress, + 'ClientGet', + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_500_completed_successfuly(self): + + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key') + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + data = 'foo' + params = { + 'Identifier': myIdentifier, + 'Global': 'false', + 'DataLength': len(data), + 'Metadata.ContentType': 'any', + } + self.sendResponseMessage( + 'DataFound', + **params + ) + # we don't expect an event here.... + self.assertHasNextEvent(None) + self.sendResponseMessage( + 'AllData', + data=data, + Identifier=myIdentifier, + Global='false', + DataLength=len(data), + ) + + # client should complete and remove the request + self.assertHasNextEvent( + self.client.events.RequestCompleted, + consts.Message.ClientGet, + ('RequestStatus', consts.RequestStatus.Success | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + data=data + ) + + # non persistent requests are removed emidiately + self.failIf(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_600_completed_with_error(self): + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key') + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + self.assertHasNextEvent( + self.client.events.RequestFailed, + consts.Message.ClientGet, + ('RequestStatus', consts.RequestStatus.Error | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + ) + + # non persistent requests are removed emidiately + self.failIf(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_700_peristent_request_auto_retrieve_data(self): + + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + + data = 'foo' + params = { + 'Identifier': myIdentifier, + 'Global': 'false', + 'DataLength': len(data), + 'Metadata.ContentType': 'any', + } + self.sendResponseMessage( + 'DataFound', + **params + ) + + self.assertHasNextMessage('GetRequestStatus') + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + + def test_800_peristent_request_not_removed_on_success(self): + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + data = 'foo' + self.sendResponseMessage( + 'AllData', + data=data, + Identifier=myIdentifier, + Global='false', + DataLength=len(data), + ) + + self.assertHasNextEvent(self.client.events.RequestCompleted) + + # persistent requests are not removed emidiately + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_900_peristent_request_not_removed_on_error(self): + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + + self.assertHasNextEvent(self.client.events.RequestFailed) + + # persistent requests are not removed emidiately + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_910_restore_peristent_request_failure(self): + self.connectClient() + requestsAll = self.client.getRequests() + myIdentifier = '123456789' + self.sendResponseMessage( + 'PersistentGet', + Identifier=myIdentifier, + ClientToken='i-am-invalid', + + callNext=False + ) + self.assertRaises(self.client.ioHandler.MessageParseError, self.client.next) + self.failIf(myIdentifier in requestsAll) + + + def test_920_restore_peristent_request_success(self): + self.connectClient() + requestsAll = self.client.getRequests() + myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + del requestsAll[myIdentifier] + + self.sendResponseMessage( + 'PersistentGet', + **myRequest.params + ) + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + msg = self.assertHasNextEvent( + self.client.events.RequestRestored, + 'ClientGet', + ('Identifier', myIdentifier), + ('RequestStatus', consts.RequestStatus.Restored), # no RequestStatus.Pending flag should be set here + ) + + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_getFile(BaseTestClient): + + def test_100_request_registered(self): + self.connectClient() + myIdentifier = self.client.getFile('arbitrary-key', 'foo.txt') + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.GetFile) + + + def test_200_key_object_is_accepted(self): + self.connectClient() + key = self.client.key.CHK() + + myIdentifier = self.client.getFile(key, 'foo.txt') + requestsAll = self.client.getRequests() + + + def test_300_dda_denied(self): + self.connectClient() + + myIdentifier = self.client.getFile( + 'arbitrary-uri', + os.path.join(DIR, 'DDATest.txt') + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + self.sendResponseMessage( + 'ProtocolError', + Code=25, # DDADenied + Identifier=myIdentifier, + ExtraDescription='An error occured', + Fatal='false', + Global='false', + ) + + # client should respond with a TestDDARequest + self.assertHasNextMessage( + consts.Message.TestDDARequest, + ('Directory', DIR), + ('WantWriteDirectory', True) + ) + + # respond with a TestDDAReply message + writeContent = 'blah' + fd, fpath = tempfile.mkstemp(dir=DIR) + os.close(fd) + self.sendResponseMessage( + 'TestDDAReply', + Directory=DIR, + WriteFilename=fpath, + ContentToWrite=writeContent, + ) + + # client should respond with a TestDDAResponse + self.assertHasNextMessage( + consts.Message.TestDDAResponse, + ('Directory', DIR) + ) + + # check if content was written + with open(fpath) as fp: + self.failUnless(fp.read() == writeContent) + + # respond with a TestDDAComplete message + self.sendResponseMessage( + 'TestDDAComplete', + Directory=DIR, + WriteDirectoryAllowed='true', + ) + + # check if our tempfile was removed + self.failIf(os.path.isfile(fpath)) + + # client sahould send a new ClientGet + msg = self.assertHasNextMessage(consts.Message.ClientGet) + + # no events should have been triggered upo to now + self.assertHasNextEvent(None) + + # respond with a PersistentGet + self.sendResponseMessage( + 'PersistentGet', + Started='false', + **msg.params + ) + + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_getKeyinfo(BaseTestClient): + + + def test_100_request_registered(self): + self.connectClient() + myIdentifier = self.client.getKeyInfo('arbitrary-key') + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.GetKeyInfo) + + def test_200_key_object_is_accepted(self): + self.connectClient() + key = self.client.key.CHK() + + myIdentifier = self.client.getKeyInfo(key) + requestsAll = self.client.getRequests() + + + def test_300_getKeyInfo_Success(self): + self.connectClient() + myIdentifier = self.client.getKeyInfo('arbitrary-uri') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + + data = 'foo' + params = { + 'Identifier': myIdentifier, + 'Global': 'false', + 'DataLength': 123456, + 'Metadata.ContentType': 'any', + } + self.sendResponseMessage( + 'DataFound', + **params + ) + self.assertHasNextEvent( + self.client.events.RequestCompleted, + consts.Message.ClientGet, + ('RequestStatus', consts.RequestStatus.Success | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + ) + self.failIf(myIdentifier in requestsAll) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_400_GetKeyInfo_TooBig(self): + self.connectClient() + + # test specdial case where ProtocolError.TooBig is handled as success + # request a arbitrary uri + myIdentifier = self.client.getKeyInfo('arbitrary-uri') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(consts.Message.ClientGet) + self.sendResponseMessage( + 'GetFailed', + Code='21', # Too big + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + self.assertHasNextEvent( + self.client.events.RequestCompleted, + consts.Message.ClientGet, + ('RequestStatus', consts.RequestStatus.Success | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + ) + self.failIf(myIdentifier in requestsAll) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_500_GetKeyInfo_Failure(self): + self.connectClient() + + # request a arbitrary file + myIdentifier = self.client.getKeyInfo('arbitrary-uri') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(consts.Message.ClientGet) + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + self.assertHasNextEvent( + self.client.events.RequestFailed, + consts.Message.ClientGet, + ('RequestStatus', consts.RequestStatus.Error | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + ) + self.failIf(myIdentifier in requestsAll) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_subscribeUSK(BaseTestClient): + + def test_100_subscribeUSK_accepts_key_object(self): + self.connectClient() + key = self.client.key.USK('123456789', 'foo', 0) + myIdentifier = self.client.subscribeUSK(key) + self.assertHasNextMessage( + 'SubscribeUSK', + ('URI', key.toString()), + ) + + + def test_200_subscribeUSK(self): + self.connectClient() + myIdentifier = self.client.subscribeUSK('arbitrary-key') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.SubscribeUSK) + + self.assertHasNextMessage( + 'SubscribeUSK', + ('URI', 'arbitrary-key'), + ) + self.failUnless(myIdentifier in requestsAll) + + # usk update requests are permanent, so the completed flag shuld always be set + myRequest['RequestStatus'] == self.client.consts.RequestStatus.Completed + + self.sendResponseMessage( + 'SubscribedUSKUpdate', + Edition=99, + Identifier=myIdentifier, + URI='arbitrary-uri' + ) + + self.assertHasNextEvent( + self.client.events.USKUpdated, + 'SubscribeUSK', + ('Edition', 99), + ('Identifier', myIdentifier), + ('URI', 'arbitrary-key'), + ) + + + + ################################################### ################################################### ################################################### @@ -2848,6 +3368,10 @@ Test_sendMessage, Test_getConfig, Test_modifyConfig, + Test_getData, + Test_getFile, + Test_getKeyinfo, + Test_subscribeUSK, #TestDisconnectReason, #TestClientGet, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-11 11:20:32
|
Revision: 366 http://fclient.svn.sourceforge.net/fclient/?rev=366&view=rev Author: jUrner Date: 2008-03-11 04:20:32 -0700 (Tue, 11 Mar 2008) Log Message: ----------- Peristentget fixes and this and that Modified Paths: -------------- trunk/sandbox/fcp2/message.py Modified: trunk/sandbox/fcp2/message.py =================================================================== --- trunk/sandbox/fcp2/message.py 2008-03-11 11:19:48 UTC (rev 365) +++ trunk/sandbox/fcp2/message.py 2008-03-11 11:20:32 UTC (rev 366) @@ -144,9 +144,7 @@ out.append(self.data) return '\n'.join(out) - - def updatePersistentParams(self): pass @@ -522,6 +520,7 @@ PrivateParam('RequestStatus'): consts.RequestStatus.Null, PrivateParam('InitTime'): 0, # when was the request started? PrivateParam('UserData'): None, + PrivateParam('Edition'): -1, } AdditionalPluginInfoParams = { @@ -534,7 +533,7 @@ PersistentParamsGet = ( ( lambda msg: str(msg.__getitem__('RequestType')), - lambda msg, value: msg.__setitem__('Requesttype', int(value)), + lambda msg, value: msg.__setitem__('RequestType', int(value)), ), ( lambda msg: str(msg.__getitem__('InitTime')), @@ -553,7 +552,7 @@ PersistentParamsPut = ( ( lambda msg: str(msg.__getitem__('RequestType')), - lambda msg, value: msg.__setitem__('Requesttype', int(value)), + lambda msg, value: msg.__setitem__('RequestType', int(value)), ), ( lambda msg: str(msg.__getitem__('InitTime')), @@ -619,6 +618,9 @@ 'DataLength': types.FcpTypeInt, 'Global': types.FcpTypeBool, } + + def _getDataLength(self): + return self['DataLength'] class ClientGet(MessageBase): @@ -647,8 +649,8 @@ def updatePersistentParams(self): self['ClientToken'] = MessageBase._getPersistentParams(self) + - class ClientHello(MessageBase): name = consts.Message.ClientHello _additional_params_ = {} @@ -1070,7 +1072,7 @@ ####################################### class PersistentGet(MessageBase): name = consts.Message.PersistentGet - _additional_params_ = {} + _additional_params_ = AdditionalGetParams _persistent_params_ = PersistentParamsGet _param_types_ = ClientGet._param_types_.copy() _param_types_['Started'] = 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 11:19:43
|
Revision: 365 http://fclient.svn.sourceforge.net/fclient/?rev=365&view=rev Author: jUrner Date: 2008-03-11 04:19:48 -0700 (Tue, 11 Mar 2008) Log Message: ----------- this and that Modified Paths: -------------- trunk/sandbox/fcp2/key.py Modified: trunk/sandbox/fcp2/key.py =================================================================== --- trunk/sandbox/fcp2/key.py 2008-03-11 11:19:16 UTC (rev 364) +++ trunk/sandbox/fcp2/key.py 2008-03-11 11:19:48 UTC (rev 365) @@ -109,8 +109,13 @@ if result is not None: return result + + def toString(self): + """Returns the key as string""" + return self.pythonToFcp() + + - class CHK(KeyBase): """""" _key_pattern_ = ''' @@ -242,6 +247,12 @@ ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X) def __init__(self, keyData, filename, edition=0): + """Creates a USK key + @param keyData: (str) public key + @param filename: (str) filename + @param edition: (int) edition number + """ + self.edition = edition self.filename = filename self.keyData = keyData @@ -253,7 +264,7 @@ if self.filename is not None: out += self.filename + '/' if self.edition is not None: - out += self.edition + '/' + out += str(self.edition) + '/' return out @classmethod This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-03-11 11:19:10
|
Revision: 364 http://fclient.svn.sourceforge.net/fclient/?rev=364&view=rev Author: jUrner Date: 2008-03-11 04:19:16 -0700 (Tue, 11 Mar 2008) Log Message: ----------- key objects are is now accepted on get Modified Paths: -------------- trunk/sandbox/fcp2/client.py Modified: trunk/sandbox/fcp2/client.py =================================================================== --- trunk/sandbox/fcp2/client.py 2008-03-11 01:04:40 UTC (rev 363) +++ trunk/sandbox/fcp2/client.py 2008-03-11 11:19:16 UTC (rev 364) @@ -602,7 +602,7 @@ @return: True if the message was handled, False otherwise """ - CancelPersistentRequests = 1 # for testing... if True, cancels all PersistentRequests + CancelPersistentRequests = 0 # for testing... if True, cancels all PersistentRequests # check if we have an initial request corrosponding to msg requestIdentifier = msg.get('Identifier', None) @@ -898,7 +898,8 @@ self._requests[initialRequest['Identifier']] = initialRequest #FIX: remove Started param from PersistentGet / Put - del initialRequest.params['Started'] + if 'Started' in initialRequest.params: + del initialRequest.params['Started'] #FIX: [0001965: Persistence vs PersistenceType] if 'PersistenceType' in initialRequest.params: initialRequest['Persistence'] = initialRequest.params.pop('PersistenceType') @@ -1105,7 +1106,9 @@ elif msg == message.SubscribedUSKUpdate: if initialRequest is None: return False - self.events.USKUpdated(msg) + + initialRequest['Edition'] =msg['Edition'] + self.events.USKUpdated(initialRequest) return True @@ -1269,6 +1272,9 @@ @return: (str) identifier of the request """ + if hasattr(key, 'toString'): + key = key.toString() + msg = message.ClientGet(URI=key) for paramName, value in messageParams.items(): if value is not None: @@ -1285,7 +1291,7 @@ return msg['Identifier'] - + #TESTED def getData(self, key, @@ -1351,6 +1357,7 @@ ) + #TESTED def getFile(self, key, filename, @@ -1422,6 +1429,7 @@ ) + #TESTED def getKeyInfo(self, key, @@ -1479,6 +1487,7 @@ ) + #TESTED def subscribeUSK(self, key, dontPoll=True): """Asks the node to notify the client when an USK is updated @param key: (str) key or Uri of the USK to subscribe to @@ -1490,6 +1499,8 @@ @todo: looks like USK subscribes will persist untill connection is closed. Can they be removed somehow? """ + if hasattr(key, 'toString'): + key = key.toString() msg = message.SubscribeUSK( URI=key, DontPoll=dontPoll, 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:04:36
|
Revision: 363 http://fclient.svn.sourceforge.net/fclient/?rev=363&view=rev Author: jUrner Date: 2008-03-10 18:04:40 -0700 (Mon, 10 Mar 2008) Log Message: ----------- whitespace Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/test_iohandler.py Modified: trunk/sandbox/fcp2/test_fcp/test_iohandler.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_iohandler.py 2008-03-11 01:04:02 UTC (rev 362) +++ trunk/sandbox/fcp2/test_fcp/test_iohandler.py 2008-03-11 01:04:40 UTC (rev 363) @@ -19,7 +19,6 @@ from fcp2 import types - del hack #<-- rel import hacks #**************************************************************************************** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |