all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#29368: Unreliable failing tests / segfaulting guile
@ 2017-11-20 21:03 Martin Castillo
  2017-11-20 22:00 ` Ludovic Courtès
  0 siblings, 1 reply; 6+ messages in thread
From: Martin Castillo @ 2017-11-20 21:03 UTC (permalink / raw)
  To: 29368


[-- Attachment #1.1.1: Type: text/plain, Size: 880 bytes --]

The test suite fails on 84bd92438. I was running [env] $ make check -j
3. (I accidentaly overwrote the log file, sorry.)
The kernel logged:
.guile-real[10735]: segfault at 7b ip 000000000057885d sp
00007ffdfb13b570 error 4 in .guile-real[400000+38a000]

The message appeared when the tests were at about
tests/guix-environment.sh (about 30 tests after tests/nar.scm, the only
failing test). But as I had given -j 3, it may be that nar.scm was still
going.

However, rerunning it without -j 3 and than again with -j 3 worked
without any failure.

That's a bit strange, so I repeated make check -j 3 and now
tests/derivations.scm failed. (test-suite-2.log)

And again, while tests/guix-environment.sh or so is running, the kernel
logs.
.guile-real[24288]: segfault at 7b ip 000000000057885d sp
00007ffef8557490 error 4 in .guile-real[400000+38a000]


Martin

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.1.2: test-suite-2.log --]
[-- Type: text/x-log; name="test-suite-2.log", Size: 142153 bytes --]

========================================
   GNU Guix UNKNOWN: ./test-suite.log
========================================

# TOTAL: 746
# PASS:  737
# SKIP:  8
# XFAIL: 0
# FAIL:  1
# XPASS: 0
# ERROR: 0

.. contents:: :depth: 2

SKIP: tests/base32
==================

sh: nix-hash: command not found
test-name: bytevector->base32-string
location: /home/mcd/guix/tests/base32.scm:48
source:
+ (test-assert
+   "bytevector->base32-string"
+   (fold (lambda (bv expected result)
+           (and result
+                (string=?
+                  (bytevector->base32-string bv)
+                  expected)))
+         #t
+         (map string->utf8
+              '("" "f" "fo" "foo" "foob" "fooba" "foobar"))
+         '(""
+           "my"
+           "mzxq"
+           "mzxw6"
+           "mzxw6yq"
+           "mzxw6ytb"
+           "mzxw6ytboi")))
actual-value: #t
result: PASS

test-name: base32-string->bytevector
location: /home/mcd/guix/tests/base32.scm:65
source:
+ (test-assert
+   "base32-string->bytevector"
+   (every (lambda (bv)
+            (equal?
+              (base32-string->bytevector
+                (bytevector->base32-string bv))
+              bv))
+          (map string->utf8
+               '("" "f" "fo" "foo" "foob" "fooba" "foobar"))))
actual-value: #t
result: PASS

test-name: nix-base32-string->bytevector
location: /home/mcd/guix/tests/base32.scm:73
source:
+ (test-assert
+   "nix-base32-string->bytevector"
+   (every (lambda (bv)
+            (equal?
+              (nix-base32-string->bytevector
+                (bytevector->nix-base32-string bv))
+              bv))
+          (map string->utf8
+               '("" "f" "fo" "foo" "foob" "fooba" "foobar"))))
actual-value: #t
result: PASS

test-name: &invalid-base32-character
location: /home/mcd/guix/tests/base32.scm:81
source:
+ (test-equal
+   "&invalid-base32-character"
+   #\e
+   (guard (c ((invalid-base32-character? c)
+              (invalid-base32-character-value c)))
+          (nix-base32-string->bytevector
+            (string-append (make-string 51 #\a) "e"))))
expected-value: #\e
actual-value: #\e
result: PASS

test-name: sha256 & bytevector->nix-base32-string
location: /home/mcd/guix/tests/base32.scm:92
source:
+ (test-assert
+   "sha256 & bytevector->nix-base32-string"
+   (let ((file (search-path %load-path "tests/test.drv")))
+     (equal?
+       (bytevector->nix-base32-string
+         (sha256
+           (call-with-input-file file get-bytevector-all)))
+       (let* ((c (format
+                   #f
+                   "~a --type sha256 --base32 --flat \"~a\""
+                   %nix-hash
+                   file))
+              (p (open-input-pipe c))
+              (l (read-line p)))
+         (close-pipe p)
+         l))))
result: SKIP


SKIP: tests/cpio
================

test-name: file->cpio-header + write-cpio-header + read-cpio-header
location: /home/mcd/guix/tests/cpio.scm:37
source:
+ (test-assert
+   "file->cpio-header + write-cpio-header + read-cpio-header"
+   (let* ((file (search-path %load-path "guix.scm"))
+          (header (file->cpio-header file)))
+     (call-with-values
+       (lambda () (open-bytevector-output-port))
+       (lambda (port get-bv)
+         (write-cpio-header header port)
+         (let ((port (open-bytevector-input-port (get-bv))))
+           (equal? header (read-cpio-header port)))))))
actual-value: #t
result: PASS

test-name: bit-identical to GNU cpio's output
location: /home/mcd/guix/tests/cpio.scm:49
source:
+ (test-assert
+   "bit-identical to GNU cpio's output"
+   (call-with-temporary-output-file
+     (lambda (link _)
+       (delete-file link)
+       (symlink "chbouib" link)
+       (let ((files (cons* "/"
+                           (canonicalize-path
+                             (dirname (search-path %load-path "guix.scm")))
+                           link
+                           (map (compose
+                                  canonicalize-path
+                                  (cut search-path %load-path <>))
+                                '("guix.scm"
+                                  "guix/build/syscalls.scm"
+                                  "guix/packages.scm")))))
+         (call-with-temporary-output-file
+           (lambda (ref-file _)
+             (let ((pipe (open-pipe*
+                           OPEN_WRITE
+                           %cpio-program
+                           "-o"
+                           "-O"
+                           ref-file
+                           "-H"
+                           "newc"
+                           "--null")))
+               (for-each
+                 (lambda (file) (format pipe "~a\x00" file))
+                 files)
+               (and (zero? (close-pipe pipe))
+                    (call-with-temporary-output-file
+                      (lambda (file port)
+                        (write-cpio-archive files port)
+                        (close-port port)
+                        (or (file=? ref-file file)
+                            (throw 'cpio-archives-differ
+                                   files
+                                   ref-file
+                                   file
+                                   (stat:size (stat ref-file))
+                                   (stat:size (stat file))))))))))))))
result: SKIP

random seed for tests: 1511223158

FAIL: tests/derivations
=======================

test-name: parse & export
location: /home/mcd/guix/tests/derivations.scm:87
source:
+ (test-assert
+   "parse & export"
+   (let* ((f (search-path %load-path "tests/test.drv"))
+          (b1 (call-with-input-file f get-bytevector-all))
+          (d1 (read-derivation (open-bytevector-input-port b1)))
+          (b2 (call-with-bytevector-output-port
+                (cut write-derivation d1 <>)))
+          (d2 (read-derivation (open-bytevector-input-port b2))))
+     (and (equal? b1 b2) (equal? d1 d2))))
actual-value: #t
result: PASS

test-name: add-to-store, flat
location: /home/mcd/guix/tests/derivations.scm:98
source:
+ (test-assert
+   "add-to-store, flat"
+   (let* ((file (search-path
+                  %load-path
+                  "language/tree-il/spec.scm"))
+          (drv (add-to-store
+                 %store
+                 "flat-test"
+                 #f
+                 "sha256"
+                 file)))
+     (and (eq? 'regular (stat:type (stat drv)))
+          (valid-path? %store drv)
+          (equal?
+            (call-with-input-file file get-bytevector-all)
+            (call-with-input-file drv get-bytevector-all)))))
actual-value: #t
result: PASS

test-name: add-to-store, recursive
location: /home/mcd/guix/tests/derivations.scm:106
source:
+ (test-assert
+   "add-to-store, recursive"
+   (let* ((dir (dirname
+                 (search-path
+                   %load-path
+                   "language/tree-il/spec.scm")))
+          (drv (add-to-store
+                 %store
+                 "dir-tree-test"
+                 #t
+                 "sha256"
+                 dir)))
+     (and (eq? 'directory (stat:type (stat drv)))
+          (valid-path? %store drv)
+          (equal?
+            (directory-contents dir)
+            (directory-contents drv)))))
actual-value: #t
result: PASS

test-name: derivation with no inputs
location: /home/mcd/guix/tests/derivations.scm:114
source:
+ (test-assert
+   "derivation with no inputs"
+   (let* ((builder
+            (add-text-to-store
+              %store
+              "my-builder.sh"
+              "echo hello, world\n"
+              '()))
+          (drv (derivation
+                 %store
+                 "foo"
+                 %bash
+                 `("-e" ,builder)
+                 #:env-vars
+                 '(("HOME" . "/homeless")))))
+     (and (store-path? (derivation-file-name drv))
+          (valid-path? %store (derivation-file-name drv)))))
actual-value: #t
result: PASS

