diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index cb7f599eb6ea..24d6e0725f2a 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -569,6 +569,7 @@ in { lomiri-docviewer-app = runTest ./lomiri-docviewer-app.nix; lomiri-filemanager-app = runTest ./lomiri-filemanager-app.nix; lomiri-mediaplayer-app = runTest ./lomiri-mediaplayer-app.nix; + lomiri-music-app = runTest ./lomiri-music-app.nix; lomiri-gallery-app = runTest ./lomiri-gallery-app.nix; lomiri-system-settings = handleTest ./lomiri-system-settings.nix {}; lorri = handleTest ./lorri/default.nix {}; diff --git a/nixos/tests/lomiri-music-app.nix b/nixos/tests/lomiri-music-app.nix new file mode 100644 index 000000000000..93a3889c9127 --- /dev/null +++ b/nixos/tests/lomiri-music-app.nix @@ -0,0 +1,193 @@ +{ lib, ... }: +let + ocrContent = "Music Test"; + musicFile = "test.mp3"; + + ocrPauseColor = "#FF00FF"; + ocrStartColor = "#00FFFF"; +in +{ + name = "lomiri-music-app-standalone"; + meta = { + maintainers = lib.teams.lomiri.members; + # This needs a Linux VM + platforms = lib.platforms.linux; + }; + + nodes.machine = + { config, pkgs, ... }: + { + imports = [ + ./common/auto.nix + ./common/user-account.nix + ./common/x11.nix + ]; + + services.xserver.enable = true; + + environment = { + # Setup video + etc."${musicFile}".source = + pkgs.runCommand musicFile + { + nativeBuildInputs = with pkgs; [ + ffmpeg # produce music + (imagemagick.override { ghostscriptSupport = true; }) # produce OCR-able cover image + ]; + } + '' + magick -size 400x400 canvas:white -pointsize 40 -fill black -annotate +100+100 '${ocrContent}' output.png + ffmpeg -re \ + -f lavfi -i anullsrc=channel_layout=mono:sample_rate=44100 \ + -i output.png \ + -map 0:0 -map 1:0 \ + -id3v2_version 3 \ + -metadata:s:v title="Album cover" \ + -metadata:s:v comment="Cover (front)" \ + -t 120 \ + $out -loglevel fatal + ''; + + systemPackages = + with pkgs; + [ + xdg-user-dirs # generate XDG dirs + xdotool # mouse movement + ] + ++ (with pkgs.lomiri; [ + mediascanner2 + lomiri-music-app + lomiri-thumbnailer + # To check if playback actually works, or is broken due to missing codecs, we need to make the app's icons more OCR-able + (lib.meta.hiPrio ( + suru-icon-theme.overrideAttrs (oa: { + # Colour the background in special colours, which we can OCR for + postPatch = + (oa.postPatch or "") + + '' + substituteInPlace suru/actions/scalable/media-playback-pause.svg \ + --replace-fail 'fill:none' 'fill:${ocrPauseColor}' + + substituteInPlace suru/actions/scalable/media-playback-start.svg \ + --replace-fail 'fill:none' 'fill:${ocrStartColor}' + ''; + }) + )) + ]); + + variables = { + UITK_ICON_THEME = "suru"; + }; + }; + + # Get mediascanner-2.0.service + services.desktopManager.lomiri.enable = lib.mkForce true; + + # ...but stick with icewm + services.displayManager.defaultSession = lib.mkForce "none+icewm"; + + systemd.tmpfiles.settings = { + "10-lomiri-music-app-test-setup" = { + "/root/Music".d = { + mode = "0755"; + user = "root"; + group = "root"; + }; + "/root/Music/${musicFile}"."C+".argument = "/etc/${musicFile}"; + }; + }; + + i18n.supportedLocales = [ "all" ]; + }; + + enableOCR = true; + + testScript = '' + from collections.abc import Callable + import tempfile + import subprocess + + pauseColor: str = "${ocrPauseColor}" + startColor: str = "${ocrStartColor}" + + # Based on terminal-emulators.nix' check_for_pink + def check_for_color(color: str) -> Callable[[bool], bool]: + def check_for_color_retry(final=False) -> bool: + with tempfile.NamedTemporaryFile() as tmpin: + machine.send_monitor_command("screendump {}".format(tmpin.name)) + + cmd = 'convert {} -define histogram:unique-colors=true -format "%c" histogram:info:'.format( + tmpin.name + ) + ret = subprocess.run(cmd, shell=True, capture_output=True) + if ret.returncode != 0: + raise Exception( + "image analysis failed with exit code {}".format(ret.returncode) + ) + + text = ret.stdout.decode("utf-8") + return color in text + + return check_for_color_retry + + machine.wait_for_x() + + # mediascanner2 needs XDG dirs to exist + machine.succeed("xdg-user-dirs-update") + + # mediascanner2 needs to have run, is only started automatically by Lomiri + machine.systemctl("start mediascanner-2.0.service", "root") + + with subtest("lomiri music launches"): + machine.succeed("lomiri-music-app >&2 &") + machine.wait_for_text("favorite music") + machine.send_key("alt-f10") + machine.screenshot("lomiri-music") + + with subtest("lomiri music plays music"): + machine.succeed("xdotool mousemove 30 720 click 1") # Skip intro + machine.wait_for_text("Albums") + machine.succeed("xdotool mousemove 25 45 click 1") # Open categories + machine.wait_for_text("Tracks") + machine.succeed("xdotool mousemove 25 240 click 1") # Switch to Tracks category + machine.wait_for_text("test") # the test file + machine.screenshot("lomiri-music_listing") + + # Ensure pause colours isn't present already + assert ( + check_for_color(pauseColor)(True) == False + ), "pauseColor {} was present on the screen before we selected anything!".format(pauseColor) + + machine.succeed("xdotool mousemove 25 120 click 1") # Select the track + + # Waiting for pause icon to be displayed + with machine.nested("Waiting for the screen to have pauseColor {} on it:".format(pauseColor)): + retry(check_for_color(pauseColor)) + + machine.screenshot("lomiri-music_playback") + + # Ensure play colours isn't present already + assert ( + check_for_color(startColor)(True) == False + ), "startColor {} was present on the screen before we were expecting it to be!".format(startColor) + + machine.succeed("xdotool mousemove 860 480 click 1") # Pause track (only works if app can actually decode the file) + + # Waiting for play icon to be displayed + with machine.nested("Waiting for the screen to have startColor {} on it:".format(startColor)): + retry(check_for_color(startColor)) + + machine.screenshot("lomiri-music_paused") + + # Lastly, check if generated cover image got extracted properly + # if not, indicates an issue with mediascanner / lomiri-thumbnailer + machine.wait_for_text("${ocrContent}") + + machine.succeed("pkill -f lomiri-music-app") + + with subtest("lomiri music localisation works"): + machine.succeed("env LANG=de_DE.UTF-8 lomiri-music-app .mp4 >&2 &") + machine.wait_for_text("Titel") + machine.screenshot("lomiri-music_localised") + ''; +} diff --git a/pkgs/desktops/lomiri/applications/lomiri-music-app/default.nix b/pkgs/desktops/lomiri/applications/lomiri-music-app/default.nix index 23551fc2dc93..f3688b33d9e3 100644 --- a/pkgs/desktops/lomiri/applications/lomiri-music-app/default.nix +++ b/pkgs/desktops/lomiri/applications/lomiri-music-app/default.nix @@ -4,6 +4,7 @@ fetchFromGitLab, fetchpatch, gitUpdater, + nixosTests, cmake, gettext, gst_all_1, @@ -105,6 +106,7 @@ stdenv.mkDerivation (finalAttrs: { ''; passthru = { + tests.vm = nixosTests.lomiri-music-app; updateScript = gitUpdater { }; }; diff --git a/pkgs/desktops/lomiri/services/lomiri-thumbnailer/default.nix b/pkgs/desktops/lomiri/services/lomiri-thumbnailer/default.nix index 925f5592c34d..a9cb0b7da1d9 100644 --- a/pkgs/desktops/lomiri/services/lomiri-thumbnailer/default.nix +++ b/pkgs/desktops/lomiri/services/lomiri-thumbnailer/default.nix @@ -176,7 +176,11 @@ stdenv.mkDerivation (finalAttrs: { passthru = { tests = { # gallery app delegates to thumbnailer, tests various formats - vm = nixosTests.lomiri-gallery-app; + gallery-app = nixosTests.lomiri-gallery-app; + + # music app relies on thumbnailer to extract embedded cover art + music-app = nixosTests.lomiri-music-app; + pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; }; updateScript = gitUpdater { }; diff --git a/pkgs/desktops/lomiri/services/mediascanner2/default.nix b/pkgs/desktops/lomiri/services/mediascanner2/default.nix index 0401e42ca78a..a6dafcc45fd1 100644 --- a/pkgs/desktops/lomiri/services/mediascanner2/default.nix +++ b/pkgs/desktops/lomiri/services/mediascanner2/default.nix @@ -3,6 +3,7 @@ lib, fetchFromGitLab, gitUpdater, + nixosTests, testers, # dbus-cpp not compatible with Boost 1.87 # https://gitlab.com/ubports/development/core/lib-cpp/dbus-cpp/-/issues/8 @@ -101,7 +102,12 @@ stdenv.mkDerivation (finalAttrs: { ''; passthru = { - tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + tests = { + # music app needs mediascanner to work properly, so it can find files + music-app = nixosTests.lomiri-music-app; + + pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; + }; updateScript = gitUpdater { }; };