SF.net SVN: fclient: [352] trunk/sandbox/fcp2/test_fcp/test_client.py
Status: Pre-Alpha
Brought to you by:
jurner
|
From: <jU...@us...> - 2008-03-09 12:56:42
|
Revision: 352
http://fclient.svn.sourceforge.net/fclient/?rev=352&view=rev
Author: jUrner
Date: 2008-03-09 05:56:43 -0700 (Sun, 09 Mar 2008)
Log Message:
-----------
rewrite in progress
Modified Paths:
--------------
trunk/sandbox/fcp2/test_fcp/test_client.py
Modified: trunk/sandbox/fcp2/test_fcp/test_client.py
===================================================================
--- trunk/sandbox/fcp2/test_fcp/test_client.py 2008-03-09 12:56:27 UTC (rev 351)
+++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-03-09 12:56:43 UTC (rev 352)
@@ -47,9 +47,8 @@
)
fcpClient.ioHandler.setIOPrototype(DummyIO)
- #fcpClient.connect()
+
-
def __init__(self, *args, **kwargs):
unittest.TestCase.__init__(self, *args, **kwargs)
@@ -58,53 +57,54 @@
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 clearClient(self):
- """Clears all messages send, requests registered and events triggered so far"""
- # clean up the mess we eventaully left behinf
- self.events = []
- if self.ioOpen():
- self.fcpClient.ioHandler.io.readBuffer = ''
- self.fcpClient.ioHandler.io.writeBuffer = ''
- self.fcpClient._requests = {}
-
-
def connectClient(self):
"""Connects to the client"""
- for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=20, timeout=0.1)):
- if n == 1:
- self.assertHasNextMessage(
- consts.Message.ClientHello
- )
+ for n, nodeHello in enumerate(self.fcpClient.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.fcpClient.ExpectedFcpVersion),
- Revision='999999999999',
- Build='9999999999',
- ExRevision='9999999999',
- Testnet='false',
- CompressionCodecs='1',
- ConnectionIdentifier='any',
- NodeLanguage='en',
-
- callNext=False,
- )
-
- # check events the client triggered
+ 'NodeHello',
+ FCPVersion='2.0',
+ Build='9999999999',
+
+ Node='Fred',
+ Version=str(self.fcpClient.ExpectedFcpVersion),
+ Revision='999999999999',
+ ExRevision='9999999999',
+ Testnet='false',
+ CompressionCodecs='1',
+ ConnectionIdentifier='any',
+ NodeLanguage='en',
+
+ callNext=False,
+ )
+
self.assertHasNextEvent(
- self.fcpClient.events.ClientConnected,
- consts.Message.NodeHello,
- )
-
+ self.fcpClient.events.ClientConnected,
+ consts.Message.NodeHello,
+ )
self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
+ self.failUnless(self.ioOpen())
+
+ def closeClient(self):
+ """Closes the client"""
+ self.fcpClient.close()
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.Close),
+ )
+
+
def assertHasNextEvent(self,
expectedEvent=None,
messageName=None,
@@ -256,7 +256,7 @@
return msg
def sendResponseMessage(self, messageName, data=None, callNext=True, **params):
- """Posts a message to the client"""
+ """Sends a message to the client"""
if messageName in message.MessagesAll:
msgClass = message.MessagesAll[messageName]
else:
@@ -267,7 +267,15 @@
self.fcpClient.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.fcpClient.ioHandler.io.setReverseDirection(True)
@@ -281,10 +289,12 @@
def ioOpen(self):
+ """Checks if the clients io is open"""
return self.fcpClient.ioHandler.isOpen()
def getIO(self):
+ """Returns the clients io"""
return self.fcpClient.ioHandler.io
@@ -300,7 +310,9 @@
event -= self._captureEventsFromClient
# clean up tmpfiles
for fpath in self.tmpfiles: os.remove(fpath)
- self.clearClient()
+ if self.fcpClient.isOpen():
+ self.fcpClient.close()
+
#***********************************************************************************
#
@@ -310,72 +322,221 @@
#***********************************************************************************
#
#***********************************************************************************
-class TestConnect(BaseTestClient):
+class Test_close(BaseTestClient):
+ def test_close(self):
+ self.fcpClient.close()
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.Close),
+ )
+
+
+#***********************************************************************************
+#
+#***********************************************************************************
+class Test_isOpen(BaseTestClient):
- def XXXtestClose(self):
- self.failIf(self.socket.closed)
+ def test_isOpen(self):
+ self.failIf(self.fcpClient.isOpen())
self.connectClient()
+ self.failUnless(self.fcpClient.isOpen())
+ self.closeClient()
+ self.failIf(self.fcpClient.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.fcpClient.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.fcpClient.ExpectedFcpVersion),
+ Revision='999999999999',
+ Build='9999999999',
+ ExRevision='9999999999',
+ Testnet='false',
+ CompressionCodecs='1',
+ ConnectionIdentifier='any',
+ NodeLanguage='en',
+
+ callNext=False,
+ )
+
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientConnected,
+ consts.Message.NodeHello,
+ )
+ self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
+ self.failUnless(self.ioOpen())
self.fcpClient.close()
- self.failUnless(self.socket.closed)
- def XXXtestConnect(self):
- nodeHello = self.fcpClient.connect(duration=10, timeout=0.1)
+ def test_iterConnect_ioRefusesConnection(self):
+ for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)):
+ self.getIO().setAllowConnect(False)
+
self.failUnless(nodeHello is None)
- #return
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.IOConnectFailed),
+ )
+ self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
+ self.failIf(self.ioOpen())
- self.sendResponseMessage(
- 'NodeHello',
- FCPVersion='2.0',
- Node='Fred',
- Version=str(self.fcpClient.ExpectedFcpVersion),
- Revision='999999999999',
- Build='9999999999',
- ExRevision='9999999999',
- Testnet='false',
- CompressionCodecs='1',
- ConnectionIdentifier='any',
- NodeLanguage='en',
+
+ def test_iterConnect_nodeHelloNeverArrives(self):
+ for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)):
+ pass
+
+ self.failUnless(nodeHello is None)
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.NoNodeHello),
)
- nodeHello = self.fcpClient.connect(duration=10, timeout=0.1)
- print nodeHello
- #self.failIf(nodeHello is None)
-
-
- def test_0_IterIterConnect_RFailure(self):
+ self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
+ self.failIf(self.ioOpen())
- for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)):
- if n == 1:
- self.assertHasNextMessage(
- consts.Message.ClientHello
+
+ def test_iterConnect_socketDies(self):
+ enum = self.fcpClient.iterConnect(duration=0.2, timeout=0.1)
+ errorRaised = False
+ while True:
+ try:
+ enum.next()
+ except StopIteration:
+ break
+ except iohandler.IOBroken, d:
+ errorRaised = True
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.ConnectionDied),
+ #('Param', None),
)
+ break
+ self.getIO().setBroken(True)
+
+ self.failUnless(errorRaised)
+ self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
+ self.failIf(self.ioOpen())
- # check events the client triggered
+
+ def test_iterIterConnect_unknownNodehello(self):
+
+ for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)):
+ self.sendResponseMessage(
+ 'i-am-invalid',
+ callNext=False,
+ )
+
+ self.failUnless(nodeHello is None)
self.assertHasNextEvent(
self.fcpClient.events.ClientDisconnected,
consts.Message.ClientDisconnected,
- ('DisconnectReason', consts.DisconnectReason.ConnectingFailed),
+ ('DisconnectReason', consts.DisconnectReason.UnknownNodeHello),
)
-
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.failIf(self.ioOpen())
+
+ def test_iterIterConnect_connect(self):
+ for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=0.2, timeout=0.1)):
+ self.sendResponseMessage(
+ 'NodeHello',
+ FCPVersion='2.0',
+ Build='9999999999',
+
+ Node='Fred',
+ Version=str(self.fcpClient.ExpectedFcpVersion),
+ Revision='999999999999',
+ ExRevision='9999999999',
+ Testnet='false',
+ CompressionCodecs='1',
+ ConnectionIdentifier='any',
+ NodeLanguage='en',
+
+ callNext=False,
+ )
- def test_1_IterConnect_Success(self):
- for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)):
- if n == 1:
- self.assertHasNextMessage(
- consts.Message.ClientHello
- )
- self.sendResponseMessage(
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientConnected,
+ consts.Message.NodeHello,
+ )
+ 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.fcpClient.iterConnect(duration=0.2, timeout=0.1)):
+ self.sendResponseMessage(
'NodeHello',
FCPVersion='2.0',
+ Build='9999999999',
+
Node='Fred',
Version=str(self.fcpClient.ExpectedFcpVersion),
Revision='999999999999',
+ ExRevision='9999999999',
+ Testnet='false',
+ CompressionCodecs='1',
+ ConnectionIdentifier='any',
+ NodeLanguage='en',
+
+ callNext=False,
+ )
+
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.Reconnect)
+ )
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientConnected,
+ consts.Message.NodeHello,
+ )
+ 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.fcpClient.iterConnect(duration=0.2, timeout=0.1)):
+ self.sendResponseMessage(
+ 'NodeHello',
+ FCPVersion='0.0',
Build='9999999999',
+
+ Node='Fred',
+ Version=str(self.fcpClient.ExpectedFcpVersion),
+ Revision='999999999999',
ExRevision='9999999999',
Testnet='false',
CompressionCodecs='1',
@@ -384,16 +545,99 @@
callNext=False,
)
+
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.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.fcpClient.iterConnect(duration=0.2, timeout=0.1)):
+ self.sendResponseMessage(
+ 'NodeHello',
+ FCPVersion='2.0',
+ Build='0',
+
+ Node='Fred',
+ Version=str(self.fcpClient.ExpectedFcpVersion),
+ Revision='999999999999',
+ ExRevision='9999999999',
+ Testnet='false',
+ CompressionCodecs='1',
+ ConnectionIdentifier='any',
+ NodeLanguage='en',
+
+ callNext=False,
+ )
+
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.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',
+ )
- # check events the client triggered
self.assertHasNextEvent(
- self.fcpClient.events.ClientConnected,
- consts.Message.NodeHello,
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.DuplicateClientName)
+ )
+ self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
+ self.failIf(self.ioOpen())
+ self.closeClient()
+
+#***********************************************************************************
+#
+#***********************************************************************************
+class Test_closeNode(BaseTestClient):
+
+ def test_closeNode(self):
+ self.connectClient()
+ self.fcpClient.closeNode()
+ self.assertHasNextMessage('Shutdown')
+ self.sendResponseMessage(
+ 'ProtocolError',
+ Code='18'
)
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.NodeClosing)
+ )
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
-
+ self.failIf(self.ioOpen())
+ self.closeClient()
+
+
+###################################################
+###################################################
+###################################################
+
+
#***********************************************************************************
#
#***********************************************************************************
@@ -1624,14 +1868,15 @@
#TODO: testRestoreClientPut and friends
class TestRestoreRequests(BaseTestClient):
- def test_4000_RestorePersistentGet_InvalidIdentifier(self):
+ def test_4000_RestorePersistentGet_InvalidClientToken(self):
# throw an invalid PersistentRequest at the client
- myIdentifier = 'true-invalid-request-identifier'
+ myIdentifier = '123456789'
self.sendResponseMessage(
'PersistentGet',
Identifier=myIdentifier,
Global='false',
+ ClientToken='i-am-invalid',
ReturnType='disk',
Verbosity='1',
PersistenceType='forever',
@@ -2357,18 +2602,23 @@
def suite():
testCases = (
- TestConnect,
- TestDisconnectReason,
- TestClientGet,
- TestClientPut,
- TestRequests,
- TestRestoreRequests,
- TestResendRequests,
- TestDDA,
- TestCollisions,
- TestPlugins,
- TestGenerateKeypair,
- TestSubscribeUSK,
+ Test_close,
+ Test_isOpen,
+ Test_connect,
+ Test_iterConnect,
+ Test_CloseConnectionDuplicateClientName,
+ Test_closeNode,
+ #TestDisconnectReason,
+ #TestClientGet,
+ #TestClientPut,
+ #TestRequests,
+ #TestRestoreRequests,
+ #TestResendRequests,
+ #TestDDA,
+ #TestCollisions,
+ #TestPlugins,
+ #TestGenerateKeypair,
+ #TestSubscribeUSK,
)
suite = unittest.TestSuite()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|