mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-06-09 19:13:26 +03:00
311 lines
10 KiB
Nix
311 lines
10 KiB
Nix
let
|
|
makeTest = import ./make-test-python.nix;
|
|
imageDataDir = "gallery-app-sampledata";
|
|
imageLabel = "Image";
|
|
|
|
makeFormatTest =
|
|
{
|
|
file,
|
|
buttonIsOffset ? null,
|
|
customTest ? null,
|
|
}:
|
|
|
|
makeTest (
|
|
{ pkgs, lib, ... }:
|
|
|
|
assert lib.asserts.assertMsg (
|
|
buttonIsOffset != null || customTest != null
|
|
) "Must either clarify button position, or define custom test code";
|
|
|
|
let
|
|
format = lib.lists.last (lib.strings.splitString "." file);
|
|
in
|
|
|
|
{
|
|
name = "lomiri-gallery-app-standalone-format-${format}";
|
|
meta.maintainers = lib.teams.lomiri.members;
|
|
|
|
nodes.machine =
|
|
{ config, pkgs, ... }:
|
|
{
|
|
imports = [ ./common/x11.nix ];
|
|
|
|
services.xserver.enable = true;
|
|
|
|
environment = {
|
|
etc."${imageDataDir}".source =
|
|
pkgs.runCommand imageDataDir
|
|
{
|
|
nativeBuildInputs = with pkgs; [
|
|
ffmpeg # make a video from the image
|
|
(imagemagick.override { ghostscriptSupport = true; }) # add label for OCR
|
|
];
|
|
}
|
|
''
|
|
mkdir -p $out/{Pictures,Videos}
|
|
|
|
# Setup example data, OCR-friendly:
|
|
# - White square, black text
|
|
# - Small text for display OCR
|
|
# - Big text for gallery preview OCR
|
|
# - uppercase extension
|
|
magick -size 500x500 -background white -fill black canvas:white \
|
|
-pointsize 20 -annotate +100+100 '${imageLabel}' \
|
|
-pointsize 70 -annotate +100+300 '${imageLabel}' \
|
|
$out/Pictures/output.PNG
|
|
|
|
# Different image formats
|
|
magick $out/Pictures/output.PNG $out/Pictures/output.JPG
|
|
magick $out/Pictures/output.PNG $out/Pictures/output.BMP
|
|
magick $out/Pictures/output.PNG $out/Pictures/output.GIF
|
|
|
|
# Video for dispatching
|
|
ffmpeg -loop 1 -r 1 -i $out/Pictures/output.PNG -t 100 -pix_fmt yuv420p $out/Videos/output.MP4
|
|
'';
|
|
systemPackages =
|
|
with pkgs;
|
|
[
|
|
glib # Poke thumbnailer to process media via gdbus
|
|
mpv # URI dispatching for video support
|
|
xdotool # mouse movement
|
|
]
|
|
++ (with pkgs.lomiri; [
|
|
suru-icon-theme
|
|
lomiri-gallery-app
|
|
lomiri-thumbnailer # finds new images & generates thumbnails
|
|
]);
|
|
variables = {
|
|
UITK_ICON_THEME = "suru";
|
|
};
|
|
};
|
|
|
|
# Allow us to start thumbnailer ahead-of-time, hopefully let thumbnails get processed in peace
|
|
systemd.user.services."dbus-com.lomiri.Thumbnailer" = {
|
|
serviceConfig = {
|
|
Type = "dbus";
|
|
BusName = "com.lomiri.Thumbnailer";
|
|
ExecStart = "${pkgs.lomiri.lomiri-thumbnailer}/libexec/lomiri-thumbnailer/thumbnailer-service";
|
|
};
|
|
};
|
|
|
|
fonts = {
|
|
packages = with pkgs; [
|
|
# Intended font & helps with OCR
|
|
ubuntu-classic
|
|
];
|
|
};
|
|
};
|
|
|
|
enableOCR = true;
|
|
|
|
testScript =
|
|
''
|
|
machine.wait_for_x()
|
|
|
|
machine.succeed("mkdir /root/${builtins.dirOf file}")
|
|
machine.succeed("cp -vr /etc/${imageDataDir}/${file} /root/${builtins.dirOf file}")
|
|
|
|
# Start thumbnailer, wait for idle shutdown
|
|
machine.systemctl("start dbus-com.lomiri.Thumbnailer", "root")
|
|
machine.wait_until_succeeds(
|
|
"env XDG_RUNTIME_DIR=/run/user/0 "
|
|
+ "systemctl --user is-active dbus-com.lomiri.Thumbnailer"
|
|
)
|
|
machine.wait_for_console_text("thumbnail cache:")
|
|
|
|
# Request thumbnail processing, get initial thumbnail image into cache
|
|
# This can randomly take abit longer, just run it until it succeeds
|
|
# Touch file to invalidate failure cache
|
|
machine.wait_until_succeeds(
|
|
"touch '/root/${file}' && "
|
|
+ "env XDG_RUNTIME_DIR=/run/user/0 "
|
|
+ "gdbus call -e "
|
|
+ "-d com.lomiri.Thumbnailer -o /com/lomiri/Thumbnailer "
|
|
+ "-m com.lomiri.Thumbnailer.GetThumbnail "
|
|
+ "'/root/${file}' "
|
|
# Same size as source, to reduce processing - we're very close to hitting 20s on slow hardware here
|
|
+ "'@(ii) (500,500)'"
|
|
)
|
|
|
|
machine.wait_for_console_text("Idle timeout reached")
|
|
machine.wait_until_fails(
|
|
"env XDG_RUNTIME_DIR=/run/user/0 "
|
|
+ "systemctl --user is-active dbus-com.lomiri.Thumbnailer"
|
|
)
|
|
|
|
with subtest("lomiri gallery finds files"):
|
|
machine.succeed("lomiri-gallery-app >&2 &")
|
|
machine.wait_for_console_text("qq= AlbumsOverview") # logged when album page actually gets loaded
|
|
machine.sleep(10)
|
|
machine.send_key("alt-f10")
|
|
machine.sleep(5)
|
|
machine.wait_for_text(r"(Albums|Events|Photos|${imageLabel})")
|
|
|
|
machine.succeed("xdotool mousemove 30 40 click 1") # burger menu for categories
|
|
machine.sleep(2)
|
|
machine.succeed("xdotool mousemove 30 180 click 1") # photos
|
|
machine.sleep(2)
|
|
machine.screenshot("lomiri-gallery_photos")
|
|
|
|
machine.succeed("xdotool mousemove 80 140 click 1") # select first one
|
|
machine.sleep(2)
|
|
machine.succeed("xdotool mousemove 80 140 click 1") # enable top-bar
|
|
machine.sleep(2)
|
|
|
|
''
|
|
+ (
|
|
if (customTest != null) then
|
|
customTest
|
|
else
|
|
''
|
|
with subtest("lomiri gallery handles ${format}"):
|
|
machine.succeed("xdotool mousemove ${
|
|
if buttonIsOffset then "900" else "940"
|
|
} 50 click 1") # open media information
|
|
machine.sleep(2)
|
|
machine.screenshot("lomiri-gallery_${format}_info")
|
|
machine.send_key("esc")
|
|
machine.sleep(2)
|
|
machine.wait_for_text("${imageLabel}") # make sure media shows fine
|
|
''
|
|
);
|
|
|
|
}
|
|
);
|
|
makeFormatTests =
|
|
detailsList:
|
|
builtins.listToAttrs (
|
|
builtins.map (
|
|
{
|
|
name,
|
|
file,
|
|
buttonIsOffset ? null,
|
|
customTest ? null,
|
|
}:
|
|
{
|
|
name = "format-${name}";
|
|
value = makeFormatTest {
|
|
inherit
|
|
file
|
|
buttonIsOffset
|
|
customTest
|
|
;
|
|
};
|
|
}
|
|
) detailsList
|
|
);
|
|
in
|
|
{
|
|
basic = makeTest (
|
|
{ lib, ... }:
|
|
{
|
|
name = "lomiri-gallery-app-standalone-basic";
|
|
meta.maintainers = lib.teams.lomiri.members;
|
|
|
|
nodes.machine =
|
|
{ config, pkgs, ... }:
|
|
{
|
|
imports = [ ./common/x11.nix ];
|
|
|
|
services.xserver.enable = true;
|
|
|
|
environment = {
|
|
systemPackages =
|
|
with pkgs;
|
|
[
|
|
xdotool # mouse movement
|
|
]
|
|
++ (with pkgs.lomiri; [
|
|
suru-icon-theme
|
|
lomiri-gallery-app
|
|
]);
|
|
variables = {
|
|
UITK_ICON_THEME = "suru";
|
|
};
|
|
};
|
|
|
|
i18n.supportedLocales = [ "all" ];
|
|
|
|
fonts = {
|
|
packages = with pkgs; [
|
|
# Intended font & helps with OCR
|
|
ubuntu-classic
|
|
];
|
|
};
|
|
};
|
|
|
|
enableOCR = true;
|
|
|
|
testScript = ''
|
|
machine.wait_for_x()
|
|
|
|
with subtest("lomiri gallery launches"):
|
|
machine.succeed("lomiri-gallery-app >&2 &")
|
|
machine.wait_for_console_text("qq= AlbumsOverview") # logged when album page actually gets loaded
|
|
machine.sleep(10)
|
|
machine.send_key("alt-f10")
|
|
machine.sleep(5)
|
|
machine.wait_for_text(r"(Albums|Events|Photos)")
|
|
machine.screenshot("lomiri-gallery_open")
|
|
|
|
machine.succeed("pgrep -afx lomiri-gallery-app >&2")
|
|
machine.succeed("pkill -efx lomiri-gallery-app >&2")
|
|
machine.wait_until_fails("pgrep -afx lomiri-gallery-app >&2")
|
|
|
|
|
|
with subtest("lomiri gallery localisation works"):
|
|
machine.succeed("env LANG=de_DE.UTF-8 lomiri-gallery-app >&2 &")
|
|
machine.wait_for_console_text("qq= AlbumsOverview") # logged when album page actually gets loaded
|
|
machine.sleep(10)
|
|
machine.send_key("alt-f10")
|
|
machine.sleep(5)
|
|
machine.wait_for_text(r"(Alben|Ereignisse|Fotos)")
|
|
machine.screenshot("lomiri-gallery_localised")
|
|
'';
|
|
}
|
|
);
|
|
}
|
|
// makeFormatTests [
|
|
{
|
|
name = "mp4";
|
|
file = "Videos/output.MP4";
|
|
# MP4 gets special treatment
|
|
customTest = ''
|
|
with subtest("lomiri gallery handles mp4"):
|
|
machine.succeed("xdotool mousemove 935 40 click 1") # open media information
|
|
machine.sleep(2)
|
|
machine.screenshot("lomiri-gallery_mp4_info")
|
|
machine.send_key("esc")
|
|
machine.sleep(2)
|
|
|
|
machine.wait_for_text("${imageLabel}") # make sure thumbnail processing worked
|
|
machine.screenshot("lomiri-gallery_mp4_thumbnail")
|
|
|
|
machine.succeed("xdotool mousemove 510 380 click 1") # dispatch to system's video handler
|
|
machine.wait_until_succeeds("pgrep -u root -f mpv") # wait for video to start
|
|
machine.sleep(10)
|
|
machine.succeed("pgrep -u root -f mpv") # should still be playing
|
|
machine.screenshot("lomiri-gallery_mp4_dispatch")
|
|
'';
|
|
}
|
|
{
|
|
name = "gif";
|
|
file = "Pictures/output.GIF";
|
|
buttonIsOffset = false;
|
|
}
|
|
{
|
|
name = "bmp";
|
|
file = "Pictures/output.BMP";
|
|
buttonIsOffset = true;
|
|
}
|
|
{
|
|
name = "jpg";
|
|
file = "Pictures/output.JPG";
|
|
buttonIsOffset = true;
|
|
}
|
|
{
|
|
name = "png";
|
|
file = "Pictures/output.PNG";
|
|
buttonIsOffset = true;
|
|
}
|
|
]
|