lol

Merge pull request #42118 from emmanuelrosa/mpd-nixos-tests

mpd: add NixOS tests

authored by

Silvan Mosberger and committed by
GitHub
fb297562 6a368675

+120
+1
nixos/release.nix
··· 341 341 tests.mesos = callTest tests/mesos.nix {}; 342 342 tests.misc = callTest tests/misc.nix {}; 343 343 tests.mongodb = callTest tests/mongodb.nix {}; 344 + tests.mpd = callTest tests/mpd.nix {}; 344 345 tests.mumble = callTest tests/mumble.nix {}; 345 346 tests.munin = callTest tests/munin.nix {}; 346 347 tests.mutableUsers = callTest tests/mutable-users.nix {};
+119
nixos/tests/mpd.nix
··· 1 + import ./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 + { config, pkgs, ... }: { }; 51 + 52 + serverALSA = 53 + { config, pkgs, ... }: (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 + { config, pkgs, ... }: (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 + })