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}