at 23.05-pre 2.7 kB view raw
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})