163 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
		
		
			
		
	
	
			163 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| 
								 | 
							
								import ./make-test-python.nix ({ pkgs, ... }:
							 | 
						||
| 
								 | 
							
								  let
							 | 
						||
| 
								 | 
							
								    homeserverUrl = "http://homeserver:8448";
							 | 
						||
| 
								 | 
							
								  in
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    name = "matrix-appservice-irc";
							 | 
						||
| 
								 | 
							
								    meta = {
							 | 
						||
| 
								 | 
							
								      maintainers = pkgs.matrix-appservice-irc.meta.maintainers;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    nodes = {
							 | 
						||
| 
								 | 
							
								      homeserver = { pkgs, ... }: {
							 | 
						||
| 
								 | 
							
								        # We'll switch to this once the config is copied into place
							 | 
						||
| 
								 | 
							
								        specialisation.running.configuration = {
							 | 
						||
| 
								 | 
							
								          services.matrix-synapse = {
							 | 
						||
| 
								 | 
							
								            enable = true;
							 | 
						||
| 
								 | 
							
								            database_type = "sqlite3";
							 | 
						||
| 
								 | 
							
								            app_service_config_files = [ "/registration.yml" ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            enable_registration = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            listeners = [
							 | 
						||
| 
								 | 
							
								              # The default but tls=false
							 | 
						||
| 
								 | 
							
								              {
							 | 
						||
| 
								 | 
							
								                "bind_address" = "";
							 | 
						||
| 
								 | 
							
								                "port" = 8448;
							 | 
						||
| 
								 | 
							
								                "resources" = [
							 | 
						||
| 
								 | 
							
								                  { "compress" = true; "names" = [ "client" "webclient" ]; }
							 | 
						||
| 
								 | 
							
								                  { "compress" = false; "names" = [ "federation" ]; }
							 | 
						||
| 
								 | 
							
								                ];
							 | 
						||
| 
								 | 
							
								                "tls" = false;
							 | 
						||
| 
								 | 
							
								                "type" = "http";
							 | 
						||
| 
								 | 
							
								                "x_forwarded" = false;
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								            ];
							 | 
						||
| 
								 | 
							
								          };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          networking.firewall.allowedTCPPorts = [ 8448 ];
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      ircd = { pkgs, ... }: {
							 | 
						||
| 
								 | 
							
								        services.ngircd = {
							 | 
						||
| 
								 | 
							
								          enable = true;
							 | 
						||
| 
								 | 
							
								          config = ''
							 | 
						||
| 
								 | 
							
								            [Global]
							 | 
						||
| 
								 | 
							
								              Name = ircd.ircd
							 | 
						||
| 
								 | 
							
								              Info = Server Info Text
							 | 
						||
| 
								 | 
							
								              AdminInfo1 = _
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            [Channel]
							 | 
						||
| 
								 | 
							
								              Name = #test
							 | 
						||
| 
								 | 
							
								              Topic = a cool place
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            [Options]
							 | 
						||
| 
								 | 
							
								              PAM = no
							 | 
						||
| 
								 | 
							
								          '';
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								        networking.firewall.allowedTCPPorts = [ 6667 ];
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      appservice = { pkgs, ... }: {
							 | 
						||
| 
								 | 
							
								        services.matrix-appservice-irc = {
							 | 
						||
| 
								 | 
							
								          enable = true;
							 | 
						||
| 
								 | 
							
								          registrationUrl = "http://appservice:8009";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          settings = {
							 | 
						||
| 
								 | 
							
								            homeserver.url = homeserverUrl;
							 | 
						||
| 
								 | 
							
								            homeserver.domain = "homeserver";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            ircService.servers."ircd" = {
							 | 
						||
| 
								 | 
							
								              name = "IRCd";
							 | 
						||
| 
								 | 
							
								              port = 6667;
							 | 
						||
| 
								 | 
							
								              dynamicChannels = {
							 | 
						||
| 
								 | 
							
								                enabled = true;
							 | 
						||
| 
								 | 
							
								                aliasTemplate = "#irc_$CHANNEL";
							 | 
						||
| 
								 | 
							
								              };
							 | 
						||
| 
								 | 
							
								            };
							 | 
						||
| 
								 | 
							
								          };
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        networking.firewall.allowedTCPPorts = [ 8009 ];
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      client = { pkgs, ... }: {
							 | 
						||
| 
								 | 
							
								        environment.systemPackages = [
							 | 
						||
| 
								 | 
							
								          (pkgs.writers.writePython3Bin "do_test"
							 | 
						||
| 
								 | 
							
								            { libraries = [ pkgs.python3Packages.matrix-client ]; } ''
							 | 
						||
| 
								 | 
							
								            import socket
							 | 
						||
| 
								 | 
							
								            from matrix_client.client import MatrixClient
							 | 
						||
| 
								 | 
							
								            from time import sleep
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            matrix = MatrixClient("${homeserverUrl}")
							 | 
						||
| 
								 | 
							
								            matrix.register_with_password(username="alice", password="foobar")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
							 | 
						||
| 
								 | 
							
								            irc.connect(("ircd", 6667))
							 | 
						||
| 
								 | 
							
								            irc.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
							 | 
						||
| 
								 | 
							
								            irc.send(b"USER bob bob bob :bob\n")
							 | 
						||
| 
								 | 
							
								            irc.send(b"NICK bob\n")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            m_room = matrix.join_room("#irc_#test:homeserver")
							 | 
						||
| 
								 | 
							
								            irc.send(b"JOIN #test\n")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            # plenty of time for the joins to happen
							 | 
						||
| 
								 | 
							
								            sleep(10)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            m_room.send_text("hi from matrix")
							 | 
						||
| 
								 | 
							
								            irc.send(b"PRIVMSG #test :hi from irc \r\n")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            print("Waiting for irc message...")
							 | 
						||
| 
								 | 
							
								            while True:
							 | 
						||
| 
								 | 
							
								                buf = irc.recv(10000)
							 | 
						||
| 
								 | 
							
								                if b"hi from matrix" in buf:
							 | 
						||
| 
								 | 
							
								                    break
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            print("Waiting for matrix message...")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            def callback(room, e):
							 | 
						||
| 
								 | 
							
								                if "hi from irc" in e['content']['body']:
							 | 
						||
| 
								 | 
							
								                    exit(0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            m_room.add_listener(callback, "m.room.message")
							 | 
						||
| 
								 | 
							
								            matrix.listen_forever()
							 | 
						||
| 
								 | 
							
								          ''
							 | 
						||
| 
								 | 
							
								          )
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    testScript = ''
							 | 
						||
| 
								 | 
							
								      start_all()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      ircd.wait_for_unit("ngircd.service")
							 | 
						||
| 
								 | 
							
								      ircd.wait_for_open_port(6667)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      with subtest("start the appservice"):
							 | 
						||
| 
								 | 
							
								          appservice.wait_for_unit("matrix-appservice-irc.service")
							 | 
						||
| 
								 | 
							
								          appservice.wait_for_open_port(8009)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      with subtest("copy the registration file"):
							 | 
						||
| 
								 | 
							
								          appservice.copy_from_vm("/var/lib/matrix-appservice-irc/registration.yml")
							 | 
						||
| 
								 | 
							
								          homeserver.copy_from_host(
							 | 
						||
| 
								 | 
							
								              pathlib.Path(os.environ.get("out", os.getcwd())) / "registration.yml", "/"
							 | 
						||
| 
								 | 
							
								          )
							 | 
						||
| 
								 | 
							
								          homeserver.succeed("chmod 444 /registration.yml")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      with subtest("start the homeserver"):
							 | 
						||
| 
								 | 
							
								          homeserver.succeed(
							 | 
						||
| 
								 | 
							
								              "/run/current-system/specialisation/running/bin/switch-to-configuration test >&2"
							 | 
						||
| 
								 | 
							
								          )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          homeserver.wait_for_unit("matrix-synapse.service")
							 | 
						||
| 
								 | 
							
								          homeserver.wait_for_open_port(8448)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      with subtest("ensure messages can be exchanged"):
							 | 
						||
| 
								 | 
							
								          client.succeed("do_test")
							 | 
						||
| 
								 | 
							
								    '';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  })
							 |