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