jetbrains: add and improve tests (#403994)

This commit is contained in:
Leona Maroni 2025-05-24 16:04:04 +02:00 committed by GitHub
commit 2f22dc972e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 144 additions and 31 deletions

View file

@ -15,7 +15,7 @@
plugins ? [ ], plugins ? [ ],
buildNumber, buildNumber,
... ...
}: }@args:
let let
loname = lib.toLower productShort; loname = lib.toLower productShort;
@ -29,6 +29,7 @@ stdenvNoCC.mkDerivation {
; ;
passthru.buildNumber = buildNumber; passthru.buildNumber = buildNumber;
passthru.product = product; passthru.product = product;
passthru.tests = args.passthru.tests;
meta = meta // { meta = meta // {
mainProgram = loname; mainProgram = loname;
}; };

View file

@ -35,6 +35,7 @@
extraLdPath ? [ ], extraLdPath ? [ ],
extraWrapperArgs ? [ ], extraWrapperArgs ? [ ],
extraBuildInputs ? [ ], extraBuildInputs ? [ ],
...
}@args: }@args:
let let
@ -48,6 +49,7 @@ lib.makeOverridable mkDerivation (
rec { rec {
inherit pname version src; inherit pname version src;
passthru.buildNumber = buildNumber; passthru.buildNumber = buildNumber;
passthru.tests = args.passthru.tests;
meta = args.meta // { meta = args.meta // {
mainProgram = pname; mainProgram = pname;
}; };

View file

@ -77,6 +77,7 @@ let
extraWrapperArgs ? [ ], extraWrapperArgs ? [ ],
extraLdPath ? [ ], extraLdPath ? [ ],
extraBuildInputs ? [ ], extraBuildInputs ? [ ],
extraTests ? { },
}: }:
mkJetBrainsProductCore { mkJetBrainsProductCore {
inherit inherit
@ -100,6 +101,9 @@ let
inherit (ideInfo."${pname}") wmClass product; inherit (ideInfo."${pname}") wmClass product;
productShort = ideInfo."${pname}".productShort or ideInfo."${pname}".product; productShort = ideInfo."${pname}".productShort or ideInfo."${pname}".product;
meta = mkMeta ideInfo."${pname}".meta fromSource; meta = mkMeta ideInfo."${pname}".meta fromSource;
passthru.tests = extraTests // {
plugins = callPackage ./plugins/tests.nix { ideName = pname; };
};
libdbm = libdbm =
if ideInfo."${pname}".meta.isOpenSource then if ideInfo."${pname}".meta.isOpenSource then
communitySources."${pname}".libdbm communitySources."${pname}".libdbm

View file

@ -1,36 +1,135 @@
{ jetbrains, writeText }: {
jetbrains,
symlinkJoin,
lib,
runCommand,
# If not set, all IDEs are tested.
ideName ? null,
}:
let
# Known broken plugins, PLEASE remove entries here whenever possible.
broken-plugins = [
"github-copilot" # GitHub Copilot: https://github.com/NixOS/nixpkgs/issues/400317
];
ides =
if ideName == null then
with jetbrains;
[
aqua
clion
datagrip
dataspell
gateway
goland
idea-community-src
idea-community-bin
idea-ultimate
mps
phpstorm
pycharm-community-src
pycharm-community-bin
pycharm-professional
rider
ruby-mine
rust-rover
webstorm
writerside
]
else
[ (jetbrains.${ideName}) ];
in
{ {
# Check to see if the process for adding plugins is breaking anything, instead of the plugins themselves # Check to see if the process for adding plugins is breaking anything, instead of the plugins themselves
default = empty =
let let
modify-ide = ide: jetbrains.plugins.addPlugins ide [ ]; modify-ide = ide: jetbrains.plugins.addPlugins ide [ ];
ides =
with jetbrains;
map modify-ide [
clion
datagrip
dataspell
goland
idea-community
idea-ultimate
mps
phpstorm
pycharm-community
pycharm-professional
rider
ruby-mine
rust-rover
webstorm
];
paths = builtins.concatStringsSep " " ides;
in in
writeText "jb-ides" paths; symlinkJoin {
name = "jetbrains-test-plugins-empty";
paths = (map modify-ide ides);
};
idea-ce-with-plugins = jetbrains.plugins.addPlugins jetbrains.idea-community [ # Test all plugins. This will only build plugins compatible with the IDE and version. It will fail if the plugin is marked
"ideavim" # as compatible, but the build version is somehow not in the "builds" map (as that would indicate that something with update_plugins.py went wrong).
"nixidea" all =
# test JAR plugins let
"wakatime" plugins-json = builtins.fromJSON (builtins.readFile ./plugins.json);
]; plugins-for =
with lib.asserts;
ide:
builtins.map (plugin: plugin.name) (
builtins.filter (
plugin:
(
# Plugin has to not be broken
(!builtins.elem plugin.name broken-plugins)
# IDE has to be compatible
&& (builtins.elem ide.pname plugin.compatible)
# Assert: The build number needs to be included (if marked compatible)
&& (assertMsg (builtins.elem ide.buildNumber (builtins.attrNames plugin.builds)) "For plugin ${plugin.name} no entry for IDE build ${ide.buildNumber} is defined, even though ${ide.pname} is on that build.")
# The plugin has to exist for the build
&& (plugin.builds.${ide.buildNumber} != null)
)
) (builtins.attrValues plugins-json.plugins)
);
modify-ide = ide: jetbrains.plugins.addPlugins ide (plugins-for ide);
in
symlinkJoin {
name = "jetbrains-test-plugins-all";
paths = (map modify-ide ides);
};
# This test builds the IDEs with some plugins and checks that they can be discovered by the IDE.
# Test always succeeds on IDEs that the tested plugins don't support.
stored-correctly =
let
plugins-json = builtins.fromJSON (builtins.readFile ./plugins.json);
plugin-ids = [
# This is a "normal plugin", it's output must be linked into /${pname}/plugins.
"8607" # nixidea
# This is a plugin where the output contains a single JAR file. This JAR file needs to be linked directly in /${pname}/plugins.
"7425" # wakatime
];
check-if-supported =
ide:
builtins.all (
plugin:
(builtins.elem ide.pname plugins-json.plugins.${plugin}.compatible)
&& (plugins-json.plugins.${plugin}.builds.${ide.buildNumber} != null)
) plugin-ids;
modify-ide = ide: jetbrains.plugins.addPlugins ide plugin-ids;
in
runCommand "test-jetbrains-plugins-stored-correctly"
{
idePaths = (map modify-ide (builtins.filter check-if-supported ides));
}
# TODO: instead of globbing using $ide/*/plugins we could probably somehow get the package name here properly.
''
set -e
exec &> >(tee -a "$out")
IFS=' ' read -ra ideArray <<< "$idePaths"
for ide in "''${ideArray[@]}"; do
echo "processing $ide"
echo "> ensure normal plugin is available"
(
set -x
find -L $ide/*/plugins -type f -iname 'NixIDEA-*.jar' | grep .
)
echo "> ensure single JAR file plugin is available"
(
set -x
PATH_TO_LINK=$(find $ide/*/plugins -maxdepth 1 -type l -iname '*wakatime.jar' | grep .)
test -f $(readlink $PATH_TO_LINK)
)
echo ""
done
echo "test done! ok!"
'';
} }

