Change in vdsm[master]: jsonrpc: Rearrange test classes for reusability

agl at us.ibm.com agl at us.ibm.com
Wed Jan 16 20:11:49 UTC 2013


Adam Litke has uploaded a new change for review.

Change subject: jsonrpc: Rearrange test classes for reusability
......................................................................

jsonrpc: Rearrange test classes for reusability

Signed-off-by: Adam Litke <agl at us.ibm.com>
Change-Id: I78f9546c0bfb2348510340922ba95569b1827830
---
M tests/jsonRpcTests.py
A tests/jsonRpcUtils.py
A vdsm_api/jsonrpc/client.py
3 files changed, 139 insertions(+), 125 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/22/11122/1

diff --git a/tests/jsonRpcTests.py b/tests/jsonRpcTests.py
index f157950..6e90d58d 100644
--- a/tests/jsonRpcTests.py
+++ b/tests/jsonRpcTests.py
@@ -19,10 +19,7 @@
 #
 import threading
 import socket
-from contextlib import contextmanager
-from functools import partial
 from contextlib import closing
-import json
 
 from testrunner import VdsmTestCase as TestCaseBase, \
     expandPermutations, \
@@ -30,135 +27,16 @@
     dummyTextGenerator
 
 from jsonrpc import \
-    tcpReactor, \
     JsonRpcError, \
-    JsonRpcServer, \
     JsonRpcMethodNotFoundError, \
     JsonRpcInternalError
 
-PORT_RANGE = xrange(49152, 65535)
-
-
-_distributedPorts = []
-
-
-def _getFreePort():
-    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-    with closing(sock):
-        for port in PORT_RANGE:
-            if port in _distributedPorts:
-                continue
-
-            try:
-                sock.bind(("0.0.0.0", port))
-            except:
-                continue
-
-            _distributedPorts.append(port)
-            return port
-        else:
-            raise Exception("Could not find a free port")
-
-
- at contextmanager
-def _tcpServerConstructor(messageHandler):
-    port = _getFreePort()
-    address = ("localhost", port)
-    reactor = tcpReactor.TCPReactor(address, messageHandler)
-
-    try:
-        yield reactor, partial(TCPReactorClient, address)
-    finally:
-        reactor.stop()
-
-
-REACTOR_CONSTRUCTORS = {"tcp": _tcpServerConstructor}
-REACTOR_TYPE_PERMUTATIONS = [[r] for r in REACTOR_CONSTRUCTORS.iterkeys()]
-
-
- at contextmanager
-def constructReactor(tp, messageHandler):
-    with REACTOR_CONSTRUCTORS[tp](messageHandler) as res:
-        yield res
-
-
- at contextmanager
-def constructServer(tp, bridge):
-    server = JsonRpcServer(bridge)
-    with constructReactor(tp, server) as (reactor, clientFactory):
-        reactor.start_listening()
-        t = threading.Thread(target=reactor.process_requests)
-        t.setDaemon(True)
-        t.start()
-
-        def jsonClientFactory():
-            return JsonRpcClient(clientFactory())
-
-        yield server, jsonClientFactory
+from jsonRpcUtils import *
 
 
 class _EchoMessageHandler(object):
     def handleMessage(self, msgCtx):
         msgCtx.sendReply(msgCtx.data)
-
-
-class TCPReactorClient(object):
-    def __init__(self, address):
-        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-        self.address = address
-
-    def connect(self):
-        self.sock.connect(self.address)
-
-    def sendMessage(self, msg, timeout=None):
-        msg = tcpReactor._Size.pack(len(msg)) + msg
-        self.sock.settimeout(timeout)
-        while msg:
-            sent = self.sock.send(msg)
-            msg = msg[sent:]
-
-    def recvMessage(self, timeout=None):
-        self.sock.settimeout(timeout)
-        rawSize = self.sock.recv(tcpReactor._Size.size)
-        size = tcpReactor._Size.unpack(rawSize)[0]
-        buff = ""
-        while (size - len(buff)) > 0:
-            buff += self.sock.recv(size)
-
-        return buff
-
-    def close(self):
-        self.sock.close()
-
-
-class JsonRpcClient(object):
-    def __init__(self, reactorClient):
-        self._transport = reactorClient
-
-    def connect(self):
-        self._transport.connect()
-
-    def callMethod(self, methodName, params=(), reqId=None):
-        msg = {'jsonrpc': '2.0',
-               'method': methodName,
-               'params': params,
-               'id': reqId}
-
-        self._transport.sendMessage(json.dumps(msg, 'utf-8'))
-        # Notifications have no repsonse
-        if reqId is None:
-            return
-
-        resp = self._transport.recvMessage()
-        resp = json.loads(resp)
-        if resp.get('error') is not None:
-            raise JsonRpcError(resp['error']['code'],
-                               resp['error']['message'])
-
-        return resp.get('result')
-
-    def close(self):
-        self._transport.close()
 
 
 @expandPermutations
