0
0
mirror of https://github.com/cucumber-sp/yandex-music-linux.git synced 2025-09-28 01:29:03 +03:00

nix: introduce tests

Introduce set of tests based on NixOS test framework.
This commit is contained in:
Yury Shvedov
2025-03-09 16:13:18 +03:00
parent d45af61f82
commit 30847e331a
6 changed files with 218 additions and 9 deletions

View File

@@ -1,6 +1,7 @@
{
yandex-music-with,
isHm ? false,
isTest ? false,
}:
{
lib,
@@ -13,14 +14,18 @@ let
in
{
/*
The NixOS test framework disallow to extend `nixpkgs.overlays` configuration
option, so we make it here conditionally.
*/
imports = [
{
(lib.mkIf (!isTest) {
nixpkgs.overlays = [
(final: prev: {
yandex-music = yandex-music-with prev;
})
];
}
})
];
options = {

62
nix/test-suite.nix Normal file
View File

@@ -0,0 +1,62 @@
/*
This test suite uses nixos common x11 and user-account test configurations.
Those configurations use auto-login to ice-wm desktop manager.
This test configuration enables yandex-music application, launches it and
check for window existence. Additionally it takes screenshot after successful
launch to allow to validate state manually. The result may miss the content
inside window because of lack of GPU support.
TODO(Shvedov): We should to perform automatic checks of screen state.
*/
{
testers,
path,
# The yandex-music module
nixosModule,
# The extra configuration
configuration ? { },
# The extra code of test script
extraTestScript ? "",
# The name of test
name ? "yandex-music-test",
}:
testers.runNixOSTest {
inherit name;
nodes.machine =
let
tests = "${path}/nixos/tests/common/";
user = "alice";
in
{
imports = [
nixosModule
"${tests}/x11.nix"
"${tests}/user-account.nix"
configuration
];
test-support.displayManager.auto.user = user;
programs.yandex-music.enable = true;
};
testScript =
''
# We have to execute command with su beckause all commands performs under
# the root user.
def mk_command(command, tail = "", fork = False):
if fork:
tail = f"{tail} >&2 &"
return f"su -c '{command}' - alice {tail}"
machine.wait_for_x()
machine.execute(mk_command("yandex-music", fork = True))
check_command = mk_command('xwininfo -root -tree', tail = "| grep 'Яндекс Музыка'")
machine.wait_until_succeeds(check_command, 120)
machine.sleep(40)
machine.succeed(check_command)
machine.screenshot("screen")
''
+ extraTestScript;
}

81
nix/test.nix Normal file
View File

@@ -0,0 +1,81 @@
/*
This is set of tests of yandex-music application. The main purpose of this
test is to check the NixOS module for yandex-music and whether its runs
successfully with such configuration.
*/
{
pkgs,
yandex-music-with,
nixosModule,
linkFarm,
lib,
}:
let
# Extend packages with our package to overcome the limitation of nixOSTest
# modules regarding the overlays.
pkgs' = pkgs.extend (cur: prev: { yandex-music = yandex-music-with prev; });
removeNameAttr = attrs: lib.removeAttrs attrs [ "name" ];
test-suite =
{
name ? "yandex-music-test",
...
}@configuration:
pkgs'.callPackage ./test-suite.nix {
inherit nixosModule name;
configuration = removeNameAttr configuration;
};
yandex-music-config = cfg: {
programs.yandex-music = cfg;
};
yandex-music-test-suite =
{
name,
...
}@cfg:
test-suite (
(yandex-music-config (removeNameAttr cfg))
// {
name = "yandex-music-test-${name}";
}
);
/*
This is set of similar tests with slightly different configuration options
for yandex-music module. All they will be joined together to package with
symlinks to all results.
*/
tests = {
base = test-suite { };
trayDefault = yandex-music-test-suite {
tray.enable = true;
name = "tray-default";
};
trayAlways = yandex-music-test-suite {
tray.enable = true;
tray.always = true;
name = "tray-always";
};
trayMonoBlack = yandex-music-test-suite {
tray.enable = true;
tray.style = 2;
name = "tray-mono-black";
};
trayMonoWhite = yandex-music-test-suite {
tray.enable = true;
tray.style = 3;
name = "tray-mono-white";
};
devTools = yandex-music-test-suite {
devTools.enable = true;
name = "dev-tools";
};
customTitleBar = yandex-music-test-suite {
customTitleBar.enable = true;
name = "custom-title-bar";
};
animatiosFpsZero = yandex-music-test-suite {
vibeAnimationMaxFps = 0;
name = "animation-fps-zero";
};
};
in
(linkFarm "yandex-music-test-all" tests) // tests