View file

@ -1,12 +1,19 @@
This directory contains the build expressions needed to build any of the jetbrains IDEs. This directory contains the build expressions needed to build any of the jetbrains IDEs.
The jdk is in `pkgs/development/compilers/jetbrains-jdk`. The jdk is in `pkgs/development/compilers/jetbrains-jdk`.
To test the build process of every IDE (as well as the process for adding plugins), build `jetbrains.plugins.tests.default`.
## Tests:
- To test the build process of every IDE (as well as the process for adding plugins), build `jetbrains.plugins.tests.empty`.
- To test the build process with all plugins\* supported by all IDEs, build `jetbrains.plugins.tests.all`.
- To test only plugins for a specific IDE\*, build `jetbrains.ide-name.tests.plugins.all`.
- To test that plugins are correctly stored in the plugins directory, build `jetbrains.plugins.tests.stored-correctly`.
\*: Plugins marked as broken in nixpkgs are skipped: When updating/fixing plugins, please check the `broken-plugins` in `plugins/tests.nix` and update it if needed.
## How to use plugins: ## How to use plugins:
- Get the ide you want and call `jetbrains.plugins.addPlugins` with a list of plugins you want to add. - Get the ide you want and call `jetbrains.plugins.addPlugins` with a list of plugins you want to add.
- The list of plugins can be a list of ids or names (as in `plugins/plugins.json`) - The list of plugins can be a list of ids or names (as in `plugins/plugins.json`)
- Example: `jetbrains.plugins.addPlugins jetbrains.pycharm-professional [ "nixidea" ]` - Example: `jetbrains.plugins.addPlugins jetbrains.pycharm-professional [ "nixidea" ]`
- The list can also contain a drv giving a `.jar` or `.zip` (this is how you use a plugin not added to nixpkgs) - The list can also contain drvs giving the directory contents of the plugin (this is how you use a plugin not added to nixpkgs) or a single `.jar` (executable). For an example, look at the implementation of `fetchPluginSrc` in `plugins/default.nix`.
### How to add a new plugin to nixpkgs ### How to add a new plugin to nixpkgs
- Find the page for the plugin on https://plugins.jetbrains.com - Find the page for the plugin on https://plugins.jetbrains.com