nixVersions.stable: 2.15 -> 2.17
[NixPkgs.git] / nixos / tests / inspircd.nix
blobf4d82054011cbb54d23bbaf3be631986263c8b7d
1 let
2   clients = [
3     "ircclient1"
4     "ircclient2"
5   ];
6   server = "inspircd";
7   ircPort = 6667;
8   channel = "nixos-cat";
9   iiDir = "/tmp/irc";
12 import ./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     ];
31     systemd.services.ii = {
32       requires = [ "network.target" ];
33       wantedBy = [ "default.target" ];
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);
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;
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})
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));