aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/derivations.scm85
1 files changed, 83 insertions, 2 deletions
diff --git a/tests/derivations.scm b/tests/derivations.scm
index 684dac4d6f..7fde2ef2a2 100644
--- a/tests/derivations.scm
+++ b/tests/derivations.scm
@@ -129,7 +129,8 @@
(hash (sha256 (string->utf8 "hello")))
(drv-path (derivation %store "fixed" (%current-system)
"/bin/sh" `(,builder)
- '() `((,builder))
+ '()
+ `((,builder)) ; optional
#:hash hash #:hash-algo 'sha256))
(succeeded? (build-derivations %store (list drv-path))))
(and succeeded?
@@ -138,6 +139,62 @@
(call-with-input-file p get-bytevector-all))
(bytevector? (query-path-hash %store p)))))))
+(test-assert "fixed-output derivation: output paths are equal"
+ (let* ((builder1 (add-text-to-store %store "fixed-builder1.sh"
+ "echo -n hello > $out" '()))
+ (builder2 (add-text-to-store %store "fixed-builder2.sh"
+ "echo hey; echo -n hello > $out" '()))
+ (hash (sha256 (string->utf8 "hello")))
+ (drv-path1 (derivation %store "fixed" (%current-system)
+ "/bin/sh" `(,builder1)
+ '() `()
+ #:hash hash #:hash-algo 'sha256))
+ (drv-path2 (derivation %store "fixed" (%current-system)
+ "/bin/sh" `(,builder2)
+ '() `()
+ #:hash hash #:hash-algo 'sha256))
+ (succeeded? (build-derivations %store
+ (list drv-path1 drv-path2))))
+ (and succeeded?
+ (equal? (derivation-path->output-path drv-path1)
+ (derivation-path->output-path drv-path2)))))
+
+(test-assert "derivation with a fixed-output input"
+ ;; A derivation D using a fixed-output derivation F doesn't has the same
+ ;; output path when passed F or F', as long as F and F' have the same output
+ ;; path.
+ (let* ((builder1 (add-text-to-store %store "fixed-builder1.sh"
+ "echo -n hello > $out" '()))
+ (builder2 (add-text-to-store %store "fixed-builder2.sh"
+ "echo hey; echo -n hello > $out" '()))
+ (hash (sha256 (string->utf8 "hello")))
+ (fixed1 (derivation %store "fixed" (%current-system)
+ "/bin/sh" `(,builder1)
+ '() `()
+ #:hash hash #:hash-algo 'sha256))
+ (fixed2 (derivation %store "fixed" (%current-system)
+ "/bin/sh" `(,builder2)
+ '() `()
+ #:hash hash #:hash-algo 'sha256))
+ (fixed-out (derivation-path->output-path fixed1))
+ (builder3 (add-text-to-store
+ %store "final-builder.sh"
+ ;; Use Bash hackery to avoid Coreutils.
+ "echo $in ; (read -u 3 c; echo $c) 3< $in > $out" '()))
+ (final1 (derivation %store "final" (%current-system)
+ "/bin/sh" `(,builder3)
+ `(("in" . ,fixed-out))
+ `((,builder3) (,fixed1))))
+ (final2 (derivation %store "final" (%current-system)
+ "/bin/sh" `(,builder3)
+ `(("in" . ,fixed-out))
+ `((,builder3) (,fixed2))))
+ (succeeded? (build-derivations %store
+ (list final1 final2))))
+ (and succeeded?
+ (equal? (derivation-path->output-path final1)
+ (derivation-path->output-path final2)))))
+
(test-assert "multiple-output derivation"
(let* ((builder (add-text-to-store %store "my-fixed-builder.sh"
"echo one > $out ; echo two > $second"
@@ -235,7 +292,7 @@
(and (valid-path? %store p)
(file-exists? (string-append p "/good")))))))
-(test-skip (if (%guile-for-build) 0 6))
+(test-skip (if (%guile-for-build) 0 7))
(test-assert "build-expression->derivation and derivation-prerequisites"
(let-values (((drv-path drv)
@@ -378,6 +435,30 @@
(and succeeded?
(file-exists? (derivation-path->output-path drv-path)))))
+(test-assert "build-expression->derivation: same fixed-output path"
+ (let* ((builder1 '(call-with-output-file %output
+ (lambda (p)
+ (write "hello" p))))
+ (builder2 '(call-with-output-file (pk 'difference-here! %output)
+ (lambda (p)
+ (write "hello" p))))
+ (hash (sha256 (string->utf8 "hello")))
+ (input1 (build-expression->derivation %store "fixed"
+ (%current-system)
+ builder1 '()
+ #:hash hash
+ #:hash-algo 'sha256))
+ (input2 (build-expression->derivation %store "fixed"
+ (%current-system)
+ builder2 '()
+ #:hash hash
+ #:hash-algo 'sha256))
+ (succeeded? (build-derivations %store (list input1 input2))))
+ (and succeeded?
+ (not (string=? input1 input2))
+ (string=? (derivation-path->output-path input1)
+ (derivation-path->output-path input2)))))
+
(test-end)