1import ./make-test-python.nix ({ pkgs, ...} :
2
3let
4 port = 10004;
5 tcpPort = 10005;
6 httpPort = 10080;
7 tcpStreamPort = 10006;
8 bufferSize = 742;
9in {
10 name = "snapcast";
11 meta = with pkgs.lib.maintainers; {
12 maintainers = [ hexa ];
13 };
14
15 nodes = {
16 server = {
17 services.snapserver = {
18 enable = true;
19 port = port;
20 tcp.port = tcpPort;
21 http.port = httpPort;
22 buffer = bufferSize;
23 streams = {
24 mpd = {
25 type = "pipe";
26 location = "/run/snapserver/mpd";
27 query.mode = "create";
28 };
29 bluetooth = {
30 type = "pipe";
31 location = "/run/snapserver/bluetooth";
32 };
33 tcp = {
34 type = "tcp";
35 location = "127.0.0.1:${toString tcpStreamPort}";
36 };
37 meta = {
38 type = "meta";
39 location = "/mpd/bluetooth/tcp";
40 };
41 };
42 };
43 };
44 client = {
45 environment.systemPackages = [ pkgs.snapcast ];
46 };
47 };
48
49 testScript = ''
50 import json
51
52 get_rpc_version = {"id": "1", "jsonrpc": "2.0", "method": "Server.GetRPCVersion"}
53
54 start_all()
55
56 server.wait_for_unit("snapserver.service")
57 server.wait_until_succeeds("ss -ntl | grep -q ${toString port}")
58 server.wait_until_succeeds("ss -ntl | grep -q ${toString tcpPort}")
59 server.wait_until_succeeds("ss -ntl | grep -q ${toString httpPort}")
60 server.wait_until_succeeds("ss -ntl | grep -q ${toString tcpStreamPort}")
61
62 with subtest("check that pipes are created"):
63 server.succeed("test -p /run/snapserver/mpd")
64 server.succeed("test -p /run/snapserver/bluetooth")
65
66 with subtest("test tcp json-rpc"):
67 server.succeed(f"echo '{json.dumps(get_rpc_version)}' | nc -w 1 localhost ${toString tcpPort}")
68
69 with subtest("test http json-rpc"):
70 server.succeed(
71 "curl --fail http://localhost:${toString httpPort}/jsonrpc -d '{json.dumps(get_rpc_version)}'"
72 )
73
74 with subtest("test a connection"):
75 client.execute("systemd-run --unit=snapcast-client snapclient -h server -p ${toString port}")
76 server.wait_until_succeeds(
77 "journalctl -o cat -u snapserver.service | grep -q 'Hello from'"
78 )
79 client.wait_until_succeeds("journalctl -o cat -u snapcast-client | grep -q 'buffer: ${toString bufferSize}'")
80 '';
81})