1import ./make-test-python.nix (
2 { pkgs, ... }:
3 {
4 name = "slimserver";
5 meta.maintainers = with pkgs.lib.maintainers; [ adamcstephens ];
6
7 nodes.machine =
8 { ... }:
9 {
10 services.slimserver.enable = true;
11 services.squeezelite = {
12 enable = true;
13 extraArguments = "-s 127.0.0.1 -d slimproto=info";
14 };
15 boot.kernelModules = [ "snd-dummy" ];
16 };
17
18 testScript = # python
19 ''
20 import json
21 rpc_get_player = {
22 "id": 1,
23 "method": "slim.request",
24 "params":[0,["player", "id", "0", "?"]]
25 }
26
27 with subtest("slimserver is started"):
28 machine.wait_for_unit("slimserver.service")
29 # give slimserver a moment to report errors
30 machine.sleep(2)
31 machine.wait_until_succeeds("journalctl -u slimserver.service | grep 'Starting Lyrion Music'", timeout=120)
32 machine.wait_for_open_port(9000)
33
34 with subtest('slimserver module errors are not reported'):
35 machine.fail("journalctl -u slimserver.service | grep 'throw_exception'")
36 machine.fail("journalctl -u slimserver.service | grep 'not installed'")
37 machine.fail("journalctl -u slimserver.service | grep 'not found'")
38 machine.fail("journalctl -u slimserver.service | grep 'The following CPAN modules were found but cannot work with Logitech Media Server'")
39 machine.fail("journalctl -u slimserver.service | grep 'please use the buildme.sh'")
40
41 with subtest("squeezelite player successfully connects to slimserver"):
42 machine.wait_for_unit("squeezelite.service")
43 machine.wait_until_succeeds("journalctl -u squeezelite.service | grep -E 'slimproto:[0-9]+ connected'", timeout=120)
44 player_mac = machine.wait_until_succeeds("journalctl -eu squeezelite.service | grep -E 'sendHELO:[0-9]+ mac:'", timeout=120).strip().split(" ")[-1]
45 player_id = machine.succeed(f"curl http://localhost:9000/jsonrpc.js -g -X POST -d '{json.dumps(rpc_get_player)}'")
46 assert player_mac == json.loads(player_id)["result"]["_id"], "squeezelite player not found"
47 '';
48 }
49)