@@ -85,61 +85,100 @@ import ./make-test-python.nix ({ pkgs, ... }:
8585 client = { pkgs, ... }: {
8686 environment.systemPackages = [
8787 (pkgs.writers.writePython3Bin "do_test"
88− { libraries = [ pkgs.python3Packages.matrix-nio ]; } ''
89− import socket
90− from nio import AsyncClient, RoomMessageText
91− from time import sleep
92− import asyncio
93−
94−
95− async def run():
96− matrix = AsyncClient("${homeserverUrl}")
97− await matrix.register("alice", "foobar")
98−
99− irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
100− irc.connect(("ircd", 6667))
101− irc.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
102− irc.send(b"USER bob bob bob :bob\n")
103− irc.send(b"NICK bob\n")
104−
105− room_id = (await matrix.join("#irc_#test:homeserver")).room_id
106− irc.send(b"JOIN #test\n")
107−
108− # plenty of time for the joins to happen
109− sleep(10)
110−
111− # Exchange messages
112− await matrix.room_send(
113− room_id=room_id,
114− message_type="m.room.message",
115− content={
116− "msgtype": "m.text",
117− "body": "hi from matrix"
118− }
119− )
120− irc.send(b"PRIVMSG #test :hi from irc \r\n")
121−
122− print("Waiting for irc message...")
123− while True:
124− buf = irc.recv(10000)
125− if b"hi from matrix" in buf:
126− print("Got IRC message")
127− break
128−
129− print("Waiting for matrix message...")
130−
131− async def callback(room, e):
132− if "hi from irc" in e.body:
133− print("Got Matrix message")
134− await matrix.close()
135− exit(0) # Actual exit point
136−
137− matrix.add_event_callback(callback, RoomMessageText)
138− await matrix.sync_forever()
139− exit(1) # Unreachable
140−
141− asyncio.run(run())
142− ''
88+ {
89+ libraries = [ pkgs.python3Packages.matrix-nio ];
90+ flakeIgnore = [
91+ # We don't live in the dark ages anymore.
92+ # Languages like Python that are whitespace heavy will overrun
93+ # 79 characters..
94+ "E501"
95+ ];
96+ } ''
97+ import sys
98+ import socket
99+ import functools
100+ from time import sleep
101+ import asyncio
102+
103+ from nio import AsyncClient, RoomMessageText, JoinResponse
104+
105+
106+ async def matrix_room_message_text_callback(matrix: AsyncClient, msg: str, _r, e):
107+ print("Received matrix text message: ", e)
108+ if msg in e.body:
109+ print("Received hi from IRC")
110+ await matrix.close()
111+ exit(0) # Actual exit point
112+
113+
114+ class IRC:
115+ def __init__(self):
116+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
117+ sock.connect(("ircd", 6667))
118+ sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
119+ sock.send(b"USER bob bob bob :bob\n")
120+ sock.send(b"NICK bob\n")
121+ self.sock = sock
122+
123+ def join(self, room: str):
124+ self.sock.send(f"JOIN {room}\n".encode())
125+
126+ def privmsg(self, room: str, msg: str):
127+ self.sock.send(f"PRIVMSG {room} :{msg}\n".encode())
128+
129+ def expect_msg(self, body: str):
130+ buffer = ""
131+ while True:
132+ buf = self.sock.recv(1024).decode()
133+ buffer += buf
134+ if body in buffer:
135+ return
136+
137+
138+ async def run(homeserver: str):
139+ irc = IRC()
140+
141+ matrix = AsyncClient(homeserver)
142+ response = await matrix.register("alice", "foobar")
143+ print("Matrix register response: ", response)
144+
145+ response = await matrix.join("#irc_#test:homeserver")
146+ print("Matrix join room response:", response)
147+ assert isinstance(response, JoinResponse)
148+ room_id = response.room_id
149+
150+ irc.join("#test")
151+ # FIXME: what are we waiting on here? Matrix? IRC? Both?
152+ # 10s seem bad for busy hydra machines.
153+ sleep(10)
154+
155+ # Exchange messages
156+ print("Sending text message to matrix room")
157+ response = await matrix.room_send(
158+ room_id=room_id,
159+ message_type="m.room.message",
160+ content={"msgtype": "m.text", "body": "hi from matrix"},
161+ )
162+ print("Matrix room send response: ", response)
163+ irc.privmsg("#test", "hi from irc")
164+
165+ print("Waiting for the matrix message to appear on the IRC side...")
166+ irc.expect_msg("hi from matrix")
167+
168+ callback = functools.partial(
169+ matrix_room_message_text_callback, matrix, "hi from irc"
170+ )
171+ matrix.add_event_callback(callback, RoomMessageText)
172+
173+ print("Waiting for matrix message...")
174+ await matrix.sync_forever()
175+
176+ exit(1) # Unreachable
177+
178+
179+ if __name__ == "__main__":
180+ asyncio.run(run(sys.argv[1]))
181+ ''
143182 )
144183 ];
145184 };
@@ -173,6 +212,6 @@ import ./make-test-python.nix ({ pkgs, ... }:
173212 homeserver.wait_for_open_port(8448)
174213
175214 with subtest("ensure messages can be exchanged"):
176− client.succeed("do_test >&2")
215+ client.succeed("do_test ${homeserverUrl} >&2")
177216 '';
178217 })