Skip to content

Commit

Permalink
wrapGAppsHook: add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
jtojnar committed Jul 23, 2020
1 parent 69b8997 commit 49b89af
Show file tree
Hide file tree
Showing 3 changed files with 202 additions and 0 deletions.
142 changes: 142 additions & 0 deletions pkgs/build-support/setup-hooks/wrap-gapps-hook/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@
, lib
, makeSetupHook
, makeWrapper
, gobject-introspection
, gtk3
, librsvg
, dconf
, callPackage
, wrapGAppsHook
, writeTextFile
}:

makeSetupHook {
Expand All @@ -13,4 +17,142 @@ makeSetupHook {
librsvg
makeWrapper
];
substitutions = {
passthru.tests = let
sample-project = ./tests/sample-project;

testLib = callPackage ./tests/lib.nix { };
inherit (testLib) expectSomeLineContainingYInFileXToMentionZ;
in rec {
# Simple derivation containing a program and a daemon.
basic = stdenv.mkDerivation {
name = "basic";

src = sample-project;

nativeBuildInputs = [ wrapGAppsHook ];

installFlags = [ "bin-foo" "libexec-bar" ];
};

# The wrapper for executable files should add path to dconf GIO module.
basic-contains-dconf = let
tested = basic;
in testLib.runTest "basic-contains-dconf" (
testLib.skip stdenv.isDarwin ''
${expectSomeLineContainingYInFileXToMentionZ "${tested}/bin/foo" "GIO_EXTRA_MODULES=" "${dconf.lib}/lib/gio/modules"}
${expectSomeLineContainingYInFileXToMentionZ "${tested}/libexec/bar" "GIO_EXTRA_MODULES=" "${dconf.lib}/lib/gio/modules"}
''
);

# Simple derivation containing a gobject-introspection typelib.
typelib-Mahjong = stdenv.mkDerivation {
name = "typelib-Mahjong";

src = sample-project;

installFlags = [ "typelib-Mahjong" ];
};

# Simple derivation using a typelib.
typelib-user = stdenv.mkDerivation {
name = "typelib-user";

src = sample-project;

nativeBuildInputs = [
gobject-introspection
wrapGAppsHook
];

buildInputs = [
typelib-Mahjong
];

installFlags = [ "bin-foo" "libexec-bar" ];
};

# Testing cooperation with gobject-introspection setup hook,
# which should populate GI_TYPELIB_PATH variable with paths
# to typelibs among the derivation’s dependencies.
# The resulting GI_TYPELIB_PATH should be picked up by the wrapper.
typelib-user-has-gi-typelib-path = let
tested = typelib-user;
in testLib.runTest "typelib-user-has-gi-typelib-path" ''
${expectSomeLineContainingYInFileXToMentionZ "${tested}/bin/foo" "GI_TYPELIB_PATH=" "${typelib-Mahjong}/lib/girepository-1.0"}
${expectSomeLineContainingYInFileXToMentionZ "${tested}/libexec/bar" "GI_TYPELIB_PATH=" "${typelib-Mahjong}/lib/girepository-1.0"}
'';

# Simple derivation containing a gobject-introspection typelib in lib output.
typelib-Bechamel = stdenv.mkDerivation {
name = "typelib-Bechamel";

outputs = [ "out" "lib" ];

src = sample-project;

makeFlags = [
"LIBDIR=${placeholder "lib"}/lib"
];

installFlags = [ "typelib-Bechamel" ];
};

# Simple derivation using a typelib from non-default output.
typelib-multiout-user = stdenv.mkDerivation {
name = "typelib-multiout-user";

src = sample-project;

nativeBuildInputs = [
gobject-introspection
wrapGAppsHook
];

buildInputs = [
typelib-Bechamel
];

installFlags = [ "bin-foo" "libexec-bar" ];
};

# Testing cooperation with gobject-introspection setup hook,
# which should populate GI_TYPELIB_PATH variable with paths
# to typelibs among the derivation’s dependencies,
# even when they are not in default output.
# The resulting GI_TYPELIB_PATH should be picked up by the wrapper.
typelib-multiout-user-has-gi-typelib-path = let
tested = typelib-multiout-user;
in testLib.runTest "typelib-multiout-user-has-gi-typelib-path" ''
${expectSomeLineContainingYInFileXToMentionZ "${tested}/bin/foo" "GI_TYPELIB_PATH=" "${typelib-Bechamel.lib}/lib/girepository-1.0"}
${expectSomeLineContainingYInFileXToMentionZ "${tested}/libexec/bar" "GI_TYPELIB_PATH=" "${typelib-Bechamel.lib}/lib/girepository-1.0"}
'';

# Simple derivation that contains a typelib as well as a program using it.
typelib-self-user = stdenv.mkDerivation {
name = "typelib-self-user";

src = sample-project;

nativeBuildInputs = [
gobject-introspection
wrapGAppsHook
];

installFlags = [ "typelib-Cow" "bin-foo" "libexec-bar" ];
};

# Testing cooperation with gobject-introspection setup hook,
# which should add the path to derivation’s own typelibs
# to GI_TYPELIB_PATH variable.
# The resulting GI_TYPELIB_PATH should be picked up by the wrapper.
# https://github.com/NixOS/nixpkgs/issues/85515
typelib-self-user-has-gi-typelib-path = let
tested = typelib-self-user;
in testLib.runTest "typelib-self-user-has-gi-typelib-path" ''
${expectSomeLineContainingYInFileXToMentionZ "${tested}/bin/foo" "GI_TYPELIB_PATH=" "${typelib-self-user}/lib/girepository-1.0"}
${expectSomeLineContainingYInFileXToMentionZ "${tested}/libexec/bar" "GI_TYPELIB_PATH=" "${typelib-self-user}/lib/girepository-1.0"}
'';
};
};
} ./wrap-gapps-hook.sh
30 changes: 30 additions & 0 deletions pkgs/build-support/setup-hooks/wrap-gapps-hook/tests/lib.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{ runCommand
}:

