at 18.09-beta 3.7 kB view raw
1import ./make-test.nix ({ pkgs, ... }: 2 let 3 track = pkgs.fetchurl { 4 # Sourced from http://freemusicarchive.org/music/Blue_Wave_Theory/Surf_Music_Month_Challenge/Skyhawk_Beach_fade_in 5 # License: http://creativecommons.org/licenses/by-sa/4.0/ 6 7 name = "Blue_Wave_Theory-Skyhawk_Beach.mp3"; 8 url = https://freemusicarchive.org/file/music/ccCommunity/Blue_Wave_Theory/Surf_Music_Month_Challenge/Blue_Wave_Theory_-_04_-_Skyhawk_Beach.mp3; 9 sha256 = "0xw417bxkx4gqqy139bb21yldi37xx8xjfxrwaqa0gyw19dl6mgp"; 10 }; 11 12 defaultCfg = rec { 13 user = "mpd"; 14 group = "mpd"; 15 dataDir = "/var/lib/mpd"; 16 musicDirectory = "${dataDir}/music"; 17 }; 18 19 defaultMpdCfg = with defaultCfg; { 20 inherit dataDir musicDirectory user group; 21 enable = true; 22 }; 23 24 musicService = { user, group, musicDirectory }: { 25 description = "Sets up the music file(s) for MPD to use."; 26 requires = [ "mpd.service" ]; 27 after = [ "mpd.service" ]; 28 wantedBy = [ "default.target" ]; 29 script = '' 30 mkdir -p ${musicDirectory} && chown -R ${user}:${group} ${musicDirectory} 31 cp ${track} ${musicDirectory} 32 chown ${user}:${group} ${musicDirectory}/$(basename ${track}) 33 ''; 34 }; 35 36 mkServer = { mpd, musicService, }: 37 { boot.kernelModules = [ "snd-dummy" ]; 38 sound.enable = true; 39 services.mpd = mpd; 40 systemd.services.musicService = musicService; 41 }; 42 in { 43 name = "mpd"; 44 meta = with pkgs.stdenv.lib.maintainers; { 45 maintainers = [ emmanuelrosa ]; 46 }; 47 48 nodes = 49 { client = 50 { ... }: { }; 51 52 serverALSA = 53 { ... }: (mkServer { 54 mpd = defaultMpdCfg // { 55 network.listenAddress = "any"; 56 extraConfig = '' 57 audio_output { 58 type "alsa" 59 name "ALSA" 60 mixer_type "null" 61 } 62 ''; 63 }; 64 65 musicService = with defaultMpdCfg; musicService { inherit user group musicDirectory; }; 66 }) // { networking.firewall.allowedTCPPorts = [ 6600 ]; }; 67 68 serverPulseAudio = 69 { ... }: (mkServer { 70 mpd = defaultMpdCfg // { 71 extraConfig = '' 72 audio_output { 73 type "pulse" 74 name "The Pulse" 75 } 76 ''; 77 }; 78 79 musicService = with defaultCfg; musicService { inherit user group musicDirectory; }; 80 }) // { hardware.pulseaudio.enable = true; }; 81 }; 82 83 testScript = '' 84 my $mpc = "${pkgs.mpc_cli}/bin/mpc --wait"; 85 86 # Connects to the given server and attempts to play a tune. 87 sub play_some_music { 88 my $server = $_[0]; 89 90 $server->waitForUnit("mpd.service"); 91 $server->succeed("$mpc update"); 92 my @tracks = $server->execute("$mpc ls"); 93 94 for my $track (split(/\n/, $tracks[1])) { 95 $server->succeed("$mpc add $track"); 96 }; 97 98 my @added_tracks = $server->execute("$mpc listall"); 99 (length $added_tracks[1]) > 0 or die "Failed to add audio tracks to the playlist."; 100 101 $server->succeed("$mpc play"); 102 103 my @status = $server->execute("$mpc status"); 104 my @output = split(/\n/, $status[1]); 105 $output[1] =~ /.*playing.*/ or die "Audio track is not playing, as expected."; 106 107 $server->succeed("$mpc stop"); 108 }; 109 110 play_some_music($serverALSA); 111 play_some_music($serverPulseAudio); 112 113 $client->succeed("$mpc -h serverALSA status"); 114 115 # The PulseAudio-based server is configured not to accept external client connections 116 # to perform the following test: 117 $client->fail("$mpc -h serverPulseAudio status"); 118 ''; 119})