From 24c5818816597de344a983089fc2f8f98dc69b75 Mon Sep 17 00:00:00 2001 From: Will Rieger Date: Mon, 6 May 2024 12:09:36 -0400 Subject: [PATCH] fix @217 | add tests Signed-off-by: Will Rieger --- .../adapters/websocket/ClientInputAdapter.cpp | 2 +- .../adapters/websocket/ClientInputAdapter.h | 2 - .../adapters/websocket/ClientOutputAdapter.h | 1 - csp/tests/adapters/test_websocket.py | 83 +++++++++++++++++++ 4 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 csp/tests/adapters/test_websocket.py diff --git a/cpp/csp/adapters/websocket/ClientInputAdapter.cpp b/cpp/csp/adapters/websocket/ClientInputAdapter.cpp index 91fe230c..ad1db9af 100644 --- a/cpp/csp/adapters/websocket/ClientInputAdapter.cpp +++ b/cpp/csp/adapters/websocket/ClientInputAdapter.cpp @@ -30,7 +30,7 @@ void ClientInputAdapter::processMessage( std::string payload, PushBatch* batch ) if( type() -> type() == CspType::Type::STRUCT ) { - auto tick = m_converter -> asStruct( &payload, payload.length() ); + auto tick = m_converter -> asStruct( (void*)payload.data(), payload.length() ); pushTick( std::move(tick), batch ); } else if ( type() -> type() == CspType::Type::STRING ) { diff --git a/cpp/csp/adapters/websocket/ClientInputAdapter.h b/cpp/csp/adapters/websocket/ClientInputAdapter.h index 93711bbf..93ae2614 100644 --- a/cpp/csp/adapters/websocket/ClientInputAdapter.h +++ b/cpp/csp/adapters/websocket/ClientInputAdapter.h @@ -1,8 +1,6 @@ #ifndef _IN_CSP_ADAPTERS_WEBSOCKETS_CLIENT_INPUTADAPTER_H #define _IN_CSP_ADAPTERS_WEBSOCKETS_CLIENT_INPUTADAPTER_H -#include -#include #include #include #include diff --git a/cpp/csp/adapters/websocket/ClientOutputAdapter.h b/cpp/csp/adapters/websocket/ClientOutputAdapter.h index 64726837..865831c8 100644 --- a/cpp/csp/adapters/websocket/ClientOutputAdapter.h +++ b/cpp/csp/adapters/websocket/ClientOutputAdapter.h @@ -5,7 +5,6 @@ #include #include #include -#include namespace csp::adapters::websocket { diff --git a/csp/tests/adapters/test_websocket.py b/csp/tests/adapters/test_websocket.py new file mode 100644 index 00000000..401133d2 --- /dev/null +++ b/csp/tests/adapters/test_websocket.py @@ -0,0 +1,83 @@ +import os +import pytz +import threading +import unittest +from datetime import datetime + +import csp +from csp import ts + +if os.environ.get("CSP_TEST_WEBSOCKET"): + import tornado.ioloop + import tornado.web + import tornado.websocket + + from csp.adapters.websocket import JSONTextMessageMapper, RawTextMessageMapper, Status, WebsocketAdapterManager + + class EchoWebsocketHandler(tornado.websocket.WebSocketHandler): + def on_message(self, msg): + return self.write_message(msg) + + +@unittest.skipIf(not os.environ.get("CSP_TEST_WEBSOCKET"), "Skipping websocket adapter tests") +class TestWebsocket(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.app = tornado.web.Application([(r"/ws", EchoWebsocketHandler)]) + cls.app.listen(8000) + cls.io_loop = tornado.ioloop.IOLoop.current() + cls.io_thread = threading.Thread(target=cls.io_loop.start) + cls.io_thread.start() + + @classmethod + def tearDownClass(cls): + cls.io_loop.add_callback(cls.io_loop.stop) + if cls.io_thread: + cls.io_thread.join() + + def test_send_recv_msg(self): + @csp.node + def send_msg_on_open(status: ts[Status]) -> ts[str]: + if csp.ticked(status): + return "Hello, World!" + + @csp.graph + def g(): + ws = WebsocketAdapterManager("ws://localhost:8000/ws") + status = ws.status() + ws.send(send_msg_on_open(status)) + recv = ws.subscribe(str, RawTextMessageMapper()) + + csp.add_graph_output("recv", recv) + csp.stop_engine(recv) + + msgs = csp.run(g, starttime=datetime.now(pytz.UTC), realtime=True) + assert len(msgs) == 1 + assert msgs["recv"][0][1] == "Hello, World!" + + def test_send_recv_json(self): + class MsgStruct(csp.Struct): + a: int + b: str + + @csp.node + def send_msg_on_open(status: ts[Status]) -> ts[str]: + if csp.ticked(status): + return MsgStruct(a=1234, b="im a string").to_json() + + @csp.graph + def g(): + ws = WebsocketAdapterManager("ws://localhost:8000/ws") + status = ws.status() + ws.send(send_msg_on_open(status)) + recv = ws.subscribe(MsgStruct, JSONTextMessageMapper()) + + csp.add_graph_output("recv", recv) + csp.stop_engine(recv) + + msgs = csp.run(g, starttime=datetime.now(pytz.UTC), realtime=True) + assert len(msgs) == 1 + obj = msgs["recv"][0][1] + assert isinstance(obj, MsgStruct) + assert obj.a == 1234 + assert obj.b == "im a string"