1import ./make-test-python.nix ({ pkgs, ...} :
2
3let
4
5 # Build Quake with coverage instrumentation.
6 overrides = pkgs:
7 {
8 quake3game = pkgs.quake3game.override (args: {
9 stdenv = pkgs.stdenvAdapters.addCoverageInstrumentation args.stdenv;
10 });
11 };
12
13 # Only allow the demo data to be used (only if it's unfreeRedistributable).
14 unfreePredicate = pkg: with pkgs.lib; let
15 allowPackageNames = [ "quake3-demodata" "quake3-pointrelease" ];
16 allowLicenses = [ pkgs.lib.licenses.unfreeRedistributable ];
17 in elem pkg.pname allowPackageNames &&
18 elem (pkg.meta.license or null) allowLicenses;
19
20 client =
21 { pkgs, ... }:
22
23 { imports = [ ./common/x11.nix ];
24 hardware.opengl.driSupport = true;
25 environment.systemPackages = [ pkgs.quake3demo ];
26 nixpkgs.config.packageOverrides = overrides;
27 nixpkgs.config.allowUnfreePredicate = unfreePredicate;
28 };
29
30in
31
32rec {
33 name = "quake3";
34 meta = with pkgs.stdenv.lib.maintainers; {
35 maintainers = [ domenkozar eelco ];
36 };
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 ''
62 start_all()
63
64 server.wait_for_unit("quake3-server")
65 client1.wait_for_x()
66 client2.wait_for_x()
67
68 client1.execute("quake3 +set r_fullscreen 0 +set name Foo +connect server &")
69 client2.execute("quake3 +set r_fullscreen 0 +set name Bar +connect server &")
70
71 server.wait_until_succeeds("grep -q 'Foo.*entered the game' /tmp/log")
72 server.wait_until_succeeds("grep -q 'Bar.*entered the game' /tmp/log")
73
74 server.sleep(10) # wait for a while to get a nice screenshot
75
76 client1.block()
77
78 server.sleep(20)
79
80 client1.screenshot("screen1")
81 client2.screenshot("screen2")
82
83 client1.unblock()
84
85 server.sleep(10)
86
87 client1.screenshot("screen3")
88 client2.screenshot("screen4")
89
90 client1.shutdown()
91 client2.shutdown()
92 server.stop_job("quake3-server")
93 '';
94
95})