summaryrefslogtreecommitdiffstats
path: root/nixos/tests/matrix/tuwunel.nix
blob: b3d4e0105cf58c766e5cad7e48d5d67cb9ebc9fe (plain)
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
  ];
}