@@ -177,8 +55,8 @@
                 self.log.error("Server died unexpectedly", exc_info=True)
                 self.fail("Server died: (%s) %s" % (type(e), e))
 
-        with constructReactor(reactorType, msgHandler) as (reactor,
-                                                           clientFactory):
+        with constructReactor(reactorType, msgHandler) \
+                as (reactor, clientFactory):
             reactor.start_listening()
             t = threading.Thread(target=serve, args=(reactor,))
             t.setDaemon(True)
diff --git a/tests/jsonRpcUtils.py b/tests/jsonRpcUtils.py
new file mode 100644
index 0000000..2d782fc
--- /dev/null
+++ b/tests/jsonRpcUtils.py
@@ -0,0 +1,73 @@
+import threading
+import socket
+from contextlib import closing
+from contextlib import contextmanager
+from functools import partial
+
+from jsonrpc import \
+    JsonRpcServer, \
+    tcpReactor
+from jsonrpc.client import \
+    JsonRpcClient, \
+    TCPReactorClient
+
+_PORT_RANGE = xrange(49152, 65535)
+
+
+_distributedPorts = []
+
+
+def getFreePort():
+    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    with closing(sock):
+        for port in _PORT_RANGE:
+            if port in _distributedPorts:
+                continue
+
+            try:
+                sock.bind(("0.0.0.0", port))
+            except:
+                continue
+
+            _distributedPorts.append(port)
+            return port
+        else:
+            raise Exception("Could not find a free port")
+
+
+ at contextmanager
+def _tcpServerConstructor(messageHandler):
+    port = getFreePort()
+    address = ("localhost", port)
+    reactor = tcpReactor.TCPReactor(address, messageHandler)
+
+    try:
+        yield reactor, partial(TCPReactorClient, address)
+    finally:
+        reactor.stop()
+
+
+_REACTOR_CONSTRUCTORS = {"tcp": _tcpServerConstructor}
+REACTOR_TYPE_PERMUTATIONS = [[r] for r in _REACTOR_CONSTRUCTORS.iterkeys()]
+
+
+ at contextmanager
+def constructReactor(tp, messageHandler):
+    with _REACTOR_CONSTRUCTORS[tp](messageHandler) as res:
+        yield res
+
+
+ at contextmanager
+def constructServer(tp, bridge):
+    server = JsonRpcServer(bridge)
+    with constructReactor(tp, server) as (reactor, clientFactory):
+        reactor.start_listening()
+        t = threading.Thread(target=reactor.process_requests)
+        t.setDaemon(True)
+        t.start()
+
+        def jsonClientFactory():
+            return JsonRpcClient(clientFactory())
+
+        yield server, jsonClientFactory
+
diff --git a/vdsm_api/jsonrpc/client.py b/vdsm_api/jsonrpc/client.py
new file mode 100644
index 0000000..5504dfd
--- /dev/null
+++ b/vdsm_api/jsonrpc/client.py
@@ -0,0 +1,63 @@
+import json
+import socket
+
+from jsonrpc import \
+    JsonRpcError, \
+    tcpReactor
+
+class JsonRpcClient(object):
+    def __init__(self, reactorClient):
+        self._transport = reactorClient
+
+    def connect(self):
+        self._transport.connect()
+
+    def callMethod(self, methodName, params=(), reqId=None):
+        msg = {'jsonrpc': '2.0',
+               'method': methodName,
+               'params': params,
+               'id': reqId}
+
+        self._transport.sendMessage(json.dumps(msg, 'utf-8'))
+        # Notifications have no repsonse
+        if reqId is None:
+            return
+
+        resp = self._transport.recvMessage()
+        resp = json.loads(resp)
+        if resp.get('error') is not None:
+            raise JsonRpcError(resp['error']['code'],
+                               resp['error']['message'])
+
+        return resp.get('result')
+
+    def close(self):
+        self._transport.close()
+
+class TCPReactorClient(object):
+    def __init__(self, address):
+        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        self.address = address
+
+    def connect(self):
+        self.sock.connect(self.address)
+
+    def sendMessage(self, msg, timeout=None):
+        msg = tcpReactor._Size.pack(len(msg)) + msg
+        self.sock.settimeout(timeout)
+        while msg:
+            sent = self.sock.send(msg)
+            msg = msg[sent:]
+
+    def recvMessage(self, timeout=None):
+        self.sock.settimeout(timeout)
+        rawSize = self.sock.recv(tcpReactor._Size.size)
+        size = tcpReactor._Size.unpack(rawSize)[0]
+        buff = ""
+        while (size - len(buff)) > 0:
+            buff += self.sock.recv(size)
+
+        return buff
+
+    def close(self):
+        self.sock.close()


--
To view, visit http://gerrit.ovirt.org/11122
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I78f9546c0bfb2348510340922ba95569b1827830
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Adam Litke <agl at us.ibm.com>


More information about the vdsm-patches mailing list