fclient-commit Mailing List for fclient (Page 28)
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-02-27 12:06:09
|
Revision: 287
http://fclient.svn.sourceforge.net/fclient/?rev=287&view=rev
Author: jurner
Date: 2008-02-27 04:05:55 -0800 (Wed, 27 Feb 2008)
Log Message:
-----------
combed over docs
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-02-27 00:13:21 UTC (rev 286)
+++ trunk/sandbox/fcp2/client.py 2008-02-27 12:05:55 UTC (rev 287)
@@ -201,6 +201,7 @@
from fcp2 import events
from fcp2 import message
from fcp2 import fcparams
+from fcp2 import types
from fcp2 import uri
from fcp2.fcp_lib import namespace
@@ -217,16 +218,18 @@
class Client(object):
"""
@ivar events: events the client supports
+
+
+ @todo: cvar MaxSizeKeyInfo. Check if required.
+ suggested by Mathew Toseland to use about 32k for mimeType requests
+ basic sizes of keys are: 1k for SSks and 32k for CHKs without MaxSize
+ DataFound will have DataLength set to 0 (?!)
+
"""
ExpectedFcpVersion = 2.0
ExpectedNodeBuild = 1107
DefaultFcpHost = os.environ.get('FCP_HOST', '127.0.0.1')
DefaultFcpPort = int(os.environ.get('FCP_PORT', '9481'))
-
- #TODO: check if required
- # suggested by Mathew Toseland to use about 32k for mimeType requests
- # basic sizes of keys are: 1k for SSks and 32k for CHKs
- # without MaxSize DataFound will have DataLength set to 0 (?!)
MaxSizeKeyInfo = 32768
MinimumRunTime = 1 # minimum time (seconds) the client will run when run() is called (FIX: 0001931)
SocketTimeout = 0.1
@@ -235,6 +238,7 @@
config = config
message = message
fcparams = fcparams
+ types = types
Uri = uri
@@ -277,6 +281,8 @@
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.ClientClose)
@@ -289,7 +295,7 @@
self._requests = {}
if self._socket is None:
- #TODO: complain or not?
+ # complain or not?
pass
else:
self._socket.close()
@@ -574,8 +580,9 @@
"""Starts freenet
@param cmdline: commandline to start freenet (like '/freenet/run.sh start' or 'c:\freenet\start.bat')
@return: (str) whatever freenet returns
+
+ @todo: on windows it may be necessary to hide the command window
"""
- #TODO: on windows it may be necessary to hide the command window
p = subprocess.Popen(
args=cmdline,
shell=True,
@@ -706,7 +713,6 @@
self._finalizeRequest(msg, initialRequest, self.events.PluginInfoFailed)
return True
- # TODO: just a guess that FCPPluginMessage can trigger an AccessDenied error
elif initialRequest.name == consts.Message.FCPPluginMessage:
initialRequest['FcErrorMessage'] = msg
initialRequest['FcRequestStatus'] |= consts.RequestStatus.Error
@@ -796,7 +802,6 @@
testFailed = not msg.params.get('ReadDirectoryAllowed', False)
if testFailed:
- #TODO: check if errorMsg gives reasonable feedback
initialRequest['FcRequestStatus'] = consts.RequestStatus.Error
initialRequest['FcErrorMessage'] = initialRequest['FcTestDDA']['ErrorMsg']
self._finalizeRequest(msg, initialRequest, self.events.RequestFailed)
@@ -937,6 +942,10 @@
# ...as long as no other param is changed at runtime we are ok
# otherwise we would have to set flags to indicate wich member
# of ClientToken changed. See --> modifyRequest()
+ #
+ # hmm ..thinking again, this would only work if we could make shure
+ # PersistentUserData can only be modified through modifyRequest().
+ # So no way.
modified[consts.RequestModified.PersistentUserData] = None
for i, fcParam in enumerate(fcparams.FcParams):
initialRequest[fcParam] = params[i]
@@ -1557,8 +1566,6 @@
)
-
- #TODO: persists until connection is closed... can this request be removed?
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
@@ -1567,6 +1574,8 @@
@note: this request can not be removed or modified and the {consts.RequestStatus.Completed}
flag is always set
+
+ @todo: looks like USK subscribes will persist untill connection is closed. Can they be removed somehow?
"""
msg = message.Message(
consts.Message.SubscribeUSK,
@@ -2013,6 +2022,8 @@
@note: you can not change the priority of requests with Persistence=L{consts.Persistence.Connection}.
All attempts to do so are ignored. Too bad, but doing so is not implemented in the client protocol.
+ @todo: currently we ignore any attempts to change priority class for requests with persistence == connection
+ Fcp does not provide means to do so.
"""
initialRequest = self._requests[requestIdentifier]
if not initialRequest['FcRequestType'] & (consts.RequestType.MaskGet | consts.RequestType.MaskPut):
@@ -2022,8 +2033,6 @@
# no way to change priority here ..this is simply not implemented in the protocol
if initialRequest['Persistence'] == consts.Persistence.Connection:
modified = {}
-
- #TODO: currently we ignore any attempts to change priority class
#if priorityClass is not None:
# raise ValueError('Can not modify priority of requests with Persistence=connection')
@@ -2072,10 +2081,7 @@
else:
del self._requests[requestIdentifier]
- #TODO: check how Fcp responds when the identifier is unknown or something else goes
- # werong. Maybe a ProtocolError.NoSuchIdentifier ??? Naa ...never seen this
-
-
+
def resendRequest(self, request):
"""Resends a request
@param request: (L{message.Message})
@@ -2086,6 +2092,8 @@
@note: actually a new request is created and registered. Todo so, the request passed is copied. If it is a persistent
request, it will be removed. The new request will have FcInitTime reset and FcUserData amd FcPersistentUserData
taken over from the old request
+
+ @todo: reset init time or not? Currently it is not reset.
"""
requestType = request.get('FcRequestType', consts.RequestType.Null)
if not requestType & (consts.RequestType.MaskGet | consts.RequestType.MaskPut):
@@ -2101,7 +2109,7 @@
newRequest,
requestType,
filenameCollision=newRequest['FcFilenameCollision'] & consts.FilenameCollision.MaskHandle,
- #initTime=time.time(), # TODO: reset init time or not?
+ #initTime=time.time(),
persistentUserData=newRequest['FcPersistentUserData'],
userData=oldUserData,
)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-27 00:13:16
|
Revision: 286
http://fclient.svn.sourceforge.net/fclient/?rev=286&view=rev
Author: jurner
Date: 2008-02-26 16:13:21 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
beautifications
Modified Paths:
--------------
trunk/sandbox/fcp2/fcparams.py
Modified: trunk/sandbox/fcp2/fcparams.py
===================================================================
--- trunk/sandbox/fcp2/fcparams.py 2008-02-27 00:13:16 UTC (rev 285)
+++ trunk/sandbox/fcp2/fcparams.py 2008-02-27 00:13:21 UTC (rev 286)
@@ -1,4 +1,4 @@
-"""Handling of persistent request parameters"""
+"""Handling of additional persistent parameters for requests"""
import sys, os
import base64
@@ -45,14 +45,12 @@
except UnicodeEncodeError:
return None
-
def validateUuid(value):
result = uuid.UUID_EXACT_MATCH_PAT.match(value)
if result:
return str(result.group(0))
return None
-
#*********************************************************************************************
#
#*********************************************************************************************
@@ -76,12 +74,6 @@
@param msg: message to extract the parameters from
@return: (list) parameters or None if something went wrong
- >>> params = [1, 123.456, 'false', 'false', uuid.uuid_time(), 123456789]
- >>> identifier = FcParamsSep.join( [str(i) for i in params] )
- >>> result = paramsFromRequest({'Identifier': identifier})
- >>> result == params
- True
-
"""
userData = msg.get('ClientToken', None)
if userData is None:
@@ -101,6 +93,7 @@
for i, (paramName, paramValidator) in enumerate(FcParams):
result = paramValidator(params[i])
+ print paramName, paramValidator, result
if result is None:
return None
params[i] = result
@@ -143,7 +136,6 @@
uuid_ = uuid_time()
return uuid_
-
#*********************************************************************************
#
#*********************************************************************************
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-27 00:13:10
|
Revision: 285
http://fclient.svn.sourceforge.net/fclient/?rev=285&view=rev
Author: jurner
Date: 2008-02-26 16:13:16 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
beautifications
Modified Paths:
--------------
trunk/sandbox/fcp2/consts.py
Modified: trunk/sandbox/fcp2/consts.py
===================================================================
--- trunk/sandbox/fcp2/consts.py 2008-02-27 00:13:02 UTC (rev 284)
+++ trunk/sandbox/fcp2/consts.py 2008-02-27 00:13:16 UTC (rev 285)
@@ -30,14 +30,25 @@
#************************************************************************
#
#************************************************************************
-
+ConfigKeySep = '.'
FcpTrue = 'true'
FcpFalse = 'false'
-# errors
+class ConfigDataType:
+ """Basic data types in config messages"""
+ Boolean = 'boolean'
+ Number = 'number'
+ String = 'string'
+ StringArray = 'atringArray'
+
+ TypesAll = (
+ Boolean,
+ Number,
+ String,
+ StringArray,
+ )
-ConfigKeySep = '.'
class ConfigValueClass:
"""Value classes Fcp passes in config messages"""
@@ -63,21 +74,6 @@
)
-class ConfigDataType:
- """Basic data types in config messages"""
- Boolean = 'boolean'
- Number = 'number'
- String = 'string'
- StringArray = 'atringArray'
-
- TypesAll = (
- Boolean,
- Number,
- String,
- StringArray,
- )
-
-
class FetchError(Exception):
"""All fetch errors supported by the client"""
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-27 00:12:59
|
Revision: 284
http://fclient.svn.sourceforge.net/fclient/?rev=284&view=rev
Author: jurner
Date: 2008-02-26 16:13:02 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
beautifications
Modified Paths:
--------------
trunk/sandbox/fcp2/config.py
Modified: trunk/sandbox/fcp2/config.py
===================================================================
--- trunk/sandbox/fcp2/config.py 2008-02-26 19:00:14 UTC (rev 283)
+++ trunk/sandbox/fcp2/config.py 2008-02-27 00:13:02 UTC (rev 284)
@@ -70,10 +70,10 @@
class ConfigItem(object):
"""Config item
- @ivar parent: parent item
- @ivar name: name of the item
- @ivar children: (dict) child items
- @ivar values: dict of values
+ @ivar parent: (ConfigItem) parent item
+ @ivar name: (str) name of the item
+ @ivar children: (dict) child items (itemName --> ConfigItem)
+ @ivar values: (dict) values (L{consts.ConfigValueClass} --> value)
"""
@@ -116,9 +116,9 @@
class Config(object):
"""Class representing fcp config tree
- @ivar parent: parent item
- @ivar name: name of the config (always None)
- @ivar children: (dict) child items
+ @ivar parent: (always None) parent item
+ @ivar name: (always None) name of the config
+ @ivar children: (dict) child items (itemName --> L{ConfigItem})
"""
def __init__(self, configDataMsg=None):
@@ -159,7 +159,7 @@
@param value to associate
@return: (bool) True if the key has been added, False otherwise
- @note: if the item does not exist, it is created
+ @note: if the item does not already exist it is created
@note: if the key is unknown its type will always be set to L{types.FcpType}
"""
paramClass, components = self._configMessageParams.splitParamClass(key)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 19:00:12
|
Revision: 283
http://fclient.svn.sourceforge.net/fclient/?rev=283&view=rev
Author: jurner
Date: 2008-02-26 11:00:14 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
minor changes
Modified Paths:
--------------
trunk/sandbox/fcp2/LICENCE.MIT
trunk/sandbox/fcp2/README
Modified: trunk/sandbox/fcp2/LICENCE.MIT
===================================================================
--- trunk/sandbox/fcp2/LICENCE.MIT 2008-02-26 18:54:12 UTC (rev 282)
+++ trunk/sandbox/fcp2/LICENCE.MIT 2008-02-26 19:00:14 UTC (rev 283)
@@ -1,4 +1,4 @@
- Fcp - a python wraper library for the freenet client protocol. See: [http://www.freenetproject.org]
+ Fcp2 - a python wraper library for the freenet client protocol version 2. See: [http://www.freenetproject.org]
Copyright (c) 2008 J\xFCrgen Urner
Modified: trunk/sandbox/fcp2/README
===================================================================
--- trunk/sandbox/fcp2/README 2008-02-26 18:54:12 UTC (rev 282)
+++ trunk/sandbox/fcp2/README 2008-02-26 19:00:14 UTC (rev 283)
@@ -1,4 +1,4 @@
-Fcp - a python wraper library for the freenet client protocol. See: [http://www.freenetproject.org]
+Fcp - a python wraper library for the freenet client protocol version 2. See: [http://www.freenetproject.org]
@@ -8,6 +8,8 @@
*******************************************************************
0.1.0
*******************************************************************
+Initial release
+
news:
x.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 18:58:11
|
Revision: 282
http://fclient.svn.sourceforge.net/fclient/?rev=282&view=rev
Author: jurner
Date: 2008-02-26 10:54:12 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
moved config key sep to consts
Modified Paths:
--------------
trunk/sandbox/fcp2/types.py
Modified: trunk/sandbox/fcp2/types.py
===================================================================
--- trunk/sandbox/fcp2/types.py 2008-02-26 18:53:55 UTC (rev 281)
+++ trunk/sandbox/fcp2/types.py 2008-02-26 18:54:12 UTC (rev 282)
@@ -235,8 +235,8 @@
class ConfigMessageParams(object):
"""Parameter --> FcpType mapping for config related messages"""
- ComponentSep = '.'
+
# all known config keys (param class stripped)
Params = {
@@ -370,7 +370,7 @@
@param paramName: (str) parameter name to split
@return: (list) components
"""
- return paramName.split(self.ComponentSep)
+ return paramName.split(consts.ConfigKeySep)
def splitParamClass(self, paramName):
@@ -378,7 +378,7 @@
@param paramName: (str) parameter name to split
@return: (tuple) paramClass, tail
"""
- result = paramName.split(self.ComponentSep, 1)
+ result = paramName.split(consts.ConfigKeySep, 1)
if len(result) == 2:
if result[0] in consts.ConfigValueClass.ClassesAll:
return result
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 18:58:10
|
Revision: 280
http://fclient.svn.sourceforge.net/fclient/?rev=280&view=rev
Author: jurner
Date: 2008-02-26 10:52:56 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
moved config key sep to consts
Modified Paths:
--------------
trunk/sandbox/fcp2/config.py
Modified: trunk/sandbox/fcp2/config.py
===================================================================
--- trunk/sandbox/fcp2/config.py 2008-02-26 16:26:26 UTC (rev 279)
+++ trunk/sandbox/fcp2/config.py 2008-02-26 18:52:56 UTC (rev 280)
@@ -98,7 +98,7 @@
out.append(parent.name)
parent = parent.parent
out.reverse()
- return types.ConfigMessageParams.ComponentSep.join(out)
+ return consts.ConfigKeySep.join(out)
def walk(self):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 18:58:10
|
Revision: 281
http://fclient.svn.sourceforge.net/fclient/?rev=281&view=rev
Author: jurner
Date: 2008-02-26 10:53:55 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
moved config key sep to consts
Modified Paths:
--------------
trunk/sandbox/fcp2/consts.py
Modified: trunk/sandbox/fcp2/consts.py
===================================================================
--- trunk/sandbox/fcp2/consts.py 2008-02-26 18:52:56 UTC (rev 280)
+++ trunk/sandbox/fcp2/consts.py 2008-02-26 18:53:55 UTC (rev 281)
@@ -36,6 +36,9 @@
# errors
+
+ConfigKeySep = '.'
+
class ConfigValueClass:
"""Value classes Fcp passes in config messages"""
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 17:22:22
|
Revision: 278
http://fclient.svn.sourceforge.net/fclient/?rev=278&view=rev
Author: jurner
Date: 2008-02-26 08:22:06 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
fixed some crossreferences for epydoc
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-02-26 16:21:17 UTC (rev 277)
+++ trunk/sandbox/fcp2/client.py 2008-02-26 16:22:06 UTC (rev 278)
@@ -453,7 +453,7 @@
@param duration: (int) how many seconds try to connect before giving up
@param timeout: (int) how much time to wait before another attempt to connect
- @return: (L{fcp2_0_message.Message}) NodeHello or None if no connection could be established
+ @return: (L{message.Message}) NodeHello or None if no connection could be established
"""
nodeHello = None
for nodeHello in self.iterConnect(host=host, port=port, duration=duration, timeout=timeout):
@@ -468,7 +468,7 @@
@param duration: (int) how many seconds try to connect before giving up
@param timeout: (int) how much time to wait before another attempt to connect
- @return: (L{fcp2_0_message.Message}) NodeHello if successful, None otherwise for the next iteration
+ @return: (L{message.Message}) NodeHello if successful, None otherwise for the next iteration
@event: ClientConnected(event, message) is triggered as soon as the client is connected
"""
@@ -1398,10 +1398,9 @@
@return: (str) request identifier
- @event: L{events.RequestCompleted} triggered as soon as the request is complete
- @event: L{events.RequestFailed} triggered if the request failes
- @event: L{events.RequestStarted} triggered as soon as the request is started
- @event: L{events.RequestModified} trigggered if the request identifier changes
+ @event: L{events.Events.RequestCompleted} triggered as soon as the request is complete
+ @event: L{events.Events.RequestFailed} triggered if the request failes
+ @event: L{events.Events.RequestModified} trigggered if the request identifier changes
or the request is modified otherwise (see L{modifyRequest})
@note: the identifier of the request may change at any time. You should be prepaired to handle
@@ -1990,7 +1989,7 @@
def getRequest(self, requestIdentifier):
"""Returns a (initial) message, given its identifier
@param requestIdentifier: identifier of the message
- @return: L{Message}
+ @return: L{message.Message}
"""
return self._requests[requestIdentifier]
@@ -2079,7 +2078,7 @@
def resendRequest(self, request):
"""Resends a request
- @param request: (L{fcp2_0_message.Message})
+ @param request: (L{message.Message})
@return: (str) request identifier
@note: you can use this method to resend get / put requests.All attempts to resend other requests
@@ -2273,7 +2272,7 @@
@param keypairType: type of keypair to generate (either L{consts.KeyType.SSK} or L{consts.KeyType.SSK})
@return: identifier of the request
- @event: L{events.KeypairGenerated} triggered as soon as the request is complete
+ @event: L{events.Events.KeypairGenerated} triggered as soon as the request is complete
@requestparam: B{FcModified:} (dict)
@requestparam: B{FcPrivateKey:} None. Will contain the private key as soon as the key is generated
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 17:20:35
|
Revision: 277
http://fclient.svn.sourceforge.net/fclient/?rev=277&view=rev
Author: jurner
Date: 2008-02-26 08:21:17 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
fixed reference
Modified Paths:
--------------
trunk/sandbox/fcp2/test_fcp/test_message.py
Modified: trunk/sandbox/fcp2/test_fcp/test_message.py
===================================================================
--- trunk/sandbox/fcp2/test_fcp/test_message.py 2008-02-26 16:21:02 UTC (rev 276)
+++ trunk/sandbox/fcp2/test_fcp/test_message.py 2008-02-26 16:21:17 UTC (rev 277)
@@ -14,7 +14,7 @@
hack = _RelImportHack(3)
from fcp2.client import Client
-Message =Client.Message
+Message =Client.message.Message
from fcp2 import consts
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 16:26:20
|
Revision: 279
http://fclient.svn.sourceforge.net/fclient/?rev=279&view=rev
Author: jurner
Date: 2008-02-26 08:26:26 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
fix
Modified Paths:
--------------
trunk/sandbox/fcp2/boards/frost.py
Modified: trunk/sandbox/fcp2/boards/frost.py
===================================================================
--- trunk/sandbox/fcp2/boards/frost.py 2008-02-26 16:22:06 UTC (rev 278)
+++ trunk/sandbox/fcp2/boards/frost.py 2008-02-26 16:26:26 UTC (rev 279)
@@ -74,11 +74,11 @@
print ksk
self.fcpClient.getData(
- uri=ksk,
+ ksk,
maxSize='33000'
)
- for i in xrange(50):
+ for i in xrange(150):
self.fcpClient.next()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 16:21:01
|
Revision: 276
http://fclient.svn.sourceforge.net/fclient/?rev=276&view=rev
Author: jurner
Date: 2008-02-26 08:21:02 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
fixed reference
Modified Paths:
--------------
trunk/sandbox/fcp2/test_fcp/test_config.py
Modified: trunk/sandbox/fcp2/test_fcp/test_config.py
===================================================================
--- trunk/sandbox/fcp2/test_fcp/test_config.py 2008-02-26 16:03:02 UTC (rev 275)
+++ trunk/sandbox/fcp2/test_fcp/test_config.py 2008-02-26 16:21:02 UTC (rev 276)
@@ -15,7 +15,7 @@
from fcp2.client import Client
from fcp2 import consts
-Message = Client.Message
+Message = Client.message.Message
from fcp2 import types
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 16:02:58
|
Revision: 275
http://fclient.svn.sourceforge.net/fclient/?rev=275&view=rev
Author: jurner
Date: 2008-02-26 08:03:02 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
beautifications
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-02-26 15:53:48 UTC (rev 274)
+++ trunk/sandbox/fcp2/client.py 2008-02-26 16:03:02 UTC (rev 275)
@@ -218,15 +218,11 @@
"""
@ivar events: events the client supports
"""
-
- DefaultFcpHost = os.environ.get('FCP_HOST', '127.0.0.1').strip()
- try:
- DefaultFcpPort = int(os.environ.get('FCP_PORT', '').strip())
- except ValueError:
- DefaultFcpPort = 9481
-
-
-
+ ExpectedFcpVersion = 2.0
+ ExpectedNodeBuild = 1107
+ DefaultFcpHost = os.environ.get('FCP_HOST', '127.0.0.1')
+ DefaultFcpPort = int(os.environ.get('FCP_PORT', '9481'))
+
#TODO: check if required
# suggested by Mathew Toseland to use about 32k for mimeType requests
# basic sizes of keys are: 1k for SSks and 32k for CHKs
@@ -234,9 +230,7 @@
MaxSizeKeyInfo = 32768
MinimumRunTime = 1 # minimum time (seconds) the client will run when run() is called (FIX: 0001931)
SocketTimeout = 0.1
- ExpectedFcpVersion = 2.0
- ExpectedNodeBuild = 1107
-
+
consts = consts
config = config
message = message
@@ -275,6 +269,11 @@
## private methods
##
###############################################################
+ def _captureEvent(self, event, request):
+ if event != self.events.Idle:
+ self._loggers['Event'].debug(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
@@ -412,9 +411,7 @@
'FcPluginReply': None,
})
-
-
-
+
else:
msg.params.update({
'FcRequestType': requestType, # identifies sub message types
@@ -427,11 +424,6 @@
msg['Identifier'] = identifier
self._requests[identifier] = msg
-
- def _captureEvent(self, event, request):
- if event != self.events.Idle:
- self._loggers['Event'].debug(consts.LogMessages.EventTriggered + event.name)
-
###############################################################
##
## connection related methods
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 15:53:56
|
Revision: 274
http://fclient.svn.sourceforge.net/fclient/?rev=274&view=rev
Author: jurner
Date: 2008-02-26 07:53:48 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
beautifications
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-02-26 15:30:00 UTC (rev 273)
+++ trunk/sandbox/fcp2/client.py 2008-02-26 15:53:48 UTC (rev 274)
@@ -177,13 +177,13 @@
# TODO: check if this is a bug in Fcp
# NOTE: seems to be fixed in [build 1112], fixes removed
#-------------------------------------------------------------------------------------------------------------------------------------------------
+import os, sys
+
import atexit
import copy
import logging
-import os
import socket
import subprocess
-import sys
import time
@@ -196,13 +196,12 @@
def __del__(self): sys.path.pop(0)
hack = _RelImportHack(2)
-
from fcp2 import consts
-from fcp2.config import Config
-from fcp2.events import Events
-from fcp2.message import Message
-import fcp2.params as FcParams
-from fcp2.uri import Uri
+from fcp2 import config
+from fcp2 import events
+from fcp2 import message
+from fcp2 import fcparams
+from fcp2 import uri
from fcp2.fcp_lib import namespace
from fcp2.fcp_lib import tools
@@ -239,10 +238,10 @@
ExpectedNodeBuild = 1107
consts = consts
- Config = Config
- Message = Message
- FcParams = FcParams
- Uri = Uri
+ config = config
+ message = message
+ fcparams = fcparams
+ Uri = uri
def __init__(self,
@@ -256,23 +255,21 @@
"""
self._connectionName = self.setConnectionName(connectionName)
self._ddaTests = [] # currently running DDA tests (request0, ... requestN)
- self._requests = {} # currently running requests (requestIdentifier --> request)
-
- self._logEvent = logging.getLogger(consts.LoggerNames.ClientEvents)
- self._logMessage = logging.getLogger(consts.LoggerNames.ClientMessages)
- self._logRuntime = logging.getLogger(consts.LoggerNames.ClientRuntime)
-
+ self.events = events.Events()
+ self._loggers = {
+ 'Event': logging.getLogger(consts.LoggerNames.ClientEvents),
+ 'Message': logging.getLogger(consts.LoggerNames.ClientMessages),
+ 'Runtime': logging.getLogger(consts.LoggerNames.ClientRuntime),
+ }
self._nodeHelloMessage = None
+ self._requests = {} # currently running requests (requestIdentifier --> request)
self._socket = None
-
- self.events = Events()
+
for event in self.events:
event += self._captureEvent
-
self.setDebugVerbosity(consts.DebugVerbosity.Warning if debugVerbosity is None else debugVerbosity)
atexit.register(self.close)
-
-
+
###############################################################
##
## private methods
@@ -282,7 +279,7 @@
"""Closes the client
@param msg: message to pass to the ClientDisconnected event or None to not inform listeners
"""
- self._logRuntime.info(consts.LogMessages.ClientClose)
+ self._loggers['Runtime'].info(consts.LogMessages.ClientClose)
# clean left over DDA test tmp files
for initialRequest in self._ddaTests:
@@ -352,7 +349,7 @@
@return: (str) identifer of therequest
@note: the identifier returned is unique to the client but may not be unique to the node
"""
- identifier = self.FcParams.newUuid(uuids=self._requests) if identifier is None else identifier
+ identifier = fcparams.newUuid(uuids=self._requests) if identifier is None else identifier
if requestType & (consts.RequestType.MaskGet | consts.RequestType.MaskPut):
@@ -393,7 +390,7 @@
})
# equip msg with some persistent pparams
if msg.get('ClientToken', None) is None:
- msg['ClientToken'] = self.FcParams.messageToParams(msg)
+ msg['ClientToken'] = fcparams.messageToParams(msg)
elif requestType & consts.RequestType.MaskGenerateKeypair:
msg.params.update({
@@ -433,7 +430,7 @@
def _captureEvent(self, event, request):
if event != self.events.Idle:
- self._logEvent.debug(consts.LogMessages.EventTriggered + event.name)
+ self._loggers['Event'].debug(consts.LogMessages.EventTriggered + event.name)
###############################################################
##
@@ -444,7 +441,7 @@
"""Closes the client
@note: make shure to call close() when done with the client
"""
- msg = self.Message(
+ msg = message.Message(
consts.Message.ClientDisconnected,
DisconnectReason=consts.DisconnectReason.Close,
Param=None,
@@ -483,7 +480,7 @@
@event: ClientConnected(event, message) is triggered as soon as the client is connected
"""
- self._logRuntime.info(consts.LogMessages.Connecting)
+ self._loggers['Runtime'].info(consts.LogMessages.Connecting)
# try to Connect socket
if self._socket is not None:
@@ -503,7 +500,7 @@
except socket.error, d:
yield None
else:
- self._logRuntime.info(consts.LogMessages.Connected)
+ self._loggers['Runtime'].info(consts.LogMessages.Connected)
# send ClientHello and wait for NodeHello
#NOTE: thought I could leave ClientHelloing up to the caller
@@ -528,7 +525,7 @@
if self.versionCheckNodeHello(msg):
self.events.ClientConnected(msg)
else:
- disconnectMsg = self.Message(
+ disconnectMsg = message.Message(
consts.Message.ClientDisconnected,
DisconnectReason=consts.DisconnectReason.VersionMissmatch,
Param=msg,
@@ -538,17 +535,17 @@
raise StopIteration
else:
- self._logMessage.debug(consts.LogMessages.MessageReceived + msg.pprint())
+ self._loggers['Message'].debug(consts.LogMessages.MessageReceived + msg.pprint())
break
break
# continue polling
- self._logRuntime.info(consts.LogMessages.ConnectionRetry)
+ self._loggers['Runtime'].info(consts.LogMessages.ConnectionRetry)
timeElapsed += timeout
time.sleep(timeout)
- self._logRuntime.info(consts.LogMessages.ConnectingFailed)
- disconnectMsg = self.Message(
+ self._loggers['Runtime'].info(consts.LogMessages.ConnectingFailed)
+ disconnectMsg = message.Message(
consts.Message.ClientDisconnected,
DisconnectReason=consts.DisconnectReason.ConnectingFailed,
Param=None,
@@ -569,7 +566,7 @@
@param connectionName: (str) connection name or None to use an arbitrary connection name
@return: (str) connection name
"""
- self._connectionName = self.FcParams.newUuid() if connectionName is None else connectionName
+ self._connectionName = fcparams.newUuid() if connectionName is None else connectionName
return self._connectionName
@@ -577,11 +574,10 @@
"""Sets the verbosity level of the client
@note: see L{consts.DebugVerbosity}
"""
- self._logEvent.setLevel(debugVerbosity)
- self._logMessage.setLevel(debugVerbosity)
- self._logRuntime.setLevel(debugVerbosity)
-
+ for logger in self._loggers.values():
+ logger.setLevel(debugVerbosity)
+
def startFreenet(self, cmdline):
"""Starts freenet
@param cmdline: commandline to start freenet (like '/freenet/run.sh start' or 'c:\freenet\start.bat')
@@ -635,7 +631,7 @@
return False
# resend request with new identifier
- newIdentifier = self.FcParams.newUuid(uuids=self._requests)
+ newIdentifier = fcparams.newUuid(uuids=self._requests)
self._requests[newIdentifier] = initialRequest
del self._requests[requestIdentifier]
initialRequest['Identifier'] = newIdentifier
@@ -648,7 +644,7 @@
elif msg.name == consts.Message.ProtocolError:
code = msg['Code']
if code == consts.ProtocolError.ShuttingDown:
- disconnectMsg = self.Message(
+ disconnectMsg = message.Message(
consts.Message.ClientDisconnected,
DisconnectReason=consts.DisconnectReason.Shutdown,
Param=None,
@@ -667,7 +663,7 @@
# handle DDA errors
elif code == consts.ProtocolError.DDADenied:
- ddaRequestMsg = self.Message(consts.Message.TestDDARequest)
+ ddaRequestMsg = message.Message(consts.Message.TestDDARequest)
if initialRequest.name == consts.Message.ClientGet:
ddaRequestMsg['WantWriteDirectory'] = True
directory = os.path.dirname(initialRequest['Filename'])
@@ -897,7 +893,7 @@
# unknown request... try to restore it
if initialRequest is None:
- fcParams = self.FcParams.paramsFromRequest(msg)
+ fcParams = fcparams.paramsFromRequest(msg)
# not one of our requests... so cancel it
if fcParams is None or CancelPersistentRequests:
@@ -911,12 +907,12 @@
initialRequest = copy.deepcopy(msg)
self._registerRequest(
initialRequest,
- fcParams[self.FcParams.IRequestType],
+ fcParams[fcparams.IRequestType],
identifier=requestIdentifier,
- initTime=fcParams[self.FcParams.IInitTime],
+ initTime=fcParams[fcparams.IInitTime],
userData=None,
- persistentUserData=fcParams[self.FcParams.IPersistentUserData],
- filenameCollision=fcParams[self.FcParams.IFilenameCollision],
+ persistentUserData=fcParams[fcparams.IPersistentUserData],
+ filenameCollision=fcParams[fcparams.IFilenameCollision],
)
initialRequest.name = consts.Message.ClientGet
@@ -940,7 +936,7 @@
modified = {}
# check if PersistentUserData has changed
- params = self.FcParams.paramsFromRequest(initialRequest)
+ params = fcparams.paramsFromRequest(initialRequest)
if params is not None:
clientToken = msg.get('ClientToken', None)
if clientToken is not None:
@@ -950,7 +946,7 @@
# otherwise we would have to set flags to indicate wich member
# of ClientToken changed. See --> modifyRequest()
modified[consts.RequestModified.PersistentUserData] = None
- for i, fcParam in enumerate(self.FcParams.FcParams):
+ for i, fcParam in enumerate(fcparams.FcParams):
initialRequest[fcParam] = params[i]
# check if PriorityClass has changed
@@ -991,7 +987,7 @@
# unknown request... try to restore it
if initialRequest is None:
- fcParams = self.FcParams.paramsFromRequest(msg)
+ fcParams = fcparams.paramsFromRequest(msg)
# not one of our requests... so cancel it
if fcParams is None or CancelPersistentRequests:
@@ -1003,15 +999,15 @@
return True
initialRequest = copy.deepcopy(msg)
- requestType = fcParams[self.FcParams.IRequestType]
+ requestType = fcParams[fcparams.IRequestType]
self._registerRequest(
initialRequest,
requestType,
identifier=requestIdentifier,
- initTime=fcParams[self.FcParams.IInitTime],
+ initTime=fcParams[fcparams.IInitTime],
userData=None,
- persistentUserData=fcParams[self.FcParams.IPersistentUserData],
- filenameCollision=fcParams[self.FcParams.IFilenameCollision],
+ persistentUserData=fcParams[fcparams.IPersistentUserData],
+ filenameCollision=fcParams[fcparams.IFilenameCollision],
)
# determine initial message name
@@ -1146,7 +1142,7 @@
##
####################################################
elif msg.name == consts.Message.CloseConnectionDuplicateClientName:
- disconnectMsg = self.Message(
+ disconnectMsg = message.Message(
consts.Message.ClientDisconnected,
DisconnectReason=consts.DisconnectReason.DuplicateClientName,
Param=None,
@@ -1160,8 +1156,8 @@
return False
#TODO:no idea if the node may pass uris with prefixes like 'freenet:'... strip it anyways
- insertURI = self.Uri(msg['InsertURI']).uri
- requestURI = self.Uri(msg['RequestURI']).uri
+ insertURI = uri.Uri(msg['InsertURI']).uri
+ requestURI = uri.Uri(msg['RequestURI']).uri
if initialRequest['FcRequestType'] == consts.RequestType.GenerateUSKKeypair:
insertURI = insertURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1)
@@ -1190,11 +1186,11 @@
@note: use this method to run the client step by step. If you want to run the
client unconditionally use L{run}
"""
- msg = self.Message.fromSocket(self._socket)
+ msg = message.Message.fromSocket(self._socket)
if msg.name == consts.Message.ClientSocketDied:
- self._logRuntime.critical(consts.LogMessages.SocketDied)
+ self._loggers['Runtime'].critical(consts.LogMessages.SocketDied)
if dispatch:
- disconnectMsg = self.Message(
+ disconnectMsg = message.Message(
consts.Message.ClientDisconnected,
DisconnectReason=consts.DisconnectReason.SocketDied,
Param=msg,
@@ -1206,7 +1202,7 @@
if dispatch:
self.events.Idle(msg)
else:
- self._logMessage.debug(consts.LogMessages.MessageReceived + msg.pprint())
+ self._loggers['Message'].debug(consts.LogMessages.MessageReceived + msg.pprint())
if dispatch:
self.handleMessage(msg)
return msg
@@ -1224,7 +1220,7 @@
try:
msg = self.next()
except KeyboardInterrupt:
- self._logRuntime.info(consts.LogMessages.KeyboardInterrupt)
+ self._loggers['Runtime'].info(consts.LogMessages.KeyboardInterrupt)
return
if msg.name == consts.Message.ClientSocketDied:
return
@@ -1242,13 +1238,13 @@
break
if not haveRunningRequests:
- self._logRuntime.info(consts.LogMessages.AllRequestsCompleted)
+ self._loggers['Runtime'].info(consts.LogMessages.AllRequestsCompleted)
break
try:
msg = self.next()
except KeyboardInterrupt:
- self._logRuntime.info(consts.LogMessages.KeyboardInterrupt)
+ self._loggers['Runtime'].info(consts.LogMessages.KeyboardInterrupt)
break
if msg.name == consts.Message.ClientSocketDied:
@@ -1268,7 +1264,7 @@
@note: you can use this method to send a message to the node, bypassing all
track keeping methods of the client
"""
- return self.sendMessageEx(self.Message(name, data=data, **params))
+ return self.sendMessageEx(message.Message(name, data=data, **params))
def sendMessageEx(self, msg):
@@ -1282,15 +1278,15 @@
@note: you can use this method to send a message to the node, bypassing all
track keeping methods of the client
"""
- self._logMessage.debug(consts.LogMessages.MessageSend + msg.pprint())
+ self._loggers['Message'].debug(consts.LogMessages.MessageSend + msg.pprint())
try:
msg.send(self._socket)
except socket.error, d:
- self._logRuntime.critical(consts.LogMessages.SocketDied)
- disconnectMsg = self.Message(
+ self._loggers['Runtime'].critical(consts.LogMessages.SocketDied)
+ disconnectMsg = message.Message(
consts.Message.ClientDisconnected,
DisconnectReason=consts.DisconnectReason.SocketDied,
- Param=self.Message(consts.Message.ClientSocketDied, Exception=socket.error, Details=d)
+ Param=message.Message(consts.Message.ClientSocketDied, Exception=socket.error, Details=d)
)
self._close(disconnectMsg)
raise socket.error(d)
@@ -1331,7 +1327,7 @@
"""Modifies node configuration values
@param params: (dict) containing parameters to modify
"""
- msg = self.Message(consts.Message.ModifyConfig)
+ msg = message.Message(consts.Message.ModifyConfig)
msg.params = params
self.sendMessageEx(msg)
@@ -1342,7 +1338,7 @@
##
########################################################
def clientGet(self,
- uri,
+ key,
requestType,
userData,
persistentUserData,
@@ -1350,7 +1346,7 @@
**messageParams
):
"""Requests a key from the node
- @param uri: (str) uri of the file to request (may contain prefixes like 'freenet:' or 'http://')
+ @param key: (str) key or Uri of the file to request (may contain prefixes like 'freenet:' or 'http://')
@param requestType: (L{consts.RequestType}) sub type of the message
@param userData: any non persistent data to associate to the request or None
@param persistentUserData: any string to associate to the request as persistent data or None
@@ -1360,8 +1356,8 @@
@return: (str) identifier of the request
"""
- uri = self.Uri(uri).uri
- msg = self.Message(consts.Message.ClientGet, URI=uri)
+ key = uri.Uri(key).uri
+ msg = message.Message(consts.Message.ClientGet, URI=key)
for paramName, value in messageParams.items():
if value is not None:
msg[paramName] = value
@@ -1379,7 +1375,7 @@
def getData(self,
- uri,
+ key,
allowedMimeTypes=None,
binaryBlob=False,
@@ -1395,7 +1391,7 @@
):
"""Requests datae from the node
- @param uri: uri of the data to request (may contain prefixes like 'freenet:' or 'http://')
+ @param key: (str) key or Uri of the data to request (may contain prefixes like 'freenet:' or 'http://')
@param allowedMimeTypes: (str) list of allowed mime types
@param binaryBlob: (bool) if True, the file is retrieved as binary blob file
@@ -1410,10 +1406,10 @@
@return: (str) request identifier
- @event: L{Events.RequestCompleted} triggered as soon as the request is complete
- @event: L{Events.RequestFailed} triggered if the request failes
- @event: L{Events.RequestStarted} triggered as soon as the request is started
- @event: L{Events.RequestModified} trigggered if the request identifier changes
+ @event: L{events.RequestCompleted} triggered as soon as the request is complete
+ @event: L{events.RequestFailed} triggered if the request failes
+ @event: L{events.RequestStarted} triggered as soon as the request is started
+ @event: L{events.RequestModified} trigggered if the request identifier changes
or the request is modified otherwise (see L{modifyRequest})
@note: the identifier of the request may change at any time. You should be prepaired to handle
@@ -1422,7 +1418,7 @@
as soon as it completes or failes
"""
return self.clientGet(
- uri,
+ key,
consts.RequestType.GetData,
userData,
persistentUserData,
@@ -1440,13 +1436,12 @@
Persistence=persistence,
PriorityClass=priorityClass,
ReturnType=consts.ReturnType.Direct,
- URI=self.Uri(uri).uri,
Verbosity=consts.Verbosity.ReportProgress,
)
def getFile(self,
- uri,
+ key,
filename,
allowedMimeTypes=None,
@@ -1464,7 +1459,7 @@
):
"""Requests a file from the node
- @param uri: uri of the file to request (may contain prefixes like 'freenet:' or 'http://')
+ @param key: (str) key or Uri of the file to request (may contain prefixes like 'freenet:' or 'http://')
@param filename: (full path) filename to store the file to
@param allowedMimeTypes: (str) list of allowed mime types
@@ -1491,7 +1486,7 @@
as soon as it completes or failes
"""
return self.clientGet(
- uri,
+ key,
consts.RequestType.GetFile,
userData,
persistentUserData,
@@ -1510,13 +1505,12 @@
Persistence=persistence,
PriorityClass=priorityClass,
ReturnType=consts.ReturnType.Disk,
- URI=self.Uri(uri).uri,
Verbosity=consts.Verbosity.ReportProgress,
)
def getKeyInfo(self,
- uri,
+ key,
dsOnly=False,
ignoreDS=False,
@@ -1529,7 +1523,7 @@
):
"""Requests info about a key
- @param uri: uri of the file to request (may contain prefixes like 'freenet:' or 'http://')
+ @param key: (str) key or Uri of the file to request (may contain prefixes like 'freenet:' or 'http://')
@param dsOnly: if True, retrieves the file from the local data store only
@param ignoreDS: If True, ignores the local data store
@@ -1552,7 +1546,7 @@
"""
# how to retrieve meta info about a key? ...idea is to provoke a GetFailed (TooBig)
return self.clientGet(
- uri,
+ key,
consts.RequestType.GetKeyInfo,
userData,
persistentUserData,
@@ -1568,25 +1562,24 @@
Persistence=persistence,
PriorityClass=priorityClass,
ReturnType=consts.ReturnType.Nothing,
- URI=self.Uri(uri).uri,
Verbosity=consts.Verbosity.ReportProgress,
)
#TODO: persists until connection is closed... can this request be removed?
- def subscribeUSK(self, uri, dontPoll=True):
+ def subscribeUSK(self, key, dontPoll=True):
"""Asks the node to notify the client when an USK is updated
- @param uri: uri of the USK to subscribe to
+ @param key: (str) key or Uri of the USK to subscribe to
@param dontPoll: if True, does whatever ???
@return: (str) identifer of the request
@note: this request can not be removed or modified and the {consts.RequestStatus.Completed}
flag is always set
"""
- msg = self.Message(
+ msg = message.Message(
consts.Message.SubscribeUSK,
- URI=uri,
+ URI=uri.Uri(key).uri,
DontPoll=dontPoll,
)
self._registerRequest(msg, consts.RequestType.SubscribeUSK)
@@ -1602,7 +1595,7 @@
########################################################
def clientPut(self,
requestType,
- uri,
+ key,
data=None,
persistentUserData='',
userData=None,
@@ -1611,7 +1604,7 @@
):
"""Uploads to the node
@param requestType: (L{consts.RequestType}). Can be PutData, PutDir or PutMultiple
- @param uri:
+ @param key: (str) key or Uri
@param data: (str) for L{consts.RequestType.PutData} data to upload or None
@param persistentUserData: (str) persistent data to be assosiated to the request
@param userData: (any) any data to be associated to the request at runtime
@@ -1642,7 +1635,7 @@
else:
raise ValueError('Unsupported request type')
- msg = self.Message(msgName, URI=uri)
+ msg = message.Message(msgName, URI=key)
contentType = msgParams.get('ContentType', None)
if contentType is not None:
del msgParams['ContentType']
@@ -1724,7 +1717,7 @@
@param userData: (any) any data to be associated to the request at runtime
@return: (str) request identifier
"""
- msg = self.Message(
+ msg = message.Message(
consts.Message.ClientPut,
URI=consts.KeyType.KSK + name,
Persistence=persistence,
@@ -2045,21 +2038,21 @@
if persistentUserData is not None:
initialRequest['FcPersistentUserData'] = persistentUserData
- initialRequest['ClientToken'] = self.FcParams.messageToParams(initialRequest)
+ initialRequest['ClientToken'] = fcparams.messageToParams(initialRequest)
modified[consts.RequestModified.PersistentUserData] = None
initialRequest['FcModified'] = modified
self.events.RequestModified(initialRequest)
return
- msg = self.Message(
+ msg = message.Message(
consts.Message.ModifyPersistentRequest,
Identifier=initialRequest['Identifier'],
Global=False,
)
if persistentUserData is not None:
initialRequest['FcPersistentUserData'] = persistentUserData
- msg['ClientToken'] = self.FcParams.messageToParams(initialRequest)
+ msg['ClientToken'] = fcparams.messageToParams(initialRequest)
if priorityClass is not None:
msg['PriorityClass'] = priorityClass
@@ -2077,7 +2070,7 @@
# remove Persistence.Connection emidiately
# ..make up a PersistentRequestRemoved message for this case
if initialRequest['Persistence'] == consts.Persistence.Connection:
- msg = self.Message(consts.Message.PersistentRequestRemoved, Identifier=requestIdentifier, Global=False)
+ msg = message.Message(consts.Message.PersistentRequestRemoved, Identifier=requestIdentifier, Global=False)
self._finalizeRequest(msg, initialRequest, self.events.RequestRemoved)
else:
self.sendMessage(
@@ -2248,7 +2241,7 @@
@param detailed: (bool) If True, detailed information is returned
@return: (str) request identifier
"""
- msg = self.Message(
+ msg = message.Message(
consts.Message.GetPluginInfo,
PluginName=pluginName,
Detailed=detailed,
@@ -2265,7 +2258,7 @@
@param data: (str) data to pass along with the messaage or None
@return: (str) request identifier
"""
- msg = self.Message(
+ msg = message.Message(
consts.Message.FCPPluginMessage,
PluginName=pluginName,
**params
@@ -2288,7 +2281,7 @@
@param keypairType: type of keypair to generate (either L{consts.KeyType.SSK} or L{consts.KeyType.SSK})
@return: identifier of the request
- @event: L{Events.KeypairGenerated} triggered as soon as the request is complete
+ @event: L{events.KeypairGenerated} triggered as soon as the request is complete
@requestparam: B{FcModified:} (dict)
@requestparam: B{FcPrivateKey:} None. Will contain the private key as soon as the key is generated
@@ -2301,7 +2294,7 @@
raise ValueError('keypairType must be %s or %s' % (consts.KeyType.SSK, consts.KeyType.USK))
requestType = consts.RequestType.GenerateSSKKeypair if keypairType == consts.KeyType.SSK else consts.RequestType.GenerateUSKKeypair
- msg = self.Message(consts.Message.GenerateSSK)
+ msg = message.Message(consts.Message.GenerateSSK)
self._registerRequest(msg, requestType)
self.sendMessageEx(msg)
return msg['Identifier']
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 15:29:59
|
Revision: 273
http://fclient.svn.sourceforge.net/fclient/?rev=273&view=rev
Author: jurner
Date: 2008-02-26 07:30:00 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
renames
Added Paths:
-----------
trunk/sandbox/fcp2/fcparams.py
Removed Paths:
-------------
trunk/sandbox/fcp2/params.py
Copied: trunk/sandbox/fcp2/fcparams.py (from rev 257, trunk/sandbox/fcp2/params.py)
===================================================================
--- trunk/sandbox/fcp2/fcparams.py (rev 0)
+++ trunk/sandbox/fcp2/fcparams.py 2008-02-26 15:30:00 UTC (rev 273)
@@ -0,0 +1,154 @@
+"""Handling of persistent request parameters"""
+
+import sys, os
+import base64
+import time
+
+#--> rel import hack
+class _RelImportHack(object):
+ def __init__(self, n):
+ fpath = os.path.abspath(__file__)
+ for i in xrange(n): fpath = os.path.dirname(fpath)
+ sys.path.insert(0, fpath)
+ def __del__(self): sys.path.pop(0)
+hack = _RelImportHack(2)
+
+from fcp2.fcp_lib import uuid
+
+
+del hack
+#<-- rel import hack
+#*********************************************************************************************
+#
+#*********************************************************************************************
+def validateFcpBool(value):
+ if value in ('true', 'false'):
+ return str(value)
+ return None
+
+def validateFloat(value):
+ try:
+ return float(value)
+ except ValueError:
+ return None
+
+def validateInt(value):
+ try:
+ return int(value)
+ except ValueError:
+ return None
+
+#TODO: validate FcPersistentUserData... only ASCII (???) chars allowed
+def validateString(value):
+ try:
+ return str(value)
+ except UnicodeEncodeError:
+ return None
+
+
+def validateUuid(value):
+ result = uuid.UUID_EXACT_MATCH_PAT.match(value)
+ if result:
+ return str(result.group(0))
+ return None
+
+
+#*********************************************************************************************
+#
+#*********************************************************************************************
+FcParamsSep = '\x01'
+MAGIC = '{8a7808d0-3934-465a-b1b4-b7150ed109a5}' # magic string to identify our requests
+
+FcParams = (
+ ('FcRequestType', validateInt),
+ ('FcInitTime', validateFloat), # can not take it from uuid cos requests may be resend multiple times
+ ('FcFilenameCollision', validateInt),
+ ('FcPersistentUserData', validateString),
+ )
+
+IRequestType = 0
+IInitTime = 1
+IFilenameCollision = 2
+IPersistentUserData = 3
+
+def paramsFromRequest(msg):
+ """Extracts fclient parameters from the identifier of a request
+ @param msg: message to extract the parameters from
+ @return: (list) parameters or None if something went wrong
+
+ >>> params = [1, 123.456, 'false', 'false', uuid.uuid_time(), 123456789]
+ >>> identifier = FcParamsSep.join( [str(i) for i in params] )
+ >>> result = paramsFromRequest({'Identifier': identifier})
+ >>> result == params
+ True
+
+ """
+ userData = msg.get('ClientToken', None)
+ if userData is None:
+ return None
+
+ params = userData.split(FcParamsSep)
+ if len(params) != len(FcParams) +1:
+ return None
+
+ # validate and drop our magic string
+ uuid_ = params.pop(0)
+ result = validateUuid(uuid_)
+ if result is None:
+ return None
+ if result != MAGIC:
+ return None
+
+ for i, (paramName, paramValidator) in enumerate(FcParams):
+ result = paramValidator(params[i])
+ if result is None:
+ return None
+ params[i] = result
+
+ # decode user data
+ try:
+ params[IPersistentUserData] = base64.b64decode(params[IPersistentUserData])
+ except TypeError:
+ return None
+
+ return params
+
+
+def messageToParams(msg):
+ """Generates fc params from a message
+ @param msg: message to create the identifier from
+ @return: (str) params
+
+ """
+ params = []
+ for paramName, paramValidator in FcParams:
+ params.append( str(msg[paramName]) )
+
+ # encode user data
+ params[IPersistentUserData] = base64.b64encode(params[IPersistentUserData])
+ params.insert(0, MAGIC)
+
+ return FcParamsSep.join(params)
+
+
+def newUuid(uuids=None):
+ """Creates a new unique identifier
+ @param uuids: if desired any iterable containing uuids to enshure the identifier is unique in the iterable
+ @return: (str) uuid
+
+ """
+ uuid_ = uuid.uuid_time()
+ if uuids is not None:
+ while uuid_ in uuids:
+ uuid_ = uuid_time()
+ return uuid_
+
+
+#*********************************************************************************
+#
+#*********************************************************************************
+if __name__ == '__main__2':
+ import doctest
+ doctest.testmod()
+
+
Deleted: trunk/sandbox/fcp2/params.py
===================================================================
--- trunk/sandbox/fcp2/params.py 2008-02-26 15:18:18 UTC (rev 272)
+++ trunk/sandbox/fcp2/params.py 2008-02-26 15:30:00 UTC (rev 273)
@@ -1,154 +0,0 @@
-"""Handling of persistent request parameters"""
-
-import sys, os
-import base64
-import time
-
-#--> rel import hack
-class _RelImportHack(object):
- def __init__(self, n):
- fpath = os.path.abspath(__file__)
- for i in xrange(n): fpath = os.path.dirname(fpath)
- sys.path.insert(0, fpath)
- def __del__(self): sys.path.pop(0)
-hack = _RelImportHack(2)
-
-from fcp2.fcp_lib import uuid
-
-
-del hack
-#<-- rel import hack
-#*********************************************************************************************
-#
-#*********************************************************************************************
-def validateFcpBool(value):
- if value in ('true', 'false'):
- return str(value)
- return None
-
-def validateFloat(value):
- try:
- return float(value)
- except ValueError:
- return None
-
-def validateInt(value):
- try:
- return int(value)
- except ValueError:
- return None
-
-#TODO: validate FcPersistentUserData... only ASCII (???) chars allowed
-def validateString(value):
- try:
- return str(value)
- except UnicodeEncodeError:
- return None
-
-
-def validateUuid(value):
- result = uuid.UUID_EXACT_MATCH_PAT.match(value)
- if result:
- return str(result.group(0))
- return None
-
-
-#*********************************************************************************************
-#
-#*********************************************************************************************
-FcParamsSep = '\x01'
-MAGIC = '{8a7808d0-3934-465a-b1b4-b7150ed109a5}' # magic string to identify our requests
-
-FcParams = (
- ('FcRequestType', validateInt),
- ('FcInitTime', validateFloat), # can not take it from uuid cos requests may be resend multiple times
- ('FcFilenameCollision', validateInt),
- ('FcPersistentUserData', validateString),
- )
-
-IRequestType = 0
-IInitTime = 1
-IFilenameCollision = 2
-IPersistentUserData = 3
-
-def paramsFromRequest(msg):
- """Extracts fclient parameters from the identifier of a request
- @param msg: message to extract the parameters from
- @return: (list) parameters or None if something went wrong
-
- >>> params = [1, 123.456, 'false', 'false', uuid.uuid_time(), 123456789]
- >>> identifier = FcParamsSep.join( [str(i) for i in params] )
- >>> result = paramsFromRequest({'Identifier': identifier})
- >>> result == params
- True
-
- """
- userData = msg.get('ClientToken', None)
- if userData is None:
- return None
-
- params = userData.split(FcParamsSep)
- if len(params) != len(FcParams) +1:
- return None
-
- # validate and drop our magic string
- uuid_ = params.pop(0)
- result = validateUuid(uuid_)
- if result is None:
- return None
- if result != MAGIC:
- return None
-
- for i, (paramName, paramValidator) in enumerate(FcParams):
- result = paramValidator(params[i])
- if result is None:
- return None
- params[i] = result
-
- # decode user data
- try:
- params[IPersistentUserData] = base64.b64decode(params[IPersistentUserData])
- except TypeError:
- return None
-
- return params
-
-
-def messageToParams(msg):
- """Generates fc params from a message
- @param msg: message to create the identifier from
- @return: (str) params
-
- """
- params = []
- for paramName, paramValidator in FcParams:
- params.append( str(msg[paramName]) )
-
- # encode user data
- params[IPersistentUserData] = base64.b64encode(params[IPersistentUserData])
- params.insert(0, MAGIC)
-
- return FcParamsSep.join(params)
-
-
-def newUuid(uuids=None):
- """Creates a new unique identifier
- @param uuids: if desired any iterable containing uuids to enshure the identifier is unique in the iterable
- @return: (str) uuid
-
- """
- uuid_ = uuid.uuid_time()
- if uuids is not None:
- while uuid_ in uuids:
- uuid_ = uuid_time()
- return uuid_
-
-
-#*********************************************************************************
-#
-#*********************************************************************************
-if __name__ == '__main__2':
- import doctest
- doctest.testmod()
-
-
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 15:18:16
|
Revision: 272
http://fclient.svn.sourceforge.net/fclient/?rev=272&view=rev
Author: jurner
Date: 2008-02-26 07:18:18 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
adapt
Modified Paths:
--------------
trunk/sandbox/fcp2/test_fcp/test_config.py
Modified: trunk/sandbox/fcp2/test_fcp/test_config.py
===================================================================
--- trunk/sandbox/fcp2/test_fcp/test_config.py 2008-02-26 14:48:13 UTC (rev 271)
+++ trunk/sandbox/fcp2/test_fcp/test_config.py 2008-02-26 15:18:18 UTC (rev 272)
@@ -14,9 +14,12 @@
hack = _RelImportHack(3)
from fcp2.client import Client
+from fcp2 import consts
Message = Client.Message
from fcp2 import types
+
+
del hack
#<-- rel import hack
@@ -44,14 +47,14 @@
enabled = consoleItem.children.get('enabled', None)
self.failIf(enabled is None)
- current = enabled.values.get(cfg.ValueClassCurrent, None)
+ current = enabled.values.get(consts.ConfigValueClass.Current, None)
self.failIf(current is None)
value, valueType = current
self.assertEqual(value, 'true')
self.assertEqual(valueType, types.FcpTypeBool)
- default = enabled.values.get(cfg.ValueClassDefault, None)
+ default = enabled.values.get(consts.ConfigValueClass.Default, None)
self.failIf(default is None)
value, valueType = default
self.assertEqual(value, 'false')
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 14:48:14
|
Revision: 271
http://fclient.svn.sourceforge.net/fclient/?rev=271&view=rev
Author: jurner
Date: 2008-02-26 06:48:13 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
added another new config setting ...Freenet devels seem busy
Modified Paths:
--------------
trunk/sandbox/fcp2/types.py
Modified: trunk/sandbox/fcp2/types.py
===================================================================
--- trunk/sandbox/fcp2/types.py 2008-02-26 14:45:54 UTC (rev 270)
+++ trunk/sandbox/fcp2/types.py 2008-02-26 14:48:13 UTC (rev 271)
@@ -291,6 +291,7 @@
'node.downloadAllowedDirs': FcpTypeChoiceNodeDownloadAllowedDirs,
'node.downloadsDir': FcpTypeDirname,
'node.enableARKs': FcpTypeBool,
+ 'node.enablePacketCoalescing': FcpTypeBool,
'node.enablePerNodeFailureTables': FcpTypeBool,
'node.enableSwapping': FcpTypeBool,
'node.enableSwapQueueing': FcpTypeBool,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 14:45:50
|
Revision: 270
http://fclient.svn.sourceforge.net/fclient/?rev=270&view=rev
Author: jurner
Date: 2008-02-26 06:45:54 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
docs
Modified Paths:
--------------
trunk/sandbox/fcp2/__init__.py
Modified: trunk/sandbox/fcp2/__init__.py
===================================================================
--- trunk/sandbox/fcp2/__init__.py 2008-02-26 14:45:27 UTC (rev 269)
+++ trunk/sandbox/fcp2/__init__.py 2008-02-26 14:45:54 UTC (rev 270)
@@ -1,4 +1,4 @@
-"""Python wrapper for the freenet client protocol
+"""Python wrapper for the freenet client protocol version-2
See: [http://www.freenetproject.org] and [http://wiki.freenetproject.org/FreenetFCPSpec2Point0]
"""
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 14:45:30
|
Revision: 269
http://fclient.svn.sourceforge.net/fclient/?rev=269&view=rev
Author: jurner
Date: 2008-02-26 06:45:27 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
moved ConfigValueClasses to consts
Modified Paths:
--------------
trunk/sandbox/fcp2/types.py
Modified: trunk/sandbox/fcp2/types.py
===================================================================
--- trunk/sandbox/fcp2/types.py 2008-02-26 14:45:05 UTC (rev 268)
+++ trunk/sandbox/fcp2/types.py 2008-02-26 14:45:27 UTC (rev 269)
@@ -236,27 +236,7 @@
"""Parameter --> FcpType mapping for config related messages"""
ComponentSep = '.'
-
- # first component of a config message param is always the param class
- ParamClassCurrent = 'current'
- ParamClassDefault = 'default'
- ParamClassExpertFlag = 'expertFlag'
- ParamClassForceWriteFlag = 'forceWriteFlag'
- ParamClassShortDescription = 'shortDescription'
- ParamClassLongDescription = 'longDescription'
- ParamClassSortOrder = 'sortOrder'
-
- ParamClasses = (
- ParamClassCurrent,
- ParamClassDefault,
- ParamClassExpertFlag,
- ParamClassForceWriteFlag,
- ParamClassShortDescription,
- ParamClassLongDescription,
- ParamClassSortOrder,
- )
-
# all known config keys (param class stripped)
Params = {
@@ -399,7 +379,7 @@
"""
result = paramName.split(self.ComponentSep, 1)
if len(result) == 2:
- if result[0] in self.ParamClasses:
+ if result[0] in consts.ConfigValueClass.ClassesAll:
return result
return '', paramName
@@ -421,20 +401,22 @@
@return: (FcpType)
"""
paramClass, paramKey = self.splitParamClass(paramName)
- if paramClass == self.ParamClassCurrent or paramClass == '':
+ if paramClass == consts.ConfigValueClass.Current or paramClass == '':
return self.Params[paramKey]
- elif paramClass == self.ParamClassDefault:
+ elif paramClass == consts.ConfigValueClass.Default:
return self.Params[paramKey]
- elif paramClass == self.ParamClassExpertFlag:
+ elif paramClass == consts.ConfigValueClass.ExpertFlag:
return FcpTypeBool
- elif paramClass == self.ParamClassForceWriteFlag:
+ elif paramClass == consts.ConfigValueClass.ForceWriteFlag:
return FcpTypeBool
- elif paramClass == self.ParamClassShortDescription:
+ elif paramClass == consts.ConfigValueClass.ShortDescription:
return FcpTypeString
- elif paramClass == self.ParamClassLongDescription:
+ elif paramClass == consts.ConfigValueClass.LongDescription:
return FcpTypeString
- elif paramClass == self.ParamClassSortOrder:
+ elif paramClass == consts.ConfigValueClass.SortOrder:
return FcpTypeInt
+ elif paramClass == consts.ConfigValueClass.DataType:
+ return FcpTypeString
else:
raise ValueError('Unknown param class in: %r' % paramName)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 14:45:01
|
Revision: 268
http://fclient.svn.sourceforge.net/fclient/?rev=268&view=rev
Author: jurner
Date: 2008-02-26 06:45:05 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
moved ConfigValueClasses to consts
Modified Paths:
--------------
trunk/sandbox/fcp2/config.py
Modified: trunk/sandbox/fcp2/config.py
===================================================================
--- trunk/sandbox/fcp2/config.py 2008-02-26 14:43:43 UTC (rev 267)
+++ trunk/sandbox/fcp2/config.py 2008-02-26 14:45:05 UTC (rev 268)
@@ -1,5 +1,50 @@
-"""Sketch for fcp config tree"""
+"""Config handling
+Fcp passes the nodes config in form of a L{consts.Message.Config} message.
+This message can be fed to the L{Config} class to access the config tree.
+
+Fcp passes config settings as dotted names following this pattern:
+ValueClass.KeyName.SubkeyName.ValueName (...). The config class rebuilds the tree as
+a hirarchical tree of nodes with the L{Config} as root and L{ConfigItem}s as child nodes.
+Each L{ConfigItem} has a dict of child items and a values dict wich is a mapping from
+ValueName --> ValueClass0 ... ValueClassN.
+
+
+Sample code::
+
+ c = Config(configDataMsg=myConfigDataMessage)
+ configItem = c['settingsName.valueName']
+
+
+The config can be traversed like this::
+
+ for configItem in c.walk():
+ print configItem
+
+
+ConfigItems carry a values dict where the actual values for a key are stored.
+Values can be accessed by specifying the desired value class (see L{consts.ConfigValueClass})::
+
+ value, valueType = configItem.values[consts.ConfigValueClass.Current]
+
+ print configItem.values
+ >>> {
+ >>> 'current': ('whatever', <FcpTypeString>),
+ >>> 'default': ('whatever', <FcpTypeString>),
+ >>> 'valueType': ('string', <FcpTypeString>),
+ >>> (...)
+ >>> }
+
+ configItem.values[onsts.ConfigValueClass.Current] = 'another'
+ print configItem.values[consts.ConfigValueClass.Current][0]
+ >>> 'another'
+
+Note that Fcp passes some basic information about value types. This package does
+a bit more work and passes detailed information about the value type (as far as it is
+known) as one of the L{types.FcpType} subclasses. Unknown value types are passed
+as L{types.FcpType}.
+
+"""
import os, sys
import logging
@@ -55,6 +100,15 @@
out.reverse()
return types.ConfigMessageParams.ComponentSep.join(out)
+
+ def walk(self):
+ """Walks over the config item, returning the next L{ConfigItem} in turn"""
+ def walker(node):
+ yield node
+ for child in node.children.values():
+ for x in walker(child):
+ yield x
+ return walker(self)
#****************************************************************************************
#
@@ -67,14 +121,6 @@
@ivar children: (dict) child items
"""
- ValueClassCurrent = types.ConfigMessageParams.ParamClassCurrent
- ValueClassDefault = types.ConfigMessageParams.ParamClassDefault
- ValueClassExpertFlag = types.ConfigMessageParams.ParamClassExpertFlag
- ValueClassForceWriteFlag = types.ConfigMessageParams.ParamClassForceWriteFlag
- ValueClassShortDescription = types.ConfigMessageParams.ParamClassShortDescription
- ValueClassLongDescription = types.ConfigMessageParams.ParamClassLongDescription
-
-
def __init__(self, configDataMsg=None):
"""
@param configDataMsg: ConfigData message to initialize the config with or None
@@ -157,7 +203,7 @@
continue
key = node.key()
- result = node.values.get(self.ValueClassCurrent, None)
+ result = node.values.get(consts.ConfigValueClass.Current, None)
if result is not None:
out[key] = result[0]
return out
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 14:43:42
|
Revision: 267
http://fclient.svn.sourceforge.net/fclient/?rev=267&view=rev
Author: jurner
Date: 2008-02-26 06:43:43 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
added Fcp ConfigValueClass and ConfigDataType consts
Modified Paths:
--------------
trunk/sandbox/fcp2/consts.py
Modified: trunk/sandbox/fcp2/consts.py
===================================================================
--- trunk/sandbox/fcp2/consts.py 2008-02-26 14:42:33 UTC (rev 266)
+++ trunk/sandbox/fcp2/consts.py 2008-02-26 14:43:43 UTC (rev 267)
@@ -36,6 +36,45 @@
# errors
+class ConfigValueClass:
+ """Value classes Fcp passes in config messages"""
+
+ Current = 'current'
+ Default = 'default'
+ ExpertFlag = 'expertFlag'
+ ForceWriteFlag = 'forceWriteFlag'
+ ShortDescription = 'shortDescription'
+ LongDescription = 'longDescription'
+ SortOrder = 'sortOrder'
+ DataType = 'dataType'
+
+ ClassesAll = (
+ Current,
+ Default,
+ ExpertFlag,
+ ForceWriteFlag,
+ ShortDescription,
+ LongDescription,
+ SortOrder,
+ DataType,
+ )
+
+
+class ConfigDataType:
+ """Basic data types in config messages"""
+ Boolean = 'boolean'
+ Number = 'number'
+ String = 'string'
+ StringArray = 'atringArray'
+
+ TypesAll = (
+ Boolean,
+ Number,
+ String,
+ StringArray,
+ )
+
+
class FetchError(Exception):
"""All fetch errors supported by the client"""
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 14:42:28
|
Revision: 266
http://fclient.svn.sourceforge.net/fclient/?rev=266&view=rev
Author: jurner
Date: 2008-02-26 06:42:33 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
added WithDataTypes flag to getConfig()
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-02-26 10:46:05 UTC (rev 265)
+++ trunk/sandbox/fcp2/client.py 2008-02-26 14:42:33 UTC (rev 266)
@@ -1,4 +1,4 @@
-"""Freenet client protocol 2.0 implementation
+"""Fcp2 client implementation
Compatibility: >= Freenet 0.7 Build #1107
@@ -1309,6 +1309,7 @@
withSortOrder=True,
withShortDescription=True,
withLongDescription=True,
+ withDataTypes=True,
):
"""
@event: ConfigData(event, msg)
@@ -1322,6 +1323,7 @@
WithForceWriteFlag=withForceWriteFlag,
WithShortDescription=withShortDescription,
WithLongDescription=withLongDescription,
+ WithDataTypes=withDataTypes,
)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 10:46:00
|
Revision: 265
http://fclient.svn.sourceforge.net/fclient/?rev=265&view=rev
Author: jurner
Date: 2008-02-26 02:46:05 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
del left over file
Removed Paths:
-------------
trunk/sandbox/fcp2/test_fcp/client.py
Deleted: trunk/sandbox/fcp2/test_fcp/client.py
===================================================================
--- trunk/sandbox/fcp2/test_fcp/client.py 2008-02-26 10:42:37 UTC (rev 264)
+++ trunk/sandbox/fcp2/test_fcp/client.py 2008-02-26 10:46:05 UTC (rev 265)
@@ -1,1959 +0,0 @@
-"""Unittests for fcp2_0_client"""
-from __future__ import with_statement
-
-import os, sys
-import copy
-import socket
-import tempfile
-import time
-import unittest
-
-#--> rel import hack
-class _RelImportHack(object):
- def __init__(self, n):
- fpath = os.path.abspath(__file__)
- for i in xrange(n): fpath = os.path.dirname(fpath)
- sys.path.insert(0, fpath)
- def __del__(self): sys.path.pop(0)
-hack = _RelImportHack(3)
-
-from fcp import fcp2_0_client
-from fcp.fcp2_0_client import FcpClient
-from fcp import fcp2_0_consts as consts
-
-
-del hack
-#<-- rel import hack
-
-from dummy_socket import DummySocket
-#***********************************************************************************
-#
-#***********************************************************************************
-DIR = os.path.dirname(os.path.abspath(__file__))
-TestAgainstNode = 0 # don't know how to test against node. Do not touch this!
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class MyFcpClient(FcpClient):
- """Customized client recording all messages it sends
- """
- def __init__(self, *args, **kwargs):
- FcpClient.__init__(self, *args, **kwargs)
- self.test_messagesSend = []
-
- def sendMessageEx(self, msg):
- FcpClient.sendMessageEx(self, msg)
- # deepcopy here, we need exact state
- msg = copy.deepcopy(msg)
- self.test_messagesSend.append(msg)
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class DummySocketModule(object):
- """Dummy socket module we inject into the client module for testing
-
- """
- AF_INET = socket.AF_INET
- SOCK_STREAM = socket.SOCK_STREAM
- error = socket.error
- socket = DummySocket()
-
- def __init__(self):
- self.lastSocket = None
-
- def __getattribute__(self, name):
- obj = object.__getattribute__(self, name)
- if name == 'socket':
- self.lastSocket = obj
- return obj
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class MySocketFactory(object):
- """Real and alive socket. Can be used to test against the running node. Not used currently
-
- Usage::
-
- DummySocketModule.socket = MySocketFactory()
-
- """
- def __init__(self, *args, **kwargs):
- self.socket = None
- self.closed = False
-
- def __call__(self, *args, **kwargs):
- self.socket = socket.socket(*args, **kwargs)
- return self
-
- def sendResponseMessage(self, *args, **kwargs):
- pass
-
- def connect(self, *args, **kwargs):
- return self.socket.connect(*args, **kwargs)
-
- def sendall(self, bytes):
- return self.socket.sendall(bytes)
-
- def settimeout(self, n):
- return self.socket.settimeout(n)
-
- def recv(self, n):
- return self.socket.recv(n)
-
- def close(self):
- self.closed = True
- result = self.socket.close()
- self.socket = None
- return result
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class BaseTestClient(unittest.TestCase):
- """Base class for all tests"""
-
- if TestAgainstNode:
- DummySocketModule.socket = MySocketFactory()
- fcpClient = MyFcpClient(
- #debugVerbosity=FcpClient.consts.DebugVerbosity.Debug
- )
-
- # inject our customized socket module
- socketModule = DummySocketModule()
- fcp2_0_client.socket = socketModule
-
-
- def __init__(self, *args, **kwargs):
- unittest.TestCase.__init__(self, *args, **kwargs)
-
- self.events = [] # events received from the client
- self.tmpfiles = [] # temp files used for testing (will be removed on tearDown)
-
-
- def _captureEventsFromClient(self, event, msg):
- # have to copy message here, to get exact state
- msg = copy.deepcopy(msg)
- self.events.append( (event, msg) )
-
- def connectClient(self):
- """Connects to the client"""
- for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=20, timeout=0.1)):
- if n == 0:
- self.assertHasNextMessage(
- consts.Message.ClientHello
- )
- self.sendResponseMessage(
- 'NodeHello',
- FCPVersion='2.0',
- Node='Fred',
- Version=str(self.fcpClient.ExpectedFcpVersion),
- Revision='999999999999',
- Build='9999999999',
- ExRevision='9999999999',
- Testnet='false',
- CompressionCodecs='1',
- ConnectionIdentifier='any',
- NodeLanguage='en',
-
- callNext=False,
- )
-
- # check events the client triggered
- self.assertHasNextEvent(
- self.fcpClient.events.ClientConnected,
- consts.Message.NodeHello,
- )
-
- self.assertHasNextEvent(None)
-
- def assertHasNextEvent(self,
- expectedEvent=None,
- messageName=None,
- param1=None,
- param2=None,
- param3=None,
- param4=None,
- param5=None,
- data=None
- ):
- """Tests if we received a certain event from the client
- @param expectedEvent: the event expected or None if no event is expected
- @param messageName: expected mesageName or None if no message is expected
- @param param1: tuple(paramName, value) of a message parameter expected
- @param data: data expected along with the message or None
-
- @return: message if a message was received or None
- """
- if expectedEvent is None:
- self.failIf(self.events)
- else:
- self.failUnless(self.events)
- event, msg = self.events.pop(0)
- self.assertEqual(event, expectedEvent)
-
- if messageName is not None:
- self.assertEqual(msg.name, messageName)
- if param1 is not None:
- param1, value1 = param1
- self.failUnless(param1 in msg.params)
- self.assertEqual(value1, msg[param1])
- if param2 is not None:
- param2, value2 = param2
- self.failUnless(param2 in msg.params)
- self.assertEqual(value2, msg[param2])
- if param3 is not None:
- param3, value3 = param3
- self.failUnless(param3 in msg.params)
- self.assertEqual(value3, msg[param3])
- if param4 is not None:
- param4, value4 = param4
- self.failUnless(param4 in msg.params)
- self.assertEqual(value4, msg[param4])
- if param5 is not None:
- param5, value5 = param5
- self.failUnless(param5 in msg.params)
- self.assertEqual(value5, msg[param5])
-
- if data is not None:
- self.assertEqual(data, msg.data)
-
- return msg
-
- def assertHasNextMessage(self,
- messageName,
- param1=None,
- param2=None,
- param3=None,
- param4=None,
- param5=None,
- data=None
- ):
- """Tests if we received a certain message from the client
- @param messageName: expected mesageName or None if no message is expected
- @param param1: tuple(paramName, value) of a message parameter expected
- @param data: data expected along with the message or None
-
- @return: message if a message was received or None
- """
- if messageName is None:
- self.failIf(self.fcpClient.test_messagesSend)
- else:
- self.failUnless(self.fcpClient.test_messagesSend)
- msg = self.fcpClient.test_messagesSend.pop(0)
- self.assertEqual(msg.name, messageName)
- if param1 is not None:
- param1, value1 = param1
- self.failUnless(param1 in msg.params)
- self.assertEqual(value1, msg[param1])
- if param2 is not None:
- param2, value2 = param2
- self.failUnless(param2 in msg.params)
- self.assertEqual(value2, msg[param2])
- if param3 is not None:
- param3, value3 = param3
- self.failUnless(param3 in msg.params)
- self.assertEqual(value3, msg[param3])
- if param4 is not None:
- param4, value4 = param4
- self.failUnless(param4 in msg.params)
- self.assertEqual(value4, msg[param4])
- if param5 is not None:
- param5, value5 = param5
- self.failUnless(param5 in msg.params)
- self.assertEqual(value5, msg[param5])
-
- if data is not None:
- self.assertEqual(data, msg.data)
- return msg
-
- def sendResponseMessage(self, messageName, data=None, callNext=True, **params):
- """Posts a message to the client"""
- self.socketModule.lastSocket.sendResponseMessage(messageName, data=data, **params)
- if not TestAgainstNode:
- if callNext:
- self.fcpClient.next()
-
- def setUp(self):
- # conect all events
- self.events = [] # events received from the client
- for event in self.fcpClient.events:
- event += self._captureEventsFromClient
-
- def tearDown(self):
- # disconnect all events
- for event in self.fcpClient.events:
- event -= self._captureEventsFromClient
- # clean up tmpfiles
- for fpath in self.tmpfiles: os.remove(fpath)
-
-#***********************************************************************************
-#
-#***********************************************************************************
-#TODO: class Test.... set/getDebugVerbosity / connectionName and friends... (BaseTestConnectedClient):
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class TestConnect(BaseTestClient):
-
-
- def XXXtestClose(self):
- self.failIf(self.socket.closed)
- self.connectClient()
- self.fcpClient.close()
- self.failUnless(self.socket.closed)
-
-
-
- def XXXtestConnect(self):
- nodeHello = self.fcpClient.connect(duration=10, timeout=0.1)
- self.failIf(nodeHello is None)
- return
-
-
- nodeHello = self.fcpClient.connect(duration=0, timeout=0)
- self.failIf(nodeHello is not None)
-
- self.socketModule.lastSocket.sendResponseMessage(
- 'NodeHello',
- FCPVersion='2.0',
- Node='Fred',
- Version=str(self.fcpClient.ExpectedFcpVersion),
- Revision='999999999999',
- Build='9999999999',
- ExRevision='9999999999',
- Testnet='false',
- CompressionCodecs='1',
- ConnectionIdentifier='any',
- NodeLanguage='en',
- )
- nodeHello = self.fcpClient.connect(duration=10, timeout=0.1)
- self.failIf(nodeHello is None)
-
-
- def test_0_IterIterConnect_RFailure(self):
-
- # we cannot test against node here
- if not TestAgainstNode:
-
- for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)):
- if n == 0:
- self.assertHasNextMessage(
- consts.Message.ClientHello
- )
-
- # check events the client triggered
- self.assertHasNextEvent(
- self.fcpClient.events.ClientDisconnected,
- consts.Message.ClientDisconnected,
- ('DisconnectReason', consts.DisconnectReason.ConnectingFailed),
- )
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.failUnless(self.socketModule.lastSocket.closed)
-
- #self.fcpClient.connect(duration=20, timeout=0.1)
-
-
- def test_1_IterConnect_Success(self):
- for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=20, timeout=0.1)):
- if n == 0:
- self.assertHasNextMessage(
- consts.Message.ClientHello
- )
- self.sendResponseMessage(
- 'NodeHello',
- FCPVersion='2.0',
- Node='Fred',
- Version=str(self.fcpClient.ExpectedFcpVersion),
- Revision='999999999999',
- Build='9999999999',
- ExRevision='9999999999',
- Testnet='false',
- CompressionCodecs='1',
- ConnectionIdentifier='any',
- NodeLanguage='en',
-
- callNext=False,
- )
-
- # check events the client triggered
- self.assertHasNextEvent(
- self.fcpClient.events.ClientConnected,
- consts.Message.NodeHello,
- )
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class TestDisconnectReason(BaseTestClient):
-
- def test_1000_DuplicateClientName(self):
-
- self.sendResponseMessage('CloseConnectionDuplicateClientName')
- msg = self.assertHasNextEvent(
- self.fcpClient.events.ClientDisconnected,
- consts.Message.ClientDisconnected,
- ('DisconnectReason', consts.DisconnectReason.DuplicateClientName),
- )
- self.failUnless('Param' in msg.params)
- self.assertEqual(msg['Param'], None)
-
- self.failUnless(self.socketModule.lastSocket.closed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.connectClient()
-
-
- def test_1001_SocketDied_Receive(self):
-
- self.socketModule.lastSocket.close()
- self.fcpClient.next()
-
- # check if ClientDisconnected events has been triggered
- msg = self.assertHasNextEvent(
- self.fcpClient.events.ClientDisconnected,
- consts.Message.ClientDisconnected,
- ('DisconnectReason', consts.DisconnectReason.SocketDied),
- #('Param', ClientSocketDiedMessage) # can not test here
- )
- self.failUnless('Param' in msg.params)
- self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied)
-
- self.failUnless(self.socketModule.lastSocket.closed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.connectClient()
-
-
- def test_1002_SocketDied_Send(self):
-
- self.socketModule.lastSocket.close()
-
- # send a test message
- self.assertRaises(socket.error, self.fcpClient.sendMessage, 'test' )
-
- # check if ClientDisconnected events has been triggered
- msg = self.assertHasNextEvent(
- self.fcpClient.events.ClientDisconnected,
- consts.Message.ClientDisconnected,
- ('DisconnectReason', consts.DisconnectReason.SocketDied),
- #('Param', ClientSocketDiedMessage) # can not test here
- )
- self.failUnless('Param' in msg.params)
- self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied)
-
- self.failUnless(self.socketModule.lastSocket.closed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.connectClient()
-
-
- def test_1003_Shutdown(self):
-
- self.fcpClient.closeFreenet()
-
- msg = self.assertHasNextMessage(consts.Message.Shutdown)
- self.sendResponseMessage(
- 'ProtocolError',
- Code='18', # Shutting down
- )
-
- # check events the client triggered
- msg = self.assertHasNextEvent(
- self.fcpClient.events.ClientDisconnected,
- consts.Message.ClientDisconnected,
- ('DisconnectReason', consts.DisconnectReason.Shutdown)
- #('Param', NodeHelloMessage) # can not test here
- )
- self.failUnless('Param' in msg.params)
- self.assertEqual(msg['Param'], None)
-
- self.failUnless(self.socketModule.lastSocket.closed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.connectClient()
-
-
-
- def test_1004_VersionMismatch(self):
-
- # cheat a bit and reconnect client
- enum = self.fcpClient.iterConnect(duration=0.2, timeout=0.1)
- msg = enum.next()
- self.failIf(msg is not None)
-
- # check messages the client send message
- self.assertHasNextMessage(consts.Message.ClientHello)
-
- #NOTE: have to send directly via socket here (our sendResponseMessage
- # calls client.next() autkmatically)
- self.socketModule.lastSocket.sendResponseMessage(
- 'NodeHello',
- FCPVersion='0.0',
- Node='Fred',
- Version=str(self.fcpClient.ExpectedFcpVersion),
- Revision='0',
- Build='0',
- ExRevision='0',
- Testnet='false',
- CompressionCodecs='1',
- ConnectionIdentifier='any',
- NodeLanguage='en',
-
- callNext=False
- )
- msg = enum.next()
-
- # check events the client triggered
- msg = self.assertHasNextEvent(
- self.fcpClient.events.ClientDisconnected,
- consts.Message.ClientDisconnected,
- ('DisconnectReason', consts.DisconnectReason.VersionMissmatch)
- #('Param', NodeHelloMessage) # can not test here
- )
- self.failUnless('Param' in msg.params)
- self.assertEqual(msg['Param'].name, consts.Message.NodeHello)
-
- self.failUnless(self.socketModule.lastSocket.closed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.connectClient()
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class TestClientGet(BaseTestClient):
-
- def test_2000_ClientGetRegistered(self):
-
- # request a arbitrary file
- myIdentifier = self.fcpClient.getData(
- 'arbitrary-uri',
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
- self.assertHasNextEvent(None)
-
- self.failUnless(myIdentifier in requestsAll)
- self.assertEqual(myIdentifier, myRequest['Identifier'])
- self.assertEqual(myRequest['FcRequestStatus'], consts.RequestStatus.Null)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
-
- def test_2001_GetData_Success(self):
-
- # request a arbitrary file
- myIdentifier = self.fcpClient.getData(
- 'arbitrary-uri',
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # simulate a progress
- self.sendResponseMessage(
- 'SimpleProgress',
- Identifier=myIdentifier,
- Total=10,
- Required=8,
- Failed=0,
- FatallyFailed=0,
- FinalizedTotal='true',
- Succeeded=1,
- )
- self.assertHasNextEvent(
- self.fcpClient.events.RequestProgress,
- )
-
- # finalize request
- data = 'foo'
- params = {
- 'Identifier': myIdentifier,
- 'Global': 'false',
- 'DataLength': len(data),
- 'Metadata.ContentType': 'any',
- }
- self.sendResponseMessage(
- 'DataFound',
- **params
- )
- # we don't expect an event here....
- self.assertHasNextEvent(None)
-
- self.sendResponseMessage(
- 'AllData',
- data=data,
- Identifier=myIdentifier,
- Global='false',
- DataLength=len(data),
- )
-
- # client should complete and remove the request
- self.assertHasNextEvent(
- self.fcpClient.events.RequestCompleted,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Success |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- data=data
- )
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
-
-
- # cheat a bit to test peristence == Forever (client should not remove request)
- requestsAll[myIdentifier] =myRequest
- myRequest['Persistence'] = consts.Persistence.Forever
- myRequest['FcRequestStatus'] &= ~(consts.RequestStatus.Success |
- consts.RequestStatus.Completed |
- consts.RequestStatus.RemovedFromQueue
- )
- self.sendResponseMessage(
- 'AllData',
- data=data,
- Identifier=myIdentifier,
- Global='false',
- DataLength=len(data),
- )
-
- # client should complete but not remove the request
- self.assertHasNextEvent(
- self.fcpClient.events.RequestCompleted,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Success | consts.RequestStatus.Completed),
- data=data
- )
- self.failUnless(myIdentifier in requestsAll)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
- def test_2002_GetData_Failure(self):
-
- # request a arbitrary file
- myIdentifier = self.fcpClient.getData(
- 'arbitrary-uri',
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- self.sendResponseMessage(
- 'GetFailed',
- Code='28', # All data not found
- Identifier=myIdentifier,
- Global='false',
- # blah.. more here
- )
-
- # client should complete request and remove it
- self.assertHasNextEvent(
- self.fcpClient.events.RequestFailed,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Error |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- #return
-
- # cheat a bit to test peristence == Forever (client should not remove request)
-
- requestsAll[myIdentifier] =myRequest
- myRequest['Persistence'] = consts.Persistence.Forever
- myRequest['FcRequestStatus'] &= ~(consts.RequestStatus.Error |
- consts.RequestStatus.Completed |
- consts.RequestStatus.RemovedFromQueue
- )
- self.sendResponseMessage(
- 'GetFailed',
- Code='28', # All data not found
- Identifier=myIdentifier,
- Global='false',
- # blah.. more here
- )
-
- # client should complete but not remove the request
- self.assertHasNextEvent(
- self.fcpClient.events.RequestFailed,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Error | consts.RequestStatus.Completed),
- )
- self.failUnless(myIdentifier in requestsAll)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
- def test_2003_GetFile_Success(self):
-
- # request a arbitrary file
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- 'arbitryry.txt'
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- data = 'foo'
- params = {
- 'Identifier': myIdentifier,
- 'Global': 'false',
- 'DataLength': 123456,
- 'Metadata.ContentType': 'any',
- }
- self.sendResponseMessage(
- 'DataFound',
- **params
- )
- self.assertHasNextEvent(
- self.fcpClient.events.RequestCompleted,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Success |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
- def test_2004_GetFile_Failure(self):
-
- # request a arbitrary file
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- 'arbitryry.txt'
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- self.sendResponseMessage(
- 'GetFailed',
- Code='28', # All data not found
- Identifier=myIdentifier,
- Global='false',
- # blah.. more here
- )
-
- self.assertHasNextEvent(
- self.fcpClient.events.RequestFailed,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Error |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
- self.failIf(myIdentifier in requestsAll)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
- def test_2005_GetKeyInfo_Success(self):
-
- # request a arbitrary uri
- myIdentifier = self.fcpClient.getKeyInfo(
- 'arbitrary-uri',
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- data = 'foo'
- params = {
- 'Identifier': myIdentifier,
- 'Global': 'false',
- 'DataLength': 123456,
- 'Metadata.ContentType': 'any',
- }
- self.sendResponseMessage(
- 'DataFound',
- **params
- )
- self.assertHasNextEvent(
- self.fcpClient.events.RequestCompleted,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Success |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
- def test_2006_GetKeyInfo_TooBig(self):
-
- # test specdial case where ProtocolError.TooBig is handled as success
- # request a arbitrary uri
- myIdentifier = self.fcpClient.getKeyInfo(
- 'arbitrary-uri',
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- self.sendResponseMessage(
- 'GetFailed',
- Code='21', # Too big
- Identifier=myIdentifier,
- Global='false',
- # blah.. more here
- )
- self.assertHasNextEvent(
- self.fcpClient.events.RequestCompleted,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Success |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
-
- def test_2007_GetKeyInfo_Failure(self):
-
- # request a arbitrary file
- myIdentifier = self.fcpClient.getKeyInfo(
- 'arbitrary-uri',
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- self.sendResponseMessage(
- 'GetFailed',
- Code='28', # All data not found
- Identifier=myIdentifier,
- Global='false',
- # blah.. more here
- )
- self.assertHasNextEvent(
- self.fcpClient.events.RequestFailed,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Error |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-#***********************************************************************************
-#
-#***********************************************************************************
-#TODO:
-#
-#
-#
-class TestClientPut(BaseTestClient):
-
-
- def testPutRedirect_Success(self):
- # request a arbitrary file
- myIdentifier = self.fcpClient.putRedirect(
- 'my-redirect-name',
- 'SSK@arbitrary-uri',
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientPut)
- self.failUnless(myIdentifier in requestsAll)
-
- self.sendResponseMessage(
- 'PutSuccessful',
- Identifier=myIdentifier,
- URI='KSK@my-redirect-name'
- )
-
- self.assertHasNextEvent(
- self.fcpClient.events.RequestCompleted,
- consts.Message.ClientPut,
- ('FcRequestStatus', consts.RequestStatus.Success |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.failIf(requestsAll)
-
-
- def testPutRedirect_Failure(self):
- # request a arbitrary file
- myIdentifier = self.fcpClient.putRedirect(
- 'my-redirect-name',
- 'SSK@arbitrary-uri',
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientPut)
- self.failUnless(myIdentifier in requestsAll)
-
- self.sendResponseMessage(
- 'PutFailed',
- Identifier=myIdentifier,
- Code='5', # rout not found
- )
-
- self.assertHasNextEvent(
- self.fcpClient.events.RequestFailed,
- consts.Message.ClientPut,
- ('FcRequestStatus', consts.RequestStatus.Error |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.failIf(requestsAll)
-
-
-
-
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class TestRequests(BaseTestClient):
-
- def test_3000_ModifyRequest_Persistent(self):
-
- # request a arbitrary file
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- 'arbitryry.txt',
- persistentUserData='foo',
- priorityClass=consts.Priority.Medium,
- persistence=consts.Persistence.Reboot,
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
- #self.assertNextMessage(consts.Message.ClientGet)
-
-
- # test modify persistent user data
- self.fcpClient.modifyRequest(myIdentifier, persistentUserData='bar', priorityClass=consts.Priority.High)
- msg = self.assertHasNextMessage(consts.Message.ModifyPersistentRequest)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentRequestModified',
- **msg.params
- )
- self.assertHasNextEvent(self.fcpClient.events.RequestModified)
-
- self.failUnless(consts.RequestModified.PersistentUserData in myRequest['FcModified'])
- self.failUnless(consts.RequestModified.PriorityClass in myRequest['FcModified'])
- self.assertEqual('bar', myRequest['FcPersistentUserData'])
- self.assertEqual(consts.Priority.High, myRequest['PriorityClass'])
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
- def test_3001_ModifyRequest_NonPersistent(self):
-
- # request a arbitrary file
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- 'arbitryry.txt',
- persistentUserData='foo',
- priorityClass=consts.Priority.Medium,
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # test modify persistent user data
- self.fcpClient.modifyRequest(myIdentifier, persistentUserData='bar', priorityClass=consts.Priority.High)
-
- # no way to modify priority in Fcp. The client ignores all attempts to do so currently
- # no message is send,instead the event is triggered emidiately
-
- #msg = self.assertHasNextMessage(consts.Message.ModifyPersistentRequest)
- # respond to the file request
- #self.sendResponseMessage(
- # 'PersistentRequestModified',
- # **msg.params
- # )
-
- self.assertHasNextEvent(self.fcpClient.events.RequestModified)
-
- self.failUnless(consts.RequestModified.PersistentUserData in myRequest['FcModified'])
- #self.failUnless(consts.RequestModified.PriorityClass in myRequest['FcModified'])
- self.assertEqual('bar', myRequest['FcPersistentUserData'])
- #self.assertEqual(consts.Priority.High, myRequest['PriorityClass'])
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
- def test_3002_RemoveRequest_NonPersistent(self):
-
- # request a file
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- 'arbitrary.txt'
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # ignore events and messages so far
- self.events = []
- self.messages = []
-
- # now cancel request
- self.fcpClient.removeRequest(myIdentifier)
-
- # of our request should be removed emidiately,
- self.assertEqual(myRequest['FcRequestStatus'], consts.RequestStatus.Removed |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- )
- self.failIf(myIdentifier in self.fcpClient.getRequests())
-
- # now the request should have been removed
- self.assertHasNextEvent(
- self.fcpClient.events.RequestRemoved,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Removed |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
- self.failIf(self.fcpClient.getRequests())
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
- def test_3003_RemoveRequest_persistent(self):
-
- # request a file
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- 'arbitrary.txt',
- persistence=consts.Persistence.Reboot,
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # ignore events and messages so far
- self.events = []
- self.messages = []
-
- # now cancel request
- self.fcpClient.removeRequest(myIdentifier)
-
- # status of our request should be set to removed emidiately, but it should
- # not be removed from the client
- self.assertEqual(myRequest['FcRequestStatus'], consts.RequestStatus.Removed | consts.RequestStatus.Completed)
- self.failUnless(myIdentifier in self.fcpClient.getRequests())
-
- # client schould send a RemovePersistentRequest
- self.assertHasNextMessage(consts.Message.RemovePersistentRequest)
-
- # respond with a PersistentRequestRemoved
- self.sendResponseMessage(
- 'PersistentRequestRemoved',
- Identifier=myIdentifier,
- )
-
- # now the request should have been removed
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.RemovedFromQueue)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
- self.assertHasNextEvent(
- self.fcpClient.events.RequestRemoved,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Removed |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
-
- self.failIf(self.fcpClient.getRequests())
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
-
- def test_3004_ResendRequest_NonPersistent(self):
-
- myIdentifier = self.fcpClient.getData('any-key')
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- newIdentifier = self.fcpClient.resendRequest(myRequest)
-
- # client should remove old request emidiately
- self.failIf(myIdentifier == newIdentifier)
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(newIdentifier in requestsAll)
- self.assertHasNextEvent(
- self.fcpClient.events.RequestRemoved,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Removed |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[newIdentifier]
- self.failIf(requestsAll)
-
-
- def test_3005_ResendRequest_Persistent(self):
-
- myIdentifier = self.fcpClient.getData('any-key', persistence=consts.Persistence.Reboot)
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- newIdentifier = self.fcpClient.resendRequest(myRequest)
- self.failIf(myIdentifier == newIdentifier)
- self.failUnless(newIdentifier in requestsAll)
-
- # client should remove request from nodes queue
- self.assertHasNextMessage(
- consts.Message.RemovePersistentRequest,
- ('Identifier', myIdentifier)
- )
- self.assertHasNextMessage(
- consts.Message.ClientGet,
- ('Identifier', newIdentifier)
- )
- self.sendResponseMessage(
- 'PersistentRequestRemoved',
- Identifier=myIdentifier,
- )
- self.assertHasNextEvent(
- self.fcpClient.events.RequestRemoved,
- consts.Message.ClientGet,
- ('FcRequestStatus', consts.RequestStatus.Removed |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
-
- self.failUnless(newIdentifier in requestsAll)
- self.failIf(myIdentifier in requestsAll)
-
- del requestsAll[newIdentifier]
- self.failIf(requestsAll)
-
-
-#***********************************************************************************
-#
-#***********************************************************************************
-#TODO: testRestoreClientPut and friends
-class TestRestoreRequests(BaseTestClient):
-
- def test_4000_RestorePersistentGet_InvalidIdentifier(self):
-
- # throw an invalid PersistentRequest at the client
- myIdentifier = 'true-invalid-request-identifier'
- self.sendResponseMessage(
- 'PersistentGet',
- Identifier=myIdentifier,
- Global='false',
- ReturnType='disk',
- Verbosity='1',
- PersistenceType='forever',
- Started='false',
- Global='false',
- )
-
- # the client should now to cancel the request
- self.assertHasNextMessage(
- consts.Message.RemovePersistentRequest,
- ('Identifier', myIdentifier)
- )
-
- requests = self.fcpClient.getRequests()
- self.failIf(requests)
-
- # the client should not trigger any events
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
-
- def test_4001_RestorePersistentGet_ValidIdentifier(self):
-
- # we need a valid identifier to restore a request, so hack a bit
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- 'arbitryry.txt'
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- self.fcpClient.removeRequest(myIdentifier)
- self.sendResponseMessage(
- 'PersistentRequestRemoved',
- Identifier=myIdentifier,
- )
- self.messages = []
- self.events = []
-
- # throw a PersistentGet at the client with the identifier we hacked
- self.sendResponseMessage(
- 'PersistentGet',
- Identifier=myIdentifier,
- Global='false',
- ReturnType='disk',
- Verbosity='1',
- PersistenceType='forever',
- Started='false',
- ClientToken=myRequest['ClientToken']
- )
-
- # check if the client restored the request
- msg = self.assertHasNextEvent(
- self.fcpClient.events.RequestRestored,
- consts.Message.ClientGet,
- ('Identifier', myIdentifier),
- ('FcRequestStatus', consts.RequestStatus.Restored), # no RequestStatus.Pending flag should be set here
- )
-
- self.failUnless(myIdentifier in requestsAll)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-#***********************************************************************************
-#
-#***********************************************************************************
-#TODO: testDDAReadDenied_ReadDissallowed
-#TODO: testDDAWriteDenied
-#TODO: testDDAWriteDenied_WriteDisallowed
-
-class TestDDA(BaseTestClient):
-
- def test_5000_DDAWriteDenied(self):
-
- # request a file
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- os.path.join(DIR, 'DDATest.txt')
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- # client schould send a ClientGet
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond with a ProtocolError
- self.sendResponseMessage(
- 'ProtocolError',
- Code=25, # DDADenied
- Identifier=myIdentifier,
- ExtraDescription='An error occured',
- Fatal='false',
- Global='false',
- )
-
- # client should respond with a TestDDARequest
- self.assertHasNextMessage(
- consts.Message.TestDDARequest,
- ('Directory', DIR),
- ('WantWriteDirectory', True)
- )
-
- #msg = self.nextMessage()
- #self.failIf(msg is None)
- #self.assertEqual(msg.name, consts.Message.TestDDARequest)
- ##self.assertEqual(msg['Directory'], DIR)
- #self.failIf(not msg['WantWriteDirectory'])
-
-
- # 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
- )
-
- requests = self.fcpClient.getRequests()
- self.assertEqual(len(requests), 1)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
- #def testDDAReadDenied(self):
-
- # pass
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class TestCollisions(BaseTestClient):
-
- def test_6000_IdentifierCollision(self):
-
- # request a file
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- os.path.join(DIR, 'test.txt')
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- # client schould send a ClientGet
- self.assertHasNextMessage(consts.Message.ClientGet)
-
-
- # respond with an IdentifierCollision
- self.sendResponseMessage(
- 'IdentifierCollision',
- Identifier=myIdentifier,
- )
-
- # client schould send a new ClientGet
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # check if RequestModified event has been triggered
- msg = self.assertHasNextEvent(
- self.fcpClient.events.RequestModified,
- consts.Message.ClientGet,
- )
-
- self.failUnless(consts.RequestModified.Identifier in msg['FcModified'])
- oldIdentifier = msg['FcModified'][consts.RequestModified.Identifier]
- newIdentifier = msg['Identifier']
- self.assertEqual(oldIdentifier, myIdentifier)
- self.assertNotEqual(newIdentifier, myIdentifier)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[newIdentifier]
- self.failIf(requestsAll)
-
-
- def test_6001_FilenameCollision_HandleRename(self):
-
- # request a file
- fpath = os.path.join(DIR, 'test.txt')
- open(fpath, 'wb').close()
- self.tmpfiles.append(fpath)
-
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- fpath,
- filenameCollision=consts.FilenameCollision.HandleRename,
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- # client schould send a ClientGet
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # now respond with a ProtocolError
- self.sendResponseMessage(
- 'ProtocolError',
- Identifier=myIdentifier,
- Code='10', # disk target exists
- ExtraDescription='An error occured',
- Fatal='false',
- Global='false',
- )
-
- # client schould send a new ClientGet with a different filename
- self.assertHasNextMessage(consts.Message.ClientGet)
- msg = self.assertHasNextEvent(
- self.fcpClient.events.RequestModified,
- consts.Message.ClientGet
- )
-
- self.failUnless(consts.RequestModified.Filename in msg['FcModified'])
- self.assertEqual(msg['FcModified'][consts.RequestModified.Filename], fpath)
- self.assertNotEqual(msg['Filename'], fpath)
-
- # check flags
- filenameCollision = msg['FcFilenameCollision']
- self.assertEqual(
- filenameCollision & consts.FilenameCollision.MaskHandle,
- consts.FilenameCollision.HandleRename
- )
- self.failUnless(filenameCollision & consts.FilenameCollision.CollisionHandled)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
- def test_6002_FilenameCollision_HandleNever(self):
-
- # request a file
- fpath = os.path.join(DIR, 'test.txt')
- open(fpath, 'wb').close()
- self.tmpfiles.append(fpath)
-
- myIdentifier = self.fcpClient.getFile(
- 'arbitrary-uri',
- fpath,
- filenameCollision=consts.FilenameCollision.HandleNever,
- )
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- # client schould send a ClientGet
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # check if our request was registered
- requests = self.fcpClient.getRequests()
- self.failUnless(len(requests) == 1)
-
- # now respond with a ProtocolError
- self.sendResponseMessage(
- 'ProtocolError',
- Identifier=myIdentifier,
- Code='10', # disk target exists
- ExtraDescription='An error occured',
- Fatal='false',
- Global='false',
- )
-
- # client schould send no messages and trigger a RequestFailed event
- self.assertHasNextEvent(self.fcpClient.events.RequestFailed)
-
- # request should have been removed
- self.failIf(self.fcpClient.getRequests())
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-#***********************************************************************************
-#
-#***********************************************************************************
-#TODO: class TestNodeAndPeers(BaseTestConnectedClient):
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class TestPlugins(BaseTestClient):
-
-
- def testGet_8000_PluginInfo_Success(self):
-
- myIdentifier = self.fcpClient.getPluginInfo('hi there')
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.failUnless(myIdentifier in requestsAll)
- self.assertHasNextMessage(
- consts.Message.GetPluginInfo,
- ('Identifier', myIdentifier),
- ('PluginName', 'hi there'),
- )
-
- self.sendResponseMessage(
- consts.Message.PluginInfo,
- PluginName='hi there',
- Identifier=myIdentifier,
- )
-
- msg = self.assertHasNextEvent(
- self.fcpClient.events.PluginInfo,
- consts.Message.GetPluginInfo,
- ('Identifier', myIdentifier),
- ('PluginName', 'hi there'),
- ('FcRequestStatus', consts.RequestStatus.Success |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
-
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
-
- def test_8001_GetPluginInfo_Failure(self):
- myIdentifier = self.fcpClient.getPluginInfo('hi there')
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.failUnless(myIdentifier in requestsAll)
- self.assertHasNextMessage(
- consts.Message.GetPluginInfo,
- ('Identifier', myIdentifier),
- ('PluginName', 'hi there'),
- )
-
- self.sendResponseMessage(
- consts.Message.ProtocolError,
- Code=32, # No such plugin
- Identifier=myIdentifier,
- )
-
- msg = self.assertHasNextEvent(
- self.fcpClient.events.PluginInfoFailed,
- consts.Message.GetPluginInfo,
- #('PluginName', 'hi there'),
- ('Identifier', myIdentifier),
- ('FcRequestStatus', consts.RequestStatus.Error |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
-
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
- def test_8002_SendPluginMessage_Success(self):
-
- myIdentifier = self.fcpClient.sendPluginMessage('hi there', {'foo': "bar"})
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.failUnless(myIdentifier in requestsAll)
- self.assertHasNextMessage(
- consts.Message.FCPPluginMessage,
- ('Identifier', myIdentifier),
- ('PluginName', 'hi there'),
- ('foo', 'bar'),
- )
-
- self.sendResponseMessage(
- consts.Message.FCPPluginReply,
- PluginName='hi there',
- Identifier=myIdentifier,
- baz='12345',
- )
-
- msg = self.assertHasNextEvent(
- self.fcpClient.events.PluginMessage,
- consts.Message.FCPPluginMessage,
- ('PluginName', 'hi there'),
- ('Identifier', myIdentifier),
- ('FcRequestStatus', consts.RequestStatus.Success |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
- reply = msg['FcPluginReply']
- self.failUnless(reply.params.get('baz', None) == '12345')
-
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
- def test_8003_GetSendPluginMessage_Failure(self):
- myIdentifier = self.fcpClient.sendPluginMessage('hi there', {'foo': "bar"})
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.failUnless(myIdentifier in requestsAll)
- self.assertHasNextMessage(
- consts.Message.FCPPluginMessage,
- ('Identifier', myIdentifier),
- ('PluginName', 'hi there'),
- ('foo', 'bar'),
- )
-
- self.sendResponseMessage(
- consts.Message.ProtocolError,
- Code=32, # No such plugin
- Identifier=myIdentifier,
- )
-
- msg = self.assertHasNextEvent(
- self.fcpClient.events.PluginMessageFailed,
- consts.Message.FCPPluginMessage,
- #('PluginName', 'hi there'),
- ('Identifier', myIdentifier),
- ('FcRequestStatus', consts.RequestStatus.Error |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
-
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.failIf(requestsAll)
-
-
-#***********************************************************************************
-#TODO: class TestConfig(BaseTestConnectedClient):
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class TestGenerateKeypair(BaseTestClient):
-
- def test_10000_GeberateSSKKeypair(self):
- myIdentifier = self.fcpClient.generateKeypair(consts.KeyType.SSK)
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.GenerateSSK)
- self.sendResponseMessage(
- 'SSKKeypair',
- Identifier=myIdentifier,
- RequestURI='SSK@public',
- InsertURI='SSK@private',
- )
-
- msg = self.assertHasNextEvent(
- self.fcpClient.events.KeypairGenerated,
- consts.Message.GenerateSSK,
- ('Identifier', myIdentifier),
- ('FcPublicKey','SSK@public'),
- ('FcPrivateKey','SSK@private'),
- ('FcRequestStatus', consts.RequestStatus.Success |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.failIf(requestsAll)
-
-
- def test_10001_GeberateUSKKeypair(self):
- myIdentifier = self.fcpClient.generateKeypair(consts.KeyType.USK)
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.assertHasNextMessage(consts.Message.GenerateSSK)
- self.sendResponseMessage(
- 'SSKKeypair',
- Identifier=myIdentifier,
- RequestURI='SSK@public',
- InsertURI='SSK@private',
- )
-
- msg = self.assertHasNextEvent(
- self.fcpClient.events.KeypairGenerated,
- consts.Message.GenerateSSK,
- ('Identifier', myIdentifier),
- ('FcPublicKey','USK@public'),
- ('FcPrivateKey','USK@private'),
- ('FcRequestStatus', consts.RequestStatus.Success |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.failIf(requestsAll)
-
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class TestSubscribeUSK(BaseTestClient):
-
-
- def test_11000_Subscribe(self):
-
- myIdentifier = self.fcpClient.subscribeUSK('arbitrary')
- myRequest = self.fcpClient.getRequest(myIdentifier)
- requestsAll = self.fcpClient.getRequests()
-
- self.failUnless(myIdentifier in requestsAll)
- self.failUnless(myRequest['FcRequestStatus'] & consts.RequestStatus.Completed)
-
- self.assertHasNextMessage(consts.Message.SubscribeUSK)
- self.sendResponseMessage(
- 'SubscribedUSKUpdate',
- Identifier=myIdentifier,
- Edition=99,
- URI='arbitryry/99/',
- )
-
- msg = self.assertHasNextEvent(
- self.fcpClient.events.USKUpdated,
- consts.Message.SubscribedUSKUpdate,
- ('Identifier', myIdentifier),
- ('Edition', 99),
- ('URI', 'arbitryry/99/'),
- )
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
-
-#*********************************************************************************
-#
-#*********************************************************************************
-def suite():
-
- testCases = (
- TestConnect,
- TestDisconnectReason,
- TestClientGet,
- TestClientPut,
- TestRequests,
- TestRestoreRequests,
- TestDDA,
- TestCollisions,
-
- TestPlugins,
- TestGenerateKeypair,
- TestSubscribeUSK,
- )
-
- suite = unittest.TestSuite()
- for testCase in testCases:
- suite.addTest(unittest.makeSuite(testCase))
- return suite
-
-def test():
- unittest.TextTestRunner(verbosity=1).run(suite())
-
-
-if __name__ == "__main__":
- test()
-
-
-
-
-
-
-
-
-
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 10:42:34
|
Revision: 264
http://fclient.svn.sourceforge.net/fclient/?rev=264&view=rev
Author: jurner
Date: 2008-02-26 02:42:37 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
some more words
Modified Paths:
--------------
trunk/web/intro.html
trunk/web/more-fcp2.html
Modified: trunk/web/intro.html
===================================================================
--- trunk/web/intro.html 2008-02-26 10:21:07 UTC (rev 263)
+++ trunk/web/intro.html 2008-02-26 10:42:37 UTC (rev 264)
@@ -9,7 +9,7 @@
<div class="topic">
- <b>fclient:</b> Gui frontend for freenet written in Qt and python. Yet to come
+ <b>fclient:</b> Gui frontend for freenet written in Qt and python. The Gui is yet to come.
<br>
[<a href="more-fclient.html" target="mainFrame">..More</a>] [<a href="download-fclient.html" target="mainFrame">Download</a>] [<a href="screenshots-fclient.html" target="mainFrame">Screenshots</a>]
@@ -19,7 +19,7 @@
<div class="topic">
<b>fcp2:</b> high level wrapper for the freenet client protocol version-2 written in python. Automatic
- conversions from Fcp to python types, access to node and peer configurations and more
+ conversions from Fcp to python types, access to node and peer configurations and much more.
<br>
[<a href="more-fcp2.html" target="mainFrame">..More</a>] [<a href="download-fcp2.html" target="mainFrame">Download</a>] [<a href="screenshots-fcp2.html" target="mainFrame">Screenshots</a>]
</div>
Modified: trunk/web/more-fcp2.html
===================================================================
--- trunk/web/more-fcp2.html 2008-02-26 10:21:07 UTC (rev 263)
+++ trunk/web/more-fcp2.html 2008-02-26 10:42:37 UTC (rev 264)
@@ -11,10 +11,10 @@
<div class="topic">
<b>fcp2:</b> high level wrapper for the freenet client protocol written in python. Automatic
- conversions from Fcp to python types, access to node and peer configurations.
-
- <br>
- Blah more here
+ conversions from Fcp to python types, access to node and peer configurations and much more.
+ The package is designed as drop anywhere package so you can include it into any project as
+ library. No need to install it to the sites directory.
+
</div>
<h5>Sample code:</h5>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ju...@us...> - 2008-02-26 10:21:05
|
Revision: 263
http://fclient.svn.sourceforge.net/fclient/?rev=263&view=rev
Author: jurner
Date: 2008-02-26 02:21:07 -0800 (Tue, 26 Feb 2008)
Log Message:
-----------
...
Added Paths:
-----------
trunk/web/download-fcp2.html
trunk/web/more-fcp2.html
trunk/web/screenshots-fcp2.html
Added: trunk/web/download-fcp2.html
===================================================================
--- trunk/web/download-fcp2.html (rev 0)
+++ trunk/web/download-fcp2.html 2008-02-26 10:21:07 UTC (rev 263)
@@ -0,0 +1,21 @@
+<html>
+ <head>
+ <link rel="StyleSheet" href="default.css" type="text/css" media="screen">
+ </head>
+ <body>
+
+ <div class="navHeader">
+ <a class="navRef" href="intro.html" target="mainFrame">fclient</a><span class="navRef">::download-fcp2</span>
+ </div>
+
+
+ <div class="topic">
+ <br>
+ <br>
+ Nothing to see here, move along
+ </div>
+
+ <div class="bottom_padding"></div>
+ </body>
+</html>
+
Added: trunk/web/more-fcp2.html
===================================================================
--- trunk/web/more-fcp2.html (rev 0)
+++ trunk/web/more-fcp2.html 2008-02-26 10:21:07 UTC (rev 263)
@@ -0,0 +1,86 @@
+<html>
+ <head>
+ <link rel="StyleSheet" href="default.css" type="text/css" media="screen">
+ </head>
+ <body>
+
+ <div class="navHeader">
+ <a class="navRef" href="intro.html" target="mainFrame">fclient</a><span class="navRef">::more-fcp2</span>
+ </div>
+
+
+ <div class="topic">
+ <b>fcp2:</b> high level wrapper for the freenet client protocol written in python. Automatic
+ conversions from Fcp to python types, access to node and peer configurations.
+
+ <br>
+ Blah more here
+ </div>
+
+ <h5>Sample code:</h5>
+
+
+Connect to the freenet node
+<pre class="py_code"><span class="py_keyword">from</span> fcp2 <span class="py_keyword">import</span> Client
+
+client <span class="py_operator">=</span> Client()
+nodeHello <span class="py_operator">=</span> client.connect()
+<span class="py_keyword">if</span> nodeHello <span class="py_keyword">is</span> <span class="py_bool">None</span>:
+ <span class="py_keyword">pass</span>
+ <span class="py_comment"># something went wrong ..could not connect to the freenet node</span>
+<span class="py_keyword">else</span>:
+ <span class="py_keyword">pass</span>
+ <span class="py_comment"># everything went well ..we are connected now</span>
+</pre>
+
+Request data associated to a freenet key
+<pre class="py_code">myRequestIdentifier <span class="py_operator">=</span> client.getData(<span class="py_string2">'CHK@ABCDE.......'</span>)
+myRequest <span class="py_operator">=</span> client.getRequest(myIdentifier)
+client.run()
+<span class="py_keyword">print</span> myRequest.data
+</pre>
+
+
+Usually you would connect handlers to client events to do processing or handle errors
+<pre class="py_code"><span class="py_keyword">def</span> handleSuccess(event, request):
+ <span class="py_keyword">print</span> <span class="py_string2">'Here is the data:'</span>, request.data
+
+<span class="py_keyword">def</span> handleFailure(event, request):
+ <span class="py_keyword">print</span> <span class="py_string2">'Too bad, something went wrong'</span>
+
+client.events.RequestCompleted <span class="py_operator">+</span><span class="py_operator">=</span> handleSuccess
+client.events.RequestFailed <span class="py_operator">+</span><span class="py_operator">=</span> handleFailure
+
+client.getData(<span class="py_string2">'CHK@ABCDE.......'</span>)
+client.run()
+</pre>
+
+Instead of calling run() you may run the client step by step
+<pre class="py_code">client.getData(<span class="py_string2">'CHK@ABCDE.......'</span>)
+<span class="py_keyword">for</span> i <span class="py_keyword">in</span> xrange(50):
+ client.next()
+</pre>
+
+You may disconnect event handlers aswel
+<pre class="py_code">client.events.RequestCompleted <span class="py_operator">-</span><span class="py_operator">=</span> handleSuccess
+client.events.RequestFailed <span class="py_operator">-</span><span class="py_operator">=</span> handleFailure
+</pre>
+
+Multiple event handlers may be connected / disconnected at once
+<pre class="py_code">client.events <span class="py_operator">+</span><span class="py_operator">=</span> (
+ (client.events.RequestCompleted, handleSuccess),
+ (client.events.RequestFailed, handleFailure)
+ )
+</pre>
+
+
+
+To generate extensive documentation run the package through [<a href="http://epydoc.sourceforge.net/">epydoc</a>].
+To make things a bit simpler script <span class="hilight">gen_docs.py</span> located in the
+<span class="hilight">scripts</span> subdirectory of the package wich will dump docs automatically to the
+packages <span class="hilight">doc</span> folder.
+
+
+ <div class="bottom_padding"></div>
+ </body>
+</html>
\ No newline at end of file
Added: trunk/web/screenshots-fcp2.html
===================================================================
--- trunk/web/screenshots-fcp2.html (rev 0)
+++ trunk/web/screenshots-fcp2.html 2008-02-26 10:21:07 UTC (rev 263)
@@ -0,0 +1,21 @@
+<html>
+ <head>
+ <link rel="StyleSheet" href="default.css" type="text/css" media="screen">
+ </head>
+ <body>
+
+ <div class="navHeader">
+ <a class="navRef" href="intro.html" target="mainFrame">fclient</a><span class="navRef">::screenshots-fcp2</span>
+ </div>
+
+
+ <div class="topic">
+ <br>
+ <br>
+ Nothing to see here, move along
+ </div>
+
+
+ <div class="bottom_padding"></div>
+ </body>
+</html>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|