fclient-commit Mailing List for fclient (Page 18)
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-07 21:28:53
|
Revision: 537 http://fclient.svn.sourceforge.net/fclient/?rev=537&view=rev Author: jUrner Date: 2008-07-07 14:28:23 -0700 (Mon, 07 Jul 2008) Log Message: ----------- minor changes Modified Paths: -------------- trunk/fcp2/src/fcp2/README Modified: trunk/fcp2/src/fcp2/README =================================================================== --- trunk/fcp2/src/fcp2/README 2008-07-07 21:28:13 UTC (rev 536) +++ trunk/fcp2/src/fcp2/README 2008-07-07 21:28:23 UTC (rev 537) @@ -1,8 +1,18 @@ -Fcp - a python wraper library for the freenet client protocol version 2. See: [http://www.freenetproject.org] +Fcp - a python wraper library for the freenet client protocol version 2 +homepage: [http://fclient.sourceforge.net] +freenet: [http://www.freenetproject.org] +requirements: python >= 2.5 +note: for one or the other reason the package is designed to be dropped into +any project or to be used directly from the folder it resides in. no need to install it +to 'lib/site-packages'. if you want to do so, make shure to remove any prior +fcp2 package and copy it to site-packages by hand. + + + Version history: ******************************************************************* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-07 21:28:07
|
Revision: 536 http://fclient.svn.sourceforge.net/fclient/?rev=536&view=rev Author: jUrner Date: 2008-07-07 14:28:13 -0700 (Mon, 07 Jul 2008) Log Message: ----------- minor changes Modified Paths: -------------- trunk/fcp2/src/MANIFEST Modified: trunk/fcp2/src/MANIFEST =================================================================== --- trunk/fcp2/src/MANIFEST 2008-07-07 21:27:48 UTC (rev 535) +++ trunk/fcp2/src/MANIFEST 2008-07-07 21:28:13 UTC (rev 536) @@ -1,3 +1,4 @@ +000_test.py MANIFEST setup.py fcp2/LICENCE.MIT This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-07 21:27:38
|
Revision: 535 http://fclient.svn.sourceforge.net/fclient/?rev=535&view=rev Author: jUrner Date: 2008-07-07 14:27:48 -0700 (Mon, 07 Jul 2008) Log Message: ----------- minor changes Modified Paths: -------------- trunk/fcp2/src/fcp2/test/test_all.py Modified: trunk/fcp2/src/fcp2/test/test_all.py =================================================================== --- trunk/fcp2/src/fcp2/test/test_all.py 2008-07-07 08:04:01 UTC (rev 534) +++ trunk/fcp2/src/fcp2/test/test_all.py 2008-07-07 21:27:48 UTC (rev 535) @@ -7,13 +7,12 @@ #************************************************************************************************* if __name__ == '__main__': Dir, SelfName= os.path.split(os.path.abspath(__file__)) - sys.path.insert(0, Dir) - + for file in os.walk(Dir).next()[2]: filename, ext = os.path.splitext(file) if ext.lower() == '.py': if filename.startswith('test_') and file != SelfName: mod = __import__(filename) suite = getattr(mod, 'suite') - unittest.TextTestRunner(verbosity=1).run(suite()) + unittest.TextTestRunner(verbosity=2).run(suite()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-07 08:04:02
|
Revision: 534 http://fclient.svn.sourceforge.net/fclient/?rev=534&view=rev Author: jUrner Date: 2008-07-07 01:04:01 -0700 (Mon, 07 Jul 2008) Log Message: ----------- ... Removed Paths: ------------- trunk/fcp2/src/test/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-07 08:03:28
|
Revision: 533 http://fclient.svn.sourceforge.net/fclient/?rev=533&view=rev Author: jUrner Date: 2008-07-07 01:03:36 -0700 (Mon, 07 Jul 2008) Log Message: ----------- ... Added Paths: ----------- trunk/fcp2/src/fcp2/test/ trunk/fcp2/src/fcp2/test/__init__.py trunk/fcp2/src/fcp2/test/dummy_io.py trunk/fcp2/src/fcp2/test/test_all.py trunk/fcp2/src/fcp2/test/test_client.py trunk/fcp2/src/fcp2/test/test_config.py trunk/fcp2/src/fcp2/test/test_iohandler.py trunk/fcp2/src/fcp2/test/test_key.py trunk/fcp2/src/fcp2/test/test_message.py trunk/fcp2/src/fcp2/test/test_types.py Added: trunk/fcp2/src/fcp2/test/__init__.py =================================================================== --- trunk/fcp2/src/fcp2/test/__init__.py (rev 0) +++ trunk/fcp2/src/fcp2/test/__init__.py 2008-07-07 08:03:36 UTC (rev 533) @@ -0,0 +1 @@ + Added: trunk/fcp2/src/fcp2/test/dummy_io.py =================================================================== --- trunk/fcp2/src/fcp2/test/dummy_io.py (rev 0) +++ trunk/fcp2/src/fcp2/test/dummy_io.py 2008-07-07 08:03:36 UTC (rev 533) @@ -0,0 +1,119 @@ +"""Dummy socket object for testing""" + +import os, sys + + +def relimport(what): + import imp, os, sys + L = what.split('.') + if not L or L[0]: + raise ValueError('relative import must start with a dot') + name = os.path.abspath(__file__) + while L: + p = L.pop(0) + if p: name = os.path.join(name, p) + else: + name, _ = os.path.split(name) + if not _: break + if L: raise ValueError('root level exceeded') + mod = sys.modules.get(name, None) + if mod is None: + fpath, fname = os.path.split(name) + fp, fpath, suffixes = imp.find_module(fname, [fpath, ]) + print fp, fpath, suffixes + try: mod = imp.load_module(name, fp, fpath, suffixes) + finally: + if fp is not None: fp.close() + return mod + +fcp2 = relimport('...fcp2') +#******************************************************************** +# +#******************************************************************** +class DummyIO(fcp2.iohandler.IOObjectBase): + + def __init__(self): + self.readBuffer = '' # buffer client reads from + self.writeBuffer = '' # buffer client writes to + + self._isOpen = False + self._isBroken = False + self._allowConnect = True + self._reverseDirection = False + + def connect(self, **kwargs): + if not self._allowConnect: + raise fcp2.ErrorIOConnectFailed('Refused') + self._isOpen = True + + def read(self, n): + if self._isBroken: + raise fcp2.ErrorIOBroken('Broken') + if not self.isOpen(): + raise fcp2.ErrorIOClosed('Closed') + + if self._reverseDirection: + if not self.writeBuffer: + raise fcp2.ErrorIOTimeout('Timeout') + bytes, self.writeBuffer = self.writeBuffer[ :n], self.writeBuffer[n: ] + else: + if not self.readBuffer: + raise fcp2.ErrorIOTimeout('Timeout') + bytes, self.readBuffer = self.readBuffer[ :n], self.readBuffer[n: ] + return bytes + + def write(self, bytes): + if self._isBroken: + raise fcp2.ErrorIOBroken('Broken') + if not self.isOpen(): + raise fcp2.ErrorIOClosed('Closed') + self.writeBuffer += bytes + + def close(self): + self._isBroken = False + self._allowConnect = True + self._reverseDirection = False + if self.isOpen(): + self._isOpen = False + self.readBuffer = '' + self.writeBuffer = '' + else: + raise fcp2.ErrorIOClosed('Closed') + + def isOpen(self): + return self._isOpen + + def setTimeout(self, n): + pass + + + ############################ + ## for testing... + + def setOpen(self, flag): + self._isOpen = flag + + def setBroken(self, flag): + self._isBroken = flag + + def setAllowConnect(self, flag): + self._allowConnect = flag + + def setReverseDirection(self, flag): + self._reverseDirection = flag + + def sendResponseMessage(self, name, data=None, **params): + buf = [name, ] + for name, value in params.items(): + buf.append('%s=%s' % (name, value) ) + if data is None: + buf.append('EndMessage\n') + else: + buf.append('Data\n') + self.readBuffer += '\n'.join(buf) + if data: + assert 'DataLength' in params + assert params['DataLength'] == len(data) + self.readBuffer += data + + Added: trunk/fcp2/src/fcp2/test/test_all.py =================================================================== --- trunk/fcp2/src/fcp2/test/test_all.py (rev 0) +++ trunk/fcp2/src/fcp2/test/test_all.py 2008-07-07 08:03:36 UTC (rev 533) @@ -0,0 +1,19 @@ +"""Runs all unittests in the current folder""" + +import os, sys +import unittest +#************************************************************************************************* +# +#************************************************************************************************* +if __name__ == '__main__': + Dir, SelfName= os.path.split(os.path.abspath(__file__)) + sys.path.insert(0, Dir) + + for file in os.walk(Dir).next()[2]: + filename, ext = os.path.splitext(file) + if ext.lower() == '.py': + if filename.startswith('test_') and file != SelfName: + mod = __import__(filename) + suite = getattr(mod, 'suite') + unittest.TextTestRunner(verbosity=1).run(suite()) + Added: trunk/fcp2/src/fcp2/test/test_client.py =================================================================== --- trunk/fcp2/src/fcp2/test/test_client.py (rev 0) +++ trunk/fcp2/src/fcp2/test/test_client.py 2008-07-07 08:03:36 UTC (rev 533) @@ -0,0 +1,3034 @@ +"""Unittests for fcp2.client.py""" +from __future__ import with_statement + +import os, sys +import copy +import socket +import tempfile +import time +import unittest + + +# hack relative imports to make in-place testing work +def relimport(what): + import imp, os, sys + L = what.split('.') + if not L or L[0]: + raise ValueError('relative import must start with a dot') + name = os.path.abspath(__file__) + while L: + p = L.pop(0) + if p: name = os.path.join(name, p) + else: + name, _ = os.path.split(name) + if not _: break + if L: raise ValueError('root level exceeded') + mod = sys.modules.get(name, None) + if mod is None: + fpath, fname = os.path.split(name) + fp, fpath, suffixes = imp.find_module(fname, [fpath, ]) + try: mod = imp.load_module(name, fp, fpath, suffixes) + finally: + if fp is not None: fp.close() + return mod + +fcp2 = relimport('...fcp2') +dummy_io = relimport('.dummy_io') +#*********************************************************************************** +# +#*********************************************************************************** +DIR = os.path.dirname(os.path.abspath(__file__)) +##TestAgainstNode = 0 # don't know how to test against node. Do not touch this! + +# for testing some valid key data +DummyKeyData = 'aaa,bbb,ccc' +#*********************************************************************************** +# +#*********************************************************************************** +class BaseTestClient(unittest.TestCase): + """Base class for all tests""" + + client = fcp2.Client( + #debugVerbosity=fcp2.ConstDebugVerbosity.Debug, + debugVerbosity=fcp2.ConstDebugVerbosity.Quiet + ) + + client.ioHandler.setIOPrototype(dummy_io.DummyIO) + + + def __init__(self, *args, **kwargs): + unittest.TestCase.__init__(self, *args, **kwargs) + + self.events = [] # events received from the client + self.tmpfiles = [] # temp files used for testing (will be removed on tearDown) + + + def _captureEventsFromClient(self, event, msg): + """Captures events the client send""" + # have to copy message here, to get exact state + msg = copy.deepcopy(msg) + self.events.append( (event, msg) ) + + + def connectClient(self): + """Connects to the client""" + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + msg = self.getNextMessage() + if msg is not None: + self.failUnless(msg.name == 'ClientHello') + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Build='9999999999', + + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientConnected, + fcp2.MsgNodeHello, + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def closeClient(self): + """Closes the client""" + self.client.close() + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.Close), + ) + + + def assertHasNextEvent(self, + expectedEvent=None, + message=None, + param1=None, + param2=None, + param3=None, + param4=None, + param5=None, + data=None + ): + """Tests if we received a certain event from the client + @param expectedEvent: the event expected or None if no event is expected + @param message: expected mesage or None if no message is expected + @param param1: tuple(paramName, value) of a message parameter expected + @param data: data expected along with the message or None + + @return: message if a message was received or None + """ + if expectedEvent is None: + self.failIf(self.events) + else: + self.failUnless(self.events) + event, msg = self.events.pop(0) + self.assertEqual(event, expectedEvent) + + if message is not None: + self.assertEqual(msg.name, message.name) + if param1 is not None: + param1, value1 = param1 + self.failUnless(param1 in msg.params) + self.assertEqual(value1, msg[param1]) + if param2 is not None: + param2, value2 = param2 + self.failUnless(param2 in msg.params) + self.assertEqual(value2, msg[param2]) + if param3 is not None: + param3, value3 = param3 + self.failUnless(param3 in msg.params) + self.assertEqual(value3, msg[param3]) + if param4 is not None: + param4, value4 = param4 + self.failUnless(param4 in msg.params) + self.assertEqual(value4, msg[param4]) + if param5 is not None: + param5, value5 = param5 + self.failUnless(param5 in msg.params) + self.assertEqual(value5, msg[param5]) + + if data is not None: + self.assertEqual(data, msg.data) + + return msg + + def assertHasNextMessage(self, + message, + param1=None, + param2=None, + param3=None, + param4=None, + param5=None, + param6=None, + param7=None, + param8=None, + param9=None, + param10=None, + param11=None, + param12=None, + param13=None, + param14=None, + param15=None, + data=None + ): + """Tests if we received a certain message from the client + @param message: expected mesage or None if no message is expected + @param param1: tuple(paramName, value) of a message parameter expected + @param data: data expected along with the message or None + + @return: message if a message was received or None + """ + msg = self.getNextMessage() + if message is None: + self.failUnless(msg is None) + else: + self.failIf(msg is None) + self.assertEqual(msg.name, message.name) + if param1 is not None: + param1, value1 = param1 + self.failUnless(param1 in msg.params) + self.assertEqual(value1, msg[param1]) + if param2 is not None: + param2, value2 = param2 + self.assertEqual(value2, msg[param2]) + if param3 is not None: + param3, value3 = param3 + self.failUnless(param3 in msg.params) + self.assertEqual(value3, msg[param3]) + if param4 is not None: + param4, value4 = param4 + self.failUnless(param4 in msg.params) + self.assertEqual(value4, msg[param4]) + if param5 is not None: + param5, value5 = param5 + self.failUnless(param5 in msg.params) + self.assertEqual(value5, msg[param5]) + if param6 is not None: + param6, value6 = param6 + self.failUnless(param6 in msg.params) + self.assertEqual(value6, msg[param6]) + if param7 is not None: + param7, value7 = param7 + self.failUnless(param7 in msg.params) + self.assertEqual(value7, msg[param7]) + if param8 is not None: + param8, value8 = param8 + self.failUnless(param8 in msg.params) + self.assertEqual(value8, msg[param8]) + if param9 is not None: + param9, value9 = param9 + self.failUnless(param9 in msg.params) + self.assertEqual(value9, msg[param9]) + if param10 is not None: + param10, value10 = param10 + self.failUnless(param10 in msg.params) + self.assertEqual(value10, msg[param10]) + if param11 is not None: + param11, value11 = param11 + self.failUnless(param11 in msg.params) + self.assertEqual(value11, msg[param11]) + if param12 is not None: + param12, value12 = param12 + self.failUnless(param12 in msg.params) + self.assertEqual(value12, msg[param12]) + if param13 is not None: + param13, value13 = param13 + self.failUnless(param13 in msg.params) + self.assertEqual(value13, msg[param13]) + if param14 is not None: + param14, value14 = param14 + self.failUnless(param14 in msg.params) + self.assertEqual(value14, msg[param14]) + if param15 is not None: + param15, value15 = param15 + self.failUnless(param15 in msg.params) + self.assertEqual(value15, msg[param15]) + + if data is not None: + self.assertEqual(data, msg.data) + return msg + + def sendResponseMessage(self, messageName, data=None, callNext=True, **params): + """Sends a message to the client""" + if messageName in fcp2.MessagesAll: + msgClass = fcp2.MessagesAll[messageName] + else: + msgClass = fcp2.newMessageClass(messageName) + msg = msgClass(data=data, **params) + self.client.ioHandler.io.readBuffer += msg.toString() + if callNext: + self.client.next() + + + #NOTE: iohandler is buffered + # ..so be careful not to get messages you send + # + # 1. sendResponseMessage('blah') + # 2. getNextMessage() + # 3. >>> 'blah' + def getNextMessage(self): + """Returns the next message the client send""" + + # cheat a bit to get iohandler to read a message from writeBuffer + if self.ioOpen(): + self.client.ioHandler.io.setReverseDirection(True) + try: + msg = self.client.ioHandler.readMessage() + except fcp2.ErrorIOTimeout: + return None + finally: + self.client.ioHandler.io.setReverseDirection(False) + return msg + + + def ioOpen(self): + """Checks if the clients io is open""" + return self.client.ioHandler.isOpen() + + + def getIO(self): + """Returns the clients io""" + return self.client.ioHandler.io + + + def setUp(self): + # conect all events + self.events = [] # events received from the client + for event in self.client.events: + event += self._captureEventsFromClient + + def tearDown(self): + # disconnect all events + for event in self.client.events: + event -= self._captureEventsFromClient + # clean up tmpfiles + for fpath in self.tmpfiles: os.remove(fpath) + if self.client.isOpen(): + self.client.close() + + +#*********************************************************************************** +# +#*********************************************************************************** +#TODO: class Test.... set/getDebugVerbosity / connectionName and friends... (BaseTestConnectedClient): + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_close(BaseTestClient): + + #NOTE: currently ClientDisconnected() is triggered even if the client was not connected + def test_close_disconnected_client(self): + self.client.close() + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.Close), + ) + + def test_close_connected_client(self): + self.connectClient() + self.client.close() + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.Close), + ) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_isOpen(BaseTestClient): + + def test_isOpen(self): + self.failIf(self.client.isOpen()) + self.connectClient() + self.failUnless(self.client.isOpen()) + self.closeClient() + self.failIf(self.client.isOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +#TODO: not idea how to test this +class Test_connect(BaseTestClient): + pass + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_iterConnect(BaseTestClient): + + def test_iterConnect_success(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + msg = self.getNextMessage() + if msg is not None: + self.failUnless(msg.name == 'ClientHello') + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + Build='9999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientConnected, + fcp2.MsgNodeHello, + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + self.client.close() + + + def test_iterConnect_ioRefusesConnection(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.getIO().setAllowConnect(False) + + self.failUnless(nodeHello is None) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.IOConnectFailed), + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_iterConnect_nodeHelloNeverArrives(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + pass + + self.failUnless(nodeHello is None) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.NoNodeHello), + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_iterConnect_socketDies(self): + enum = self.client.iterConnect(duration=0.2, timeout=0.1) + errorRaised = False + while True: + try: + enum.next() + except StopIteration: + break + except fcp2.ErrorIOBroken, d: + errorRaised = True + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.ConnectionDied), + #('Param', None), + ) + break + self.getIO().setBroken(True) + + self.failUnless(errorRaised) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_iterIterConnect_unknownNodehello(self): + + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'i-am-invalid', + callNext=False, + ) + + self.failUnless(nodeHello is None) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.UnknownNodeHello), + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_iterIterConnect_connect(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Build='9999999999', + + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientConnected, + fcp2.MsgNodeHello, + ) + self.assertHasNextEvent(None) + #self.assertHasNextMessage(None) # due to our message hacking, NodeHello is still in io + self.failUnless(self.ioOpen()) + self.closeClient() + + + def test_iterIterConnect_reconnect(self): + self.connectClient() + + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Build='9999999999', + + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.Reconnect) + ) + self.assertHasNextEvent( + self.client.events.ClientConnected, + fcp2.MsgNodeHello, + ) + self.assertHasNextEvent(None) + #self.assertHasNextMessage(None) # due to our message hacking, NodeHello is still in io + self.failUnless(self.ioOpen()) + self.closeClient() + + + def test_iterIterConnect_VersionMissmatch_FCPVersion(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'NodeHello', + FCPVersion='0.0', + Build='9999999999', + + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.VersionMissmatch) + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + self.closeClient() + + + def test_iterIterConnect_VersionMissmatch_Build(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Build='0', + + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.VersionMissmatch) + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + self.closeClient() + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_CloseConnectionDuplicateClientName(BaseTestClient): + + def test_CloseConnectionDuplicateClientName(self): + self.connectClient() + self.sendResponseMessage( + 'CloseConnectionDuplicateClientName', + ) + + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.DuplicateClientName) + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + self.closeClient() + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_closeNode(BaseTestClient): + + def test_closeNode(self): + self.connectClient() + self.client.closeNode() + self.assertHasNextMessage(fcp2.MsgShutdown) + self.sendResponseMessage( + 'ProtocolError', + Code='18' + ) + + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.NodeClosing) + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + self.closeClient() + +#*********************************************************************************** +# +#*********************************************************************************** +# TODO: no idea how to test this +class Test_startNode(BaseTestClient): + pass + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_get_setConnectionName(BaseTestClient): + + def test_get_setConnectionName(self): + + self.failIf(self.client.setConnectionName() == 'foo') + self.client.setConnectionName('foo') + self.failIf(self.client.getConnectionName() != 'foo') + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_get_setDebugVerbosity(BaseTestClient): + + def test_get_setDebugVerbosity(self): + oldVerbosity = self.client.getDebugVerbosity() + self.client.setDebugVerbosity(fcp2.ConstDebugVerbosity.Quiet) + self.client.setDebugVerbosity(oldVerbosity) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_versionCheckNodeHello(BaseTestClient): + + def test_get_versionCheckNodeHello(self): + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion, + 'Build':self.client.ExpectedNodeBuild, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == True) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion -1, + 'Build':self.client.ExpectedNodeBuild, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == False) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion, + 'Build':self.client.ExpectedNodeBuild -1, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == False) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion +1, + 'Build':self.client.ExpectedNodeBuild, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == False) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion, + 'Build':self.client.ExpectedNodeBuild +1, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == True) + +#*********************************************************************************** +# +#*********************************************************************************** +# TODO: not tested +class Test_handleMessage(BaseTestClient): + pass + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_next(BaseTestClient): + + def test_idle(self): + self.connectClient() + msg = self.client.next() + msg2 = self.assertHasNextEvent( + self.client.events.Idle, + fcp2.MsgClientSocketTimeout, + ) + self.failUnless(msg == msg2) + + + def test_io_broken(self): + self.connectClient() + self.getIO().setBroken(True) + + self.assertRaises(fcp2.ErrorIOBroken, self.client.next, ) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.ConnectionDied) + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_hasMessage(self): + self.connectClient() + self.sendResponseMessage( + 'HiThere', + callNext=False + ) + msg = self.client.next() + self.assertEqual(msg.name, 'HiThere') + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +#TODO: not tested +class Test_run(BaseTestClient): + pass + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_sendMessage(BaseTestClient): + + def test_io_broken(self): + self.connectClient() + self.getIO().setBroken(True) + + self.assertRaises(fcp2.ErrorIOBroken, self.client.sendMessage, fcp2.MsgClientHello()) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.ConnectionDied) + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_messageSend(self): + self.connectClient() + self.client.sendMessage(fcp2.MsgClientHello()) + msg = self.client.next() + self.assertHasNextMessage(fcp2.MsgClientHello) + self.assertHasNextEvent(self.client.events.Idle) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_getConfig(BaseTestClient): + + def test_getConfig(self): + self.connectClient() + self.client.getConfig( + withCurrent=True, + withDefaults=True, + withExpertFlag=True, + withForceWriteFlag=True, + withSortOrder=True, + withShortDescription=True, + withLongDescription=True, + withDataTypes=True, + ) + msg = self.client.next() + self.assertHasNextMessage(fcp2.MsgGetConfig, + ('WithCurrent', True), + ('WithDefaults', True), + ('WithExpertFlag', True), + ('WithForceWriteFlag', True), + ('WithSortOrder', True), + ('WithShortDescription', True), + ('WithLongDescription', True), + ('WithDataTypes', True), + ) + self.assertHasNextEvent(self.client.events.Idle) + + + self.sendResponseMessage('ConfigData', + foo='1234', + ) + self.assertHasNextEvent( + self.client.events.ConfigData, + fcp2.MsgConfigData, + ('foo', '1234') + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_modifyConfig(BaseTestClient): + + def test_getConfig(self): + self.connectClient() + self.client.modifyConfig( + {'foo': '1234'} + ) + msg = self.client.next() + self.assertHasNextMessage(fcp2.MsgModifyConfig, + ('foo', '1234'), + ) + self.assertHasNextEvent(self.client.events.Idle) + + 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): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey) + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], fcp2.ConstRequestType.GetData) + + + def test_300_message_send(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage( + fcp2.MsgClientGet, + ('URI', myKey), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_400_progress(self): + + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + self.sendResponseMessage( + 'SimpleProgress', + Identifier=myIdentifier, + Total=0, + Required=0, + Failed=0, + FatallyFailed=0, + Succeeded=0, + ) + + self.assertHasNextEvent( + self.client.events.RequestProgress, + fcp2.MsgClientGet, + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_500_completed_successfuly(self): + + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + 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 + ) + + # non persistent requests are removed emidiately + self.failIf(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_600_completed_with_error(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + self.sendResponseMessage( + fcp2.MsgGetFailed.name, + 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 + ), + ) + + # non persistent requests are removed emidiately + self.failIf(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_700_peristent_request_auto_retrieve_data(self): + + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=fcp2.ConstPersistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + + data = 'foo' + params = { + 'Identifier': myIdentifier, + 'Global': 'false', + 'DataLength': len(data), + 'Metadata.ContentType': 'any', + } + self.sendResponseMessage( + 'DataFound', + **params + ) + + self.assertHasNextMessage(fcp2.MsgGetRequestStatus) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + + def test_800_peristent_request_not_removed_on_success(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=fcp2.ConstPersistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + data = 'foo' + self.sendResponseMessage( + 'AllData', + data=data, + Identifier=myIdentifier, + Global='false', + DataLength=len(data), + ) + + self.assertHasNextEvent(self.client.events.RequestCompleted) + + # persistent requests are not removed emidiately + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_900_peristent_request_not_removed_on_error(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=fcp2.ConstPersistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + + self.assertHasNextEvent(self.client.events.RequestFailed) + + # persistent requests are not removed emidiately + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_910_restore_peristent_request_failure(self): + self.connectClient() + requestsAll = self.client.getRequests() + myIdentifier = '123456789' + self.sendResponseMessage( + 'PersistentGet', + Identifier=myIdentifier, + ClientToken='i-am-invalid', + Global='false', + + callNext=False + ) + self.assertRaises(fcp2.ErrorMessageParse, self.client.next) + self.failIf(myIdentifier in requestsAll) + + + def test_920_restore_peristent_request_success(self): + self.connectClient() + requestsAll = self.client.getRequests() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=fcp2.ConstPersistence.Forever) + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + del requestsAll[myIdentifier] + + self.sendResponseMessage( + 'PersistentGet', + **myRequest.params + ) + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + msg = self.assertHasNextEvent( + self.client.events.RequestRestored, + fcp2.MsgClientGet, + ('Identifier', myIdentifier), + ('RequestStatus', fcp2.ConstRequestStatus.Restored), # no RequestStatus.Pending flag should be set here + ) + + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_getFile(BaseTestClient): + + def test_100_request_registered(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getFile(myKey, 'foo.txt') + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], fcp2.ConstRequestType.GetFile) + + + def test_200_key_object_is_accepted(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getFile(myKey, 'foo.txt') + requestsAll = self.client.getRequests() + + + def test_300_dda_denied(self): + self.connectClient() + 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() + + self.assertHasNextMessage(fcp2.MsgClientGet) + 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='true', + ) + + # check if our tempfile was removed + self.failIf(os.path.isfile(fpath)) + + # client sahould send a new ClientGet + msg = self.assertHasNextMessage(fcp2.MsgClientGet) + + # no events should have been triggered upo to now + self.assertHasNextEvent(None) + + # respond with a PersistentGet + self.sendResponseMessage( + 'PersistentGet', + Started='false', + **msg.params + ) + + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_getKeyInfo(BaseTestClient): + + + def test_100_request_registered(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], fcp2.ConstRequestType.GetKeyInfo) + + def test_200_key_object_is_accepted(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + + myIdentifier = self.client.getKeyInfo(myKey) + requestsAll = self.client.getRequests() + + + def test_300_getKeyInfo_Success(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + + 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.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_400_GetKeyInfo_TooBig(self): + self.connectClient() + + # test specdial case where ProtocolError.TooBig is handled as success + # request a arbitrary uri + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + 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.failIf(myIdentifier in requestsAll) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_500_GetKeyInfo_Failure(self): + self.connectClient() + + # request a arbitrary file + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + 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.failUnless(self.ioOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_disconnectReason(BaseTestClient): + + def test_1000_DuplicateClientName(self): + self.connectClient() + self.sendResponseMessage('CloseConnectionDuplicateClientName') + msg = self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.DuplicateClientName), + ) + + self.failIf(self.ioOpen()) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + + + def test_1001_SocketDied_Receive(self): + self.connectClient() + self.getIO().setBroken(True) + self.assertRaises(fcp2.ErrorIOBroken, self.client.next) + + # check if ClientDisconnected events has been triggered + msg = self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.ConnectionDied), + ) + + self.failIf(self.ioOpen()) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.connectClient() + + + def test_1002_SocketDied_Send(self): + self.connectClient() + self.getIO().setBroken(True) + + # send a test message + self.assertRaises(fcp2.ErrorIOBroken, self.client.sendMessage, fcp2.newMessageClass('test')()) + + # check if ClientDisconnected events has been triggered + msg = self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.ConnectionDied), + ) + + self.failIf(self.ioOpen()) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.connectClient() + + + def test_1003_Shutdown(self): + self.connectClient() + self.client.closeNode() + + msg = self.assertHasNextMessage(fcp2.MsgShutdown) + self.sendResponseMessage( + 'ProtocolError', + Code='18', # Shutting down + ) + + # check events the client triggered + msg = self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.NodeClosing) + ) + + self.failIf(self.ioOpen()) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.connectClient() + + + + def test_1004_VersionMismatch(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=1, timeout=0.1)): + if n == 2: + self.assertHasNextMessage( + fcp2.MsgClientHello + ) + self.sendResponseMessage( + 'NodeHello', + FCPVersion='0.0', + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='0', + Build='0', + ExRevision='0', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False + ) + + # check events the client triggered + msg = self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.VersionMissmatch) + ) + + self.failIf(self.ioOpen()) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.connectClient() + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_clientPut(BaseTestClient): + + def test_keyTailIsDisallowed(self): + self.connectClient() + + # 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') + + myKey = fcp2.KeySSK(keyData=DummyKeyData, tail='foo') + self.assertRaises(ValueError, self.client.clientPut, fcp2.ConstRequestType.PutData, myKey, data='foo') + + myKey = fcp2.KeyUSK(keyData=DummyKeyData, tail='foo') + self.assertRaises(ValueError, self.client.clientPut, fcp2.ConstRequestType.PutData, myKey, data='foo') + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putData(BaseTestClient): + + def test_putData_Success(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putData( + myKey, + 'any data here' + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutSuccessful', + Identifier=myIdentifier, + URI=myKey + ) + + self.assertHasNextEvent( + self.client.events.RequestCompleted, + fcp2.MsgClientPut, + ('RequestStatus', fcp2.ConstRequestStatus.Success | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + + def test_putData_Failure(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putData( + myKey, + 'any data here' + ) + + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutFailed', + Identifier=myIdentifier, + Code='5', # rout not found + ) + + self.assertHasNextEvent( + self.client.events.RequestFailed, + fcp2.MsgClientPut, + ('RequestStatus', fcp2.ConstRequestStatus.Error | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putDir(BaseTestClient): + def test_putDir_Success(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putDir( + myKey, + 'myDirectory' + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPutDiskDir) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutSuccessful', + Identifier=myIdentifier, + URI=myKey + ) + + self.assertHasNextEvent( + self.client.events.RequestCompleted, + fcp2.MsgClientPutDiskDir, + ('RequestStatus', fcp2.ConstRequestStatus.Success | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + + def test_putDir_Failure(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putDir( + myKey, + 'myDirectory' + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPutDiskDir) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutFailed', + Identifier=myIdentifier, + Code='5', # rout not found + ) + + self.assertHasNextEvent( + self.client.events.RequestFailed, + fcp2.MsgClientPutDiskDir, + ('RequestStatus', fcp2.ConstRequestStatus.Error | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putFile(BaseTestClient): + + def test_putFile_Success(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putFile( + myKey, + 'myFile.txt' + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutSuccessful', + Identifier=myIdentifier, + URI=myKey + ) + + self.assertHasNextEvent( + self.client.events.RequestCompleted, + fcp2.MsgClientPut, + ('RequestStatus', fcp2.ConstRequestStatus.Success | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + + def test_putFile_Failure(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putFile( + myKey, + 'myFile.txt' + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutFailed', + Identifier=myIdentifier, + Code='5', # rout not found + ) + + self.assertHasNextEvent( + self.client.events.RequestFailed, + fcp2.MsgClientPut, + ('RequestStatus', fcp2.ConstRequestStatus.Error | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putMultiple(BaseTestClient): + def test_putMultiple_Success(self): + self.connectClient() + + items = [ + { + 'RequestType': fcp2.ConstRequestType.PutData, + 'Data': '12345', + 'Name': 'myItem0', + }, + { + 'RequestType': fcp2.ConstRequestType.PutFile, + 'Filename': 'myFile.txt', + 'Name': 'myItem1', + }, + { + 'RequestType': fcp2.ConstRequestType.PutRedirect, + 'TargetURI': 'CHK@123456789', + 'Name': 'myItem2', + }, + { + 'RequestType': fcp2.ConstRequestType.PutData, + 'Data': '67890', + 'Name': 'myItem3', + }, + ] + + # request a arbitrary file + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putMultiple( + myKey, + items + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + msg = self.assertHasNextMessage( + fcp2.MsgClientPutComplexDir, + ('Files.0.Name', 'myItem0'), + ('Files.0.UploadFrom', 'direct'), + ('Files.0.DataLength', 5), + + ('Files.1.Name', 'myItem1'), + ('Files.1.UploadFrom', 'disk'), + ('Files.1.Filename', 'myFile.txt'), + + ('Files.2.Name', 'myItem2'), + ('Files.2.UploadFrom', 'redirect'), + ('Files.2.TargetURI', 'CHK@123456789'), + + ('Files.3.Name', 'myItem3'), + ('Files.3.UploadFrom', 'direct'), + ('Files.3.DataLength', 5), + + data='1234567890' + ) + + #for k, v in sorted(msg.params.items()): + # print k, v + + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutSuccessful', + Identifier=myIdentifier, + URI=myKey + ) + + self.assertHasNextEvent( + self.client.events.RequestCompleted, + fcp2.MsgClientPutComplexDir, + ('RequestStatus', fcp2.ConstRequestStatus.Success | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + + def test_putMultiple_ItemErrors(self): + self.connectClient() + + # upload directory is not allowed + items = [ + { + 'RequestType': fcp2.ConstRequestType.PutDir, + 'Data': '12345', + 'Name': 'myItem0', + }, + ] + myKey = fcp2.KeyKSK('foo') + self.assertRaises(ValueError, self.client.putMultiple, myKey, items) + + #TODO: how to test required params? + # ...just some samples below + + # no request type specified + items = [ + { + #'RequestType': fcp2.ConstRequestType.PutData, + 'Data': '12345', + 'Name': 'myItem0', + }, + ] + self.assertRaises(ValueError, self.client.putMultiple, myKey, items) + + # param missing (we enforce all required parameters) + items = [ + { + 'RequestType': fcp2.ConstRequestType.PutData, + #'Data': '12345', + #'Name': 'myItem0', + }, + ] + self.assertRaises(ValueError, self.client.putMultiple, myKey, items) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putRedirect(BaseTestClient): + + + def testPutRedirect_Success(self): + self.connectClient() + + # request a arbitrary file + myRedirect = fcp2.KeyKSK('foo') + myKey = fcp2.Key('CHK@' + DummyKeyData) + myIdentifier = self.client.putRedirect( + myRedirect, + myKey, + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutSuccessful', + Identifier=myIdentifier, + URI=myRedirect + ) + + self.assertHasNextEvent( + self.client.events.RequestCompleted, + fcp2.MsgClientPut, + ('RequestStatus', fcp2.ConstRequestStatus.Success | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + + def testPutRedirect_Failure(self): + self.connectClient() + + # request a arbitrary file + myRedirect = fcp2.KeyKSK('foo') + myKey = fcp2.Key('CHK@' + DummyKeyData) + myIdentifier = self.client.putRedirect( + m... [truncated message content] |
From: <jU...@us...> - 2008-07-07 07:17:33
|
Revision: 532 http://fclient.svn.sourceforge.net/fclient/?rev=532&view=rev Author: jUrner Date: 2008-07-07 00:17:41 -0700 (Mon, 07 Jul 2008) Log Message: ----------- withdraw alpha release. premature ..even for an alpha :-) Removed Paths: ------------- tags/fcp2/0.0.1/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-07 07:15:48
|
Revision: 531 http://fclient.svn.sourceforge.net/fclient/?rev=531&view=rev Author: jUrner Date: 2008-07-07 00:15:56 -0700 (Mon, 07 Jul 2008) Log Message: ----------- test should work now directly from test dir Modified Paths: -------------- trunk/fcp2/src/test/dummy_io.py trunk/fcp2/src/test/test_all.py trunk/fcp2/src/test/test_client.py trunk/fcp2/src/test/test_config.py trunk/fcp2/src/test/test_iohandler.py trunk/fcp2/src/test/test_key.py trunk/fcp2/src/test/test_message.py trunk/fcp2/src/test/test_types.py Modified: trunk/fcp2/src/test/dummy_io.py =================================================================== --- trunk/fcp2/src/test/dummy_io.py 2008-07-07 07:14:44 UTC (rev 530) +++ trunk/fcp2/src/test/dummy_io.py 2008-07-07 07:15:56 UTC (rev 531) @@ -2,24 +2,35 @@ import os, sys -#--> 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 -from fcp2 import iohandler +def relimport(what): + import imp, os, sys + L = what.split('.') + if not L or L[0]: + raise ValueError('relative import must start with a dot') + name = os.path.abspath(__file__) + while L: + p = L.pop(0) + if p: name = os.path.join(name, p) + else: + name, _ = os.path.split(name) + if not _: break + if L: raise ValueError('root level exceeded') + mod = sys.modules.get(name, None) + if mod is None: + fpath, fname = os.path.split(name) + fp, fpath, suffixes = imp.find_module(fname, [fpath, ]) + print fp, fpath, suffixes + try: mod = imp.load_module(name, fp, fpath, suffixes) + finally: + if fp is not None: fp.close() + return mod -del hack -#<-- rel import hack +fcp2 = relimport('..fcp2') #******************************************************************** # #******************************************************************** -class DummyIO(iohandler.IOObjectBase): +class DummyIO(fcp2.iohandler.IOObjectBase): def __init__(self): self.readBuffer = '' # buffer client reads from Modified: trunk/fcp2/src/test/test_all.py =================================================================== --- trunk/fcp2/src/test/test_all.py 2008-07-07 07:14:44 UTC (rev 530) +++ trunk/fcp2/src/test/test_all.py 2008-07-07 07:15:56 UTC (rev 531) @@ -17,11 +17,3 @@ suite = getattr(mod, 'suite') unittest.TextTestRunner(verbosity=1).run(suite()) - - - - - - - - Modified: trunk/fcp2/src/test/test_client.py =================================================================== --- trunk/fcp2/src/test/test_client.py 2008-07-07 07:14:44 UTC (rev 530) +++ trunk/fcp2/src/test/test_client.py 2008-07-07 07:15:56 UTC (rev 531) @@ -8,8 +8,32 @@ import time import unittest -import fcp2 -from dummy_io import DummyIO + +# hack relative imports to make in-place testing work +def relimport(what): + import imp, os, sys + L = what.split('.') + if not L or L[0]: + raise ValueError('relative import must start with a dot') + name = os.path.abspath(__file__) + while L: + p = L.pop(0) + if p: name = os.path.join(name, p) + else: + name, _ = os.path.split(name) + if not _: break + if L: raise ValueError('root level exceeded') + mod = sys.modules.get(name, None) + if mod is None: + fpath, fname = os.path.split(name) + fp, fpath, suffixes = imp.find_module(fname, [fpath, ]) + try: mod = imp.load_module(name, fp, fpath, suffixes) + finally: + if fp is not None: fp.close() + return mod + +fcp2 = relimport('..fcp2') +dummy_io = relimport('.dummy_io') #*********************************************************************************** # #*********************************************************************************** @@ -29,7 +53,7 @@ debugVerbosity=fcp2.ConstDebugVerbosity.Quiet ) - client.ioHandler.setIOPrototype(DummyIO) + client.ioHandler.setIOPrototype(dummy_io.DummyIO) def __init__(self, *args, **kwargs): Modified: trunk/fcp2/src/test/test_config.py =================================================================== --- trunk/fcp2/src/test/test_config.py 2008-07-07 07:14:44 UTC (rev 530) +++ trunk/fcp2/src/test/test_config.py 2008-07-07 07:15:56 UTC (rev 531) @@ -4,7 +4,30 @@ import socket import unittest -import fcp2 +# hack relative imports to make in-place testing work +def relimport(what): + import imp, os, sys + L = what.split('.') + if not L or L[0]: + raise ValueError('relative import must start with a dot') + name = os.path.abspath(__file__) + while L: + p = L.pop(0) + if p: name = os.path.join(name, p) + else: + name, _ = os.path.split(name) + if not _: break + if L: raise ValueError('root level exceeded') + mod = sys.modules.get(name, None) + if mod is None: + fpath, fname = os.path.split(name) + fp, fpath, suffixes = imp.find_module(fname, [fpath, ]) + try: mod = imp.load_module(name, fp, fpath, suffixes) + finally: + if fp is not None: fp.close() + return mod + +fcp2 = relimport('..fcp2') #**************************************************************************************** # #**************************************************************************************** Modified: trunk/fcp2/src/test/test_iohandler.py =================================================================== --- trunk/fcp2/src/test/test_iohandler.py 2008-07-07 07:14:44 UTC (rev 530) +++ trunk/fcp2/src/test/test_iohandler.py 2008-07-07 07:15:56 UTC (rev 531) @@ -4,8 +4,30 @@ import socket import unittest +# hack relative imports to make in-place testing work +def relimport(what): + import imp, os, sys + L = what.split('.') + if not L or L[0]: + raise ValueError('relative import must start with a dot') + name = os.path.abspath(__file__) + while L: + p = L.pop(0) + if p: name = os.path.join(name, p) + else: + name, _ = os.path.split(name) + if not _: break + if L: raise ValueError('root level exceeded') + mod = sys.modules.get(name, None) + if mod is None: + fpath, fname = os.path.split(name) + fp, fpath, suffixes = imp.find_module(fname, [fpath, ]) + try: mod = imp.load_module(name, fp, fpath, suffixes) + finally: + if fp is not None: fp.close() + return mod -import fcp2 +fcp2 = relimport('..fcp2') #**************************************************************************************** # #**************************************************************************************** Modified: trunk/fcp2/src/test/test_key.py =================================================================== --- trunk/fcp2/src/test/test_key.py 2008-07-07 07:14:44 UTC (rev 530) +++ trunk/fcp2/src/test/test_key.py 2008-07-07 07:15:56 UTC (rev 531) @@ -4,7 +4,30 @@ import socket import unittest -import fcp2 +# hack relative imports to make in-place testing work +def relimport(what): + import imp, os, sys + L = what.split('.') + if not L or L[0]: + raise ValueError('relative import must start with a dot') + name = os.path.abspath(__file__) + while L: + p = L.pop(0) + if p: name = os.path.join(name, p) + else: + name, _ = os.path.split(name) + if not _: break + if L: raise ValueError('root level exceeded') + mod = sys.modules.get(name, None) + if mod is None: + fpath, fname = os.path.split(name) + fp, fpath, suffixes = imp.find_module(fname, [fpath, ]) + try: mod = imp.load_module(name, fp, fpath, suffixes) + finally: + if fp is not None: fp.close() + return mod + +fcp2 = relimport('..fcp2') #**************************************************************************************** # #**************************************************************************************** Modified: trunk/fcp2/src/test/test_message.py =================================================================== --- trunk/fcp2/src/test/test_message.py 2008-07-07 07:14:44 UTC (rev 530) +++ trunk/fcp2/src/test/test_message.py 2008-07-07 07:15:56 UTC (rev 531) @@ -4,19 +4,30 @@ 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) +# hack relative imports to make in-place testing work +def relimport(what): + import imp, os, sys + L = what.split('.') + if not L or L[0]: + raise ValueError('relative import must start with a dot') + name = os.path.abspath(__file__) + while L: + p = L.pop(0) + if p: name = os.path.join(name, p) + else: + name, _ = os.path.split(name) + if not _: break + if L: raise ValueError('root level exceeded') + mod = sys.modules.get(name, None) + if mod is None: + fpath, fname = os.path.split(name) + fp, fpath, suffixes = imp.find_module(fname, [fpath, ]) + try: mod = imp.load_module(name, fp, fpath, suffixes) + finally: + if fp is not None: fp.close() + return mod -import fcp2 - -del hack -#<-- rel import hack +fcp2 = relimport('..fcp2') #**************************************************************************************** # #**************************************************************************************** Modified: trunk/fcp2/src/test/test_types.py =================================================================== --- trunk/fcp2/src/test/test_types.py 2008-07-07 07:14:44 UTC (rev 530) +++ trunk/fcp2/src/test/test_types.py 2008-07-07 07:15:56 UTC (rev 531) @@ -4,7 +4,31 @@ import socket import unittest -import fcp2 + +# hack relative imports to make in-place testing work +def relimport(what): + import imp, os, sys + L = what.split('.') + if not L or L[0]: + raise ValueError('relative import must start with a dot') + name = os.path.abspath(__file__) + while L: + p = L.pop(0) + if p: name = os.path.join(name, p) + else: + name, _ = os.path.split(name) + if not _: break + if L: raise ValueError('root level exceeded') + mod = sys.modules.get(name, None) + if mod is None: + fpath, fname = os.path.split(name) + fp, fpath, suffixes = imp.find_module(fname, [fpath, ]) + try: mod = imp.load_module(name, fp, fpath, suffixes) + finally: + if fp is not None: fp.close() + return mod + +fcp2 = relimport('..fcp2') #**************************************************************************************** # #**************************************************************************************** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-07 07:14:37
|
Revision: 530 http://fclient.svn.sourceforge.net/fclient/?rev=530&view=rev Author: jUrner Date: 2008-07-07 00:14:44 -0700 (Mon, 07 Jul 2008) Log Message: ----------- still struggling with relative imports. hopefuly fixed now Modified Paths: -------------- trunk/fcp2/src/fcp2/__init__.py trunk/fcp2/src/fcp2/client.py trunk/fcp2/src/fcp2/config.py trunk/fcp2/src/fcp2/consts.py trunk/fcp2/src/fcp2/events.py trunk/fcp2/src/fcp2/iohandler.py trunk/fcp2/src/fcp2/key.py trunk/fcp2/src/fcp2/message.py trunk/fcp2/src/fcp2/types.py Modified: trunk/fcp2/src/fcp2/__init__.py =================================================================== --- trunk/fcp2/src/fcp2/__init__.py 2008-07-06 21:41:05 UTC (rev 529) +++ trunk/fcp2/src/fcp2/__init__.py 2008-07-07 07:14:44 UTC (rev 530) @@ -4,33 +4,46 @@ @requires: python >= 2.5 """ -import os, sys - +from __future__ import absolute_import +if __name__ == '__main__': # see --> http://bugs.python.org/issue1510172 . works only current dir and below + import os; __path__ = [os.path.dirname(__file__)] + __author__ = 'Juergen Urner' __copyright__ = '(c) 2008 - Juergen Urner' __email__ = 'jue...@ar...' __licence__ = 'Mit' __version__ = '0.0.1' - -#--> rel import hack -class _RelImportHack(object): - def __init__(self, n): - fpath = os.path.abspath(__file__) - for i in xrange(n): fpath = os.path.dirname(fpath) - sys.path.insert(0, fpath) - def __del__(self): sys.path.pop(0) -hack = _RelImportHack(2) - -from fcp2.client import * -from fcp2.config import * -from fcp2.consts import * -from fcp2.key import * -from fcp2.message import * -from fcp2.types import * - -del hack, _RelImportHack -#<-- rel import hack +from .client import Client +from .config import (Config, ConfigDataType, ConfigItem, ConfigKeySep, ConfigValueClass) +from .consts import (ConstByteAmountPostfix, ConstConnectReason, ConstDebugVerbosity, ConstDisconnectReason, + ConstFetchError, ConstFilenameCollision, ConstInsertError, ConstKeyType, ConstLogMessages, + ConstLogger, ConstMessage, ConstPeerNodeStatus, ConstPeerNoteType, ConstPersistence, + ConstPriority, ConstProtocolError, ConstPutDirType, ConstRequestModified, ConstRequestStatus, + ConstRequestType, ConstReturnType, ConstTimeDeltaPostfix, ConstUploadFrom, ConstVerbosity, + Error, ErrorIOBroken, ErrorIOClosed, ErrorIOConnectFailed, ErrorIOTimeout, ErrorMessageParse, + FcpFalse, FcpTrue) +from .key import (Key, KeyCHK, KeyKSK, KeySSK, KeyTypesAll, KeyUSK, TypeKey, base64UrlsaveDecode, keyNormkey) +from .message import (MessagesAll, MsgAddPeer, MsgAllData, MsgClientDisconnected, MsgClientGet, MsgClientHello, + MsgClientPut, MsgClientPutComplexDir, MsgClientPutDiskDir, MsgClientSocketDied, + MsgClientSocketTimeout, MsgCloseConnectionDuplicateClientName, MsgConfigData, MsgDataFound, + MsgEndListPeerNotes, MsgEndListPeers, MsgEndListPersistentRequests, MsgFCPPluginMessage, + MsgFCPPluginReply, MsgFinishedCompression, MsgGenerateSSK, MsgGetConfig, MsgGetFailed, + MsgGetNode, MsgGetPluginInfo, MsgGetRequestStatus, MsgIdentifierCollision, MsgListPeer, + MsgListPeerNotes, MsgListPeers, MsgListPersistentRequests, MsgModifyConfig, MsgModifyPeer, + MsgModifyPeerNote, MsgModifyPersistentRequest, MsgNodeData, MsgNodeHello, MsgPeer, MsgPeerNote, + MsgPeerRemoved, MsgPersistentGet, MsgPersistentPut, MsgPersistentPutDir, MsgPersistentRequestModified, + MsgPersistentRequestRemoved, MsgPluginInfo, MsgProtocolError, MsgPutFailed, MsgPutFetchable, + MsgPutSuccessful, MsgRemovePeer, MsgRemoveRequest, MsgSSKKeypair, MsgShutdown, MsgSimpleProgress, + MsgStartedCompression, MsgSubscribeUSK, MsgSubscribedUSK, MsgSubscribedUSKUpdate, + MsgTestDDAComplete, MsgTestDDAReply, MsgTestDDARequest, MsgTestDDAResponse, MsgURIGenerated, + MsgUnknownNodeIdentifier, MsgUnknownPeerNoteType, MsgWatchGlobal, PersistentParamsSep, + newMessageClass) +from .types import (Type, TypeBase64EncodedString, TypeBool, TypeByteAmount, TypeChoiceFProxyCss, TypeChoiceLoggerPriority, + TypeChoiceNodeDownloadAllowedDirs, TypeChoiceNodeUploadAllowedDirs, TypeChoicePriorityPolicy, + TypeChoiceSSLVersion, TypeDirname, TypeFilename, TypeFloat, TypeIP, TypeIPList, TypeIPort, TypeInt, + TypeIntWithBounds, TypeInt_GetFailed_ExpectedDataLenght, TypePercent, TypeString, TypeStringList, TypeTime, + TypeTimeDelta, TypeUri) #**************************************************************************************** # #**************************************************************************************** Modified: trunk/fcp2/src/fcp2/client.py =================================================================== --- trunk/fcp2/src/fcp2/client.py 2008-07-06 21:41:05 UTC (rev 529) +++ trunk/fcp2/src/fcp2/client.py 2008-07-07 07:14:44 UTC (rev 530) @@ -201,41 +201,33 @@ # someday to handle this # #------------------------------------------------------------------------------------------------------------------------------------------------ - +from __future__ import absolute_import +if __name__ == '__main__': # see --> http://bugs.python.org/issue1510172 . works only current dir and below + import os; __path__ = [os.path.dirname(__file__)] + + import os, sys import atexit import copy -import logging +import logging +import random import subprocess import time -import uuid -#--> rel import hack -class _RelImportHack(object): - def __init__(self, n): - fpath = os.path.abspath(__file__) - for i in xrange(n): fpath = os.path.dirname(fpath) - sys.path.insert(0, fpath) - def __del__(self): sys.path.pop(0) -hack = _RelImportHack(2) +from . import consts +from . import config +from . import events +from . import message +from . import iohandler +from . import types +from . import key -from fcp2 import consts -from fcp2 import config -from fcp2 import events -from fcp2 import message -from fcp2 import iohandler -from fcp2 import types -from fcp2 import key -import random +from .lib import namespace +from .lib import tools -from fcp2.lib import namespace -from fcp2.lib import tools -del hack, _RelImportHack -#<-- rel import hack - __all__ = ['Client', ] #************************************************************************************************* # Modified: trunk/fcp2/src/fcp2/config.py =================================================================== --- trunk/fcp2/src/fcp2/config.py 2008-07-06 21:41:05 UTC (rev 529) +++ trunk/fcp2/src/fcp2/config.py 2008-07-07 07:14:44 UTC (rev 530) @@ -45,25 +45,16 @@ as L{types.Type}. """ -import os, sys -import logging +from __future__ import absolute_import +if __name__ == '__main__': # see --> http://bugs.python.org/issue1510172 . works only current dir and below + import os; __path__ = [os.path.dirname(__file__)] -#--> rel import hack -class _RelImportHack(object): - def __init__(self, n): - fpath = os.path.abspath(__file__) - for i in xrange(n): fpath = os.path.dirname(fpath) - sys.path.insert(0, fpath) - def __del__(self): sys.path.pop(0) -hack = _RelImportHack(2) -from fcp2 import consts -from fcp2 import types -from fcp2 import key +import logging - -del hack, _RelImportHack -#<-- rel import hack +from . import consts +from . import types +from . import key #**************************************************************************************** # #**************************************************************************************** @@ -123,6 +114,7 @@ """ # all known config keys (param class stripped) + Params = { 'console.allowedHosts': types.TypeIPList, # host names, single IPs CIDR-maskip IPs likee 192.168.0.0/24 @@ -460,11 +452,19 @@ yield x return walker(self) - -__all__ = [i for i in dir() if i[0].isupper() and not i.startswith('_')] + #**************************************************************************************************** # #**************************************************************************************************** +def _all_(): + '''* imports are disallowed for relative imports. this print out the list of exported names''' + L = [i for i in globals() if i[0].isupper() and not i.startswith('_')] + L.sort() + print '(' + ', '.join(L) + ')' +#_all_() + + + Modified: trunk/fcp2/src/fcp2/consts.py =================================================================== --- trunk/fcp2/src/fcp2/consts.py 2008-07-06 21:41:05 UTC (rev 529) +++ trunk/fcp2/src/fcp2/consts.py 2008-07-07 07:14:44 UTC (rev 530) @@ -523,5 +523,13 @@ ReportProgress = 0x1 ReportCompression = 0x200 - -__all__ = [i for i in dir() if i[0].isupper() and not i.startswith('_')] +#**************************************************************************************************** +# +#**************************************************************************************************** +def _all_(): + '''* imports are disallowed for relative imports. this print out the list of exported names''' + L = [i for i in globals() if i[0].isupper() and not i.startswith('_')] + L.sort() + print '(' + ', '.join(L) + ')' +#_all_() + Modified: trunk/fcp2/src/fcp2/events.py =================================================================== --- trunk/fcp2/src/fcp2/events.py 2008-07-06 21:41:05 UTC (rev 529) +++ trunk/fcp2/src/fcp2/events.py 2008-07-07 07:14:44 UTC (rev 530) @@ -1,25 +1,14 @@ """Fcp events """ +from __future__ import absolute_import + import os, sys -#--> rel import hack -class _RelImportHack(object): - def __init__(self, n): - fpath = os.path.abspath(__file__) - for i in xrange(n): fpath = os.path.dirname(fpath) - sys.path.insert(0, fpath) - def __del__(self): sys.path.pop(0) -hack = _RelImportHack(2) - -from fcp2 import consts -from fcp2 import types -from fcp2.lib import events - - -del hack, _RelImportHack -#<-- rel import hack +from . import consts +from . import types +from .lib import events #******************************************************************************* # #******************************************************************************* Modified: trunk/fcp2/src/fcp2/iohandler.py =================================================================== --- trunk/fcp2/src/fcp2/iohandler.py 2008-07-06 21:41:05 UTC (rev 529) +++ trunk/fcp2/src/fcp2/iohandler.py 2008-07-07 07:14:44 UTC (rev 530) @@ -3,28 +3,17 @@ The module can be used to handle reading and writing of messages io from sockeet, file or whatever """ - +from __future__ import absolute_import +if __name__ == '__main__': # see --> http://bugs.python.org/issue1510172 . works only current dir and below + import os; __path__ = [os.path.dirname(__file__)] + + import os, sys -import logging import socket import time - -#--> rel import hack, so we don't have to put the package on sys.path -class _RelImportHack(object): - def __init__(self, n): - fpath = os.path.abspath(__file__) - for i in xrange(n): fpath = os.path.dirname(fpath) - sys.path.insert(0, fpath) - def __del__(self): sys.path.pop(0) -hack = _RelImportHack(2) - -from fcp2 import consts -from fcp2 import message -from fcp2 import types - -del hack, _RelImportHack -#<-- rel import hack +from . import consts +from . import message #***************************************************************************** # #***************************************************************************** @@ -359,10 +348,4 @@ raise ValueError('IOObject.BufferSize must be > 0') self._ioPrototype = ioObject - -#*********************************************************************************************** -# -#*********************************************************************************************** -if __name__ == '__main__': - pass \ No newline at end of file Modified: trunk/fcp2/src/fcp2/key.py =================================================================== --- trunk/fcp2/src/fcp2/key.py 2008-07-06 21:41:05 UTC (rev 529) +++ trunk/fcp2/src/fcp2/key.py 2008-07-07 07:14:44 UTC (rev 530) @@ -1,4 +1,7 @@ -"""Fcp keys""" +"""Fcp keys""" +from __future__ import absolute_import +if __name__ == '__main__': # see --> http://bugs.python.org/issue1510172 . works only current dir and below + import os; __path__ = [os.path.dirname(__file__)] import os, sys import base64 @@ -7,19 +10,7 @@ import urllib import urlparse -#--> rel import hack -class _RelImportHack(object): - def __init__(self, n): - fpath = os.path.abspath(__file__) - for i in xrange(n): fpath = os.path.dirname(fpath) - sys.path.insert(0, fpath) - def __del__(self): sys.path.pop(0) -hack = _RelImportHack(2) - -from fcp2 import consts - -del hack, _RelImportHack -#<-- rel import hack +from . import consts #************************************************************************************** # consts #************************************************************************************** @@ -357,7 +348,14 @@ return clss(d['keyData'], docName=d['docName'], edition=edition, tail=d['tail'], pManifest=bool(d['pManifest'])) - -__all__ = [i for i in dir() if i[0].isupper() and not i.startswith('_')] -__all__.append('base64UrlsaveDecode') -__all__.append('keyNormkey') +#**************************************************************************************************** +# +#**************************************************************************************************** +def _all_(): + '''* imports are disallowed for relative imports. this print out the list of exported names''' + L = [i for i in globals() if i[0].isupper() and not i.startswith('_')] + L.append('base64UrlsaveDecode') + L.append('keyNormkey') + L.sort() + print '(' + ', '.join(L) + ')' +#_all_() Modified: trunk/fcp2/src/fcp2/message.py =================================================================== --- trunk/fcp2/src/fcp2/message.py 2008-07-06 21:41:05 UTC (rev 529) +++ trunk/fcp2/src/fcp2/message.py 2008-07-07 07:14:44 UTC (rev 530) @@ -1,28 +1,19 @@ """Freennet Client Protocol messages """ +from __future__ import absolute_import +if __name__ == '__main__': # see --> http://bugs.python.org/issue1510172 . works only current dir and below + import os; __path__ = [os.path.dirname(__file__)] + import os, sys import base64 import socket -#--> rel import hack -class _RelImportHack(object): - def __init__(self, n): - fpath = os.path.abspath(__file__) - for i in xrange(n): fpath = os.path.dirname(fpath) - sys.path.insert(0, fpath) - def __del__(self): sys.path.pop(0) -hack = _RelImportHack(2) - -from fcp2 import consts -from fcp2 import config -from fcp2 import types -from fcp2 import key -from fcp2.lib import node - - -del hack, _RelImportHack -#<-- rel import hack +from . import consts +from . import config +from . import types +from . import key +from .lib import node #******************************************************************************** # consts #******************************************************************************** @@ -1159,5 +1150,13 @@ } -__all__ = [i for i in dir() if i[0].isupper() and not i.startswith('_')] -__all__.append('newMessageClass') \ No newline at end of file +#**************************************************************************************************** +# +#**************************************************************************************************** +def _all_(): + '''* imports are disallowed for relative imports. this print out the list of exported names''' + L = [i for i in globals() if i[0].isupper() and not i.startswith('_')] + L.append('newMessageClass') + L.sort() + print '(' + ', '.join(L) + ')' +#_all_() Modified: trunk/fcp2/src/fcp2/types.py =================================================================== --- trunk/fcp2/src/fcp2/types.py 2008-07-06 21:41:05 UTC (rev 529) +++ trunk/fcp2/src/fcp2/types.py 2008-07-07 07:14:44 UTC (rev 530) @@ -2,25 +2,15 @@ This module handles type conversions from Fcp to Python and vice versa """ +from __future__ import absolute_import +if __name__ == '__main__': # see --> http://bugs.python.org/issue1510172 . works only current dir and below + import os; __path__ = [os.path.dirname(__file__)] import os, sys import base64 import re -#--> rel import hack -class _RelImportHack(object): - def __init__(self, n): - fpath = os.path.abspath(__file__) - for i in xrange(n): fpath = os.path.dirname(fpath) - sys.path.insert(0, fpath) - def __del__(self): sys.path.pop(0) -hack =_RelImportHack(2) - -from fcp2 import consts - - -del hack -#<-- rel import hack +from . import consts #************************************************************************************* # #************************************************************************************* @@ -263,11 +253,14 @@ ChoicesAllowMultiple = False -__all__ = [i for i in dir() if i[0].isupper() and not i.startswith('_')] -#******************************************************************************************** +#**************************************************************************************************** # -#******************************************************************************************** -if __name__ == '__main__': - import doctest - doctest.testmod() +#**************************************************************************************************** +def _all_(): + '''* imports are disallowed for relative imports. this print out the list of exported names''' + L = [i for i in globals() if i[0].isupper() and not i.startswith('_')] + L.sort() + print '(' + ', '.join(L) + ')' +#_all_() + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-06 21:41:01
|
Revision: 529 http://fclient.svn.sourceforge.net/fclient/?rev=529&view=rev Author: jUrner Date: 2008-07-06 14:41:05 -0700 (Sun, 06 Jul 2008) Log Message: ----------- ... Removed Paths: ------------- trunk/fcp2/src/fcp2/test/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-06 21:40:29
|
Revision: 528 http://fclient.svn.sourceforge.net/fclient/?rev=528&view=rev Author: jUrner Date: 2008-07-06 14:40:37 -0700 (Sun, 06 Jul 2008) Log Message: ----------- ... Added Paths: ----------- trunk/fcp2/src/test/ trunk/fcp2/src/test/__init__.py trunk/fcp2/src/test/dummy_io.py trunk/fcp2/src/test/test_all.py trunk/fcp2/src/test/test_client.py trunk/fcp2/src/test/test_config.py trunk/fcp2/src/test/test_iohandler.py trunk/fcp2/src/test/test_key.py trunk/fcp2/src/test/test_message.py trunk/fcp2/src/test/test_types.py Added: trunk/fcp2/src/test/__init__.py =================================================================== --- trunk/fcp2/src/test/__init__.py (rev 0) +++ trunk/fcp2/src/test/__init__.py 2008-07-06 21:40:37 UTC (rev 528) @@ -0,0 +1 @@ + Added: trunk/fcp2/src/test/dummy_io.py =================================================================== --- trunk/fcp2/src/test/dummy_io.py (rev 0) +++ trunk/fcp2/src/test/dummy_io.py 2008-07-06 21:40:37 UTC (rev 528) @@ -0,0 +1,108 @@ +"""Dummy socket object for testing""" + +import os, sys + +#--> 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 +from fcp2 import iohandler + +del hack +#<-- rel import hack +#******************************************************************** +# +#******************************************************************** +class DummyIO(iohandler.IOObjectBase): + + def __init__(self): + self.readBuffer = '' # buffer client reads from + self.writeBuffer = '' # buffer client writes to + + self._isOpen = False + self._isBroken = False + self._allowConnect = True + self._reverseDirection = False + + def connect(self, **kwargs): + if not self._allowConnect: + raise fcp2.ErrorIOConnectFailed('Refused') + self._isOpen = True + + def read(self, n): + if self._isBroken: + raise fcp2.ErrorIOBroken('Broken') + if not self.isOpen(): + raise fcp2.ErrorIOClosed('Closed') + + if self._reverseDirection: + if not self.writeBuffer: + raise fcp2.ErrorIOTimeout('Timeout') + bytes, self.writeBuffer = self.writeBuffer[ :n], self.writeBuffer[n: ] + else: + if not self.readBuffer: + raise fcp2.ErrorIOTimeout('Timeout') + bytes, self.readBuffer = self.readBuffer[ :n], self.readBuffer[n: ] + return bytes + + def write(self, bytes): + if self._isBroken: + raise fcp2.ErrorIOBroken('Broken') + if not self.isOpen(): + raise fcp2.ErrorIOClosed('Closed') + self.writeBuffer += bytes + + def close(self): + self._isBroken = False + self._allowConnect = True + self._reverseDirection = False + if self.isOpen(): + self._isOpen = False + self.readBuffer = '' + self.writeBuffer = '' + else: + raise fcp2.ErrorIOClosed('Closed') + + def isOpen(self): + return self._isOpen + + def setTimeout(self, n): + pass + + + ############################ + ## for testing... + + def setOpen(self, flag): + self._isOpen = flag + + def setBroken(self, flag): + self._isBroken = flag + + def setAllowConnect(self, flag): + self._allowConnect = flag + + def setReverseDirection(self, flag): + self._reverseDirection = flag + + def sendResponseMessage(self, name, data=None, **params): + buf = [name, ] + for name, value in params.items(): + buf.append('%s=%s' % (name, value) ) + if data is None: + buf.append('EndMessage\n') + else: + buf.append('Data\n') + self.readBuffer += '\n'.join(buf) + if data: + assert 'DataLength' in params + assert params['DataLength'] == len(data) + self.readBuffer += data + + Added: trunk/fcp2/src/test/test_all.py =================================================================== --- trunk/fcp2/src/test/test_all.py (rev 0) +++ trunk/fcp2/src/test/test_all.py 2008-07-06 21:40:37 UTC (rev 528) @@ -0,0 +1,27 @@ +"""Runs all unittests in the current folder""" + +import os, sys +import unittest +#************************************************************************************************* +# +#************************************************************************************************* +if __name__ == '__main__': + Dir, SelfName= os.path.split(os.path.abspath(__file__)) + sys.path.insert(0, Dir) + + for file in os.walk(Dir).next()[2]: + filename, ext = os.path.splitext(file) + if ext.lower() == '.py': + if filename.startswith('test_') and file != SelfName: + mod = __import__(filename) + suite = getattr(mod, 'suite') + unittest.TextTestRunner(verbosity=1).run(suite()) + + + + + + + + + Added: trunk/fcp2/src/test/test_client.py =================================================================== --- trunk/fcp2/src/test/test_client.py (rev 0) +++ trunk/fcp2/src/test/test_client.py 2008-07-06 21:40:37 UTC (rev 528) @@ -0,0 +1,3010 @@ +"""Unittests for fcp2.client.py""" +from __future__ import with_statement + +import os, sys +import copy +import socket +import tempfile +import time +import unittest + +import fcp2 +from dummy_io import DummyIO +#*********************************************************************************** +# +#*********************************************************************************** +DIR = os.path.dirname(os.path.abspath(__file__)) +##TestAgainstNode = 0 # don't know how to test against node. Do not touch this! + +# for testing some valid key data +DummyKeyData = 'aaa,bbb,ccc' +#*********************************************************************************** +# +#*********************************************************************************** +class BaseTestClient(unittest.TestCase): + """Base class for all tests""" + + client = fcp2.Client( + #debugVerbosity=fcp2.ConstDebugVerbosity.Debug, + debugVerbosity=fcp2.ConstDebugVerbosity.Quiet + ) + + client.ioHandler.setIOPrototype(DummyIO) + + + def __init__(self, *args, **kwargs): + unittest.TestCase.__init__(self, *args, **kwargs) + + self.events = [] # events received from the client + self.tmpfiles = [] # temp files used for testing (will be removed on tearDown) + + + def _captureEventsFromClient(self, event, msg): + """Captures events the client send""" + # have to copy message here, to get exact state + msg = copy.deepcopy(msg) + self.events.append( (event, msg) ) + + + def connectClient(self): + """Connects to the client""" + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + msg = self.getNextMessage() + if msg is not None: + self.failUnless(msg.name == 'ClientHello') + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Build='9999999999', + + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientConnected, + fcp2.MsgNodeHello, + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def closeClient(self): + """Closes the client""" + self.client.close() + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.Close), + ) + + + def assertHasNextEvent(self, + expectedEvent=None, + message=None, + param1=None, + param2=None, + param3=None, + param4=None, + param5=None, + data=None + ): + """Tests if we received a certain event from the client + @param expectedEvent: the event expected or None if no event is expected + @param message: expected mesage or None if no message is expected + @param param1: tuple(paramName, value) of a message parameter expected + @param data: data expected along with the message or None + + @return: message if a message was received or None + """ + if expectedEvent is None: + self.failIf(self.events) + else: + self.failUnless(self.events) + event, msg = self.events.pop(0) + self.assertEqual(event, expectedEvent) + + if message is not None: + self.assertEqual(msg.name, message.name) + if param1 is not None: + param1, value1 = param1 + self.failUnless(param1 in msg.params) + self.assertEqual(value1, msg[param1]) + if param2 is not None: + param2, value2 = param2 + self.failUnless(param2 in msg.params) + self.assertEqual(value2, msg[param2]) + if param3 is not None: + param3, value3 = param3 + self.failUnless(param3 in msg.params) + self.assertEqual(value3, msg[param3]) + if param4 is not None: + param4, value4 = param4 + self.failUnless(param4 in msg.params) + self.assertEqual(value4, msg[param4]) + if param5 is not None: + param5, value5 = param5 + self.failUnless(param5 in msg.params) + self.assertEqual(value5, msg[param5]) + + if data is not None: + self.assertEqual(data, msg.data) + + return msg + + def assertHasNextMessage(self, + message, + param1=None, + param2=None, + param3=None, + param4=None, + param5=None, + param6=None, + param7=None, + param8=None, + param9=None, + param10=None, + param11=None, + param12=None, + param13=None, + param14=None, + param15=None, + data=None + ): + """Tests if we received a certain message from the client + @param message: expected mesage or None if no message is expected + @param param1: tuple(paramName, value) of a message parameter expected + @param data: data expected along with the message or None + + @return: message if a message was received or None + """ + msg = self.getNextMessage() + if message is None: + self.failUnless(msg is None) + else: + self.failIf(msg is None) + self.assertEqual(msg.name, message.name) + if param1 is not None: + param1, value1 = param1 + self.failUnless(param1 in msg.params) + self.assertEqual(value1, msg[param1]) + if param2 is not None: + param2, value2 = param2 + self.assertEqual(value2, msg[param2]) + if param3 is not None: + param3, value3 = param3 + self.failUnless(param3 in msg.params) + self.assertEqual(value3, msg[param3]) + if param4 is not None: + param4, value4 = param4 + self.failUnless(param4 in msg.params) + self.assertEqual(value4, msg[param4]) + if param5 is not None: + param5, value5 = param5 + self.failUnless(param5 in msg.params) + self.assertEqual(value5, msg[param5]) + if param6 is not None: + param6, value6 = param6 + self.failUnless(param6 in msg.params) + self.assertEqual(value6, msg[param6]) + if param7 is not None: + param7, value7 = param7 + self.failUnless(param7 in msg.params) + self.assertEqual(value7, msg[param7]) + if param8 is not None: + param8, value8 = param8 + self.failUnless(param8 in msg.params) + self.assertEqual(value8, msg[param8]) + if param9 is not None: + param9, value9 = param9 + self.failUnless(param9 in msg.params) + self.assertEqual(value9, msg[param9]) + if param10 is not None: + param10, value10 = param10 + self.failUnless(param10 in msg.params) + self.assertEqual(value10, msg[param10]) + if param11 is not None: + param11, value11 = param11 + self.failUnless(param11 in msg.params) + self.assertEqual(value11, msg[param11]) + if param12 is not None: + param12, value12 = param12 + self.failUnless(param12 in msg.params) + self.assertEqual(value12, msg[param12]) + if param13 is not None: + param13, value13 = param13 + self.failUnless(param13 in msg.params) + self.assertEqual(value13, msg[param13]) + if param14 is not None: + param14, value14 = param14 + self.failUnless(param14 in msg.params) + self.assertEqual(value14, msg[param14]) + if param15 is not None: + param15, value15 = param15 + self.failUnless(param15 in msg.params) + self.assertEqual(value15, msg[param15]) + + if data is not None: + self.assertEqual(data, msg.data) + return msg + + def sendResponseMessage(self, messageName, data=None, callNext=True, **params): + """Sends a message to the client""" + if messageName in fcp2.MessagesAll: + msgClass = fcp2.MessagesAll[messageName] + else: + msgClass = fcp2.newMessageClass(messageName) + msg = msgClass(data=data, **params) + self.client.ioHandler.io.readBuffer += msg.toString() + if callNext: + self.client.next() + + + #NOTE: iohandler is buffered + # ..so be careful not to get messages you send + # + # 1. sendResponseMessage('blah') + # 2. getNextMessage() + # 3. >>> 'blah' + def getNextMessage(self): + """Returns the next message the client send""" + + # cheat a bit to get iohandler to read a message from writeBuffer + if self.ioOpen(): + self.client.ioHandler.io.setReverseDirection(True) + try: + msg = self.client.ioHandler.readMessage() + except fcp2.ErrorIOTimeout: + return None + finally: + self.client.ioHandler.io.setReverseDirection(False) + return msg + + + def ioOpen(self): + """Checks if the clients io is open""" + return self.client.ioHandler.isOpen() + + + def getIO(self): + """Returns the clients io""" + return self.client.ioHandler.io + + + def setUp(self): + # conect all events + self.events = [] # events received from the client + for event in self.client.events: + event += self._captureEventsFromClient + + def tearDown(self): + # disconnect all events + for event in self.client.events: + event -= self._captureEventsFromClient + # clean up tmpfiles + for fpath in self.tmpfiles: os.remove(fpath) + if self.client.isOpen(): + self.client.close() + + +#*********************************************************************************** +# +#*********************************************************************************** +#TODO: class Test.... set/getDebugVerbosity / connectionName and friends... (BaseTestConnectedClient): + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_close(BaseTestClient): + + #NOTE: currently ClientDisconnected() is triggered even if the client was not connected + def test_close_disconnected_client(self): + self.client.close() + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.Close), + ) + + def test_close_connected_client(self): + self.connectClient() + self.client.close() + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.Close), + ) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_isOpen(BaseTestClient): + + def test_isOpen(self): + self.failIf(self.client.isOpen()) + self.connectClient() + self.failUnless(self.client.isOpen()) + self.closeClient() + self.failIf(self.client.isOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +#TODO: not idea how to test this +class Test_connect(BaseTestClient): + pass + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_iterConnect(BaseTestClient): + + def test_iterConnect_success(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + msg = self.getNextMessage() + if msg is not None: + self.failUnless(msg.name == 'ClientHello') + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + Build='9999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientConnected, + fcp2.MsgNodeHello, + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + self.client.close() + + + def test_iterConnect_ioRefusesConnection(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.getIO().setAllowConnect(False) + + self.failUnless(nodeHello is None) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.IOConnectFailed), + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_iterConnect_nodeHelloNeverArrives(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + pass + + self.failUnless(nodeHello is None) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.NoNodeHello), + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_iterConnect_socketDies(self): + enum = self.client.iterConnect(duration=0.2, timeout=0.1) + errorRaised = False + while True: + try: + enum.next() + except StopIteration: + break + except fcp2.ErrorIOBroken, d: + errorRaised = True + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.ConnectionDied), + #('Param', None), + ) + break + self.getIO().setBroken(True) + + self.failUnless(errorRaised) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_iterIterConnect_unknownNodehello(self): + + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'i-am-invalid', + callNext=False, + ) + + self.failUnless(nodeHello is None) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.UnknownNodeHello), + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_iterIterConnect_connect(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Build='9999999999', + + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientConnected, + fcp2.MsgNodeHello, + ) + self.assertHasNextEvent(None) + #self.assertHasNextMessage(None) # due to our message hacking, NodeHello is still in io + self.failUnless(self.ioOpen()) + self.closeClient() + + + def test_iterIterConnect_reconnect(self): + self.connectClient() + + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Build='9999999999', + + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.Reconnect) + ) + self.assertHasNextEvent( + self.client.events.ClientConnected, + fcp2.MsgNodeHello, + ) + self.assertHasNextEvent(None) + #self.assertHasNextMessage(None) # due to our message hacking, NodeHello is still in io + self.failUnless(self.ioOpen()) + self.closeClient() + + + def test_iterIterConnect_VersionMissmatch_FCPVersion(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'NodeHello', + FCPVersion='0.0', + Build='9999999999', + + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.VersionMissmatch) + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + self.closeClient() + + + def test_iterIterConnect_VersionMissmatch_Build(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=0.2, timeout=0.1)): + self.sendResponseMessage( + 'NodeHello', + FCPVersion='2.0', + Build='0', + + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='999999999999', + ExRevision='9999999999', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False, + ) + + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.VersionMissmatch) + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + self.closeClient() + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_CloseConnectionDuplicateClientName(BaseTestClient): + + def test_CloseConnectionDuplicateClientName(self): + self.connectClient() + self.sendResponseMessage( + 'CloseConnectionDuplicateClientName', + ) + + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.DuplicateClientName) + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + self.closeClient() + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_closeNode(BaseTestClient): + + def test_closeNode(self): + self.connectClient() + self.client.closeNode() + self.assertHasNextMessage(fcp2.MsgShutdown) + self.sendResponseMessage( + 'ProtocolError', + Code='18' + ) + + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.NodeClosing) + ) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + self.closeClient() + +#*********************************************************************************** +# +#*********************************************************************************** +# TODO: no idea how to test this +class Test_startNode(BaseTestClient): + pass + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_get_setConnectionName(BaseTestClient): + + def test_get_setConnectionName(self): + + self.failIf(self.client.setConnectionName() == 'foo') + self.client.setConnectionName('foo') + self.failIf(self.client.getConnectionName() != 'foo') + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_get_setDebugVerbosity(BaseTestClient): + + def test_get_setDebugVerbosity(self): + oldVerbosity = self.client.getDebugVerbosity() + self.client.setDebugVerbosity(fcp2.ConstDebugVerbosity.Quiet) + self.client.setDebugVerbosity(oldVerbosity) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_versionCheckNodeHello(BaseTestClient): + + def test_get_versionCheckNodeHello(self): + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion, + 'Build':self.client.ExpectedNodeBuild, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == True) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion -1, + 'Build':self.client.ExpectedNodeBuild, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == False) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion, + 'Build':self.client.ExpectedNodeBuild -1, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == False) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion +1, + 'Build':self.client.ExpectedNodeBuild, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == False) + + msg = { + 'FCPVersion': self.client.ExpectedFcpVersion, + 'Build':self.client.ExpectedNodeBuild +1, + } + result = self.client.versionCheckNodeHello(msg) + self.failUnless(result == True) + +#*********************************************************************************** +# +#*********************************************************************************** +# TODO: not tested +class Test_handleMessage(BaseTestClient): + pass + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_next(BaseTestClient): + + def test_idle(self): + self.connectClient() + msg = self.client.next() + msg2 = self.assertHasNextEvent( + self.client.events.Idle, + fcp2.MsgClientSocketTimeout, + ) + self.failUnless(msg == msg2) + + + def test_io_broken(self): + self.connectClient() + self.getIO().setBroken(True) + + self.assertRaises(fcp2.ErrorIOBroken, self.client.next, ) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.ConnectionDied) + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_hasMessage(self): + self.connectClient() + self.sendResponseMessage( + 'HiThere', + callNext=False + ) + msg = self.client.next() + self.assertEqual(msg.name, 'HiThere') + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +#TODO: not tested +class Test_run(BaseTestClient): + pass + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_sendMessage(BaseTestClient): + + def test_io_broken(self): + self.connectClient() + self.getIO().setBroken(True) + + self.assertRaises(fcp2.ErrorIOBroken, self.client.sendMessage, fcp2.MsgClientHello()) + self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.ConnectionDied) + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(self.ioOpen()) + + + def test_messageSend(self): + self.connectClient() + self.client.sendMessage(fcp2.MsgClientHello()) + msg = self.client.next() + self.assertHasNextMessage(fcp2.MsgClientHello) + self.assertHasNextEvent(self.client.events.Idle) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_getConfig(BaseTestClient): + + def test_getConfig(self): + self.connectClient() + self.client.getConfig( + withCurrent=True, + withDefaults=True, + withExpertFlag=True, + withForceWriteFlag=True, + withSortOrder=True, + withShortDescription=True, + withLongDescription=True, + withDataTypes=True, + ) + msg = self.client.next() + self.assertHasNextMessage(fcp2.MsgGetConfig, + ('WithCurrent', True), + ('WithDefaults', True), + ('WithExpertFlag', True), + ('WithForceWriteFlag', True), + ('WithSortOrder', True), + ('WithShortDescription', True), + ('WithLongDescription', True), + ('WithDataTypes', True), + ) + self.assertHasNextEvent(self.client.events.Idle) + + + self.sendResponseMessage('ConfigData', + foo='1234', + ) + self.assertHasNextEvent( + self.client.events.ConfigData, + fcp2.MsgConfigData, + ('foo', '1234') + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_modifyConfig(BaseTestClient): + + def test_getConfig(self): + self.connectClient() + self.client.modifyConfig( + {'foo': '1234'} + ) + msg = self.client.next() + self.assertHasNextMessage(fcp2.MsgModifyConfig, + ('foo', '1234'), + ) + self.assertHasNextEvent(self.client.events.Idle) + + 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): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey) + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], fcp2.ConstRequestType.GetData) + + + def test_300_message_send(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage( + fcp2.MsgClientGet, + ('URI', myKey), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_400_progress(self): + + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + self.sendResponseMessage( + 'SimpleProgress', + Identifier=myIdentifier, + Total=0, + Required=0, + Failed=0, + FatallyFailed=0, + Succeeded=0, + ) + + self.assertHasNextEvent( + self.client.events.RequestProgress, + fcp2.MsgClientGet, + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_500_completed_successfuly(self): + + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + 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 + ) + + # non persistent requests are removed emidiately + self.failIf(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_600_completed_with_error(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + self.sendResponseMessage( + fcp2.MsgGetFailed.name, + 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 + ), + ) + + # non persistent requests are removed emidiately + self.failIf(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_700_peristent_request_auto_retrieve_data(self): + + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=fcp2.ConstPersistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + + data = 'foo' + params = { + 'Identifier': myIdentifier, + 'Global': 'false', + 'DataLength': len(data), + 'Metadata.ContentType': 'any', + } + self.sendResponseMessage( + 'DataFound', + **params + ) + + self.assertHasNextMessage(fcp2.MsgGetRequestStatus) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + + def test_800_peristent_request_not_removed_on_success(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=fcp2.ConstPersistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + data = 'foo' + self.sendResponseMessage( + 'AllData', + data=data, + Identifier=myIdentifier, + Global='false', + DataLength=len(data), + ) + + self.assertHasNextEvent(self.client.events.RequestCompleted) + + # persistent requests are not removed emidiately + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_900_peristent_request_not_removed_on_error(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=fcp2.ConstPersistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + + self.assertHasNextEvent(self.client.events.RequestFailed) + + # persistent requests are not removed emidiately + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_910_restore_peristent_request_failure(self): + self.connectClient() + requestsAll = self.client.getRequests() + myIdentifier = '123456789' + self.sendResponseMessage( + 'PersistentGet', + Identifier=myIdentifier, + ClientToken='i-am-invalid', + Global='false', + + callNext=False + ) + self.assertRaises(fcp2.ErrorMessageParse, self.client.next) + self.failIf(myIdentifier in requestsAll) + + + def test_920_restore_peristent_request_success(self): + self.connectClient() + requestsAll = self.client.getRequests() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getData(myKey, persistence=fcp2.ConstPersistence.Forever) + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + del requestsAll[myIdentifier] + + self.sendResponseMessage( + 'PersistentGet', + **myRequest.params + ) + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + msg = self.assertHasNextEvent( + self.client.events.RequestRestored, + fcp2.MsgClientGet, + ('Identifier', myIdentifier), + ('RequestStatus', fcp2.ConstRequestStatus.Restored), # no RequestStatus.Pending flag should be set here + ) + + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_getFile(BaseTestClient): + + def test_100_request_registered(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getFile(myKey, 'foo.txt') + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], fcp2.ConstRequestType.GetFile) + + + def test_200_key_object_is_accepted(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getFile(myKey, 'foo.txt') + requestsAll = self.client.getRequests() + + + def test_300_dda_denied(self): + self.connectClient() + 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() + + self.assertHasNextMessage(fcp2.MsgClientGet) + 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='true', + ) + + # check if our tempfile was removed + self.failIf(os.path.isfile(fpath)) + + # client sahould send a new ClientGet + msg = self.assertHasNextMessage(fcp2.MsgClientGet) + + # no events should have been triggered upo to now + self.assertHasNextEvent(None) + + # respond with a PersistentGet + self.sendResponseMessage( + 'PersistentGet', + Started='false', + **msg.params + ) + + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_getKeyInfo(BaseTestClient): + + + def test_100_request_registered(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], fcp2.ConstRequestType.GetKeyInfo) + + def test_200_key_object_is_accepted(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + + myIdentifier = self.client.getKeyInfo(myKey) + requestsAll = self.client.getRequests() + + + def test_300_getKeyInfo_Success(self): + self.connectClient() + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + + 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.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_400_GetKeyInfo_TooBig(self): + self.connectClient() + + # test specdial case where ProtocolError.TooBig is handled as success + # request a arbitrary uri + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + 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.failIf(myIdentifier in requestsAll) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_500_GetKeyInfo_Failure(self): + self.connectClient() + + # request a arbitrary file + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getKeyInfo(myKey) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientGet) + 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.failUnless(self.ioOpen()) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_disconnectReason(BaseTestClient): + + def test_1000_DuplicateClientName(self): + self.connectClient() + self.sendResponseMessage('CloseConnectionDuplicateClientName') + msg = self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.DuplicateClientName), + ) + + self.failIf(self.ioOpen()) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + + + def test_1001_SocketDied_Receive(self): + self.connectClient() + self.getIO().setBroken(True) + self.assertRaises(fcp2.ErrorIOBroken, self.client.next) + + # check if ClientDisconnected events has been triggered + msg = self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.ConnectionDied), + ) + + self.failIf(self.ioOpen()) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.connectClient() + + + def test_1002_SocketDied_Send(self): + self.connectClient() + self.getIO().setBroken(True) + + # send a test message + self.assertRaises(fcp2.ErrorIOBroken, self.client.sendMessage, fcp2.newMessageClass('test')()) + + # check if ClientDisconnected events has been triggered + msg = self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.ConnectionDied), + ) + + self.failIf(self.ioOpen()) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.connectClient() + + + def test_1003_Shutdown(self): + self.connectClient() + self.client.closeNode() + + msg = self.assertHasNextMessage(fcp2.MsgShutdown) + self.sendResponseMessage( + 'ProtocolError', + Code='18', # Shutting down + ) + + # check events the client triggered + msg = self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.NodeClosing) + ) + + self.failIf(self.ioOpen()) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.connectClient() + + + + def test_1004_VersionMismatch(self): + for n, nodeHello in enumerate(self.client.iterConnect(duration=1, timeout=0.1)): + if n == 2: + self.assertHasNextMessage( + fcp2.MsgClientHello + ) + self.sendResponseMessage( + 'NodeHello', + FCPVersion='0.0', + Node='Fred', + Version=str(self.client.ExpectedFcpVersion), + Revision='0', + Build='0', + ExRevision='0', + Testnet='false', + CompressionCodecs='1', + ConnectionIdentifier='any', + NodeLanguage='en', + + callNext=False + ) + + # check events the client triggered + msg = self.assertHasNextEvent( + self.client.events.ClientDisconnected, + fcp2.MsgClientDisconnected, + ('DisconnectReason', fcp2.ConstDisconnectReason.VersionMissmatch) + ) + + self.failIf(self.ioOpen()) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.connectClient() + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_clientPut(BaseTestClient): + + def test_keyTailIsDisallowed(self): + self.connectClient() + + # 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') + + myKey = fcp2.KeySSK(keyData=DummyKeyData, tail='foo') + self.assertRaises(ValueError, self.client.clientPut, fcp2.ConstRequestType.PutData, myKey, data='foo') + + myKey = fcp2.KeyUSK(keyData=DummyKeyData, tail='foo') + self.assertRaises(ValueError, self.client.clientPut, fcp2.ConstRequestType.PutData, myKey, data='foo') + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putData(BaseTestClient): + + def test_putData_Success(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putData( + myKey, + 'any data here' + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutSuccessful', + Identifier=myIdentifier, + URI=myKey + ) + + self.assertHasNextEvent( + self.client.events.RequestCompleted, + fcp2.MsgClientPut, + ('RequestStatus', fcp2.ConstRequestStatus.Success | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + + def test_putData_Failure(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putData( + myKey, + 'any data here' + ) + + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutFailed', + Identifier=myIdentifier, + Code='5', # rout not found + ) + + self.assertHasNextEvent( + self.client.events.RequestFailed, + fcp2.MsgClientPut, + ('RequestStatus', fcp2.ConstRequestStatus.Error | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putDir(BaseTestClient): + def test_putDir_Success(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putDir( + myKey, + 'myDirectory' + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPutDiskDir) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutSuccessful', + Identifier=myIdentifier, + URI=myKey + ) + + self.assertHasNextEvent( + self.client.events.RequestCompleted, + fcp2.MsgClientPutDiskDir, + ('RequestStatus', fcp2.ConstRequestStatus.Success | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + + def test_putDir_Failure(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putDir( + myKey, + 'myDirectory' + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPutDiskDir) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutFailed', + Identifier=myIdentifier, + Code='5', # rout not found + ) + + self.assertHasNextEvent( + self.client.events.RequestFailed, + fcp2.MsgClientPutDiskDir, + ('RequestStatus', fcp2.ConstRequestStatus.Error | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putFile(BaseTestClient): + + def test_putFile_Success(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putFile( + myKey, + 'myFile.txt' + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutSuccessful', + Identifier=myIdentifier, + URI=myKey + ) + + self.assertHasNextEvent( + self.client.events.RequestCompleted, + fcp2.MsgClientPut, + ('RequestStatus', fcp2.ConstRequestStatus.Success | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + + def test_putFile_Failure(self): + self.connectClient() + + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putFile( + myKey, + 'myFile.txt' + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutFailed', + Identifier=myIdentifier, + Code='5', # rout not found + ) + + self.assertHasNextEvent( + self.client.events.RequestFailed, + fcp2.MsgClientPut, + ('RequestStatus', fcp2.ConstRequestStatus.Error | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putMultiple(BaseTestClient): + def test_putMultiple_Success(self): + self.connectClient() + + items = [ + { + 'RequestType': fcp2.ConstRequestType.PutData, + 'Data': '12345', + 'Name': 'myItem0', + }, + { + 'RequestType': fcp2.ConstRequestType.PutFile, + 'Filename': 'myFile.txt', + 'Name': 'myItem1', + }, + { + 'RequestType': fcp2.ConstRequestType.PutRedirect, + 'TargetURI': 'CHK@123456789', + 'Name': 'myItem2', + }, + { + 'RequestType': fcp2.ConstRequestType.PutData, + 'Data': '67890', + 'Name': 'myItem3', + }, + ] + + # request a arbitrary file + myKey = fcp2.KeyKSK('foo') + myIdentifier = self.client.putMultiple( + myKey, + items + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + msg = self.assertHasNextMessage( + fcp2.MsgClientPutComplexDir, + ('Files.0.Name', 'myItem0'), + ('Files.0.UploadFrom', 'direct'), + ('Files.0.DataLength', 5), + + ('Files.1.Name', 'myItem1'), + ('Files.1.UploadFrom', 'disk'), + ('Files.1.Filename', 'myFile.txt'), + + ('Files.2.Name', 'myItem2'), + ('Files.2.UploadFrom', 'redirect'), + ('Files.2.TargetURI', 'CHK@123456789'), + + ('Files.3.Name', 'myItem3'), + ('Files.3.UploadFrom', 'direct'), + ('Files.3.DataLength', 5), + + data='1234567890' + ) + + #for k, v in sorted(msg.params.items()): + # print k, v + + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutSuccessful', + Identifier=myIdentifier, + URI=myKey + ) + + self.assertHasNextEvent( + self.client.events.RequestCompleted, + fcp2.MsgClientPutComplexDir, + ('RequestStatus', fcp2.ConstRequestStatus.Success | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + + def test_putMultiple_ItemErrors(self): + self.connectClient() + + # upload directory is not allowed + items = [ + { + 'RequestType': fcp2.ConstRequestType.PutDir, + 'Data': '12345', + 'Name': 'myItem0', + }, + ] + myKey = fcp2.KeyKSK('foo') + self.assertRaises(ValueError, self.client.putMultiple, myKey, items) + + #TODO: how to test required params? + # ...just some samples below + + # no request type specified + items = [ + { + #'RequestType': fcp2.ConstRequestType.PutData, + 'Data': '12345', + 'Name': 'myItem0', + }, + ] + self.assertRaises(ValueError, self.client.putMultiple, myKey, items) + + # param missing (we enforce all required parameters) + items = [ + { + 'RequestType': fcp2.ConstRequestType.PutData, + #'Data': '12345', + #'Name': 'myItem0', + }, + ] + self.assertRaises(ValueError, self.client.putMultiple, myKey, items) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_putRedirect(BaseTestClient): + + + def testPutRedirect_Success(self): + self.connectClient() + + # request a arbitrary file + myRedirect = fcp2.KeyKSK('foo') + myKey = fcp2.Key('CHK@' + DummyKeyData) + myIdentifier = self.client.putRedirect( + myRedirect, + myKey, + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutSuccessful', + Identifier=myIdentifier, + URI=myRedirect + ) + + self.assertHasNextEvent( + self.client.events.RequestCompleted, + fcp2.MsgClientPut, + ('RequestStatus', fcp2.ConstRequestStatus.Success | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + + + def testPutRedirect_Failure(self): + self.connectClient() + + # request a arbitrary file + myRedirect = fcp2.KeyKSK('foo') + myKey = fcp2.Key('CHK@' + DummyKeyData) + myIdentifier = self.client.putRedirect( + myRedirect, + myKey, + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(fcp2.MsgClientPut) + self.failUnless(myIdentifier in requestsAll) + + self.sendResponseMessage( + 'PutFailed', + Identifier=myIdentifier, + Code='5', # rout not found + ) + + self.assertHasNextEvent( + self.client.events.RequestFailed, + fcp2.MsgClientPut, + ('RequestStatus', fcp2.ConstRequestStatus.Error | + fcp2.ConstRequestStatus.RemovedFromQueue | + fcp2.ConstRequestStatus.Completed + ), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failIf(requestsAll) + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_modifyRequest(BaseTestClient): + + def test_modifyRequest_Persistent(self): + self.connectClient() + + + # request a arbitrary file + myKey = fcp2.Key('KSK@foo') + myIdentifier = self.client.getFile( + myKey, + 'arbitryry.txt... [truncated message content] |
From: <jU...@us...> - 2008-07-06 06:20:06
|
Revision: 527 http://fclient.svn.sourceforge.net/fclient/?rev=527&view=rev Author: jUrner Date: 2008-07-05 23:20:15 -0700 (Sat, 05 Jul 2008) Log Message: ----------- ups, forgot to update manifest Modified Paths: -------------- tags/fcp2/0.0.1/MANIFEST Modified: tags/fcp2/0.0.1/MANIFEST =================================================================== --- tags/fcp2/0.0.1/MANIFEST 2008-07-06 06:18:39 UTC (rev 526) +++ tags/fcp2/0.0.1/MANIFEST 2008-07-06 06:20:15 UTC (rev 527) @@ -11,23 +11,21 @@ fcp2/key.py fcp2/message.py fcp2/types.py -fcp2/test_fcp/__init__.py -fcp2/test_fcp/dummy_io.py -fcp2/test_fcp/test_all.py -fcp2/test_fcp/test_client.py -fcp2/test_fcp/test_config.py -fcp2/test_fcp/test_iohandler.py -fcp2/test_fcp/test_key.py -fcp2/test_fcp/test_message.py -fcp2/test_fcp/test_types.py -fcp2/fcp_lib/__init__.py -fcp2/fcp_lib/events.py -fcp2/fcp_lib/namespace.py -fcp2/fcp_lib/node.py -fcp2/fcp_lib/numbers.py -fcp2/fcp_lib/tools.py -fcp2/boards/__init__.py -fcp2/boards/frost.py +fcp2/lib/__init__.py +fcp2/lib/events.py +fcp2/lib/namespace.py +fcp2/lib/node.py +fcp2/lib/numbers.py +fcp2/lib/tools.py +fcp2/test/__init__.py +fcp2/test/dummy_io.py +fcp2/test/test_all.py +fcp2/test/test_client.py +fcp2/test/test_config.py +fcp2/test/test_iohandler.py +fcp2/test/test_key.py +fcp2/test/test_message.py +fcp2/test/test_types.py fcp2/scripts/__init__.py fcp2/scripts/gen_docs.py fcp2/scripts/gen_messagecheatsheet.py This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-06 06:18:30
|
Revision: 526 http://fclient.svn.sourceforge.net/fclient/?rev=526&view=rev Author: jUrner Date: 2008-07-05 23:18:39 -0700 (Sat, 05 Jul 2008) Log Message: ----------- ups, forgot to update manifest Modified Paths: -------------- trunk/fcp2/src/MANIFEST Modified: trunk/fcp2/src/MANIFEST =================================================================== --- trunk/fcp2/src/MANIFEST 2008-07-06 06:14:01 UTC (rev 525) +++ trunk/fcp2/src/MANIFEST 2008-07-06 06:18:39 UTC (rev 526) @@ -11,23 +11,21 @@ fcp2/key.py fcp2/message.py fcp2/types.py -fcp2/test_fcp/__init__.py -fcp2/test_fcp/dummy_io.py -fcp2/test_fcp/test_all.py -fcp2/test_fcp/test_client.py -fcp2/test_fcp/test_config.py -fcp2/test_fcp/test_iohandler.py -fcp2/test_fcp/test_key.py -fcp2/test_fcp/test_message.py -fcp2/test_fcp/test_types.py -fcp2/fcp_lib/__init__.py -fcp2/fcp_lib/events.py -fcp2/fcp_lib/namespace.py -fcp2/fcp_lib/node.py -fcp2/fcp_lib/numbers.py -fcp2/fcp_lib/tools.py -fcp2/boards/__init__.py -fcp2/boards/frost.py +fcp2/lib/__init__.py +fcp2/lib/events.py +fcp2/lib/namespace.py +fcp2/lib/node.py +fcp2/lib/numbers.py +fcp2/lib/tools.py +fcp2/test/__init__.py +fcp2/test/dummy_io.py +fcp2/test/test_all.py +fcp2/test/test_client.py +fcp2/test/test_config.py +fcp2/test/test_iohandler.py +fcp2/test/test_key.py +fcp2/test/test_message.py +fcp2/test/test_types.py fcp2/scripts/__init__.py fcp2/scripts/gen_docs.py fcp2/scripts/gen_messagecheatsheet.py This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-06 06:13:52
|
Revision: 525 http://fclient.svn.sourceforge.net/fclient/?rev=525&view=rev Author: jUrner Date: 2008-07-05 23:14:01 -0700 (Sat, 05 Jul 2008) Log Message: ----------- release 0.0.1 Added Paths: ----------- tags/fcp2/0.0.1/ Removed Paths: ------------- tags/fcp2/src/ Copied: tags/fcp2/0.0.1 (from rev 524, tags/fcp2/src) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-06 06:13:13
|
Revision: 524 http://fclient.svn.sourceforge.net/fclient/?rev=524&view=rev Author: jUrner Date: 2008-07-05 23:13:23 -0700 (Sat, 05 Jul 2008) Log Message: ----------- prep release Added Paths: ----------- tags/fcp2/ tags/fcp2/src/ Copied: tags/fcp2/src (from rev 523, trunk/fcp2/src) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-06 06:12:04
|
Revision: 523 http://fclient.svn.sourceforge.net/fclient/?rev=523&view=rev Author: jUrner Date: 2008-07-05 23:12:11 -0700 (Sat, 05 Jul 2008) Log Message: ----------- prep release Modified Paths: -------------- trunk/fcp2/src/fcp2/README Modified: trunk/fcp2/src/fcp2/README =================================================================== --- trunk/fcp2/src/fcp2/README 2008-07-06 06:11:49 UTC (rev 522) +++ trunk/fcp2/src/fcp2/README 2008-07-06 06:12:11 UTC (rev 523) @@ -6,9 +6,9 @@ Version history: ******************************************************************* -0.1.0 +0.0.1 ******************************************************************* -Initial release +(07.06.08) first alpha release for testing news: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jU...@us...> - 2008-07-06 06:11:39
|
Revision: 522 http://fclient.svn.sourceforge.net/fclient/?rev=522&view=rev Author: jUrner Date: 2008-07-05 23:11:49 -0700 (Sat, 05 Jul 2008) Log Message: ----------- prep release Modified Paths: -------------- trunk/fcp2/src/setup.py Modified: trunk/fcp2/src/setup.py =================================================================== --- trunk/fcp2/src/setup.py 2008-07-06 06:11:26 UTC (rev 521) +++ trunk/fcp2/src/setup.py 2008-07-06 06:11:49 UTC (rev 522) @@ -23,7 +23,7 @@ DOWNLOAD='' NAME = 'fcp2' URL = 'https://sourceforge.net/projects/fclient/' -VERSION = '0.1.0' +VERSION = '0.0.1' MODULES = ['fcp2', ] 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 06:11:16
|
Revision: 521 http://fclient.svn.sourceforge.net/fclient/?rev=521&view=rev Author: jUrner Date: 2008-07-05 23:11:26 -0700 (Sat, 05 Jul 2008) Log Message: ----------- ... Added Paths: ----------- trunk/fcp2/src/MANIFEST Added: trunk/fcp2/src/MANIFEST =================================================================== --- trunk/fcp2/src/MANIFEST (rev 0) +++ trunk/fcp2/src/MANIFEST 2008-07-06 06:11:26 UTC (rev 521) @@ -0,0 +1,33 @@ +MANIFEST +setup.py +fcp2/LICENCE.MIT +fcp2/README +fcp2/__init__.py +fcp2/client.py +fcp2/config.py +fcp2/consts.py +fcp2/events.py +fcp2/iohandler.py +fcp2/key.py +fcp2/message.py +fcp2/types.py +fcp2/test_fcp/__init__.py +fcp2/test_fcp/dummy_io.py +fcp2/test_fcp/test_all.py +fcp2/test_fcp/test_client.py +fcp2/test_fcp/test_config.py +fcp2/test_fcp/test_iohandler.py +fcp2/test_fcp/test_key.py +fcp2/test_fcp/test_message.py +fcp2/test_fcp/test_types.py +fcp2/fcp_lib/__init__.py +fcp2/fcp_lib/events.py +fcp2/fcp_lib/namespace.py +fcp2/fcp_lib/node.py +fcp2/fcp_lib/numbers.py +fcp2/fcp_lib/tools.py +fcp2/boards/__init__.py +fcp2/boards/frost.py +fcp2/scripts/__init__.py +fcp2/scripts/gen_docs.py +fcp2/scripts/gen_messagecheatsheet.py 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:55:21
|
Revision: 520 http://fclient.svn.sourceforge.net/fclient/?rev=520&view=rev Author: jUrner Date: 2008-07-05 22:55:30 -0700 (Sat, 05 Jul 2008) Log Message: ----------- no longer needed Removed Paths: ------------- trunk/fcp2/src/fcp2/boards/ 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:54:39
|
Revision: 519 http://fclient.svn.sourceforge.net/fclient/?rev=519&view=rev Author: jUrner Date: 2008-07-05 22:54:48 -0700 (Sat, 05 Jul 2008) Log Message: ----------- ... Added Paths: ----------- trunk/fcp2/src/fcp2/test/ Removed Paths: ------------- trunk/fcp2/src/fcp2/test_fcp/ Copied: trunk/fcp2/src/fcp2/test (from rev 513, trunk/fcp2/src/fcp2/test_fcp) 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:53:58
|
Revision: 518 http://fclient.svn.sourceforge.net/fclient/?rev=518&view=rev Author: jUrner Date: 2008-07-05 22:54:07 -0700 (Sat, 05 Jul 2008) Log Message: ----------- fix import Modified Paths: -------------- trunk/fcp2/src/fcp2/client.py Modified: trunk/fcp2/src/fcp2/client.py =================================================================== --- trunk/fcp2/src/fcp2/client.py 2008-07-06 05:52:55 UTC (rev 517) +++ trunk/fcp2/src/fcp2/client.py 2008-07-06 05:54:07 UTC (rev 518) @@ -230,7 +230,7 @@ from fcp2 import key import random -from fcp2.fcp_lib import namespace +from fcp2.lib import namespace from fcp2.lib import tools del hack, _RelImportHack 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:52:45
|
Revision: 517 http://fclient.svn.sourceforge.net/fclient/?rev=517&view=rev Author: jUrner Date: 2008-07-05 22:52:55 -0700 (Sat, 05 Jul 2008) Log Message: ----------- ... Modified Paths: -------------- trunk/fcp2/src/fcp2/__init__.py Modified: trunk/fcp2/src/fcp2/__init__.py =================================================================== --- trunk/fcp2/src/fcp2/__init__.py 2008-07-06 05:52:28 UTC (rev 516) +++ trunk/fcp2/src/fcp2/__init__.py 2008-07-06 05:52:55 UTC (rev 517) @@ -10,7 +10,7 @@ __copyright__ = '(c) 2008 - Juergen Urner' __email__ = 'jue...@ar...' __licence__ = 'Mit' -__version__ = '0.1' +__version__ = '0.0.1' #--> rel import hack 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:52:18
|
Revision: 516 http://fclient.svn.sourceforge.net/fclient/?rev=516&view=rev Author: jUrner Date: 2008-07-05 22:52:28 -0700 (Sat, 05 Jul 2008) Log Message: ----------- fcp_lib is now lib Added Paths: ----------- trunk/fcp2/src/fcp2/lib/ Removed Paths: ------------- trunk/fcp2/src/fcp2/fcp_lib/ Copied: trunk/fcp2/src/fcp2/lib (from rev 513, trunk/fcp2/src/fcp2/fcp_lib) 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:52:01
|
Revision: 515 http://fclient.svn.sourceforge.net/fclient/?rev=515&view=rev Author: jUrner Date: 2008-07-05 22:52:07 -0700 (Sat, 05 Jul 2008) Log Message: ----------- fcp_lib is now lib Modified Paths: -------------- trunk/fcp2/src/fcp2/client.py trunk/fcp2/src/fcp2/events.py trunk/fcp2/src/fcp2/message.py Modified: trunk/fcp2/src/fcp2/client.py =================================================================== --- trunk/fcp2/src/fcp2/client.py 2008-07-06 05:38:42 UTC (rev 514) +++ trunk/fcp2/src/fcp2/client.py 2008-07-06 05:52:07 UTC (rev 515) @@ -231,7 +231,7 @@ import random from fcp2.fcp_lib import namespace -from fcp2.fcp_lib import tools +from fcp2.lib import tools del hack, _RelImportHack #<-- rel import hack Modified: trunk/fcp2/src/fcp2/events.py =================================================================== --- trunk/fcp2/src/fcp2/events.py 2008-07-06 05:38:42 UTC (rev 514) +++ trunk/fcp2/src/fcp2/events.py 2008-07-06 05:52:07 UTC (rev 515) @@ -15,7 +15,7 @@ from fcp2 import consts from fcp2 import types -from fcp2.fcp_lib import events +from fcp2.lib import events del hack, _RelImportHack Modified: trunk/fcp2/src/fcp2/message.py =================================================================== --- trunk/fcp2/src/fcp2/message.py 2008-07-06 05:38:42 UTC (rev 514) +++ trunk/fcp2/src/fcp2/message.py 2008-07-06 05:52:07 UTC (rev 515) @@ -18,7 +18,7 @@ from fcp2 import config from fcp2 import types from fcp2 import key -from fcp2.fcp_lib import node +from fcp2.lib import node del hack, _RelImportHack 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:38:32
|
Revision: 514 http://fclient.svn.sourceforge.net/fclient/?rev=514&view=rev Author: jUrner Date: 2008-07-05 22:38:42 -0700 (Sat, 05 Jul 2008) Log Message: ----------- .... Added Paths: ----------- trunk/fclient/ trunk/fclient/src/ trunk/fclient/src/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:28:17
|
Revision: 513 http://fclient.svn.sourceforge.net/fclient/?rev=513&view=rev Author: jUrner Date: 2008-07-05 22:28:25 -0700 (Sat, 05 Jul 2008) Log Message: ----------- .... Removed Paths: ------------- trunk/fclient/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |