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