diff --git a/kilter/service/session.py b/kilter/service/session.py index d296d14aa522374c76c669aa7334e30e6c42dde0..6fd4ecd6ee04c6619f33d065f8707842f4da375c 100644 --- a/kilter/service/session.py +++ b/kilter/service/session.py @@ -310,6 +310,7 @@ class Session: match message: case Unknown(): if message.content[:len(bname)] == bname: + assert isinstance(message.content, memoryview) return message.content # fake buffers for MAIL and RCPT commands case EnvelopeFrom() if name == "MAIL": @@ -528,12 +529,14 @@ class BodyAccessor(AsyncContextManager[AsyncIterator[memoryview]]): match (await self.session.broadcast.receive()): case Body() as body: try: + assert isinstance(body.content, memoryview) yield body.content except GeneratorExit: self.skip = True raise case EndOfMessage() as eom: if not self.skip: + assert isinstance(eom.content, memoryview) yield eom.content async def write(self, chunk: bytes) -> None: diff --git a/tests/test_body_accessor.py b/tests/test_body_accessor.py index c82d925c918358aff42211fc17a9d4e802c83a7d..30cfcd89dcd75bc55dd5ae14dd991a233c8a6ead 100644 --- a/tests/test_body_accessor.py +++ b/tests/test_body_accessor.py @@ -1,3 +1,4 @@ +from builtins import memoryview as mv from ipaddress import IPv4Address from pathlib import Path @@ -36,9 +37,9 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Body(b"Spam, ")) - await session.deliver(Body(b"spam, ")) - await session.deliver(EndOfMessage(b"and eggs")) + await session.deliver(Body(mv(b"Spam, "))) + await session.deliver(Body(mv(b"spam, "))) + await session.deliver(EndOfMessage(mv(b"and eggs"))) assert result == b"Spam, spam, and eggs" @@ -68,10 +69,10 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - assert Continue == await session.deliver(Body(b"Spam, ")) - assert Skip == await session.deliver(Body(b"spam, ")) - assert Skip == await session.deliver(Body(b"spam, ")) - assert Continue == await session.deliver(EndOfMessage(b"and eggs")) + assert Continue == await session.deliver(Body(mv(b"Spam, "))) + assert Skip == await session.deliver(Body(mv(b"spam, "))) + assert Skip == await session.deliver(Body(mv(b"spam, "))) + assert Continue == await session.deliver(EndOfMessage(mv(b"and eggs"))) assert result1 == b"Spam, " assert result2 == b"" diff --git a/tests/test_header_accessor.py b/tests/test_header_accessor.py index 00034642c30372b1fc8814f0f45bd35151d92416..902f59f81dbb7319c0acfe23d1db75a54df84f4a 100644 --- a/tests/test_header_accessor.py +++ b/tests/test_header_accessor.py @@ -1,3 +1,4 @@ +from builtins import memoryview as mv from ipaddress import IPv4Address from unittest.mock import call @@ -35,13 +36,13 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Spam", b"spam?")) - await session.deliver(Header("Eggs", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Spam", mv(b"spam?"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) await session.deliver(EndOfHeaders()) # try and throw the iterator off! - await session.deliver(Header("Dead-Parrot", b"and spam")) + await session.deliver(Header("Dead-Parrot", mv(b"and spam"))) assert result == ["Spam", "Spam", "Eggs"] @@ -70,15 +71,15 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Spam", b"spam?")) - await session.deliver(Header("Eggs", b"and spam")) - await session.deliver(Header("Spam", b"spam spam spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Spam", mv(b"spam?"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) await session.deliver(EndOfHeaders()) # Try and throw the iterator off! The filter should not await any further # messages after the EndOfHeaders one. - await session.deliver(Header("Dead-Parrot", b"and spam")) + await session.deliver(Header("Dead-Parrot", mv(b"and spam"))) assert result1 == ["Spam", "Spam", "Eggs"] assert result2 == ["Spam", "Spam", "Eggs", "Spam"] @@ -102,9 +103,9 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Spam", b"spam?")) - await session.deliver(Header("Eggs", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Spam", mv(b"spam?"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) await session.deliver(EndOfHeaders()) assert result == ["Spam", "Spam", "Eggs"] @@ -128,9 +129,9 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Spam", b"spam?")) - await session.deliver(Header("Eggs", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Spam", mv(b"spam?"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) await session.deliver(Body(b"")) assert result == ["Spam", "Spam", "Eggs"] @@ -151,10 +152,10 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Spam", b"spam?")) - await session.deliver(Header("Eggs", b"and spam")) - await session.deliver(Header("Ham", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Spam", mv(b"spam?"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) + await session.deliver(Header("Ham", mv(b"and spam"))) await session.deliver(EndOfHeaders()) assert result == ["Spam", "Spam", "Ham"], result @@ -178,10 +179,10 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Spam", b"spam?")) - await session.deliver(Header("Eggs", b"and spam")) - await session.deliver(Header("Ham", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Spam", mv(b"spam?"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) + await session.deliver(Header("Ham", mv(b"and spam"))) await session.deliver(EndOfHeaders()) await session.deliver(EndOfMessage(b"")) @@ -210,10 +211,10 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Spam", b"spam?")) - await session.deliver(Header("Eggs", b"and spam")) - await session.deliver(Header("Ham", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Spam", mv(b"spam?"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) + await session.deliver(Header("Ham", mv(b"and spam"))) await session.deliver(EndOfHeaders()) await session.deliver(EndOfMessage(b"")) @@ -243,8 +244,8 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Eggs", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) await session.deliver(EndOfHeaders()) await session.deliver(EndOfMessage(b"")) @@ -273,8 +274,8 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Eggs", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) await session.deliver(EndOfHeaders()) await session.deliver(EndOfMessage(b"")) @@ -306,8 +307,8 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Eggs", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) await session.deliver(EndOfHeaders()) await session.deliver(EndOfMessage(b"")) @@ -339,8 +340,8 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Eggs", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) await session.deliver(EndOfHeaders()) await session.deliver(EndOfMessage(b"")) @@ -372,8 +373,8 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Eggs", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) await session.deliver(EndOfHeaders()) await session.deliver(EndOfMessage(b"")) @@ -409,8 +410,8 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"spam spam spam")) - await session.deliver(Header("Eggs", b"and spam")) + await session.deliver(Header("Spam", mv(b"spam spam spam"))) + await session.deliver(Header("Eggs", mv(b"and spam"))) await session.deliver(EndOfHeaders()) await session.deliver(EndOfMessage(b"")) @@ -440,8 +441,8 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("From", b"test@example.com")) - await session.deliver(Header("To", b"test@example.com")) + await session.deliver(Header("From", mv(b"test@example.com"))) + await session.deliver(Header("To", mv(b"test@example.com"))) await session.deliver(EndOfHeaders()) async def test_athrow_type(self) -> None: @@ -462,8 +463,8 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("From", b"test@example.com")) - await session.deliver(Header("To", b"test@example.com")) + await session.deliver(Header("From", mv(b"test@example.com"))) + await session.deliver(Header("To", mv(b"test@example.com"))) await session.deliver(EndOfHeaders()) async def test_athrow_type_msg(self) -> None: @@ -485,8 +486,8 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("From", b"test@example.com")) - await session.deliver(Header("To", b"test@example.com")) + await session.deliver(Header("From", mv(b"test@example.com"))) + await session.deliver(Header("To", mv(b"test@example.com"))) await session.deliver(EndOfHeaders()) async def test_athrow_inst(self) -> None: @@ -508,6 +509,6 @@ class HeaderAccessorTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("From", b"test@example.com")) - await session.deliver(Header("To", b"test@example.com")) + await session.deliver(Header("From", mv(b"test@example.com"))) + await session.deliver(Header("To", mv(b"test@example.com"))) await session.deliver(EndOfHeaders()) diff --git a/tests/test_session.py b/tests/test_session.py index 6515ea3a7cf2c5730b63ce07780a53b81e46f622..6503a126152f8e83f01ab69896786223baa33358 100644 --- a/tests/test_session.py +++ b/tests/test_session.py @@ -1,3 +1,4 @@ +from builtins import memoryview as mv from ipaddress import IPv4Address from unittest.mock import call @@ -30,7 +31,7 @@ class SessionTests(AsyncTestCase): await session.deliver(Helo("example.com")) self.assertEqual(session.phase, Phase.MAIL) - await session.deliver(EnvelopeFrom(b"test@example.com")) + await session.deliver(EnvelopeFrom(mv(b"test@example.com"))) self.assertEqual(session.phase, Phase.ENVELOPE) await session.deliver(Data()) @@ -49,10 +50,10 @@ class SessionTests(AsyncTestCase): session = Session(Connect("example.com", LOCALHOST, 1025), MockEditor()) self.assertEqual(session.phase, Phase.CONNECT) - await session.deliver(EnvelopeRecipient(b"test@example.com", [])) + await session.deliver(EnvelopeRecipient(mv(b"test@example.com"), [])) self.assertEqual(session.phase, Phase.ENVELOPE) - await session.deliver(Header("To", b"test@example.com")) + await session.deliver(Header("To", mv(b"test@example.com"))) self.assertEqual(session.phase, Phase.HEADERS) await session.deliver(EndOfHeaders()) @@ -75,7 +76,7 @@ class SessionTests(AsyncTestCase): await trio.testing.wait_all_tasks_blocked() await session.deliver(Helo("ham")) assert result == "spam" - await session.deliver(EnvelopeFrom(b"eggs")) + await session.deliver(EnvelopeFrom(mv(b"eggs"))) assert result == "eggs" @@ -115,7 +116,7 @@ class SessionTests(AsyncTestCase): tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() await session.deliver(Helo("ham")) - await session.deliver(EnvelopeFrom(b"eggs")) + await session.deliver(EnvelopeFrom(mv(b"eggs"))) async def test_await_helo_missing(self) -> None: """ @@ -132,7 +133,7 @@ class SessionTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(EnvelopeFrom(b"eggs")) + await session.deliver(EnvelopeFrom(mv(b"eggs"))) async def test_await_mail(self) -> None: """ @@ -149,7 +150,7 @@ class SessionTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(EnvelopeFrom(b"eggs")) + await session.deliver(EnvelopeFrom(mv(b"eggs"))) assert result == "eggs" @@ -169,7 +170,7 @@ class SessionTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"eggs")) + await session.deliver(Header("Spam", mv(b"eggs"))) await session.deliver(EndOfHeaders()) async def test_await_from_missing(self) -> None: @@ -204,9 +205,9 @@ class SessionTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(EnvelopeRecipient(b"spam", [])) - await session.deliver(EnvelopeRecipient(b"spam", [])) - await session.deliver(EnvelopeRecipient(b"eggs", [])) + await session.deliver(EnvelopeRecipient(mv(b"spam"), [])) + await session.deliver(EnvelopeRecipient(mv(b"spam"), [])) + await session.deliver(EnvelopeRecipient(mv(b"eggs"), [])) await session.deliver(Data()) assert result == ["spam", "spam", "eggs"] @@ -228,7 +229,7 @@ class SessionTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"eggs")) + await session.deliver(Header("Spam", mv(b"eggs"))) await session.deliver(EndOfHeaders()) async def test_await_extension(self) -> None: @@ -248,11 +249,11 @@ class SessionTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Unknown(b"SPAM spam eggs")) - await session.deliver(EnvelopeFrom(b"spam", [b"spam", b"eggs"])) - await session.deliver(Unknown(b"HAM green eggs")) - await session.deliver(EnvelopeRecipient(b"spam", [b"spam", b"eggs"])) - await session.deliver(EnvelopeRecipient(b"spam", [])) + await session.deliver(Unknown(mv(b"SPAM spam eggs"))) + await session.deliver(EnvelopeFrom(mv(b"spam"), [mv(b"spam"), mv(b"eggs")])) + await session.deliver(Unknown(mv(b"HAM green eggs"))) + await session.deliver(EnvelopeRecipient(mv(b"spam"), [mv(b"spam"), mv(b"eggs")])) + await session.deliver(EnvelopeRecipient(mv(b"spam"), [])) await session.deliver(Data()) assert result == [ @@ -278,7 +279,7 @@ class SessionTests(AsyncTestCase): async with trio.open_nursery() as tg: tg.start_soon(test_filter) await trio.testing.wait_all_tasks_blocked() - await session.deliver(Header("Spam", b"eggs")) + await session.deliver(Header("Spam", mv(b"eggs"))) await session.deliver(EndOfHeaders()) async def test_await_extension_missing(self) -> None: @@ -390,7 +391,7 @@ class SessionTests(AsyncTestCase): await session.deliver(Macro(Helo.ident, {"{spam}": "yes", "{eggs}": "yes"})) await session.deliver(Helo("test.example.com")) await session.deliver(Macro(Helo.ident, {"{spam}": "no", "{ham}": "maybe"})) - await session.deliver(EnvelopeFrom(b"test@example.com")) + await session.deliver(EnvelopeFrom(mv(b"test@example.com"))) async def test_delay(self) -> None: """ @@ -410,7 +411,7 @@ class SessionTests(AsyncTestCase): await trio.testing.wait_all_tasks_blocked() await session.deliver(Helo("test.example.com")) - await session.deliver(EnvelopeFrom(b"test@example.com")) + await session.deliver(EnvelopeFrom(mv(b"test@example.com"))) async def test_abort_in_helo(self) -> None: """