Piotr Kliczewski has uploaded a new change for review.

Change subject: tests: JsonRpcClient tests suite
......................................................................

tests: JsonRpcClient tests suite

Signed-off-by: pkliczewski <piotr.kliczew...@gmail.com>
Change-Id: I48c209915f4047958fd9b7e5dd6a202ca14a50cb
---
M tests/Makefile.am
A tests/jsonrpcClientTests.py
M tests/stompAdapterTests.py
3 files changed, 159 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/82/43582/1

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 9a7f81f..a010bb3 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -57,6 +57,7 @@
        iproute2Tests.py \
        ipwrapperTests.py \
        iscsiTests.py \
+       jsonrpcClientTests.py \
        jsonrpcServerTests.py \
        libvirtconnectionTests.py \
        lvmTests.py \
diff --git a/tests/jsonrpcClientTests.py b/tests/jsonrpcClientTests.py
new file mode 100644
index 0000000..5d4304f
--- /dev/null
+++ b/tests/jsonrpcClientTests.py
@@ -0,0 +1,148 @@
+#
+# Copyright 2015 Red Hat, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+#
+# Refer to the README and COPYING files for full details of the license
+#
+from Queue import Queue
+from threading import Event
+
+from testlib import VdsmTestCase as TestCaseBase
+from yajsonrpc.stompreactor import ClientRpcTransportAdapter
+from yajsonrpc import JsonRpcClient, JsonRpcRequest, JsonRpcResponse
+from yajsonrpc.stomp import Frame, Headers
+from vdsm.compat import json
+
+from stompAdapterTests import TestSubscription
+
+
+ID = 'e8a936a6-d886-4cfa-97b9-2d54209053ff'
+
+
+class TestClient(object):
+
+    def __init__(self):
+        self._queue = Queue()
+        self.closed = False
+
+    def send(self, data, destination, headers):
+        self._queue.put_nowait((data, destination, headers))
+
+    def pop_message(self):
+        return self._queue.get(True, 3)
+
+    @property
+    def has_outgoing_messages(self):
+        return (self._queue.qsize() > 0)
+
+    def close(self):
+        self.closed = True
+
+
+class JsonrpcClientTest(TestCaseBase):
+
+    def test_call(self):
+        subscription = TestSubscription('jms.topic.vdsm_responses',
+                                        'ad052acb-a934-4e10-8ec3-00c7417ef8d1')
+        client = TestClient()
+        subscription.set_client(client)
+
+        json_client = JsonRpcClient(
+            ClientRpcTransportAdapter(subscription,
+                                      'jms.topic.vdsm_requests',
+                                      client)
+        )
+
+        request = JsonRpcRequest('my_method', (), ID)
+        json_client.call(request, timeout=0)
+
+        self.assertTrue(client.has_outgoing_messages)
+        data, destination, headers = client.pop_message()
+
+        req = JsonRpcRequest.fromRawObject(json.loads(data)[0])
+        self.assertEquals(req.method, request.method)
+        self.assertEquals(req.id, request.id)
+
+        self.assertEquals('jms.topic.vdsm_requests', destination)
+
+        self.assertEquals(headers[Headers.CONTENT_TYPE], 'application/json')
+        self.assertEquals(headers[Headers.REPLY_TO],
+                          'jms.topic.vdsm_responses')
+
+    def test_async_call_with_response(self):
+        subscription = TestSubscription('jms.topic.vdsm_responses',
+                                        'ad052acb-a934-4e10-8ec3-00c7417ef8d1')
+        client = TestClient()
+        subscription.set_client(client)
+
+        json_client = JsonRpcClient(
+            ClientRpcTransportAdapter(subscription,
+                                      'jms.topic.vdsm_requests',
+                                      client)
+        )
+
+        request = JsonRpcRequest('my_method', (), ID)
+        call = json_client.call_async(request)
+
+        self.assertTrue(client.has_outgoing_messages)
+
+        response = JsonRpcResponse(result='my_response', reqId=ID)
+        subscription.process(Frame(body=response.encode()))
+
+        self.assertTrue(call.isSet())
+        self.assertEquals('my_response', call.responses[0].result)
+
+    def test_receive_event(self):
+        subscription = TestSubscription('jms.topic.vdsm_responses',
+                                        'ad052acb-a934-4e10-8ec3-00c7417ef8d1')
+        client = TestClient()
+        subscription.set_client(client)
+        ev = Event()
+
+        json_client = JsonRpcClient(
+            ClientRpcTransportAdapter(subscription,
+                                      'jms.topic.vdsm_requests',
+                                      client)
+        )
+
+        def callback(client, event, params):
+            self.assertEquals(event, 'localhost|component|operation|id')
+            self.assertEquals(params['my_property'], 'my_value')
+            ev.set()
+
+        json_client.registerEventCallback(callback)
+
+        event = JsonRpcRequest('localhost|component|operation|id',
+                               {'my_property': 'my_value'})
+
+        subscription.process(Frame(body=event.encode()))
+        ev.wait(timeout=3)
+        self.assertTrue(ev.is_set())
+
+    def test_close(self):
+        subscription = TestSubscription('jms.topic.vdsm_responses',
+                                        'ad052acb-a934-4e10-8ec3-00c7417ef8d1')
+        client = TestClient()
+
+        json_client = JsonRpcClient(
+            ClientRpcTransportAdapter(subscription,
+                                      'jms.topic.vdsm_requests',
+                                      client)
+        )
+
+        json_client.close()
+        self.assertTrue(client.closed)
+        self.assertTrue(subscription.unsubscribed)
diff --git a/tests/stompAdapterTests.py b/tests/stompAdapterTests.py
index a0be47f..68fae77 100644
--- a/tests/stompAdapterTests.py
+++ b/tests/stompAdapterTests.py
@@ -60,6 +60,7 @@
     def __init__(self, destination, id):
         self._destination = destination
         self._id = id
+        self.unsubscribed = False
 
     def set_client(self, client):
         self._client = TestConnection(client)
@@ -76,6 +77,15 @@
     def client(self):
         return self._client
 
+    def set_message_handler(self, message_handler):
+        self.handler = message_handler
+
+    def process(self, data):
+        self.handler(None, data)
+
+    def unsubscribe(self):
+        self.unsubscribed = True
+
 
 class ConnectFrameTest(TestCaseBase):
 


-- 
To view, visit https://gerrit.ovirt.org/43582
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I48c209915f4047958fd9b7e5dd6a202ca14a50cb
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Piotr Kliczewski <piotr.kliczew...@gmail.com>
_______________________________________________
vdsm-patches mailing list
vdsm-patches@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches

Reply via email to