about summary refs log tree commit diff
path: root/nixos/tests/replace-dependencies/guest.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixos/tests/replace-dependencies/guest.nix')
-rw-r--r--nixos/tests/replace-dependencies/guest.nix149
1 files changed, 149 insertions, 0 deletions
diff --git a/nixos/tests/replace-dependencies/guest.nix b/nixos/tests/replace-dependencies/guest.nix
new file mode 100644
index 000000000000..f022f1728599
--- /dev/null
+++ b/nixos/tests/replace-dependencies/guest.nix
@@ -0,0 +1,149 @@
+# This needs to be run in a NixOS test, because Hydra cannot do IFD.
+let
+  pkgs = import ../../.. { };
+  inherit (pkgs)
+    runCommand
+    writeShellScriptBin
+    replaceDependency
+    replaceDependencies
+    ;
+  inherit (pkgs.lib) escapeShellArg;
+  mkCheckOutput =
+    name: test: output:
+    runCommand name { } ''
+      actualOutput="$(${escapeShellArg "${test}/bin/test"})"
+      if [ "$(${escapeShellArg "${test}/bin/test"})" != ${escapeShellArg output} ]; then
+        echo >&2 "mismatched output: expected \""${escapeShellArg output}"\", got \"$actualOutput\""
+        exit 1
+      fi
+      touch "$out"
+    '';
+  oldDependency = writeShellScriptBin "dependency" ''
+    echo "got old dependency"
+  '';
+  oldDependency-ca = oldDependency.overrideAttrs { __contentAddressed = true; };
+  newDependency = writeShellScriptBin "dependency" ''
+    echo "got new dependency"
+  '';
+  newDependency-ca = newDependency.overrideAttrs { __contentAddressed = true; };
+  basic = writeShellScriptBin "test" ''
+    ${oldDependency}/bin/dependency
+  '';
+  basic-ca = writeShellScriptBin "test" ''
+    ${oldDependency-ca}/bin/dependency
+  '';
+  transitive = writeShellScriptBin "test" ''
+    ${basic}/bin/test
+  '';
+  weirdDependency = writeShellScriptBin "dependency" ''
+    echo "got weird dependency"
+    ${basic}/bin/test
+  '';
+  oldDependency1 = writeShellScriptBin "dependency1" ''
+    echo "got old dependency 1"
+  '';
+  newDependency1 = writeShellScriptBin "dependency1" ''
+    echo "got new dependency 1"
+  '';
+  oldDependency2 = writeShellScriptBin "dependency2" ''
+    ${oldDependency1}/bin/dependency1
+      echo "got old dependency 2"
+  '';
+  newDependency2 = writeShellScriptBin "dependency2" ''
+    ${oldDependency1}/bin/dependency1
+      echo "got new dependency 2"
+  '';
+  deep = writeShellScriptBin "test" ''
+    ${oldDependency2}/bin/dependency2
+  '';
+in
+{
+  replacedependency-basic = mkCheckOutput "replacedependency-basic" (replaceDependency {
+    drv = basic;
+    inherit oldDependency newDependency;
+  }) "got new dependency";
+
+  replacedependency-basic-old-ca = mkCheckOutput "replacedependency-basic" (replaceDependency {
+    drv = basic-ca;
+    oldDependency = oldDependency-ca;
+    inherit newDependency;
+  }) "got new dependency";
+
+  replacedependency-basic-new-ca = mkCheckOutput "replacedependency-basic" (replaceDependency {
+    drv = basic;
+    inherit oldDependency;
+    newDependency = newDependency-ca;
+  }) "got new dependency";
+
+  replacedependency-transitive = mkCheckOutput "replacedependency-transitive" (replaceDependency {
+    drv = transitive;
+    inherit oldDependency newDependency;
+  }) "got new dependency";
+
+  replacedependency-weird =
+    mkCheckOutput "replacedependency-weird"
+      (replaceDependency {
+        drv = basic;
+        inherit oldDependency;
+        newDependency = weirdDependency;
+      })
+      ''
+        got weird dependency
+        got old dependency'';
+
+  replacedependencies-precedence = mkCheckOutput "replacedependencies-precedence" (replaceDependencies
+    {
+      drv = basic;
+      replacements = [ { inherit oldDependency newDependency; } ];
+      cutoffPackages = [ oldDependency ];
+    }
+  ) "got new dependency";
+
+  replacedependencies-self = mkCheckOutput "replacedependencies-self" (replaceDependencies {
+    drv = basic;
+    replacements = [
+      {
+        inherit oldDependency;
+        newDependency = oldDependency;
+      }
+    ];
+  }) "got old dependency";
+
+  replacedependencies-deep-order1 =
+    mkCheckOutput "replacedependencies-deep-order1"
+      (replaceDependencies {
+        drv = deep;
+        replacements = [
+          {
+            oldDependency = oldDependency1;
+            newDependency = newDependency1;
+          }
+          {
+            oldDependency = oldDependency2;
+            newDependency = newDependency2;
+          }
+        ];
+      })
+      ''
+        got new dependency 1
+        got new dependency 2'';
+
+  replacedependencies-deep-order2 =
+    mkCheckOutput "replacedependencies-deep-order2"
+      (replaceDependencies {
+        drv = deep;
+        replacements = [
+          {
+            oldDependency = oldDependency2;
+            newDependency = newDependency2;
+          }
+          {
+            oldDependency = oldDependency1;
+            newDependency = newDependency1;
+          }
+        ];
+      })
+      ''
+        got new dependency 1
+        got new dependency 2'';
+}