From 229fdf0cf29b057503d2ba1c99d78650c209bd48 Mon Sep 17 00:00:00 2001 From: Connor Baker Date: Tue, 21 Jan 2025 16:29:28 -0800 Subject: [PATCH] test.stdenv.hooks.no-broken-symlinks: init --- pkgs/test/stdenv/hooks.nix | 1 + pkgs/test/stdenv/no-broken-symlinks.nix | 123 ++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 pkgs/test/stdenv/no-broken-symlinks.nix diff --git a/pkgs/test/stdenv/hooks.nix b/pkgs/test/stdenv/hooks.nix index 6a419ab51e5d..83e82b77b24b 100644 --- a/pkgs/test/stdenv/hooks.nix +++ b/pkgs/test/stdenv/hooks.nix @@ -97,6 +97,7 @@ [[ -e $out/bin/foo ]] ''; }; + no-broken-symlinks = import ./no-broken-symlinks.nix { inherit stdenv lib pkgs; }; # TODO: add multiple-outputs patch-shebangs = import ./patch-shebangs.nix { inherit stdenv lib pkgs; }; prune-libtool-files = diff --git a/pkgs/test/stdenv/no-broken-symlinks.nix b/pkgs/test/stdenv/no-broken-symlinks.nix new file mode 100644 index 000000000000..85963542a04a --- /dev/null +++ b/pkgs/test/stdenv/no-broken-symlinks.nix @@ -0,0 +1,123 @@ +{ + lib, + pkgs, + stdenv, +}: + +let + inherit (lib.strings) concatStringsSep; + inherit (pkgs) runCommand; + inherit (pkgs.testers) testBuildFailure; + + mkDanglingSymlink = '' + ln -sr "$out/dangling" "$out/dangling-symlink" + ''; + + mkReflexiveSymlink = '' + ln -sr "$out/reflexive-symlink" "$out/reflexive-symlink" + ''; + + mkValidSymlink = '' + touch "$out/valid" + ln -sr "$out/valid" "$out/valid-symlink" + ''; + + testBuilder = + { + name, + commands ? [ ], + derivationArgs ? { }, + }: + stdenv.mkDerivation ( + { + inherit name; + strictDeps = true; + dontUnpack = true; + dontPatch = true; + dontConfigure = true; + dontBuild = true; + installPhase = + '' + mkdir -p "$out" + + '' + + concatStringsSep "\n" commands; + } + // derivationArgs + ); +in +{ + # Dangling symlinks (allowDanglingSymlinks) + fail-dangling-symlink = + runCommand "fail-dangling-symlink" + { + failed = testBuildFailure (testBuilder { + name = "fail-dangling-symlink-inner"; + commands = [ mkDanglingSymlink ]; + }); + } + '' + (( 1 == "$(cat "$failed/testBuildFailure.exit")" )) + grep -F 'found 1 dangling symlinks and 0 reflexive symlinks' "$failed/testBuildFailure.log" + touch $out + ''; + + pass-dangling-symlink-allowed = testBuilder { + name = "pass-symlink-dangling-allowed"; + commands = [ mkDanglingSymlink ]; + derivationArgs.allowDanglingSymlinks = true; + }; + + # Reflexive symlinks (allowReflexiveSymlinks) + fail-reflexive-symlink = + runCommand "fail-reflexive-symlink" + { + failed = testBuildFailure (testBuilder { + name = "fail-reflexive-symlink-inner"; + commands = [ mkReflexiveSymlink ]; + }); + } + '' + (( 1 == "$(cat "$failed/testBuildFailure.exit")" )) + grep -F 'found 0 dangling symlinks and 1 reflexive symlinks' "$failed/testBuildFailure.log" + touch $out + ''; + + pass-reflexive-symlink-allowed = testBuilder { + name = "pass-reflexive-symlink-allowed"; + commands = [ mkReflexiveSymlink ]; + derivationArgs.allowReflexiveSymlinks = true; + }; + + # Global (dontCheckForBrokenSymlinks) + fail-broken-symlinks = + runCommand "fail-broken-symlinks" + { + failed = testBuildFailure (testBuilder { + name = "fail-broken-symlinks-inner"; + commands = [ + mkDanglingSymlink + mkReflexiveSymlink + ]; + }); + } + '' + (( 1 == "$(cat "$failed/testBuildFailure.exit")" )) + grep -F 'found 1 dangling symlinks and 1 reflexive symlinks' "$failed/testBuildFailure.log" + touch $out + ''; + + pass-broken-symlinks-allowed = testBuilder { + name = "fail-broken-symlinks-allowed"; + commands = [ + mkDanglingSymlink + mkReflexiveSymlink + ]; + derivationArgs.dontCheckForBrokenSymlinks = true; + }; + + pass-valid-symlink = testBuilder { + name = "pass-valid-symlink"; + commands = [ mkValidSymlink ]; + }; +}