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