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.
|