at master 2.5 kB view raw
1{ lib, ... }: 2let 3 # Build Quake with coverage instrumentation. 4 overrides = pkgs: { 5 quake3game = pkgs.quake3game.override (args: { 6 stdenv = pkgs.stdenvAdapters.addCoverageInstrumentation args.stdenv; 7 }); 8 }; 9 10 # Only allow the demo data to be used (only if it's unfreeRedistributable). 11 unfreePredicate = 12 pkg: 13 let 14 allowPackageNames = [ 15 "quake3-demodata" 16 "quake3-pointrelease" 17 ]; 18 allowLicenses = [ lib.licenses.unfreeRedistributable ]; 19 in 20 lib.elem pkg.pname allowPackageNames && lib.elem (pkg.meta.license or null) allowLicenses; 21 22 client = 23 { pkgs, ... }: 24 { 25 imports = [ ./common/x11.nix ]; 26 hardware.graphics.enable = true; 27 environment.systemPackages = [ pkgs.quake3demo ]; 28 nixpkgs.config.packageOverrides = overrides; 29 nixpkgs.config.allowUnfreePredicate = unfreePredicate; 30 }; 31in 32{ 33 name = "quake3"; 34 meta.maintainers = with lib.maintainers; [ ]; 35 36 node.pkgsReadOnly = false; 37 38 # TODO: lcov doesn't work atm 39 #makeCoverageReport = true; 40 41 nodes = { 42 server = 43 { pkgs, ... }: 44 { 45 systemd.services.quake3-server = { 46 wantedBy = [ "multi-user.target" ]; 47 script = 48 "${pkgs.quake3demo}/bin/quake3-server +set g_gametype 0 " 49 + "+map q3dm7 +addbot grunt +addbot daemia 2> /tmp/log"; 50 }; 51 nixpkgs.config.packageOverrides = overrides; 52 nixpkgs.config.allowUnfreePredicate = unfreePredicate; 53 networking.firewall.allowedUDPPorts = [ 27960 ]; 54 }; 55 56 client1 = client; 57 client2 = client; 58 }; 59 60 testScript = '' 61 start_all() 62 63 server.wait_for_unit("quake3-server") 64 client1.wait_for_x() 65 client2.wait_for_x() 66 67 client1.execute("quake3 +set r_fullscreen 0 +set name Foo +connect server >&2 &", check_return = False) 68 client2.execute("quake3 +set r_fullscreen 0 +set name Bar +connect server >&2 &", check_return = False) 69 70 server.wait_until_succeeds("grep -q 'Foo.*entered the game' /tmp/log") 71 server.wait_until_succeeds("grep -q 'Bar.*entered the game' /tmp/log") 72 73 server.sleep(10) # wait for a while to get a nice screenshot 74 75 client1.block() 76 77 server.sleep(20) 78 79 client1.screenshot("screen1") 80 client2.screenshot("screen2") 81 82 client1.unblock() 83 84 server.sleep(10) 85 86 client1.screenshot("screen3") 87 client2.screenshot("screen4") 88 89 client1.shutdown() 90 client2.shutdown() 91 server.stop_job("quake3-server") 92 ''; 93}