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