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