aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRobert Hensing <roberth@users.noreply.github.com>2023-08-14 16:53:39 +0200
committerGitHub <noreply@github.com>2023-08-14 16:53:39 +0200
commit5542c1f87ee3325bce8140f4087b12647b4107ef (patch)
treef5357a28c7399a7c92fef2932947ad680010c929 /tests
parent584ff408a4e2b6eb0d74989778c640a92089b6d4 (diff)
parent44c8d83831e310d445493d7071161c622bc302aa (diff)
Merge pull request #8813 from obsidiansystems/outputOf
Create (experimental) `outputOf` primop.
Diffstat (limited to 'tests')
-rw-r--r--tests/dyn-drv/dep-built-drv.sh9
-rw-r--r--tests/dyn-drv/eval-outputOf.sh80
-rw-r--r--tests/dyn-drv/local.mk4
-rw-r--r--tests/dyn-drv/recursive-mod-json.sh2
-rw-r--r--tests/dyn-drv/text-hashed-output.nix10
5 files changed, 101 insertions, 4 deletions
diff --git a/tests/dyn-drv/dep-built-drv.sh b/tests/dyn-drv/dep-built-drv.sh
new file mode 100644
index 000000000..8c4a45e3b
--- /dev/null
+++ b/tests/dyn-drv/dep-built-drv.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+source common.sh
+
+out1=$(nix-build ./text-hashed-output.nix -A hello --no-out-link)
+
+clearStore
+
+expectStderr 1 nix-build ./text-hashed-output.nix -A wrapper --no-out-link | grepQuiet "Dependencies on the outputs of dynamic derivations are not yet supported"
diff --git a/tests/dyn-drv/eval-outputOf.sh b/tests/dyn-drv/eval-outputOf.sh
new file mode 100644
index 000000000..99d917c06
--- /dev/null
+++ b/tests/dyn-drv/eval-outputOf.sh
@@ -0,0 +1,80 @@
+#!/usr/bin/env bash
+
+source ./common.sh
+
+# Without the dynamic-derivations XP feature, we don't have the builtin.
+nix --experimental-features 'nix-command' eval --impure --expr \
+ 'assert ! (builtins ? outputOf); ""'
+
+# Test that a string is required.
+#
+# We currently require a string to be passed, rather than a derivation
+# object that could be coerced to a string. We might liberalise this in
+# the future so it does work, but there are some design questions to
+# resolve first. Adding a test so we don't liberalise it by accident.
+expectStderr 1 nix --experimental-features 'nix-command dynamic-derivations' eval --impure --expr \
+ 'builtins.outputOf (import ../dependencies.nix) "out"' \
+ | grepQuiet "value is a set while a string was expected"
+
+# Test that "DrvDeep" string contexts are not supported at this time
+#
+# Like the above, this is a restriction we could relax later.
+expectStderr 1 nix --experimental-features 'nix-command dynamic-derivations' eval --impure --expr \
+ 'builtins.outputOf (import ../dependencies.nix).drvPath "out"' \
+ | grepQuiet "has a context which refers to a complete source and binary closure. This is not supported at this time"
+
+# Test using `builtins.outputOf` with static derivations
+testStaticHello () {
+ nix eval --impure --expr \
+ 'with (import ./text-hashed-output.nix); let
+ a = hello.outPath;
+ b = builtins.outputOf (builtins.unsafeDiscardOutputDependency hello.drvPath) "out";
+ in builtins.trace a
+ (builtins.trace b
+ (assert a == b; null))'
+}
+
+# Test with a regular old input-addresed derivation
+#
+# `builtins.outputOf` works without ca-derivations and doesn't create a
+# placeholder but just returns the output path.
+testStaticHello
+
+# Test with content addressed derivation.
+NIX_TESTS_CA_BY_DEFAULT=1 testStaticHello
+
+# Test with derivation-producing derivation
+#
+# This is hardly different from the preceding cases, except that we're
+# only taking 1 outputOf out of 2 possible outputOfs. Note that
+# `.outPath` could be defined as `outputOf drvPath`, which is what we're
+# testing here. The other `outputOf` that we're not testing here is the
+# use of _dynamic_ derivations.
+nix eval --impure --expr \
+ 'with (import ./text-hashed-output.nix); let
+ a = producingDrv.outPath;
+ b = builtins.outputOf (builtins.builtins.unsafeDiscardOutputDependency producingDrv.drvPath) "out";
+ in builtins.trace a
+ (builtins.trace b
+ (assert a == b; null))'
+
+# Test with unbuilt output of derivation-producing derivation.
+#
+# This function similar to `testStaticHello` used above, but instead of
+# checking the property on a constant derivation, we check it on a
+# derivation that's from another derivation's output (outPath).
+testDynamicHello () {
+ nix eval --impure --expr \
+ 'with (import ./text-hashed-output.nix); let
+ a = builtins.outputOf producingDrv.outPath "out";
+ b = builtins.outputOf (builtins.outputOf (builtins.unsafeDiscardOutputDependency producingDrv.drvPath) "out") "out";
+ in builtins.trace a
+ (builtins.trace b
+ (assert a == b; null))'
+}
+
+# inner dynamic derivation is input-addressed
+testDynamicHello
+
+# inner dynamic derivation is content-addressed
+NIX_TESTS_CA_BY_DEFAULT=1 testDynamicHello
diff --git a/tests/dyn-drv/local.mk b/tests/dyn-drv/local.mk
index b087ecd1c..0ce7cd37d 100644
--- a/tests/dyn-drv/local.mk
+++ b/tests/dyn-drv/local.mk
@@ -1,7 +1,9 @@
dyn-drv-tests := \
$(d)/text-hashed-output.sh \
$(d)/recursive-mod-json.sh \
- $(d)/build-built-drv.sh
+ $(d)/build-built-drv.sh \
+ $(d)/eval-outputOf.sh \
+ $(d)/dep-built-drv.sh
install-tests-groups += dyn-drv
diff --git a/tests/dyn-drv/recursive-mod-json.sh b/tests/dyn-drv/recursive-mod-json.sh
index 070c5c2cb..0698b81bd 100644
--- a/tests/dyn-drv/recursive-mod-json.sh
+++ b/tests/dyn-drv/recursive-mod-json.sh
@@ -3,6 +3,8 @@ source common.sh
# FIXME
if [[ $(uname) != Linux ]]; then skipTest "Not running Linux"; fi
+export NIX_TESTS_CA_BY_DEFAULT=1
+
enableFeatures 'recursive-nix'
restartDaemon
diff --git a/tests/dyn-drv/text-hashed-output.nix b/tests/dyn-drv/text-hashed-output.nix
index a700fd102..99203b518 100644
--- a/tests/dyn-drv/text-hashed-output.nix
+++ b/tests/dyn-drv/text-hashed-output.nix
@@ -12,9 +12,6 @@ rec {
mkdir -p $out
echo "Hello World" > $out/hello
'';
- __contentAddressed = true;
- outputHashMode = "recursive";
- outputHashAlgo = "sha256";
};
producingDrv = mkDerivation {
name = "hello.drv";
@@ -26,4 +23,11 @@ rec {
outputHashMode = "text";
outputHashAlgo = "sha256";
};
+ wrapper = mkDerivation {
+ name = "use-dynamic-drv-in-non-dynamic-drv";
+ buildCommand = ''
+ echo "Copying the output of the dynamic derivation"
+ cp -r ${builtins.outputOf producingDrv.outPath "out"} $out
+ '';
+ };
}