fclient-commit Mailing List for fclient (Page 19)
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-07-06 05:27:11
|
Revision: 512
http://fclient.svn.sourceforge.net/fclient/?rev=512&view=rev
Author: jUrner
Date: 2008-07-05 22:27:21 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
....
Added Paths:
-----------
trunk/sandbox/fclient/
Copied: trunk/sandbox/fclient (from rev 78, trunk/fclient)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-06 05:25:42
|
Revision: 511
http://fclient.svn.sourceforge.net/fclient/?rev=511&view=rev
Author: jUrner
Date: 2008-07-05 22:25:52 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
....
Added Paths:
-----------
trunk/fcp2/src/setup.py
Added: trunk/fcp2/src/setup.py
===================================================================
--- trunk/fcp2/src/setup.py (rev 0)
+++ trunk/fcp2/src/setup.py 2008-07-06 05:25:52 UTC (rev 511)
@@ -0,0 +1,48 @@
+"""a python wrapper for the freenet client protocol version 2
+
+the package provides means to access client services a running freenet node provides.
+main features are: automatic type conversions, access to node and peer configurations
+and much more.
+
+the package is designed as a drop-in package that can be included in any project without the
+need to install it to lib/site-packages.
+"""
+
+from distutils.core import setup
+
+AUTHOR = 'Juergen Urner'
+AUTHOR_EMAIL = 'jU...@ar...'
+CLASSIFIERS = [
+ 'Development Status :: 3 - Alpha',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: MIT License',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python',
+ 'Topic :: Communications :: File Sharing',
+ ]
+DOWNLOAD=''
+NAME = 'fcp2'
+URL = 'https://sourceforge.net/projects/fclient/'
+VERSION = '0.1.0'
+
+MODULES = ['fcp2', ]
+DATA = {}
+
+
+if __name__ == '__main__':
+ setup(
+ author = AUTHOR,
+ author_email = AUTHOR_EMAIL,
+ classifiers=CLASSIFIERS,
+ description=__doc__.split('\n')[0],
+ download_url=DOWNLOAD,
+ long_description='\n'.join(__doc__.split('\n')[2:]),
+ name=NAME,
+ url=URL,
+ version=VERSION,
+
+ license='MIT licence',
+ platforms=['Many', ],
+ py_modules=MODULES,
+ package_data = DATA
+ )
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-06 05:24:37
|
Revision: 510
http://fclient.svn.sourceforge.net/fclient/?rev=510&view=rev
Author: jUrner
Date: 2008-07-05 22:24:47 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
....
Added Paths:
-----------
trunk/fcp2/src/fcp2/test_fcp/test_types.py
Added: trunk/fcp2/src/fcp2/test_fcp/test_types.py
===================================================================
--- trunk/fcp2/src/fcp2/test_fcp/test_types.py (rev 0)
+++ trunk/fcp2/src/fcp2/test_fcp/test_types.py 2008-07-06 05:24:47 UTC (rev 510)
@@ -0,0 +1,45 @@
+"""Unittests for fcp2.key.py"""
+
+import os, sys
+import socket
+import unittest
+
+#--> rel import hack
+class _RelImportHack(object):
+ def __init__(self, n):
+ fpath = os.path.abspath(__file__)
+ for i in xrange(n): fpath = os.path.dirname(fpath)
+ sys.path.insert(0, fpath)
+ def __del__(self): sys.path.pop(0)
+hack = _RelImportHack(3)
+
+import fcp2
+
+del hack
+#<-- rel import hack
+
+#****************************************************************************************
+#
+#****************************************************************************************
+class Test_TypeByteAmount(unittest.TestCase):
+ pass
+
+
+#*********************************************************************************
+#
+#*********************************************************************************
+def suite():
+ tests = (
+ )
+
+ suite = unittest.TestSuite()
+ for test in tests:
+ suite.addTest(unittest.makeSuite(test))
+ return suite
+
+
+def test():
+ unittest.TextTestRunner(verbosity=1).run(suite())
+
+if __name__ == '__main__':
+ test()
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-06 05:18:15
|
Revision: 509
http://fclient.svn.sourceforge.net/fclient/?rev=509&view=rev
Author: jUrner
Date: 2008-07-05 22:18:23 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
this and that
Modified Paths:
--------------
trunk/web/download-fclient.html
trunk/web/download-fcp2.html
trunk/web/index.html
trunk/web/intro.html
trunk/web/more-fclient.html
trunk/web/more-fcp2.html
trunk/web/screenshots-fclient.html
trunk/web/screenshots-fcp2.html
Modified: trunk/web/download-fclient.html
===================================================================
--- trunk/web/download-fclient.html 2008-07-05 21:29:41 UTC (rev 508)
+++ trunk/web/download-fclient.html 2008-07-06 05:18:23 UTC (rev 509)
@@ -13,7 +13,7 @@
<div class="topic">
<br>
<br>
- Nothing to see here, move along
+ Not Yet
</div>
Modified: trunk/web/download-fcp2.html
===================================================================
--- trunk/web/download-fcp2.html 2008-07-05 21:29:41 UTC (rev 508)
+++ trunk/web/download-fcp2.html 2008-07-06 05:18:23 UTC (rev 509)
@@ -12,7 +12,7 @@
<div class="topic">
<br>
<br>
- Nothing to see here, move along
+ Not yet
</div>
<div class="bottom_padding"></div>
Modified: trunk/web/index.html
===================================================================
--- trunk/web/index.html 2008-07-05 21:29:41 UTC (rev 508)
+++ trunk/web/index.html 2008-07-06 05:18:23 UTC (rev 509)
@@ -39,14 +39,17 @@
<tr>
<td class="frame" width="100%" valign="bottom">
- [<a href="http://www.freenetproject.org">Freenet</a>]
- <!-- [<a href="http://epydoc.sourceforge.net/">Epydoc</a>] -->
+ Links:
+ [<a href="http://sourceforge.net/projects/fclient">fclient sourceforge</a>]
+ [<a href="http://www.freenetproject.org">freenet</a>]
+
+
</td>
<td class="frame" valign="bottom">
- <a href="http://sourceforge.net/donate/index.php?group_id=206970"><img src="http://images.sourceforge.net/images/project-support.jpg" width="88" height="32" border="0" alt="Support This Project" /> </a>
+ <a href="http://sourceforge.net/donate/index.php?group_id=206970"><img src="http://images.sourceforge.net/images/project-support.jpg" width="88" height="32" border="0" alt="Support This Project"> </a>
</td>
<td class="frame" valign="bottom">
- <a href="http://sourceforge.net"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=206970&type=4" width="125" height="37" border="0" alt="SourceForge.net Logo" /></a>
+ <a href="http://sourceforge.net"><img src="http://sflogo.sourceforge.net/sflogo.php?group_id=206970&type=4" width="125" height="37" border="0" alt="SourceForge.net Logo"></a>
</td>
</tr>
Modified: trunk/web/intro.html
===================================================================
--- trunk/web/intro.html 2008-07-05 21:29:41 UTC (rev 508)
+++ trunk/web/intro.html 2008-07-06 05:18:23 UTC (rev 509)
@@ -9,19 +9,19 @@
<div class="topic">
- <b>fclient:</b> Gui frontend for freenet written in Qt and python. The Gui is yet to come.
+ <b>fclient:</b> Gui frontend for freenet written in python and Qt. Not yet
<br>
- [<a href="more-fclient.html" target="mainFrame">..More</a>] [<a href="download-fclient.html" target="mainFrame">Download</a>] [<a href="screenshots-fclient.html" target="mainFrame">Screenshots</a>]
+ [<a href="more-fclient.html" target="mainFrame">..more</a>] [<a href="download-fclient.html" target="mainFrame">download</a>] [<a href="screenshots-fclient.html" target="mainFrame">screenshots</a>]
<hr>
</div>
<div class="topic">
- <b>fcp2:</b> high level wrapper for the freenet client protocol version-2 written in python. Automatic
+ <b>fcp2:</b> high level wrapper for the freenet client protocol version 2 written in python. Automatic
conversions from Fcp to python types, access to node and peer configurations and much more.
<br>
- [<a href="more-fcp2.html" target="mainFrame">..More</a>] [<a href="download-fcp2.html" target="mainFrame">Download</a>] [<a href="screenshots-fcp2.html" target="mainFrame">Screenshots</a>]
+ [<a href="more-fcp2.html" target="mainFrame">..more</a>] [<a href="download-fcp2.html" target="mainFrame">download</a>] [<a href="screenshots-fcp2.html" target="mainFrame">screenshots</a>]
</div>
Modified: trunk/web/more-fclient.html
===================================================================
--- trunk/web/more-fclient.html 2008-07-05 21:29:41 UTC (rev 508)
+++ trunk/web/more-fclient.html 2008-07-06 05:18:23 UTC (rev 509)
@@ -12,7 +12,7 @@
<div class="topic">
<br>
<br>
- Nothing to see here, move along
+ Not yet
</div>
Modified: trunk/web/more-fcp2.html
===================================================================
--- trunk/web/more-fcp2.html 2008-07-05 21:29:41 UTC (rev 508)
+++ trunk/web/more-fcp2.html 2008-07-06 05:18:23 UTC (rev 509)
@@ -21,9 +21,9 @@
Connect to the freenet node
-<pre class="py_code"><span class="py_keyword">from</span> fcp2 <span class="py_keyword">import</span> Client
+<pre class="py_code"><span class="py_keyword">import</span> fcp2
-client <span class="py_operator">=</span> Client()
+client <span class="py_operator">=</span> fcp2.Client()
nodeHello <span class="py_operator">=</span> client.connect()
<span class="py_keyword">if</span> nodeHello <span class="py_keyword">is</span> <span class="py_bool">None</span>:
<span class="py_keyword">pass</span>
@@ -34,7 +34,8 @@
</pre>
Request data associated to a freenet key
-<pre class="py_code">myRequestIdentifier <span class="py_operator">=</span> client.getData(<span class="py_string2">'CHK@ABCDE.......'</span>)
+<pre class="py_code">myKey <span class="py_operator">=</span> fcp2.Key(<span class="py_string2">'CHK@ABCDE.......'</span>)
+myRequestIdentifier <span class="py_operator">=</span> client.getData(key)
myRequest <span class="py_operator">=</span> client.getRequest(myIdentifier)
client.run()
<span class="py_keyword">print</span> myRequest.data
@@ -51,17 +52,19 @@
client.events.RequestCompleted <span class="py_operator">+</span><span class="py_operator">=</span> handleSuccess
client.events.RequestFailed <span class="py_operator">+</span><span class="py_operator">=</span> handleFailure
-client.getData(<span class="py_string2">'CHK@ABCDE.......'</span>)
+myKey <span class="py_operator">=</span> fcp2.Key(<span class="py_string2">'CHK@ABCDE.......'</span>)
+client.getData(myKey)
client.run()
</pre>
Instead of calling run() you may run the client step by step
-<pre class="py_code">client.getData(<span class="py_string2">'CHK@ABCDE.......'</span>)
+<pre class="py_code">myKey <span class="py_operator">=</span> fcp2.Key(<span class="py_string2">'CHK@ABCDE.......'</span>)
+client.getData(<span class="py_string2">'CHK@ABCDE.......'</span>)
<span class="py_keyword">for</span> i <span class="py_keyword">in</span> xrange(50):
client.next()
</pre>
-You may disconnect event handlers aswel
+You may disconnect event handlers as well
<pre class="py_code">client.events.RequestCompleted <span class="py_operator">-</span><span class="py_operator">=</span> handleSuccess
client.events.RequestFailed <span class="py_operator">-</span><span class="py_operator">=</span> handleFailure
</pre>
Modified: trunk/web/screenshots-fclient.html
===================================================================
--- trunk/web/screenshots-fclient.html 2008-07-05 21:29:41 UTC (rev 508)
+++ trunk/web/screenshots-fclient.html 2008-07-06 05:18:23 UTC (rev 509)
@@ -11,7 +11,7 @@
<br>
<br>
- Nothing to see here, move along
+ Not yet
<div class="bottom_padding"></div>
Modified: trunk/web/screenshots-fcp2.html
===================================================================
--- trunk/web/screenshots-fcp2.html 2008-07-05 21:29:41 UTC (rev 508)
+++ trunk/web/screenshots-fcp2.html 2008-07-06 05:18:23 UTC (rev 509)
@@ -12,7 +12,7 @@
<div class="topic">
<br>
<br>
- Nothing to see here, move along
+ Not yet
</div>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 21:29:31
|
Revision: 508
http://fclient.svn.sourceforge.net/fclient/?rev=508&view=rev
Author: jUrner
Date: 2008-07-05 14:29:41 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
added a few notes
Modified Paths:
--------------
trunk/fcp2/src/fcp2/consts.py
Modified: trunk/fcp2/src/fcp2/consts.py
===================================================================
--- trunk/fcp2/src/fcp2/consts.py 2008-07-05 21:20:24 UTC (rev 507)
+++ trunk/fcp2/src/fcp2/consts.py 2008-07-05 21:29:41 UTC (rev 508)
@@ -154,7 +154,7 @@
MaxArchiveRestartsExceeded = 8
MaxRecursionLevelExceeded = 9
NotAnArchve = 10
- TooManyMetastrings = 11
+ TooManyMetastrings = 11 # too many components in key. try remove 1. for example a trailing slash
BucketError = 12
DataNotFound = 13
RouteNotFound = 14
@@ -167,10 +167,10 @@
TooBig = 21
MetadataTooBig = 22
TooManyBlocks = 23
- NotEnoughMetastrings = 24
+ NotEnoughMetastrings = 24 # not enoughcomponents in key. try adding 1. for example a trailing slash
Canceled = 25
ArchiveRestart = 26
- PermanentRedirect = 27
+ PermanentRedirect = 27 # 'USK@.../-1/' for example will always fail and return a key pointing to the current edition
NotAllDataFound = 28
class ConstFilenameCollision(_BaseBitFlags):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 21:20:17
|
Revision: 507
http://fclient.svn.sourceforge.net/fclient/?rev=507&view=rev
Author: jUrner
Date: 2008-07-05 14:20:24 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
fix. in keys trailing slash seems to be significant
Modified Paths:
--------------
trunk/fcp2/src/fcp2/key.py
trunk/fcp2/src/fcp2/test_fcp/test_key.py
Modified: trunk/fcp2/src/fcp2/key.py
===================================================================
--- trunk/fcp2/src/fcp2/key.py 2008-07-05 21:18:25 UTC (rev 506)
+++ trunk/fcp2/src/fcp2/key.py 2008-07-05 21:20:24 UTC (rev 507)
@@ -50,9 +50,11 @@
result = urlparse.urlsplit(string)[2]
while result.startswith('/'):
result = result[1: ]
+ hasTrailingSlash = False
while result.endswith('/'):
result = result[ :-1]
- if result:
+ hasTrailingSlash = True
+ if result and hasTrailingSlash:
result += '/'
return result
@@ -147,25 +149,27 @@
(?P<cryptoKey>[a-z0-9\-~]+?),
(?P<extra>[a-z0-9\-~]+?)
)
- /
(
- (?P<docName> (?: [^/]+?)) /
- ((?P<tail>.+) /)?
+ / (?P<docName> (?: [^/]+?))
+ (/ (?P<tail>.+?))?
)?
+ (?P<pManifest> /)?
'''
KeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
KeyType = consts.ConstKeyType.CHK
- def __init__(self, keyData=None, docName=None, tail=None):
+ def __init__(self, keyData=None, docName=None, tail=None, pManifest=False):
"""Creates a CHK key
@param keyData: (str) key data or None
@param docName: (str) docName to add to the key or None
@param tail: (str) for containers, path to item in container or None
+ @param pManifest: (bool) if True, the key points to a manifest
"""
self.keyData = keyData
self.docName = docName
self.tail = tail
+ self.pManifest= pManifest
def toString(self):
if self.keyData is None:
@@ -176,7 +180,10 @@
out.append(urllib.quote(self.docName))
if self.tail is not None:
out.append(urllib.quote(self.tail))
- return posixpath.join(*out)
+ result = posixpath.join(*out)
+ if self.pManifest:
+ result += '/'
+ return result
@classmethod
def fromString(clss, string):
@@ -185,7 +192,7 @@
result = clss.KeyPattern.match(key)
if result is not None:
d = result.groupdict()
- return clss(d['keyData'], docName=d['docName'], tail=d['tail'])
+ return clss(d['keyData'], docName=d['docName'], tail=d['tail'], pManifest=bool(d['pManifest']))
@@ -197,27 +204,29 @@
(?P<cryptoKey>[a-z0-9\-~]+?),
(?P<extra>[a-z0-9\-~]+?)
)
- /
(
- (?: (?P<docName>[^/]+?)) - (?: (?P<edition>[\d]+)) /
- ((?P<tail>.+) /)?
+ / (?: (?P<docName>[^/]+?)) - (?: (?P<edition>[\d]+))
+ (/ (?P<tail>.+?))?
)?
+ (?P<pManifest> /)?
'''
KeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
KeyType = consts.ConstKeyType.SSK
- def __init__(self, keyData=None, docName=None, edition=0, tail=None):
+ def __init__(self, keyData=None, docName=None, edition=0, tail=None, pManifest=False):
"""Creates a SSK key
@param keyData: (str) key data or None
@param docName: (str) docName to add to the key or None
@param edition: (int) desired edition
@param tail: (str) for containers, path to item in container or None
+ @param pManifest: (bool) if True, the key points to a manifest
"""
self.docName = docName
self.edition = edition
self.keyData = keyData
self.tail = tail
+ self.pManifest= pManifest
def toString(self):
if self.keyData is None:
@@ -230,7 +239,10 @@
out.append(urllib.quote(self.docName + '-' + str(self.edition)))
if self.tail is not None:
out.append(urllib.quote(self.tail))
- return posixpath.join(*out)
+ result = posixpath.join(*out)
+ if self.pManifest:
+ result += '/'
+ return result
@classmethod
def fromString(clss, string):
@@ -242,7 +254,7 @@
edition = d['edition']
if edition is not None:
edition = int(edition)
- return clss(d['keyData'], docName=d['docName'], edition=edition, tail=d['tail'])
+ return clss(d['keyData'], docName=d['docName'], edition=edition, tail=d['tail'], pManifest=bool(d['pManifest']))
@@ -250,7 +262,7 @@
class KeyKSK(_KeyBase):
_key_pattern_ = '''
(?P<keyType>KSK@)
- (?P<docName>[^/]+?) /
+ (?P<docName>[^/]+?)
'''
KeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
KeyType = consts.ConstKeyType.KSK
@@ -288,29 +300,31 @@
(?P<cryptoKey>[a-z0-9\-~]+?),
(?P<extra>[a-z0-9\-~]+?)
)
- /
(
- (?P<docName>[^/]+?) /
- (?P<edition>-?\d+) /
- ((?P<tail>.+) /)?
+ / (?P<docName>[^/]+?)
+ / (?P<edition>-?\d+)
+ (/ (?P<tail>.+?))?
)?
+ (?P<pManifest> /)?
'''
KeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
KeyType = consts.ConstKeyType.USK
- def __init__(self, keyData=None, docName=None, edition=-1, tail=None):
+ def __init__(self, keyData=None, docName=None, edition=-1, tail=None, pManifest=False):
"""Creates a USK key
@param keyData: (str) key data or None
@param docName: (str) docName to add to the key or None
@param edition: (int) desired edition
@param tail: (str) for containers, path to item in container or None
+ @param pManifest: (bool) if True, the key points to a manifest
"""
self.edition = edition
self.docName = docName
self.keyData = keyData
self.tail = tail
+ self.pManifest= pManifest
def toString(self):
if self.keyData is None:
@@ -324,7 +338,11 @@
out.append(urllib.quote(str(self.edition)))
if self.tail is not None:
out.append(urllib.quote(self.tail))
- return posixpath.join(*out)
+ result = posixpath.join(*out)
+ if self.pManifest:
+ result += '/'
+ return result
+
@classmethod
def fromString(clss, string, isQuoted=True):
@@ -336,7 +354,7 @@
edition = d['edition']
if edition is not None:
edition = int(edition)
- return clss(d['keyData'], docName=d['docName'], edition=edition, tail=d['tail'])
+ return clss(d['keyData'], docName=d['docName'], edition=edition, tail=d['tail'], pManifest=bool(d['pManifest']))
Modified: trunk/fcp2/src/fcp2/test_fcp/test_key.py
===================================================================
--- trunk/fcp2/src/fcp2/test_fcp/test_key.py 2008-07-05 21:18:25 UTC (rev 506)
+++ trunk/fcp2/src/fcp2/test_fcp/test_key.py 2008-07-05 21:20:24 UTC (rev 507)
@@ -29,17 +29,20 @@
#****************************************************************************************
class Test_normkey(unittest.TestCase):
- def test_01_addSlash(self):
+ def test_01_slashIsSignificant(self):
p = 'CHK@foo'
+ self.assertEqual(fcp2.keyNormkey(p), 'CHK@foo')
+
+ p = 'CHK@foo/'
self.assertEqual(fcp2.keyNormkey(p), 'CHK@foo/')
-
+
def test_02_stripHost(self):
p = 'freenet:CHK@foo'
- self.assertEqual(fcp2.keyNormkey(p), 'CHK@foo/')
+ self.assertEqual(fcp2.keyNormkey(p), 'CHK@foo')
p = 'http:///CHK@foo'
- self.assertEqual(fcp2.keyNormkey(p), 'CHK@foo/')
-
+ self.assertEqual(fcp2.keyNormkey(p), 'CHK@foo')
+
def test_stripSlashes(self):
p = 'http://////CHK@foo///////'
self.assertEqual(fcp2.keyNormkey(p), 'CHK@foo/')
@@ -59,21 +62,50 @@
self.assertEqual(myKey.keyData, DummyKeyData)
self.assertEqual(myKey.docName, None)
self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest, False)
self.assertEqual(myKey.toString(), p)
+ p = 'CHK@' + DummyKeyData + '/'
+ myKey = fcp2.KeyCHK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, None)
+ self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest, True)
+ self.assertEqual(myKey.toString(), p)
+
+
p = 'CHK@' + DummyKeyData + '/foo'
myKey = fcp2.KeyCHK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
self.assertEqual(myKey.docName, 'foo')
self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest, False)
self.assertEqual(myKey.toString(), p)
+ p = 'CHK@' + DummyKeyData + '/foo/'
+ myKey = fcp2.KeyCHK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest, True)
+ self.assertEqual(myKey.toString(), p)
+
+
p = 'CHK@' + DummyKeyData + '/foo/bar/baz'
myKey = fcp2.KeyCHK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
self.assertEqual(myKey.docName, 'foo')
self.assertEqual(myKey.tail, 'bar/baz')
+ self.assertEqual(myKey.pManifest, False)
self.assertEqual(myKey.toString(), p)
+
+ p = 'CHK@' + DummyKeyData + '/foo/bar/baz/'
+ myKey = fcp2.KeyCHK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.tail, 'bar/baz')
+ self.assertEqual(myKey.pManifest, True)
+ self.assertEqual(myKey.toString(), p)
def test_quote(self):
@@ -99,24 +131,56 @@
self.assertEqual(myKey.docName, None)
self.assertEqual(myKey.edition, None)
self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest, False)
self.assertEqual(myKey.toString(), p)
+ p = 'SSK@' + DummyKeyData + '/'
+ myKey = fcp2.KeySSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, None)
+ self.assertEqual(myKey.edition, None)
+ self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest,True)
+ self.assertEqual(myKey.toString(), p)
+
+
p = 'SSK@' + DummyKeyData + '/foo-1'
myKey = fcp2.KeySSK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
self.assertEqual(myKey.docName, 'foo')
self.assertEqual(myKey.edition, 1)
self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest, False)
self.assertEqual(myKey.toString(), p)
+ p = 'SSK@' + DummyKeyData + '/foo-1/'
+ myKey = fcp2.KeySSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.edition, 1)
+ self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest, True)
+ self.assertEqual(myKey.toString(), p)
+
+
p = 'SSK@' + DummyKeyData + '/foo-1/bar/baz'
myKey = fcp2.KeySSK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
self.assertEqual(myKey.docName, 'foo')
self.assertEqual(myKey.edition, 1)
self.assertEqual(myKey.tail, 'bar/baz')
+ self.assertEqual(myKey.pManifest, False)
self.assertEqual(myKey.toString(), p)
+ p = 'SSK@' + DummyKeyData + '/foo-1/bar/baz/'
+ myKey = fcp2.KeySSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.edition, 1)
+ self.assertEqual(myKey.tail, 'bar/baz')
+ self.assertEqual(myKey.pManifest, True)
+ self.assertEqual(myKey.toString(), p)
+
def test_quote(self):
p = 'SSK@' + DummyKeyData + '/foo -1'
@@ -166,24 +230,56 @@
self.assertEqual(myKey.docName, None)
self.assertEqual(myKey.edition, None)
self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest, False)
self.assertEqual(myKey.toString(), p)
+ p = 'USK@' + DummyKeyData + '/'
+ myKey = fcp2.KeyUSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, None)
+ self.assertEqual(myKey.edition, None)
+ self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest, True)
+ self.assertEqual(myKey.toString(), p)
+
+
p = 'USK@' + DummyKeyData + '/foo/1'
myKey = fcp2.KeyUSK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
self.assertEqual(myKey.docName, 'foo')
self.assertEqual(myKey.edition, 1)
self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest, False)
self.assertEqual(myKey.toString(), p)
+ p = 'USK@' + DummyKeyData + '/foo/1/'
+ myKey = fcp2.KeyUSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.edition, 1)
+ self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.pManifest, True)
+ self.assertEqual(myKey.toString(), p)
+
+
p = 'USK@' + DummyKeyData + '/foo/1/bar/baz'
myKey = fcp2.KeyUSK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
self.assertEqual(myKey.docName, 'foo')
self.assertEqual(myKey.edition, 1)
self.assertEqual(myKey.tail, 'bar/baz')
+ self.assertEqual(myKey.pManifest, False)
self.assertEqual(myKey.toString(), p)
+ p = 'USK@' + DummyKeyData + '/foo/1/bar/baz/'
+ myKey = fcp2.KeyUSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.edition, 1)
+ self.assertEqual(myKey.tail, 'bar/baz')
+ self.assertEqual(myKey.pManifest, True)
+ self.assertEqual(myKey.toString(), p)
+
def test_edition(self):
@@ -270,8 +366,8 @@
Test_SSK,
Test_KSK,
Test_USK,
- Test_TypeKey,
- Test_Key,
+ #Test_TypeKey,
+ #Test_Key,
)
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-07-05 21:18:16
|
Revision: 506
http://fclient.svn.sourceforge.net/fclient/?rev=506&view=rev
Author: jUrner
Date: 2008-07-05 14:18:25 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
a few notes
Modified Paths:
--------------
trunk/fcp2/src/fcp2/client.py
Modified: trunk/fcp2/src/fcp2/client.py
===================================================================
--- trunk/fcp2/src/fcp2/client.py 2008-07-05 18:56:29 UTC (rev 505)
+++ trunk/fcp2/src/fcp2/client.py 2008-07-05 21:18:25 UTC (rev 506)
@@ -186,6 +186,7 @@
#-------------------------------------------------------------------------------------------------------------------------------------------------
+
# reminders to self
#------------------------------------------------------------------------------------------------------------------------------------------------
# Key()
@@ -193,8 +194,14 @@
# we do not allow passing strings as uris. putting a CHK gets in the way here. would have to add another
# special case to handle 'CHK@myfilename' on input. so for uniformity reasons keys are enforced.
#------------------------------------------------------------------------------------------------------------------------------------------------
+# clientGet('USK@.../whatever/-1')
+#
+# will trigger a FetchError(PermanentRedirect) with the highest available version as RedirectURI
+# we don't handle this automatically, cos it could be the desired result. maybe implement a flag
+# someday to handle this
+#
+#------------------------------------------------------------------------------------------------------------------------------------------------
-
import os, sys
import atexit
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 18:57:10
|
Revision: 505
http://fclient.svn.sourceforge.net/fclient/?rev=505&view=rev
Author: jUrner
Date: 2008-07-05 11:56:29 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
update min node build
Modified Paths:
--------------
trunk/fcp2/src/fcp2/client.py
Modified: trunk/fcp2/src/fcp2/client.py
===================================================================
--- trunk/fcp2/src/fcp2/client.py 2008-07-05 12:45:13 UTC (rev 504)
+++ trunk/fcp2/src/fcp2/client.py 2008-07-05 18:56:29 UTC (rev 505)
@@ -253,7 +253,7 @@
"""
ExpectedFcpVersion = 2.0
- ExpectedNodeBuild = 1107
+ ExpectedNodeBuild = 1153
DefaultFcpHost = os.environ.get('FCP_HOST', '127.0.0.1')
DefaultFcpPort = int(os.environ.get('FCP_PORT', '9481'))
MaxSizeKeyInfo = 32768
@@ -277,9 +277,10 @@
"""
self._connectionName = self.setConnectionName(connectionName)
self._ddaTests = [] # currently running DDA tests (request0, ... requestN)
- self.events = events.Events()
self._nodeHelloMessage = None
self._requests = {} # currently running requests (requestIdentifier --> request)
+
+ self.events = events.Events()
self.ioHandler = iohandler.IOHandler()
for event in self.events:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 12:45:04
|
Revision: 504
http://fclient.svn.sourceforge.net/fclient/?rev=504&view=rev
Author: jUrner
Date: 2008-07-05 05:45:13 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
symbol names where broken
Modified Paths:
--------------
trunk/fcp2/src/fcp2/types.py
Modified: trunk/fcp2/src/fcp2/types.py
===================================================================
--- trunk/fcp2/src/fcp2/types.py 2008-07-05 12:42:19 UTC (rev 503)
+++ trunk/fcp2/src/fcp2/types.py 2008-07-05 12:45:13 UTC (rev 504)
@@ -155,10 +155,10 @@
result = clss.NumberPattern.split(value)
if len(result) == 3:
foo, foundInt, tail = result
- if tail in consts.TimeDeltaPostfix.MembersAll:
+ if tail in consts.ConstTimeDeltaPostfix.MembersAll:
num = int(foundInt)
return (num, tail)
- return (-1, consts.TimeDeltaPostfix.Second)
+ return (-1, consts.ConstTimeDeltaPostfix.Second)
class TypePercent(TypeFloat): pass
class TypeUri(Type): pass
@@ -199,13 +199,13 @@
result = clss.NumberPattern.split(value)
if len(result) == 4:
foo, foundFloat, foundInt, tail = result
- if tail in consts.ByteAmountPostfix.MembersAll:
+ if tail in consts.ConstByteAmountPostfix.MembersAll:
if foundFloat:
num = float(foundFloat)
else:
num = int(foundInt)
return (num, tail)
- return (-1, consts.ByteAmountPostfix.Bytes)
+ return (-1, consts.ConstByteAmountPostfix.Bytes)
class TypePercent(TypeFloat): pass
class TypeUri(Type): pass
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 12:42:10
|
Revision: 503
http://fclient.svn.sourceforge.net/fclient/?rev=503&view=rev
Author: jUrner
Date: 2008-07-05 05:42:19 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
some more docs
beautification
some more message params
Modified Paths:
--------------
trunk/fcp2/src/fcp2/message.py
Modified: trunk/fcp2/src/fcp2/message.py
===================================================================
--- trunk/fcp2/src/fcp2/message.py 2008-07-05 12:03:40 UTC (rev 502)
+++ trunk/fcp2/src/fcp2/message.py 2008-07-05 12:42:19 UTC (rev 503)
@@ -179,12 +179,10 @@
pass
- #TODO:
- # 1. if one setter / getter fails no setter / getter result should assumed to be valid
- # 2. log errors
- #
- #
def _setPersistentParams(self, persistentData):
+ """updates message with persisten params
+ @param persistentData: (str)
+ """
params = persistentData.split(PersistentParamsSep)
if len(params) > len(self._persistent_params_):
raise ValueError('Too many parameters in persistentData')
@@ -195,6 +193,9 @@
def _getPersistentParams(self):
+ """retrieves persisten params from the message
+ @return: (str) persistent params
+ """
out = []
for n, (getter, setter) in enumerate(self._persistent_params_):
#TODO: check if PersistentParamsSep is in data returned
@@ -203,6 +204,10 @@
def _restoreParams(self, params):
+ """updates the message with mesasage params
+ @param params: (dict) containing message params
+ @note: the parameter values will be converted to python types in the call
+ """
for paramName, paramValue in params.items():
paramType = self._param_types_.get(paramName, None)
if paramType is not None:
@@ -212,6 +217,8 @@
def _getDataLength(self):
+ """returns the length of the data section attatched to the message
+ @return: (int) length"""
return 0
#********************************************************************************
@@ -549,8 +556,7 @@
_param_types_ = {
}
-#########################################
-#########################################
+
class MsgConfigData(_MessageBase):
name = consts.ConstMessage.ConfigData
_additional_params_ = {}
@@ -713,15 +719,13 @@
_param_types_ = {
}
-#####################################
-#####################################
+
class MsgModifyConfig(_MessageBase):
name = consts.ConstMessage.ModifyConfig
_additional_params_ = {}
_param_types_ = config._ConfigMessageParamTypes
-#####################################
-#####################################
+
class MsgModifyPeer(_MessageBase):
name = consts.ConstMessage.ModifyPeer
_additional_params_ = {}
@@ -744,8 +748,7 @@
'Global': types.TypeBool,
}
-###################################
-###################################
+
class MsgNodeData(_MessageBase):
name = consts.ConstMessage.NodeData
_additional_params_ = {}
@@ -870,8 +873,7 @@
'Testnet': types.TypeBool,
}
-#######################################
-#######################################
+
class MsgPeer(_MessageBase):
name = consts.ConstMessage.Peer
_additional_params_ = {}
@@ -892,8 +894,7 @@
_param_types_ = {
}
-#######################################
-#######################################
+
class MsgPersistentGet(_MessageBase):
name = consts.ConstMessage.PersistentGet
_additional_params_ = _AdditionalGetParams
@@ -910,8 +911,7 @@
return False
return True
-#######################################
-#######################################
+
class MsgPersistentPut(_MessageBase):
name = consts.ConstMessage.PersistentPut
_additional_params_ = _AdditionalPutParams
@@ -1006,15 +1006,14 @@
'URI': key.TypeKey,
}
-#####################################
-######################################
-#!! not implemented
-#TODO: has more params
+
class MsgPutSuccessful(_MessageBase):
name = consts.ConstMessage.PutSuccessful
_additional_params_ = {}
_param_types_ = {
+ 'CompletionTime': types.TypeTime,
'Global': types.TypeBool,
+ 'StartupTime': types.TypeTime,
'URI': key.TypeKey,
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 12:03:30
|
Revision: 502
http://fclient.svn.sourceforge.net/fclient/?rev=502&view=rev
Author: jUrner
Date: 2008-07-05 05:03:40 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
remove some todos
Modified Paths:
--------------
trunk/fcp2/src/fcp2/test_fcp/test_client.py
Modified: trunk/fcp2/src/fcp2/test_fcp/test_client.py
===================================================================
--- trunk/fcp2/src/fcp2/test_fcp/test_client.py 2008-07-05 11:51:22 UTC (rev 501)
+++ trunk/fcp2/src/fcp2/test_fcp/test_client.py 2008-07-05 12:03:40 UTC (rev 502)
@@ -2142,8 +2142,6 @@
#***********************************************************************************
#
#***********************************************************************************
-#TODO: testDDAReadDenied_ReadDissallowed
-#TODO: testDDAReadDenied
class Test_DDA(BaseTestClient):
def test_DDAWriteDenied(self):
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 11:51:14
|
Revision: 501
http://fclient.svn.sourceforge.net/fclient/?rev=501&view=rev
Author: jUrner
Date: 2008-07-05 04:51:22 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
added DDA test cases
Modified Paths:
--------------
trunk/fcp2/src/fcp2/test_fcp/test_client.py
Modified: trunk/fcp2/src/fcp2/test_fcp/test_client.py
===================================================================
--- trunk/fcp2/src/fcp2/test_fcp/test_client.py 2008-07-05 11:25:21 UTC (rev 500)
+++ trunk/fcp2/src/fcp2/test_fcp/test_client.py 2008-07-05 11:51:22 UTC (rev 501)
@@ -2143,8 +2143,7 @@
#
#***********************************************************************************
#TODO: testDDAReadDenied_ReadDissallowed
-#TODO: testDDAWriteDenied
-#TODO: testDDAWriteDenied_WriteDisallowed
+#TODO: testDDAReadDenied
class Test_DDA(BaseTestClient):
def test_DDAWriteDenied(self):
@@ -2168,8 +2167,8 @@
Code=25, # DDADenied
Identifier=myIdentifier,
ExtraDescription='An error occured',
- Fatal='false',
- Global='false',
+ Fatal=False,
+ Global=False,
)
# client should respond with a TestDDARequest
@@ -2204,7 +2203,7 @@
self.sendResponseMessage(
'TestDDAComplete',
Directory=DIR,
- WriteDirectoryAllowed='true',
+ WriteDirectoryAllowed=True,
)
# check if our tempfile was removed
@@ -2219,20 +2218,241 @@
# respond with a PersistentGet
self.sendResponseMessage(
'PersistentGet',
- Started='false',
+ Started=False,
**msg.params
)
- requests = self.client.getRequests()
- self.assertEqual(len(requests), 1)
+ self.assertEqual(len(requestsAll), 1)
+ self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
+
+
+ def test_DDAWriteDenied_writeDisallowed(self):
+ self.connectClient()
+
+ # request a file
+ myKey = fcp2.Key('KSK@foo')
+ myIdentifier = self.client.getFile(
+ myKey,
+ os.path.join(DIR, 'DDATest.txt')
+ )
+ myRequest = self.client.getRequest(myIdentifier)
+ requestsAll = self.client.getRequests()
+
+ # client schould send a ClientGet
+ self.assertHasNextMessage(fcp2.MsgClientGet)
+
+ # respond with a ProtocolError
+ self.sendResponseMessage(
+ 'ProtocolError',
+ Code=25, # DDADenied
+ Identifier=myIdentifier,
+ ExtraDescription='An error occured',
+ Fatal=False,
+ Global=False,
+ )
+
+ # client should respond with a TestDDARequest
+ self.assertHasNextMessage(
+ fcp2.MsgTestDDARequest,
+ ('Directory', DIR),
+ ('WantWriteDirectory', True)
+ )
+
+ # respond with a TestDDAReply message
+ writeContent = 'blah'
+ fd, fpath = tempfile.mkstemp(dir=DIR)
+ os.close(fd)
+ self.sendResponseMessage(
+ 'TestDDAReply',
+ Directory=DIR,
+ WriteFilename=fpath,
+ ContentToWrite=writeContent,
+ )
+
+ # client should respond with a TestDDAResponse
+ self.assertHasNextMessage(
+ fcp2.MsgTestDDAResponse,
+ ('Directory', DIR)
+ )
+
+ # check if content was written
+ with open(fpath) as fp:
+ self.failUnless(fp.read() == writeContent)
+
+ # respond with a TestDDAComplete message
+ self.sendResponseMessage(
+ 'TestDDAComplete',
+ Directory=DIR,
+ WriteDirectoryAllowed=False,
+ )
+
+ # check if our tempfile was removed
+ self.failIf(os.path.isfile(fpath))
+
+ # client schould trigger a RequestFailed event
+ self.assertHasNextEvent(
+ self.client.events.RequestFailed,
+ myRequest,
+ )
+
+ self.failIf(requestsAll)
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
- del requestsAll[myIdentifier]
+
+ def test_DDAReadDenied(self):
+ self.connectClient()
+
+ # request a file
+ myKey = fcp2.Key('KSK@foo')
+ myIdentifier = self.client.putFile(
+ myKey,
+ os.path.join(DIR, 'DDATest.txt')
+ )
+ myRequest = self.client.getRequest(myIdentifier)
+ requestsAll = self.client.getRequests()
+
+ # client schould send a ClientGet
+ self.assertHasNextMessage(fcp2.MsgClientPut)
+
+ # respond with a ProtocolError
+ self.sendResponseMessage(
+ 'ProtocolError',
+ Code=25, # DDADenied
+ Identifier=myIdentifier,
+ ExtraDescription='An error occured',
+ Fatal=False,
+ Global=False,
+ )
+
+ # client should respond with a TestDDARequest
+ self.assertHasNextMessage(
+ fcp2.MsgTestDDARequest,
+ ('Directory', DIR),
+ ('WantReadDirectory', True)
+ )
+
+ #
+ readContent = '123456789'
+ readFilename = os.path.join(DIR, 'DDATest.txt')
+ fp = open(readFilename, 'w')
+ self.tmpfiles.append(readFilename)
+ try:
+ fp.write(readContent)
+ finally:
+ fp.close()
+
+ self.sendResponseMessage(
+ 'TestDDAReply',
+ Directory=DIR,
+ ReadFilename=readFilename,
+ )
+
+ # client should respond with a TestDDAResponse
+ self.assertHasNextMessage(
+ fcp2.MsgTestDDAResponse,
+ ('Directory', DIR),
+ ('ReadContent', readContent)
+ )
+
+ # respond with a TestDDAComplete message
+ self.sendResponseMessage(
+ 'TestDDAComplete',
+ Directory=DIR,
+ ReadDirectoryAllowed=True,
+ )
+
+ # client sahould send a new ClientGet
+ msg = self.assertHasNextMessage(fcp2.MsgClientPut)
+
+ # no events should have been triggered upo to now
+ self.assertHasNextEvent(None)
+
+ # respond with a PersistentGet
+ self.sendResponseMessage(
+ 'PersistentPut',
+ **msg.params
+ )
+
+ self.assertEqual(len(requestsAll), 1)
+ self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
+
+
+ def test_DDAReadDenied_readDisallowed(self):
+ self.connectClient()
+
+ # request a file
+ myKey = fcp2.Key('KSK@foo')
+ myIdentifier = self.client.putFile(
+ myKey,
+ os.path.join(DIR, 'DDATest.txt')
+ )
+ myRequest = self.client.getRequest(myIdentifier)
+ requestsAll = self.client.getRequests()
+
+ # client schould send a ClientGet
+ self.assertHasNextMessage(fcp2.MsgClientPut)
+
+ # respond with a ProtocolError
+ self.sendResponseMessage(
+ 'ProtocolError',
+ Code=25, # DDADenied
+ Identifier=myIdentifier,
+ ExtraDescription='An error occured',
+ Fatal=False,
+ Global=False,
+ )
+
+ # client should respond with a TestDDARequest
+ self.assertHasNextMessage(
+ fcp2.MsgTestDDARequest,
+ ('Directory', DIR),
+ ('WantReadDirectory', True)
+ )
+
+ #
+ readContent = '123456789'
+ readFilename = os.path.join(DIR, 'DDATest.txt')
+ fp = open(readFilename, 'w')
+ self.tmpfiles.append(readFilename)
+ try:
+ fp.write(readContent)
+ finally:
+ fp.close()
+
+ self.sendResponseMessage(
+ 'TestDDAReply',
+ Directory=DIR,
+ ReadFilename=readFilename,
+ )
+
+ # client should respond with a TestDDAResponse
+ self.assertHasNextMessage(
+ fcp2.MsgTestDDAResponse,
+ ('Directory', DIR),
+ ('ReadContent', readContent)
+ )
+
+ # respond with a TestDDAComplete message
+ self.sendResponseMessage(
+ 'TestDDAComplete',
+ Directory=DIR,
+ ReadDirectoryAllowed=False,
+ )
+
+ # client schould trigger a RequestFailed event
+ self.assertHasNextEvent(
+ self.client.events.RequestFailed,
+ myRequest,
+ )
+
self.failIf(requestsAll)
+ self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
-
#***********************************************************************************
#
#***********************************************************************************
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 11:25:13
|
Revision: 500
http://fclient.svn.sourceforge.net/fclient/?rev=500&view=rev
Author: jUrner
Date: 2008-07-05 04:25:21 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
beautify
Modified Paths:
--------------
trunk/fcp2/src/fcp2/test_fcp/test_client.py
Modified: trunk/fcp2/src/fcp2/test_fcp/test_client.py
===================================================================
--- trunk/fcp2/src/fcp2/test_fcp/test_client.py 2008-07-05 11:24:52 UTC (rev 499)
+++ trunk/fcp2/src/fcp2/test_fcp/test_client.py 2008-07-05 11:25:21 UTC (rev 500)
@@ -2179,13 +2179,6 @@
('WantWriteDirectory', True)
)
- #msg = self.nextMessage()
- #self.failIf(msg is None)
- #self.assertEqual(msg.name, fcp2.MsgTestDDARequest)
- ##self.assertEqual(msg['Directory'], DIR)
- #self.failIf(not msg['WantWriteDirectory'])
-
-
# respond with a TestDDAReply message
writeContent = 'blah'
fd, fpath = tempfile.mkstemp(dir=DIR)
@@ -2240,10 +2233,6 @@
self.failIf(requestsAll)
- #def testDDAReadDenied(self):
-
- # pass
-
#***********************************************************************************
#
#***********************************************************************************
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 11:24:43
|
Revision: 499
http://fclient.svn.sourceforge.net/fclient/?rev=499&view=rev
Author: jUrner
Date: 2008-07-05 04:24:52 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
beautify
Modified Paths:
--------------
trunk/fcp2/src/fcp2/test_fcp/test_message.py
Modified: trunk/fcp2/src/fcp2/test_fcp/test_message.py
===================================================================
--- trunk/fcp2/src/fcp2/test_fcp/test_message.py 2008-07-05 11:24:24 UTC (rev 498)
+++ trunk/fcp2/src/fcp2/test_fcp/test_message.py 2008-07-05 11:24:52 UTC (rev 499)
@@ -13,16 +13,14 @@
def __del__(self): sys.path.pop(0)
hack = _RelImportHack(3)
-from fcp2.client import Client
-from fcp2 import consts
+import fcp2
-
del hack
#<-- rel import hack
#****************************************************************************************
#
#****************************************************************************************
-class TestMessageObject(unittest.TestCase):
+class Test_Message(unittest.TestCase):
pass
@@ -32,7 +30,7 @@
#*********************************************************************************
def suite():
tests = (
- TestMessageObject,
+ Test_Message,
)
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-07-05 11:24:15
|
Revision: 498
http://fclient.svn.sourceforge.net/fclient/?rev=498&view=rev
Author: jUrner
Date: 2008-07-05 04:24:24 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
added some tests for clientGet/Put
Modified Paths:
--------------
trunk/fcp2/src/fcp2/test_fcp/test_client.py
Modified: trunk/fcp2/src/fcp2/test_fcp/test_client.py
===================================================================
--- trunk/fcp2/src/fcp2/test_fcp/test_client.py 2008-07-05 11:19:36 UTC (rev 497)
+++ trunk/fcp2/src/fcp2/test_fcp/test_client.py 2008-07-05 11:24:24 UTC (rev 498)
@@ -30,7 +30,7 @@
##TestAgainstNode = 0 # don't know how to test against node. Do not touch this!
# for testing some valid key data
-DummyKeyData = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA'
+DummyKeyData = 'aaa,bbb,ccc'
#***********************************************************************************
#
#***********************************************************************************
@@ -639,7 +639,7 @@
#***********************************************************************************
#
#***********************************************************************************
-# TODO: no idea how t test this
+# TODO: no idea how to test this
class Test_startNode(BaseTestClient):
pass
@@ -859,10 +859,14 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.failUnless(self.ioOpen())
-
#***********************************************************************************
#
#***********************************************************************************
+#TODO: not tested
+class Test_clientGet(BaseTestClient): pass
+#***********************************************************************************
+#
+#***********************************************************************************
class Test_getData(BaseTestClient):
def test_100_request_registered(self):
@@ -1455,428 +1459,24 @@
#***********************************************************************************
#
#***********************************************************************************
-class Test_clientGet(BaseTestClient):
+class Test_clientPut(BaseTestClient):
- def test_2000_ClientGetRegistered(self):
-
- # request a arbitrary file
- myIdentifier = self.client.getData(
- 'arbitrary-uri',
- )
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
+ def test_keyTailIsDisallowed(self):
+ self.connectClient()
- self.assertHasNextMessage(fcp2.MsgClientGet)
- self.assertHasNextEvent(None)
-
- self.failUnless(myIdentifier in requestsAll)
- self.assertEqual(myIdentifier, myRequest['Identifier'])
- self.assertEqual(myRequest['RequestStatus'], fcp2.ConstRequestStatus.Null)
+ # key.tail is not allowed in all put actions
+ myKey = fcp2.KeyCHK(keyData=DummyKeyData, tail='foo')
+ self.assertRaises(ValueError, self.client.clientPut, fcp2.ConstRequestType.PutData, myKey, data='foo')
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
+ myKey = fcp2.KeySSK(keyData=DummyKeyData, tail='foo')
+ self.assertRaises(ValueError, self.client.clientPut, fcp2.ConstRequestType.PutData, myKey, data='foo')
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
+ myKey = fcp2.KeyUSK(keyData=DummyKeyData, tail='foo')
+ self.assertRaises(ValueError, self.client.clientPut, fcp2.ConstRequestType.PutData, myKey, data='foo')
- def test_2001_GetData_Success(self):
-
- # request a arbitrary file
- myIdentifier = self.client.getData(
- 'arbitrary-uri',
- )
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
-
- self.assertHasNextMessage(fcp2.MsgClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # simulate a progress
- self.sendResponseMessage(
- 'SimpleProgress',
- Identifier=myIdentifier,
- Total=10,
- Required=8,
- Failed=0,
- FatallyFailed=0,
- FinalizedTotal='true',
- Succeeded=1,
- )
- self.assertHasNextEvent(
- self.client.events.RequestProgress,
- )
-
- # finalize request
- data = 'foo'
- params = {
- 'Identifier': myIdentifier,
- 'Global': 'false',
- 'DataLength': len(data),
- 'Metadata.ContentType': 'any',
- }
- self.sendResponseMessage(
- 'DataFound',
- **params
- )
- # we don't expect an event here....
- self.assertHasNextEvent(None)
-
- self.sendResponseMessage(
- 'AllData',
- data=data,
- Identifier=myIdentifier,
- Global='false',
- DataLength=len(data),
- )
-
- # client should complete and remove the request
- self.assertHasNextEvent(
- self.client.events.RequestCompleted,
- fcp2.MsgClientGet,
- ('RequestStatus', fcp2.ConstRequestStatus.Success |
- fcp2.ConstRequestStatus.RemovedFromQueue |
- fcp2.ConstRequestStatus.Completed
- ),
- data=data
- )
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['RequestStatus'] & fcp2.ConstRequestStatus.Completed)
-
-
- # cheat a bit to test peristence == Forever (client should not remove request)
- requestsAll[myIdentifier] =myRequest
- myRequest['Persistence'] = fcp2.Persistence.Forever
- myRequest['RequestStatus'] &= ~(fcp2.ConstRequestStatus.Success |
- fcp2.ConstRequestStatus.Completed |
- fcp2.ConstRequestStatus.RemovedFromQueue
- )
- self.sendResponseMessage(
- 'AllData',
- data=data,
- Identifier=myIdentifier,
- Global='false',
- DataLength=len(data),
- )
-
- # client should complete but not remove the request
- self.assertHasNextEvent(
- self.client.events.RequestCompleted,
- fcp2.MsgClientGet,
- ('RequestStatus', fcp2.ConstRequestStatus.Success | fcp2.ConstRequestStatus.Completed),
- data=data
- )
- self.failUnless(myIdentifier in requestsAll)
- self.failUnless(myRequest['RequestStatus'] & fcp2.ConstRequestStatus.Completed)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
- def test_2002_GetData_Failure(self):
-
- # request a arbitrary file
- myIdentifier = self.client.getData(
- 'arbitrary-uri',
- )
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
-
- self.assertHasNextMessage(fcp2.MsgClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- self.sendResponseMessage(
- 'GetFailed',
- Code='28', # All data not found
- Identifier=myIdentifier,
- Global='false',
- # blah.. more here
- )
-
- # client should complete request and remove it
- self.assertHasNextEvent(
- self.client.events.RequestFailed,
- fcp2.MsgClientGet,
- ('RequestStatus', fcp2.ConstRequestStatus.Error |
- fcp2.ConstRequestStatus.RemovedFromQueue |
- fcp2.ConstRequestStatus.Completed
- ),
- )
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- #return
-
- # cheat a bit to test peristence == Forever (client should not remove request)
-
- requestsAll[myIdentifier] =myRequest
- myRequest['Persistence'] = fcp2.Persistence.Forever
- myRequest['RequestStatus'] &= ~(fcp2.ConstRequestStatus.Error |
- fcp2.ConstRequestStatus.Completed |
- fcp2.ConstRequestStatus.RemovedFromQueue
- )
- self.sendResponseMessage(
- 'GetFailed',
- Code='28', # All data not found
- Identifier=myIdentifier,
- Global='false',
- # blah.. more here
- )
-
- # client should complete but not remove the request
- self.assertHasNextEvent(
- self.client.events.RequestFailed,
- fcp2.MsgClientGet,
- ('RequestStatus', fcp2.ConstRequestStatus.Error | fcp2.ConstRequestStatus.Completed),
- )
- self.failUnless(myIdentifier in requestsAll)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- del requestsAll[myIdentifier]
- self.failIf(requestsAll)
-
-
- def test_2003_GetFile_Success(self):
-
- # request a arbitrary file
- myIdentifier = self.client.getFile(
- 'arbitrary-uri',
- 'arbitryry.txt'
- )
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
-
- self.assertHasNextMessage(fcp2.MsgClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- data = 'foo'
- params = {
- 'Identifier': myIdentifier,
- 'Global': 'false',
- 'DataLength': 123456,
- 'Metadata.ContentType': 'any',
- }
- self.sendResponseMessage(
- 'DataFound',
- **params
- )
- self.assertHasNextEvent(
- self.client.events.RequestCompleted,
- fcp2.MsgClientGet,
- ('RequestStatus', fcp2.ConstRequestStatus.Success |
- fcp2.ConstRequestStatus.RemovedFromQueue |
- fcp2.ConstRequestStatus.Completed
- ),
- )
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['RequestStatus'] & fcp2.ConstRequestStatus.Completed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
- def test_2004_GetFile_Failure(self):
-
- # request a arbitrary file
- myIdentifier = self.client.getFile(
- 'arbitrary-uri',
- 'arbitryry.txt'
- )
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
-
- self.assertHasNextMessage(fcp2.MsgClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- self.sendResponseMessage(
- 'GetFailed',
- Code='28', # All data not found
- Identifier=myIdentifier,
- Global='false',
- # blah.. more here
- )
-
- self.assertHasNextEvent(
- self.client.events.RequestFailed,
- fcp2.MsgClientGet,
- ('RequestStatus', fcp2.ConstRequestStatus.Error |
- fcp2.ConstRequestStatus.RemovedFromQueue |
- fcp2.ConstRequestStatus.Completed
- ),
- )
- self.failIf(myIdentifier in requestsAll)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
- def test_2005_GetKeyInfo_Success(self):
-
- # request a arbitrary uri
- myIdentifier = self.client.getKeyInfo(
- 'arbitrary-uri',
- )
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
-
- self.assertHasNextMessage(fcp2.MsgClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- data = 'foo'
- params = {
- 'Identifier': myIdentifier,
- 'Global': 'false',
- 'DataLength': 123456,
- 'Metadata.ContentType': 'any',
- }
- self.sendResponseMessage(
- 'DataFound',
- **params
- )
- self.assertHasNextEvent(
- self.client.events.RequestCompleted,
- fcp2.MsgClientGet,
- ('RequestStatus', fcp2.ConstRequestStatus.Success |
- fcp2.ConstRequestStatus.RemovedFromQueue |
- fcp2.ConstRequestStatus.Completed
- ),
- )
- self.failIf(myIdentifier in requestsAll)
- self.failUnless(myRequest['RequestStatus'] & fcp2.ConstRequestStatus.Completed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
- def test_2006_GetKeyInfo_TooBig(self):
-
- # test specdial case where ProtocolError.TooBig is handled as success
- # request a arbitrary uri
- myIdentifier = self.client.getKeyInfo(
- 'arbitrary-uri',
- )
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
-
- self.assertHasNextMessage(fcp2.MsgClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- self.sendResponseMessage(
- 'GetFailed',
- Code='21', # Too big
- Identifier=myIdentifier,
- Global='false',
- # blah.. more here
- )
- self.assertHasNextEvent(
- self.client.events.RequestCompleted,
- fcp2.MsgClientGet,
- ('RequestStatus', fcp2.ConstRequestStatus.Success |
- fcp2.ConstRequestStatus.RemovedFromQueue |
- fcp2.ConstRequestStatus.Completed
- ),
- )
- self.failUnless(myRequest['RequestStatus'] & fcp2.ConstRequestStatus.Completed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
-
-
- def test_2007_GetKeyInfo_Failure(self):
-
- # request a arbitrary file
- myIdentifier = self.client.getKeyInfo(
- 'arbitrary-uri',
- )
- myRequest = self.client.getRequest(myIdentifier)
- requestsAll = self.client.getRequests()
-
- self.assertHasNextMessage(fcp2.MsgClientGet)
-
- # respond to the file request
- self.sendResponseMessage(
- 'PersistentGet',
- Started='false',
- **myRequest.params
- )
-
- # finalize request
- self.sendResponseMessage(
- 'GetFailed',
- Code='28', # All data not found
- Identifier=myIdentifier,
- Global='false',
- # blah.. more here
- )
- self.assertHasNextEvent(
- self.client.events.RequestFailed,
- fcp2.MsgClientGet,
- ('RequestStatus', fcp2.ConstRequestStatus.Error |
- fcp2.ConstRequestStatus.RemovedFromQueue |
- fcp2.ConstRequestStatus.Completed
- ),
- )
- self.failUnless(myRequest['RequestStatus'] & fcp2.ConstRequestStatus.Completed)
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
-
- self.failIf(requestsAll)
-
#***********************************************************************************
#
#***********************************************************************************
-#TODO: check if TargetFilename handling is ok for CHKs
class Test_putData(BaseTestClient):
def test_putData_Success(self):
@@ -1946,6 +1546,8 @@
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.failIf(requestsAll)
+
+
#***********************************************************************************
#
#***********************************************************************************
@@ -3162,10 +2764,12 @@
Test_getConfig,
Test_modifyConfig,
+ Test_clientGet,
Test_getData,
Test_getFile,
Test_getKeyInfo,
+ Test_clientPut,
Test_putData,
Test_putDir,
Test_putFile,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 11:19:31
|
Revision: 497
http://fclient.svn.sourceforge.net/fclient/?rev=497&view=rev
Author: jUrner
Date: 2008-07-05 04:19:36 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
user data is optional
Modified Paths:
--------------
trunk/fcp2/src/fcp2/client.py
Modified: trunk/fcp2/src/fcp2/client.py
===================================================================
--- trunk/fcp2/src/fcp2/client.py 2008-07-05 11:17:44 UTC (rev 496)
+++ trunk/fcp2/src/fcp2/client.py 2008-07-05 11:19:36 UTC (rev 497)
@@ -1507,8 +1507,8 @@
def clientPut(self,
requestType,
uri,
- userData,
- persistentUserData,
+ userData=None,
+ persistentUserData=None,
data=None,
items=None,
**msgParams
@@ -1517,8 +1517,8 @@
@param requestType: (L{consts.ConstRequestType}). Can be PutData, PutDir or PutMultiple
@param uri: (str) key or Uri
@param data: (str) for L{consts.ConstRequestType.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
+ @param persistentUserData: (str) persistent data to be assosiated to the requestor None
+ @param userData: (any) any data to be associated to the request at runtime or None
@param items: for L{consts.ConstRequestType.PutMultiple}, items to upload
@param msgParams: (dict) Fcp parameters to pass along with the message
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 11:17:36
|
Revision: 496
http://fclient.svn.sourceforge.net/fclient/?rev=496&view=rev
Author: jUrner
Date: 2008-07-05 04:17:44 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
fixed typo
Modified Paths:
--------------
trunk/fcp2/src/fcp2/client.py
Modified: trunk/fcp2/src/fcp2/client.py
===================================================================
--- trunk/fcp2/src/fcp2/client.py 2008-07-05 10:46:19 UTC (rev 495)
+++ trunk/fcp2/src/fcp2/client.py 2008-07-05 11:17:44 UTC (rev 496)
@@ -1557,15 +1557,15 @@
#
if uri.KeyType == consts.ConstKeyType.CHK:
if uri.tail is not None:
- raise valueError('no tail allowed')
+ raise ValueError('no tail allowed')
if uri.filename is not None:
msg['TargetFilename'] = uri.docName
elif uri.KeyType == consts.ConstKeyType.SSK:
if uri.tail is not None:
- raise valueError('no tail allowed')
+ raise ValueError('no tail allowed')
elif uri.KeyType == consts.ConstKeyType.USK:
if uri.tail is not None:
- raise valueError('no tail allowed')
+ raise ValueError('no tail allowed')
# add params
for param, value in msgParams.items():
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 10:46:11
|
Revision: 495
http://fclient.svn.sourceforge.net/fclient/?rev=495&view=rev
Author: jUrner
Date: 2008-07-05 03:46:19 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
fix. complain that on ClientPut key.tail is disallowed
Modified Paths:
--------------
trunk/fcp2/src/fcp2/client.py
Modified: trunk/fcp2/src/fcp2/client.py
===================================================================
--- trunk/fcp2/src/fcp2/client.py 2008-07-05 10:45:22 UTC (rev 494)
+++ trunk/fcp2/src/fcp2/client.py 2008-07-05 10:46:19 UTC (rev 495)
@@ -1554,10 +1554,20 @@
raise ValueError('Unsupported request type')
msg = msgClass(URI=uri)
- # add params
+ #
if uri.KeyType == consts.ConstKeyType.CHK:
+ if uri.tail is not None:
+ raise valueError('no tail allowed')
if uri.filename is not None:
msg['TargetFilename'] = uri.docName
+ elif uri.KeyType == consts.ConstKeyType.SSK:
+ if uri.tail is not None:
+ raise valueError('no tail allowed')
+ elif uri.KeyType == consts.ConstKeyType.USK:
+ if uri.tail is not None:
+ raise valueError('no tail allowed')
+
+ # add params
for param, value in msgParams.items():
if value is not None:
msg[param] = value
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-05 10:45:20
|
Revision: 494
http://fclient.svn.sourceforge.net/fclient/?rev=494&view=rev
Author: jUrner
Date: 2008-07-05 03:45:22 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
added many unittests
Modified Paths:
--------------
trunk/fcp2/src/fcp2/test_fcp/test_key.py
Modified: trunk/fcp2/src/fcp2/test_fcp/test_key.py
===================================================================
--- trunk/fcp2/src/fcp2/test_fcp/test_key.py 2008-07-05 10:44:51 UTC (rev 493)
+++ trunk/fcp2/src/fcp2/test_fcp/test_key.py 2008-07-05 10:45:22 UTC (rev 494)
@@ -22,97 +22,256 @@
#
#****************************************************************************************
# for testing some valid key data
-DummyKeyData = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA'
+DummyKeyData = 'abc,abc,AAA'
#****************************************************************************************
#
#****************************************************************************************
+class Test_normkey(unittest.TestCase):
+
+ def test_01_addSlash(self):
+ p = 'CHK@foo'
+ self.assertEqual(fcp2.keyNormkey(p), 'CHK@foo/')
+
+ def test_02_stripHost(self):
+ p = 'freenet:CHK@foo'
+ self.assertEqual(fcp2.keyNormkey(p), 'CHK@foo/')
+
+ p = 'http:///CHK@foo'
+ self.assertEqual(fcp2.keyNormkey(p), 'CHK@foo/')
+
+ def test_stripSlashes(self):
+ p = 'http://////CHK@foo///////'
+ self.assertEqual(fcp2.keyNormkey(p), 'CHK@foo/')
+
+
+
class Test_CHK(unittest.TestCase):
def test_fromString(self):
- p = 'CHK@' + DummyKeyData + '/'
+ p = 'CHK@'
myKey = fcp2.KeyCHK.fromString(p)
+ self.failUnless(myKey is None)
+
+ p = 'CHK@' + DummyKeyData
+ myKey = fcp2.KeyCHK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
- self.failUnless(myKey.docName is None)
+ self.assertEqual(myKey.docName, None)
+ self.assertEqual(myKey.tail, None)
self.assertEqual(myKey.toString(), p)
- p = 'CHK@' + DummyKeyData + '/foo/'
+ p = 'CHK@' + DummyKeyData + '/foo'
myKey = fcp2.KeyCHK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.tail, None)
self.assertEqual(myKey.toString(), p)
-
- p = 'CHK@'
+
+ p = 'CHK@' + DummyKeyData + '/foo/bar/baz'
myKey = fcp2.KeyCHK.fromString(p)
- self.failUnless(myKey is None)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.tail, 'bar/baz')
+ self.assertEqual(myKey.toString(), p)
+
+ def test_quote(self):
+ p = 'CHK@' + DummyKeyData + '/foo '
+ myKey = fcp2.KeyCHK.fromString(p)
+ myKey = myKey.toString()
+ self.assertEqual(myKey, 'CHK@' + DummyKeyData + '/foo%20')
+
+
- def test_toString(self):
- pass
-
class Test_SSK(unittest.TestCase):
def test_fromString(self):
- p = 'SSK@' + DummyKeyData + '/foo-1/'
+ p = 'SSK@'
myKey = fcp2.KeySSK.fromString(p)
+ self.failUnless(myKey is None)
+
+ p = 'SSK@' + DummyKeyData
+ myKey = fcp2.KeySSK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, None)
+ self.assertEqual(myKey.edition, None)
+ self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.toString(), p)
+
+ p = 'SSK@' + DummyKeyData + '/foo-1'
+ myKey = fcp2.KeySSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
self.assertEqual(myKey.docName, 'foo')
self.assertEqual(myKey.edition, 1)
+ self.assertEqual(myKey.tail, None)
self.assertEqual(myKey.toString(), p)
-
- p = 'SSK@' + DummyKeyData + '/'
+ p = 'SSK@' + DummyKeyData + '/foo-1/bar/baz'
myKey = fcp2.KeySSK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
- self.assertEqual(myKey.docName, None)
- self.assertEqual(myKey.edition, None)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.edition, 1)
+ self.assertEqual(myKey.tail, 'bar/baz')
self.assertEqual(myKey.toString(), p)
+
+ def test_quote(self):
+ p = 'SSK@' + DummyKeyData + '/foo -1'
+ myKey = fcp2.KeySSK.fromString(p)
+ myKey = myKey.toString()
+ self.assertEqual(myKey, 'SSK@' + DummyKeyData + '/foo%20-1')
- def test_toString(self):
- pass
+class Test_KSK(unittest.TestCase):
+
+ def test_fromString(self):
+
+ p = 'KSK@'
+ myKey = fcp2.KeyKSK.fromString(p)
+ self.failUnless(myKey is None)
+
+ p = 'KSK@' + 'anydatahere'
+ myKey = fcp2.KeyKSK.fromString(p)
+ self.assertEqual(myKey.docName, 'anydatahere')
+ self.assertEqual(myKey.toString(), p)
+
+ # KSKs may not contain slashes
+ p = 'KSK@' + 'any/data/here'
+ myKey = fcp2.KeyKSK.fromString(p)
+ self.failUnless(myKey is None)
+
+ def test_quote(self):
+ p = 'KSK@' + 'foo '
+ myKey = fcp2.KeyKSK.fromString(p)
+ myKey = myKey.toString()
+ self.assertEqual(myKey, 'KSK@' + 'foo%20')
+
+
class Test_USK(unittest.TestCase):
def test_fromString(self):
- p = 'USK@' + DummyKeyData + '/foo/0/'
+ p = 'USK@'
myKey = fcp2.KeyUSK.fromString(p)
+ self.failUnless(myKey is None)
+
+ p = 'USK@' + DummyKeyData
+ myKey = fcp2.KeyUSK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, None)
+ self.assertEqual(myKey.edition, None)
+ self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.toString(), p)
+
+ p = 'USK@' + DummyKeyData + '/foo/1'
+ myKey = fcp2.KeyUSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
self.assertEqual(myKey.docName, 'foo')
- self.assertEqual(myKey.edition, 0)
+ self.assertEqual(myKey.edition, 1)
+ self.assertEqual(myKey.tail, None)
self.assertEqual(myKey.toString(), p)
-
- p = 'USK@' + DummyKeyData + '/foo/-2/'
+ p = 'USK@' + DummyKeyData + '/foo/1/bar/baz'
myKey = fcp2.KeyUSK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
self.assertEqual(myKey.docName, 'foo')
- self.assertEqual(myKey.edition, -2)
+ self.assertEqual(myKey.edition, 1)
+ self.assertEqual(myKey.tail, 'bar/baz')
self.assertEqual(myKey.toString(), p)
+
+ def test_edition(self):
- p = 'USK@'
+ p = 'USK@' + DummyKeyData + '/foo/1'
myKey = fcp2.KeyUSK.fromString(p)
- self.failUnless(myKey is None)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.edition, 1)
+ self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.toString(), p)
+ p = 'USK@' + DummyKeyData + '/foo/-1'
+ myKey = fcp2.KeyUSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.edition, -1)
+ self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.toString(), p)
+
+ p = 'USK@' + DummyKeyData + '/foo/-100'
+ myKey = fcp2.KeyUSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.edition, -100)
+ self.assertEqual(myKey.tail, None)
+ self.assertEqual(myKey.toString(), p)
- def test_toString(self):
- pass
+ def test_quote(self):
+ p = 'USK@' + DummyKeyData + '/foo /1'
+ myKey = fcp2.KeyUSK.fromString(p)
+ myKey = myKey.toString()
+ self.assertEqual(myKey, 'USK@' + DummyKeyData + '/foo%20/1')
+
+
+
+
+class Test_TypeKey(unittest.TestCase):
+
+ def test_fcpToPython(self):
+
+ p = 'invalidkey'
+ self.assertRaises(ValueError, fcp2.TypeKey.fcpToPython, p)
+
+ p = 'CHK@' + DummyKeyData
+ myKey = fcp2.TypeKey.fcpToPython(p)
+ self.assertEqual(myKey.KeyType, fcp2.ConstKeyType.CHK)
+
+ p = 'SSK@' + DummyKeyData
+ myKey = fcp2.TypeKey.fcpToPython(p)
+ self.assertEqual(myKey.KeyType, fcp2.ConstKeyType.SSK)
+
+ p = 'USK@' + DummyKeyData
+ myKey = fcp2.TypeKey.fcpToPython(p)
+ self.assertEqual(myKey.KeyType, fcp2.ConstKeyType.USK)
+
+ p = 'KSK@' + DummyKeyData
+ myKey = fcp2.TypeKey.fcpToPython(p)
+ self.assertEqual(myKey.KeyType, fcp2.ConstKeyType.KSK)
+
+ # only a shallow test here to see if the call succeeds
+ def test_pythonToFcp(self):
+
+ myKey = fcp2.KeyCHK()
+ self.assertEqual(fcp2.TypeKey.pythonToFcp(myKey), 'CHK@')
+
+
+
+class Test_Key(unittest.TestCase):
+
+ # only a shallow test here to see if the call succeeds
+ def test(self):
+ myKey = fcp2.Key('KSK@foo')
+ self.assertEqual(myKey.KeyType, fcp2.ConstKeyType.KSK)
+
+
#*********************************************************************************
#
#*********************************************************************************
def suite():
tests = (
+ Test_normkey,
Test_CHK,
Test_SSK,
+ Test_KSK,
Test_USK,
+ Test_TypeKey,
+ Test_Key,
)
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-07-05 10:44:43
|
Revision: 493
http://fclient.svn.sourceforge.net/fclient/?rev=493&view=rev
Author: jUrner
Date: 2008-07-05 03:44:51 -0700 (Sat, 05 Jul 2008)
Log Message:
-----------
another rework of the key module
Modified Paths:
--------------
trunk/fcp2/src/fcp2/key.py
Modified: trunk/fcp2/src/fcp2/key.py
===================================================================
--- trunk/fcp2/src/fcp2/key.py 2008-07-04 08:27:51 UTC (rev 492)
+++ trunk/fcp2/src/fcp2/key.py 2008-07-05 10:44:51 UTC (rev 493)
@@ -2,7 +2,9 @@
import os, sys
import base64
+import posixpath
import re
+import urllib
import urlparse
#--> rel import hack
@@ -24,9 +26,6 @@
_ReMatchExact = '\A%s\Z'
KeyTypesAll = {}
-# save url chars as defined in [freenet/src/support/URLEncoder.java]
-SafeURLChars = '*-_./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz'
-
#**************************************************************************************
# freenet base64 for keys
#**************************************************************************************
@@ -46,14 +45,15 @@
return base64.b64decode(string, altchars)
-def stripKey(key):
- """Strips all uri stuff from a key
- @param key: (str) key to strip
- @return: (str) key
- """
- result = urlparse.urlsplit(key)[2]
- if result.startswith('/'):
- result = result[1:]
+def keyNormkey(string):
+ """"""
+ result = urlparse.urlsplit(string)[2]
+ while result.startswith('/'):
+ result = result[1: ]
+ while result.endswith('/'):
+ result = result[ :-1]
+ if result:
+ result += '/'
return result
#**************************************************************************************
@@ -65,40 +65,19 @@
# encode: - for + and ~ for / see: [freenet/support/base64.java]
#
#**************************************************************************************
-#TODO: too bad, can not move this to types.py ...cross import
-class TypeKey(object):
- """key type for type conversions
+class TypeKey(type):
+ """Metaclass for freenet keys"""
- >>> key = TypeKey.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
- >>> key.toString()
- 'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
- >>> key = TypeKey.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/')
- >>> key.toString()
- 'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
-
- >>> key = TypeKey.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo-1')
- >>> key.toString()
- 'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo-1/'
- >>> key = TypeKey.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo-1/')
- >>> key.toString()
- 'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo-1/'
-
- >>> key = TypeKey.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0')
- >>> key.toString()
- 'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/'
- >>> key = TypeKey.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/')
- >>> key.toString()
- 'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/'
-
- >>> key = TypeKey.fcpToPython('KSK@abcde')
- >>> key.toString()
- 'KSK@abcde/'
- >>> key = TypeKey.fcpToPython('KSK@abcde/')
- >>> key.toString()
- 'KSK@abcde/'
-
- """
-
+ def __new__(klass, name, bases, kws):
+ """Registers a key type to L{KeyTypesAll}
+ @note: if KeyType of the the key type is None it will not get registered
+ """
+
+ newClass = type.__new__(klass, name, bases, kws)
+ if newClass.KeyType is not None:
+ KeyTypesAll[newClass.KeyType] = newClass
+ return newClass
+
@classmethod
def fcpToPython(clss, string):
"""converts a fcp key to a python key
@@ -107,9 +86,8 @@
@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)
+ result = clssKeyType.fromString(string)
if result is not None:
return result
raise ValueError('Invalid key: %s' % string)
@@ -120,24 +98,10 @@
@return: (str) fcp key
"""
return key.toString()
-
-#****************************************************************************************
-#
-#***************************************************************************************
-class _KeyMeta(type):
- """Metaclass for freenet keys"""
-
- def __new__(klass, name, bases, kws):
- """Registers a key type to L{KeyTypesAll}
- @note: if KeyType of the the key type is None it will not get registered
- """
-
- newClass = type.__new__(klass, name, bases, kws)
- if newClass.KeyType is not None:
- KeyTypesAll[newClass.KeyType] = newClass
- return newClass
-
+#**************************************************************************************
+#
+#**************************************************************************************
def Key(string):
"""creates a key object from a string
@return: (L{_KeyBase})
@@ -151,7 +115,7 @@
"""Base class for freenet keys
"""
- __metaclass__ = _KeyMeta
+ __metaclass__ = TypeKey
KeyType = None
def __eq__(self, other):
@@ -161,8 +125,10 @@
return self.pytoString() != other.toString()
@classmethod
- def fromString(clss, string):
+ def fromString(clss, string, isQuoted=True):
"""should create a key object from a string
+ @param string:
+ @param isQuoted: (bool) if True, the string is assumed to be already quoted
"""
raise NotImplementedError()
@@ -170,6 +136,7 @@
"""should return the key as string"""
raise NotImplementedError()
+
class KeyCHK(_KeyBase):
""""""
@@ -180,36 +147,46 @@
(?P<cryptoKey>[a-z0-9\-~]+?),
(?P<extra>[a-z0-9\-~]+?)
)
- (?: / (?P<docName>[^/]+?)? (?: /)?)?
+ /
+ (
+ (?P<docName> (?: [^/]+?)) /
+ ((?P<tail>.+) /)?
+ )?
'''
+ KeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
KeyType = consts.ConstKeyType.CHK
- KeyPattern = re.compile(_key_pattern_, re.I | re.X)
- ExactKeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
-
- def __init__(self, keyData=None, docName=None):
+
+ def __init__(self, keyData=None, docName=None, tail=None):
"""Creates a CHK key
@param keyData: (str) key data or None
@param docName: (str) docName to add to the key or None
+ @param tail: (str) for containers, path to item in container or None
"""
self.keyData = keyData
self.docName = docName
+ self.tail = tail
def toString(self):
- out = self.KeyType
- if self.keyData is not None:
- out += self.keyData + '/'
+ if self.keyData is None:
+ out = [self.KeyType, ]
+ else:
+ out = [self.KeyType + self.keyData, ]
if self.docName is not None:
- out += self.docName + '/'
- return out
+ out.append(urllib.quote(self.docName))
+ if self.tail is not None:
+ out.append(urllib.quote(self.tail))
+ return posixpath.join(*out)
@classmethod
def fromString(clss, string):
- result = clss.ExactKeyPattern.match(stripKey(string))
+ key = keyNormkey(string)
+ key = urllib.unquote(key)
+ result = clss.KeyPattern.match(key)
if result is not None:
d = result.groupdict()
- key = clss(d['keyData'], docName=d['docName'])
- return key
+ return clss(d['keyData'], docName=d['docName'], tail=d['tail'])
+
class KeySSK(_KeyBase):
@@ -220,73 +197,89 @@
(?P<cryptoKey>[a-z0-9\-~]+?),
(?P<extra>[a-z0-9\-~]+?)
)
+ /
(
- (?: / (?P<docName>[^/]+?))
- -
- (?: (?P<edition>[\d]+))
+ (?: (?P<docName>[^/]+?)) - (?: (?P<edition>[\d]+)) /
+ ((?P<tail>.+) /)?
)?
- (?: /)?
'''
+ KeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
KeyType = consts.ConstKeyType.SSK
- KeyPattern = re.compile(_key_pattern_, re.I | re.X)
- ExactKeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
+
+ def __init__(self, keyData=None, docName=None, edition=0, tail=None):
+ """Creates a SSK key
- def __init__(self, keyData, docName=None, edition=0):
+ @param keyData: (str) key data or None
+ @param docName: (str) docName to add to the key or None
+ @param edition: (int) desired edition
+ @param tail: (str) for containers, path to item in container or None
+ """
self.docName = docName
self.edition = edition
self.keyData = keyData
+ self.tail = tail
def toString(self):
- out = self.KeyType
- if self.keyData is not None:
- out += self.keyData + '/'
+ if self.keyData is None:
+ out = [self.KeyType, ]
+ else:
+ out = [self.KeyType + self.keyData, ]
if self.docName is not None:
if self.edition is None:
raise ValueError('no edition number specified')
- out += self.docName + '-' + str(self.edition) + '/'
- return out
-
+ out.append(urllib.quote(self.docName + '-' + str(self.edition)))
+ if self.tail is not None:
+ out.append(urllib.quote(self.tail))
+ return posixpath.join(*out)
+
@classmethod
def fromString(clss, string):
- result = clss.ExactKeyPattern.match(stripKey(string))
+ key = keyNormkey(string)
+ key = urllib.unquote(key)
+ result = clss.KeyPattern.match(key)
if result is not None:
d = result.groupdict()
edition = d['edition']
if edition is not None:
edition = int(edition)
- return clss(d['keyData'], d['docName'], edition=edition)
+ return clss(d['keyData'], docName=d['docName'], edition=edition, tail=d['tail'])
+
+
-
-
+#TODO: current impl is to not allow slashes in KSKs. have to check if the node enforces this
class KeyKSK(_KeyBase):
_key_pattern_ = '''
(?P<keyType>KSK@)
- (?P<docName>[^/]+?)
- (?: /)?
+ (?P<docName>[^/]+?) /
'''
+ KeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
KeyType = consts.ConstKeyType.KSK
- KeyPattern = re.compile(_key_pattern_, re.I | re.X)
- ExactKeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
+
-
def __init__(self, docName):
+ """Creates a KSK key
+
+ @param docName: (str) docName to add to the key or None
+ """
self.docName = docName
def toString(self):
- out = self.KeyType
- if self.docName is not None:
- out += self.docName + '/'
- return out
+ if self.docName is None:
+ return self.KeyType
+ return self.KeyType + urllib.quote(self.docName)
+
@classmethod
- def fromString(clss, string):
- result = clss.ExactKeyPattern.match(stripKey(string))
+ def fromString(clss, string, isQuoted=True):
+ key = keyNormkey(string)
+ key = urllib.unquote(key)
+ result = clss.KeyPattern.match(key)
if result is not None:
d = result.groupdict()
return clss(docName=d['docName'])
-#TODO: is docName obligatory?
+
class KeyUSK(_KeyBase):
_key_pattern_ = '''
(?P<keyType>USK@)
@@ -295,53 +288,58 @@
(?P<cryptoKey>[a-z0-9\-~]+?),
(?P<extra>[a-z0-9\-~]+?)
)
+ /
(
- (?: / (?P<docName>[^/]+?) )
- (?: / (?P<edition>-?[\d]+))
+ (?P<docName>[^/]+?) /
+ (?P<edition>-?\d+) /
+ ((?P<tail>.+) /)?
)?
- (?: /)?
'''
-
+ KeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
KeyType = consts.ConstKeyType.USK
- KeyPattern = re.compile(_key_pattern_, re.I | re.X)
- ExactKeyPattern = re.compile(_ReMatchExact % _key_pattern_, re.I | re.X)
-
- def __init__(self, keyData, docName=None, edition=0):
+
+ def __init__(self, keyData=None, docName=None, edition=-1, tail=None):
"""Creates a USK key
- @param keyData: (str) public key
- @param docName: (str) docName
- @param edition: (int) edition number
+
+ @param keyData: (str) key data or None
+ @param docName: (str) docName to add to the key or None
+ @param edition: (int) desired edition
+ @param tail: (str) for containers, path to item in container or None
"""
self.edition = edition
self.docName = docName
self.keyData = keyData
+ self.tail = tail
def toString(self):
- out = self.KeyType
- if self.keyData is not None:
- out += self.keyData + '/'
+ if self.keyData is None:
+ out = [self.KeyType, ]
+ else:
+ out = [self.KeyType + self.keyData, ]
if self.docName is not None:
- out += self.docName + '/'
- if self.edition is not None:
- out += str(self.edition) + '/'
- return out
+ if self.edition is None:
+ raise ValueError('no edition number specified')
+ out.append(urllib.quote(self.docName))
+ out.append(urllib.quote(str(self.edition)))
+ if self.tail is not None:
+ out.append(urllib.quote(self.tail))
+ return posixpath.join(*out)
@classmethod
- def fromString(clss, string):
- result = clss.ExactKeyPattern.match(stripKey(string))
+ def fromString(clss, string, isQuoted=True):
+ key = keyNormkey(string)
+ key = urllib.unquote(key)
+ result = clss.KeyPattern.match(key)
if result is not None:
d = result.groupdict()
edition = d['edition']
if edition is not None:
edition = int(edition)
- return clss(d['keyData'], d['docName'], edition=edition)
+ return clss(d['keyData'], docName=d['docName'], edition=edition, tail=d['tail'])
+
__all__ = [i for i in dir() if i[0].isupper() and not i.startswith('_')]
-#*****************************************************************************
-#
-#*****************************************************************************
-if __name__ == '__main__':
- import doctest
- #print 'doctests failed: %s/%s' % doctest.testmod()
+__all__.append('base64UrlsaveDecode')
+__all__.append('keyNormkey')
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-04 08:27:41
|
Revision: 492
http://fclient.svn.sourceforge.net/fclient/?rev=492&view=rev
Author: jUrner
Date: 2008-07-04 01:27:51 -0700 (Fri, 04 Jul 2008)
Log Message:
-----------
new message
Modified Paths:
--------------
trunk/fcp2/src/fcp2/consts.py
Modified: trunk/fcp2/src/fcp2/consts.py
===================================================================
--- trunk/fcp2/src/fcp2/consts.py 2008-07-04 08:27:35 UTC (rev 491)
+++ trunk/fcp2/src/fcp2/consts.py 2008-07-04 08:27:51 UTC (rev 492)
@@ -322,6 +322,7 @@
SimpleProgress = 'SimpleProgress'
SSKKeypair = 'SSKKeypair'
StartedCompression = 'StartedCompression'
+ SubscribedUSK = 'SubscribedUSK'
SubscribedUSKUpdate = 'SubscribedUSKUpdate'
TestDDAComplete = 'TestDDAComplete' # (since 1027)
TestDDAReply = 'TestDDAReply' # (since 1027)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-04 08:27:26
|
Revision: 491
http://fclient.svn.sourceforge.net/fclient/?rev=491&view=rev
Author: jUrner
Date: 2008-07-04 01:27:35 -0700 (Fri, 04 Jul 2008)
Log Message:
-----------
new message
Modified Paths:
--------------
trunk/fcp2/src/fcp2/message.py
Modified: trunk/fcp2/src/fcp2/message.py
===================================================================
--- trunk/fcp2/src/fcp2/message.py 2008-07-04 08:27:01 UTC (rev 490)
+++ trunk/fcp2/src/fcp2/message.py 2008-07-04 08:27:35 UTC (rev 491)
@@ -1079,6 +1079,15 @@
}
+class MsgSubscribedUSK(_MessageBase):
+ name = consts.ConstMessage.SubscribedUSK
+ _additional_params_ = _SubscribeUSKParams
+ _param_types_ = {
+ 'DontPoll': types.TypeBool,
+ 'URI': key.TypeKey,
+ }
+
+
class MsgSubscribedUSKUpdate(_MessageBase):
name = consts.ConstMessage.SubscribedUSKUpdate
_additional_params_ = {}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-04 08:26:56
|
Revision: 490
http://fclient.svn.sourceforge.net/fclient/?rev=490&view=rev
Author: jUrner
Date: 2008-07-04 01:27:01 -0700 (Fri, 04 Jul 2008)
Log Message:
-----------
adapt to changes in key.py
Modified Paths:
--------------
trunk/fcp2/src/fcp2/test_fcp/test_key.py
Modified: trunk/fcp2/src/fcp2/test_fcp/test_key.py
===================================================================
--- trunk/fcp2/src/fcp2/test_fcp/test_key.py 2008-07-04 08:26:52 UTC (rev 489)
+++ trunk/fcp2/src/fcp2/test_fcp/test_key.py 2008-07-04 08:27:01 UTC (rev 490)
@@ -34,13 +34,13 @@
p = 'CHK@' + DummyKeyData + '/'
myKey = fcp2.KeyCHK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
- self.failUnless(myKey.filename is None)
+ self.failUnless(myKey.docName is None)
self.assertEqual(myKey.toString(), p)
p = 'CHK@' + DummyKeyData + '/foo/'
myKey = fcp2.KeyCHK.fromString(p)
self.assertEqual(myKey.keyData, DummyKeyData)
- self.assertEqual(myKey.filename, 'foo')
+ self.assertEqual(myKey.docName, 'foo')
self.assertEqual(myKey.toString(), p)
p = 'CHK@'
@@ -52,14 +52,67 @@
pass
+class Test_SSK(unittest.TestCase):
+
+ def test_fromString(self):
+
+ p = 'SSK@' + DummyKeyData + '/foo-1/'
+ myKey = fcp2.KeySSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.edition, 1)
+ self.assertEqual(myKey.toString(), p)
+
+
+ p = 'SSK@' + DummyKeyData + '/'
+ myKey = fcp2.KeySSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, None)
+ self.assertEqual(myKey.edition, None)
+ self.assertEqual(myKey.toString(), p)
+
+
+
+ def test_toString(self):
+ pass
+
-
+class Test_USK(unittest.TestCase):
+
+ def test_fromString(self):
+
+ p = 'USK@' + DummyKeyData + '/foo/0/'
+ myKey = fcp2.KeyUSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.edition, 0)
+ self.assertEqual(myKey.toString(), p)
+
+
+ p = 'USK@' + DummyKeyData + '/foo/-2/'
+ myKey = fcp2.KeyUSK.fromString(p)
+ self.assertEqual(myKey.keyData, DummyKeyData)
+ self.assertEqual(myKey.docName, 'foo')
+ self.assertEqual(myKey.edition, -2)
+ self.assertEqual(myKey.toString(), p)
+
+
+ p = 'USK@'
+ myKey = fcp2.KeyUSK.fromString(p)
+ self.failUnless(myKey is None)
+
+
+ def test_toString(self):
+ pass
+
#*********************************************************************************
#
#*********************************************************************************
def suite():
tests = (
Test_CHK,
+ Test_SSK,
+ Test_USK,
)
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-07-04 08:26:46
|
Revision: 489
http://fclient.svn.sourceforge.net/fclient/?rev=489&view=rev
Author: jUrner
Date: 2008-07-04 01:26:52 -0700 (Fri, 04 Jul 2008)
Log Message:
-----------
adapt to changes in key.py
Modified Paths:
--------------
trunk/fcp2/src/fcp2/test_fcp/test_client.py
Modified: trunk/fcp2/src/fcp2/test_fcp/test_client.py
===================================================================
--- trunk/fcp2/src/fcp2/test_fcp/test_client.py 2008-07-04 08:26:26 UTC (rev 488)
+++ trunk/fcp2/src/fcp2/test_fcp/test_client.py 2008-07-04 08:26:52 UTC (rev 489)
@@ -3031,8 +3031,8 @@
requestsAll = self.client.getRequests()
self.assertHasNextMessage(fcp2.MsgGenerateSSK)
- priv = fcp2.Key('SSK@' + DummyKeyData + '/priv')
- pub = fcp2.Key('SSK@' + DummyKeyData + '/pub')
+ priv = fcp2.Key('SSK@' + DummyKeyData + '/')
+ pub = fcp2.Key('SSK@' + DummyKeyData + '/')
self.sendResponseMessage(
'SSKKeypair',
Identifier=myIdentifier,
@@ -3067,8 +3067,8 @@
requestsAll = self.client.getRequests()
self.assertHasNextMessage(fcp2.MsgGenerateSSK)
- priv = fcp2.Key('SSK@' + DummyKeyData + '/priv')
- pub = fcp2.Key('SSK@' + DummyKeyData + '/pub')
+ priv = fcp2.Key('SSK@' + DummyKeyData + '/')
+ pub = fcp2.Key('SSK@' + DummyKeyData + '/')
self.sendResponseMessage(
'SSKKeypair',
Identifier=myIdentifier,
@@ -3076,8 +3076,8 @@
InsertURI=priv,
)
- priv = fcp2.KeyUSK(priv.keyData, filename=priv.filename)
- pub = fcp2.KeyUSK(pub.keyData, filename=pub.filename)
+ priv = fcp2.KeyUSK(priv.keyData, docName=priv.docName)
+ pub = fcp2.KeyUSK(pub.keyData, docName=pub.docName)
msg = self.assertHasNextEvent(
self.client.events.KeypairGenerated,
fcp2.MsgGenerateSSK,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-07-04 08:26:20
|
Revision: 488
http://fclient.svn.sourceforge.net/fclient/?rev=488&view=rev
Author: jUrner
Date: 2008-07-04 01:26:26 -0700 (Fri, 04 Jul 2008)
Log Message:
-----------
adapt to changes in key.py
Modified Paths:
--------------
trunk/fcp2/src/fcp2/client.py
Modified: trunk/fcp2/src/fcp2/client.py
===================================================================
--- trunk/fcp2/src/fcp2/client.py 2008-07-04 08:25:43 UTC (rev 487)
+++ trunk/fcp2/src/fcp2/client.py 2008-07-04 08:26:26 UTC (rev 488)
@@ -1085,8 +1085,9 @@
requestURI = msg['RequestURI']
if initialRequest['RequestType'] == consts.ConstRequestType.GenerateUSKKeypair:
- insertURI = key.KeyUSK(insertURI.keyData, filename=insertURI.filename)
- requestURI = key.KeyUSK(requestURI.keyData, filename=requestURI.filename)
+ insertURI = key.KeyUSK(insertURI.keyData, docName=insertURI.docName)
+ insertURI = key.KeyUSK(insertURI.keyData, docName=insertURI.docName)
+ requestURI = key.KeyUSK(requestURI.keyData, docName=requestURI.docName)
initialRequest['InsertURI'] = insertURI
initialRequest['RequestURI'] = requestURI
initialRequest['RequestStatus'] |= consts.ConstRequestStatus.Success
@@ -1556,7 +1557,7 @@
# add params
if uri.KeyType == consts.ConstKeyType.CHK:
if uri.filename is not None:
- msg['TargetFilename'] = uri.filename
+ msg['TargetFilename'] = uri.docName
for param, value in msgParams.items():
if value is not None:
msg[param] = value
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|