1let
2 clients = [
3 "ircclient1"
4 "ircclient2"
5 ];
6 server = "inspircd";
7 ircPort = 6667;
8 channel = "nixos-cat";
9 iiDir = "/tmp/irc";
10in
11
12import ./make-test-python.nix ({ pkgs, lib, ... }: {
13 name = "inspircd";
14 nodes = {
15 "${server}" = {
16 networking.firewall.allowedTCPPorts = [ ircPort ];
17 services.inspircd = {
18 enable = true;
19 package = pkgs.inspircdMinimal;
20 config = ''
21 <bind address="" port="${toString ircPort}" type="clients">
22 <connect name="main" allow="*" pingfreq="15">
23 '';
24 };
25 };
26 } // lib.listToAttrs (builtins.map (client: lib.nameValuePair client {
27 imports = [
28 ./common/user-account.nix
29 ];
30
31 systemd.services.ii = {
32 requires = [ "network.target" ];
33 wantedBy = [ "default.target" ];
34
35 serviceConfig = {
36 Type = "simple";
37 ExecPreStartPre = "mkdir -p ${iiDir}";
38 ExecStart = ''
39 ${lib.getBin pkgs.ii}/bin/ii -n ${client} -s ${server} -i ${iiDir}
40 '';
41 User = "alice";
42 };
43 };
44 }) clients);
45
46 testScript =
47 let
48 msg = client: "Hello, my name is ${client}";
49 clientScript = client: [
50 ''
51 ${client}.wait_for_unit("network.target")
52 ${client}.systemctl("start ii")
53 ${client}.wait_for_unit("ii")
54 ${client}.wait_for_file("${iiDir}/${server}/out")
55 ''
56 # wait until first PING from server arrives before joining,
57 # so we don't try it too early
58 ''
59 ${client}.wait_until_succeeds("grep 'PING' ${iiDir}/${server}/out")
60 ''
61 # join ${channel}
62 ''
63 ${client}.succeed("echo '/j #${channel}' > ${iiDir}/${server}/in")
64 ${client}.wait_for_file("${iiDir}/${server}/#${channel}/in")
65 ''
66 # send a greeting
67 ''
68 ${client}.succeed(
69 "echo '${msg client}' > ${iiDir}/${server}/#${channel}/in"
70 )
71 ''
72 # check that all greetings arrived on all clients
73 ] ++ builtins.map (other: ''
74 ${client}.succeed(
75 "grep '${msg other}$' ${iiDir}/${server}/#${channel}/out"
76 )
77 '') clients;
78
79 # foldl', but requires a non-empty list instead of a start value
80 reduce = f: list:
81 builtins.foldl' f (builtins.head list) (builtins.tail list);
82 in ''
83 start_all()
84 ${server}.wait_for_open_port(${toString ircPort})
85
86 # run clientScript for all clients so that every list
87 # entry is executed by every client before advancing
88 # to the next one.
89 '' + lib.concatStrings
90 (reduce
91 (lib.zipListsWith (cs: c: cs + c))
92 (builtins.map clientScript clients));
93})