fclient-commit Mailing List for fclient (Page 22)
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-06-30 09:17:19
|
Revision: 437
http://fclient.svn.sourceforge.net/fclient/?rev=437&view=rev
Author: jUrner
Date: 2008-06-30 02:17:24 -0700 (Mon, 30 Jun 2008)
Log Message:
-----------
...
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-06-30 09:12:16 UTC (rev 436)
+++ trunk/sandbox/fcp2/client.py 2008-06-30 09:17:24 UTC (rev 437)
@@ -885,8 +885,6 @@
)
return True
- #NOTE: there is no distinction between ClientPutDiskDir and ClientPutComplexDir
- # so a bit of additional work here
requestType = msg['RequestType']
if requestType & consts.RequestType.MaskGet:
initialRequest = message.ClientGet()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-30 09:12:43
|
Revision: 436
http://fclient.svn.sourceforge.net/fclient/?rev=436&view=rev
Author: jUrner
Date: 2008-06-30 02:12:16 -0700 (Mon, 30 Jun 2008)
Log Message:
-----------
fix for PutDiskDir vs PutComplexDir on restore
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-06-30 08:58:39 UTC (rev 435)
+++ trunk/sandbox/fcp2/client.py 2008-06-30 09:12:16 UTC (rev 436)
@@ -876,7 +876,6 @@
# unknown request... try to restore it
if initialRequest is None:
-
if CancelPersistentRequests:
self.sendMessage(
message.RemovePersistentRequest(
@@ -891,22 +890,16 @@
requestType = msg['RequestType']
if requestType & consts.RequestType.MaskGet:
initialRequest = message.ClientGet()
-
- #FIXME: does not work as expected
- # ClientPutdiskDir is just a subtype of ClientPutComplexDir
- # items will be passed as Files.N.* container
-
- elif requestType == consts.RequestType.PutMultiple:
+ elif requestType & (onsts.RequestType.PutDir | consts.RequestType.PutMultiple):
+ #NOTE: PutDiskDir is just a subtype of PutComplexDir
initialRequest = message.ClientPutComplexDir()
- elif requestType == consts.RequestType.PutDir:
- initialRequest = message.ClientPutdiskDir()
else:
initialRequest = message.ClientPut()
initialRequest.params.update(msg.params)
self._requests[initialRequest['Identifier']] = initialRequest
- #FIX: remove Started param from PersistentGet / Put
+ #FIX: remove Started param from PersistentGet / Put, not interesting
if 'Started' in initialRequest.params:
del initialRequest.params['Started']
initialRequest['RequestStatus'] |= consts.RequestStatus.Restored
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-30 08:58:32
|
Revision: 435
http://fclient.svn.sourceforge.net/fclient/?rev=435&view=rev
Author: jUrner
Date: 2008-06-30 01:58:39 -0700 (Mon, 30 Jun 2008)
Log Message:
-----------
more tests
Modified Paths:
--------------
trunk/sandbox/fcp2/test_fcp/test_client.py
Modified: trunk/sandbox/fcp2/test_fcp/test_client.py
===================================================================
--- trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-30 08:57:58 UTC (rev 434)
+++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-30 08:58:39 UTC (rev 435)
@@ -341,8 +341,6 @@
('DisconnectReason', consts.DisconnectReason.Close),
)
-
-
#***********************************************************************************
#
#***********************************************************************************
@@ -356,8 +354,9 @@
self.failIf(self.client.isOpen())
#***********************************************************************************
-#TODO: not idea how to test this
+#
#***********************************************************************************
+#TODO: not idea how to test this
class Test_connect(BaseTestClient):
pass
@@ -642,10 +641,10 @@
self.closeClient()
#***********************************************************************************
-# TODO: no idea how t test this
+#
#***********************************************************************************
+# TODO: no idea how t test this
class Test_startNode(BaseTestClient):
-
pass
#***********************************************************************************
@@ -659,25 +658,21 @@
self.client.setConnectionName('foo')
self.failIf(self.client.getConnectionName() != 'foo')
-
#***********************************************************************************
#
#***********************************************************************************
class Test_get_setDebugVerbosity(BaseTestClient):
-
def test_get_setDebugVerbosity(self):
oldVerbosity = self.client.getDebugVerbosity()
self.client.setDebugVerbosity(self.client.consts.DebugVerbosity.Quiet)
self.client.setDebugVerbosity(oldVerbosity)
-
#***********************************************************************************
#
#***********************************************************************************
class Test_versionCheckNodeHello(BaseTestClient):
-
def test_get_versionCheckNodeHello(self):
msg = {
@@ -716,8 +711,9 @@
self.failUnless(result == True)
#***********************************************************************************
-# TODO: not tested
+#
#***********************************************************************************
+# TODO: not tested
class Test_handleMessage(BaseTestClient):
pass
@@ -764,13 +760,12 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.failUnless(self.ioOpen())
-
#***********************************************************************************
-#TODO: not tested yet
+#
#***********************************************************************************
+#TODO: not tested
class Test_run(BaseTestClient):
-
pass
#***********************************************************************************
@@ -869,9 +864,8 @@
self.assertHasNextMessage(None)
self.failUnless(self.ioOpen())
-
#***********************************************************************************
-# NOTE: all the in depth tests for getFile() getKeyInfo() are performed here
+#
#***********************************************************************************
class Test_getData(BaseTestClient):
@@ -1885,11 +1879,7 @@
#***********************************************************************************
#
#***********************************************************************************
-#TODO:
-#
-# x. check if TargetFilename handling is ok for CHKs
-#
-
+#TODO: check if TargetFilename handling is ok for CHKs
class Test_putData(BaseTestClient):
def test_putData_Success(self):
@@ -1959,93 +1949,16 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.failIf(requestsAll)
-
-
#***********************************************************************************
#
-#***********************************************************************************
-class Test_putRedirect(BaseTestClient):
-
-
- def testPutRedirect_Success(self):
+#***********************************************************************************
+class Test_putDir(BaseTestClient):
+ def test_putDir_Success(self):
self.connectClient()
-
- # request a arbitrary file
- myRedirect = self.client.key.KSK('foo')
- myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData)
- myIdentifier = self.client.putRedirect(
- myRedirect,
- myKey,
- )
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientPut)
- self.failUnless(myIdentifier in requestsAll)
-
- self.sendResponseMessage(
- 'PutSuccessful',
- Identifier=myIdentifier,
- URI=myRedirect
- )
- self.assertHasNextEvent(
- self.client.events.RequestCompleted,
- consts.Message.ClientPut,
- ('RequestStatus', consts.RequestStatus.Success |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.failIf(requestsAll)
-
-
- def testPutRedirect_Failure(self):
- self.connectClient()
-
- # request a arbitrary file
- myRedirect = self.client.key.KSK('foo')
- myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData)
- myIdentifier = self.client.putRedirect(
- myRedirect,
+ myKey = self.client.key.KSK('foo')
+ myIdentifier = self.client.putDir(
myKey,
- )
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientPut)
- self.failUnless(myIdentifier in requestsAll)
-
- self.sendResponseMessage(
- 'PutFailed',
- Identifier=myIdentifier,
- Code='5', # rout not found
- )
-
- self.assertHasNextEvent(
- self.client.events.RequestFailed,
- consts.Message.ClientPut,
- ('RequestStatus', consts.RequestStatus.Error |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.failIf(requestsAll)
-
-
-
-
-class Test_clientPut(BaseTestClient):
-
- def XXXtestCHKPutDir_Success(self):
- # request a arbitrary file
- myIdentifier = self.client.chkPutDir(
'myDirectory'
)
myRequest = self.client.getRequest(myIdentifier)
@@ -2057,7 +1970,7 @@
self.sendResponseMessage(
'PutSuccessful',
Identifier=myIdentifier,
- URI='CHK@my-redirect-name'
+ URI=myKey
)
self.assertHasNextEvent(
@@ -2071,12 +1984,15 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
- self.failIf(requestsAll)
-
+ self.failIf(requestsAll)
+
+
+ def test_putDir_Failure(self):
+ self.connectClient()
- def XXXtestCHKPutDir_Failure(self):
- # request a arbitrary file
- myIdentifier = self.client.chkPutDir(
+ myKey = self.client.key.KSK('foo')
+ myIdentifier = self.client.putDir(
+ myKey,
'myDirectory'
)
myRequest = self.client.getRequest(myIdentifier)
@@ -2104,10 +2020,17 @@
self.assertHasNextMessage(None)
self.failIf(requestsAll)
-
- def XXXtestCHKPutFile_Success(self):
- # request a arbitrary file
- myIdentifier = self.client.chkPutFile(
+#***********************************************************************************
+#
+#***********************************************************************************
+class Test_putFile(BaseTestClient):
+
+ def test_putFile_Success(self):
+ self.connectClient()
+
+ myKey = self.client.key.KSK('foo')
+ myIdentifier = self.client.putFile(
+ myKey,
'myFile.txt'
)
myRequest = self.client.getRequest(myIdentifier)
@@ -2119,7 +2042,7 @@
self.sendResponseMessage(
'PutSuccessful',
Identifier=myIdentifier,
- URI='CHK@my-redirect-name'
+ URI=myKey
)
self.assertHasNextEvent(
@@ -2134,11 +2057,14 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.failIf(requestsAll)
-
+
+
+ def test_putFile_Failure(self):
+ self.connectClient()
- def XXXtestCHKPutFile_Failure(self):
- # request a arbitrary file
- myIdentifier = self.client.chkPutFile(
+ myKey = self.client.key.KSK('foo')
+ myIdentifier = self.client.putFile(
+ myKey,
'myFile.txt'
)
myRequest = self.client.getRequest(myIdentifier)
@@ -2164,11 +2090,14 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
- self.failIf(requestsAll)
+ self.failIf(requestsAll)
-
-
- def XXXtestCHKPutMultiple_Success(self):
+#***********************************************************************************
+#
+#***********************************************************************************
+class Test_putMultiple(BaseTestClient):
+ def test_putMultiple_Success(self):
+ self.connectClient()
items = [
{
@@ -2194,7 +2123,9 @@
]
# request a arbitrary file
- myIdentifier = self.client.chkPutMultiple(
+ myKey = self.client.key.KSK('foo')
+ myIdentifier = self.client.putMultiple(
+ myKey,
items
)
myRequest = self.client.getRequest(myIdentifier)
@@ -2229,7 +2160,7 @@
self.sendResponseMessage(
'PutSuccessful',
Identifier=myIdentifier,
- URI='CHK@my-redirect-name'
+ URI=myKey
)
self.assertHasNextEvent(
@@ -2243,11 +2174,11 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
- self.failIf(requestsAll)
+ self.failIf(requestsAll)
-
- def XXXtestCHKPutMultiple_ItemErrors(self):
-
+
+ def test_putMultiple_ItemErrors(self):
+ self.connectClient()
# upload directory is not allowed
items = [
@@ -2257,7 +2188,8 @@
'Name': 'myItem0',
},
]
- self.assertRaises(ValueError, self.client.chkPutMultiple, items)
+ myKey = self.client.key.KSK('foo')
+ self.assertRaises(ValueError, self.client.putMultiple, myKey, items)
#TODO: how to test required params?
# ...just some samples below
@@ -2270,7 +2202,7 @@
'Name': 'myItem0',
},
]
- self.assertRaises(ValueError, self.client.chkPutMultiple, items)
+ self.assertRaises(ValueError, self.client.putMultiple, myKey, items)
# param missing (we enforce all required parameters)
items = [
@@ -2280,26 +2212,91 @@
#'Name': 'myItem0',
},
]
- self.assertRaises(ValueError, self.client.chkPutMultiple, items)
+ self.assertRaises(ValueError, self.client.putMultiple, myKey, items)
+#***********************************************************************************
+#
+#***********************************************************************************
+class Test_putRedirect(BaseTestClient):
- # some sloppy tests for other key types
- def testSSKPutData(self):
- myIdentifier = self.client.chkPutData(
- 'arbitrary data'
+
+ def testPutRedirect_Success(self):
+ self.connectClient()
+
+ # request a arbitrary file
+ myRedirect = self.client.key.KSK('foo')
+ myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData)
+ myIdentifier = self.client.putRedirect(
+ myRedirect,
+ myKey,
)
+ myRequest = self.client.getRequest(myIdentifier)
+ requestsAll = self.client.getRequests()
+
+ self.assertHasNextMessage(consts.Message.ClientPut)
+ self.failUnless(myIdentifier in requestsAll)
+
+ self.sendResponseMessage(
+ 'PutSuccessful',
+ Identifier=myIdentifier,
+ URI=myRedirect
+ )
+
+ self.assertHasNextEvent(
+ self.client.events.RequestCompleted,
+ consts.Message.ClientPut,
+ ('RequestStatus', consts.RequestStatus.Success |
+ consts.RequestStatus.RemovedFromQueue |
+ consts.RequestStatus.Completed
+ ),
+ )
+
+ self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
+ self.failIf(requestsAll)
-
+
+ def testPutRedirect_Failure(self):
+ self.connectClient()
+
+ # request a arbitrary file
+ myRedirect = self.client.key.KSK('foo')
+ myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData)
+ myIdentifier = self.client.putRedirect(
+ myRedirect,
+ myKey,
+ )
+ myRequest = self.client.getRequest(myIdentifier)
+ requestsAll = self.client.getRequests()
+
+ self.assertHasNextMessage(consts.Message.ClientPut)
+ self.failUnless(myIdentifier in requestsAll)
+
+ self.sendResponseMessage(
+ 'PutFailed',
+ Identifier=myIdentifier,
+ Code='5', # rout not found
+ )
+
+ self.assertHasNextEvent(
+ self.client.events.RequestFailed,
+ consts.Message.ClientPut,
+ ('RequestStatus', consts.RequestStatus.Error |
+ consts.RequestStatus.RemovedFromQueue |
+ consts.RequestStatus.Completed
+ ),
+ )
+
+ self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
+ self.failIf(requestsAll)
-
-
-
#***********************************************************************************
#
#***********************************************************************************
-class Test_requests(BaseTestClient):
-
- def test_3000_ModifyRequest_Persistent(self):
+class Test_modifyRequest(BaseTestClient):
+
+ def test_modifyRequest_Persistent(self):
self.connectClient()
@@ -2349,7 +2346,7 @@
self.failIf(requestsAll)
- def test_3001_ModifyRequest_NonPersistent(self):
+ def test_modifyRequest_NonPersistent(self):
self.connectClient()
# request a arbitrary file
@@ -2397,9 +2394,12 @@
del requestsAll[myIdentifier]
self.failIf(requestsAll)
+#***********************************************************************************
+#
+#***********************************************************************************
+class Test_removeRequest(BaseTestClient):
-
- def test_3002_RemoveRequest(self):
+ def test_removeRequest(self):
self.connectClient()
# request a file
@@ -2454,82 +2454,32 @@
self.assertHasNextMessage(None)
self.failIf(requestsAll)
-
- def test_3005_ResendRequest_Persistent(self):
- self.connectClient()
-
- myKey = self.client.key.key('KSK@foo')
- myIdentifier = self.client.getData(myKey, persistence=consts.Persistence.Reboot)
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- newIdentifier = self.client.resendRequest(myRequest)
- self.failIf(myIdentifier == newIdentifier)
- self.failUnless(newIdentifier in requestsAll)
-
- # client should remove request from nodes queue
- self.assertHasNextMessage(
- consts.Message.RemoveRequest,
- ('Identifier', myIdentifier)
- )
- self.assertHasNextMessage(
- consts.Message.ClientGet,
- ('Identifier', newIdentifier)
- )
- self.sendResponseMessage(
- 'GetFailed',
- Code='25',
- Identifier=myIdentifier,
- )
-
-
-
- self.assertHasNextEvent(
- self.client.events.RequestRemoved,
- consts.Message.ClientGet,
- ('RequestStatus', 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 Test_restoreRequests(BaseTestClient):
- def test_4000_RestorePersistentGet_InvalidClientToken(self):
+ def test_restorePersistentGet_invalidClientToken(self):
+ self.connectClient()
# throw an invalid PersistentRequest at the client
myIdentifier = '123456789'
- self.sendResponseMessage(
- 'PersistentGet',
- Identifier=myIdentifier,
- Global='false',
- ClientToken='i-am-invalid',
- ReturnType='disk',
- Verbosity='1',
- PersistenceType='forever',
- Started='false',
- Global='false',
- )
+ self.assertRaises(
+ consts.MessageParseError,
+ self.sendResponseMessage,
+ 'PersistentGet',
+ Identifier=myIdentifier,
+ Global='false',
+ ClientToken='i-am-invalid', # me is invalid ...me!
+ 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.client.getRequests()
self.failIf(requests)
@@ -2538,11 +2488,13 @@
self.assertHasNextMessage(None)
- def test_4001_RestorePersistentGet_ValidIdentifier(self):
-
+ def test_restorePersistentGet_validIdentifier(self):
+ self.connectClient()
+
# we need a valid identifier to restore a request, so hack a bit
+ myKey = self.client.key.key('KSK@foo')
myIdentifier = self.client.getFile(
- 'arbitrary-uri',
+ myKey,
'arbitryry.txt'
)
myRequest = self.client.getRequest(myIdentifier)
@@ -2555,9 +2507,9 @@
'PersistentRequestRemoved',
Identifier=myIdentifier,
)
- self.messages = []
- self.events = []
-
+ self.assertHasNextMessage(self.client.message.RemoveRequest.name)
+ self.assertHasNextEvent(self.client.events.RequestRemoved)
+
# throw a PersistentGet at the client with the identifier we hacked
self.sendResponseMessage(
'PersistentGet',
@@ -2591,10 +2543,9 @@
#TODO: testDDAReadDenied_ReadDissallowed
#TODO: testDDAWriteDenied
#TODO: testDDAWriteDenied_WriteDisallowed
-
class Test_DDA(BaseTestClient):
- def test_5000_DDAWriteDenied(self):
+ def test_DDAWriteDenied(self):
self.connectClient()
# request a file
@@ -2696,7 +2647,7 @@
#***********************************************************************************
class TestCollisions(BaseTestClient):
- def test_6000_IdentifierCollision(self):
+ def test_identifierCollision(self):
self.connectClient()
# request a file
@@ -2740,7 +2691,7 @@
self.failIf(requestsAll)
- def test_6001_FilenameCollision_HandleRename(self):
+ def test_filenameCollision_HandleRename(self):
self.connectClient()
# request a file
@@ -2796,7 +2747,7 @@
self.failIf(requestsAll)
- def test_6002_FilenameCollision_HandleNever(self):
+ def test_filenameCollision_HandleNever(self):
self.connectClient()
# request a file
@@ -2848,113 +2799,6 @@
#***********************************************************************************
#
#***********************************************************************************
-#TODO: some tests not yet implemented
-class Test_resendRequests(BaseTestClient):
-
- def test_resend_CHK(self):
- myKey = 'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo'
- msg = message.ClientPut(
- URI=myKey,
- Persistence=consts.Persistence.Connection,
- )
- self.client._registerRequest(msg, consts.RequestType.PutData)
- myIdentifier = msg['Identifier']
- requestsAll = self.client.getRequests()
-
- newIdentifier = self.client.resendRequest(msg)
-
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(newIdentifier in requestsAll)
-
- self.assertHasNextMessage(
- consts.Message.ClientPut,
- ('URI', 'CHK@')
- )
-
- def test_resend_SSK(self):
- myKey = 'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA'
- msg = message.ClientPut(
- URI=myKey + '/foo',
- Persistence=consts.Persistence.Connection,
- )
- self.client._registerRequest(msg, consts.RequestType.PutData)
- msg['PrivateKey'] = myKey
- myIdentifier = msg['Identifier']
- requestsAll = self.client.getRequests()
-
- newIdentifier = self.client.resendRequest(msg)
-
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(newIdentifier in requestsAll)
-
- self.assertHasNextMessage(
- consts.Message.ClientPut,
- ('URI', myKey + '/foo')
- )
-
-
- def test_resend_USK(self):
- myKey = 'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA'
- msg = message.ClientPut(
- URI=myKey + '/foo/0',
- Persistence=consts.Persistence.Connection,
- )
- self.client._registerRequest(msg, consts.RequestType.PutData)
- msg['PrivateKey'] = myKey
- myIdentifier = msg['Identifier']
- requestsAll = self.client.getRequests()
-
- newIdentifier = self.client.resendRequest(msg)
-
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(newIdentifier in requestsAll)
-
- self.assertHasNextMessage(
- consts.Message.ClientPut,
- ('URI', myKey + '/foo')
- )
-
- def test_resend_KSK(self):
- myKey = 'KSK@abs'
- msg = message.ClientPut(
- URI=myKey,
- Persistence=consts.Persistence.Connection,
- )
- self.client._registerRequest(msg, consts.RequestType.PutData)
- msg['PrivateKey'] = myKey
- myIdentifier = msg['Identifier']
- requestsAll = self.client.getRequests()
-
- newIdentifier = self.client.resendRequest(msg)
-
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(newIdentifier in requestsAll)
-
- self.assertHasNextMessage(
- consts.Message.ClientPut,
- ('URI', myKey)
- )
-
-
-
- def test_resend_getKeyInfo(self):
- pass
-
- def test_resend_getData(self):
- pass
-
- def test_resend_getFile(self):
- pass
-
- def test_resend_getFile(self):
- pass
-
- def test_resend_unsupportedRequest(self):
- pass
-
-#***********************************************************************************
-#
-#***********************************************************************************
class Test_plugins(BaseTestClient):
@@ -3136,11 +2980,7 @@
self.assertHasNextMessage(None)
self.failIf(requestsAll)
-
#***********************************************************************************
-#TODO: class TestConfig(BaseTestConnectedClient):
-
-#***********************************************************************************
#
#***********************************************************************************
class Test_generateKeypair(BaseTestClient):
@@ -3166,8 +3006,8 @@
self.client.events.KeypairGenerated,
consts.Message.GenerateSSK,
('Identifier', myIdentifier),
- ('PublicKey',pub),
- ('PrivateKey',priv),
+ ('RequestURI',pub),
+ ('InsertURI',priv),
('RequestStatus', consts.RequestStatus.Success |
consts.RequestStatus.RemovedFromQueue |
consts.RequestStatus.Completed
@@ -3204,8 +3044,8 @@
self.client.events.KeypairGenerated,
consts.Message.GenerateSSK,
('Identifier', myIdentifier),
- ('PublicKey',pub),
- ('PrivateKey',priv),
+ ('RequestURI',pub),
+ ('InsertURI',priv),
('RequestStatus', consts.RequestStatus.Success |
consts.RequestStatus.RemovedFromQueue |
consts.RequestStatus.Completed
@@ -3289,16 +3129,15 @@
Test_getKeyInfo,
Test_putData,
+ Test_putDir,
+ Test_putFile,
+ Test_putMultiple,
Test_putRedirect,
+
+ Test_modifyRequest,
+ Test_removeRequest,
- #Test_putData,
- #Test_clientPut,
-
- #Test_clientGet,
-
- Test_requests,
- #Test_restoreRequests,
- #Test_resendRequests,
+ Test_restoreRequests,
Test_DDA,
TestCollisions,
Test_plugins,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-30 08:58:05
|
Revision: 434
http://fclient.svn.sourceforge.net/fclient/?rev=434&view=rev
Author: jUrner
Date: 2008-06-30 01:57:58 -0700 (Mon, 30 Jun 2008)
Log Message:
-----------
removed some leftover code
++ beautifications
Modified Paths:
--------------
trunk/sandbox/fcp2/message.py
Modified: trunk/sandbox/fcp2/message.py
===================================================================
--- trunk/sandbox/fcp2/message.py 2008-06-30 08:57:07 UTC (rev 433)
+++ trunk/sandbox/fcp2/message.py 2008-06-30 08:57:58 UTC (rev 434)
@@ -218,7 +218,7 @@
# param types for config message
#
# ..bit more efford here, cos we need types for user input checking
-# ...a slpoppy implementation of a dict should be enough
+# ...a sloppy implementation of a dict should be enough
#
#***************************************************************************************
class _ConfigMessageParamTypes(object):
@@ -415,8 +415,12 @@
raise ValueError('Unknown param class in: %r' % paramName)
ConfigMessageParamTypes = _ConfigMessageParamTypes()
+
#********************************************************************************
-# equipment for messages with persustent params and additional params
+# equipp Get / Put messages with some persistent params
+#
+# these params are stored in ClientToken
+#
#********************************************************************************
class PeristentParamsGet(pmstruct.PoorMansStruct):
_fields_ = (
@@ -427,62 +431,13 @@
PeristentParamsPut = PeristentParamsGet
-
-class PersistentParams(object):
-
- def __init__(self, mapping):
- self.mapping = mapping
-
- def fromString(self, string):
- pass
-
-
-
-PeerMessageParamTypes = {
- 'ark.number': types.FcpTypeInt,
- 'auth.negTypes': types.FcpTypeInt,
-
- 'location': types.FcpTypeFloat,
- 'opennet': types.FcpTypeBool,
- 'testnet': types.FcpTypeBool,
-
- 'metadata.timeLastConnected': types.FcpTypeTime,
- 'metadata.timeLastReceivedPacket': types.FcpTypeTime,
- 'metadata.timeLastRoutable': types.FcpTypeTime,
- 'metadata.timeLastSuccess': types.FcpTypeTime,
- 'metadata.routableConnectionCheckCount': types.FcpTypeInt,
- 'metadata.hadRoutableConnectionCount': types.FcpTypeInt,
-
- 'volatile.averagePingTime': types.FcpTypeFloat,
- 'volatile.overloadProbability': types.FcpTypePercent,
- 'volatile.routingBackoff': types.FcpTypeInt,
- 'volatile.routingBackoffPercent': types.FcpTypePercent,
- 'volatile.totalBytesIn': types.FcpTypeInt,
- 'volatile.totalBytesOut': types.FcpTypeInt,
- 'volatile.routingBackoffLength': types.FcpTypeInt,
- }
-
-'''all other Peer message params here....
-
->> identity=YIrE..................
->> lastGoodVersion=Fred,0.7,1.0,1106
->> physical.udp=00.000.000.000:00000
->> version=Fred,0.7,1.0,1107
->> dsaGroup.q=ALFDN...............
->> dsaGroup.p=AIYIrE..................
->> dsaPubKey.y=YSlb............
->> dsaGroup.g=UaRa...............
->> ark.pubURI=SSK@......................
->>
->> metadata.detected.udp=000.000.000.000:00000
-
->> volatile.lastRoutingBackoffReason=ForwardRejectedOverload
->> volatile.percentTimeRoutableConnection=99.4735.................
->> volatile.status=CONNECTED
-
-'''
-
-
+#********************************************************************************
+# at runtime we store a few additional params in msg.params
+#
+# for uniformity reasons we store them in msg.params and mark them
+# as private so they don't get send to the node
+#
+#********************************************************************************
AdditionalGetParams = {
# persistent params that will go into identifier
@@ -496,12 +451,8 @@
PrivateParam('ErrorMessage'): None, # error message in case an error occured
PrivateParam('UserData'): None, # any user defined runtime data here
- # params for SSKKeypair
- PrivateParam('PrivateParamKey'): None,
- PrivateParam('PublicKey'): None,
-
# params from DataFound
- PrivateParam('MetadataContentType'): '', # contecnt type
+ PrivateParam('MetadataContentType'): '', # content type
PrivateParam('MetadataSize'): 0, # content size
# params from PersistentRequestModified
@@ -533,10 +484,6 @@
PrivateParam('ErrorMessage'): None, # error message in case an error occured
PrivateParam('UserData'): None, # any user defined runtime data here
- # params for SSKKeypair
- PrivateParam('PrivateParamKey'): None,
- PrivateParam('PublicKey'): None,
-
# params from DataFound
PrivateParam('MetadataContentType'): '', # contecnt type
PrivateParam('MetadataSize'): 0, # content size
@@ -559,8 +506,6 @@
PrivateParam('RequestType'): consts.RequestType.Null, # identifies sub message types
PrivateParam('RequestStatus'): consts.RequestStatus.Null,
PrivateParam('InitTime'): 0, # when was the request started?
- PrivateParam('PrivateKey'): None,
- PrivateParam('PublicKey'): None,
}
AdditionalSubscribeUSKParams = {
@@ -614,7 +559,7 @@
#********************************************************************************
#
#********************************************************************************
-#TODO: register new message type?
+#TODO: do we need this?
def newMessageType(name, paramTypes=None, additionalParams=None, persistentParams=None):
kws = {
'name': name,
@@ -624,11 +569,8 @@
}
return type(name, (MessageBase, ), kws)
-
-#TODO: _persistent_params_ ...define in all message classes or not? Bogus for most,
-# but makes customization of individual classes harder for useres
#********************************************************************************
-# some additional messages we define for uniformity
+# some messages defined by the client
#********************************************************************************
class ClientDisconnected(MessageBase):
name = consts.Message.ClientDisconnected
@@ -651,12 +593,54 @@
}
#********************************************************************************
-#
+# fcp messages
#********************************************************************************
class AddPeer(MessageBase):
name = consts.Message.AddPeer
_additional_params_ = {}
- _param_types_ = PeerMessageParamTypes
+ _param_types_ = {
+ 'ark.number': types.FcpTypeInt,
+ 'auth.negTypes': types.FcpTypeInt,
+ 'ark.pubURI': key.FcpTypeKey,
+
+ 'location': types.FcpTypeFloat,
+ 'opennet': types.FcpTypeBool,
+ 'testnet': types.FcpTypeBool,
+
+ # passed in Peer message
+ 'metadata.timeLastConnected': types.FcpTypeTime,
+ 'metadata.timeLastReceivedPacket': types.FcpTypeTime,
+ 'metadata.timeLastRoutable': types.FcpTypeTime,
+ 'metadata.timeLastSuccess': types.FcpTypeTime,
+ 'metadata.routableConnectionCheckCount': types.FcpTypeInt,
+ 'metadata.hadRoutableConnectionCount': types.FcpTypeInt,
+
+ 'volatile.averagePingTime': types.FcpTypeFloat,
+ 'volatile.overloadProbability': types.FcpTypePercent,
+ 'volatile.routingBackoff': types.FcpTypeInt,
+ 'volatile.routingBackoffPercent': types.FcpTypePercent,
+ 'volatile.totalBytesIn': types.FcpTypeInt,
+ 'volatile.totalBytesOut': types.FcpTypeInt,
+ 'volatile.routingBackoffLength': types.FcpTypeInt,
+ }
+
+'''all other Peer message params here....
+
+>> identity=YIrE..................
+>> lastGoodVersion=Fred,0.7,1.0,1106
+>> physical.udp=00.000.000.000:00000
+>> version=Fred,0.7,1.0,1107
+>> dsaGroup.q=ALFDN...............
+>> dsaGroup.p=AIYIrE..................
+>> dsaPubKey.y=YSlb............
+>> dsaGroup.g=UaRa...............
+>>
+>> metadata.detected.udp=000.000.000.000:00000
+
+>> volatile.lastRoutingBackoffReason=ForwardRejectedOverload
+>> volatile.percentTimeRoutableConnection=99.4735.................
+>> volatile.status=CONNECTED
+'''
class AllData(MessageBase):
@@ -1103,7 +1087,7 @@
class Peer(MessageBase):
name = consts.Message.Peer
_additional_params_ = {}
- _param_types_ = PeerMessageParamTypes
+ _param_types_ = AddPeer._param_types_
class PeerNote(MessageBase):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-30 08:57:01
|
Revision: 433
http://fclient.svn.sourceforge.net/fclient/?rev=433&view=rev
Author: jUrner
Date: 2008-06-30 01:57:07 -0700 (Mon, 30 Jun 2008)
Log Message:
-----------
typo
Modified Paths:
--------------
trunk/sandbox/fcp2/scripts/gen_docs.py
Modified: trunk/sandbox/fcp2/scripts/gen_docs.py
===================================================================
--- trunk/sandbox/fcp2/scripts/gen_docs.py 2008-06-30 08:56:39 UTC (rev 432)
+++ trunk/sandbox/fcp2/scripts/gen_docs.py 2008-06-30 08:57:07 UTC (rev 433)
@@ -27,7 +27,7 @@
if not os.path.isdir(directory):
os.makedirs(directory)
-def enshure_doc_dir_dxists():
+def enshure_doc_dir_exists():
"""enshures epydoc docdir exists"""
save_create_dir(EPYDOC_DIR)
@@ -43,7 +43,7 @@
def main():
""""""
pprint('dumping docs to:', EPYDOC_DIR)
- enshure_doc_dir_dxists()
+ enshure_doc_dir_exists()
pprint('calling epydoc')
sys.argv = [
__file__,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-30 08:56:40
|
Revision: 432
http://fclient.svn.sourceforge.net/fclient/?rev=432&view=rev
Author: jUrner
Date: 2008-06-30 01:56:39 -0700 (Mon, 30 Jun 2008)
Log Message:
-----------
all methods now have a test case
++ some fixes
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-06-30 08:55:28 UTC (rev 431)
+++ trunk/sandbox/fcp2/client.py 2008-06-30 08:56:39 UTC (rev 432)
@@ -431,7 +431,6 @@
## connection related methods
##
###############################################################
- #TESTED
def close(self):
"""Closes the client
@note: make shure to call close() when done with the client
@@ -441,7 +440,7 @@
)
self._close(msg)
- #TESTED
+
def closeNode(self):
"""Shuts down the freenet node"""
self.sendMessage(message.Shutdown())
@@ -461,7 +460,7 @@
pass
return nodeHello
- #TESTED
+
def isOpen(self):
"""Checks if the clients connection is open
@return: (bool) True if so, False otherwise
@@ -469,7 +468,7 @@
return self.ioHandler.isOpen()
- #TESTED
+
def iterConnect(self, host=DefaultFcpHost, port=DefaultFcpPort, duration=20, timeout=0.5):
"""Iterator to stablish a connection to a freenet node
@param host: (str) host of th node
@@ -532,14 +531,14 @@
self._close(disconnectMsg)
raise StopIteration
- #TESTED
+
def getConnectionName(self):
"""Returns the connection name used by the client
@return: (str) connection name
"""
return self._connectionName
- #TESTED
+
def setConnectionName(self, connectionName=None):
"""Sets the connection name to be used by the client
@param connectionName: (str) connection name or None to use an arbitrary connection name
@@ -548,7 +547,7 @@
self._connectionName = self._newUuid() if connectionName is None else connectionName
return self._connectionName
- #TESTED
+
def getDebugVerbosity(self):
"""Returns the current verbosity level of the client
@return: L{consts.DebugVerbosity}
@@ -556,7 +555,7 @@
return consts.Logger.Client.getEffectiveLevel()
- #TESTED
+
def setDebugVerbosity(self, debugVerbosity):
"""Sets the verbosity level of the client
@param debugVerbosity: L{consts.DebugVerbosity}
@@ -564,7 +563,7 @@
consts.Logger.Client.setLevel(debugVerbosity)
- #TESTED
+
def startNode(self, cmdline):
"""Starts the freenet node
@param cmdline: commandline to start freenet (like '/freenet/run.sh start' or 'c:\freenet\start.bat')
@@ -581,7 +580,7 @@
stdout, stderr = p.communicate()
return stdout
- #TESTED
+
def versionCheckNodeHello(self, nodeHelloMessage):
"""Performa a version check of the client against the specified NodeHello message
@return: (bool) True if version is ok, False otherwise
@@ -598,7 +597,6 @@
## runtime related methods
##
#########################################################
- #TESTED
def handleMessage(self, msg):
"""Handles a message from the freenet node
@param msg: (Message) to handle
@@ -952,19 +950,16 @@
self.events.RequestModified(initialRequest)
return True
-
- # don't handle PersistentRequestRemoved. instead we handle it in Get/PutFailed
- # ??? why ???
- #
- #elif msg == message.PersistentRequestRemoved:
- # if initialRequest is None:
- # return False
+ #NOTE: fcp sends a GetFailed / PutFailed if the request was still running (code=canceled)
+ elif msg == message.PersistentRequestRemoved:
+ if initialRequest is None:
+ return False
- # initialRequest['RequestStatus'] |= consts.RequestStatus.Removed
- # self._finalizeRequest(msg, initialRequest, self.events.RequestRemoved)
- # return True
-
-
+ initialRequest['RequestStatus'] |= consts.RequestStatus.Removed | consts.RequestStatus.Completed | consts.RequestStatus.RemovedFromQueue
+ del self._requests[requestIdentifier]
+ self.events.RequestRemoved(initialRequest)
+ return True
+
elif msg == message.SimpleProgress:
if initialRequest is None:
return False
@@ -1103,16 +1098,14 @@
if initialRequest is None:
return False
- #TODO:no idea if the node may pass uris with prefixes like 'freenet:'... strip it anyways
insertURI = msg['InsertURI']
requestURI = msg['RequestURI']
if initialRequest['RequestType'] == consts.RequestType.GenerateUSKKeypair:
insertURI = key.USK(insertURI.keyData, filename=insertURI.filename)
requestURI = key.USK(requestURI.keyData, filename=requestURI.filename)
-
- initialRequest['PrivateKey'] = insertURI
- initialRequest['PublicKey'] = requestURI
+ initialRequest['InsertURI'] = insertURI
+ initialRequest['RequestURI'] = requestURI
initialRequest['RequestStatus'] |= consts.RequestStatus.Success
self._finalizeRequest(msg, initialRequest, self.events.KeypairGenerated)
return True
@@ -1129,7 +1122,7 @@
# default
return False
- #TESTED
+
def next(self, dispatch=True):
"""Pumps the next message waiting
@param dispatch: if True the message is dispatched to L{handleMessage}
@@ -1153,7 +1146,7 @@
self.handleMessage(msg)
return msg
- #TESTED
+
def run(self):
"""Runs the client unconditionally untill all requests have completed
@note: a KeyboardInterrupt will stop the client
@@ -1196,7 +1189,7 @@
if msg == message.ClientSocketDied:
break
- #TESTED
+
def sendMessage(self, msg):
"""Sends a message to freenet
@param msg: (L{message.Message}) message to send
@@ -1225,7 +1218,6 @@
## config related methods
##
#########################################################
- #TESTED
def getConfig(self,
withCurrent=True,
withDefaults=True,
@@ -1253,7 +1245,7 @@
)
- #TESTED
+
def modifyConfig(self, params):
"""Modifies node configuration values
@param params: (dict) containing parameters to modify
@@ -1268,7 +1260,7 @@
##
########################################################
def clientGet(self,
- key,
+ uri,
requestType,
userData,
persistentUserData,
@@ -1276,7 +1268,7 @@
**messageParams
):
"""Requests a key from the node
- @param key: (L{key.KeyBase}) key to request
+ @param uri: (L{key.KeyBase}) key to request
@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
@@ -1286,7 +1278,7 @@
@return: (str) request identifier
"""
- msg = message.ClientGet(URI=key)
+ msg = message.ClientGet(URI=uri)
for paramName, value in messageParams.items():
if value is not None:
msg[paramName] = value
@@ -1302,9 +1294,9 @@
return msg['Identifier']
- #TESTED
+
def getData(self,
- key,
+ uri,
allowedMimeTypes=None,
binaryBlob=False,
@@ -1320,7 +1312,7 @@
):
"""Requests datae from the node
- @param key: (L{key.KeyBase}) key to request
+ @param uri: (L{key.KeyBase}) key to request
@param allowedMimeTypes: (str) list of allowed mime types
@param binaryBlob: (bool) if True, the file is retrieved as binary blob file
@@ -1346,7 +1338,7 @@
as soon as it completes or failes
"""
return self.clientGet(
- key,
+ uri,
consts.RequestType.GetData,
userData,
persistentUserData,
@@ -1368,9 +1360,9 @@
)
- #TESTED
+
def getFile(self,
- key,
+ uri,
filename,
allowedMimeTypes=None,
@@ -1388,7 +1380,7 @@
):
"""Requests a file from the node
- @param key: (L{key.KeyBase}) key to request
+ @param uri: (L{key.KeyBase}) key to request
@param filename: (full path) filename to store the file to
@param allowedMimeTypes: (str) list of allowed mime types
@@ -1415,7 +1407,7 @@
as soon as it completes or failes
"""
return self.clientGet(
- key,
+ uri,
consts.RequestType.GetFile,
userData,
persistentUserData,
@@ -1438,9 +1430,9 @@
)
- #TESTED
+
def getKeyInfo(self,
- key,
+ uri,
dsOnly=False,
ignoreDS=False,
@@ -1453,7 +1445,7 @@
):
"""Requests info about a key
- @param key: (L{key.KeyBase}) key to request
+ @param uri: (L{key.KeyBase}) key to request
@param dsOnly: if True, retrieves the file from the local data store only
@param ignoreDS: If True, ignores the local data store
@@ -1476,7 +1468,7 @@
"""
# how to retrieve meta info about a key? ...idea is to provoke a GetFailed (TooBig)
return self.clientGet(
- key,
+ uri,
consts.RequestType.GetKeyInfo,
userData,
persistentUserData,
@@ -1496,8 +1488,8 @@
)
- #TESTED
- def subscribeUSK(self, key, dontPoll=True):
+
+ def subscribeUSK(self, uri, dontPoll=True):
"""Asks the node to notify the client when an USK is updated
@param key: (L{key.USK}) key to subscribe to
@param dontPoll: if True, does whatever ???
@@ -1509,7 +1501,7 @@
@todo: looks like USK subscribes will persist untill connection is closed. Can they be removed somehow?
"""
msg = message.SubscribeUSK(
- URI=key,
+ URI=uri,
DontPoll=dontPoll,
)
self._registerRequest(msg, consts.RequestType.SubscribeUSK)
@@ -1525,7 +1517,7 @@
########################################################
def clientPut(self,
requestType,
- key,
+ uri,
userData,
persistentUserData,
data=None,
@@ -1534,7 +1526,7 @@
):
"""Uploads to the node
@param requestType: (L{consts.RequestType}). Can be PutData, PutDir or PutMultiple
- @param key: (str) key or Uri
+ @param uri: (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
@@ -1571,12 +1563,12 @@
msgClass = message.ClientPutComplexDir
else:
raise ValueError('Unsupported request type')
- msg = msgClass(URI=key)
+ msg = msgClass(URI=uri)
# add params
- if key.KeyType == consts.KeyType.CHK:
- if key.filename is not None:
- msg['TargetFilename'] = key.filename
+ if uri.KeyType == consts.KeyType.CHK:
+ if uri.filename is not None:
+ msg['TargetFilename'] = uri.filename
for param, value in msgParams.items():
if value is not None:
msg[param] = value
@@ -1664,9 +1656,9 @@
self.sendMessage(msg)
return msg['Identifier']
- #TESTED
+
def putData(self,
- key,
+ uri,
data,
contentType=None,
@@ -1680,7 +1672,7 @@
):
"""Uploads data
- @param key: (L{key.KeyBase}) key under wich to upload the data
+ @param uri: (L{key.KeyBase}) key under wich to upload the data
@param data: (bytes) data to upload
@param contentType: (str) content type. If not specified, the node will guess the content type
@@ -1695,7 +1687,7 @@
@event: (L{events.Events.RequestFailed}) triggered when the request failes
@event: (L{events.Events.RequestFetchable}) triggered as soon as the request is fetchable
@event: (L{events.Events.RequestCompressionStarted}) triggered when the request is about to be compressed
- @event: (L{events.Events.RequestCompressionComopleted}) triggered as soon as compressing of the request is completed
+ @event: (L{events.Events.RequestCompressionCompleted}) triggered as soon as compressing of the request is completed
@note: if the upload is successful the node will create a L{consts.KeyType.CHK} key under wich
the data can be retreieved. The key can be accessed as 'URI' member of the request as soon
@@ -1706,7 +1698,7 @@
"""
return self.clientPut(
consts.RequestType.PutData,
- key,
+ uri,
userData,
persistentUserData,
data=data,
@@ -1726,114 +1718,15 @@
Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression,
)
- #TESTED
- def putRedirect(self,
- key,
- targetKey,
- maxRetries=None,
- persistence=consts.Persistence.Connection,
- priorityClass=consts.Priority.Medium,
- userData=None,
- persistentUserData='',
- ):
- """Uploads a redirect to another key
- @param key: (L{key.KSK}) to insert as redirect
- @param targetKey: (key.KeyBase) key to redirect to
- @param maxRetries: (int) maximum number of tretries or -1 to leave the decission up to the node
- @param persistence: (L{consts.Persistence}) of the request
- @param priorityClass: (L{consts.Priority}) priority of the request
- @param persistentUserData: (str) persistent data to be assosiated to the request
- @param userData: (any) any data to be associated to the request at runtime
- @return: (str) request identifier
- """
- return self.clientPut(
- consts.RequestType.PutRedirect,
- key,
- userData,
- persistentUserData,
- Persistence=persistence,
- PriorityClass=priorityClass,
- TargetURI=targetKey,
- UploadFrom=consts.UploadFrom.Redirect,
- )
- #########################################################
- #########################################################
- #########################################################
- #########################################################
- #########################################################
-
- #CHK
- def chkPutData(self,
- data,
-
- contentType=None,
- dontCompress=None,
- maxRetries=None,
- persistence=consts.Persistence.Connection,
- priorityClass=consts.Priority.Medium,
- targetFilename=None,
-
- userData=None,
- persistentUserData='',
- ):
- """Uploads data
- @param data: (bytes) data to upload
-
- @param contentType: (str) content type. If not specified, the node will guess the content type
- @param dontCompress: (bool) if True, the node won't try to compress the data
- @param maxRetries: (int) maximum number of retries or -1 to retry forver or None to leave it to the node to decide
- @param priorityClass: (L{consts.Priority}) priority of the request
- @param targetFilename: (str) filename to append to the key (may not contain slashes)
-
- @param userData: any non persistent data to associate to the request
- @param persistentUserData: any string to associate to the request as persistent data
-
- @event: (L{events.Events.RequestCompleted}) triggered when the request is complete
- @event: (L{events.Events.RequestFailed}) triggered when the request failes
- @event: (L{events.Events.RequestFetchable}) triggered as soon as the request is fetchable
- @event: (L{events.Events.RequestCompressionStarted}) triggered when the request is about to be compressed
- @event: (L{events.Events.RequestCompressionComopleted}) triggered as soon as compressing of the request is completed
-
- @note: if the upload is successful the node will create a L{consts.KeyType.CHK} key under wich
- the data can be retreieved. The key can be accessed as 'URI' member of the request as soon
- as the L{events.Events.RequestFetchable} or the L{events.Events.RequestCompleted} event
- is triggered.
-
- @todo: EarlyEncode and GetCHKOnly message params not implemented
- """
- return self.clientPut(
- consts.RequestType.PutData,
- consts.KeyType.CHK,
-
- data=data,
- persistentUserData=persistentUserData,
- userData=userData,
-
- # fcp params
- ContentType=contentType,
- DataLength=len(data),
- #EarlyEncode='false',
- #GetCHKOnly='false',
- Global=False,
- Identifier=None,
- MaxRetries=maxRetries,
- DontCompress=dontCompress,
- Persistence=persistence,
- PriorityClass=priorityClass,
- TargetFilename=targetFilename,
- UploadFrom=consts.UploadFrom.Direct,
- Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression,
- )
-
-
- def chkPutDir(self,
+ def putDir(self,
+ uri,
directory,
allowUnreadableFiles=False,
-
+ defaultName=None,
contentType=None,
+
dontCompress=None,
- defaultName=None,
maxRetries=None,
persistence=consts.Persistence.Connection,
priorityClass=consts.Priority.Medium,
@@ -1845,11 +1738,14 @@
):
"""Uploads the contents of a directory
+ @param uri: (L{key.KeyBase}) key under wich to upload the directory
@param directory: (str) directory to upload
@param allowUnreadableFiles: if True, unreadable files in the directory are ignored, if False the request fails
- if it encounters an unreadavle file.
+ if it encounters an unreadavle file
+ @param defaultName: name of the directory item that should be displayed when accessing the directory
+ without any filename appended to the uri
- @note: for other params see L{chkPutData}
+ @note: for other params see L{putData}
@note: once uploaded, items of the directory can be accessed under Key/MyItemName/MyItemSubname
@todo: EarlyEncode and GetCHKOnly message params not implemented
@@ -1857,18 +1753,15 @@
"""
return self.clientPut(
consts.RequestType.PutDir,
- consts.KeyType.CHK,
-
- data=None,
- persistentUserData=persistentUserData,
- userData=userData,
-
+ uri,
+ userData,
+ persistentUserData,
+
# fcp params
- Filename=directory,
- AllowUnreadableFiles=allowUnreadableFiles,
ContentType=contentType,
DefaultName=defaultName,
#EarlyEncode='false',
+ Filename=directory,
#GetCHKOnly='false',
Global=False,
Identifier=None,
@@ -1876,44 +1769,42 @@
DontCompress=dontCompress,
Persistence=persistence,
PriorityClass=priorityClass,
- TargetFilename=targetFilename,
UploadFrom=consts.UploadFrom.Disk,
Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression,
)
-
- def chkPutFile(self,
+
+ def putFile(self,
+ uri,
filename,
contentType=None,
dontCompress=None,
maxRetries=None,
persistence=consts.Persistence.Connection,
priorityClass=consts.Priority.Medium,
- targetFilename=None,
-
+
userData=None,
persistentUserData='',
):
"""Uploads a file
- @param filename: (bytes) data to upload
+ @param uri: (L{key.KeyBase}) key under wich to upload the file
+ @param filename: (str) file to upload
- @note: for other params see L{chkPutData}
+ @note: for other params see L{putData}
@todo: EarlyEncode and GetCHKOnly message params not implemented
"""
return self.clientPut(
consts.RequestType.PutFile,
- consts.KeyType.CHK,
-
- data=None,
- persistentUserData=persistentUserData,
- userData=userData,
-
+ uri,
+ userData,
+ persistentUserData,
+
# fcp params
- Filename=filename,
ContentType=contentType,
- #EarlyEncode='false',
+ #EarlyEncode='false',
+ Filename=filename,
#GetCHKOnly='false',
Global=False,
Identifier=None,
@@ -1921,18 +1812,14 @@
DontCompress=dontCompress,
Persistence=persistence,
PriorityClass=priorityClass,
- TargetFilename=targetFilename,
UploadFrom=consts.UploadFrom.Disk,
Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression,
)
-
-
- def chkPutMultiple(self,
+ def putMultiple(self,
+ uri,
items,
- allowUnreadableFiles=False,
- contentType=None,
defaultName=None,
dontCompress=None,
maxRetries=None,
@@ -1946,9 +1833,10 @@
):
"""Uploads multiple items at once to be retrievable under one key
+ @param uri: (L{key.KeyBase}) key under wich to upload the file
@param items: (list) list of items to upload
- @note: for other params see L{chkPutData}
+ @note: for other params see L{chkPutDir}
@note: to upload multiple items at once pass a dict for each item containig the following members:
- RequestType: L{consts.RequestType.PutData}, L{consts.RequestType.PutFile} or L{consts.RequestType.PutRedirect}
@@ -1966,16 +1854,12 @@
"""
return self.clientPut(
consts.RequestType.PutMultiple,
- consts.KeyType.CHK,
-
- data=None,
- persistentUserData=persistentUserData,
- userData=userData,
+ uri,
+ userData,
+ persistentUserData,
items=items,
-
+
# fcp params
- AllowUnreadableFiles=allowUnreadableFiles,
- ContentType=contentType,
DefaultName=defaultName,
#EarlyEncode='false',
#GetCHKOnly='false',
@@ -1985,132 +1869,42 @@
DontCompress=dontCompress,
Persistence=persistence,
PriorityClass=priorityClass,
- TargetFilename=targetFilename,
UploadFrom=consts.UploadFrom.Disk,
Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression,
)
- ########################################################
- ##
- ## SSK ClientPut related methods
- ##
- ########################################################
- def sskPutData(self,
- data,
- privateKey,
-
- contentType=None,
- dontCompress=None,
- maxRetries=None,
- persistence=consts.Persistence.Connection,
- priorityClass=consts.Priority.Medium,
- targetFilename=None,
-
- userData=None,
- persistentUserData='',
- ):
- """Uploads data that can be updated by the owner
- @param data: (bytes) data to upload
- @param privateKey: see: private key as generated by L{generateKeypair} + '/' + name
-
- @note: for other params see L{chkPutData}
- @note: use this method to upload updatable data. First you need to create a public / private
- keypair. The private key is used for uploading, the public key for retrieving the data.
- You should add a name to the keypairs like: "privateKey/MyData" and "publicKey/MyData".
- This may aswell be used to implement a basic edition scheme: "privateKey/MyEdition-0",
- "privateKey/MyEdition-1"
- """
- return self.clientPut(
- consts.RequestType.PutData,
- privateKey,
-
- data=data,
- persistentUserData=persistentUserData,
- userData=userData,
-
- # fcp params
- ContentType=contentType,
- DataLength=len(data),
-
- #EarlyEncode='false',
- #GetCHKOnly='false',
- Global=False,
- Identifier=None,
- MaxRetries=maxRetries,
- DontCompress=dontCompress,
- Persistence=persistence,
- PriorityClass=priorityClass,
- UploadFrom=consts.UploadFrom.Direct,
- Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression,
- )
-
- def sskPutDir(self):
- pass
- def sskPutFile(self):
- pass
-
- def sskPutMultiple(self):
- pass
-
- ########################################################
- ##
- ## USK ClientPut related methods
- ##
- ########################################################
- def uskPutData(self,
- data,
- privateKey,
-
- contentType=None,
- dontCompress=None,
+ def putRedirect(self,
+ uri,
+ targetKey,
maxRetries=None,
persistence=consts.Persistence.Connection,
priorityClass=consts.Priority.Medium,
- targetFilename=None,
-
userData=None,
- persistentUserData=''
+ persistentUserData='',
):
- """Uploads data
-
+ """Uploads a redirect to another key
+ @param uri: (L{key.KSK}) to insert as redirect
+ @param targetKey: (key.KeyBase) key to redirect to
+ @param maxRetries: (int) maximum number of tretries or -1 to leave the decission up to the node
+ @param persistence: (L{consts.Persistence}) of the request
+ @param priorityClass: (L{consts.Priority}) priority of the request
+ @param persistentUserData: (str) persistent data to be assosiated to the request
+ @param userData: (any) any data to be associated to the request at runtime
+ @return: (str) request identifier
"""
-
-
return self.clientPut(
- consts.RequestType.PutData,
- privateKey,
- #insertURI + 'foo/0/',
- userData=userData,
- persistentUserData=persistentUserData,
- data=data,
-
- # fcp params
- ContentType=contentType,
- DataLength=len(data),
- #EarlyEncode='false',
- #GetCHKOnly='false',
- Global=False,
- Identifier=None,
- MaxRetries=maxRetries,
- DontCompress=dontCompress,
- Persistence=persistence,
- TargetFilename=targetFilename,
- UploadFrom=consts.UploadFrom.Direct,
- Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression,
- )
-
- def uskPutDir(self):
- pass
+ consts.RequestType.PutRedirect,
+ uri,
+ userData,
+ persistentUserData,
+ Persistence=persistence,
+ PriorityClass=priorityClass,
+ TargetURI=targetKey,
+ UploadFrom=consts.UploadFrom.Redirect,
+ )
- def uskPutFile(self):
- pass
-
-
- def uskPutMultiple(self):
- pass
-
########################################################
##
## request related methods
@@ -2198,66 +1992,6 @@
del self._requests[requestIdentifier]
- def resendRequest(self, request):
- """Resends a request
- @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
- will fail
- @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
-
- @note: for SSK and USK puts, the private key is taken from request['PrivateKey']. Adjust private (and public
- key) if necessary
-
- @todo: reset init time or not? Currently it is not reset.
- """
- requestType = request.get('RequestType', consts.RequestType.Null)
- if not requestType & (consts.RequestType.MaskGet | consts.RequestType.MaskPut):
- raise ValueError('Can not resend request: %s' % request.name)
-
- # we don't know what UserData may be, so back it up before copying
- oldIdentifier = request['Identifier']
- oldUserData, request['UserData'] = request['UserData'], None
- newRequest = copy.deepcopy(request)
-
- # reset key if necessary
- if requestType & consts.RequestType.MaskPut:
- requestKey = key.KeyBase.fcpToPython(request['URI'])
- if requestKey is None:
- raise ValueError('Ups, URI of the request seems not to be valid')
-
- if requestKey.KeyType == consts.KeyType.CHK:
- newRequest['URI'] = consts.KeyType.CHK
- elif requestKey.KeyType == consts.KeyType.SSK:
- newRequest['URI'] = request['PrivateKey']
- if requestKey.filename:
- newRequest['URI'] += '/' + requestKey.filename
- elif requestKey.KeyType == consts.KeyType.USK:
- newRequest['URI'] = request['PrivateKey']
- if requestKey.filename:
- newRequest['URI'] += '/' + requestKey.filename
-
-
- filenameCollision = newRequest.get('FilenameCollision', None)
- self._registerRequest(
- newRequest,
- requestType,
- filenameCollision= None if filenameCollision is None else filenameCollision & consts.FilenameCollision.MaskHandle,
- #initTime=time.time(),
- persistentUserData=newRequest['PersistentUserData'],
- userData=oldUserData,
- )
-
- if oldIdentifier in self._requests:
- request['UserData'] = oldUserData
- self.removeRequest(request['Identifier'])
-
- self.sendMessage(newRequest)
- return newRequest['Identifier']
-
########################################################
##
## Peer related methods
@@ -2402,7 +2136,7 @@
@return: (L{message.FCPPluginMessage})
@note: the client does not keep track of messages send to a plugin, because the plugin
- may or may not return. If the plugin sends a reply, a L{events.PluginMessage} is triggered.
+ may or may not return. If the plugin sends a reply, a L{events.Events.PluginMessage} is triggered.
If something goes wrong, L{events.Events.ProtocolError} or an is L{events.Events.IdentifierCollision}
is triggered. Use the identifier passed to identify responses.
@@ -2434,7 +2168,7 @@
@event: L{events.Events.KeypairGenerated} triggered as soon as the request is complete
"""
if keypairType not in (consts.KeyType.SSK, consts.KeyType.USK):
- raise ValueError('keypairType must be %s or %s' % (consts.KeyType.SSK, consts.KeyType.USK))
+ raise ValueError('keypairType must be SSK or USK')
requestType = consts.RequestType.GenerateSSKKeypair if keypairType == consts.KeyType.SSK else consts.RequestType.GenerateUSKKeypair
msg = message.GenerateSSK()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-30 08:55:46
|
Revision: 431
http://fclient.svn.sourceforge.net/fclient/?rev=431&view=rev
Author: jUrner
Date: 2008-06-30 01:55:28 -0700 (Mon, 30 Jun 2008)
Log Message:
-----------
epydoc did not like whitespace in doctests
Modified Paths:
--------------
trunk/sandbox/fcp2/fcp_lib/pmstruct.py
Modified: trunk/sandbox/fcp2/fcp_lib/pmstruct.py
===================================================================
--- trunk/sandbox/fcp2/fcp_lib/pmstruct.py 2008-06-30 08:54:21 UTC (rev 430)
+++ trunk/sandbox/fcp2/fcp_lib/pmstruct.py 2008-06-30 08:55:28 UTC (rev 431)
@@ -50,41 +50,41 @@
Field names must corrospond to mapping names
>>> p = S.toString({'IAmInvalid': 123456, 'Bar': 'abcdefg'})
Traceback (most recent call last):
- ...
+ ...
KeyError: 'Foo'
All field names must be present in the mapping passed
>>> p = S.toString({'Bar': 'abcdefg'})
Traceback (most recent call last):
- ...
+ ...
KeyError: 'Foo'
types of the mapping have to corrospond to field types
>>> p = S.toString({'Foo': 'invalid-int', 'Bar': 'abcdefg'})
Traceback (most recent call last):
- ...
+ ...
ValueError: Invalid type for field "Foo, expected: <type 'int'>"
invalid field types are detected on converting the string back to a mapping
>>> p = 'invalid-int\\x01YWJjZGVmZw=='
>>> S.fromString(p)
Traceback (most recent call last):
- ...
+ ...
ValueError: Invalid field #0: (invalid literal for int() with base 10: 'invalid-int')
too few fields in the input strig will be recognized
>>> p = 'YWJjZGVmZw=='
>>> S.fromString(p)
Traceback (most recent call last):
- ...
+ ...
ValueError: Too few fields in input string
...aswell as too many
>>> p = '999\x01123456\x01YWJjZGVmZw=='
>>> S.fromString(p)
Traceback (most recent call last):
- ...
+ ...
ValueError: Too many fields in input string
"""
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-30 08:54:24
|
Revision: 430
http://fclient.svn.sourceforge.net/fclient/?rev=430&view=rev
Author: jUrner
Date: 2008-06-30 01:54:21 -0700 (Mon, 30 Jun 2008)
Log Message:
-----------
whitespace and typos
Modified Paths:
--------------
trunk/sandbox/fcp2/key.py
Modified: trunk/sandbox/fcp2/key.py
===================================================================
--- trunk/sandbox/fcp2/key.py 2008-06-29 16:21:17 UTC (rev 429)
+++ trunk/sandbox/fcp2/key.py 2008-06-30 08:54:21 UTC (rev 430)
@@ -16,7 +16,6 @@
from fcp2 import consts
-
del hack
#<-- rel import hack
#**************************************************************************************
@@ -90,6 +89,7 @@
#**************************************************************************************
#
#**************************************************************************************
+#TODO: too bad, can not move this to types.py ...cross import
class FcpTypeKey(object):
"""key type for type conversions
@@ -146,7 +146,6 @@
return key.toString()
-
def key(string):
"""creates a key object from a string
@return: L{KeyBase}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 16:21:12
|
Revision: 429
http://fclient.svn.sourceforge.net/fclient/?rev=429&view=rev
Author: jUrner
Date: 2008-06-29 09:21:17 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
added tests for putData and putRedirect
Modified Paths:
--------------
trunk/sandbox/fcp2/test_fcp/test_client.py
Modified: trunk/sandbox/fcp2/test_fcp/test_client.py
===================================================================
--- trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 16:21:01 UTC (rev 428)
+++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 16:21:17 UTC (rev 429)
@@ -1887,16 +1887,18 @@
#***********************************************************************************
#TODO:
#
-# SSK@, USK@
-# putFile / PutDir TestDDA
+# x. check if TargetFilename handling is ok for CHKs
+#
-class Test_clientPut(BaseTestClient):
-
- def testPutRedirect_Success(self):
- # request a arbitrary file
- myIdentifier = self.client.putRedirect(
- 'my-redirect-name',
- 'SSK@arbitrary-uri',
+class Test_putData(BaseTestClient):
+
+ def test_putData_Success(self):
+ self.connectClient()
+
+ myKey = self.client.key.KSK('foo')
+ myIdentifier = self.client.putData(
+ myKey,
+ 'any data here'
)
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
@@ -1907,7 +1909,7 @@
self.sendResponseMessage(
'PutSuccessful',
Identifier=myIdentifier,
- URI='KSK@my-redirect-name'
+ URI=myKey
)
self.assertHasNextEvent(
@@ -1921,15 +1923,18 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
- self.failIf(requestsAll)
-
+ self.failIf(requestsAll)
- def testPutRedirect_Failure(self):
- # request a arbitrary file
- myIdentifier = self.client.putRedirect(
- 'my-redirect-name',
- 'SSK@arbitrary-uri',
+
+ def test_putData_Failure(self):
+ self.connectClient()
+
+ myKey = self.client.key.KSK('foo')
+ myIdentifier = self.client.putData(
+ myKey,
+ 'any data here'
)
+
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
@@ -1954,12 +1959,23 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.failIf(requestsAll)
-
- def testCHKPutData_Success(self):
+
+#***********************************************************************************
+#
+#***********************************************************************************
+class Test_putRedirect(BaseTestClient):
+
+
+ def testPutRedirect_Success(self):
+ self.connectClient()
+
# request a arbitrary file
- myIdentifier = self.client.chkPutData(
- 'arbitrary data'
+ myRedirect = self.client.key.KSK('foo')
+ myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData)
+ myIdentifier = self.client.putRedirect(
+ myRedirect,
+ myKey,
)
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
@@ -1970,7 +1986,7 @@
self.sendResponseMessage(
'PutSuccessful',
Identifier=myIdentifier,
- URI='CHK@my-redirect-name'
+ URI=myRedirect
)
self.assertHasNextEvent(
@@ -1987,10 +2003,15 @@
self.failIf(requestsAll)
- def testCHKPutData_Failure(self):
+ def testPutRedirect_Failure(self):
+ self.connectClient()
+
# request a arbitrary file
- myIdentifier = self.client.chkPutData(
- 'arbitrary data'
+ myRedirect = self.client.key.KSK('foo')
+ myKey = self.client.key.key('CHK@' + self.client.key.DummyKeyData)
+ myIdentifier = self.client.putRedirect(
+ myRedirect,
+ myKey,
)
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
@@ -2016,9 +2037,13 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.failIf(requestsAll)
-
- def testCHKPutDir_Success(self):
+
+
+
+class Test_clientPut(BaseTestClient):
+
+ def XXXtestCHKPutDir_Success(self):
# request a arbitrary file
myIdentifier = self.client.chkPutDir(
'myDirectory'
@@ -2049,7 +2074,7 @@
self.failIf(requestsAll)
- def testCHKPutDir_Failure(self):
+ def XXXtestCHKPutDir_Failure(self):
# request a arbitrary file
myIdentifier = self.client.chkPutDir(
'myDirectory'
@@ -2080,7 +2105,7 @@
self.failIf(requestsAll)
- def testCHKPutFile_Success(self):
+ def XXXtestCHKPutFile_Success(self):
# request a arbitrary file
myIdentifier = self.client.chkPutFile(
'myFile.txt'
@@ -2111,7 +2136,7 @@
self.failIf(requestsAll)
- def testCHKPutFile_Failure(self):
+ def XXXtestCHKPutFile_Failure(self):
# request a arbitrary file
myIdentifier = self.client.chkPutFile(
'myFile.txt'
@@ -2143,7 +2168,7 @@
- def testCHKPutMultiple_Success(self):
+ def XXXtestCHKPutMultiple_Success(self):
items = [
{
@@ -2221,7 +2246,7 @@
self.failIf(requestsAll)
- def testCHKPutMultiple_ItemErrors(self):
+ def XXXtestCHKPutMultiple_ItemErrors(self):
# upload directory is not allowed
@@ -3245,23 +3270,32 @@
Test_iterConnect,
Test_CloseConnectionDuplicateClientName,
Test_closeNode,
+ Test_disconnectReason,
+
Test_get_setConnectionName,
Test_get_setDebugVerbosity,
Test_startNode,
Test_versionCheckNodeHello,
+
Test_handleMessage,
Test_next,
Test_run,
Test_sendMessage,
Test_getConfig,
Test_modifyConfig,
+
Test_getData,
Test_getFile,
Test_getKeyInfo,
- Test_disconnectReason,
+ Test_putData,
+ Test_putRedirect,
+
+ #Test_putData,
+ #Test_clientPut,
+
#Test_clientGet,
- #Test_clientPut,
+
Test_requests,
#Test_restoreRequests,
#Test_resendRequests,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 16:20:54
|
Revision: 428
http://fclient.svn.sourceforge.net/fclient/?rev=428&view=rev
Author: jUrner
Date: 2008-06-29 09:21:01 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
reworked putData and putRedirect
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-06-29 15:19:30 UTC (rev 427)
+++ trunk/sandbox/fcp2/client.py 2008-06-29 16:21:01 UTC (rev 428)
@@ -1526,9 +1526,9 @@
def clientPut(self,
requestType,
key,
+ userData,
+ persistentUserData,
data=None,
- persistentUserData='',
- userData=None,
items=None,
**msgParams
):
@@ -1540,7 +1540,7 @@
@param userData: (any) any data to be associated to the request at runtime
@param items: for L{consts.RequestType.PutMultiple}, items to upload
@param msgParams: (dict) Fcp parameters to pass along with the message
-
+
@note: the Fcp message parameter 'Metadata.ContentType' may be passed as 'ContentType'
to this method
@note: to upload multiple items at once pass a dict for each item containig the following members:
@@ -1555,31 +1555,38 @@
All items will be accessible under one single key as 'Uri/Name'. The default item (the item when
only 'Uri' is requested from freenet) is always the first item in the list.
"""
- if requestType in (consts.RequestType.PutData, consts.RequestType.PutFile):
- msgName = message.ClientPut.name
- elif requestType == consts.RequestType.PutDir:
- msgName = message.ClientPutDiskDir.name
- elif requestType == consts.RequestType.PutMultiple:
- msgName = message.ClientPutComplexDir.name
- else:
- raise ValueError('Unsupported request type')
- msg = message.MessagesAll[msgName](URI=key)
+ #FIX: enables passing params as python keywords
contentType = msgParams.get('ContentType', None)
if contentType is not None:
del msgParams['ContentType']
msgParams['Metadata.ContentType'] = contentType
+
+ # find out wich message to use
+ if requestType & (consts.RequestType.PutData | consts.RequestType.PutFile | consts.RequestType.PutRedirect):
+ msgClass = message.ClientPut
+ elif requestType == consts.RequestType.PutDir:
+ msgClass = message.ClientPutDiskDir
+ elif requestType == consts.RequestType.PutMultiple:
+ msgClass = message.ClientPutComplexDir
+ else:
+ raise ValueError('Unsupported request type')
+ msg = msgClass(URI=key)
+
+ # add params
+ if key.KeyType == consts.KeyType.CHK:
+ if key.filename is not None:
+ msg['TargetFilename'] = key.filename
for param, value in msgParams.items():
if value is not None:
msg[param] = value
if data is not None:
if requestType != consts.RequestType.PutData:
- raise ValueError('Data can only be passed along with PutData uploads')
+ raise ValueError('Data can only be passed along with putData uploads')
msg.data = data
if items is not None:
-
if requestType != consts.RequestType.PutMultiple:
raise ValueError('Items can only be passed along with PutMultiple uploads')
@@ -1647,7 +1654,7 @@
if data:
msg.data = data
- #
+ # finally
self._registerRequest(
msg,
requestType,
@@ -1657,7 +1664,7 @@
self.sendMessage(msg)
return msg['Identifier']
-
+ #TESTED
def putData(self,
key,
data,
@@ -1667,20 +1674,43 @@
maxRetries=None,
persistence=consts.Persistence.Connection,
priorityClass=consts.Priority.Medium,
- targetFilename=None,
-
+
userData=None,
persistentUserData='',
):
+ """Uploads data
+ @param key: (L{key.KeyBase}) key under wich to upload the data
+ @param data: (bytes) data to upload
+
+ @param contentType: (str) content type. If not specified, the node will guess the content type
+ @param dontCompress: (bool) if True, the node won't try to compress the data
+ @param maxRetries: (int) maximum number of retries or -1 to retry forver or None to leave it to the node to decide
+ @param priorityClass: (L{consts.Priority}) priority of the request
+
+ @param userData: any non persistent data to associate to the request
+ @param persistentUserData: any string to associate to the request as persistent data
+
+ @event: (L{events.Events.RequestCompleted}) triggered when the request is complete
+ @event: (L{events.Events.RequestFailed}) triggered when the request failes
+ @event: (L{events.Events.RequestFetchable}) triggered as soon as the request is fetchable
+ @event: (L{events.Events.RequestCompressionStarted}) triggered when the request is about to be compressed
+ @event: (L{events.Events.RequestCompressionComopleted}) triggered as soon as compressing of the request is completed
+
+ @note: if the upload is successful the node will create a L{consts.KeyType.CHK} key under wich
+ the data can be retreieved. The key can be accessed as 'URI' member of the request as soon
+ as the L{events.Events.RequestFetchable} or the L{events.Events.RequestCompleted} event
+ is triggered.
+
+ @todo: EarlyEncode and GetCHKOnly message params not implemented
+ """
return self.clientPut(
consts.RequestType.PutData,
key,
-
+ userData,
+ persistentUserData,
data=data,
- persistentUserData=persistentUserData,
- userData=userData,
-
+
# fcp params
ContentType=contentType,
DataLength=len(data),
@@ -1692,16 +1722,14 @@
DontCompress=dontCompress,
Persistence=persistence,
PriorityClass=priorityClass,
- TargetFilename=targetFilename,
UploadFrom=consts.UploadFrom.Direct,
Verbosity=consts.Verbosity.ReportProgress | consts.Verbosity.ReportCompression,
)
-
-
+ #TESTED
def putRedirect(self,
- name,
- targetURI,
+ key,
+ targetKey,
maxRetries=None,
persistence=consts.Persistence.Connection,
priorityClass=consts.Priority.Medium,
@@ -1709,8 +1737,8 @@
persistentUserData='',
):
"""Uploads a redirect to another key
- @param name: name of the redirect
- @param targetURI: (str) uri to redirect to
+ @param key: (L{key.KSK}) to insert as redirect
+ @param targetKey: (key.KeyBase) key to redirect to
@param maxRetries: (int) maximum number of tretries or -1 to leave the decission up to the node
@param persistence: (L{consts.Persistence}) of the request
@param priorityClass: (L{consts.Priority}) priority of the request
@@ -1718,22 +1746,23 @@
@param userData: (any) any data to be associated to the request at runtime
@return: (str) request identifier
"""
- msg = message.ClientPut(
- URI=consts.KeyType.KSK + name,
- Persistence=persistence,
- PriorityClass=priorityClass,
- TargetURI=targetURI,
- UploadFrom=consts.UploadFrom.Redirect,
- )
- self._registerRequest(
- msg,
- consts.RequestType.PutRedirect,
- persistentUserData=persistentUserData,
- userData=userData,
- )
- self.sendMessage(msg)
- return msg['Identifier']
+ return self.clientPut(
+ consts.RequestType.PutRedirect,
+ key,
+ userData,
+ persistentUserData,
+ Persistence=persistence,
+ PriorityClass=priorityClass,
+ TargetURI=targetKey,
+ UploadFrom=consts.UploadFrom.Redirect,
+ )
+ #########################################################
+ #########################################################
+ #########################################################
+ #########################################################
+ #########################################################
+
#CHK
def chkPutData(self,
data,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 15:19:21
|
Revision: 427
http://fclient.svn.sourceforge.net/fclient/?rev=427&view=rev
Author: jUrner
Date: 2008-06-29 08:19:30 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
logging
Modified Paths:
--------------
trunk/sandbox/fcp2/iohandler.py
Modified: trunk/sandbox/fcp2/iohandler.py
===================================================================
--- trunk/sandbox/fcp2/iohandler.py 2008-06-29 15:19:20 UTC (rev 426)
+++ trunk/sandbox/fcp2/iohandler.py 2008-06-29 15:19:30 UTC (rev 427)
@@ -125,7 +125,7 @@
if p == '':
raise socket.error('Socket closed by host')
except socket.timeout, details:
- raise consts.IOTimeoutError(details, consts.Logger.IO.debug)
+ raise consts.IOTimeoutError(details, consts.Logger.IO.log, consts.DebugVerbosity.Chatty)
except socket.error, details:
self.close()
raise consts.IOBrokenError(details, consts.Logger.IO.error)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 15:19:11
|
Revision: 426
http://fclient.svn.sourceforge.net/fclient/?rev=426&view=rev
Author: jUrner
Date: 2008-06-29 08:19:20 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
logging
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-06-29 15:19:09 UTC (rev 425)
+++ trunk/sandbox/fcp2/client.py 2008-06-29 15:19:20 UTC (rev 426)
@@ -288,7 +288,9 @@
##
###############################################################
def _captureEvent(self, event, request):
- if event != self.events.Idle:
+ if event == self.events.Idle:
+ consts.Logger.Event.log(consts.DebugVerbosity.Chatty, consts.LogMessages.EventTriggered + event.name)
+ else:
consts.Logger.Event.info(consts.LogMessages.EventTriggered + event.name)
@@ -1562,7 +1564,6 @@
else:
raise ValueError('Unsupported request type')
- #TODO: autoconvert keys to python classes???
msg = message.MessagesAll[msgName](URI=key)
contentType = msgParams.get('ContentType', None)
if contentType is not None:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 15:19:01
|
Revision: 425
http://fclient.svn.sourceforge.net/fclient/?rev=425&view=rev
Author: jUrner
Date: 2008-06-29 08:19:09 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
more fine grained logging support
Modified Paths:
--------------
trunk/sandbox/fcp2/consts.py
Modified: trunk/sandbox/fcp2/consts.py
===================================================================
--- trunk/sandbox/fcp2/consts.py 2008-06-29 15:18:28 UTC (rev 424)
+++ trunk/sandbox/fcp2/consts.py 2008-06-29 15:19:09 UTC (rev 425)
@@ -7,44 +7,29 @@
#*****************************************************************************
# exceptions
#*****************************************************************************
-class MessageParseError(Exception):
- """Exception raised when a message could not be parsed succesfuly"""
- def __init__(self, message, logMethod=None):
+class FcpError(Exception):
+ def __init__(self, message, logMethod=None, logLevel=None):
if logMethod is not None:
- logMethod(self.__class__.__name__ + ': %s' % message)
+ if logLevel is None:
+ logMethod(self.__class__.__name__ + ': %s' % message)
+ else:
+ logMethod(logLevel, self.__class__.__name__ + ': %s' % message)
Exception.__init__(self, message)
-
-class IOConnectFailedError(Exception):
+class MessageParseError(FcpError):
+ """Exception raised when a message could not be parsed succesfuly"""
+
+class IOConnectFailedError(FcpError):
"""Exception raised if the object can not be connected"""
- def __init__(self, message, logMethod=None):
- if logMethod is not None:
- logMethod(self.__class__.__name__ + ': %s' % message)
- Exception.__init__(self, message)
-
-class IOClosedError(Exception):
+class IOClosedError(FcpError):
"""Exception raised if the object is closed"""
- def __init__(self, message, logMethod=None):
- if logMethod is not None:
- logMethod(self.__class__.__name__ + ': %s' % message)
- Exception.__init__(self, message)
-
-class IOBrokenError(Exception):
+class IOBrokenError(FcpError):
"""Exception raised if the IO connection is broken"""
- def __init__(self, message, logMethod=None):
- if logMethod is not None:
- logMethod(self.__class__.__name__ + ': %s' % message)
- Exception.__init__(self, message)
-
class IOTimeoutError(Exception):
"""Exception raised when the io connection is closed"""
- def __init__(self, message, logMethod=None):
- if logMethod is not None:
- logMethod(self.__class__.__name__ + ': %s' % message)
- Exception.__init__(self, message)
#************************************************************************
#
@@ -155,6 +140,7 @@
class DebugVerbosity:
"""Consts indicating the verbosity level for debugging"""
+ Chatty = logging.DEBUG - 1
Debug = logging.DEBUG
Info = logging.INFO
Warning = logging.WARNING
@@ -291,11 +277,12 @@
IOHandler =logging.getLogger('Fcp.Client.IOHandler')
IO =logging.getLogger('Fcp.Client.IOHandler.IO')
Message = logging.getLogger('Fcp.Client.Message')
-
+logging.addLevelName(DebugVerbosity.Chatty, 'chatty')
+logging.addLevelName(DebugVerbosity.Quiet, 'quiet')
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
-logging.addLevelName(DebugVerbosity.Quiet, '')
+
class LogMessages:
"""Strings used for log infos"""
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 15:18:21
|
Revision: 424
http://fclient.svn.sourceforge.net/fclient/?rev=424&view=rev
Author: jUrner
Date: 2008-06-29 08:18:28 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
stringify msg params for readability
Modified Paths:
--------------
trunk/sandbox/fcp2/message.py
Modified: trunk/sandbox/fcp2/message.py
===================================================================
--- trunk/sandbox/fcp2/message.py 2008-06-29 12:39:15 UTC (rev 423)
+++ trunk/sandbox/fcp2/message.py 2008-06-29 15:18:28 UTC (rev 424)
@@ -123,6 +123,12 @@
for param, value in self.params.items():
if isinstance(param, PrivateParam):
continue
+
+ # convert python to fcp value if necessary
+ paramType = self._param_types_.get(param, None)
+ if paramType is not None:
+ value = paramType.pythonToFcp(value)
+
out.append('>> %s=%s' % (param, value))
if self.data is None:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 12:39:07
|
Revision: 423
http://fclient.svn.sourceforge.net/fclient/?rev=423&view=rev
Author: jUrner
Date: 2008-06-29 05:39:15 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
got most of the tests to work again
Modified Paths:
--------------
trunk/sandbox/fcp2/test_fcp/test_client.py
Modified: trunk/sandbox/fcp2/test_fcp/test_client.py
===================================================================
--- trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 12:38:23 UTC (rev 422)
+++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 12:39:15 UTC (rev 423)
@@ -360,8 +360,7 @@
#***********************************************************************************
class Test_connect(BaseTestClient):
pass
-
-
+
#***********************************************************************************
#
#***********************************************************************************
@@ -1346,104 +1345,38 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.failUnless(self.ioOpen())
-
-
-#***********************************************************************************
-#
-#***********************************************************************************
-class Test_subscribeUSK(BaseTestClient):
- def test_100_subscribeUSK_accepts_key_object(self):
- self.connectClient()
- key = self.client.key.USK(client.key.DummyKeyData, 'foo', 0)
- myIdentifier = self.client.subscribeUSK(key)
- self.assertHasNextMessage(
- 'SubscribeUSK',
- ('URI', key),
- )
-
-
- def XXXtest_200_subscribeUSK(self):
- self.connectClient()
- myIdentifier = self.client.subscribeUSK('arbitrary-key')
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
- self.failUnless(myIdentifier in requestsAll)
- myRequest = self.client.getRequest(myIdentifier)
- self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.SubscribeUSK)
-
- self.assertHasNextMessage(
- 'SubscribeUSK',
- ('URI', 'arbitrary-key'),
- )
- self.failUnless(myIdentifier in requestsAll)
-
- # usk update requests are permanent, so the completed flag shuld always be set
- myRequest['RequestStatus'] == self.client.consts.RequestStatus.Completed
-
- self.sendResponseMessage(
- 'SubscribedUSKUpdate',
- Edition=99,
- Identifier=myIdentifier,
- URI='arbitrary-uri'
- )
-
- self.assertHasNextEvent(
- self.client.events.USKUpdated,
- 'SubscribeUSK',
- ('Edition', 99),
- ('Identifier', myIdentifier),
- ('URI', 'arbitrary-key'),
- )
-
-
-
-
-###################################################
-###################################################
-###################################################
-
-
#***********************************************************************************
#
#***********************************************************************************
-class TestDisconnectReason(BaseTestClient):
+class Test_disconnectReason(BaseTestClient):
def test_1000_DuplicateClientName(self):
-
+ self.connectClient()
self.sendResponseMessage('CloseConnectionDuplicateClientName')
msg = self.assertHasNextEvent(
self.client.events.ClientDisconnected,
consts.Message.ClientDisconnected,
('DisconnectReason', consts.DisconnectReason.DuplicateClientName),
)
- self.failUnless('Param' in msg.params)
- self.assertEqual(msg['Param'], None)
-
+
self.failIf(self.ioOpen())
self.assertHasNextEvent(None)
- #print self.client.test_messagesSend[0].name
self.assertHasNextMessage(None)
-
- self.connectClient()
+
-
def test_1001_SocketDied_Receive(self):
-
+ self.connectClient()
self.getIO().setBroken(True)
- self.assertRaises(iohandler.IOBroken, self.client.next)
+ self.assertRaises(consts.IOBrokenError, self.client.next)
# check if ClientDisconnected events has been triggered
msg = self.assertHasNextEvent(
self.client.events.ClientDisconnected,
consts.Message.ClientDisconnected,
- ('DisconnectReason', consts.DisconnectReason.SocketDied),
- #('Param', ClientSocketDiedMessage) # can not test here
+ ('DisconnectReason', consts.DisconnectReason.ConnectionDied),
)
- self.failUnless('Param' in msg.params)
- # Param is now details of IOBroken exception, no idea how to test
- #self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied)
-
+
self.failIf(self.ioOpen())
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
@@ -1451,23 +1384,19 @@
def test_1002_SocketDied_Send(self):
-
+ self.connectClient()
self.getIO().setBroken(True)
# send a test message
- self.assertRaises(iohandler.IOBroken, self.client.sendMessage, message.newMessageType('test')())
+ self.assertRaises(consts.IOBrokenError, self.client.sendMessage, message.newMessageType('test')())
# check if ClientDisconnected events has been triggered
msg = self.assertHasNextEvent(
self.client.events.ClientDisconnected,
consts.Message.ClientDisconnected,
- ('DisconnectReason', consts.DisconnectReason.SocketDied),
- #('Param', ClientSocketDiedMessage) # can not test here
+ ('DisconnectReason', consts.DisconnectReason.ConnectionDied),
)
- self.failUnless('Param' in msg.params)
- # Param is now details of IOBroken exception, no idea how to test
- #self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied)
-
+
self.failIf(self.ioOpen())
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
@@ -1475,9 +1404,9 @@
def test_1003_Shutdown(self):
+ self.connectClient()
+ self.client.closeNode()
- self.client.closeFreenet()
-
msg = self.assertHasNextMessage(consts.Message.Shutdown)
self.sendResponseMessage(
'ProtocolError',
@@ -1488,13 +1417,9 @@
msg = self.assertHasNextEvent(
self.client.events.ClientDisconnected,
consts.Message.ClientDisconnected,
- ('DisconnectReason', consts.DisconnectReason.Shutdown)
- #('Param', NodeHelloMessage) # can not test here
+ ('DisconnectReason', consts.DisconnectReason.NodeClosing)
)
- self.failUnless('Param' in msg.params)
- self.assertEqual(msg['Param'], None)
-
self.failIf(self.ioOpen())
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
@@ -1503,9 +1428,8 @@
def test_1004_VersionMismatch(self):
-
for n, nodeHello in enumerate(self.client.iterConnect(duration=1, timeout=0.1)):
- if n == 1:
+ if n == 2:
self.assertHasNextMessage(
consts.Message.ClientHello
)
@@ -1530,11 +1454,8 @@
self.client.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.failIf(self.ioOpen())
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
@@ -1543,7 +1464,7 @@
#***********************************************************************************
#
#***********************************************************************************
-class TestClientGet(BaseTestClient):
+class Test_clientGet(BaseTestClient):
def test_2000_ClientGetRegistered(self):
@@ -1969,7 +1890,7 @@
# SSK@, USK@
# putFile / PutDir TestDDA
-class TestClientPut(BaseTestClient):
+class Test_clientPut(BaseTestClient):
def testPutRedirect_Success(self):
# request a arbitrary file
@@ -2351,13 +2272,16 @@
#***********************************************************************************
#
#***********************************************************************************
-class TestRequests(BaseTestClient):
+class Test_requests(BaseTestClient):
def test_3000_ModifyRequest_Persistent(self):
-
+ self.connectClient()
+
+
# request a arbitrary file
+ myKey = self.client.key.key('KSK@foo')
myIdentifier = self.client.getFile(
- 'arbitrary-uri',
+ myKey,
'arbitryry.txt',
persistentUserData='foo',
priorityClass=consts.Priority.Medium,
@@ -2401,10 +2325,12 @@
def test_3001_ModifyRequest_NonPersistent(self):
-
+ self.connectClient()
+
# request a arbitrary file
+ myKey = self.client.key.key('KSK@foo')
myIdentifier = self.client.getFile(
- 'arbitrary-uri',
+ myKey,
'arbitryry.txt',
persistentUserData='foo',
priorityClass=consts.Priority.Medium,
@@ -2448,11 +2374,13 @@
self.failIf(requestsAll)
- def test_3002_RemoveRequest_NonPersistent(self):
-
+ def test_3002_RemoveRequest(self):
+ self.connectClient()
+
# request a file
+ myKey = self.client.key.key('KSK@foo')
myIdentifier = self.client.getFile(
- 'arbitrary-uri',
+ myKey,
'arbitrary.txt'
)
myRequest = self.client.getRequest(myIdentifier)
@@ -2472,125 +2400,42 @@
# now cancel request
self.client.removeRequest(myIdentifier)
+ self.assertHasNextMessage('RemoveRequest')
- # of our request should be removed emidiately,
+ # of our request should be marked as removed
self.assertEqual(myRequest['RequestStatus'], consts.RequestStatus.Removed |
- consts.RequestStatus.RemovedFromQueue |
consts.RequestStatus.Completed
)
- self.failIf(myIdentifier in self.client.getRequests())
-
- # now the request should have been removed
- self.assertHasNextEvent(
- self.client.events.RequestRemoved,
- consts.Message.ClientGet,
- ('RequestStatus', consts.RequestStatus.Removed |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
- )
- self.failIf(self.client.getRequests())
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.failIf(requestsAll)
-
-
- def test_3003_RemoveRequest_persistent(self):
-
- # request a file
- myIdentifier = self.client.getFile(
- 'arbitrary-uri',
- 'arbitrary.txt',
- persistence=consts.Persistence.Reboot,
- )
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
-
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- # respond to the file request
+ # respond with a Getfailed
self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
+ 'GetFailed',
+ Code='25', # fetch error canceled
+ Identifier=myIdentifier,
)
-
- # ignore events and messages so far
- self.events = []
- self.messages = []
-
- # now cancel request
- self.client.removeRequest(myIdentifier)
- # status of our request should be set to removed emidiately, but it should
- # not be removed from the client
- self.assertEqual(myRequest['RequestStatus'], consts.RequestStatus.Removed | consts.RequestStatus.Completed)
- self.failUnless(myIdentifier in self.client.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['RequestStatus'] & consts.RequestStatus.RemovedFromQueue)
- self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.Completed)
self.assertHasNextEvent(
self.client.events.RequestRemoved,
consts.Message.ClientGet,
('RequestStatus', consts.RequestStatus.Removed |
- consts.RequestStatus.RemovedFromQueue |
- consts.RequestStatus.Completed
- ),
+ consts.RequestStatus.RemovedFromQueue |
+ consts.RequestStatus.Completed
+ ),
)
-
- self.failIf(self.client.getRequests())
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
-
- def test_3004_ResendRequest_NonPersistent(self):
-
- myIdentifier = self.client.getData('any-key')
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
- self.assertHasNextMessage(consts.Message.ClientGet)
-
- newIdentifier = self.client.resendRequest(myRequest)
-
- # client should remove old request emidiately
- self.failIf(myIdentifier == newIdentifier)
self.failIf(myIdentifier in requestsAll)
- self.failUnless(newIdentifier in requestsAll)
- self.assertHasNextEvent(
- self.client.events.RequestRemoved,
- consts.Message.ClientGet,
- ('RequestStatus', 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):
+ self.connectClient()
- myIdentifier = self.client.getData('any-key', persistence=consts.Persistence.Reboot)
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getData(myKey, persistence=consts.Persistence.Reboot)
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
self.assertHasNextMessage(consts.Message.ClientGet)
@@ -2601,7 +2446,7 @@
# client should remove request from nodes queue
self.assertHasNextMessage(
- consts.Message.RemovePersistentRequest,
+ consts.Message.RemoveRequest,
('Identifier', myIdentifier)
)
self.assertHasNextMessage(
@@ -2609,9 +2454,13 @@
('Identifier', newIdentifier)
)
self.sendResponseMessage(
- 'PersistentRequestRemoved',
+ 'GetFailed',
+ Code='25',
Identifier=myIdentifier,
)
+
+
+
self.assertHasNextEvent(
self.client.events.RequestRemoved,
consts.Message.ClientGet,
@@ -2632,7 +2481,7 @@
#
#***********************************************************************************
#TODO: testRestoreClientPut and friends
-class TestRestoreRequests(BaseTestClient):
+class Test_restoreRequests(BaseTestClient):
def test_4000_RestorePersistentGet_InvalidClientToken(self):
@@ -2718,13 +2567,15 @@
#TODO: testDDAWriteDenied
#TODO: testDDAWriteDenied_WriteDisallowed
-class TestDDA(BaseTestClient):
+class Test_DDA(BaseTestClient):
def test_5000_DDAWriteDenied(self):
-
+ self.connectClient()
+
# request a file
+ myKey = self.client.key.key('KSK@foo')
myIdentifier = self.client.getFile(
- 'arbitrary-uri',
+ myKey,
os.path.join(DIR, 'DDATest.txt')
)
myRequest = self.client.getRequest(myIdentifier)
@@ -2821,10 +2672,12 @@
class TestCollisions(BaseTestClient):
def test_6000_IdentifierCollision(self):
-
+ self.connectClient()
+
# request a file
+ myKey = self.client.key.key('KSK@foo')
myIdentifier = self.client.getFile(
- 'arbitrary-uri',
+ myKey,
os.path.join(DIR, 'test.txt')
)
myRequest = self.client.getRequest(myIdentifier)
@@ -2863,14 +2716,16 @@
def test_6001_FilenameCollision_HandleRename(self):
-
+ self.connectClient()
+
# request a file
fpath = os.path.join(DIR, 'test.txt')
open(fpath, 'wb').close()
self.tmpfiles.append(fpath)
+ myKey = self.client.key.key('KSK@foo')
myIdentifier = self.client.getFile(
- 'arbitrary-uri',
+ myKey,
fpath,
filenameCollision=consts.FilenameCollision.HandleRename,
)
@@ -2917,14 +2772,16 @@
def test_6002_FilenameCollision_HandleNever(self):
-
+ self.connectClient()
+
# request a file
fpath = os.path.join(DIR, 'test.txt')
open(fpath, 'wb').close()
self.tmpfiles.append(fpath)
+ myKey = self.client.key.key('KSK@foo')
myIdentifier = self.client.getFile(
- 'arbitrary-uri',
+ myKey,
fpath,
filenameCollision=consts.FilenameCollision.HandleNever,
)
@@ -2967,7 +2824,7 @@
#
#***********************************************************************************
#TODO: some tests not yet implemented
-class TestResendRequests(BaseTestClient):
+class Test_resendRequests(BaseTestClient):
def test_resend_CHK(self):
myKey = 'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo'
@@ -3073,11 +2930,11 @@
#***********************************************************************************
#
#***********************************************************************************
-class TestPlugins(BaseTestClient):
+class Test_plugins(BaseTestClient):
def testGet_8000_PluginInfo_Success(self):
-
+ self.connectClient()
myIdentifier = self.client.getPluginInfo('hi there')
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
@@ -3117,6 +2974,7 @@
def test_8001_GetPluginInfo_Failure(self):
+ self.connectClient()
myIdentifier = self.client.getPluginInfo('hi there')
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
@@ -3155,7 +3013,7 @@
def test_8002_SendPluginMessage_Success(self):
-
+ self.connectClient()
myIdentifier = '123456789'
myRequest = self.client.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"})
requestsAll = self.client.getRequests()
@@ -3190,6 +3048,7 @@
def test_8003_GetSendPluginMessage_Failure(self):
+ self.connectClient()
myIdentifier = '1234567889'
myRequest = self.client.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"})
requestsAll = self.client.getRequests()
@@ -3222,6 +3081,7 @@
def test_8003_GetSendPluginMessage_Identifiercollision(self):
+ self.connectClient()
myIdentifier = '1234567889'
myRequest = self.client.sendPluginMessage('hi there', myIdentifier, {'foo': "bar"})
requestsAll = self.client.getRequests()
@@ -3258,27 +3118,31 @@
#***********************************************************************************
#
#***********************************************************************************
-class TestGenerateKeypair(BaseTestClient):
+class Test_generateKeypair(BaseTestClient):
def test_10000_GeberateSSKKeypair(self):
+ self.connectClient()
+
myIdentifier = self.client.generateKeypair(consts.KeyType.SSK)
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
self.assertHasNextMessage(consts.Message.GenerateSSK)
+ priv = self.client.key.key('SSK@' + self.client.key.DummyKeyData + '/priv')
+ pub = self.client.key.key('SSK@' + self.client.key.DummyKeyData + '/pub')
self.sendResponseMessage(
'SSKKeypair',
Identifier=myIdentifier,
- RequestURI='SSK@public',
- InsertURI='SSK@private',
+ RequestURI=pub,
+ InsertURI=priv,
)
msg = self.assertHasNextEvent(
self.client.events.KeypairGenerated,
consts.Message.GenerateSSK,
('Identifier', myIdentifier),
- ('PublicKey','SSK@public'),
- ('PrivateKey','SSK@private'),
+ ('PublicKey',pub),
+ ('PrivateKey',priv),
('RequestStatus', consts.RequestStatus.Success |
consts.RequestStatus.RemovedFromQueue |
consts.RequestStatus.Completed
@@ -3293,24 +3157,30 @@
def test_10001_GeberateUSKKeypair(self):
+ self.connectClient()
+
myIdentifier = self.client.generateKeypair(consts.KeyType.USK)
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
self.assertHasNextMessage(consts.Message.GenerateSSK)
+ priv = self.client.key.key('SSK@' + self.client.key.DummyKeyData + '/priv')
+ pub = self.client.key.key('SSK@' + self.client.key.DummyKeyData + '/pub')
self.sendResponseMessage(
'SSKKeypair',
Identifier=myIdentifier,
- RequestURI='SSK@public',
- InsertURI='SSK@private',
+ RequestURI=pub,
+ InsertURI=priv,
)
+ priv = self.client.key.USK(priv.keyData, filename=priv.filename)
+ pub = self.client.key.USK(pub.keyData, filename=pub.filename)
msg = self.assertHasNextEvent(
self.client.events.KeypairGenerated,
consts.Message.GenerateSSK,
('Identifier', myIdentifier),
- ('PublicKey','USK@public'),
- ('PrivateKey','USK@private'),
+ ('PublicKey',pub),
+ ('PrivateKey',priv),
('RequestStatus', consts.RequestStatus.Success |
consts.RequestStatus.RemovedFromQueue |
consts.RequestStatus.Completed
@@ -3323,44 +3193,46 @@
self.assertHasNextMessage(None)
self.failIf(requestsAll)
-
#***********************************************************************************
#
#***********************************************************************************
-class TestSubscribeUSK(BaseTestClient):
-
-
- def test_11000_Subscribe(self):
- myIdentifier = self.client.subscribeUSK('arbitrary')
+class Test_subscribeUSK(BaseTestClient):
+
+ def test_100_subscribeUSK(self):
+ self.connectClient()
+
+ myKey = self.client.key.USK(client.key.DummyKeyData, 'foo', 0)
+ myIdentifier = self.client.subscribeUSK(myKey)
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
-
self.failUnless(myIdentifier in requestsAll)
- self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.Completed)
+ myRequest = self.client.getRequest(myIdentifier)
+ self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.SubscribeUSK)
+
+ self.assertHasNextMessage(
+ 'SubscribeUSK',
+ ('URI', myKey),
+ )
+ self.failUnless(myIdentifier in requestsAll)
- self.assertHasNextMessage(consts.Message.SubscribeUSK)
+ # usk update requests are permanent, so the completed flag shuld always be set
+ myRequest['RequestStatus'] == self.client.consts.RequestStatus.Completed
+
self.sendResponseMessage(
'SubscribedUSKUpdate',
- Identifier=myIdentifier,
Edition=99,
- URI='arbitryry/99/',
+ Identifier=myIdentifier,
+ URI=myKey
)
-
- msg = self.assertHasNextEvent(
+
+ self.assertHasNextEvent(
self.client.events.USKUpdated,
- consts.Message.SubscribedUSKUpdate,
- ('Identifier', myIdentifier),
+ 'SubscribeUSK',
('Edition', 99),
- ('URI', 'arbitryry/99/'),
+ ('Identifier', myIdentifier),
+ ('URI', myKey),
)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
-
+
#*********************************************************************************
#
#*********************************************************************************
@@ -3386,19 +3258,18 @@
Test_getData,
Test_getFile,
Test_getKeyInfo,
- Test_subscribeUSK,
+ Test_disconnectReason,
- #TestDisconnectReason,
- #TestClientGet,
- #TestClientPut,
- #TestRequests,
- #TestRestoreRequests,
- #TestResendRequests,
- #TestDDA,
- #TestCollisions,
- #TestPlugins,
- #TestGenerateKeypair,
- #TestSubscribeUSK,
+ #Test_clientGet,
+ #Test_clientPut,
+ Test_requests,
+ #Test_restoreRequests,
+ #Test_resendRequests,
+ Test_DDA,
+ TestCollisions,
+ Test_plugins,
+ Test_generateKeypair,
+ Test_subscribeUSK,
)
suite = unittest.TestSuite()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 12:38:16
|
Revision: 422
http://fclient.svn.sourceforge.net/fclient/?rev=422&view=rev
Author: jUrner
Date: 2008-06-29 05:38:23 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
SubscribedUSKUpdate was broken. fixed
Modified Paths:
--------------
trunk/sandbox/fcp2/message.py
Modified: trunk/sandbox/fcp2/message.py
===================================================================
--- trunk/sandbox/fcp2/message.py 2008-06-29 12:37:43 UTC (rev 421)
+++ trunk/sandbox/fcp2/message.py 2008-06-29 12:38:23 UTC (rev 422)
@@ -1306,7 +1306,7 @@
_additional_params_ = {}
_param_types_ = {
'Edition': types.FcpTypeInt,
- 'URI': key.KeyBase,
+ 'URI': key.FcpTypeKey,
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 12:37:35
|
Revision: 421
http://fclient.svn.sourceforge.net/fclient/?rev=421&view=rev
Author: jUrner
Date: 2008-06-29 05:37:43 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
SSKKeypair was broken. fixed
++ some other changes
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-06-29 12:36:50 UTC (rev 420)
+++ trunk/sandbox/fcp2/client.py 2008-06-29 12:37:43 UTC (rev 421)
@@ -22,10 +22,11 @@
# everything went well ..we are connected now
Request data associated to a freenet key::
- myRequestIdentifier = client.getData('CHK@ABCDE.......')
- myRequest = c.getRequest(myIdentifier)
- client.run()
- print myRequest.data
+ myKey = client.key.key('CHK@ABCDE.......')
+ myRequestIdentifier = client.getData(myKey)
+ myRequest = c.getRequest(myIdentifier)
+ client.run()
+ print myRequest.data
Usually you would connect handlers to client events to do processing or handle errors::
def handleSuccess(event, request):
@@ -34,17 +35,18 @@
def handleFailure(event, request):
print 'Too bad, something went wrong'
- client.events.RequestCompleted += handleSuccess
- client.events.RequestFailed += handleFailure
+ client.events.RequestCompleted += handleSuccess
+ client.events.RequestFailed += handleFailure
+ myKey = client.key.key('CHK@ABCDE.......')
+ client.getData(myKey)
+ c.run()
- client.getData('CHK@ABCDE.......')
- c.run()
-
Instead of calling run() you may run the client step by step::
- client.getData('CHK@ABCDE.......')
- for i in xrange(50):
- client.next()
+ myKey = client.key.key('CHK@ABCDE.......')
+ client.getData(myKey)
+ for i in xrange(50):
+ client.next()
You may disconnect event handlers aswell::
@@ -936,7 +938,7 @@
# So no way.
#TODO: ??? try ...except
- initialRequest.restorePersistentParams()
+ initialRequest._restoreParams(msg.params)
# check if PriorityClass has changed
priorityClass = msg.get('PriorityClass', None)
@@ -950,6 +952,7 @@
# don't handle PersistentRequestRemoved. instead we handle it in Get/PutFailed
+ # ??? why ???
#
#elif msg == message.PersistentRequestRemoved:
# if initialRequest is None:
@@ -1099,12 +1102,12 @@
return False
#TODO:no idea if the node may pass uris with prefixes like 'freenet:'... strip it anyways
- insertURI = key.stripKey(msg['InsertURI'])
- requestURI = key.stripKey(msg['RequestURI'])
+ insertURI = msg['InsertURI']
+ requestURI = msg['RequestURI']
if initialRequest['RequestType'] == consts.RequestType.GenerateUSKKeypair:
- insertURI = insertURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1)
- requestURI = requestURI.replace(consts.KeyType.SSK, consts.KeyType.USK, 1)
+ insertURI = key.USK(insertURI.keyData, filename=insertURI.filename)
+ requestURI = key.USK(requestURI.keyData, filename=requestURI.filename)
initialRequest['PrivateKey'] = insertURI
initialRequest['PublicKey'] = requestURI
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 12:36:42
|
Revision: 420
http://fclient.svn.sourceforge.net/fclient/?rev=420&view=rev
Author: jUrner
Date: 2008-06-29 05:36:50 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
make filename optional for SSK and USK
Modified Paths:
--------------
trunk/sandbox/fcp2/key.py
Modified: trunk/sandbox/fcp2/key.py
===================================================================
--- trunk/sandbox/fcp2/key.py 2008-06-29 10:59:46 UTC (rev 419)
+++ trunk/sandbox/fcp2/key.py 2008-06-29 12:36:50 UTC (rev 420)
@@ -238,7 +238,7 @@
KeyPattern = re.compile(_key_pattern_, re.I | re.X)
ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X)
- def __init__(self, keyData, filename):
+ def __init__(self, keyData, filename=None):
self.filename = filename
self.keyData = keyData
@@ -303,7 +303,7 @@
KeyPattern = re.compile(_key_pattern_, re.I | re.X)
ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X)
- def __init__(self, keyData, filename, edition=0):
+ def __init__(self, keyData, filename=None, edition=0):
"""Creates a USK key
@param keyData: (str) public key
@param filename: (str) filename
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 10:59:37
|
Revision: 419
http://fclient.svn.sourceforge.net/fclient/?rev=419&view=rev
Author: jUrner
Date: 2008-06-29 03:59:46 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
added one or the other unittest
Modified Paths:
--------------
trunk/sandbox/fcp2/test_fcp/test_key.py
Modified: trunk/sandbox/fcp2/test_fcp/test_key.py
===================================================================
--- trunk/sandbox/fcp2/test_fcp/test_key.py 2008-06-29 10:59:31 UTC (rev 418)
+++ trunk/sandbox/fcp2/test_fcp/test_key.py 2008-06-29 10:59:46 UTC (rev 419)
@@ -15,6 +15,7 @@
from fcp2.client import Client
from fcp2 import consts
+from fcp2 import key
from fcp2 import types
@@ -24,17 +25,39 @@
#****************************************************************************************
#
#****************************************************************************************
-class TestKeys(unittest.TestCase):
+class Test_CHK(unittest.TestCase):
- pass
+ def test_fromString(self):
+
+ p = 'CHK@' + key.DummyKeyData + '/'
+ myKey = key.CHK.fromString(p)
+ self.assertEqual(myKey.keyData, key.DummyKeyData)
+ self.failUnless(myKey.filename is None)
+ self.assertEqual(myKey.toString(), p)
+
+ p = 'CHK@' + key.DummyKeyData + '/foo/'
+ myKey = key.CHK.fromString(p)
+ self.assertEqual(myKey.keyData, key.DummyKeyData)
+ self.assertEqual(myKey.filename, 'foo')
+ self.assertEqual(myKey.toString(), p)
+ p = 'CHK@'
+ myKey = key.CHK.fromString(p)
+ self.failUnless(myKey is None)
+
+
+ def test_toString(self):
+ pass
+
+
+
#*********************************************************************************
#
#*********************************************************************************
def suite():
tests = (
- TestKeys,
+ Test_CHK,
)
suite = unittest.TestSuite()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 10:59:22
|
Revision: 418
http://fclient.svn.sourceforge.net/fclient/?rev=418&view=rev
Author: jUrner
Date: 2008-06-29 03:59:31 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
adapt to recent changes
Modified Paths:
--------------
trunk/sandbox/fcp2/test_fcp/test_client.py
Modified: trunk/sandbox/fcp2/test_fcp/test_client.py
===================================================================
--- trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 10:59:13 UTC (rev 417)
+++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-06-29 10:59:31 UTC (rev 418)
@@ -196,7 +196,6 @@
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
@@ -879,28 +878,23 @@
def test_100_request_registered(self):
self.connectClient()
- myIdentifier = self.client.getData('arbitrary-key')
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getData(myKey)
requestsAll = self.client.getRequests()
self.failUnless(myIdentifier in requestsAll)
myRequest = self.client.getRequest(myIdentifier)
self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.GetData)
- def test_200_key_object_is_accepted(self):
- self.connectClient()
- key = self.client.key.CHK()
- myIdentifier = self.client.getData(key)
- requestsAll = self.client.getRequests()
-
-
def test_300_message_send(self):
self.connectClient()
- myIdentifier = self.client.getData('arbitrary-key')
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getData(myKey)
requestsAll = self.client.getRequests()
self.assertHasNextMessage(
'ClientGet',
- ('URI', 'arbitrary-key'),
+ ('URI', myKey),
)
self.assertHasNextEvent(None)
@@ -911,7 +905,8 @@
def test_400_progress(self):
self.connectClient()
- myIdentifier = self.client.getData('arbitrary-key')
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getData(myKey)
requestsAll = self.client.getRequests()
self.assertHasNextMessage('ClientGet')
@@ -938,7 +933,8 @@
def test_500_completed_successfuly(self):
self.connectClient()
- myIdentifier = self.client.getData('arbitrary-key')
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getData(myKey)
requestsAll = self.client.getRequests()
self.assertHasNextMessage('ClientGet')
@@ -984,7 +980,8 @@
def test_600_completed_with_error(self):
self.connectClient()
- myIdentifier = self.client.getData('arbitrary-key')
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getData(myKey)
requestsAll = self.client.getRequests()
self.assertHasNextMessage('ClientGet')
@@ -1015,7 +1012,8 @@
def test_700_peristent_request_auto_retrieve_data(self):
self.connectClient()
- myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever)
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getData(myKey, persistence=self.client.consts.Persistence.Forever)
requestsAll = self.client.getRequests()
self.assertHasNextMessage('ClientGet')
@@ -1042,7 +1040,8 @@
def test_800_peristent_request_not_removed_on_success(self):
self.connectClient()
- myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever)
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getData(myKey, persistence=self.client.consts.Persistence.Forever)
requestsAll = self.client.getRequests()
self.assertHasNextMessage('ClientGet')
@@ -1067,7 +1066,8 @@
def test_900_peristent_request_not_removed_on_error(self):
self.connectClient()
- myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever)
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getData(myKey, persistence=self.client.consts.Persistence.Forever)
requestsAll = self.client.getRequests()
self.assertHasNextMessage('ClientGet')
@@ -1107,7 +1107,8 @@
def test_920_restore_peristent_request_success(self):
self.connectClient()
requestsAll = self.client.getRequests()
- myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever)
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getData(myKey, persistence=self.client.consts.Persistence.Forever)
self.failUnless(myIdentifier in requestsAll)
myRequest = self.client.getRequest(myIdentifier)
del requestsAll[myIdentifier]
@@ -1134,7 +1135,8 @@
def test_100_request_registered(self):
self.connectClient()
- myIdentifier = self.client.getFile('arbitrary-key', 'foo.txt')
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getFile(myKey, 'foo.txt')
requestsAll = self.client.getRequests()
self.failUnless(myIdentifier in requestsAll)
myRequest = self.client.getRequest(myIdentifier)
@@ -1143,17 +1145,16 @@
def test_200_key_object_is_accepted(self):
self.connectClient()
- key = self.client.key.CHK()
-
- myIdentifier = self.client.getFile(key, 'foo.txt')
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getFile(myKey, 'foo.txt')
requestsAll = self.client.getRequests()
def test_300_dda_denied(self):
self.connectClient()
-
+ myKey = self.client.key.key('KSK@foo')
myIdentifier = self.client.getFile(
- 'arbitrary-uri',
+ myKey,
os.path.join(DIR, 'DDATest.txt')
)
myRequest = self.client.getRequest(myIdentifier)
@@ -1235,7 +1236,8 @@
def test_100_request_registered(self):
self.connectClient()
- myIdentifier = self.client.getKeyInfo('arbitrary-key')
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getKeyInfo(myKey)
requestsAll = self.client.getRequests()
self.failUnless(myIdentifier in requestsAll)
myRequest = self.client.getRequest(myIdentifier)
@@ -1243,15 +1245,16 @@
def test_200_key_object_is_accepted(self):
self.connectClient()
- key = self.client.key.CHK()
+ myKey = self.client.key.key('KSK@foo')
- myIdentifier = self.client.getKeyInfo(key)
+ myIdentifier = self.client.getKeyInfo(myKey)
requestsAll = self.client.getRequests()
def test_300_getKeyInfo_Success(self):
self.connectClient()
- myIdentifier = self.client.getKeyInfo('arbitrary-uri')
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getKeyInfo(myKey)
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
@@ -1287,7 +1290,8 @@
# test specdial case where ProtocolError.TooBig is handled as success
# request a arbitrary uri
- myIdentifier = self.client.getKeyInfo('arbitrary-uri')
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getKeyInfo(myKey)
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
@@ -1317,7 +1321,8 @@
self.connectClient()
# request a arbitrary file
- myIdentifier = self.client.getKeyInfo('arbitrary-uri')
+ myKey = self.client.key.key('KSK@foo')
+ myIdentifier = self.client.getKeyInfo(myKey)
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
@@ -1350,15 +1355,15 @@
def test_100_subscribeUSK_accepts_key_object(self):
self.connectClient()
- key = self.client.key.USK('123456789', 'foo', 0)
+ key = self.client.key.USK(client.key.DummyKeyData, 'foo', 0)
myIdentifier = self.client.subscribeUSK(key)
self.assertHasNextMessage(
'SubscribeUSK',
- ('URI', key.toString()),
+ ('URI', key),
)
- def test_200_subscribeUSK(self):
+ def XXXtest_200_subscribeUSK(self):
self.connectClient()
myIdentifier = self.client.subscribeUSK('arbitrary-key')
myRequest = self.client.getRequest(myIdentifier)
@@ -3326,11 +3331,10 @@
def test_11000_Subscribe(self):
-
myIdentifier = self.client.subscribeUSK('arbitrary')
myRequest = self.client.getRequest(myIdentifier)
requestsAll = self.client.getRequests()
-
+
self.failUnless(myIdentifier in requestsAll)
self.failUnless(myRequest['RequestStatus'] & consts.RequestStatus.Completed)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 10:59:05
|
Revision: 417
http://fclient.svn.sourceforge.net/fclient/?rev=417&view=rev
Author: jUrner
Date: 2008-06-29 03:59:13 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
get / put methods expect a key object now
Modified Paths:
--------------
trunk/sandbox/fcp2/client.py
Modified: trunk/sandbox/fcp2/client.py
===================================================================
--- trunk/sandbox/fcp2/client.py 2008-06-29 10:58:33 UTC (rev 416)
+++ trunk/sandbox/fcp2/client.py 2008-06-29 10:59:13 UTC (rev 417)
@@ -968,7 +968,7 @@
initialRequest['ProgressRequired'] = msg['Required']
initialRequest['ProgressFailed'] = msg['Failed']
initialRequest['ProgressFatalyFailed'] = msg['FatallyFailed']
- initialRequest['ProgressSucceeeded'] = msg['Succeeded']
+ initialRequest['ProgressSucceeded'] = msg['Succeeded']
self.events.RequestProgress(initialRequest)
return True
@@ -1271,7 +1271,7 @@
**messageParams
):
"""Requests a key from the node
- @param key: (str) key or Uri of the file to request (may contain prefixes like 'freenet:' or 'http://')
+ @param key: (L{key.KeyBase}) key to request
@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
@@ -1279,11 +1279,8 @@
@param messageParams: keyword arguments to pass along with the ClientGet message (uppercase first letter!!).
If the value of a keyword is None, it is ignored.
- @return: (str) identifier of the request
+ @return: (str) request identifier
"""
- if hasattr(key, 'toString'):
- key = key.toString()
-
msg = message.ClientGet(URI=key)
for paramName, value in messageParams.items():
if value is not None:
@@ -1318,7 +1315,7 @@
):
"""Requests datae from the node
- @param key: (str) key or Uri of the data to request (may contain prefixes like 'freenet:' or 'http://')
+ @param key: (L{key.KeyBase}) key to request
@param allowedMimeTypes: (str) list of allowed mime types
@param binaryBlob: (bool) if True, the file is retrieved as binary blob file
@@ -1386,7 +1383,7 @@
):
"""Requests a file from the node
- @param key: (str) key or Uri of the file to request (may contain prefixes like 'freenet:' or 'http://')
+ @param key: (L{key.KeyBase}) key to request
@param filename: (full path) filename to store the file to
@param allowedMimeTypes: (str) list of allowed mime types
@@ -1451,7 +1448,7 @@
):
"""Requests info about a key
- @param key: (str) key or Uri of the file to request (may contain prefixes like 'freenet:' or 'http://')
+ @param key: (L{key.KeyBase}) key to request
@param dsOnly: if True, retrieves the file from the local data store only
@param ignoreDS: If True, ignores the local data store
@@ -1497,17 +1494,15 @@
#TESTED
def subscribeUSK(self, key, dontPoll=True):
"""Asks the node to notify the client when an USK is updated
- @param key: (str) key or Uri of the USK to subscribe to
+ @param key: (L{key.USK}) key 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}
+ @note: this request can not be removed or modified so the L{consts.RequestStatus.Completed}
flag is always set
@todo: looks like USK subscribes will persist untill connection is closed. Can they be removed somehow?
"""
- if hasattr(key, 'toString'):
- key = key.toString()
msg = message.SubscribeUSK(
URI=key,
DontPoll=dontPoll,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 10:58:24
|
Revision: 416
http://fclient.svn.sourceforge.net/fclient/?rev=416&view=rev
Author: jUrner
Date: 2008-06-29 03:58:33 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
implemented autoconvert fcp keys to python keys
Modified Paths:
--------------
trunk/sandbox/fcp2/message.py
Modified: trunk/sandbox/fcp2/message.py
===================================================================
--- trunk/sandbox/fcp2/message.py 2008-06-29 10:57:31 UTC (rev 415)
+++ trunk/sandbox/fcp2/message.py 2008-06-29 10:58:33 UTC (rev 416)
@@ -16,6 +16,7 @@
from fcp2 import consts
from fcp2 import types
+from fcp2 import key
from fcp2.fcp_lib import pmstruct
from fcp2.fcp_lib import node
from fcp2.fcp_lib import uuid
@@ -143,7 +144,7 @@
paramType = self._param_types_.get(param, None)
if paramType is not None:
value = paramType.pythonToFcp(value)
-
+
out.append('%s=%s' % (param, value))
if self.data is None:
@@ -330,11 +331,11 @@
'node.scheduler.SSKinserter_priority_policy': types.FcpTypeChoicePriorityPolicy,
'node.scheduler.SSKrequester_priority_policy': types.FcpTypeChoicePriorityPolicy,
- 'node.updater.URI': types.FcpTypeUri,
+ 'node.updater.URI': key.FcpTypeKey,
'node.updater.autoupdate': types.FcpTypeBool,
'node.updater.enabled': types.FcpTypeBool,
- 'node.updater.extURI': types.FcpTypeUri,
- 'node.updater.revocationURI': types.FcpTypeUri,
+ 'node.updater.extURI': key.FcpTypeKey,
+ 'node.updater.revocationURI': key.FcpTypeKey,
'pluginmanager.loadplugin': types.FcpTypeStringList,
'pluginmanager2.loadedPlugins': types.FcpTypeStringList,
@@ -676,6 +677,7 @@
'MaxRetries': types.FcpTypeInt,
'MaxSize': types.FcpTypeInt,
'MaxTempSize': types.FcpTypeInt,
+ 'URI': key.FcpTypeKey,
'Verbosity': types.FcpTypeInt,
}
@@ -712,6 +714,7 @@
'GetCHKOnly': types.FcpTypeBool,
'Global': types.FcpTypeBool,
'MaxRetries': types.FcpTypeInt,
+ 'URI': key.FcpTypeKey,
'Verbosity': types.FcpTypeInt,
}
@@ -861,6 +864,7 @@
'Fatal': types.FcpTypeBool,
'FinalizedExpected': types.FcpTypeBool,
'Global': types.FcpTypeBool,
+ 'RedirectURI': key.FcpTypeKey,
}
@@ -969,6 +973,7 @@
_additional_params_ = {}
_param_types_ = {
'ark.number': types.FcpTypeInt,
+ 'ark.privURI': key.FcpTypeKey,
'auth.negTypes': types.FcpTypeInt,
'location': types.FcpTypeFloat,
'opennet': types.FcpTypeBool,
@@ -1210,6 +1215,7 @@
_additional_params_ = {}
_param_types_ = {
'Code': types.FcpTypeInt,
+ 'ExpectedURI': key.FcpTypeKey,
'Global': types.FcpTypeBool,
}
@@ -1219,6 +1225,7 @@
_additional_params_ = {}
_param_types_ = {
'Global': types.FcpTypeBool,
+ 'URI': key.FcpTypeKey,
}
#####################################
@@ -1230,6 +1237,7 @@
_additional_params_ = {}
_param_types_ = {
'Global': types.FcpTypeBool,
+ 'URI': key.FcpTypeKey,
}
@@ -1252,6 +1260,8 @@
name = consts.Message. SSKKeypair
_additional_params_ = {}
_param_types_ = {
+ 'InsertURI': key.FcpTypeKey,
+ 'RequestURI': key.FcpTypeKey,
}
@@ -1287,6 +1297,7 @@
_additional_params_ = AdditionalSubscribeUSKParams
_param_types_ = {
'DontPoll': types.FcpTypeBool,
+ 'URI': key.FcpTypeKey,
}
@@ -1295,6 +1306,7 @@
_additional_params_ = {}
_param_types_ = {
'Edition': types.FcpTypeInt,
+ 'URI': key.KeyBase,
}
@@ -1334,6 +1346,7 @@
name = consts.Message.URIGenerated
_additional_params_ = {}
_param_types_ = {
+ 'URI': key.FcpTypeKey,
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 10:57:32
|
Revision: 415
http://fclient.svn.sourceforge.net/fclient/?rev=415&view=rev
Author: jUrner
Date: 2008-06-29 03:57:31 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
added support to autoconvert fcp keys to python key
++ many changes and fixes
Modified Paths:
--------------
trunk/sandbox/fcp2/key.py
Modified: trunk/sandbox/fcp2/key.py
===================================================================
--- trunk/sandbox/fcp2/key.py 2008-06-28 08:42:30 UTC (rev 414)
+++ trunk/sandbox/fcp2/key.py 2008-06-29 10:57:31 UTC (rev 415)
@@ -25,6 +25,9 @@
ReMatchExact = '\A%s\Z'
KeyTypesAll = {}
+# for testing, arbitrary but valid key data
+DummyKeyData = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA'
+
#**************************************************************************************
# freenet base64 for keys
#**************************************************************************************
@@ -51,7 +54,10 @@
@param key: (str) key to strip
@return: (str) key
"""
- return urlparse.urlsplit(key)[2]
+ result = urlparse.urlsplit(key)[2]
+ if result.startswith('/'):
+ result = result[1:]
+ return result
#****************************************************************************************
# freenet keys
@@ -84,56 +90,95 @@
#**************************************************************************************
#
#**************************************************************************************
-class KeyBase(object):
- """Base class for freenet keys
+class FcpTypeKey(object):
+ """key type for type conversions
- >>> key = KeyBase.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
+ >>> key.toString()
'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
- >>> key = KeyBase.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/')
+ >>> key.toString()
'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
- >>> key = KeyBase.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
+ >>> key.toString()
'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
- >>> key = KeyBase.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/')
+ >>> key.toString()
'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
- >>> key = KeyBase.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0')
+ >>> key.toString()
'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/'
- >>> key = KeyBase.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/')
+ >>> key.toString()
'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/'
- >>> key = KeyBase.fcpToPython('KSK@abcde')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('KSK@abcde')
+ >>> key.toString()
'KSK@abcde/'
- >>> key = KeyBase.fcpToPython('KSK@abcde/')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('KSK@abcde/')
+ >>> key.toString()
'KSK@abcde/'
"""
-
- __metaclass__ = KeyMeta
- KeyType = None
-
+
@classmethod
def fcpToPython(clss, string):
+ """converts a fcp key to a python key
+ @param string: (str) fcp key
+ @return: python key object
+ @raise ValueError: if the string can not be converted
+ @note: use this method to convert an arbirary key to the corrosponding python key object
+ """
key = stripKey(string)
for clssKeyType in KeyTypesAll.values():
result = clssKeyType.fromString(key)
if result is not None:
return result
+ raise ValueError('Invalid key: %s' % string)
+ @classmethod
+ def pythonToFcp(self, key):
+ """returns the key as string
+ @return: (str) fcp key
+ """
+ return key.toString()
+
+
+
+def key(string):
+ """creates a key object from a string
+ @return: L{KeyBase}
+ """
+ return FcpTypeKey.fcpToPython(string)
- def toString(self):
- """Returns the key as string"""
- return self.pythonToFcp()
+#**************************************************************************************
+#
+#**************************************************************************************
+class KeyBase(object):
+ """Base class for freenet keys
+ """
+
+ __metaclass__ = KeyMeta
+ KeyType = None
+
+ def __eq__(self, other):
+ return self.toString() == other.toString()
+
+ def __ne__(self, other):
+ return self.pytoString() != other.toString()
+ @classmethod
+ def fromString(clss, string):
+ """should create a key object from a string
+ """
+ raise NotImplementedError()
+ def toString(self):
+ """should return the key as string"""
+ raise NotImplementedError()
+
class CHK(KeyBase):
""""""
@@ -144,21 +189,22 @@
(?P<cryptoKey>[a-z0-9\-~]{43}),
(?P<extra>[a-z0-9\-~]{7})
)
- (?: / (?P<filename>[^/]+?) (?: /)?)?
+ (?: / (?P<filename>[^/]+?)? (?: /)?)?
'''
KeyType = consts.KeyType.CHK
KeyPattern = re.compile(_key_pattern_, re.I | re.X)
ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X)
- def __init__(self, filename=None):
+ def __init__(self, keyData=None, filename=None):
"""Creates a CHK key
+ @param keyData: (str) key data or None
@param filename: (str) filename to add to the key or None
"""
- self.keyData = None
+ self.keyData = keyData
self.filename = filename
- def pythonToFcp(self):
+ def toString(self):
out = self.KeyType
if self.keyData is not None:
out += self.keyData + '/'
@@ -168,12 +214,11 @@
@classmethod
def fromString(clss, string):
- result = clss.ExactKeyPattern.match(string)
+ result = clss.ExactKeyPattern.match(stripKey(string))
if result is not None:
d = result.groupdict()
- clss = clss(filename=d['filename'])
- clss.keyData = d['keyData']
- return clss
+ key = clss(d['keyData'], filename=d['filename'])
+ return key
class SSK(KeyBase):
@@ -197,7 +242,7 @@
self.filename = filename
self.keyData = keyData
- def pythonToFcp(self):
+ def toString(self):
out = self.KeyType
if self.keyData is not None:
out += self.keyData + '/'
@@ -207,7 +252,7 @@
@classmethod
def fromString(clss, string):
- result = clss.ExactKeyPattern.match(string)
+ result = clss.ExactKeyPattern.match(stripKey(string))
if result is not None:
d = result.groupdict()
return clss(d['keyData'], d['filename'])
@@ -227,7 +272,7 @@
def __init__(self, filename):
self.filename = filename
- def pythonToFcp(self):
+ def toString(self):
out = self.KeyType
if self.filename is not None:
out += self.filename + '/'
@@ -235,11 +280,10 @@
@classmethod
def fromString(clss, string):
- result = clss.ExactKeyPattern.match(string)
+ result = clss.ExactKeyPattern.match(stripKey(string))
if result is not None:
d = result.groupdict()
- clss = clss(filename=d['filename'])
- return clss
+ return clss(filename=d['filename'])
class USK(KeyBase):
@@ -270,7 +314,7 @@
self.filename = filename
self.keyData = keyData
- def pythonToFcp(self):
+ def toString(self):
out = self.KeyType
if self.keyData is not None:
out += self.keyData + '/'
@@ -282,14 +326,14 @@
@classmethod
def fromString(clss, string):
- result = clss.ExactKeyPattern.match(string)
+ result = clss.ExactKeyPattern.match(stripKey(string))
if result is not None:
d = result.groupdict()
return clss(d['keyData'], d['filename'], edition=d['edition'])
-
+
#*****************************************************************************
#
#*****************************************************************************
if __name__ == '__main__':
import doctest
- doctest.testmod()
+ print 'doctests failed: %s/%s' % doctest.testmod()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-28 08:42:23
|
Revision: 414
http://fclient.svn.sourceforge.net/fclient/?rev=414&view=rev
Author: jUrner
Date: 2008-06-28 01:42:30 -0700 (Sat, 28 Jun 2008)
Log Message:
-----------
beautifications
Modified Paths:
--------------
trunk/sandbox/fcp2/consts.py
Modified: trunk/sandbox/fcp2/consts.py
===================================================================
--- trunk/sandbox/fcp2/consts.py 2008-06-28 08:39:08 UTC (rev 413)
+++ trunk/sandbox/fcp2/consts.py 2008-06-28 08:42:30 UTC (rev 414)
@@ -144,6 +144,48 @@
)
+class ConnectReason:
+ """Reason for connecting to the node
+ @cvar Connect: reason is a regualr connect
+ @cvar Reconnect: reason is a reconnect
+ """
+ Connect = 1
+ Reconnect = 2
+
+
+class DebugVerbosity:
+ """Consts indicating the verbosity level for debugging"""
+ Debug = logging.DEBUG
+ Info = logging.INFO
+ Warning = logging.WARNING
+ Error = logging.ERROR
+ Critical = logging.CRITICAL
+ Quiet = 1000000
+
+
+class DisconnectReason(BaseBitFlags):
+ """Reasons for client disconnect
+ @cvar Close: the clent is about to close down
+ @cvar ConnectionDied: the connection died unexpectedly
+ @cvar DuplicateClientName: another client opend a connection with the same connection name
+ @cvar IOConnectFailed: io connection could not be established
+ @cvar NodeClosing: freenet node is closing down
+ @cvar NoNodeHello: NodeHello message did not arrive in time
+ @cvar Reconnect: the clent is about to be reconnected
+ @cvar UnknonNodeHello: some unknow message insteadof NodeHello was encountered durin g connect
+ @cvar VersionMissmatch: nodebuild or Fcp version did not match
+ """
+ Close = 0
+ ConnectionDied = 1
+ DuplicateClientName = 2
+ IOConnectFailed = 3
+ NodeClosing = 4
+ NoNodeHello = 5
+ Reconnect = 6
+ UnknownNodeHello = 7
+ VersionMissmatch = 8
+
+
class FetchError(Exception):
"""All fetch errors supported by the client"""
@@ -188,6 +230,21 @@
NotAllDataFound = 28
+class FilenameCollision(BaseBitFlags):
+ """Filename collision flags
+ @cvar HandleNever: don't handle filename collisions
+ @cvar HandleRename: rename file on collisions
+ @cvar MaskHandle: bitmask indicating if collisions are hadled or not
+ @cvar CollisonHandled: if this bit is set, a collision has actually been handled
+ """
+ HandleNever = 0x0
+ HandleRename = 0x1
+
+ MaskHandle = HandleRename
+
+ CollisionHandled = 0x10000000 # a filename collision has already been handled
+
+
class InsertError(Exception):
"""All insert errors supported by the client"""
@@ -214,63 +271,6 @@
Canceled = 10
-class ConnectReason:
- """Reason for connecting to the node
- @cvar Connect: reason is a regualr connect
- @cvar Reconnect: reason is a reconnect
- """
- Connect = 1
- Reconnect = 2
-
-
-class DebugVerbosity:
- """Consts indicating the verbosity level for debugging"""
- Debug = logging.DEBUG
- Info = logging.INFO
- Warning = logging.WARNING
- Error = logging.ERROR
- Critical = logging.CRITICAL
- Quiet = 1000000
-
-
-class DisconnectReason(BaseBitFlags):
- """Reasons for client disconnect
- @cvar Close: the clent is about to close down
- @cvar ConnectionDied: the connection died unexpectedly
- @cvar DuplicateClientName: another client opend a connection with the same connection name
- @cvar IOConnectFailed: io connection could not be established
- @cvar NodeClosing: freenet node is closing down
- @cvar NoNodeHello: NodeHello message did not arrive in time
- @cvar Reconnect: the clent is about to be reconnected
- @cvar UnknonNodeHello: some unknow message insteadof NodeHello was encountered durin g connect
- @cvar VersionMissmatch: nodebuild or Fcp version did not match
- """
- Close = 0
- ConnectionDied = 1
- DuplicateClientName = 2
- IOConnectFailed = 3
- NodeClosing = 4
- NoNodeHello = 5
- Reconnect = 6
- UnknownNodeHello = 7
- VersionMissmatch = 8
-
-
-class FilenameCollision(BaseBitFlags):
- """Filename collision flags
- @cvar HandleNever: don't handle filename collisions
- @cvar HandleRename: rename file on collisions
- @cvar MaskHandle: bitmask indicating if collisions are hadled or not
- @cvar CollisonHandled: if this bit is set, a collision has actually been handled
- """
- HandleNever = 0x0
- HandleRename = 0x1
-
- MaskHandle = HandleRename
-
- CollisionHandled = 0x10000000 # a filename collision has already been handled
-
-
class KeyType:
"""Supported key types"""
SSK = 'SSK@'
@@ -398,6 +398,44 @@
ClientDisconnected = 'FcClientDisconnected'
+class PeerNodeStatus:
+ Connected = 'CONNECTED'
+ BackedOff = 'BACKED OFF'
+ TooNew = 'TOO NEW'
+ TooOld = 'TOO OLD'
+ Disconnected = 'DISCONNECTED'
+ NeverConnected = 'NEVER CONNECTED'
+ Disabled = 'DISABLED'
+ ClockProblem = 'CLOCK PROBLEM'
+ ConnectionError = 'CONNECTION ERROR'
+ RoutingDisabled = 'ROUTING DISABLED'
+ ListenOnly = 'LISTEN ONLY'
+ Listening = 'LISTENING'
+ Bursting = 'BURSTING'
+ Disconnecting = 'DISCONNECTING'
+ Unknown = 'UNKNOWN STATUS'
+
+
+class PeerNoteType:
+ """All known peer note types"""
+ Private = '1'
+
+
+class Persistence:
+ Connection = 'connection'
+ Reboot = 'reboot'
+ Forever = 'forever'
+
+class Priority:
+ Highest = '0'
+ Higher = '1'
+ High = '2'
+ Medium = '3'
+ Low = '4'
+ Lower = '5'
+ Lowest = '6'
+
+
class ProtocolError(Exception):
"""All protocol errors supported by the client"""
@@ -446,46 +484,7 @@
NoSuchPlugin = 32
-class PeerNodeStatus:
- Connected = 'CONNECTED'
- BackedOff = 'BACKED OFF'
- TooNew = 'TOO NEW'
- TooOld = 'TOO OLD'
- Disconnected = 'DISCONNECTED'
- NeverConnected = 'NEVER CONNECTED'
- Disabled = 'DISABLED'
- ClockProblem = 'CLOCK PROBLEM'
- ConnectionError = 'CONNECTION ERROR'
- RoutingDisabled = 'ROUTING DISABLED'
- ListenOnly = 'LISTEN ONLY'
- Listening = 'LISTENING'
- Bursting = 'BURSTING'
- Disconnecting = 'DISCONNECTING'
- Unknown = 'UNKNOWN STATUS'
-
-
-class PeerNoteType:
- """All known peer note types"""
- Private = '1'
-
-
-class Persistence:
- Connection = 'connection'
- Reboot = 'reboot'
- Forever = 'forever'
-
-
-class Priority:
- Highest = '0'
- Higher = '1'
- High = '2'
- Medium = '3'
- Low = '4'
- Lower = '5'
- Lowest = '6'
-
-
-class PutDirType.
+class PutDirType:
Complex = 'complex'
Disk = 'disk'
@@ -561,10 +560,8 @@
MaskGenerateKeypair = GenerateSSKKeypair | GenerateUSKKeypair
MaskPlugin = PluginInfo | PluginMessage
MaskPut = PutData | PutFile | PutDir | PutMultiple | PutRedirect
-
-
class ReturnType:
Direct = 'direct'
Disk = 'disk'
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-28 08:38:58
|
Revision: 413
http://fclient.svn.sourceforge.net/fclient/?rev=413&view=rev
Author: jUrner
Date: 2008-06-28 01:39:08 -0700 (Sat, 28 Jun 2008)
Log Message:
-----------
added new PutDirType consts
Modified Paths:
--------------
trunk/sandbox/fcp2/consts.py
Modified: trunk/sandbox/fcp2/consts.py
===================================================================
--- trunk/sandbox/fcp2/consts.py 2008-06-28 08:38:50 UTC (rev 412)
+++ trunk/sandbox/fcp2/consts.py 2008-06-28 08:39:08 UTC (rev 413)
@@ -485,6 +485,11 @@
Lowest = '6'
+class PutDirType.
+ Complex = 'complex'
+ Disk = 'disk'
+
+
class RequestModified(BaseBitFlags):
"""Flags indicating what aspect of a request has been modified
@cvar Filename: the filename has been modified
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|