1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
{ lib, pkgs, ... }:
let
name = "tuwunel";
in
{
inherit name;
nodes = {
# Host1 is a fresh install of tuwunel
host1 = {
services.matrix-tuwunel = {
enable = true;
settings.global = {
server_name = name;
address = [ "0.0.0.0" ];
allow_registration = true;
yes_i_am_very_very_sure_i_want_an_open_registration_server_prone_to_abuse = true;
};
extraEnvironment.RUST_BACKTRACE = "yes";
};
networking.firewall.allowedTCPPorts = [ 6167 ];
};
# Host2 was upgraded from the matrix-conduit service
host2 = {
users.users.conduit = {
group = "conduit";
home = "/var/lib/matrix-conduit";
isSystemUser = true;
};
users.groups.conduit = { };
services.matrix-tuwunel = {
enable = true;
user = "conduit";
group = "conduit";
stateDirectory = "matrix-conduit";
settings.global = {
server_name = name;
address = [ "0.0.0.0" ];
allow_registration = true;
yes_i_am_very_very_sure_i_want_an_open_registration_server_prone_to_abuse = true;
};
extraEnvironment.RUST_BACKTRACE = "yes";
};
networking.firewall.allowedTCPPorts = [ 6167 ];
};
client =
{ pkgs, ... }:
{
environment.systemPackages = [
(pkgs.writers.writePython3Bin "do_test" { libraries = [ pkgs.python3Packages.matrix-nio ]; } ''
import asyncio
import nio
import sys
async def main(host) -> None:
# Connect to server
client = nio.AsyncClient(f"http://{host}:6167", "alice")
# Register as user alice
response = await client.register("alice", "my-secret-password")
# Log in as user alice
response = await client.login("my-secret-password")
# Create a new room
response = await client.room_create(federate=False)
print("Matrix room create response:", response)
assert isinstance(response, nio.RoomCreateResponse)
room_id = response.room_id
# Join the room
response = await client.join(room_id)
print("Matrix join response:", response)
assert isinstance(response, nio.JoinResponse)
# Send a message to the room
response = await client.room_send(
room_id=room_id,
message_type="m.room.message",
content={
"msgtype": "m.text",
"body": "Hello matrix!"
}
)
print("Matrix room send response:", response)
assert isinstance(response, nio.RoomSendResponse)
# Sync responses
response = await client.sync(timeout=30000)
print("Matrix sync response:", response)
assert isinstance(response, nio.SyncResponse)
# Check the message was received by server
last_message = response.rooms.join[room_id].timeline.events[-1].body
assert last_message == "Hello matrix!"
# Leave the room
response = await client.room_leave(room_id)
print("Matrix room leave response:", response)
assert isinstance(response, nio.RoomLeaveResponse)
# Close the client
await client.close()
if __name__ == "__main__":
asyncio.run(main(sys.argv[1]))
'')
];
};
};
testScript = ''
start_all()
with subtest("start tuwunel on host1"):
host1.wait_for_unit("tuwunel.service")
host1.wait_for_open_port(6167)
with subtest("start tuwunel on host2"):
host1.wait_for_unit("tuwunel.service")
host1.wait_for_open_port(6167)
with subtest("ensure messages can be sent to servers"):
client.succeed("do_test host1 >&2")
client.succeed("do_test host2 >&2")
'';
meta.maintainers = with lib.maintainers; [
scvalex
];
}
|