test-name: build derivation with 1 source
location: /home/mcd/guix/tests/derivations.scm:124
source:
+ (test-assert
+   "build derivation with 1 source"
+   (let* ((builder
+            (add-text-to-store
+              %store
+              "my-builder.sh"
+              "echo hello, world > \"$out\"\n"
+              '()))
+          (drv (derivation
+                 %store
+                 "foo"
+                 %bash
+                 `(,builder)
+                 #:env-vars
+                 '(("HOME" . "/homeless")
+                   ("zzz" . "Z!")
+                   ("AAA" . "A!"))
+                 #:inputs
+                 `((,%bash) (,builder))))
+          (succeeded?
+            (build-derivations %store (list drv))))
+     (and succeeded?
+          (let ((path (derivation->output-path drv)))
+            (and (valid-path? %store path)
+                 (string=?
+                   (call-with-input-file path read-line)
+                   "hello, world"))))))
actual-value: #t
result: PASS

test-name: derivation with local file as input
location: /home/mcd/guix/tests/derivations.scm:142
source:
+ (test-assert
+   "derivation with local file as input"
+   (let* ((builder
+            (add-text-to-store
+              %store
+              "my-builder.sh"
+              "(while read line ; do echo \"$line\" ; done) < $in > $out"
+              '()))
+          (input (search-path %load-path "ice-9/boot-9.scm"))
+          (input*
+            (add-to-store
+              %store
+              (basename input)
+              #t
+              "sha256"
+              input))
+          (drv (derivation
+                 %store
+                 "derivation-with-input-file"
+                 %bash
+                 `(,builder)
+                 #:env-vars
+                 `(("in" unquote input*))
+                 #:inputs
+                 `((,%bash) (,builder) (,input)))))
+     (and (build-derivations %store (list drv))
+          (valid-path?
+            %store
+            (derivation->output-path drv)))))
actual-value: #t
result: PASS

test-name: derivation fails but keep going
location: /home/mcd/guix/tests/derivations.scm:165
source:
+ (test-assert
+   "derivation fails but keep going"
+   (with-store
+     store
+     (let* ((d1 (derivation
+                  %store
+                  "fails"
+                  %bash
+                  `("-c" "false")
+                  #:inputs
+                  `((,%bash))))
+            (d2 (build-expression->derivation
+                  %store
+                  "sleep-then-succeed"
+                  `(begin ,(random-text) (sleep 2) (mkdir %output)))))
+       (set-build-options
+         %store
+         #:use-substitutes?
+         #f
+         #:keep-going?
+         #t)
+       (guard (c ((nix-protocol-error? c)
+                  (and (= 100 (nix-protocol-error-status c))
+                       (string-contains
+                         (nix-protocol-error-message c)
+                         (derivation-file-name d1))
+                       (not (valid-path? %store (derivation->output-path d1)))
+                       (valid-path? %store (derivation->output-path d2)))))
+              (build-derivations %store (list d1 d2))
+              #f))))
random seed for tests: 1511222863
@ build-started /home/mcd/guix/test-tmp/store/n53psjmq7n7b4aa47scvff5wpxm9n051-fails.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/n5//3psjmq7n7b4aa47scvff5wpxm9n051-fails.drv.bz2
builder for `/home/mcd/guix/test-tmp/store/n53psjmq7n7b4aa47scvff5wpxm9n051-fails.drv' failed with exit code 1
@ build-failed /home/mcd/guix/test-tmp/store/n53psjmq7n7b4aa47scvff5wpxm9n051-fails.drv - 1 builder for `/home/mcd/guix/test-tmp/store/n53psjmq7n7b4aa47scvff5wpxm9n051-fails.drv' failed with exit code 1
@ build-started /home/mcd/guix/test-tmp/store/a47ici7s4b2qfyiaj72l5jf0ifzb0rhw-guile-bootstrap-2.0.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/a4//7ici7s4b2qfyiaj72l5jf0ifzb0rhw-guile-bootstrap-2.0.drv.bz2
unpacking bootstrap Guile to '/home/mcd/guix/test-tmp/store/36s79mghjqqxrmi9xsf0rb87f030d276-guile-bootstrap-2.0'...
./
./share/
./share/guile/
./share/guile/2.0/
./share/guile/2.0/system/
./share/guile/2.0/system/xref.scm
./share/guile/2.0/system/foreign.scm
./share/guile/2.0/system/repl/
./share/guile/2.0/system/repl/error-handling.scm
./share/guile/2.0/system/repl/debug.scm
./share/guile/2.0/system/repl/describe.scm
./share/guile/2.0/system/repl/common.scm
./share/guile/2.0/system/repl/command.scm
./share/guile/2.0/system/repl/server.scm
./share/guile/2.0/system/repl/repl.scm
./share/guile/2.0/system/base/
./share/guile/2.0/system/base/lalr.upstream.scm
./share/guile/2.0/system/base/pmatch.scm
./share/guile/2.0/system/base/lalr.scm
./share/guile/2.0/system/base/language.scm
./share/guile/2.0/system/base/syntax.scm
./share/guile/2.0/system/base/compile.scm
./share/guile/2.0/system/base/ck.scm
./share/guile/2.0/system/base/message.scm
./share/guile/2.0/system/base/target.scm
./share/guile/2.0/system/vm/
./share/guile/2.0/system/vm/trace.scm
./share/guile/2.0/system/vm/trap-state.scm
./share/guile/2.0/system/vm/vm.scm
./share/guile/2.0/system/vm/coverage.scm
./share/guile/2.0/system/vm/program.scm
./share/guile/2.0/system/vm/objcode.scm
./share/guile/2.0/system/vm/traps.scm
./share/guile/2.0/system/vm/inspect.scm
./share/guile/2.0/system/vm/instruction.scm
./share/guile/2.0/system/vm/frame.scm
./share/guile/2.0/scripts/
./share/guile/2.0/scripts/scan-api.scm
./share/guile/2.0/scripts/autofrisk.scm
./share/guile/2.0/scripts/snarf-check-and-output-texi.scm
./share/guile/2.0/scripts/read-rfc822.scm
./share/guile/2.0/scripts/read-text-outline.scm
./share/guile/2.0/scripts/help.scm
./share/guile/2.0/scripts/frisk.scm
./share/guile/2.0/scripts/punify.scm
./share/guile/2.0/scripts/lint.scm
./share/guile/2.0/scripts/disassemble.scm
./share/guile/2.0/scripts/summarize-guile-TODO.scm
./share/guile/2.0/scripts/generate-autoload.scm
./share/guile/2.0/scripts/display-commentary.scm
./share/guile/2.0/scripts/compile.scm
./share/guile/2.0/scripts/api-diff.scm
./share/guile/2.0/scripts/use2dot.scm
./share/guile/2.0/scripts/doc-snarf.scm
./share/guile/2.0/scripts/read-scheme-source.scm
./share/guile/2.0/scripts/snarf-guile-m4-docs.scm
./share/guile/2.0/scripts/list.scm
./share/guile/2.0/texinfo/
./share/guile/2.0/texinfo/indexing.scm
./share/guile/2.0/texinfo/html.scm
./share/guile/2.0/texinfo/docbook.scm
./share/guile/2.0/texinfo/serialize.scm
./share/guile/2.0/texinfo/reflection.scm
./share/guile/2.0/texinfo/plain-text.scm
./share/guile/2.0/texinfo/string-utils.scm
./share/guile/2.0/ice-9/
./share/guile/2.0/ice-9/documentation.scm
./share/guile/2.0/ice-9/scm-style-repl.scm
./share/guile/2.0/ice-9/time.scm
./share/guile/2.0/ice-9/format.scm
./share/guile/2.0/ice-9/networking.scm
./share/guile/2.0/ice-9/getopt-long.scm
./share/guile/2.0/ice-9/vlist.scm
./share/guile/2.0/ice-9/psyntax.scm
./share/guile/2.0/ice-9/gap-buffer.scm
./share/guile/2.0/ice-9/and-let-star.scm
./share/guile/2.0/ice-9/posix.scm
./share/guile/2.0/ice-9/ls.scm
./share/guile/2.0/ice-9/syncase.scm
./share/guile/2.0/ice-9/save-stack.scm
./share/guile/2.0/ice-9/stack-catch.scm
./share/guile/2.0/ice-9/futures.scm
./share/guile/2.0/ice-9/debug.scm
./share/guile/2.0/ice-9/pretty-print.scm
./share/guile/2.0/ice-9/mapping.scm
./share/guile/2.0/ice-9/occam-channel.scm
./share/guile/2.0/ice-9/top-repl.scm
./share/guile/2.0/ice-9/boot-9.scm
./share/guile/2.0/ice-9/string-fun.scm
./share/guile/2.0/ice-9/i18n.scm
./share/guile/2.0/ice-9/match.upstream.scm
./share/guile/2.0/ice-9/streams.scm
./share/guile/2.0/ice-9/lineio.scm
./share/guile/2.0/ice-9/threads.scm
./share/guile/2.0/ice-9/weak-vector.scm
./share/guile/2.0/ice-9/history.scm
./share/guile/2.0/ice-9/expect.scm
./share/guile/2.0/ice-9/poll.scm
./share/guile/2.0/ice-9/popen.scm
./share/guile/2.0/ice-9/control.scm
./share/guile/2.0/ice-9/session.scm
./share/guile/2.0/ice-9/ftw.scm
./share/guile/2.0/ice-9/local-eval.scm
./share/guile/2.0/ice-9/receive.scm
./share/guile/2.0/ice-9/safe-r5rs.scm
./share/guile/2.0/ice-9/calling.scm
./share/guile/2.0/ice-9/curried-definitions.scm
./share/guile/2.0/ice-9/eval-string.scm
./share/guile/2.0/ice-9/q.scm
./share/guile/2.0/ice-9/serialize.scm
./share/guile/2.0/ice-9/quasisyntax.scm
./share/guile/2.0/ice-9/slib.scm
./share/guile/2.0/ice-9/hcons.scm
./share/guile/2.0/ice-9/rw.scm
./share/guile/2.0/ice-9/regex.scm
./share/guile/2.0/ice-9/match.scm
./share/guile/2.0/ice-9/buffered-input.scm
./share/guile/2.0/ice-9/iconv.scm
./share/guile/2.0/ice-9/poe.scm
./share/guile/2.0/ice-9/common-list.scm
./share/guile/2.0/ice-9/r5rs.scm
./share/guile/2.0/ice-9/command-line.scm
./share/guile/2.0/ice-9/deprecated.scm
./share/guile/2.0/ice-9/psyntax-pp.scm
./share/guile/2.0/ice-9/null.scm
./share/guile/2.0/ice-9/optargs.scm
./share/guile/2.0/ice-9/rdelim.scm
./share/guile/2.0/ice-9/runq.scm
./share/guile/2.0/ice-9/safe.scm
./share/guile/2.0/ice-9/channel.scm
./share/guile/2.0/ice-9/readline.scm
./share/guile/2.0/ice-9/binary-ports.scm
./share/guile/2.0/ice-9/eval.scm
./share/guile/2.0/ice-9/r4rs.scm
./share/guile/2.0/ice-9/r6rs-libraries.scm
./share/guile/2.0/ice-9/list.scm
./share/guile/2.0/language/
./share/guile/2.0/language/elisp/
./share/guile/2.0/language/elisp/compile-tree-il.scm
./share/guile/2.0/language/elisp/bindings.scm
./share/guile/2.0/language/elisp/runtime.scm
./share/guile/2.0/language/elisp/lexer.scm
./share/guile/2.0/language/elisp/spec.scm
./share/guile/2.0/language/elisp/runtime/
./share/guile/2.0/language/elisp/runtime/macros.scm
./share/guile/2.0/language/elisp/runtime/function-slot.scm
./share/guile/2.0/language/elisp/runtime/subrs.scm
./share/guile/2.0/language/elisp/runtime/value-slot.scm
./share/guile/2.0/language/elisp/parser.scm
./share/guile/2.0/language/assembly/
./share/guile/2.0/language/assembly/compile-bytecode.scm
./share/guile/2.0/language/assembly/disassemble.scm
./share/guile/2.0/language/assembly/spec.scm
./share/guile/2.0/language/assembly/decompile-bytecode.scm
./share/guile/2.0/language/scheme/
./share/guile/2.0/language/scheme/compile-tree-il.scm
./share/guile/2.0/language/scheme/decompile-tree-il.scm
./share/guile/2.0/language/scheme/spec.scm
./share/guile/2.0/language/brainfuck/
./share/guile/2.0/language/brainfuck/compile-tree-il.scm
./share/guile/2.0/language/brainfuck/compile-scheme.scm
./share/guile/2.0/language/brainfuck/spec.scm
./share/guile/2.0/language/brainfuck/parse.scm
./share/guile/2.0/language/objcode/
./share/guile/2.0/language/objcode/spec.scm
./share/guile/2.0/language/assembly.scm
./share/guile/2.0/language/bytecode/
./share/guile/2.0/language/bytecode/spec.scm
./share/guile/2.0/language/glil/
./share/guile/2.0/language/glil/spec.scm
./share/guile/2.0/language/glil/compile-assembly.scm
./share/guile/2.0/language/tree-il/
./share/guile/2.0/language/tree-il/analyze.scm
./share/guile/2.0/language/tree-il/inline.scm
./share/guile/2.0/language/tree-il/debug.scm
./share/guile/2.0/language/tree-il/primitives.scm
./share/guile/2.0/language/tree-il/optimize.scm
./share/guile/2.0/language/tree-il/fix-letrec.scm
./share/guile/2.0/language/tree-il/spec.scm
./share/guile/2.0/language/tree-il/peval.scm
./share/guile/2.0/language/tree-il/compile-glil.scm
./share/guile/2.0/language/tree-il/cse.scm
./share/guile/2.0/language/tree-il/canonicalize.scm
./share/guile/2.0/language/tree-il/effects.scm
./share/guile/2.0/language/ecmascript/
./share/guile/2.0/language/ecmascript/base.scm
./share/guile/2.0/language/ecmascript/compile-tree-il.scm
./share/guile/2.0/language/ecmascript/function.scm
./share/guile/2.0/language/ecmascript/array.scm
./share/guile/2.0/language/ecmascript/tokenize.scm
./share/guile/2.0/language/ecmascript/spec.scm
./share/guile/2.0/language/ecmascript/impl.scm
./share/guile/2.0/language/ecmascript/parse.scm
./share/guile/2.0/language/value/
./share/guile/2.0/language/value/spec.scm
./share/guile/2.0/language/glil.scm
./share/guile/2.0/language/tree-il.scm
./share/guile/2.0/rnrs.scm
./share/guile/2.0/statprof.scm
./share/guile/2.0/web/
./share/guile/2.0/web/client.scm
./share/guile/2.0/web/response.scm
./share/guile/2.0/web/uri.scm
./share/guile/2.0/web/server/
./share/guile/2.0/web/server/http.scm
./share/guile/2.0/web/request.scm
./share/guile/2.0/web/server.scm
./share/guile/2.0/web/http.scm
./share/guile/2.0/oop/
./share/guile/2.0/oop/goops.scm
./share/guile/2.0/oop/goops/
./share/guile/2.0/oop/goops/save.scm
./share/guile/2.0/oop/goops/stklos.scm
./share/guile/2.0/oop/goops/accessors.scm
./share/guile/2.0/oop/goops/describe.scm
./share/guile/2.0/oop/goops/dispatch.scm
./share/guile/2.0/oop/goops/active-slot.scm
./share/guile/2.0/oop/goops/composite-slot.scm
./share/guile/2.0/oop/goops/compile.scm
./share/guile/2.0/oop/goops/internal.scm
./share/guile/2.0/oop/goops/util.scm
./share/guile/2.0/oop/goops/simple.scm
./share/guile/2.0/guile-procedures.txt
./share/guile/2.0/texinfo.scm
./share/guile/2.0/rnrs/
./share/guile/2.0/rnrs/base.scm
./share/guile/2.0/rnrs/records/
./share/guile/2.0/rnrs/records/syntactic.scm
./share/guile/2.0/rnrs/records/inspection.scm
./share/guile/2.0/rnrs/records/procedural.scm
./share/guile/2.0/rnrs/arithmetic/
./share/guile/2.0/rnrs/arithmetic/bitwise.scm
./share/guile/2.0/rnrs/arithmetic/fixnums.scm
./share/guile/2.0/rnrs/arithmetic/flonums.scm
./share/guile/2.0/rnrs/unicode.scm
./share/guile/2.0/rnrs/enums.scm
./share/guile/2.0/rnrs/hashtables.scm
./share/guile/2.0/rnrs/control.scm
./share/guile/2.0/rnrs/syntax-case.scm
./share/guile/2.0/rnrs/sorting.scm
./share/guile/2.0/rnrs/lists.scm
./share/guile/2.0/rnrs/mutable-strings.scm
./share/guile/2.0/rnrs/conditions.scm
./share/guile/2.0/rnrs/r5rs.scm
./share/guile/2.0/rnrs/mutable-pairs.scm
./share/guile/2.0/rnrs/programs.scm
./share/guile/2.0/rnrs/exceptions.scm
./share/guile/2.0/rnrs/eval.scm
./share/guile/2.0/rnrs/files.scm
./share/guile/2.0/rnrs/io/
./share/guile/2.0/rnrs/io/ports.scm
./share/guile/2.0/rnrs/io/simple.scm
./share/guile/2.0/rnrs/bytevectors.scm
./share/guile/2.0/sxml/
./share/guile/2.0/sxml/sxml-match.ss
./share/guile/2.0/sxml/fold.scm
./share/guile/2.0/sxml/ssax.scm
./share/guile/2.0/sxml/apply-templates.scm
./share/guile/2.0/sxml/xpath.scm
./share/guile/2.0/sxml/upstream/
./share/guile/2.0/sxml/upstream/SSAX.scm
./share/guile/2.0/sxml/upstream/assert.scm
./share/guile/2.0/sxml/upstream/SXPath-old.scm
./share/guile/2.0/sxml/upstream/input-parse.scm
./share/guile/2.0/sxml/upstream/SXML-tree-trans.scm
./share/guile/2.0/sxml/transform.scm
./share/guile/2.0/sxml/match.scm
./share/guile/2.0/sxml/simple.scm
./share/guile/2.0/sxml/ssax/
./share/guile/2.0/sxml/ssax/input-parse.scm
./share/guile/2.0/srfi/
./share/guile/2.0/srfi/srfi-88.scm
./share/guile/2.0/srfi/srfi-14.scm
./share/guile/2.0/srfi/srfi-6.scm
./share/guile/2.0/srfi/srfi-67.scm
./share/guile/2.0/srfi/srfi-42/
./share/guile/2.0/srfi/srfi-42/ec.scm
./share/guile/2.0/srfi/srfi-19.scm
./share/guile/2.0/srfi/srfi-31.scm
./share/guile/2.0/srfi/srfi-41.scm
./share/guile/2.0/srfi/srfi-35.scm
./share/guile/2.0/srfi/srfi-34.scm
./share/guile/2.0/srfi/srfi-60.scm
./share/guile/2.0/srfi/srfi-18.scm
./share/guile/2.0/srfi/srfi-37.scm
./share/guile/2.0/srfi/srfi-4/
./share/guile/2.0/srfi/srfi-4/gnu.scm
./share/guile/2.0/srfi/srfi-16.scm
./share/guile/2.0/srfi/srfi-69.scm
./share/guile/2.0/srfi/srfi-17.scm
./share/guile/2.0/srfi/srfi-2.scm
./share/guile/2.0/srfi/srfi-27.scm
./share/guile/2.0/srfi/srfi-26.scm
./share/guile/2.0/srfi/srfi-8.scm
./share/guile/2.0/srfi/srfi-4.scm
./share/guile/2.0/srfi/srfi-11.scm
./share/guile/2.0/srfi/srfi-13.scm
./share/guile/2.0/srfi/srfi-67/
./share/guile/2.0/srfi/srfi-67/compare.scm
./share/guile/2.0/srfi/srfi-45.scm
./share/guile/2.0/srfi/srfi-9.scm
./share/guile/2.0/srfi/srfi-9/
./share/guile/2.0/srfi/srfi-9/gnu.scm
./share/guile/2.0/srfi/srfi-10.scm
./share/guile/2.0/srfi/srfi-42.scm
./share/guile/2.0/srfi/srfi-39.scm
./share/guile/2.0/srfi/srfi-1.scm
./share/guile/2.0/srfi/srfi-38.scm
./share/guile/2.0/srfi/srfi-98.scm
./lib/
./lib/guile/
./lib/guile/2.0/
./lib/guile/2.0/ccache/
./lib/guile/2.0/ccache/system/
./lib/guile/2.0/ccache/system/foreign.go
./lib/guile/2.0/ccache/system/repl/
./lib/guile/2.0/ccache/system/repl/command.go
./lib/guile/2.0/ccache/system/repl/error-handling.go
./lib/guile/2.0/ccache/system/repl/repl.go
./lib/guile/2.0/ccache/system/repl/debug.go
./lib/guile/2.0/ccache/system/repl/server.go
./lib/guile/2.0/ccache/system/repl/common.go
./lib/guile/2.0/ccache/system/xref.go
./lib/guile/2.0/ccache/system/base/
./lib/guile/2.0/ccache/system/base/ck.go
./lib/guile/2.0/ccache/system/base/lalr.go
./lib/guile/2.0/ccache/system/base/pmatch.go
./lib/guile/2.0/ccache/system/base/message.go
./lib/guile/2.0/ccache/system/base/syntax.go
./lib/guile/2.0/ccache/system/base/language.go
./lib/guile/2.0/ccache/system/base/target.go
./lib/guile/2.0/ccache/system/base/compile.go
./lib/guile/2.0/ccache/system/vm/
./lib/guile/2.0/ccache/system/vm/traps.go
./lib/guile/2.0/ccache/system/vm/frame.go
./lib/guile/2.0/ccache/system/vm/objcode.go
./lib/guile/2.0/ccache/system/vm/program.go
./lib/guile/2.0/ccache/system/vm/instruction.go
./lib/guile/2.0/ccache/system/vm/coverage.go
./lib/guile/2.0/ccache/system/vm/vm.go
./lib/guile/2.0/ccache/system/vm/trap-state.go
./lib/guile/2.0/ccache/system/vm/inspect.go
./lib/guile/2.0/ccache/system/vm/trace.go
./lib/guile/2.0/ccache/scripts/
./lib/guile/2.0/ccache/scripts/scan-api.go
./lib/guile/2.0/ccache/scripts/use2dot.go
./lib/guile/2.0/ccache/scripts/autofrisk.go
./lib/guile/2.0/ccache/scripts/api-diff.go
./lib/guile/2.0/ccache/scripts/read-text-outline.go
./lib/guile/2.0/ccache/scripts/punify.go
./lib/guile/2.0/ccache/scripts/snarf-guile-m4-docs.go
./lib/guile/2.0/ccache/scripts/read-scheme-source.go
./lib/guile/2.0/ccache/scripts/frisk.go
./lib/guile/2.0/ccache/scripts/summarize-guile-TODO.go
./lib/guile/2.0/ccache/scripts/lint.go
./lib/guile/2.0/ccache/scripts/display-commentary.go
./lib/guile/2.0/ccache/scripts/disassemble.go
./lib/guile/2.0/ccache/scripts/generate-autoload.go
./lib/guile/2.0/ccache/scripts/snarf-check-and-output-texi.go
./lib/guile/2.0/ccache/scripts/read-rfc822.go
./lib/guile/2.0/ccache/scripts/doc-snarf.go
./lib/guile/2.0/ccache/scripts/compile.go
./lib/guile/2.0/ccache/scripts/help.go
./lib/guile/2.0/ccache/scripts/list.go
./lib/guile/2.0/ccache/texinfo/
./lib/guile/2.0/ccache/texinfo/docbook.go
./lib/guile/2.0/ccache/texinfo/serialize.go
./lib/guile/2.0/ccache/texinfo/html.go
./lib/guile/2.0/ccache/texinfo/reflection.go
./lib/guile/2.0/ccache/texinfo/indexing.go
./lib/guile/2.0/ccache/texinfo/plain-text.go
./lib/guile/2.0/ccache/texinfo/string-utils.go
./lib/guile/2.0/ccache/ice-9/
./lib/guile/2.0/ccache/ice-9/r4rs.go
./lib/guile/2.0/ccache/ice-9/poll.go
./lib/guile/2.0/ccache/ice-9/syncase.go
./lib/guile/2.0/ccache/ice-9/common-list.go
./lib/guile/2.0/ccache/ice-9/stack-catch.go
./lib/guile/2.0/ccache/ice-9/control.go
./lib/guile/2.0/ccache/ice-9/binary-ports.go
./lib/guile/2.0/ccache/ice-9/regex.go
./lib/guile/2.0/ccache/ice-9/safe.go
./lib/guile/2.0/ccache/ice-9/buffered-input.go
./lib/guile/2.0/ccache/ice-9/boot-9.go
./lib/guile/2.0/ccache/ice-9/and-let-star.go
./lib/guile/2.0/ccache/ice-9/expect.go
./lib/guile/2.0/ccache/ice-9/gap-buffer.go
./lib/guile/2.0/ccache/ice-9/pretty-print.go
./lib/guile/2.0/ccache/ice-9/time.go
./lib/guile/2.0/ccache/ice-9/serialize.go
./lib/guile/2.0/ccache/ice-9/debug.go
./lib/guile/2.0/ccache/ice-9/rw.go
./lib/guile/2.0/ccache/ice-9/command-line.go
./lib/guile/2.0/ccache/ice-9/networking.go
./lib/guile/2.0/ccache/ice-9/posix.go
./lib/guile/2.0/ccache/ice-9/psyntax-pp.go
./lib/guile/2.0/ccache/ice-9/format.go
./lib/guile/2.0/ccache/ice-9/optargs.go
./lib/guile/2.0/ccache/ice-9/history.go
./lib/guile/2.0/ccache/ice-9/vlist.go
./lib/guile/2.0/ccache/ice-9/threads.go
./lib/guile/2.0/ccache/ice-9/safe-r5rs.go
./lib/guile/2.0/ccache/ice-9/streams.go
./lib/guile/2.0/ccache/ice-9/readline.go
./lib/guile/2.0/ccache/ice-9/slib.go
./lib/guile/2.0/ccache/ice-9/scm-style-repl.go
./lib/guile/2.0/ccache/ice-9/session.go
./lib/guile/2.0/ccache/ice-9/top-repl.go
./lib/guile/2.0/ccache/ice-9/channel.go
./lib/guile/2.0/ccache/ice-9/q.go
./lib/guile/2.0/ccache/ice-9/string-fun.go
./lib/guile/2.0/ccache/ice-9/r5rs.go
./lib/guile/2.0/ccache/ice-9/calling.go
./lib/guile/2.0/ccache/ice-9/futures.go
./lib/guile/2.0/ccache/ice-9/null.go
./lib/guile/2.0/ccache/ice-9/occam-channel.go
./lib/guile/2.0/ccache/ice-9/eval.go
./lib/guile/2.0/ccache/ice-9/receive.go
./lib/guile/2.0/ccache/ice-9/ftw.go
./lib/guile/2.0/ccache/ice-9/runq.go
./lib/guile/2.0/ccache/ice-9/rdelim.go
./lib/guile/2.0/ccache/ice-9/save-stack.go
./lib/guile/2.0/ccache/ice-9/local-eval.go
./lib/guile/2.0/ccache/ice-9/getopt-long.go
./lib/guile/2.0/ccache/ice-9/ls.go
./lib/guile/2.0/ccache/ice-9/lineio.go
./lib/guile/2.0/ccache/ice-9/i18n.go
./lib/guile/2.0/ccache/ice-9/deprecated.go
./lib/guile/2.0/ccache/ice-9/hcons.go
./lib/guile/2.0/ccache/ice-9/popen.go
./lib/guile/2.0/ccache/ice-9/curried-definitions.go
./lib/guile/2.0/ccache/ice-9/eval-string.go
./lib/guile/2.0/ccache/ice-9/match.go
./lib/guile/2.0/ccache/ice-9/weak-vector.go
./lib/guile/2.0/ccache/ice-9/poe.go
./lib/guile/2.0/ccache/ice-9/mapping.go
./lib/guile/2.0/ccache/ice-9/list.go
./lib/guile/2.0/ccache/ice-9/documentation.go
./lib/guile/2.0/ccache/ice-9/iconv.go
./lib/guile/2.0/ccache/language/
./lib/guile/2.0/ccache/language/assembly.go
./lib/guile/2.0/ccache/language/elisp/
./lib/guile/2.0/ccache/language/elisp/compile-tree-il.go
./lib/guile/2.0/ccache/language/elisp/spec.go
./lib/guile/2.0/ccache/language/elisp/parser.go
./lib/guile/2.0/ccache/language/elisp/runtime.go
./lib/guile/2.0/ccache/language/elisp/bindings.go
./lib/guile/2.0/ccache/language/elisp/lexer.go
./lib/guile/2.0/ccache/language/elisp/runtime/
./lib/guile/2.0/ccache/language/elisp/runtime/value-slot.go
./lib/guile/2.0/ccache/language/elisp/runtime/function-slot.go
./lib/guile/2.0/ccache/language/elisp/runtime/subrs.go
./lib/guile/2.0/ccache/language/elisp/runtime/macros.go
./lib/guile/2.0/ccache/language/assembly/
./lib/guile/2.0/ccache/language/assembly/decompile-bytecode.go
./lib/guile/2.0/ccache/language/assembly/spec.go
./lib/guile/2.0/ccache/language/assembly/compile-bytecode.go
./lib/guile/2.0/ccache/language/assembly/disassemble.go
./lib/guile/2.0/ccache/language/tree-il.go
./lib/guile/2.0/ccache/language/glil.go
./lib/guile/2.0/ccache/language/scheme/
./lib/guile/2.0/ccache/language/scheme/compile-tree-il.go
./lib/guile/2.0/ccache/language/scheme/spec.go
./lib/guile/2.0/ccache/language/scheme/decompile-tree-il.go
./lib/guile/2.0/ccache/language/brainfuck/
./lib/guile/2.0/ccache/language/brainfuck/compile-tree-il.go
./lib/guile/2.0/ccache/language/brainfuck/spec.go
./lib/guile/2.0/ccache/language/brainfuck/parse.go
./lib/guile/2.0/ccache/language/brainfuck/compile-scheme.go
./lib/guile/2.0/ccache/language/objcode/
./lib/guile/2.0/ccache/language/objcode/spec.go
./lib/guile/2.0/ccache/language/bytecode/
./lib/guile/2.0/ccache/language/bytecode/spec.go
./lib/guile/2.0/ccache/language/glil/
./lib/guile/2.0/ccache/language/glil/compile-assembly.go
./lib/guile/2.0/ccache/language/glil/spec.go
./lib/guile/2.0/ccache/language/tree-il/
./lib/guile/2.0/ccache/language/tree-il/debug.go
./lib/guile/2.0/ccache/language/tree-il/compile-glil.go
./lib/guile/2.0/ccache/language/tree-il/optimize.go
./lib/guile/2.0/ccache/language/tree-il/spec.go
./lib/guile/2.0/ccache/language/tree-il/canonicalize.go
./lib/guile/2.0/ccache/language/tree-il/inline.go
./lib/guile/2.0/ccache/language/tree-il/analyze.go
./lib/guile/2.0/ccache/language/tree-il/peval.go
./lib/guile/2.0/ccache/language/tree-il/cse.go
./lib/guile/2.0/ccache/language/tree-il/fix-letrec.go
./lib/guile/2.0/ccache/language/tree-il/effects.go
./lib/guile/2.0/ccache/language/tree-il/primitives.go
./lib/guile/2.0/ccache/language/ecmascript/
./lib/guile/2.0/ccache/language/ecmascript/compile-tree-il.go
./lib/guile/2.0/ccache/language/ecmascript/spec.go
./lib/guile/2.0/ccache/language/ecmascript/parse.go
./lib/guile/2.0/ccache/language/ecmascript/tokenize.go
./lib/guile/2.0/ccache/language/ecmascript/array.go
./lib/guile/2.0/ccache/language/ecmascript/impl.go
./lib/guile/2.0/ccache/language/ecmascript/function.go
./lib/guile/2.0/ccache/language/ecmascript/base.go
./lib/guile/2.0/ccache/language/value/
./lib/guile/2.0/ccache/language/value/spec.go
./lib/guile/2.0/ccache/web/
./lib/guile/2.0/ccache/web/http.go
./lib/guile/2.0/ccache/web/server/
./lib/guile/2.0/ccache/web/server/http.go
./lib/guile/2.0/ccache/web/client.go
./lib/guile/2.0/ccache/web/request.go
./lib/guile/2.0/ccache/web/server.go
./lib/guile/2.0/ccache/web/uri.go
./lib/guile/2.0/ccache/web/response.go
./lib/guile/2.0/ccache/oop/
./lib/guile/2.0/ccache/oop/goops.go
./lib/guile/2.0/ccache/oop/goops/
./lib/guile/2.0/ccache/oop/goops/composite-slot.go
./lib/guile/2.0/ccache/oop/goops/internal.go
./lib/guile/2.0/ccache/oop/goops/stklos.go
./lib/guile/2.0/ccache/oop/goops/save.go
./lib/guile/2.0/ccache/oop/goops/dispatch.go
./lib/guile/2.0/ccache/oop/goops/util.go
./lib/guile/2.0/ccache/oop/goops/active-slot.go
./lib/guile/2.0/ccache/oop/goops/simple.go
./lib/guile/2.0/ccache/oop/goops/describe.go
./lib/guile/2.0/ccache/oop/goops/compile.go
./lib/guile/2.0/ccache/oop/goops/accessors.go
./lib/guile/2.0/ccache/rnrs/
./lib/guile/2.0/ccache/rnrs/mutable-pairs.go
./lib/guile/2.0/ccache/rnrs/control.go
./lib/guile/2.0/ccache/rnrs/records/
./lib/guile/2.0/ccache/rnrs/records/procedural.go
./lib/guile/2.0/ccache/rnrs/records/syntactic.go
./lib/guile/2.0/ccache/rnrs/records/inspection.go
./lib/guile/2.0/ccache/rnrs/arithmetic/
./lib/guile/2.0/ccache/rnrs/arithmetic/fixnums.go
./lib/guile/2.0/ccache/rnrs/arithmetic/bitwise.go
./lib/guile/2.0/ccache/rnrs/arithmetic/flonums.go
./lib/guile/2.0/ccache/rnrs/enums.go
./lib/guile/2.0/ccache/rnrs/programs.go
./lib/guile/2.0/ccache/rnrs/exceptions.go
./lib/guile/2.0/ccache/rnrs/files.go
./lib/guile/2.0/ccache/rnrs/syntax-case.go
./lib/guile/2.0/ccache/rnrs/lists.go
./lib/guile/2.0/ccache/rnrs/mutable-strings.go
./lib/guile/2.0/ccache/rnrs/unicode.go
./lib/guile/2.0/ccache/rnrs/r5rs.go
./lib/guile/2.0/ccache/rnrs/hashtables.go
./lib/guile/2.0/ccache/rnrs/eval.go
./lib/guile/2.0/ccache/rnrs/conditions.go
./lib/guile/2.0/ccache/rnrs/bytevectors.go
./lib/guile/2.0/ccache/rnrs/sorting.go
./lib/guile/2.0/ccache/rnrs/base.go
./lib/guile/2.0/ccache/rnrs/io/
./lib/guile/2.0/ccache/rnrs/io/ports.go
./lib/guile/2.0/ccache/rnrs/io/simple.go
./lib/guile/2.0/ccache/sxml/
./lib/guile/2.0/ccache/sxml/transform.go
./lib/guile/2.0/ccache/sxml/ssax.go
./lib/guile/2.0/ccache/sxml/simple.go
./lib/guile/2.0/ccache/sxml/apply-templates.go
./lib/guile/2.0/ccache/sxml/xpath.go
./lib/guile/2.0/ccache/sxml/match.go
./lib/guile/2.0/ccache/sxml/fold.go
./lib/guile/2.0/ccache/sxml/ssax/
./lib/guile/2.0/ccache/sxml/ssax/input-parse.go
./lib/guile/2.0/ccache/rnrs.go
./lib/guile/2.0/ccache/srfi/
./lib/guile/2.0/ccache/srfi/srfi-4.go
./lib/guile/2.0/ccache/srfi/srfi-14.go
./lib/guile/2.0/ccache/srfi/srfi-26.go
./lib/guile/2.0/ccache/srfi/srfi-17.go
./lib/guile/2.0/ccache/srfi/srfi-27.go
./lib/guile/2.0/ccache/srfi/srfi-38.go
./lib/guile/2.0/ccache/srfi/srfi-34.go
./lib/guile/2.0/ccache/srfi/srfi-13.go
./lib/guile/2.0/ccache/srfi/srfi-41.go
./lib/guile/2.0/ccache/srfi/srfi-19.go
./lib/guile/2.0/ccache/srfi/srfi-67.go
./lib/guile/2.0/ccache/srfi/srfi-9.go
./lib/guile/2.0/ccache/srfi/srfi-2.go
./lib/guile/2.0/ccache/srfi/srfi-4/
./lib/guile/2.0/ccache/srfi/srfi-4/gnu.go
./lib/guile/2.0/ccache/srfi/srfi-60.go
./lib/guile/2.0/ccache/srfi/srfi-11.go
./lib/guile/2.0/ccache/srfi/srfi-69.go
./lib/guile/2.0/ccache/srfi/srfi-6.go
./lib/guile/2.0/ccache/srfi/srfi-37.go
./lib/guile/2.0/ccache/srfi/srfi-39.go
./lib/guile/2.0/ccache/srfi/srfi-1.go
./lib/guile/2.0/ccache/srfi/srfi-8.go
./lib/guile/2.0/ccache/srfi/srfi-9/
./lib/guile/2.0/ccache/srfi/srfi-9/gnu.go
./lib/guile/2.0/ccache/srfi/srfi-45.go
./lib/guile/2.0/ccache/srfi/srfi-42.go
./lib/guile/2.0/ccache/srfi/srfi-16.go
./lib/guile/2.0/ccache/srfi/srfi-31.go
./lib/guile/2.0/ccache/srfi/srfi-18.go
./lib/guile/2.0/ccache/srfi/srfi-88.go
./lib/guile/2.0/ccache/srfi/srfi-10.go
./lib/guile/2.0/ccache/srfi/srfi-35.go
./lib/guile/2.0/ccache/srfi/srfi-98.go
./lib/guile/2.0/ccache/texinfo.go
./lib/guile/2.0/ccache/statprof.go
./bin/
./bin/guile
guile (GNU Guile) 2.0.9
Copyright (C) 2013 Free Software Foundation, Inc.

License LGPLv3+: GNU LGPL 3 or later <http://gnu.org/licenses/lgpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
@ build-succeeded /home/mcd/guix/test-tmp/store/a47ici7s4b2qfyiaj72l5jf0ifzb0rhw-guile-bootstrap-2.0.drv -
@ build-started /home/mcd/guix/test-tmp/store/1zrd5rrq55ad5926x74vsf0dycrlr2bc-sleep-then-succeed.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/1z//rd5rrq55ad5926x74vsf0dycrlr2bc-sleep-then-succeed.drv.bz2
@ build-succeeded /home/mcd/guix/test-tmp/store/1zrd5rrq55ad5926x74vsf0dycrlr2bc-sleep-then-succeed.drv -
actual-value: #t
result: PASS

test-name: identical files are deduplicated
location: /home/mcd/guix/tests/derivations.scm:192
source:
+ (test-assert
+   "identical files are deduplicated"
+   (let* ((build1
+            (add-text-to-store
+              %store
+              "one.sh"
+              "echo hello, world > \"$out\"\n"
+              '()))
+          (build2
+            (add-text-to-store
+              %store
+              "two.sh"
+              "# Hey!\necho hello, world > \"$out\"\n"
+              '()))
+          (drv1 (derivation
+                  %store
+                  "foo"
+                  %bash
+                  `(,build1)
+                  #:inputs
+                  `((,%bash) (,build1))))
+          (drv2 (derivation
+                  %store
+                  "bar"
+                  %bash
+                  `(,build2)
+                  #:inputs
+                  `((,%bash) (,build2)))))
+     (and (build-derivations %store (list drv1 drv2))
+          (let ((file1 (derivation->output-path drv1))
+                (file2 (derivation->output-path drv2)))
+            (and (valid-path? %store file1)
+                 (valid-path? %store file2)
+                 (string=?
+                   (call-with-input-file file1 get-string-all)
+                   "hello, world\n")
+                 (= (stat:ino (lstat file1))
+                    (stat:ino (lstat file2))))))))
actual-value: #t
result: PASS

test-name: built-in-builders
location: /home/mcd/guix/tests/derivations.scm:214
source:
+ (test-equal
+   "built-in-builders"
+   '("download")
+   (built-in-builders %store))
expected-value: ("download")
actual-value: ("download")
result: PASS

test-name: unknown built-in builder
location: /home/mcd/guix/tests/derivations.scm:218
source:
+ (test-assert
+   "unknown built-in builder"
+   (let ((drv (derivation
+                %store
+                "ohoh"
+                "builtin:does-not-exist"
+                '())))
+     (guard (c ((nix-protocol-error? c)
+                (string-contains
+                  (nix-protocol-error-message c)
+                  "failed")))
+            (build-derivations %store (list drv))
+            #f)))
@ build-started /home/mcd/guix/test-tmp/store/f46g1i126vbc617l9y5vwg6fwc3dr0wn-ohoh.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/f4//6g1i126vbc617l9y5vwg6fwc3dr0wn-ohoh.drv.bz2
error: unsupported builtin function 'does-not-exist'
builder for `/home/mcd/guix/test-tmp/store/f46g1i126vbc617l9y5vwg6fwc3dr0wn-ohoh.drv' failed with exit code 1
@ build-failed /home/mcd/guix/test-tmp/store/f46g1i126vbc617l9y5vwg6fwc3dr0wn-ohoh.drv - 1 builder for `/home/mcd/guix/test-tmp/store/f46g1i126vbc617l9y5vwg6fwc3dr0wn-ohoh.drv' failed with exit code 1
actual-value: 83
result: PASS

test-name: 'download' built-in builder
location: /home/mcd/guix/tests/derivations.scm:227
source:
+ (test-assert
+   "'download' built-in builder"
+   (let ((text (random-text)))
+     (with-http-server
+       200
+       text
+       (let* ((drv (derivation
+                     %store
+                     "world"
+                     "builtin:download"
+                     '()
+                     #:env-vars
+                     `(("url" unquote (object->string (%local-url))))
+                     #:hash-algo
+                     'sha256
+                     #:hash
+                     (sha256 (string->utf8 text)))))
+         (and (build-derivations %store (list drv))
+              (string=?
+                (call-with-input-file
+                  (derivation->output-path drv)
+                  get-string-all)
+                text))))))
@ build-started /home/mcd/guix/test-tmp/store/z7sh0sdxi302id9990q96gyrp2j5prrx-world.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/z7//sh0sdxi302id9990q96gyrp2j5prrx-world.drv.bz2

Starting download of /home/mcd/guix/test-tmp/store/7cdz5j6s7k68yqxkjzhdfqd5znc3ci1b-world
From http://localhost:10500/foo/bar...
\r^[[K bar  64B                               0B/s 00:00 [                    ]   0.0%\r^[[K bar  64B                            50KiB/s 00:00 [####################] 100.0%\r^[[K bar  64B                            35KiB/s 00:00 [####################] 100.0%
@ build-succeeded /home/mcd/guix/test-tmp/store/z7sh0sdxi302id9990q96gyrp2j5prrx-world.drv -
actual-value: #t
result: PASS

test-name: 'download' built-in builder, invalid hash
location: /home/mcd/guix/tests/derivations.scm:243
source:
+ (test-assert
+   "'download' built-in builder, invalid hash"
+   (with-http-server
+     200
+     "hello, world!"
+     (let* ((drv (derivation
+                   %store
+                   "world"
+                   "builtin:download"
+                   '()
+                   #:env-vars
+                   `(("url" unquote (object->string (%local-url))))
+                   #:hash-algo
+                   'sha256
+                   #:hash
+                   (sha256 (random-bytevector 100)))))
+       (guard (c ((nix-protocol-error? c)
+                  (string-contains
+                    (nix-protocol-error-message c)
+                    "failed")))
+              (build-derivations %store (list drv))
+              #f))))
@ build-started /home/mcd/guix/test-tmp/store/0jj11vywp1ajmrb0vv3737zxc3vm78c2-world.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/0j//j11vywp1ajmrb0vv3737zxc3vm78c2-world.drv.bz2

Starting download of /home/mcd/guix/test-tmp/store/3k08sa0hnz5fj3svwfx5xv7wnlavbk9m-world
From http://localhost:10500/foo/bar...
\r^[[K bar  13B                               0B/s 00:00 [                    ]   0.0%\r^[[K bar  13B                            10KiB/s 00:00 [####################] 100.0%\r^[[K bar  13B                             6KiB/s 00:00 [####################] 100.0%
sha256 hash mismatch for output path `/home/mcd/guix/test-tmp/store/3k08sa0hnz5fj3svwfx5xv7wnlavbk9m-world'
  expected: 0kca5ymhr1r7xsb1ijmkjqs8xv1295437q0vl7kwqcf9nlmm3p0l
  actual:   0a7pd3rizm1qb3kz1ad1wzrijrhwsnq3lj7qprc86zp6a6r5drk8
@ build-failed /home/mcd/guix/test-tmp/store/0jj11vywp1ajmrb0vv3737zxc3vm78c2-world.drv - 1 sha256 hash mismatch for output path `/home/mcd/guix/test-tmp/store/3k08sa0hnz5fj3svwfx5xv7wnlavbk9m-world'
  expected: 0kca5ymhr1r7xsb1ijmkjqs8xv1295437q0vl7kwqcf9nlmm3p0l
  actual:   0a7pd3rizm1qb3kz1ad1wzrijrhwsnq3lj7qprc86zp6a6r5drk8
actual-value: 84
result: PASS

test-name: 'download' built-in builder, not found
location: /home/mcd/guix/tests/derivations.scm:258
source:
+ (test-assert
+   "'download' built-in builder, not found"
+   (with-http-server
+     404
+     "not found"
+     (let* ((drv (derivation
+                   %store
+                   "will-never-be-found"
+                   "builtin:download"
+                   '()
+                   #:env-vars
+                   `(("url" unquote (object->string (%local-url))))
+                   #:hash-algo
+                   'sha256
+                   #:hash
+                   (sha256 (random-bytevector 100)))))
+       (guard (c ((nix-protocol-error? c)
+                  (string-contains
+                    (nix-protocol-error-message (pk c))
+                    "failed")))
+              (build-derivations %store (list drv))
+              #f))))
@ build-started /home/mcd/guix/test-tmp/store/nw9bp0dsf6f2q03mzb9ankgprhb4md1k-will-never-be-found.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/nw//9bp0dsf6f2q03mzb9ankgprhb4md1k-will-never-be-found.drv.bz2

Starting download of /home/mcd/guix/test-tmp/store/g129i7v6gh4xjl77a14jl6q5ns4qjbkk-will-never-be-found
From http://localhost:10500/foo/bar...
ERROR: download failed "http://localhost:10500/foo/bar" 404 "Such is life"
failed to download "/home/mcd/guix/test-tmp/store/g129i7v6gh4xjl77a14jl6q5ns4qjbkk-will-never-be-found" from "http://localhost:10500/foo/bar"
builder for `/home/mcd/guix/test-tmp/store/nw9bp0dsf6f2q03mzb9ankgprhb4md1k-will-never-be-found.drv' failed to produce output path `/home/mcd/guix/test-tmp/store/g129i7v6gh4xjl77a14jl6q5ns4qjbkk-will-never-be-found'
@ build-failed /home/mcd/guix/test-tmp/store/nw9bp0dsf6f2q03mzb9ankgprhb4md1k-will-never-be-found.drv - 1 builder for `/home/mcd/guix/test-tmp/store/nw9bp0dsf6f2q03mzb9ankgprhb4md1k-will-never-be-found.drv' failed to produce output path `/home/mcd/guix/test-tmp/store/g129i7v6gh4xjl77a14jl6q5ns4qjbkk-will-never-be-found'

;;; (#<condition &nix-protocol-error [message: "build of `/home/mcd/guix/test-tmp/store/nw9bp0dsf6f2q03mzb9ankgprhb4md1k-will-never-be-found.drv' failed" status: 1] 2e095d0>)
actual-value: 98
result: PASS

test-name: 'download' built-in builder, not fixed-output
location: /home/mcd/guix/tests/derivations.scm:271
source:
+ (test-assert
+   "'download' built-in builder, not fixed-output"
+   (let* ((source (add-text-to-store %store "hello" "hi!"))
+          (url (string-append "file://" source))
+          (drv (derivation
+                 %store
+                 "world"
+                 "builtin:download"
+                 '()
+                 #:env-vars
+                 `(("url" unquote (object->string url))))))
+     (guard (c ((nix-protocol-error? c)
+                (string-contains
+                  (nix-protocol-error-message c)
+                  "failed")))
+            (build-derivations %store (list drv))
+            #f)))
@ build-started /home/mcd/guix/test-tmp/store/r6mdfc4hkzhx63rz3asq0c33ng0sfnjq-world.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/r6//mdfc4hkzhx63rz3asq0c33ng0sfnjq-world.drv.bz2
guix perform-download: error: /home/mcd/guix/test-tmp/store/r6mdfc4hkzhx63rz3asq0c33ng0sfnjq-world.drv is not a fixed-output derivation
builder for `/home/mcd/guix/test-tmp/store/r6mdfc4hkzhx63rz3asq0c33ng0sfnjq-world.drv' failed with exit code 1
@ build-failed /home/mcd/guix/test-tmp/store/r6mdfc4hkzhx63rz3asq0c33ng0sfnjq-world.drv - 1 builder for `/home/mcd/guix/test-tmp/store/r6mdfc4hkzhx63rz3asq0c33ng0sfnjq-world.drv' failed with exit code 1
actual-value: 84
result: PASS

test-name: 'download' built-in builder, check mode
location: /home/mcd/guix/tests/derivations.scm:284
source:
+ (test-assert
+   "'download' built-in builder, check mode"
+   (let* ((text (random-text))
+          (drv (derivation
+                 %store
+                 "world"
+                 "builtin:download"
+                 '()
+                 #:env-vars
+                 `(("url" unquote (object->string (%local-url))))
+                 #:hash-algo
+                 'sha256
+                 #:hash
+                 (sha256 (string->utf8 text)))))
+     (and (with-http-server
+            200
+            text
+            (build-derivations %store (list drv)))
+          (with-http-server
+            200
+            text
+            (build-derivations
+              %store
+              (list drv)
+              (build-mode check)))
+          (string=?
+            (call-with-input-file
+              (derivation->output-path drv)
+              get-string-all)
+            text))))
@ build-started /home/mcd/guix/test-tmp/store/894fsjy25cn73ap5bq8rrcxbp1hahg36-world.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/89//4fsjy25cn73ap5bq8rrcxbp1hahg36-world.drv.bz2

Starting download of /home/mcd/guix/test-tmp/store/pmzrflyjmdsqih6hwj3wn62p7zb3xacq-world
From http://localhost:10500/foo/bar...
\r^[[K bar  64B                               0B/s 00:00 [                    ]   0.0%\r^[[K bar  64B                            80KiB/s 00:00 [####################] 100.0%\r^[[K bar  64B                            43KiB/s 00:00 [####################] 100.0%
@ build-succeeded /home/mcd/guix/test-tmp/store/894fsjy25cn73ap5bq8rrcxbp1hahg36-world.drv -
@ build-started /home/mcd/guix/test-tmp/store/894fsjy25cn73ap5bq8rrcxbp1hahg36-world.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/89//4fsjy25cn73ap5bq8rrcxbp1hahg36-world.drv.bz2

Starting download of /home/mcd/guix/test-tmp/store/1wls9sj8zl4cyfh5b4c6v3iral8hbzbg-world
From http://localhost:10500/foo/bar...
\r^[[K bar  64B                               0B/s 00:00 [                    ]   0.0%\r^[[K bar  64B                            78KiB/s 00:00 [####################] 100.0%\r^[[K bar  64B                            53KiB/s 00:00 [####################] 100.0%
warning: rewriting hashes in `/home/mcd/guix/test-tmp/store/pmzrflyjmdsqih6hwj3wn62p7zb3xacq-world'; cross fingers
actual-value: #t
result: PASS

test-name: derivation-name
location: /home/mcd/guix/tests/derivations.scm:303
source:
+ (test-equal
+   "derivation-name"
+   "foo-0.0"
+   (let ((drv (derivation %store "foo-0.0" %bash '())))
+     (derivation-name drv)))
expected-value: "foo-0.0"
actual-value: "foo-0.0"
result: PASS

test-name: derivation-output-names
location: /home/mcd/guix/tests/derivations.scm:308
source:
+ (test-equal
+   "derivation-output-names"
+   '(("out") ("bar" "chbouib"))
+   (let ((drv1 (derivation %store "foo-0.0" %bash '()))
+         (drv2 (derivation
+                 %store
+                 "foo-0.0"
+                 %bash
+                 '()
+                 #:outputs
+                 '("bar" "chbouib"))))
+     (list (derivation-output-names drv1)
+           (derivation-output-names drv2))))
expected-value: (("out") ("bar" "chbouib"))
actual-value: (("out") ("bar" "chbouib"))
result: PASS

test-name: offloadable-derivation?
location: /home/mcd/guix/tests/derivations.scm:316
source:
+ (test-assert
+   "offloadable-derivation?"
+   (and (offloadable-derivation?
+          (derivation %store "foo" %bash '()))
+        (offloadable-derivation?
+          (derivation
+            %store
+            "foo"
+            %bash
+            '()
+            #:substitutable?
+            #f))
+        (not (offloadable-derivation?
+               (derivation
+                 %store
+                 "foo"
+                 %bash
+                 '()
+                 #:local-build?
+                 #t)))))
actual-value: #t
result: PASS

test-name: substitutable-derivation?
location: /home/mcd/guix/tests/derivations.scm:325
source:
+ (test-assert
+   "substitutable-derivation?"
+   (and (substitutable-derivation?
+          (derivation %store "foo" %bash '()))
+        (substitutable-derivation?
+          (derivation
+            %store
+            "foo"
+            %bash
+            '()
+            #:local-build?
+            #t))
+        (not (substitutable-derivation?
+               (derivation
+                 %store
+                 "foo"
+                 %bash
+                 '()
+                 #:substitutable?
+                 #f)))))
actual-value: #t
result: PASS

test-name: fixed-output-derivation?
location: /home/mcd/guix/tests/derivations.scm:334
source:
+ (test-assert
+   "fixed-output-derivation?"
+   (let* ((builder
+            (add-text-to-store
+              %store
+              "my-fixed-builder.sh"
+              "echo -n hello > $out"
+              '()))
+          (hash (sha256 (string->utf8 "hello")))
+          (drv (derivation
+                 %store
+                 "fixed"
+                 %bash
+                 `(,builder)
+                 #:inputs
+                 `((,builder))
+                 #:hash
+                 hash
+                 #:hash-algo
+                 'sha256)))
+     (fixed-output-derivation? drv)))
actual-value: #t
result: PASS

test-name: fixed-output derivation
location: /home/mcd/guix/tests/derivations.scm:344
source:
+ (test-assert
+   "fixed-output derivation"
+   (let* ((builder
+            (add-text-to-store
+              %store
+              "my-fixed-builder.sh"
+              "echo -n hello > $out"
+              '()))
+          (hash (sha256 (string->utf8 "hello")))
+          (drv (derivation
+                 %store
+                 "fixed"
+                 %bash
+                 `(,builder)
+                 #:inputs
+                 `((,builder))
+                 #:hash
+                 hash
+                 #:hash-algo
+                 'sha256))
+          (succeeded?
+            (build-derivations %store (list drv))))
+     (and succeeded?
+          (let ((p (derivation->output-path drv)))
+            (and (equal?
+                   (string->utf8 "hello")
+                   (call-with-input-file p get-bytevector-all))
+                 (bytevector? (query-path-hash %store p)))))))
actual-value: #t
result: PASS

test-name: fixed-output derivation: output paths are equal
location: /home/mcd/guix/tests/derivations.scm:359
source:
+ (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")))
+          (drv1 (derivation
+                  %store
+                  "fixed"
+                  %bash
+                  `(,builder1)
+                  #:hash
+                  hash
+                  #:hash-algo
+                  'sha256))
+          (drv2 (derivation
+                  %store
+                  "fixed"
+                  %bash
+                  `(,builder2)
+                  #:hash
+                  hash
+                  #:hash-algo
+                  'sha256))
+          (succeeded?
+            (build-derivations %store (list drv1 drv2))))
+     (and succeeded?
+          (equal?
+            (derivation->output-path drv1)
+            (derivation->output-path drv2)))))
actual-value: #t
result: PASS

test-name: fixed-output derivation, recursive
location: /home/mcd/guix/tests/derivations.scm:376
source:
+ (test-assert
+   "fixed-output derivation, recursive"
+   (let* ((builder
+            (add-text-to-store
+              %store
+              "my-fixed-builder.sh"
+              "echo -n hello > $out"
+              '()))
+          (hash (sha256 (string->utf8 "hello")))
+          (drv (derivation
+                 %store
+                 "fixed-rec"
+                 %bash
+                 `(,builder)
+                 #:inputs
+                 `((,builder))
+                 #:hash
+                 (base32
+                   "0sg9f58l1jj88w6pdrfdpj5x9b1zrwszk84j81zvby36q9whhhqa")
+                 #:hash-algo
+                 'sha256
+                 #:recursive?
+                 #t))
+          (succeeded?
+            (build-derivations %store (list drv))))
+     (and succeeded?
+          (let ((p (derivation->output-path drv)))
+            (and (equal?
+                   (string->utf8 "hello")
+                   (call-with-input-file p get-bytevector-all))
+                 (bytevector? (query-path-hash %store p)))))))
actual-value: #t
result: PASS

test-name: derivation with a fixed-output input
location: /home/mcd/guix/tests/derivations.scm:393
source:
+ (test-assert
+   "derivation with a fixed-output input"
+   (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"
+              %bash
+              `(,builder1)
+              #:hash
+              hash
+              #:hash-algo
+              'sha256))
+          (fixed2
+            (derivation
+              %store
+              "fixed"
+              %bash
+              `(,builder2)
+              #:hash
+              hash
+              #:hash-algo
+              'sha256))
+          (fixed-out (derivation->output-path fixed1))
+          (builder3
+            (add-text-to-store
+              %store
+              "final-builder.sh"
+              "echo $in ; (read -u 3 c; echo $c) 3< $in > $out"
+              '()))
+          (final1
+            (derivation
+              %store
+              "final"
+              %bash
+              `(,builder3)
+              #:env-vars
+              `(("in" unquote fixed-out))
+              #:inputs
+              `((,%bash) (,builder3) (,fixed1))))
+          (final2
+            (derivation
+              %store
+              "final"
+              %bash
+              `(,builder3)
+              #:env-vars
+              `(("in" unquote fixed-out))
+              #:inputs
+              `((,%bash) (,builder3) (,fixed2))))
+          (succeeded?
+            (build-derivations %store (list final1 final2))))
+     (and succeeded?
+          (equal?
+            (derivation->output-path final1)
+            (derivation->output-path final2)))))
actual-value: #t
result: PASS

test-name: multiple-output derivation
location: /home/mcd/guix/tests/derivations.scm:427
source:
+ (test-assert
+   "multiple-output derivation"
+   (let* ((builder
+            (add-text-to-store
+              %store
+              "my-fixed-builder.sh"
+              "echo one > $out ; echo two > $second"
+              '()))
+          (drv (derivation
+                 %store
+                 "fixed"
+                 %bash
+                 `(,builder)
+                 #:env-vars
+                 '(("HOME" . "/homeless")
+                   ("zzz" . "Z!")
+                   ("AAA" . "A!"))
+                 #:inputs
+                 `((,%bash) (,builder))
+                 #:outputs
+                 '("out" "second")))
+          (succeeded?
+            (build-derivations %store (list drv))))
+     (and succeeded?
+          (let ((one (derivation->output-path drv "out"))
+                (two (derivation->output-path drv "second")))
+            (and (lset= equal?
+                        (derivation->output-paths drv)
+                        `(("out" unquote one) ("second" unquote two)))
+                 (eq? 'one (call-with-input-file one read))
+                 (eq? 'two (call-with-input-file two read)))))))
actual-value: #t
result: PASS

test-name: multiple-output derivation, non-alphabetic order
location: /home/mcd/guix/tests/derivations.scm:448
source:
+ (test-assert
+   "multiple-output derivation, non-alphabetic order"
+   (let* ((builder
+            (add-text-to-store
+              %store
+              "my-fixed-builder.sh"
+              "echo one > $out ; echo two > $AAA"
+              '()))
+          (drv (derivation
+                 %store
+                 "fixed"
+                 %bash
+                 `(,builder)
+                 #:inputs
+                 `((,%bash) (,builder))
+                 #:outputs
+                 '("out" "AAA")))
+          (succeeded?
+            (build-derivations %store (list drv))))
+     (and succeeded?
+          (let ((one (derivation->output-path drv "out"))
+                (two (derivation->output-path drv "AAA")))
+            (and (eq? 'one (call-with-input-file one read))
+                 (eq? 'two (call-with-input-file two read)))))))
actual-value: #t
result: PASS

test-name: read-derivation vs. derivation
location: /home/mcd/guix/tests/derivations.scm:465
source:
+ (test-assert
+   "read-derivation vs. derivation"
+   (let* ((sources
+            (unfold
+              (cut >= <> 10)
+              (lambda (n)
+                (add-text-to-store
+                  %store
+                  (format #f "input~a" n)
+                  (random-text)))
+              #{1+}#
+              0))
+          (inputs
+            (map (lambda (file)
+                   (derivation
+                     %store
+                     "derivation-input"
+                     %bash
+                     '()
+                     #:inputs
+                     `((,%bash) (,file))))
+                 sources))
+          (builder
+            (add-text-to-store
+              %store
+              "builder.sh"
+              "echo one > $one ; echo two > $two"
+              '()))
+          (drv (derivation
+                 %store
+                 "derivation"
+                 %bash
+                 `(,builder)
+                 #:inputs
+                 `((,%bash)
+                   (,builder)
+                   ,@(map list (append sources inputs)))
+                 #:outputs
+                 '("two" "one")))
+          (drv* (call-with-input-file
+                  (derivation-file-name drv)
+                  read-derivation)))
+     (equal? drv* drv)))
actual-value: #t
result: PASS

test-name: multiple-output derivation, derivation-path->output-path
location: /home/mcd/guix/tests/derivations.scm:492
source:
+ (test-assert
+   "multiple-output derivation, derivation-path->output-path"
+   (let* ((builder
+            (add-text-to-store
+              %store
+              "builder.sh"
+              "echo one > $out ; echo two > $second"
+              '()))
+          (drv (derivation
+                 %store
+                 "multiple"
+                 %bash
+                 `(,builder)
+                 #:outputs
+                 '("out" "second")))
+          (drv-file (derivation-file-name drv))
+          (one (derivation->output-path drv "out"))
+          (two (derivation->output-path drv "second"))
+          (first (derivation-path->output-path drv-file "out"))
+          (second
+            (derivation-path->output-path drv-file "second")))
+     (and (not (string=? one two))
+          (string-suffix? "-second" two)
+          (string=? first one)
+          (string=? second two))))
actual-value: #t
result: PASS

test-name: user of multiple-output derivation
location: /home/mcd/guix/tests/derivations.scm:509
source:
+ (test-assert
+   "user of multiple-output derivation"
+   (let* ((builder1
+            (add-text-to-store
+              %store
+              "my-mo-builder.sh"
+              "echo one > $out ; echo two > $two"
+              '()))
+          (mdrv (derivation
+                  %store
+                  "multiple-output"
+                  %bash
+                  `(,builder1)
+                  #:inputs
+                  `((,%bash) (,builder1))
+                  #:outputs
+                  '("out" "two")))
+          (builder2
+            (add-text-to-store
+              %store
+              "my-mo-user-builder.sh"
+              "read x < $one;\n                                         read y < $two;\n                                         echo \"($x $y)\" > $out"
+              '()))
+          (udrv (derivation
+                  %store
+                  "multiple-output-user"
+                  %bash
+                  `(,builder2)
+                  #:env-vars
+                  `(("one"
+                     unquote
+                     (derivation->output-path mdrv "out"))
+                    ("two"
+                     unquote
+                     (derivation->output-path mdrv "two")))
+                  #:inputs
+                  `((,%bash) (,builder2) (,mdrv) (,mdrv "two")))))
+     (and (build-derivations %store (list (pk 'udrv udrv)))
+          (let ((p (derivation->output-path udrv)))
+            (and (valid-path? %store p)
+                 (equal? '(one two) (call-with-input-file p read)))))))

;;; (udrv #<derivation /home/mcd/guix/test-tmp/store/vv369pfxxgasr0kfkja4x9fkbhzvh4cf-multiple-output-user.drv => /home/mcd/guix/test-tmp/store/l6ln5gv5x6lk9yn02pgpc8njbaispmlf-multiple-output-user 38cb910>)
actual-value: #t
result: PASS

test-name: derivation with #:references-graphs
location: /home/mcd/guix/tests/derivations.scm:542
source:
+ (test-assert
+   "derivation with #:references-graphs"
+   (let* ((input1
+            (add-text-to-store
+              %store
+              "foo"
+              "hello"
+              (list %bash)))
+          (input2
+            (add-text-to-store
+              %store
+              "bar"
+              (number->string (random 7777))
+              (list input1)))
+          (builder
+            (add-text-to-store
+              %store
+              "build-graph"
+              (format
+                #f
+                "\n~a $out\n (while read l ; do echo $l ; done) < bash > $out/bash\n (while read l ; do echo $l ; done) < input1 > $out/input1\n (while read l ; do echo $l ; done) < input2 > $out/input2"
+                %mkdir)
+              (list %mkdir)))
+          (drv (derivation
+                 %store
+                 "closure-graphs"
+                 %bash
+                 `(,builder)
+                 #:references-graphs
+                 `(("bash" unquote %bash)
+                   ("input1" unquote input1)
+                   ("input2" unquote input2))
+                 #:inputs
+                 `((,%bash) (,builder))))
+          (out (derivation->output-path drv)))
+     (define (deps path . deps)
+       (let ((count (length deps)))
+         (string-append
+           path
+           "\n\n"
+           (number->string count)
+           "\n"
+           (string-join (sort deps string<?) "\n")
+           (if (zero? count) "" "\n"))))
+     (and (build-derivations %store (list drv))
+          (equal?
+            (directory-contents out get-string-all)
+            `(("/bash" unquote (string-append %bash "\n\n0\n"))
+              ("/input1"
+               unquote
+               (if (string>? input1 %bash)
+                 (string-append (deps %bash) (deps input1 %bash))
+                 (string-append (deps input1 %bash) (deps %bash))))
+              ("/input2"
+               unquote
+               (string-concatenate
+                 (map cdr
+                      (sort (map (lambda (p d) (cons p (apply deps p d)))
+                                 (list %bash input1 input2)
+                                 (list '() (list %bash) (list input1)))
+                            (lambda (x y)
+                              (match x
+                                     ((p1 . _)
+                                      (match y
+                                             ((p2 . _)
+                                              (string<? p1 p2)))))))))))))))
actual-value: #t
result: PASS

test-name: derivation #:allowed-references, ok
location: /home/mcd/guix/tests/derivations.scm:592
source:
+ (test-assert
+   "derivation #:allowed-references, ok"
+   (let ((drv (derivation
+                %store
+                "allowed"
+                %bash
+                '("-c" "echo hello > $out")
+                #:inputs
+                `((,%bash))
+                #:allowed-references
+                '())))
+     (build-derivations %store (list drv))))
actual-value: #t
result: PASS

test-name: derivation #:allowed-references, not allowed
location: /home/mcd/guix/tests/derivations.scm:599
source:
+ (test-assert
+   "derivation #:allowed-references, not allowed"
+   (let* ((txt (add-text-to-store %store "foo" "Hello, world."))
+          (drv (derivation
+                 %store
+                 "disallowed"
+                 %bash
+                 `("-c" ,(string-append "echo " txt "> $out"))
+                 #:inputs
+                 `((,%bash) (,txt))
+                 #:allowed-references
+                 '())))
+     (guard (c ((nix-protocol-error? c) #t))
+            (build-derivations %store (list drv))
+            #f)))
@ build-started /home/mcd/guix/test-tmp/store/49cd7k7s3xwzq0924w77wra8ri4129nw-disallowed.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/49//cd7k7s3xwzq0924w77wra8ri4129nw-disallowed.drv.bz2
output (`/home/mcd/guix/test-tmp/store/4sa5v69hnvmdp2fl7qzdxwqdm8x8xfbg-disallowed') is not allowed to refer to path `/home/mcd/guix/test-tmp/store/knifs38szgydqmxy8cdldna7ig62g5a8-foo'
@ build-failed /home/mcd/guix/test-tmp/store/49cd7k7s3xwzq0924w77wra8ri4129nw-disallowed.drv - 1 output (`/home/mcd/guix/test-tmp/store/4sa5v69hnvmdp2fl7qzdxwqdm8x8xfbg-disallowed') is not allowed to refer to path `/home/mcd/guix/test-tmp/store/knifs38szgydqmxy8cdldna7ig62g5a8-foo'
actual-value: #t
result: PASS

test-name: derivation #:allowed-references, self allowed
location: /home/mcd/guix/tests/derivations.scm:611
source:
+ (test-assert
+   "derivation #:allowed-references, self allowed"
+   (let ((drv (derivation
+                %store
+                "allowed"
+                %bash
+                '("-c" "echo $out > $out")
+                #:inputs
+                `((,%bash))
+                #:allowed-references
+                '("out"))))
+     (build-derivations %store (list drv))))
actual-value: #t
result: PASS

test-name: derivation #:allowed-references, self not allowed
location: /home/mcd/guix/tests/derivations.scm:618
source:
+ (test-assert
+   "derivation #:allowed-references, self not allowed"
+   (let ((drv (derivation
+                %store
+                "disallowed"
+                %bash
+                `("-c" ,"echo $out > $out")
+                #:inputs
+                `((,%bash))
+                #:allowed-references
+                '())))
+     (guard (c ((nix-protocol-error? c) #t))
+            (build-derivations %store (list drv))
+            #f)))
@ build-started /home/mcd/guix/test-tmp/store/9hnw66l8761z6kwzgfnwbf8jydwl4vm1-disallowed.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/9h//nw66l8761z6kwzgfnwbf8jydwl4vm1-disallowed.drv.bz2
output (`/home/mcd/guix/test-tmp/store/arbn748ck1rydjjsylvsr8chqwvhavm2-disallowed') is not allowed to refer to path `/home/mcd/guix/test-tmp/store/arbn748ck1rydjjsylvsr8chqwvhavm2-disallowed'
@ build-failed /home/mcd/guix/test-tmp/store/9hnw66l8761z6kwzgfnwbf8jydwl4vm1-disallowed.drv - 1 output (`/home/mcd/guix/test-tmp/store/arbn748ck1rydjjsylvsr8chqwvhavm2-disallowed') is not allowed to refer to path `/home/mcd/guix/test-tmp/store/arbn748ck1rydjjsylvsr8chqwvhavm2-disallowed'
actual-value: #t
result: PASS

test-name: derivation #:disallowed-references, ok
location: /home/mcd/guix/tests/derivations.scm:629
source:
+ (test-assert
+   "derivation #:disallowed-references, ok"
+   (let ((drv (derivation
+                %store
+                "disallowed"
+                %bash
+                '("-c" "echo hello > $out")
+                #:inputs
+                `((,%bash))
+                #:disallowed-references
+                '("out"))))
+     (build-derivations %store (list drv))))
actual-value: #t
result: PASS

test-name: derivation #:disallowed-references, not ok
location: /home/mcd/guix/tests/derivations.scm:636
source:
+ (test-assert
+   "derivation #:disallowed-references, not ok"
+   (let* ((txt (add-text-to-store %store "foo" "Hello, world."))
+          (drv (derivation
+                 %store
+                 "disdisallowed"
+                 %bash
+                 `("-c" ,(string-append "echo " txt "> $out"))
+                 #:inputs
+                 `((,%bash) (,txt))
+                 #:disallowed-references
+                 (list txt))))
+     (guard (c ((nix-protocol-error? c) #t))
+            (build-derivations %store (list drv))
+            #f)))
@ build-started /home/mcd/guix/test-tmp/store/jr83rspgy4ck19i9m6iqqzq0hafrdy5v-disdisallowed.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/jr//83rspgy4ck19i9m6iqqzq0hafrdy5v-disdisallowed.drv.bz2
output (`/home/mcd/guix/test-tmp/store/mv4g966c4dyck82wlw2clw5z268vm0xy-disdisallowed') is not allowed to refer to path `/home/mcd/guix/test-tmp/store/knifs38szgydqmxy8cdldna7ig62g5a8-foo'
@ build-failed /home/mcd/guix/test-tmp/store/jr83rspgy4ck19i9m6iqqzq0hafrdy5v-disdisallowed.drv - 1 output (`/home/mcd/guix/test-tmp/store/mv4g966c4dyck82wlw2clw5z268vm0xy-disdisallowed') is not allowed to refer to path `/home/mcd/guix/test-tmp/store/knifs38szgydqmxy8cdldna7ig62g5a8-foo'
actual-value: #t
result: PASS

test-name: derivation #:leaked-env-vars
location: /home/mcd/guix/tests/derivations.scm:651
source:
+ (test-equal
+   "derivation #:leaked-env-vars"
+   (getenv "NIX_STATE_DIR")
+   (let* ((value (getenv "NIX_STATE_DIR"))
+          (drv (derivation
+                 %store
+                 "leaked-env-vars"
+                 %bash
+                 '("-c" "echo -n $NIX_STATE_DIR > $out")
+                 #:hash
+                 (sha256 (string->utf8 value))
+                 #:hash-algo
+                 'sha256
+                 #:inputs
+                 `((,%bash))
+                 #:leaked-env-vars
+                 '("NIX_STATE_DIR"))))
+     (and (build-derivations %store (list drv))
+          (call-with-input-file
+            (derivation->output-path drv)
+            get-string-all))))
@ build-started /home/mcd/guix/test-tmp/store/4x0gmyf4lqn8vwc1ddl60gp3z7ar9hdk-leaked-env-vars.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/4x//0gmyf4lqn8vwc1ddl60gp3z7ar9hdk-leaked-env-vars.drv.bz2
@ build-succeeded /home/mcd/guix/test-tmp/store/4x0gmyf4lqn8vwc1ddl60gp3z7ar9hdk-leaked-env-vars.drv -
expected-value: "/home/mcd/guix/test-tmp/var/20935"
actual-value: "/home/mcd/guix/test-tmp/var/20935"
result: PASS

test-name: build derivation with coreutils
location: /home/mcd/guix/tests/derivations.scm:672
source:
+ (test-assert
+   "build derivation with coreutils"
+   (let* ((builder
+            (add-text-to-store
+              %store
+              "build-with-coreutils.sh"
+              "echo $PATH ; mkdir --version ; mkdir $out ; touch $out/good"
+              '()))
+          (drv (derivation
+                 %store
+                 "foo"
+                 %bash
+                 `(,builder)
+                 #:env-vars
+                 `(("PATH"
+                    unquote
+                    (string-append
+                      (derivation->output-path %coreutils)
+                      "/bin")))
+                 #:inputs
+                 `((,builder) (,%coreutils))))
+          (succeeded?
+            (build-derivations %store (list drv))))
+     (and succeeded?
+          (let ((p (derivation->output-path drv)))
+            (and (valid-path? %store p)
+                 (file-exists? (string-append p "/good")))))))
actual-value: #t
result: PASS

test-name: build-expression->derivation and invalid module name
location: /home/mcd/guix/tests/derivations.scm:695
source:
+ (test-equal
+   "build-expression->derivation and invalid module name"
+   '(file-search-error
+      "guix/module/that/does/not/exist.scm")
+   (guard (c ((file-search-error? c)
+              (list 'file-search-error
+                    (file-search-error-file-name c))))
+          (build-expression->derivation
+            %store
+            "foo"
+            #t
+            #:modules
+            '((guix module that does not exist)))))
expected-value: (file-search-error "guix/module/that/does/not/exist.scm")
actual-value: (file-search-error "guix/module/that/does/not/exist.scm")
result: PASS

test-name: build-expression->derivation and builder encoding
location: /home/mcd/guix/tests/derivations.scm:704
source:
+ (test-equal
+   "build-expression->derivation and builder encoding"
+   '("UTF-8" #t)
+   (let* ((exp '(λ (α) (+ α 1)))
+          (drv (build-expression->derivation %store "foo" exp)))
+     (match (derivation-builder-arguments drv)
+            ((... builder)
+             (with-fluids
+               ((%default-port-encoding "UTF-8"))
+               (call-with-input-file
+                 builder
+                 (lambda (port)
+                   (list (port-encoding port)
+                         (->bool
+                           (string-contains
+                             (get-string-all port)
+                             "(λ (α) (+ α 1))"))))))))))
expected-value: ("UTF-8" #t)
actual-value: ("UTF-8" #t)
result: PASS

test-name: build-expression->derivation and derivation-prerequisites
location: /home/mcd/guix/tests/derivations.scm:718
source:
+ (test-assert
+   "build-expression->derivation and derivation-prerequisites"
+   (let ((drv (build-expression->derivation %store "fail" #f)))
+     (any (match-lambda
+            (($ <derivation-input> path)
+             (string=?
+               path
+               (derivation-file-name (%guile-for-build)))))
+          (derivation-prerequisites drv))))
actual-value: #t
result: PASS

test-name: derivation-prerequisites and valid-derivation-input?
location: /home/mcd/guix/tests/derivations.scm:725
source:
+ (test-assert
+   "derivation-prerequisites and valid-derivation-input?"
+   (let* ((a (build-expression->derivation
+               %store
+               "a"
+               '(mkdir %output)))
+          (b (build-expression->derivation
+               %store
+               "b"
+               `(list ,(random-text))))
+          (c (build-expression->derivation
+               %store
+               "c"
+               `(mkdir %output)
+               #:inputs
+               `(("a" ,a) ("b" ,b)))))
+     (build-derivations
+       %store
+       (list a
+             (package-derivation %store %bootstrap-guile)))
+     (match (derivation-prerequisites
+              c
+              (cut valid-derivation-input? %store <>))
+            ((($ <derivation-input> file ("out")))
+             (string=? file (derivation-file-name b)))
+            (x (pk 'fail x #f)))))
actual-value: #t
result: PASS

test-name: build-expression->derivation without inputs
location: /home/mcd/guix/tests/derivations.scm:743
source:
+ (test-assert
+   "build-expression->derivation without inputs"
+   (let* ((builder
+            '(begin
+               (mkdir %output)
+               (call-with-output-file
+                 (string-append %output "/test")
+                 (lambda (p) (display '(hello guix) p)))))
+          (drv (build-expression->derivation
+                 %store
+                 "goo"
+                 builder))
+          (succeeded?
+            (build-derivations %store (list drv))))
+     (and succeeded?
+          (let ((p (derivation->output-path drv)))
+            (equal?
+              '(hello guix)
+              (call-with-input-file
+                (string-append p "/test")
+                read))))))
actual-value: #t
result: PASS

test-name: build-expression->derivation and max-silent-time
location: /home/mcd/guix/tests/derivations.scm:756
source:
+ (test-assert
+   "build-expression->derivation and max-silent-time"
+   (let* ((store (let ((s (open-connection)))
+                   (set-build-options s #:max-silent-time 1)
+                   s))
+          (builder '(begin (sleep 100) (mkdir %output) #t))
+          (drv (build-expression->derivation
+                 store
+                 "silent"
+                 builder))
+          (out-path (derivation->output-path drv)))
+     (guard (c ((nix-protocol-error? c)
+                (and (string-contains
+                       (nix-protocol-error-message c)
+                       "failed")
+                     (not (valid-path? store out-path)))))
+            (build-derivations store (list drv))
+            #f)))
substitute: warning: authentication and authorization of substitutes disabled!
substitute: guix substitute: warning: ACL for archive imports seems to be uninitialized, substitutes may be unavailable
@ build-started /home/mcd/guix/test-tmp/store/a6214lr785mj83acda3hmzmrvn2dcv78-silent.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/a6//214lr785mj83acda3hmzmrvn2dcv78-silent.drv.bz2
building of `/home/mcd/guix/test-tmp/store/a6214lr785mj83acda3hmzmrvn2dcv78-silent.drv' timed out after 1 seconds of silence
@ build-failed /home/mcd/guix/test-tmp/store/a6214lr785mj83acda3hmzmrvn2dcv78-silent.drv - timeout
killing process 21426
actual-value: #t
result: PASS

test-name: build-expression->derivation and timeout
location: /home/mcd/guix/tests/derivations.scm:770
source:
+ (test-assert
+   "build-expression->derivation and timeout"
+   (let* ((store (let ((s (open-connection)))
+                   (set-build-options s #:timeout 1)
+                   s))
+          (builder '(begin (sleep 100) (mkdir %output) #t))
+          (drv (build-expression->derivation
+                 store
+                 "slow"
+                 builder))
+          (out-path (derivation->output-path drv)))
+     (guard (c ((nix-protocol-error? c)
+                (and (string-contains
+                       (nix-protocol-error-message c)
+                       "failed")
+                     (not (valid-path? store out-path)))))
+            (build-derivations store (list drv))
+            #f)))
substitute: warning: authentication and authorization of substitutes disabled!
substitute: guix substitute: warning: ACL for archive imports seems to be uninitialized, substitutes may be unavailable
@ build-started /home/mcd/guix/test-tmp/store/w974mvsf5fdnc0nmaf555940563qdsk7-slow.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/w9//74mvsf5fdnc0nmaf555940563qdsk7-slow.drv.bz2
building of `/home/mcd/guix/test-tmp/store/w974mvsf5fdnc0nmaf555940563qdsk7-slow.drv' timed out after 1 seconds
@ build-failed /home/mcd/guix/test-tmp/store/w974mvsf5fdnc0nmaf555940563qdsk7-slow.drv - timeout
killing process 21472
actual-value: #t
result: PASS

test-name: build-expression->derivation and derivation-prerequisites-to-build
location: /home/mcd/guix/tests/derivations.scm:784
source:
+ (test-assert
+   "build-expression->derivation and derivation-prerequisites-to-build"
+   (let ((drv (build-expression->derivation %store "fail" #f)))
+     (null? (derivation-prerequisites-to-build %store drv))))
actual-value: #t
result: PASS

test-name: derivation-prerequisites-to-build when outputs already present
location: /home/mcd/guix/tests/derivations.scm:790
source:
+ (test-assert
+   "derivation-prerequisites-to-build when outputs already present"
+   (let* ((builder '(begin (mkdir %output) #t))
+          (input-drv
+            (build-expression->derivation
+              %store
+              "input"
+              builder))
+          (input-path
+            (derivation-output-path
+              (assoc-ref (derivation-outputs input-drv) "out")))
+          (drv (build-expression->derivation
+                 %store
+                 "something"
+                 builder
+                 #:inputs
+                 `(("i" ,input-drv))))
+          (output (derivation->output-path drv)))
+     (when (valid-path? %store input-path)
+           (delete-paths %store (list input-path)))
+     (when (valid-path? %store output)
+           (delete-paths %store (list output)))
+     (and (equal?
+            (map derivation-input-path
+                 (derivation-prerequisites-to-build %store drv))
+            (list (derivation-file-name input-drv)))
+          (build-derivations %store (list drv))
+          (delete-paths %store (list input-path))
+          (not (valid-path? %store input-path))
+          (null? (derivation-prerequisites-to-build %store drv)))))
finding garbage collector roots...
actual-value: #f
actual-error:
+ (srfi-34
+   #<condition &nix-protocol-error [message: "program `/home/mcd/guix/nix/scripts/list-runtime-roots' failed with exit code 1" status: 1] 380d4b0>)
result: FAIL

test-name: derivation-prerequisites-to-build and substitutes
location: /home/mcd/guix/tests/derivations.scm:819
source:
+ (test-assert
+   "derivation-prerequisites-to-build and substitutes"
+   (let* ((store (open-connection))
+          (drv (build-expression->derivation
+                 store
+                 "prereq-subst"
+                 (random 1000)))
+          (output (derivation->output-path drv)))
+     (set-build-options
+       store
+       #:use-substitutes?
+       #t
+       #:substitute-urls
+       (%test-substitute-urls))
+     (with-derivation-narinfo
+       drv
+       (let-values
+         (((build download)
+           (derivation-prerequisites-to-build store drv))
+          ((build* download*)
+           (derivation-prerequisites-to-build
+             store
+             drv
+             #:substitutable-info
+             (const #f))))
+         (and (null? build)
+              (equal?
+                (map substitutable-path download)
+                (list output))
+              (null? download*)
+              (null? build*))))))
substitute: warning: authentication and authorization of substitutes disabled!
substitute: guix substitute: warning: ACL for archive imports seems to be uninitialized, substitutes may be unavailable
actual-value: #t
result: PASS

test-name: derivation-prerequisites-to-build and substitutes, non-substitutable build
location: /home/mcd/guix/tests/derivations.scm:841
source:
+ (test-assert
+   "derivation-prerequisites-to-build and substitutes, non-substitutable build"
+   (let* ((store (open-connection))
+          (drv (build-expression->derivation
+                 store
+                 "prereq-no-subst"
+                 (random 1000)
+                 #:substitutable?
+                 #f))
+          (output (derivation->output-path drv)))
+     (set-build-options
+       store
+       #:use-substitutes?
+       #t
+       #:substitute-urls
+       (%test-substitute-urls))
+     (with-derivation-narinfo
+       drv
+       (let-values
+         (((build download)
+           (derivation-prerequisites-to-build store drv)))
+         (and (null? download)
+              (match build
+                     (((? derivation-input? input))
+                      (string=?
+                        (derivation-input-path input)
+                        (derivation-file-name drv)))))))))
actual-value: #t
result: PASS

test-name: derivation-prerequisites-to-build and substitutes, local build
location: /home/mcd/guix/tests/derivations.scm:863
source:
+ (test-assert
+   "derivation-prerequisites-to-build and substitutes, local build"
+   (with-store
+     store
+     (let* ((drv (build-expression->derivation
+                   store
+                   "prereq-subst-local"
+                   (random 1000)
+                   #:local-build?
+                   #t))
+            (output (derivation->output-path drv)))
+       (set-build-options
+         store
+         #:use-substitutes?
+         #t
+         #:substitute-urls
+         (%test-substitute-urls))
+       (with-derivation-narinfo
+         drv
+         (let-values
+           (((build download)
+             (derivation-prerequisites-to-build store drv)))
+           (and (null? build)
+                (match download
+                       (((= substitutable-path item))
+                        (string=? item (derivation->output-path drv))))))))))
substitute: warning: authentication and authorization of substitutes disabled!
substitute: guix substitute: warning: ACL for archive imports seems to be uninitialized, substitutes may be unavailable
actual-value: #t
result: PASS

test-name: derivation-prerequisites-to-build in 'check' mode
location: /home/mcd/guix/tests/derivations.scm:885
source:
+ (test-assert
+   "derivation-prerequisites-to-build in 'check' mode"
+   (with-store
+     store
+     (let* ((dep (build-expression->derivation
+                   store
+                   "dep"
+                   `(begin ,(random-text) (mkdir %output))))
+            (drv (build-expression->derivation
+                   store
+                   "to-check"
+                   '(mkdir %output)
+                   #:inputs
+                   `(("dep" ,dep)))))
+       (build-derivations store (list drv))
+       (delete-paths
+         store
+         (list (derivation->output-path dep)))
+       (and (null? (derivation-prerequisites-to-build store drv))
+            (match (derivation-prerequisites-to-build
+                     store
+                     drv
+                     #:mode
+                     (build-mode check))
+                   ((input)
+                    (string=?
+                      (derivation-input-path input)
+                      (derivation-file-name dep))))))))
substitute: warning: authentication and authorization of substitutes disabled!
substitute: guix substitute: warning: ACL for archive imports seems to be uninitialized, substitutes may be unavailable
building path(s) `/home/mcd/guix/test-tmp/store/g0sm0swdhi7xln19klim5dfpq7zbmbxd-dep'
building path(s) `/home/mcd/guix/test-tmp/store/myxd28zb6p545dmbmww8y149g2m3d1sw-to-check'
finding garbage collector roots...
removing stale temporary roots file `/home/mcd/guix/test-tmp/var/20935/temproots/21548'
deleting `/home/mcd/guix/test-tmp/store/g0sm0swdhi7xln19klim5dfpq7zbmbxd-dep'
deleting `/home/mcd/guix/test-tmp/store/trash'
deleting unused links...
note: currently hard linking saves 32.00 MiB
actual-value: #t
result: PASS

test-name: substitution-oracle and #:substitute? #f
location: /home/mcd/guix/tests/derivations.scm:905
source:
+ (test-assert
+   "substitution-oracle and #:substitute? #f"
+   (with-store
+     store
+     (let* ((dep (build-expression->derivation
+                   store
+                   "dep"
+                   `(begin ,(random-text) (mkdir %output))))
+            (drv (build-expression->derivation
+                   store
+                   "not-subst"
+                   `(begin ,(random-text) (mkdir %output))
+                   #:substitutable?
+                   #f
+                   #:inputs
+                   `(("dep" ,dep))))
+            (query #f))
+       (define (record-substitutable-path-query store paths)
+         (when query (error "already called!" query))
+         (set! query paths)
+         '())
+       (mock ((guix store)
+              substitutable-path-info
+              record-substitutable-path-query)
+             (let ((pred (substitution-oracle store (list drv))))
+               (pred (derivation->output-path drv))))
+       (equal?
+         (pk 'query query)
+         (list (derivation->output-path dep))))))

;;; (query ("/home/mcd/guix/test-tmp/store/wxlpwsjdzh547gp3fvxpjmhjm7kr7fym-dep"))
actual-value: #t
result: PASS

test-name: build-expression->derivation with expression returning #f
location: /home/mcd/guix/tests/derivations.scm:934
source:
+ (test-assert
+   "build-expression->derivation with expression returning #f"
+   (let* ((builder '(begin (mkdir %output) #f))
+          (drv (build-expression->derivation
+                 %store
+                 "fail"
+                 builder))
+          (out-path (derivation->output-path drv)))
+     (guard (c ((nix-protocol-error? c)
+                (and (string-match
+                       "build .* failed"
+                       (nix-protocol-error-message c))
+                     (not (valid-path? %store out-path)))))
+            (build-derivations %store (list drv))
+            #f)))
@ build-started /home/mcd/guix/test-tmp/store/204x5ldi9hplip82k1kxa49z48kr6yj3-fail.drv - x86_64-linux /home/mcd/guix/test-tmp/var/log/guix/drvs/20//4x5ldi9hplip82k1kxa49z48kr6yj3-fail.drv.bz2
builder for `/home/mcd/guix/test-tmp/store/204x5ldi9hplip82k1kxa49z48kr6yj3-fail.drv' failed with exit code 1
@ build-failed /home/mcd/guix/test-tmp/store/204x5ldi9hplip82k1kxa49z48kr6yj3-fail.drv - 1 builder for `/home/mcd/guix/test-tmp/store/204x5ldi9hplip82k1kxa49z48kr6yj3-fail.drv' failed with exit code 1
actual-value: #t
result: PASS

test-name: build-expression->derivation with two outputs
location: /home/mcd/guix/tests/derivations.scm:949
source:
+ (test-assert
+   "build-expression->derivation with two outputs"
+   (let* ((builder
+            '(begin
+               (call-with-output-file
+                 (assoc-ref %outputs "out")
+                 (lambda (p) (display '(hello) p)))
+               (call-with-output-file
+                 (assoc-ref %outputs "second")
+                 (lambda (p) (display '(world) p)))))
+          (drv (build-expression->derivation
+                 %store
+                 "double"
+                 builder
+                 #:outputs
+                 '("out" "second")))
+          (succeeded?
+            (build-derivations %store (list drv))))
+     (and succeeded?
+          (let ((one (derivation->output-path drv))
+                (two (derivation->output-path drv "second")))
+            (and (equal? '(hello) (call-with-input-file one read))
+                 (equal? '(world) (call-with-input-file two read)))))))
actual-value: #t
result: PASS

test-name: build-expression->derivation with one input
location: /home/mcd/guix/tests/derivations.scm:968
source:
+ (test-assert
+   "build-expression->derivation with one input"
+   (let* ((builder
+            '(call-with-output-file
+               %output
+               (lambda (p)
+                 (let ((cu (assoc-ref %build-inputs "cu")))
+                   (close 1)
+                   (dup2 (port->fdes p) 1)
+                   (execl (string-append cu "/bin/uname")
+                          "uname"
+                          "-a")))))
+          (drv (build-expression->derivation
+                 %store
+                 "uname"
+                 builder
+                 #:inputs
+                 `(("cu" ,%coreutils))))
+          (succeeded?
+            (build-derivations %store (list drv))))
+     (and succeeded?
+          (let ((p (derivation->output-path drv)))
+            (string-contains
+              (call-with-input-file p read-line)
+              "GNU")))))
actual-value: 43
result: PASS

test-name: build-expression->derivation with modules
location: /home/mcd/guix/tests/derivations.scm:984
source:
+ (test-assert
+   "build-expression->derivation with modules"
+   (let* ((builder
+            `(begin
+               (use-modules (guix build utils))
+               (let ((out (assoc-ref %outputs "out")))
+                 (mkdir-p (string-append out "/guile/guix/nix"))
+                 #t)))
+          (drv (build-expression->derivation
+                 %store
+                 "test-with-modules"
+                 builder
+                 #:modules
+                 '((guix build utils)))))
+     (and (build-derivations %store (list drv))
+          (let* ((p (derivation->output-path drv))
+                 (s (stat (string-append p "/guile/guix/nix"))))
+            (eq? (stat:type s) 'directory)))))
actual-value: #t
result: PASS

test-name: build-expression->derivation: same fixed-output path
location: /home/mcd/guix/tests/derivations.scm:999
source:
+ (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"
+              builder1
+              #:hash
+              hash
+              #:hash-algo
+              'sha256))
+          (input2
+            (build-expression->derivation
+              %store
+              "fixed"
+              builder2
+              #:hash
+              hash
+              #:hash-algo
+              'sha256))
+          (succeeded?
+            (build-derivations %store (list input1 input2))))
+     (and succeeded?
+          (not (string=?
+                 (derivation-file-name input1)
+                 (derivation-file-name input2)))
+          (string=?
+            (derivation->output-path input1)
+            (derivation->output-path input2)))))
actual-value: #t
result: PASS

test-name: build-expression->derivation with a fixed-output input
location: /home/mcd/guix/tests/derivations.scm:1020
source:
+ (test-assert
+   "build-expression->derivation with a fixed-output input"
+   (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"
+              builder1
+              #:hash
+              hash
+              #:hash-algo
+              'sha256))
+          (input2
+            (build-expression->derivation
+              %store
+              "fixed"
+              builder2
+              #:hash
+              hash
+              #:hash-algo
+              'sha256))
+          (builder3
+            '(let ((input (assoc-ref %build-inputs "input")))
+               (call-with-output-file
+                 %output
+                 (lambda (out)
+                   (format #f "My input is ~a.~%" input)))))
+          (final1
+            (build-expression->derivation
+              %store
+              "final"
+              builder3
+              #:inputs
+              `(("input" ,input1))))
+          (final2
+            (build-expression->derivation
+              %store
+              "final"
+              builder3
+              #:inputs
+              `(("input" ,input2)))))
+     (and (string=?
+            (derivation->output-path final1)
+            (derivation->output-path final2))
+          (string=?
+            (derivation->output-path final1)
+            (derivation-path->output-path
+              (derivation-file-name final1)))
+          (build-derivations %store (list final1 final2)))))
actual-value: #t
result: PASS

test-name: build-expression->derivation produces recursive fixed-output
location: /home/mcd/guix/tests/derivations.scm:1051
source:
+ (test-assert
+   "build-expression->derivation produces recursive fixed-output"
+   (let* ((builder
+            '(begin
+               (use-modules (srfi srfi-26))
+               (mkdir %output)
+               (chdir %output)
+               (call-with-output-file
+                 "exe"
+                 (cut display "executable" <>))
+               (chmod "exe" 511)
+               (symlink "exe" "symlink")
+               (mkdir "subdir")))
+          (drv (build-expression->derivation
+                 %store
+                 "fixed-rec"
+                 builder
+                 #:hash-algo
+                 'sha256
+                 #:hash
+                 (base32
+                   "10k1lw41wyrjf9mxydi0is5nkpynlsvgslinics4ppir13g7d74p")
+                 #:recursive?
+                 #t)))
+     (and (build-derivations %store (list drv))
+          (let* ((dir (derivation->output-path drv))
+                 (exe (string-append dir "/exe"))
+                 (link (string-append dir "/symlink"))
+                 (subdir (string-append dir "/subdir")))
+            (and (executable-file? exe)
+                 (string=?
+                   "executable"
+                   (call-with-input-file exe get-string-all))
+                 (string=? "exe" (readlink link))
+                 (file-is-directory? subdir))))))
actual-value: #t
result: PASS

test-name: build-expression->derivation uses recursive fixed-output
location: /home/mcd/guix/tests/derivations.scm:1077
source:
+ (test-assert
+   "build-expression->derivation uses recursive fixed-output"
+   (let* ((builder
+            '(call-with-output-file
+               %output
+               (lambda (port) (display "hello" port))))
+          (fixed (build-expression->derivation
+                   %store
+                   "small-fixed-rec"
+                   builder
+                   #:hash-algo
+                   'sha256
+                   #:hash
+                   (base32
+                     "0sg9f58l1jj88w6pdrfdpj5x9b1zrwszk84j81zvby36q9whhhqa")
+                   #:recursive?
+                   #t))
+          (in (derivation->output-path fixed))
+          (builder
+            `(begin
+               (mkdir %output)
+               (chdir %output)
+               (symlink ,in "symlink")))
+          (drv (build-expression->derivation
+                 %store
+                 "fixed-rec-user"
+                 builder
+                 #:inputs
+                 `(("fixed" ,fixed)))))
+     (and (build-derivations %store (list drv))
+          (let ((out (derivation->output-path drv)))
+            (string=?
+              (readlink (string-append out "/symlink"))
+              in)))))
actual-value: #t
result: PASS

test-name: build-expression->derivation with #:references-graphs
location: /home/mcd/guix/tests/derivations.scm:1099
source:
+ (test-assert
+   "build-expression->derivation with #:references-graphs"
+   (let* ((input (add-text-to-store
+                   %store
+                   "foo"
+                   "hello"
+                   (list %bash %mkdir)))
+          (builder '(copy-file "input" %output))
+          (drv (build-expression->derivation
+                 %store
+                 "references-graphs"
+                 builder
+                 #:references-graphs
+                 `(("input" unquote input))))
+          (out (derivation->output-path drv)))
+     (define (deps path . deps)
+       (let ((count (length deps)))
+         (string-append
+           path
+           "\n\n"
+           (number->string count)
+           "\n"
+           (string-join (sort deps string<?) "\n")
+           (if (zero? count) "" "\n"))))
+     (and (build-derivations %store (list drv))
+          (equal?
+            (call-with-input-file out get-string-all)
+            (string-concatenate
+              (map cdr
+                   (sort (map (lambda (p d) (cons p (apply deps p d)))
+                              (list input %bash %mkdir)
+                              (list (list %bash %mkdir) '() '()))
+                         (lambda (x y)
+                           (match x
+                                  ((p1 . _)
+                                   (match y
+                                          ((p2 . _)
+                                           (string<? p1 p2)))))))))))))
actual-value: #t
result: PASS

test-name: map-derivation
location: /home/mcd/guix/tests/derivations.scm:1130
source:
+ (test-equal
+   "map-derivation"
+   "hello"
+   (let* ((joke (package-derivation %store guile-1.8))
+          (good (package-derivation %store %bootstrap-guile))
+          (drv1 (build-expression->derivation
+                  %store
+                  "original-drv1"
+                  #f
+                  #:guile-for-build
+                  joke))
+          (drv2 (build-expression->derivation
+                  %store
+                  "original-drv2"
+                  '(call-with-output-file
+                     %output
+                     (lambda (p) (display "hello" p)))))
+          (drv3 (build-expression->derivation
+                  %store
+                  "drv-to-remap"
+                  '(let ((in (assoc-ref %build-inputs "in")))
+                     (copy-file in %output))
+                  #:inputs
+                  `(("in" ,drv1))
+                  #:guile-for-build
+                  joke))
+          (drv4 (map-derivation
+                  %store
+                  drv3
+                  `((,drv1 unquote drv2) (,joke unquote good))))
+          (out (derivation->output-path drv4)))
+     (and (build-derivations
+            %store
+            (list (pk 'remapped drv4)))
+          (call-with-input-file out get-string-all))))

;;; (remapped #<derivation /home/mcd/guix/test-tmp/store/s8yixjcyhqr4i29a5y0sc9bw90r5sm2k-drv-to-remap.drv => /home/mcd/guix/test-tmp/store/knp3qn87qc1pnjsqsi392q42r3pq654q-drv-to-remap 39ef5a0>)
expected-value: "hello"
actual-value: "hello"
result: PASS

test-name: map-derivation, sources
location: /home/mcd/guix/tests/derivations.scm:1153
source:
+ (test-equal
+   "map-derivation, sources"
+   "hello"
+   (let* ((script1
+            (add-text-to-store %store "fail.sh" "exit 1"))
+          (script2
+            (add-text-to-store
+              %store
+              "hi.sh"
+              "echo -n hello > $out"))
+          (bash-full
+            (package-derivation
+              %store
+              (@ (gnu packages bash) bash)))
+          (drv1 (derivation
+                  %store
+                  "drv-to-remap"
+                  (derivation->output-path bash-full)
+                  `("-e" ,script1)
+                  #:inputs
+                  `((,bash-full) (,script1))))
+          (drv2 (map-derivation
+                  %store
+                  drv1
+                  `((,bash-full unquote %bash)
+                    (,script1 unquote script2))))
+          (out (derivation->output-path drv2)))
+     (and (build-derivations
+            %store
+            (list (pk 'remapped* drv2)))
+          (call-with-input-file out get-string-all))))

;;; (remapped* #<derivation /home/mcd/guix/test-tmp/store/9r5kj4mayc9sj1qz1cz2czak1fim105z-drv-to-remap.drv => /home/mcd/guix/test-tmp/store/idq5fsslwf5hzy5nbvrly8vpj55dx73z-drv-to-remap 35413c0>)
expected-value: "hello"
actual-value: "hello"
result: PASS


SKIP: tests/snix
================

test-name: factorize-uri
location: /home/mcd/guix/tests/snix.scm:36
source:
+ (test-assert
+   "factorize-uri"
+   (every?
+     (match-lambda
+       ((uri version '-> expected)
+        (equal? (factorize-uri uri version) expected)))
+     '(("http://example.com/foo.tgz"
+        "1.0"
+        ->
+        "http://example.com/foo.tgz")
+       ("http://example.com/foo-2.8.tgz"
+        "2.8"
+        ->
+        ("http://example.com/foo-" version ".tgz"))
+       ("http://example.com/2.8/foo-2.8.tgz"
+        "2.8"
+        ->
+        ("http://example.com/"
+         version
+         "/foo-"
+         version
+         ".tgz")))))
actual-value: #t
result: PASS

test-name: nixpkgs->guix-package
location: /home/mcd/guix/tests/snix.scm:54
source:
+ (test-assert
+   "nixpkgs->guix-package"
+   (match (nixpkgs->guix-package
+            %nixpkgs-directory
+            "guile")
+          (('package
+            ('name "guile")
+            ('version (? string?))
+            ('source ('origin _ ...))
+            ('build-system _)
+            ('inputs ('quasiquote (inputs ...)))
+            ('propagated-inputs ('quasiquote (pinputs ...)))
+            ('home-page (? string?))
+            ('synopsis (? string?))
+            ('description (? string?))
+            ('license (? symbol?)))
+           (and (member '("libffi" ,libffi) inputs)
+                (member '("gmp" ,gmp) pinputs)
+                #t))
+          (x (pk 'fail x #f))))
result: SKIP


SKIP: tests/syscalls
====================

test-name: mount, ENOENT
location: /home/mcd/guix/tests/syscalls.scm:40
source:
+ (test-equal
+   "mount, ENOENT"
+   ENOENT
+   (catch 'system-error
+          (lambda ()
+            (mount "/dev/null" "/does-not-exist" "ext2")
+            #f)
+          (compose system-error-errno list)))
expected-value: 2
actual-value: 2
result: PASS

test-name: umount, ENOENT/EPERM
location: /home/mcd/guix/tests/syscalls.scm:48
source:
+ (test-assert
+   "umount, ENOENT/EPERM"
+   (catch 'system-error
+          (lambda () (umount "/does-not-exist") #f)
+          (lambda args
+            (memv (system-error-errno args)
+                  (list EPERM ENOENT)))))
actual-value: (1 2)
result: PASS

test-name: mount-points
location: /home/mcd/guix/tests/syscalls.scm:57
source:
+ (test-assert
+   "mount-points"
+   (any (cute member <> (mount-points))
+        '("/" "/proc" "/sys" "/dev")))
actual-value: ("/" "/dev/pts" "/dev/shm" "/gnu/store" "/sys/fs/cgroup" "/sys/fs/cgroup/cpuset" "/sys/fs/cgroup/cpu" "/sys/fs/cgroup/cpuacct" "/sys/fs/cgroup/memory" "/sys/fs/cgroup/devices" "/sys/fs/cgroup/freezer" "/sys/fs/cgroup/blkio" "/sys/fs/cgroup/perf_event" "/sys/fs/cgroup/hugetlb")
result: PASS

test-name: swapon, ENOENT/EPERM
location: /home/mcd/guix/tests/syscalls.scm:63
source:
+ (test-assert
+   "swapon, ENOENT/EPERM"
+   (catch 'system-error
+          (lambda () (swapon "/does-not-exist") #f)
+          (lambda args
+            (memv (system-error-errno args)
+                  (list EPERM ENOENT)))))
actual-value: (1 2)
result: PASS

test-name: swapoff, ENOENT/EINVAL/EPERM
location: /home/mcd/guix/tests/syscalls.scm:71
source:
+ (test-assert
+   "swapoff, ENOENT/EINVAL/EPERM"
+   (catch 'system-error
+          (lambda () (swapoff "/does-not-exist") #f)
+          (lambda args
+            (memv (system-error-errno args)
+                  (list EPERM EINVAL ENOENT)))))
actual-value: (1 22 2)
result: PASS

test-name: mkdtemp!
location: /home/mcd/guix/tests/syscalls.scm:79
source:
+ (test-assert
+   "mkdtemp!"
+   (let* ((tmp (or (getenv "TMPDIR") "/tmp"))
+          (dir (mkdtemp!
+                 (string-append tmp "/guix-test-XXXXXX"))))
+     (and (file-exists? dir) (begin (rmdir dir) #t))))
actual-value: #t
result: PASS

test-name: statfs, ENOENT
location: /home/mcd/guix/tests/syscalls.scm:87
source:
+ (test-equal
+   "statfs, ENOENT"
+   ENOENT
+   (catch 'system-error
+          (lambda () (statfs "/does-not-exist"))
+          (compose system-error-errno list)))
expected-value: 2
actual-value: 2
result: PASS

test-name: statfs
location: /home/mcd/guix/tests/syscalls.scm:94
source:
+ (test-assert
+   "statfs"
+   (let ((fs (statfs "/")))
+     (and (file-system? fs)
+          (> (file-system-block-size fs) 0)
+          (>= (file-system-blocks-available fs) 0)
+          (>= (file-system-blocks-free fs)
+              (file-system-blocks-available fs)))))
actual-value: #t
result: PASS

test-name: clone
location: /home/mcd/guix/tests/syscalls.scm:111
source:
+ (test-assert
+   "clone"
+   (match (clone (logior CLONE_NEWUSER SIGCHLD))
+          (0 (primitive-exit 42))
+          (pid (and (not (equal?
+                           (readlink (user-namespace pid))
+                           (readlink (user-namespace (getpid)))))
+                    (match (waitpid pid)
+                           ((_ . status) (= 42 (status:exit-val status))))))))
actual-value: #t
result: PASS

test-name: setns
location: /home/mcd/guix/tests/syscalls.scm:124
source:
+ (test-assert
+   "setns"
+   (match (clone (logior CLONE_NEWUSER SIGCHLD))
+          (0 (primitive-exit 0))
+          (clone-pid
+            (match (pipe)
+                   ((in . out)
+                    (match (primitive-fork)
+                           (0
+                            (close in)
+                            (call-with-input-file
+                              (user-namespace clone-pid)
+                              (lambda (port) (setns (port->fdes port) 0)))
+                            (write 'done out)
+                            (close out)
+                            (primitive-exit 0))
+                           (fork-pid
+                             (close out)
+                             (read in)
+                             (let ((result
+                                     (and (equal?
+                                            (readlink
+                                              (user-namespace clone-pid))
+                                            (readlink
+                                              (user-namespace fork-pid))))))
+                               (waitpid clone-pid)
+                               (waitpid fork-pid)
+                               result))))))))
actual-value: #t
result: PASS

test-name: pivot-root
location: /home/mcd/guix/tests/syscalls.scm:156
source:
+ (test-equal
+   "pivot-root"
+   #t
+   (match (pipe)
+          ((in . out)
+           (match (clone (logior CLONE_NEWUSER CLONE_NEWNS SIGCHLD))
+                  (0
+                   (dynamic-wind
+                     (const #t)
+                     (lambda ()
+                       (close in)
+                       (call-with-temporary-directory
+                         (lambda (root)
+                           (let ((put-old (string-append root "/real-root")))
+                             (mount "none" root "tmpfs")
+                             (mkdir put-old)
+                             (call-with-output-file
+                               (string-append root "/test")
+                               (lambda (port) (display "testing\n" port)))
+                             (pivot-root root put-old)
+                             (write (file-exists? "/test") out)
+                             (close out)))))
+                     (lambda () (primitive-exit 0))))
+                  (pid (close out)
+                       (let ((result (read in)))
+                         (close in)
+                         (and (zero? (match (waitpid pid)
+                                            ((_ . status)
+                                             (status:exit-val status))))
+                              (eq? #t result))))))))
result: SKIP

test-name: scandir*, ENOENT
location: /home/mcd/guix/tests/syscalls.scm:189
source:
+ (test-equal
+   "scandir*, ENOENT"
+   ENOENT
+   (catch 'system-error
+          (lambda () (scandir* "/does/not/exist"))
+          (lambda args (system-error-errno args))))
expected-value: 2
actual-value: 2
result: PASS

test-name: scandir*, ASCII file names
location: /home/mcd/guix/tests/syscalls.scm:197
source:
+ (test-equal
+   "scandir*, ASCII file names"
+   (scandir
+     (dirname
+       (search-path %load-path "guix/base32.scm"))
+     (const #t)
+     string<?)
+   (match (scandir*
+            (dirname
+              (search-path %load-path "guix/base32.scm")))
+          (((names . properties) ...) names)))
expected-value: ("." ".." "base16.go" "base16.scm" "base32.go" "base32.scm" "base64.go" "base64.scm" "build" "build-system" "build-system.go" "build-system.scm" "cache.go" "cache.scm" "combinators.go" "combinators.scm" "config.go" "config.scm" "config.scm.in" "cpio.go" "cpio.scm" "cve.go" "cve.scm" "cvs-download.go" "cvs-download.scm" "derivations.go" "derivations.scm" "discovery.go" "discovery.scm" "docker.go" "docker.scm" "download.go" "download.scm" "elf.go" "elf.scm" "ftp-client.go" "ftp-client.scm" "gcrypt.go" "gcrypt.scm" "gexp.go" "gexp.scm" "git-download.go" "git-download.scm" "git.go" "git.scm" "gnu-maintenance.go" "gnu-maintenance.scm" "gnupg.go" "gnupg.scm" "grafts.go" "grafts.scm" "graph.go" "graph.scm" "hash.go" "hash.scm" "hg-download.go" "hg-download.scm" "http-client.go" "http-client.scm" "i18n.go" "i18n.scm" "import" "licenses.go" "licenses.scm" "memoization.go" "memoization.scm" "modules.go" "modules.scm" "monad-repl.go" "monad-repl.scm" "monads.go" "monads.scm" "nar.go" "nar.scm" "packages.go" "packages.scm" "pk-crypto.go" "pk-crypto.scm" "pki.go" "pki.scm" "profiles.go" "profiles.scm" "progress.go" "progress.scm" "records.go" "records.scm" "scripts" "scripts.go" "scripts.scm" "search-paths.go" "search-paths.scm" "serialization.go" "serialization.scm" "sets.go" "sets.scm" "ssh.go" "ssh.scm" "store" "store.go" "store.scm" "svn-download.go" "svn-download.scm" "tests" "tests.go" "tests.scm" "ui.go" "ui.scm" "upstream.go" "upstream.scm" "utils.go" "utils.scm" "workers.go" "workers.scm" "zlib.go" "zlib.scm")
actual-value: ("." ".." "base16.go" "base16.scm" "base32.go" "base32.scm" "base64.go" "base64.scm" "build" "build-system" "build-system.go" "build-system.scm" "cache.go" "cache.scm" "combinators.go" "combinators.scm" "config.go" "config.scm" "config.scm.in" "cpio.go" "cpio.scm" "cve.go" "cve.scm" "cvs-download.go" "cvs-download.scm" "derivations.go" "derivations.scm" "discovery.go" "discovery.scm" "docker.go" "docker.scm" "download.go" "download.scm" "elf.go" "elf.scm" "ftp-client.go" "ftp-client.scm" "gcrypt.go" "gcrypt.scm" "gexp.go" "gexp.scm" "git-download.go" "git-download.scm" "git.go" "git.scm" "gnu-maintenance.go" "gnu-maintenance.scm" "gnupg.go" "gnupg.scm" "grafts.go" "grafts.scm" "graph.go" "graph.scm" "hash.go" "hash.scm" "hg-download.go" "hg-download.scm" "http-client.go" "http-client.scm" "i18n.go" "i18n.scm" "import" "licenses.go" "licenses.scm" "memoization.go" "memoization.scm" "modules.go" "modules.scm" "monad-repl.go" "monad-repl.scm" "monads.go" "monads.scm" "nar.go" "nar.scm" "packages.go" "packages.scm" "pk-crypto.go" "pk-crypto.scm" "pki.go" "pki.scm" "profiles.go" "profiles.scm" "progress.go" "progress.scm" "records.go" "records.scm" "scripts" "scripts.go" "scripts.scm" "search-paths.go" "search-paths.scm" "serialization.go" "serialization.scm" "sets.go" "sets.scm" "ssh.go" "ssh.scm" "store" "store.go" "store.scm" "svn-download.go" "svn-download.scm" "tests" "tests.go" "tests.scm" "ui.go" "ui.scm" "upstream.go" "upstream.scm" "utils.go" "utils.scm" "workers.go" "workers.scm" "zlib.go" "zlib.scm")
result: PASS

test-name: scandir*, UTF-8 file names
location: /home/mcd/guix/tests/syscalls.scm:204
source:
+ (test-equal
+   "scandir*, UTF-8 file names"
+   '("." ".." "α" "λ")
+   (call-with-temporary-directory
+     (lambda (directory)
+       (let ((creat (pointer->procedure
+                      int
+                      (dynamic-func "creat" (dynamic-link))
+                      (list '* int))))
+         (creat (string->pointer
+                  (string-append directory "/α")
+                  "UTF-8")
+                420)
+         (creat (string->pointer
+                  (string-append directory "/λ")
+                  "UTF-8")
+                420)
+         (let ((locale (setlocale LC_ALL)))
+           (dynamic-wind
+             (lambda () (setlocale LC_ALL "C"))
+             (lambda ()
+               (match (scandir* directory)
+                      (((names . properties) ...) names)))
+             (lambda () (setlocale LC_ALL locale))))))))
expected-value: ("." ".." "α" "λ")
actual-value: ("." ".." "α" "λ")
result: PASS

test-name: scandir*, properties
location: /home/mcd/guix/tests/syscalls.scm:231
source:
+ (test-assert
+   "scandir*, properties"
+   (let ((directory
+           (dirname
+             (search-path %load-path "guix/base32.scm"))))
+     (every (lambda (entry name)
+              (match entry
+                     ((name2 . properties)
+                      (and (string=? name2 name)
+                           (let* ((full (string-append directory "/" name))
+                                  (stat (lstat full))
+                                  (inode (assoc-ref properties 'inode))
+                                  (type (assoc-ref properties 'type)))
+                             (and (= inode (stat:ino stat))
+                                  (or (eq? type 'unknown)
+                                      (eq? type (stat:type stat)))))))))
+            (scandir* directory)
+            (scandir directory (const #t) string<?))))
actual-value: #t
result: PASS

test-name: fcntl-flock wait
location: /home/mcd/guix/tests/syscalls.scm:248
source:
+ (test-equal
+   "fcntl-flock wait"
+   42
+   (let ((file (open-file temp-file "w0b")))
+     (fcntl-flock file 'write-lock)
+     (match (primitive-fork)
+            (0
+             (dynamic-wind
+               (const #t)
+               (lambda ()
+                 (let ((file (open-file temp-file "r0b")))
+                   (fcntl-flock file 'read-lock)
+                   (primitive-exit (read file)))
+                 (primitive-exit 1))
+               (lambda () (primitive-exit 2))))
+            (pid (display "hello, world!" file)
+                 (force-output file)
+                 (sleep 1)
+                 (seek file 0 SEEK_SET)
+                 (truncate-file file 0)
+                 (write 42 file)
+                 (force-output file)
+                 (fcntl-flock file 'unlock)
+                 (match (waitpid pid)
+                        ((_ . status)
+                         (let ((result (status:exit-val status)))
+                           (close-port file)
+                           result)))))))
expected-value: 42
actual-value: 42
result: PASS

test-name: fcntl-flock non-blocking
location: /home/mcd/guix/tests/syscalls.scm:287
source:
+ (test-equal
+   "fcntl-flock non-blocking"
+   EAGAIN
+   (match (pipe)
+          ((input . output)
+           (match (primitive-fork)
+                  (0
+                   (dynamic-wind
+                     (const #t)
+                     (lambda ()
+                       (close-port output)
+                       (read-char input)
+                       (let ((file (open-file temp-file "w0")))
+                         (catch 'flock-error
+                                (lambda ()
+                                  (fcntl-flock file 'write-lock #:wait? #f))
+                                (lambda (key errno)
+                                  (primitive-exit (pk 'errno errno)))))
+                       (primitive-exit -1))
+                     (lambda () (primitive-exit -2))))
+                  (pid (close-port input)
+                       (let ((file (open-file temp-file "w0")))
+                         (fcntl-flock file 'write-lock)
+                         (write 'green-light output)
+                         (force-output output)
+                         (match (waitpid pid)
+                                ((_ . status)
+                                 (let ((result (status:exit-val status)))
+                                   (fcntl-flock file 'unlock)
+                                   (close-port file)
+                                   result)))))))))

;;; (errno 11)
expected-value: 11
actual-value: 11
result: PASS

test-name: set-thread-name
location: /home/mcd/guix/tests/syscalls.scm:329
source:
+ (test-equal
+   "set-thread-name"
+   "Syscall Test"
+   (let ((name (thread-name)))
+     (set-thread-name "Syscall Test")
+     (let ((new-name (thread-name)))
+       (set-thread-name name)
+       new-name)))
expected-value: "Syscall Test"
actual-value: "Syscall Test"
result: PASS

test-name: all-network-interface-names
location: /home/mcd/guix/tests/syscalls.scm:337
source:
+ (test-assert
+   "all-network-interface-names"
+   (match (all-network-interface-names)
+          (((? string? names) ..1) (member "lo" names))))
actual-value: ("lo")
result: PASS

test-name: network-interface-names
location: /home/mcd/guix/tests/syscalls.scm:342
source:
+ (test-assert
+   "network-interface-names"
+   (match (network-interface-names)
+          (((? string? names) ..1)
+           (lset<=
+             string=?
+             names
+             (all-network-interface-names)))))
actual-value: #t
result: PASS

test-name: network-interface-flags
location: /home/mcd/guix/tests/syscalls.scm:347
source:
+ (test-assert
+   "network-interface-flags"
+   (let* ((sock (socket AF_INET SOCK_STREAM 0))
+          (flags (network-interface-flags sock "lo")))
+     (close-port sock)
+     (and (not (zero? (logand flags IFF_LOOPBACK)))
+          (not (zero? (logand flags IFF_UP))))))
actual-value: #t
result: PASS

test-name: loopback-network-interface?
location: /home/mcd/guix/tests/syscalls.scm:354
source:
+ (test-equal
+   "loopback-network-interface?"
+   ENODEV
+   (and (loopback-network-interface? "lo")
+        (catch 'system-error
+               (lambda ()
+                 (loopback-network-interface? "nonexistent")
+                 #f)
+               (lambda args (system-error-errno args)))))
expected-value: 19
actual-value: 19
result: PASS

test-name: loopback-network-interface-running?
location: /home/mcd/guix/tests/syscalls.scm:364
source:
+ (test-equal
+   "loopback-network-interface-running?"
+   ENODEV
+   (and (network-interface-running? "lo")
+        (catch 'system-error
+               (lambda ()
+                 (network-interface-running? "nonexistent")
+                 #f)
+               (lambda args (system-error-errno args)))))
expected-value: 19
actual-value: 19
result: PASS

test-name: set-network-interface-flags
location: /home/mcd/guix/tests/syscalls.scm:375
source:
+ (test-assert
+   "set-network-interface-flags"
+   (let ((sock (socket AF_INET SOCK_STREAM 0)))
+     (catch 'system-error
+            (lambda ()
+              (set-network-interface-flags sock "lo" IFF_UP))
+            (lambda args
+              (close-port sock)
+              (memv (system-error-errno args)
+                    (list EPERM EACCES))))))
actual-value: (1 13)
result: PASS

test-name: network-interface-address lo
location: /home/mcd/guix/tests/syscalls.scm:385
source:
+ (test-equal
+   "network-interface-address lo"
+   (make-socket-address
+     AF_INET
+     (inet-pton AF_INET "127.0.0.1")
+     0)
+   (let* ((sock (socket AF_INET SOCK_STREAM 0))
+          (addr (network-interface-address sock "lo")))
+     (close-port sock)
+     addr))
expected-value: #(2 2130706433 0)
actual-value: #(2 2130706433 0)
result: PASS

test-name: set-network-interface-address
location: /home/mcd/guix/tests/syscalls.scm:393
source:
+ (test-assert
+   "set-network-interface-address"
+   (let ((sock (socket AF_INET SOCK_STREAM 0)))
+     (catch 'system-error
+            (lambda ()
+              (set-network-interface-address
+                sock
+                "nonexistent"
+                (make-socket-address
+                  AF_INET
+                  (inet-pton AF_INET "127.12.14.15")
+                  0)))
+            (lambda args
+              (close-port sock)
+              (memv (system-error-errno args)
+                    (list EPERM EACCES))))))
actual-value: (1 13)
result: PASS

test-name: network-interface-netmask lo
location: /home/mcd/guix/tests/syscalls.scm:407
source:
+ (test-equal
+   "network-interface-netmask lo"
+   (make-socket-address
+     AF_INET
+     (inet-pton AF_INET "255.0.0.0")
+     0)
+   (let* ((sock (socket AF_INET SOCK_STREAM 0))
+          (addr (network-interface-netmask sock "lo")))
+     (close-port sock)
+     addr))
expected-value: #(2 4278190080 0)
actual-value: #(2 4278190080 0)
result: PASS

test-name: set-network-interface-netmask
location: /home/mcd/guix/tests/syscalls.scm:415
source:
+ (test-assert
+   "set-network-interface-netmask"
+   (let ((sock (socket AF_INET SOCK_STREAM 0)))
+     (catch 'system-error
+            (lambda ()
+              (set-network-interface-netmask
+                sock
+                "nonexistent"
+                (make-socket-address
+                  AF_INET
+                  (inet-pton AF_INET "255.0.0.0")
+                  0)))
+            (lambda args
+              (close-port sock)
+              (memv (system-error-errno args)
+                    (list EPERM EACCES))))))
actual-value: (1 13)
result: PASS

test-name: network-interfaces returns one or more interfaces
location: /home/mcd/guix/tests/syscalls.scm:428
source:
+ (test-equal
+   "network-interfaces returns one or more interfaces"
+   '(#t #t #t)
+   (match (network-interfaces)
+          ((interfaces ..1)
+           (list (every interface? interfaces)
+                 (every string? (map interface-name interfaces))
+                 (every (lambda (sockaddr)
+                          (or (vector? sockaddr) (not sockaddr)))
+                        (map interface-address interfaces))))))
expected-value: (#t #t #t)
actual-value: (#t #t #t)
result: PASS

test-name: network-interfaces returns "lo"
location: /home/mcd/guix/tests/syscalls.scm:440
source:
+ (test-equal
+   "network-interfaces returns \"lo\""
+   (list #t
+         (make-socket-address
+           AF_INET
+           (inet-pton AF_INET "127.0.0.1")
+           0))
+   (match (filter
+            (lambda (interface)
+              (string=? "lo" (interface-name interface)))
+            (network-interfaces))
+          ((loopbacks ..1)
+           (list (every (lambda (lo)
+                          (not (zero? (logand
+                                        IFF_LOOPBACK
+                                        (interface-flags lo)))))
+                        loopbacks)
+                 (match (find (lambda (lo)
+                                (= AF_INET
+                                   (sockaddr:fam (interface-address lo))))
+                              loopbacks)
+                        (#f #f)
+                        (lo (interface-address lo)))))))
expected-value: (#t #(2 2130706433 0))
actual-value: (#t #(2 2130706433 0))
result: PASS

test-name: add-network-route/gateway
location: /home/mcd/guix/tests/syscalls.scm:456
source:
+ (test-assert
+   "add-network-route/gateway"
+   (let ((sock (socket AF_INET SOCK_STREAM 0))
+         (gateway
+           (make-socket-address
+             AF_INET
+             (inet-pton AF_INET "192.168.0.1")
+             0)))
+     (catch 'system-error
+            (lambda ()
+              (add-network-route/gateway sock gateway))
+            (lambda args
+              (close-port sock)
+              (memv (system-error-errno args)
+                    (list EPERM EACCES))))))
actual-value: (1 13)
result: PASS

test-name: delete-network-route
location: /home/mcd/guix/tests/syscalls.scm:469
source:
+ (test-assert
+   "delete-network-route"
+   (let ((sock (socket AF_INET SOCK_STREAM 0))
+         (destination
+           (make-socket-address AF_INET INADDR_ANY 0)))
+     (catch 'system-error
+            (lambda ()
+              (delete-network-route sock destination))
+            (lambda args
+              (close-port sock)
+              (memv (system-error-errno args)
+                    (list EPERM EACCES))))))
actual-value: (1 13)
result: PASS

test-name: tcgetattr ENOTTY
location: /home/mcd/guix/tests/syscalls.scm:479
source:
+ (test-equal
+   "tcgetattr ENOTTY"
+   ENOTTY
+   (catch 'system-error
+          (lambda ()
+            (call-with-input-file
+              "/dev/null"
+              (lambda (port) (tcgetattr (fileno port)))))
+          (compose system-error-errno list)))
expected-value: 25
actual-value: 25
result: PASS

test-name: tcgetattr
location: /home/mcd/guix/tests/syscalls.scm:493
source:
+ (test-assert
+   "tcgetattr"
+   (let ((termios (tcgetattr 0)))
+     (and (termios? termios)
+          (> (termios-input-speed termios) 0)
+          (> (termios-output-speed termios) 0))))
result: SKIP

test-name: tcsetattr
location: /home/mcd/guix/tests/syscalls.scm:499
source:
+ (test-assert
+   "tcsetattr"
+   (let ((first (tcgetattr 0)))
+     (tcsetattr 0 (tcsetattr-action TCSANOW) first)
+     (equal? first (tcgetattr 0))))
result: SKIP

test-name: terminal-window-size ENOTTY
location: /home/mcd/guix/tests/syscalls.scm:504
source:
+ (test-assert
+   "terminal-window-size ENOTTY"
+   (call-with-input-file
+     "/dev/null"
+     (lambda (port)
+       (catch 'system-error
+              (lambda () (terminal-window-size port))
+              (lambda args
+                (memv (system-error-errno args)
+                      (list ENOTTY EINVAL)))))))
actual-value: (25 22)
result: PASS

test-name: terminal-columns
location: /home/mcd/guix/tests/syscalls.scm:515
source:
+ (test-assert
+   "terminal-columns"
+   (> (terminal-columns) 0))
actual-value: #t
result: PASS

test-name: terminal-columns non-file port
location: /home/mcd/guix/tests/syscalls.scm:518
source:
+ (test-assert
+   "terminal-columns non-file port"
+   (> (terminal-columns
+        (open-input-string
+          "Join us now, share the software!"))
+      0))
actual-value: #t
result: PASS

test-name: utmpx-entries
location: /home/mcd/guix/tests/syscalls.scm:522
source:
+ (test-assert
+   "utmpx-entries"
+   (match (utmpx-entries)
+          (((? utmpx? entries) ...)
+           (every (lambda (entry)
+                    (match (utmpx-user entry)
+                           ((? string?)
+                            (or (eqv? (login-type BOOT_TIME)
+                                      (utmpx-login-type entry))
+                                (> (utmpx-pid entry) 0)))
+                           (#f #t)))
+                  entries))))
actual-value: #t
result: PASS

test-name: read-utmpx, EOF
location: /home/mcd/guix/tests/syscalls.scm:534
source:
+ (test-assert
+   "read-utmpx, EOF"
+   (eof-object? (read-utmpx (%make-void-port "r"))))
actual-value: #t
result: PASS

test-name: read-utmpx
location: /home/mcd/guix/tests/syscalls.scm:539
source:
+ (test-assert
+   "read-utmpx"
+   (let ((result
+           (call-with-input-file
+             "/var/run/utmpx"
+             read-utmpx)))
+     (or (utmpx? result) (eof-object? result))))
actual-value: #t
result: PASS


SKIP: tests/gremlin
===================

test-name: elf-dynamic-info-needed, executable
location: /home/mcd/guix/tests/gremlin.scm:44
source:
+ (test-assert
+   "elf-dynamic-info-needed, executable"
+   (let* ((elf (call-with-input-file %guile-executable read-elf))
+          (dyninfo (elf-dynamic-info elf)))
+     (or (not dyninfo)
+         (lset<=
+           string=?
+           (list (string-append "libguile-" (effective-version))
+                 "libgc"
+                 "libunistring"
+                 "libffi")
+           (map (lambda (lib)
+                  (string-take lib (string-contains lib ".so")))
+                (elf-dynamic-info-needed dyninfo))))))
result: SKIP

test-name: expand-origin
location: /home/mcd/guix/tests/gremlin.scm:55
source:
+ (test-equal
+   "expand-origin"
+   '("OOO/../lib"
+     "OOO"
+     "../OOO/bar/OOO/baz"
+     "ORIGIN/foo")
+   (map (cut expand-origin <> "OOO")
+        '("$ORIGIN/../lib"
+          "${ORIGIN}"
+          "../${ORIGIN}/bar/$ORIGIN/baz"
+          "ORIGIN/foo")))
expected-value: ("OOO/../lib" "OOO" "../OOO/bar/OOO/baz" "ORIGIN/foo")
actual-value: ("OOO/../lib" "OOO" "../OOO/bar/OOO/baz" "ORIGIN/foo")
result: PASS


SKIP: tests/pypi
================

test-name: guix-package->pypi-name, old URL style
location: /home/mcd/guix/tests/pypi.scm:78
source:
+ (test-equal
+   "guix-package->pypi-name, old URL style"
+   "psutil"
+   (guix-package->pypi-name
+     (dummy-package
+       "foo"
+       (source
+         (dummy-origin
+           (uri "https://pypi.io/packages/source/p/psutil/psutil-4.3.0.tar.gz"))))))
expected-value: "psutil"
actual-value: "psutil"
result: PASS

test-name: guix-package->pypi-name, new URL style
location: /home/mcd/guix/tests/pypi.scm:86
source:
+ (test-equal
+   "guix-package->pypi-name, new URL style"
+   "certbot"
+   (guix-package->pypi-name
+     (dummy-package
+       "foo"
+       (source
+         (dummy-origin
+           (uri "https://pypi.python.org/packages/a2/3b/4756e6a0ceb14e084042a2a65c615d68d25621c6fd446d0fc10d14c4ce7d/certbot-0.8.1.tar.gz"))))))
expected-value: "certbot"
actual-value: "certbot"
result: PASS

test-name: guix-package->pypi-name, several URLs
location: /home/mcd/guix/tests/pypi.scm:94
source:
+ (test-equal
+   "guix-package->pypi-name, several URLs"
+   "cram"
+   (guix-package->pypi-name
+     (dummy-package
+       "foo"
+       (source
+         (dummy-origin
+           (uri (list "https://bitheap.org/cram/cram-0.7.tar.gz"
+                      (pypi-uri "cram" "0.7"))))))))
expected-value: "cram"
actual-value: "cram"
result: PASS

test-name: pypi->guix-package
location: /home/mcd/guix/tests/pypi.scm:103
source:
+ (test-assert
+   "pypi->guix-package"
+   (mock ((guix import utils)
+          url-fetch
+          (lambda (url file-name)
+            (match url
+                   ("https://example.com/foo-1.0.0.tar.gz"
+                    (begin
+                      (mkdir "foo-1.0.0")
+                      (with-output-to-file
+                        "foo-1.0.0/requirements.txt"
+                        (lambda () (display test-requirements)))
+                      (system* "tar" "czvf" file-name "foo-1.0.0/")
+                      (delete-file-recursively "foo-1.0.0")
+                      (set! test-source-hash
+                        (call-with-input-file file-name port-sha256))))
+                   ("https://example.com/foo-1.0.0-py2.py3-none-any.whl"
+                    #f)
+                   (_ (error "Unexpected URL: " url)))))
+         (mock ((guix http-client)
+                http-fetch
+                (lambda (url . rest)
+                  (match url
+                         ("https://pypi.python.org/pypi/foo/json"
+                          (values
+                            (open-input-string test-json)
+                            (string-length test-json)))
+                         ("https://example.com/foo-1.0.0-py2.py3-none-any.whl"
+                          #f)
+                         (_ (error "Unexpected URL: " url)))))
+               (match (pypi->guix-package "foo")
+                      (('package
+                        ('name "python-foo")
+                        ('version "1.0.0")
+                        ('source
+                         ('origin
+                          ('method 'url-fetch)
+                          ('uri ('pypi-uri "foo" 'version))
+                          ('sha256 ('base32 (? string? hash)))))
+                        ('build-system 'python-build-system)
+                        ('propagated-inputs
+                         ('quasiquote
+                          (("python-bar" ('unquote 'python-bar))
+                           ("python-baz" ('unquote 'python-baz)))))
+                        ('home-page "http://example.com")
+                        ('synopsis "summary")
+                        ('description "summary")
+                        ('license 'license:lgpl2.0))
+                       (string=?
+                         (bytevector->nix-base32-string test-source-hash)
+                         hash))
+                      (x (pk 'fail x #f))))))
foo-1.0.0/
foo-1.0.0/requirements.txt
actual-value: #t
result: PASS

test-name: pypi->guix-package, wheels
location: /home/mcd/guix/tests/pypi.scm:154
source:
+ (test-assert
+   "pypi->guix-package, wheels"
+   (mock ((guix import utils)
+          url-fetch
+          (lambda (url file-name)
+            (match url
+                   ("https://example.com/foo-1.0.0.tar.gz"
+                    (begin
+                      (mkdir "foo-1.0.0")
+                      (with-output-to-file
+                        "foo-1.0.0/requirements.txt"
+                        (lambda () (display test-requirements)))
+                      (system* "tar" "czvf" file-name "foo-1.0.0/")
+                      (delete-file-recursively "foo-1.0.0")
+                      (set! test-source-hash
+                        (call-with-input-file file-name port-sha256))))
+                   ("https://example.com/foo-1.0.0-py2.py3-none-any.whl"
+                    (begin
+                      (mkdir "foo-1.0.0.dist-info")
+                      (with-output-to-file
+                        "foo-1.0.0.dist-info/metadata.json"
+                        (lambda () (display test-metadata)))
+                      (let ((zip-file (string-append file-name ".zip")))
+                        (system*
+                          "zip"
+                          zip-file
+                          "foo-1.0.0.dist-info/metadata.json")
+                        (rename-file zip-file file-name))
+                      (delete-file-recursively "foo-1.0.0.dist-info")))
+                   (_ (error "Unexpected URL: " url)))))
+         (mock ((guix http-client)
+                http-fetch
+                (lambda (url . rest)
+                  (match url
+                         ("https://pypi.python.org/pypi/foo/json"
+                          (values
+                            (open-input-string test-json)
+                            (string-length test-json)))
+                         ("https://example.com/foo-1.0.0-py2.py3-none-any.whl"
+                          #f)
+                         (_ (error "Unexpected URL: " url)))))
+               (match (pypi->guix-package "foo")
+                      (('package
+                        ('name "python-foo")
+                        ('version "1.0.0")
+                        ('source
+                         ('origin
+                          ('method 'url-fetch)
+                          ('uri ('pypi-uri "foo" 'version))
+                          ('sha256 ('base32 (? string? hash)))))
+                        ('build-system 'python-build-system)
+                        ('propagated-inputs
+                         ('quasiquote
+                          (("python-bar" ('unquote 'python-bar))
+                           ("python-baz" ('unquote 'python-baz)))))
+                        ('home-page "http://example.com")
+                        ('synopsis "summary")
+                        ('description "summary")
+                        ('license 'license:lgpl2.0))
+                       (string=?
+                         (bytevector->nix-base32-string test-source-hash)
+                         hash))
+                      (x (pk 'fail x #f))))))
result: SKIP

random seed for tests: 1511200967


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#29368: Unreliable failing tests / segfaulting guile
  2017-11-20 21:03 bug#29368: Unreliable failing tests / segfaulting guile Martin Castillo
@ 2017-11-20 22:00 ` Ludovic Courtès
  2017-11-22  1:43   ` Martin Castillo
  2017-11-24 17:02   ` Ludovic Courtès
  0 siblings, 2 replies; 6+ messages in thread
From: Ludovic Courtès @ 2017-11-20 22:00 UTC (permalink / raw)
  To: Martin Castillo; +Cc: 29368

Hello,

Martin Castillo <castilma@uni-bremen.de> skribis:

> test-name: derivation-prerequisites-to-build when outputs already present
> location: /home/mcd/guix/tests/derivations.scm:790
> source:
> + (test-assert
> +   "derivation-prerequisites-to-build when outputs already present"
> +   (let* ((builder '(begin (mkdir %output) #t))
> +          (input-drv
> +            (build-expression->derivation
> +              %store
> +              "input"
> +              builder))
> +          (input-path
> +            (derivation-output-path
> +              (assoc-ref (derivation-outputs input-drv) "out")))
> +          (drv (build-expression->derivation
> +                 %store
> +                 "something"
> +                 builder
> +                 #:inputs
> +                 `(("i" ,input-drv))))
> +          (output (derivation->output-path drv)))
> +     (when (valid-path? %store input-path)
> +           (delete-paths %store (list input-path)))
> +     (when (valid-path? %store output)
> +           (delete-paths %store (list output)))
> +     (and (equal?
> +            (map derivation-input-path
> +                 (derivation-prerequisites-to-build %store drv))
> +            (list (derivation-file-name input-drv)))
> +          (build-derivations %store (list drv))
> +          (delete-paths %store (list input-path))
> +          (not (valid-path? %store input-path))
> +          (null? (derivation-prerequisites-to-build %store drv)))))
> finding garbage collector roots...
> actual-value: #f
> actual-error:
> + (srfi-34
> +   #<condition &nix-protocol-error [message: "program `/home/mcd/guix/nix/scripts/list-runtime-roots' failed with exit code 1" status: 1] 380d4b0>)
> result: FAIL

It’s seems to be the Guile running ‘list-runtime-roots’ that’s
segfaulting.  Could you try running it manually to see what happens?
(The expected behavior is to write a list of store file names on
standard output.)

TIA,
Ludo’.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#29368: Unreliable failing tests / segfaulting guile
  2017-11-20 22:00 ` Ludovic Courtès
@ 2017-11-22  1:43   ` Martin Castillo
  2017-11-24 17:02   ` Ludovic Courtès
  1 sibling, 0 replies; 6+ messages in thread
From: Martin Castillo @ 2017-11-22  1:43 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 29368

Hi,
> It’s seems to be the Guile running ‘list-runtime-roots’ that’s
> segfaulting.  Could you try running it manually to see what happens?
> (The expected behavior is to write a list of store file names on
> standard output.)

When running in a loop, I see the expected output. However, after a file
I get the segfault!

;; sorry, I'm new to scheme, what would be a better way? without
;; reloading the file again and again?
scheme@(guile-user)> (while #t (load-from-path "list-runtime-roots"))
... ;; skipping repeated expected output
srfi/srfi-1.scm:592:17: In procedure map1:
srfi/srfi-1.scm:592:17: In procedure fport_read: Kein passender Prozess
gefunden ;; No matching process found

Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.

scheme@(guile-user) [1]> ,bt
         102 (primitive-load-path "list-runtime-roots")
In list-runtime-roots:
   145:47101 (_)
In srfi/srfi-1.scm:
   679:15100 (append-map _ _ . _)
   592:29 99 (map1 _)
   592:29 98 (map1 _)
   592:29 97 (map1 _)
   592:29 96 (map1 _)
   592:29 95 (map1 _)
   592:29 94 (map1 _)
   592:29 93 (map1 _)
   592:29 92 (map1 _)
   592:29 91 (map1 _)
   592:29 90 (map1 _)
   592:29 89 (map1 _)
   592:29 88 (map1 _)
   592:29 87 (map1 _)
   592:29 86 (map1 _)
   592:29 85 (map1 _)
   592:29 84 (map1 _)
   592:29 83 (map1 _)
   592:29 82 (map1 _)
   592:29 81 (map1 _)
   592:29 80 (map1 _)
   592:29 79 (map1 _)
   592:29 78 (map1 _)
   592:29 77 (map1 _)
   592:29 76 (map1 _)
   592:29 75 (map1 _)
   592:29 74 (map1 _)
   592:29 73 (map1 _)
   592:29 72 (map1 _)
   592:29 71 (map1 _)
   592:29 70 (map1 _)
   592:29 69 (map1 _)
   592:29 68 (map1 _)
   592:29 67 (map1 _)
   592:29 66 (map1 _)
   592:29 65 (map1 _)
   592:29 64 (map1 _)
   592:29 63 (map1 _)
   592:29 62 (map1 _)
   592:29 61 (map1 _)
   592:29 60 (map1 _)
   592:29 59 (map1 _)
   592:29 58 (map1 _)
   592:29 57 (map1 _)
   592:29 56 (map1 _)
   592:29 55 (map1 _)
   592:29 54 (map1 _)
   592:29 53 (map1 _)
   592:29 52 (map1 _)
   592:29 51 (map1 _)
   592:29 50 (map1 _)
   592:29 49 (map1 _)
   592:29 48 (map1 _)
   592:29 47 (map1 _)
   592:29 46 (map1 _)
   592:29 45 (map1 _)
   592:29 44 (map1 _)
   592:29 43 (map1 _)
   592:29 42 (map1 _)
   592:29 41 (map1 _)
   592:29 40 (map1 _)
   592:29 39 (map1 _)
   592:29 38 (map1 _)
   592:29 37 (map1 _)
   592:29 36 (map1 _)
   592:29 35 (map1 _)
   592:29 34 (map1 _)
   592:29 33 (map1 _)
   592:29 32 (map1 _)
   592:29 31 (map1 _)
   592:29 30 (map1 _)
   592:29 29 (map1 _)
   592:29 28 (map1 _)
   592:29 27 (map1 _)
   592:29 26 (map1 _)
   592:29 25 (map1 _)
   592:29 24 (map1 _)
   592:29 23 (map1 _)
   592:29 22 (map1 _)
   592:29 21 (map1 _)
   592:29 20 (map1 _)
   592:29 19 (map1 _)
   592:29 18 (map1 _)
   592:29 17 (map1 _)
   592:29 16 (map1 _)
   592:29 15 (map1 _)
   592:29 14 (map1 _)
   592:29 13 (map1 _)
   592:29 12 (map1 _)
   592:29 11 (map1 _)
   592:29 10 (map1 _)
   592:29  9 (map1 _)
   592:29  8 (map1 _)
   592:29  7 (map1 _)
   592:29  6 (map1 _)
   592:29  5 (map1 _)
   592:29  4 (map1 _)
   592:29  3 (map1 _)
   592:29  2 (map1 _)
   592:29  1 (map1 _)
   592:17  0 (map1 ("8947"))

I'm running this in qemu with 2 cores and 2.4GB ram.

Martin

^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#29368: Unreliable failing tests / segfaulting guile
  2017-11-20 22:00 ` Ludovic Courtès
  2017-11-22  1:43   ` Martin Castillo
@ 2017-11-24 17:02   ` Ludovic Courtès
  2017-11-26 13:06     ` Martin Castillo
  1 sibling, 1 reply; 6+ messages in thread
From: Ludovic Courtès @ 2017-11-24 17:02 UTC (permalink / raw)
  To: Martin Castillo; +Cc: 29368

Hi,

ludo@gnu.org (Ludovic Courtès) skribis:

> Martin Castillo <castilma@uni-bremen.de> skribis:
>
>> test-name: derivation-prerequisites-to-build when outputs already present
>> location: /home/mcd/guix/tests/derivations.scm:790
>> source:
>> + (test-assert
>> +   "derivation-prerequisites-to-build when outputs already present"
>> +   (let* ((builder '(begin (mkdir %output) #t))
>> +          (input-drv
>> +            (build-expression->derivation
>> +              %store
>> +              "input"
>> +              builder))
>> +          (input-path
>> +            (derivation-output-path
>> +              (assoc-ref (derivation-outputs input-drv) "out")))
>> +          (drv (build-expression->derivation
>> +                 %store
>> +                 "something"
>> +                 builder
>> +                 #:inputs
>> +                 `(("i" ,input-drv))))
>> +          (output (derivation->output-path drv)))
>> +     (when (valid-path? %store input-path)
>> +           (delete-paths %store (list input-path)))
>> +     (when (valid-path? %store output)
>> +           (delete-paths %store (list output)))
>> +     (and (equal?
>> +            (map derivation-input-path
>> +                 (derivation-prerequisites-to-build %store drv))
>> +            (list (derivation-file-name input-drv)))
>> +          (build-derivations %store (list drv))
>> +          (delete-paths %store (list input-path))
>> +          (not (valid-path? %store input-path))
>> +          (null? (derivation-prerequisites-to-build %store drv)))))
>> finding garbage collector roots...
>> actual-value: #f
>> actual-error:
>> + (srfi-34
>> +   #<condition &nix-protocol-error [message: "program `/home/mcd/guix/nix/scripts/list-runtime-roots' failed with exit code 1" status: 1] 380d4b0>)
>> result: FAIL
>
> It’s seems to be the Guile running ‘list-runtime-roots’ that’s
> segfaulting.

Actually it didn’t segfault: it exited normally, but with exit code 1.
That shouldn’t happen.

Does “make check -j3” or so still trigger the problem?  If so, could you
try collecting more details with:

  strace -f -o log -s 234 make check -j3

?

TIA,
Ludo’.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#29368: Unreliable failing tests / segfaulting guile
  2017-11-24 17:02   ` Ludovic Courtès
@ 2017-11-26 13:06     ` Martin Castillo
  2017-11-26 14:59       ` Ludovic Courtès
  0 siblings, 1 reply; 6+ messages in thread
From: Martin Castillo @ 2017-11-26 13:06 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 29368

Hi,

On 24.11.2017 18:02, Ludovic Courtès wrote:
> Hi,
> 
> ludo@gnu.org (Ludovic Courtès) skribis:
> 
>> Martin Castillo <castilma@uni-bremen.de> skribis:
>>
>>> test-name: derivation-prerequisites-to-build when outputs already present
>>> location: /home/mcd/guix/tests/derivations.scm:790
>>> source:
>>> + (test-assert
>>> +   "derivation-prerequisites-to-build when outputs already present"
>>> +   (let* ((builder '(begin (mkdir %output) #t))
>>> +          (input-drv
>>> +            (build-expression->derivation
>>> +              %store
>>> +              "input"
>>> +              builder))
>>> +          (input-path
>>> +            (derivation-output-path
>>> +              (assoc-ref (derivation-outputs input-drv) "out")))
>>> +          (drv (build-expression->derivation
>>> +                 %store
>>> +                 "something"
>>> +                 builder
>>> +                 #:inputs
>>> +                 `(("i" ,input-drv))))
>>> +          (output (derivation->output-path drv)))
>>> +     (when (valid-path? %store input-path)
>>> +           (delete-paths %store (list input-path)))
>>> +     (when (valid-path? %store output)
>>> +           (delete-paths %store (list output)))
>>> +     (and (equal?
>>> +            (map derivation-input-path
>>> +                 (derivation-prerequisites-to-build %store drv))
>>> +            (list (derivation-file-name input-drv)))
>>> +          (build-derivations %store (list drv))
>>> +          (delete-paths %store (list input-path))
>>> +          (not (valid-path? %store input-path))
>>> +          (null? (derivation-prerequisites-to-build %store drv)))))
>>> finding garbage collector roots...
>>> actual-value: #f
>>> actual-error:
>>> + (srfi-34
>>> +   #<condition &nix-protocol-error [message: "program `/home/mcd/guix/nix/scripts/list-runtime-roots' failed with exit code 1" status: 1] 380d4b0>)
>>> result: FAIL
>>
>> It’s seems to be the Guile running ‘list-runtime-roots’ that’s
>> segfaulting.
> 
> Actually it didn’t segfault: it exited normally, but with exit code 1.
> That shouldn’t happen.
> 
> Does “make check -j3” or so still trigger the problem?  If so, could you
> try collecting more details with:
> 
>   strace -f -o log -s 234 make check -j3
> 
> ?
> 
> TIA,
> Ludo’.
> 

In the meantime I updated the guix checkout and since my
.config/guix/latest points to the guix checkout, i checked 84bd92438 out
in another directory and ran
guix environment guix --ad-hoc strace
./bootstrap && ./configure --localstatedir=/var
./pre-inst-env strace -f -o log.fifo -s 234 make check -j3

make check -j3 doesn't always trigger it. But it did in the following 2
cases.

Your command creates a lot of output, so I piped straces output to
bzip2. It took very long so I aborted and retried but piped it onto the
host system to compress it. This is still takes very long when it
reached guix-daemon test. On top of it, I got a filesystem error which
resulted in a ro-remount, so I decided to interrupt the second try, too.
You can access the logs at
https://seafile.zfn.uni-bremen.de/d/7990941e630141309a58/


Martin

^ permalink raw reply	[flat|nested] 6+ messages in thread

* bug#29368: Unreliable failing tests / segfaulting guile
  2017-11-26 13:06     ` Martin Castillo
@ 2017-11-26 14:59       ` Ludovic Courtès
  0 siblings, 0 replies; 6+ messages in thread
From: Ludovic Courtès @ 2017-11-26 14:59 UTC (permalink / raw)
  To: Martin Castillo; +Cc: 29368-done

[-- Attachment #1: Type: text/plain, Size: 2379 bytes --]

Hello,

Martin Castillo <castilma@uni-bremen.de> skribis:

> In the meantime I updated the guix checkout and since my
> .config/guix/latest points to the guix checkout, i checked 84bd92438 out
> in another directory and ran
> guix environment guix --ad-hoc strace
> ./bootstrap && ./configure --localstatedir=/var
> ./pre-inst-env strace -f -o log.fifo -s 234 make check -j3
>
> make check -j3 doesn't always trigger it. But it did in the following 2
> cases.
>
> Your command creates a lot of output, so I piped straces output to
> bzip2. It took very long so I aborted and retried but piped it onto the
> host system to compress it. This is still takes very long when it
> reached guix-daemon test. On top of it, I got a filesystem error which
> resulted in a ro-remount, so I decided to interrupt the second try, too.
> You can access the logs at
> https://seafile.zfn.uni-bremen.de/d/7990941e630141309a58/

Thanks a lot for the logs.

With the script below I extracted the lines corresponding to a non-zero
exit of ‘list-runtime-roots’, and then looked at what happened
immediately before.  It typically looks like this:

--8<---------------cut here---------------start------------->8---
15542 write(2, "Backtrace:\nIn srfi/srfi-1.scm:\n   592:29 19 (map1 _)\n   592:29 18 (map1 _)\n   592:29 17 (map1 _)\n   592:29 16 (map1 _)\n   592:29 15 (map1 _)\n   592:29 14 (map1 _)\n   592:29 13 (map1 _)\n   592:29 12 (map1 _)\n   592:29 11 (map1 _)\
n   59"..., 852) = 852
15542 exit_group(1 <unfinished ...>
--8<---------------cut here---------------end--------------->8---

So most likely it corresponds to the error you reported:

--8<---------------cut here---------------start------------->8---
scheme@(guile-user)> (while #t (load-from-path "list-runtime-roots"))
... ;; skipping repeated expected output
srfi/srfi-1.scm:592:17: In procedure map1:
srfi/srfi-1.scm:592:17: In procedure fport_read: Kein passender Prozess
gefunden ;; No matching process found
--8<---------------cut here---------------end--------------->8---

Indeed, if we open, say, /proc/XYZ/cmdline and then process XYZ dies,
reading from that file descriptor yields ESRCH (the error above).

Commit 9b0713012905f3997d6fad201dba7c3d93b38b13 fixes that.  I’ll update
the ‘guix’ package snapshot soon so we get this fix.

Thank you!

Ludo’.


[-- Attachment #2: match exec/exit lines --]
[-- Type: text/plain, Size: 932 bytes --]

(use-modules (ice-9 rdelim)
             (ice-9 match)
             (ice-9 regex))

(define exec-rx
  (make-regexp "^([[:digit:]]+) exec.*list-runtime-roots"))

(define exit-rx
  (make-regexp "^([[:digit:]]+) exit_group"))

(call-with-input-file "/tmp/log"
  (lambda (port)
    (let loop ((pid #f))
      (match (read-line port)
        ((? eof-object?)
         #f)
        (line
         (if pid
             (match (regexp-exec exit-rx line)
               (#f
                (loop pid))
               (result
                (if (= pid (string->number (match:substring result 1)))
                    (begin
                      (pk 'exit pid line (port-line port))
                      (loop #f))
                    (loop pid))))
             (match (regexp-exec exec-rx line)
               (#f
                (loop pid))
               (result
                (loop (string->number (match:substring result 1)))))))))))

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-11-26 15:00 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-20 21:03 bug#29368: Unreliable failing tests / segfaulting guile Martin Castillo
2017-11-20 22:00 ` Ludovic Courtès
2017-11-22  1:43   ` Martin Castillo
2017-11-24 17:02   ` Ludovic Courtès
2017-11-26 13:06     ` Martin Castillo
2017-11-26 14:59       ` Ludovic Courtès

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.