From b3410c68b8aaedb5998a4c9067bb23e7c25c59b9 Mon Sep 17 00:00:00 2001 From: meejah Date: Tue, 23 Apr 2019 17:25:17 -0600 Subject: [PATCH 1/9] try some Autobahn websocket tests --- src/allmydata/test/test_websocket_logs.py | 63 +++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/allmydata/test/test_websocket_logs.py diff --git a/src/allmydata/test/test_websocket_logs.py b/src/allmydata/test/test_websocket_logs.py new file mode 100644 index 000000000..2dab3c22d --- /dev/null +++ b/src/allmydata/test/test_websocket_logs.py @@ -0,0 +1,63 @@ +import json + +from twisted.trial import unittest +from twisted.internet.defer import inlineCallbacks, Deferred + +from eliot import log_call + +from autobahn.twisted.testing import create_memory_agent, MemoryReactorClockResolver +from autobahn.twisted.websocket import WebSocketServerProtocol +from autobahn.twisted.websocket import WebSocketClientProtocol + +from allmydata.web.logs import TokenAuthenticatedWebSocketServerProtocol +#_StreamingLogClientProtocol + +class TestStreamingLogs(unittest.TestCase): + """ + Test websocket streaming of logs + + Note: depends on un-merged Autobahn branch + """ + + def setUp(self): + self.reactor = MemoryReactorClockResolver() + self.agent = create_memory_agent(self.reactor, TokenAuthenticatedWebSocketServerProtocol) + + @inlineCallbacks + def test_one_log(self): + + class TestClient(WebSocketClientProtocol): + def onOpen(self): + print("opened") + + def onMessage(self, msg, is_binary=False): + print("msg {}".format(msg)) + + def onClose(self, *args): + print("close: {}".format(args)) + + proto = yield self.agent.open( + transport_config=u"ws://localhost:1234/ws", + options={}, + protocol_class=None, + ) + + messages = [] + def got_message(msg, is_binary=False): + messages.append(json.loads(msg)) + proto.on("message", got_message) + + + @log_call(action_type=u"test:cli:magic-folder:cleanup") + def do_a_thing(): + pass + + do_a_thing() + + proto.transport.loseConnection() + self.agent.flush() + yield proto.is_closed + + self.assertEqual(len(messages), 2) + self.assertEqual("started", messages[0]["action_status"]) + self.assertEqual("succeeded", messages[1]["action_status"]) From 811c7ea434d6cfed4cc9f806b0c88963cd83161f Mon Sep 17 00:00:00 2001 From: meejah Date: Wed, 24 Apr 2019 00:46:57 -0600 Subject: [PATCH 2/9] dead code --- src/allmydata/test/test_websocket_logs.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/allmydata/test/test_websocket_logs.py b/src/allmydata/test/test_websocket_logs.py index 2dab3c22d..17ed7406b 100644 --- a/src/allmydata/test/test_websocket_logs.py +++ b/src/allmydata/test/test_websocket_logs.py @@ -26,20 +26,9 @@ class TestStreamingLogs(unittest.TestCase): @inlineCallbacks def test_one_log(self): - class TestClient(WebSocketClientProtocol): - def onOpen(self): - print("opened") - - def onMessage(self, msg, is_binary=False): - print("msg {}".format(msg)) - - def onClose(self, *args): - print("close: {}".format(args)) - proto = yield self.agent.open( transport_config=u"ws://localhost:1234/ws", options={}, - protocol_class=None, ) messages = [] From d2ea9c515899d0104e51e062384dd8c32880a1b0 Mon Sep 17 00:00:00 2001 From: meejah Date: Wed, 24 Apr 2019 15:27:10 -0600 Subject: [PATCH 3/9] get rid of flush() calls --- src/allmydata/test/test_websocket_logs.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/allmydata/test/test_websocket_logs.py b/src/allmydata/test/test_websocket_logs.py index 17ed7406b..20d7e8029 100644 --- a/src/allmydata/test/test_websocket_logs.py +++ b/src/allmydata/test/test_websocket_logs.py @@ -5,7 +5,7 @@ from twisted.internet.defer import inlineCallbacks, Deferred from eliot import log_call -from autobahn.twisted.testing import create_memory_agent, MemoryReactorClockResolver +from autobahn.twisted.testing import create_memory_agent, MemoryReactorClockResolver, create_pumper from autobahn.twisted.websocket import WebSocketServerProtocol from autobahn.twisted.websocket import WebSocketClientProtocol @@ -21,7 +21,12 @@ class TestStreamingLogs(unittest.TestCase): def setUp(self): self.reactor = MemoryReactorClockResolver() - self.agent = create_memory_agent(self.reactor, TokenAuthenticatedWebSocketServerProtocol) + self.pumper = create_pumper() + self.agent = create_memory_agent(self.reactor, self.pumper, TokenAuthenticatedWebSocketServerProtocol) + return self.pumper.start() + + def tearDown(self): + return self.pumper.stop() @inlineCallbacks def test_one_log(self): @@ -44,7 +49,6 @@ class TestStreamingLogs(unittest.TestCase): do_a_thing() proto.transport.loseConnection() - self.agent.flush() yield proto.is_closed self.assertEqual(len(messages), 2) From 8938d556d973b1ec197c0d07be3a20b9aa921b3a Mon Sep 17 00:00:00 2001 From: meejah Date: Fri, 26 Apr 2019 18:18:31 -0600 Subject: [PATCH 4/9] whitespace --- src/allmydata/test/test_websocket_logs.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/allmydata/test/test_websocket_logs.py b/src/allmydata/test/test_websocket_logs.py index 20d7e8029..1eb0274b4 100644 --- a/src/allmydata/test/test_websocket_logs.py +++ b/src/allmydata/test/test_websocket_logs.py @@ -41,7 +41,6 @@ class TestStreamingLogs(unittest.TestCase): messages.append(json.loads(msg)) proto.on("message", got_message) - @log_call(action_type=u"test:cli:magic-folder:cleanup") def do_a_thing(): pass From 04e72e208b72ee17f01133f2fa7b60c089dfaddf Mon Sep 17 00:00:00 2001 From: meejah Date: Tue, 7 May 2019 13:39:50 -0600 Subject: [PATCH 5/9] cleanup --- src/allmydata/test/test_websocket_logs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/allmydata/test/test_websocket_logs.py b/src/allmydata/test/test_websocket_logs.py index 1eb0274b4..94dba2e22 100644 --- a/src/allmydata/test/test_websocket_logs.py +++ b/src/allmydata/test/test_websocket_logs.py @@ -10,7 +10,7 @@ from autobahn.twisted.websocket import WebSocketServerProtocol from autobahn.twisted.websocket import WebSocketClientProtocol from allmydata.web.logs import TokenAuthenticatedWebSocketServerProtocol -#_StreamingLogClientProtocol + class TestStreamingLogs(unittest.TestCase): """ From 3543d9f6b47dd500ae2d1c500a5f473d2c94d246 Mon Sep 17 00:00:00 2001 From: meejah Date: Tue, 7 May 2019 13:45:48 -0600 Subject: [PATCH 6/9] newsfragment --- newsfragments/3041.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 newsfragments/3041.feature diff --git a/newsfragments/3041.feature b/newsfragments/3041.feature new file mode 100644 index 000000000..b78695126 --- /dev/null +++ b/newsfragments/3041.feature @@ -0,0 +1 @@ +End-to-end in-memory tests for websocket features \ No newline at end of file From f262e5d6842beaef2dd60c8fe7cfa04f2f05f861 Mon Sep 17 00:00:00 2001 From: meejah Date: Tue, 7 May 2019 13:46:56 -0600 Subject: [PATCH 7/9] unused imports --- src/allmydata/test/test_websocket_logs.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/allmydata/test/test_websocket_logs.py b/src/allmydata/test/test_websocket_logs.py index 94dba2e22..26ad13f72 100644 --- a/src/allmydata/test/test_websocket_logs.py +++ b/src/allmydata/test/test_websocket_logs.py @@ -1,13 +1,11 @@ import json from twisted.trial import unittest -from twisted.internet.defer import inlineCallbacks, Deferred +from twisted.internet.defer import inlineCallbacks from eliot import log_call from autobahn.twisted.testing import create_memory_agent, MemoryReactorClockResolver, create_pumper -from autobahn.twisted.websocket import WebSocketServerProtocol -from autobahn.twisted.websocket import WebSocketClientProtocol from allmydata.web.logs import TokenAuthenticatedWebSocketServerProtocol From 0cb1ba8634e463f3f1e4d111aac69bbee9004f67 Mon Sep 17 00:00:00 2001 From: meejah Date: Fri, 31 May 2019 00:08:35 -0600 Subject: [PATCH 8/9] autobahn dependency --- src/allmydata/_auto_deps.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/allmydata/_auto_deps.py b/src/allmydata/_auto_deps.py index 38b98e59c..415eb02bd 100644 --- a/src/allmydata/_auto_deps.py +++ b/src/allmydata/_auto_deps.py @@ -107,6 +107,9 @@ install_requires = [ # A great way to define types of values. "attrs >= 18.2.0", + + # WebSocket library for twisted and asyncio + "autobahn >= 19.5.2", ] # Includes some indirect dependencies, but does not include allmydata. From 7e38198c19d5e42547981e26aa05691cdbf7ff1d Mon Sep 17 00:00:00 2001 From: meejah Date: Tue, 18 Jun 2019 16:04:05 -0600 Subject: [PATCH 9/9] fix docstrings --- src/allmydata/test/test_websocket_logs.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/allmydata/test/test_websocket_logs.py b/src/allmydata/test/test_websocket_logs.py index 26ad13f72..983613a28 100644 --- a/src/allmydata/test/test_websocket_logs.py +++ b/src/allmydata/test/test_websocket_logs.py @@ -13,8 +13,6 @@ from allmydata.web.logs import TokenAuthenticatedWebSocketServerProtocol class TestStreamingLogs(unittest.TestCase): """ Test websocket streaming of logs - - Note: depends on un-merged Autobahn branch """ def setUp(self): @@ -28,6 +26,9 @@ class TestStreamingLogs(unittest.TestCase): @inlineCallbacks def test_one_log(self): + """ + write a single Eliot log and see it streamed via websocket + """ proto = yield self.agent.open( transport_config=u"ws://localhost:1234/ws",