From a3b1a77fda4e564f0faa34ed0c116189d0a4b830 Mon Sep 17 00:00:00 2001 From: Gary Yendell Date: Tue, 7 Jun 2016 09:49:15 +0100 Subject: [PATCH] Fix tests --- malcolm/wscomms/wsclientcomms.py | 1 + tests/test_wscomms/test_wsclientcomms.py | 108 +++++++++++------------ tests/test_wscomms/test_wsservercomms.py | 36 ++++---- 3 files changed, 72 insertions(+), 73 deletions(-) diff --git a/malcolm/wscomms/wsclientcomms.py b/malcolm/wscomms/wsclientcomms.py index f255eeed7..e0c2301cc 100644 --- a/malcolm/wscomms/wsclientcomms.py +++ b/malcolm/wscomms/wsclientcomms.py @@ -26,6 +26,7 @@ def __init__(self, name, process, url): # TODO: Are we starting one or more IOLoops here? self.loop = IOLoop.current() self.conn = websocket_connect(url, on_message_callback=self.on_message) + self._loop_spawned = None def on_message(self, message): """ diff --git a/tests/test_wscomms/test_wsclientcomms.py b/tests/test_wscomms/test_wsclientcomms.py index 04f55f242..2a2751e51 100644 --- a/tests/test_wscomms/test_wsclientcomms.py +++ b/tests/test_wscomms/test_wsclientcomms.py @@ -14,81 +14,81 @@ class TestWSServerComms(unittest.TestCase): def setUp(self): self.p = MagicMock() - @patch('malcolm.wscomms.wsclientcomms.Application') + @patch('malcolm.wscomms.wsclientcomms.websocket_connect') @patch('malcolm.wscomms.wsclientcomms.IOLoop') - def test_init(self, _, app_mock): - self.WS = WSClientComms("TestWebSocket", self.p, 1) + def test_init(self, ioloop_mock, connect_mock): + self.WS = WSClientComms("TestWebSocket", self.p, "test/url") self.assertEqual("TestWebSocket", self.WS.name) self.assertEqual(self.p, self.WS.process) - self.assertEqual(app_mock(), self.WS.WSApp) - - @patch('malcolm.wscomms.wsclientcomms.Application.listen') - @patch('malcolm.wscomms.wsclientcomms.IOLoop') - def test_setup(self, ioloop_mock, listen_mock): - loop_mock = MagicMock() - ioloop_mock.current.return_value = loop_mock - - self.WS = WSClientComms("TestWebSocket", self.p, 1) - - listen_mock.assert_called_once_with(1) + self.assertEqual("test/url", self.WS.url) self.assertEqual(ioloop_mock.current(), self.WS.loop) - self.assertEqual(self.WS.process, - self.WS.WSApp.handlers[0][1][0].handler_class.process) - - @patch('malcolm.wscomms.wsclientcomms.Application.listen') - @patch('malcolm.wscomms.wsclientcomms.IOLoop') - def test_start(self, ioloop_mock, _): - loop_mock = MagicMock() - ioloop_mock.current.return_value = loop_mock - self.WS = WSClientComms("TestWebSocket", self.p, 1) - self.WS.start_recv_loop() - - loop_mock.start.assert_called_once_with() - - @patch('malcolm.wscomms.wsclientcomms.Application.listen') - @patch('malcolm.wscomms.wsclientcomms.IOLoop') - def test_stop(self, ioloop_mock, _): - loop_mock = MagicMock() - ioloop_mock.current.return_value = loop_mock - self.WS = WSClientComms("TestWebSocket", self.p, 1) - self.WS.stop_recv_loop() - - loop_mock.stop.assert_called_once_with() + connect_mock.assert_called_once_with(self.WS.url, on_message_callback=self.WS.on_message) + self.assertEqual(connect_mock(), self.WS.conn) + self.assertIsNone(self.WS._loop_spawned) @patch('malcolm.wscomms.wsclientcomms.Response') @patch('malcolm.wscomms.wsclientcomms.json') - @patch('malcolm.wscomms.wsclientcomms.Application.listen') + @patch('malcolm.wscomms.wsclientcomms.websocket_connect') @patch('malcolm.wscomms.wsclientcomms.IOLoop') - def test_MWSH_on_message(self, _, _1, json_mock, response_mock): - self.WS = WSClientComms("TestWebSocket", self.p, 1) + def test_on_message(self, _, _1, json_mock, response_mock): + self.WS = WSClientComms("TestWebSocket", self.p, "test/url") message_dict = dict(name="TestMessage") json_mock.loads.return_value = message_dict response = MagicMock() - response.context = self.WS.WSApp.handlers[0][1][0].handler_class + response.id_ = 1 response_mock.from_dict.return_value = response + request_mock = MagicMock() + self.WS.requests[1] = request_mock - m = MagicMock() - MWSH = MalcolmWebSocketHandler(m, m) - self.WS.WSApp.handlers[0][1][0].handler_class.on_message( - MWSH, "TestMessage") + self.WS.on_message("TestMessage") json_mock.loads.assert_called_once_with("TestMessage", - object_pairs_hook=OrderedDict()) + object_pairs_hook=OrderedDict) response_mock.from_dict.assert_called_once_with(message_dict) - self.p.q.put.assert_called_once_with(response) + request_mock.response_queue.put.assert_called_once_with(response) @patch('malcolm.wscomms.wsclientcomms.json') - @patch('malcolm.wscomms.wsclientcomms.Application.listen') + @patch('malcolm.wscomms.wsclientcomms.websocket_connect') + @patch('malcolm.wscomms.wsclientcomms.IOLoop') + def test_send_to_server(self, _, connect_mock, json_mock): + self.WS = WSClientComms("TestWebSocket", self.p, "test/url") + result_mock = MagicMock() + connect_mock().result.return_value = result_mock + dumps_mock = MagicMock() + json_mock.dumps.return_value = dumps_mock + + request_mock = MagicMock() + self.WS.send_to_server(request_mock) + + json_mock.dumps.assert_called_once_with(request_mock.to_dict()) + result_mock.write_message.assert_called_once_with(dumps_mock) + + @patch('malcolm.wscomms.wsclientcomms.websocket_connect') + @patch('malcolm.wscomms.wsclientcomms.IOLoop') + def test_start(self, ioloop_mock, _): + loop_mock = MagicMock() + ioloop_mock.current.return_value = loop_mock + self.WS = WSClientComms("TestWebSocket", self.p, "test/url") + spawn_mock = MagicMock() + self.WS.process.spawn.return_value = spawn_mock + + self.WS.start_recv_loop() + + self.WS.process.spawn.assert_called_once_with(loop_mock.start) + self.assertEqual(spawn_mock, self.WS._loop_spawned) + + @patch('malcolm.wscomms.wsclientcomms.websocket_connect') @patch('malcolm.wscomms.wsclientcomms.IOLoop') - def test_send_to_client(self, _, _2, json_mock): - self.WS = WSClientComms("TestWebSocket", self.p, 1) + def test_stop(self, ioloop_mock, _): + loop_mock = MagicMock() + ioloop_mock.current.return_value = loop_mock - response_mock = MagicMock() - self.WS.send_to_server(response_mock) + self.WS = WSClientComms("TestWebSocket", self.p, "test/url") + self.WS._loop_spawned = MagicMock() + self.WS.stop_recv_loop() - json_mock.dumps.assert_called_once_with(response_mock.to_dict()) - response_mock.context.write_message.assert_called_once_with( - json_mock.dumps()) + loop_mock.add_callback.assert_called_once_with(ioloop_mock.current().stop) + self.WS._loop_spawned.wait.assert_called_once_with() diff --git a/tests/test_wscomms/test_wsservercomms.py b/tests/test_wscomms/test_wsservercomms.py index a1d957387..ec3cfa3ee 100644 --- a/tests/test_wscomms/test_wsservercomms.py +++ b/tests/test_wscomms/test_wsservercomms.py @@ -15,29 +15,25 @@ class TestWSServerComms(unittest.TestCase): def setUp(self): self.p = MagicMock() - @patch('malcolm.wscomms.wsservercomms.Application') + @patch('malcolm.wscomms.wsservercomms.HTTPServer') @patch('malcolm.wscomms.wsservercomms.IOLoop') - def test_init(self, _, app_mock): + def test_init(self, ioloop_mock, server_mock): self.WS = WSServerComms("TestWebSocket", self.p, 1) self.assertEqual("TestWebSocket", self.WS.name) self.assertEqual(self.p, self.WS.process) - self.assertEqual(app_mock(), self.WS.WSApp) + self.assertIsNone(self.WS._loop_spawned) + self.assertEqual(server_mock(), self.WS.server) + self.assertEqual(ioloop_mock.current(), self.WS.loop) - @patch('malcolm.wscomms.wsservercomms.Application.listen') + @patch('malcolm.wscomms.wsservercomms.HTTPServer.listen') @patch('malcolm.wscomms.wsservercomms.IOLoop') - def test_setup(self, ioloop_mock, listen_mock): - loop_mock = MagicMock() - ioloop_mock.current.return_value = loop_mock - + def test_listen_called(self, ioloop_mock, listen_mock): self.WS = WSServerComms("TestWebSocket", self.p, 1) - listen_mock.assert_called_once_with(1) self.assertEqual(ioloop_mock.current(), self.WS.loop) - self.assertEqual(self.WS, - self.WS.WSApp.handlers[0][1][0].handler_class.servercomms) - @patch('malcolm.wscomms.wsservercomms.Application.listen') + @patch('malcolm.wscomms.wsservercomms.HTTPServer.listen') @patch('malcolm.wscomms.wsservercomms.IOLoop') def test_start(self, _, _2): spawn_mock = MagicMock() @@ -48,9 +44,9 @@ def test_start(self, _, _2): self.assertEqual(spawn_mock, self.WS._loop_spawned) - @patch('malcolm.wscomms.wsservercomms.Application.listen') + @patch('malcolm.wscomms.wsservercomms.HTTPServer') @patch('malcolm.wscomms.wsservercomms.IOLoop') - def test_stop(self, ioloop_mock, _): + def test_stop(self, ioloop_mock, server_mock): loop_mock = MagicMock() ioloop_mock.current.return_value = loop_mock @@ -58,12 +54,14 @@ def test_stop(self, ioloop_mock, _): self.WS._loop_spawned = MagicMock() self.WS.stop_recv_loop() - loop_mock.add_callback.assert_called_once_with(loop_mock.stop) + call_args = [call[0][0] for call in loop_mock.add_callback.call_args_list] + self.assertIn(server_mock().stop, call_args) + self.assertIn(ioloop_mock.current().stop, call_args) self.WS._loop_spawned.wait.assert_called_once_with() @patch('malcolm.wscomms.wsservercomms.Request') @patch('malcolm.wscomms.wsservercomms.json') - @patch('malcolm.wscomms.wsservercomms.Application.listen') + @patch('malcolm.wscomms.wsservercomms.HTTPServer.listen') @patch('malcolm.wscomms.wsservercomms.IOLoop') def test_MWSH_on_message(self, _, _1, json_mock, request_mock): self.WS = WSServerComms("TestWebSocket", self.p, 1) @@ -72,12 +70,12 @@ def test_MWSH_on_message(self, _, _1, json_mock, request_mock): json_mock.loads.return_value = message_dict request = MagicMock() - request.context = self.WS.WSApp.handlers[0][1][0].handler_class + request.context = self.WS.server.request_callback.handlers[0][1][0].handler_class request_mock.from_dict.return_value = request m = MagicMock() MWSH = MalcolmWebSocketHandler(m, m) - self.WS.WSApp.handlers[0][1][0].handler_class.on_message( + self.WS.server.request_callback.handlers[0][1][0].handler_class.on_message( MWSH, "TestMessage") json_mock.loads.assert_called_once_with("TestMessage", @@ -86,7 +84,7 @@ def test_MWSH_on_message(self, _, _1, json_mock, request_mock): self.p.handle_request.assert_called_once_with(request) @patch('malcolm.wscomms.wsservercomms.json') - @patch('malcolm.wscomms.wsservercomms.Application.listen') + @patch('malcolm.wscomms.wsservercomms.HTTPServer.listen') @patch('malcolm.wscomms.wsservercomms.IOLoop') def test_send_to_client(self, _, _2, json_mock): self.WS = WSServerComms("TestWebSocket", self.p, 1)