rec {
runTest = name: body: runCommand name { } ''
set -o errexit
${body}
touch $out
'';

skip = cond: text:
if cond then ''
echo "Skipping test $name" > /dev/stderr
'' else text;

fail = text: ''
echo "FAIL: $name: ${text}" > /dev/stderr
exit 1
'';

expectSomeLineContainingYInFileXToMentionZ = file: filter: expected: ''
if ! cat "${file}" | grep "${filter}"; then
${fail "The file “${file}” should include a line containing “${filter}”."}
fi
if ! cat "${file}" | grep "${filter}" | grep ${expected}; then
${fail "The file “${file}” should include a line containing “${filter}” that also contains “${expected}”."}
fi
'';
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
PREFIX = $(out)
BINDIR = $(PREFIX)/bin
LIBEXECDIR = $(PREFIX)/libexec
LIBDIR = $(PREFIX)/lib
TYPELIBDIR = $(LIBDIR)/girepository-1.0

all:
echo "Compiling…"
install:
echo "Installing…"

bin:
mkdir -p $(BINDIR)
# Adds `bin-${foo}` targets, that install `${foo}` executable to `$(BINDIR)`.
bin-%: bin
touch $(BINDIR)/$(@:bin-%=%)
chmod +x $(BINDIR)/$(@:bin-%=%)

libexec:
mkdir -p $(LIBEXECDIR)
# Adds `libexec-${foo}` targets, that install `${foo}` executable to `$(LIBEXECDIR)`.
libexec-%: libexec
touch $(LIBEXECDIR)/$(@:libexec-%=%)
chmod +x $(LIBEXECDIR)/$(@:libexec-%=%)

typelib:
mkdir -p $(TYPELIBDIR)
# Adds `typelib-${foo}` targets, that install `${foo}-1.0.typelib` file to `$(TYPELIBDIR)`.
typelib-%: typelib
touch $(TYPELIBDIR)/$(@:typelib-%=%)-1.0.typelib

0 comments on commit 49b89af

Please sign in to comment.