SF.net SVN: fclient: [314] trunk/sandbox/fcp2/test_fcp/test_client.py
Status: Pre-Alpha
Brought to you by:
jurner
|
From: <ju...@us...> - 2008-03-06 12:00:07
|
Revision: 314
http://fclient.svn.sourceforge.net/fclient/?rev=314&view=rev
Author: jurner
Date: 2008-03-06 04:00:08 -0800 (Thu, 06 Mar 2008)
Log Message:
-----------
reworked test to use new iohandler
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-06 11:59:34 UTC (rev 313)
+++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-03-06 12:00:08 UTC (rev 314)
@@ -21,113 +21,32 @@
from fcp2.client import Client
from fcp2 import consts
+from fcp2 import iohandler
del hack
#<-- rel import hack
-from dummy_socket import DummySocket
+from dummy_socket import TestIO
#***********************************************************************************
#
#***********************************************************************************
DIR = os.path.dirname(os.path.abspath(__file__))
-TestAgainstNode = 0 # don't know how to test against node. Do not touch this!
+##TestAgainstNode = 0 # don't know how to test against node. Do not touch this!
-#***********************************************************************************
-#
-#***********************************************************************************
-class MyFcpClient(Client):
- """Customized client recording all messages it sends
- """
- def __init__(self, *args, **kwargs):
- Client.__init__(self, *args, **kwargs)
- self.test_messagesSend = []
-
- def sendMessageEx(self, msg):
- Client.sendMessageEx(self, msg)
- # deepcopy here, we need exact state
- msg = copy.deepcopy(msg)
- self.test_messagesSend.append(msg)
- def clearMessagesSend(self):
- self.test_messagesSend = []
-
#***********************************************************************************
#
-#***********************************************************************************
-class DummySocketModule(object):
- """Dummy socket module we inject into the client module for testing
-
- """
- AF_INET = socket.AF_INET
- SOCK_STREAM = socket.SOCK_STREAM
- error = socket.error
- socket = DummySocket()
-
- def __init__(self):
- self.lastSocket = None
-
- def __getattribute__(self, name):
- obj = object.__getattribute__(self, name)
- if name == 'socket':
- self.lastSocket = obj
- return obj
-
#***********************************************************************************
-#
-#***********************************************************************************
-class MySocketFactory(object):
- """Real and alive socket. Can be used to test against the running node. Not used currently
-
- Usage::
-
- DummySocketModule.socket = MySocketFactory()
-
- """
- def __init__(self, *args, **kwargs):
- self.socket = None
- self.closed = False
-
- def __call__(self, *args, **kwargs):
- self.socket = socket.socket(*args, **kwargs)
- return self
-
- def sendResponseMessage(self, *args, **kwargs):
- pass
-
- def connect(self, *args, **kwargs):
- return self.socket.connect(*args, **kwargs)
-
- def sendall(self, bytes):
- return self.socket.sendall(bytes)
-
- def settimeout(self, n):
- return self.socket.settimeout(n)
-
- def recv(self, n):
- return self.socket.recv(n)
-
- def close(self):
- self.closed = True
- result = self.socket.close()
- self.socket = None
- return result
-
-#***********************************************************************************
-#
-#***********************************************************************************
class BaseTestClient(unittest.TestCase):
"""Base class for all tests"""
- if TestAgainstNode:
- DummySocketModule.socket = MySocketFactory()
- fcpClient = MyFcpClient(
+ fcpClient = Client(
#debugVerbosity=Client.consts.DebugVerbosity.Debug
debugVerbosity=Client.consts.DebugVerbosity.Quiet
)
- # inject our customized socket module
- socketModule = DummySocketModule()
- client.socket = socketModule
+ fcpClient.ioHandler.setIOPrototype(TestIO)
+ #fcpClient.connect()
def __init__(self, *args, **kwargs):
@@ -147,14 +66,17 @@
"""Clears all messages send, requests registered and events triggered so far"""
# clean up the mess we eventaully left behinf
self.events = []
- self.fcpClient.clearMessagesSend()
+ 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 == 0:
+ if n == 1:
self.assertHasNextMessage(
consts.Message.ClientHello
)
@@ -261,11 +183,11 @@
@return: message if a message was received or None
"""
+ msg = self.getNextMessage()
if messageName is None:
- self.failIf(self.fcpClient.test_messagesSend)
+ self.failUnless(msg is None)
else:
- self.failUnless(self.fcpClient.test_messagesSend)
- msg = self.fcpClient.test_messagesSend.pop(0)
+ self.failIf(msg is None)
self.assertEqual(msg.name, messageName)
if param1 is not None:
param1, value1 = param1
@@ -334,11 +256,33 @@
def sendResponseMessage(self, messageName, data=None, callNext=True, **params):
"""Posts a message to the client"""
- self.socketModule.lastSocket.sendResponseMessage(messageName, data=data, **params)
- if not TestAgainstNode:
- if callNext:
- self.fcpClient.next()
+ msg = Client.message.Message(messageName, data=data, **params)
+ self.fcpClient.ioHandler.io.readBuffer += msg.toString()
+ if callNext:
+ self.fcpClient.next()
+
+ def getNextMessage(self):
+ # cheat a bit to get iohandler to read a message from writeBuffer
+ if self.ioOpen():
+ self.fcpClient.ioHandler.io.setReverseDirection(True)
+ try:
+ msg = self.fcpClient.ioHandler.readMessage()
+ except iohandler.IOTimeout:
+ return None
+ finally:
+ self.fcpClient.ioHandler.io.setReverseDirection(False)
+ return msg
+
+
+ def ioOpen(self):
+ return self.fcpClient.ioHandler.isOpen()
+
+
+ def getIO(self):
+ return self.fcpClient.ioHandler.io
+
+
def setUp(self):
# conect all events
self.events = [] # events received from the client
@@ -371,17 +315,12 @@
self.failUnless(self.socket.closed)
-
def XXXtestConnect(self):
nodeHello = self.fcpClient.connect(duration=10, timeout=0.1)
- self.failIf(nodeHello is None)
- return
+ self.failUnless(nodeHello is None)
+ #return
-
- nodeHello = self.fcpClient.connect(duration=0, timeout=0)
- self.failIf(nodeHello is not None)
-
- self.socketModule.lastSocket.sendResponseMessage(
+ self.sendResponseMessage(
'NodeHello',
FCPVersion='2.0',
Node='Fred',
@@ -395,37 +334,33 @@
NodeLanguage='en',
)
nodeHello = self.fcpClient.connect(duration=10, timeout=0.1)
- self.failIf(nodeHello is None)
+ print nodeHello
+ #self.failIf(nodeHello is None)
def test_0_IterIterConnect_RFailure(self):
- # we cannot test against node here
- if not TestAgainstNode:
-
- for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)):
- if n == 0:
- self.assertHasNextMessage(
- consts.Message.ClientHello
- )
-
- # check events the client triggered
- self.assertHasNextEvent(
- self.fcpClient.events.ClientDisconnected,
- consts.Message.ClientDisconnected,
- ('DisconnectReason', consts.DisconnectReason.ConnectingFailed),
+ for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)):
+ if n == 1:
+ self.assertHasNextMessage(
+ consts.Message.ClientHello
)
-
- self.assertHasNextEvent(None)
- self.assertHasNextMessage(None)
- self.failUnless(self.socketModule.lastSocket.closed)
-
- #self.fcpClient.connect(duration=20, timeout=0.1)
-
+ # check events the client triggered
+ self.assertHasNextEvent(
+ self.fcpClient.events.ClientDisconnected,
+ consts.Message.ClientDisconnected,
+ ('DisconnectReason', consts.DisconnectReason.ConnectingFailed),
+ )
+
+ self.assertHasNextEvent(None)
+ self.assertHasNextMessage(None)
+ self.failIf(self.ioOpen())
+
+
def test_1_IterConnect_Success(self):
- for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=20, timeout=0.1)):
- if n == 0:
+ for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)):
+ if n == 1:
self.assertHasNextMessage(
consts.Message.ClientHello
)
@@ -460,7 +395,7 @@
class TestDisconnectReason(BaseTestClient):
def test_1000_DuplicateClientName(self):
-
+
self.sendResponseMessage('CloseConnectionDuplicateClientName')
msg = self.assertHasNextEvent(
self.fcpClient.events.ClientDisconnected,
@@ -470,8 +405,9 @@
self.failUnless('Param' in msg.params)
self.assertEqual(msg['Param'], None)
- self.failUnless(self.socketModule.lastSocket.closed)
+ self.failIf(self.ioOpen())
self.assertHasNextEvent(None)
+ #print self.fcpClient.test_messagesSend[0].name
self.assertHasNextMessage(None)
self.connectClient()
@@ -479,9 +415,9 @@
def test_1001_SocketDied_Receive(self):
- self.socketModule.lastSocket.close()
- self.fcpClient.next()
-
+ self.getIO().setBroken(True)
+ self.assertRaises(iohandler.IOBroken, self.fcpClient.next)
+
# check if ClientDisconnected events has been triggered
msg = self.assertHasNextEvent(
self.fcpClient.events.ClientDisconnected,
@@ -490,21 +426,21 @@
#('Param', ClientSocketDiedMessage) # can not test here
)
self.failUnless('Param' in msg.params)
- self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied)
+ # Param is now details of IOBroken exception, no idea how to test
+ #self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied)
- self.failUnless(self.socketModule.lastSocket.closed)
+ self.failIf(self.ioOpen())
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
-
self.connectClient()
def test_1002_SocketDied_Send(self):
- self.socketModule.lastSocket.close()
-
+ self.getIO().setBroken(True)
+
# send a test message
- self.assertRaises(socket.error, self.fcpClient.sendMessage, 'test' )
+ self.assertRaises(iohandler.IOBroken, self.fcpClient.sendMessage, 'test' )
# check if ClientDisconnected events has been triggered
msg = self.assertHasNextEvent(
@@ -514,9 +450,10 @@
#('Param', ClientSocketDiedMessage) # can not test here
)
self.failUnless('Param' in msg.params)
- self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied)
+ # Param is now details of IOBroken exception, no idea how to test
+ #self.assertEqual(msg['Param'].name, consts.Message.ClientSocketDied)
- self.failUnless(self.socketModule.lastSocket.closed)
+ self.failIf(self.ioOpen())
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.connectClient()
@@ -542,7 +479,7 @@
self.failUnless('Param' in msg.params)
self.assertEqual(msg['Param'], None)
- self.failUnless(self.socketModule.lastSocket.closed)
+ self.failIf(self.ioOpen())
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.connectClient()
@@ -551,33 +488,27 @@
def test_1004_VersionMismatch(self):
- # cheat a bit and reconnect client
- enum = self.fcpClient.iterConnect(duration=0.2, timeout=0.1)
- msg = enum.next()
- self.failIf(msg is not None)
-
- # check messages the client send message
- self.assertHasNextMessage(consts.Message.ClientHello)
-
- #NOTE: have to send directly via socket here (our sendResponseMessage
- # calls client.next() autkmatically)
- self.socketModule.lastSocket.sendResponseMessage(
- 'NodeHello',
- FCPVersion='0.0',
- Node='Fred',
- Version=str(self.fcpClient.ExpectedFcpVersion),
- Revision='0',
- Build='0',
- ExRevision='0',
- Testnet='false',
- CompressionCodecs='1',
- ConnectionIdentifier='any',
- NodeLanguage='en',
-
- callNext=False
- )
- msg = enum.next()
+ for n, nodeHello in enumerate(self.fcpClient.iterConnect(duration=1, timeout=0.1)):
+ if n == 1:
+ self.assertHasNextMessage(
+ consts.Message.ClientHello
+ )
+ self.sendResponseMessage(
+ 'NodeHello',
+ FCPVersion='0.0',
+ Node='Fred',
+ Version=str(self.fcpClient.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.fcpClient.events.ClientDisconnected,
@@ -588,7 +519,7 @@
self.failUnless('Param' in msg.params)
self.assertEqual(msg['Param'].name, consts.Message.NodeHello)
- self.failUnless(self.socketModule.lastSocket.closed)
+ self.failIf(self.ioOpen())
self.assertHasNextEvent(None)
self.assertHasNextMessage(None)
self.connectClient()
@@ -2433,7 +2364,6 @@
if __name__ == "__main__":
test()
-test()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|