=================================================== GNU Guix 1.3.0.67051-2a6d96: ./test-suite.log =================================================== # TOTAL: 2462 # PASS: 2425 # SKIP: 24 # XFAIL: 2 # FAIL: 11 # XPASS: 0 # ERROR: 0 .. contents:: :depth: 2 SKIP: tests/build-emacs-utils ============================= test-name: emacs-batch-script: print foo from emacs location: /home/james/Code/guix/tests/build-emacs-utils.scm:34 source: + (test-equal + "emacs-batch-script: print foo from emacs" + "foo" + (emacs-batch-script '(princ "foo"))) result: SKIP test-name: emacs-batch-script: raise &emacs-batch-error on failure location: /home/james/Code/guix/tests/build-emacs-utils.scm:38 source: + (test-assert + "emacs-batch-script: raise &emacs-batch-error on failure" + (guard (c ((emacs-batch-error? c) + (string-match + "[Ww]rong.*argument.*numberp.*\"three\"" + (emacs-batch-error-message c)))) + (emacs-batch-script + '(mapcar 'number-to-string (list 1 2 "three"))))) result: SKIP test-name: emacs-header-parse: fetch version location: /home/james/Code/guix/tests/build-emacs-utils.scm:61 source: + (test-equal + "emacs-header-parse: fetch version" + "1.0.0" + (emacs-header-parse "version" mock-elisp-file)) result: SKIP test-name: emacs-header-parse: fetch keywords location: /home/james/Code/guix/tests/build-emacs-utils.scm:64 source: + (test-equal + "emacs-header-parse: fetch keywords" + "lisp test" + (emacs-header-parse "keywords" mock-elisp-file)) result: SKIP test-name: emacs-header-parse: fetch nonexistent author location: /home/james/Code/guix/tests/build-emacs-utils.scm:67 source: + (test-equal + "emacs-header-parse: fetch nonexistent author" + "nil" + (emacs-header-parse "author" mock-elisp-file)) result: SKIP SKIP: tests/channels ==================== test-name: channel-instance-metadata returns default if .guix-channel does not exist location: /home/james/Code/guix/tests/channels.scm:116 source: + (test-equal + "channel-instance-metadata returns default if .guix-channel does not exist" + '("/" ()) + (let ((metadata + (channel-instance-metadata instance--boring))) + (list (channel-metadata-directory metadata) + (channel-metadata-dependencies metadata)))) expected-value: ("/" ()) actual-value: ("/" ()) result: PASS test-name: channel-instance-metadata and default dependencies location: /home/james/Code/guix/tests/channels.scm:122 source: + (test-equal + "channel-instance-metadata and default dependencies" + '() + (channel-metadata-dependencies + (channel-instance-metadata instance--no-deps))) expected-value: () actual-value: () result: PASS test-name: channel-instance-metadata and directory location: /home/james/Code/guix/tests/channels.scm:126 source: + (test-equal + "channel-instance-metadata and directory" + "/modules" + (channel-metadata-directory + (channel-instance-metadata + instance--sub-directory))) expected-value: "/modules" actual-value: "/modules" result: PASS test-name: channel-instance-metadata rejects unsupported version location: /home/james/Code/guix/tests/channels.scm:131 source: + (test-equal + "channel-instance-metadata rejects unsupported version" + 1 + (guard (c ((and (message-condition? c) (error-location? c)) + (location-line (error-location c)))) + (channel-instance-metadata + instance--unsupported-version))) expected-value: 1 actual-value: 1 result: PASS test-name: channel-instance-metadata returns location: /home/james/Code/guix/tests/channels.scm:137 source: + (test-assert + "channel-instance-metadata returns " + (every (@@ (guix channels) channel-metadata?) + (map channel-instance-metadata + (list instance--no-deps + instance--simple + instance--with-dupes)))) actual-value: #t result: PASS test-name: channel-instance-metadata dependencies are channels location: /home/james/Code/guix/tests/channels.scm:144 source: + (test-assert + "channel-instance-metadata dependencies are channels" + (let ((deps ((@@ (guix channels) + channel-metadata-dependencies) + (channel-instance-metadata instance--simple)))) + (match deps (((? channel? dep)) #t) (_ #f)))) actual-value: #t result: PASS test-name: latest-channel-instances includes channel dependencies location: /home/james/Code/guix/tests/channels.scm:151 source: + (test-assert + "latest-channel-instances includes channel dependencies" + (let* ((channel (channel (name 'test) (url "test"))) + (test-dir + (channel-instance-checkout instance--simple))) + (mock ((guix git) + update-cached-checkout + (lambda* (url #:key ref starting-commit) + (match url + ("test" (values test-dir "caf3cabba9e" #f)) + (_ (values + (channel-instance-checkout instance--no-deps) + "abcde1234" + #f))))) + (with-store + store + (let ((instances + (latest-channel-instances store (list channel)))) + (and (eq? 2 (length instances)) + (lset= eq? + '(test test-channel) + (map (compose + channel-name + channel-instance-channel) + instances)))))))) actual-value: #t result: PASS test-name: latest-channel-instances excludes duplicate channel dependencies location: /home/james/Code/guix/tests/channels.scm:170 source: + (test-assert + "latest-channel-instances excludes duplicate channel dependencies" + (let* ((channel (channel (name 'test) (url "test"))) + (test-dir + (channel-instance-checkout instance--with-dupes))) + (mock ((guix git) + update-cached-checkout + (lambda* (url #:key ref starting-commit) + (match url + ("test" (values test-dir "caf3cabba9e" #f)) + (_ (values + (channel-instance-checkout instance--no-deps) + "abcde1234" + #f))))) + (with-store + store + (let ((instances + (latest-channel-instances store (list channel)))) + (and (= 2 (length instances)) + (lset= eq? + '(test test-channel) + (map (compose + channel-name + channel-instance-channel) + instances)) + (find (lambda (instance) + (and (eq? (channel-name + (channel-instance-channel instance)) + 'test-channel) + (equal? + (channel-commit + (channel-instance-channel instance)) + "abc1234"))) + instances))))))) actual-value: #< channel: #< name: test-channel url: "https://example.com/test-channel" branch: "master" commit: "abc1234" introduction: #f location: ((filename . "guix/channels.scm") (line . 293) (column . 19))> commit: "abcde1234" checkout: "/home/james/Code/guix/test-tmp/store/f35w950llsalyd3dwzx8jd25r8yb27bg-test-channel-abcde12"> result: PASS hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m Initialized empty Git repository in /tmp/guix-directory.3MyQBJ/.git/ [master (root-commit) 04fd3aa] first commit 1 file changed, 1 insertion(+) create mode 100644 a.scm [master b015aac] second commit 1 file changed, 1 insertion(+) create mode 100644 .guix-channel hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m Initialized empty Git repository in /tmp/guix-directory.penyue/.git/ [master (root-commit) 6c98c7c] initial commit 1 file changed, 1 insertion(+) create mode 100644 .guix-channel test-name: latest-channel-instances reads dependencies from most-specific instance location: /home/james/Code/guix/tests/channels.scm:199 source: + (test-equal + "latest-channel-instances reads dependencies from most-specific instance" + '(chan1 chan2) + (with-temporary-git-repository + directory1 + `((add "a.scm" "(define-module (a))") + (commit "first commit") + (add ".guix-channel" + ,(object->string + '(channel + (version 0) + (dependencies + (channel + (name nonexistent-dependency) + (url "http://guix.example.org/does-not-exist.git")))))) + (commit "second commit")) + (with-temporary-git-repository + directory2 + `((add ".guix-channel" + ,(object->string + `(channel + (version 0) + (dependencies + (channel + (name chan1) + (url ,(string-append "file://" directory1))))))) + (commit "initial commit")) + (with-repository + directory1 + repository + (let* ((commit (find-commit repository "first")) + (one (channel + (url (string-append "file://" directory1)) + (commit (oid->string (commit-id commit))) + (name 'chan1))) + (two (channel + (url (string-append "file://" directory2)) + (name 'chan2)))) + (with-store + store + (map (compose channel-name channel-instance-channel) + (delete-duplicates + (append + (latest-channel-instances store (list one two)) + (latest-channel-instances store (list two one))) + (lambda (instance1 instance2) + (string=? + (channel-instance-commit instance1) + (channel-instance-commit instance2))))))))))) expected-value: (chan1 chan2) actual-value: (chan1 chan2) result: PASS hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m Initialized empty Git repository in /tmp/guix-directory.owcQbu/.git/ [master (root-commit) 5edf76a] first commit 1 file changed, 1 insertion(+) create mode 100644 a.txt [master 3c987f2] second commit 1 file changed, 1 insertion(+) create mode 100644 b.scm test-name: latest-channel-instances #:validate-pull location: /home/james/Code/guix/tests/channels.scm:248 source: + (test-equal + "latest-channel-instances #:validate-pull" + 'descendant + (let/ec + return + (with-temporary-git-repository + directory + '((add "a.txt" "A") + (commit "first commit") + (add "b.scm" "#t") + (commit "second commit")) + (with-repository + directory + repository + (let* ((commit1 (find-commit repository "first")) + (commit2 (find-commit repository "second")) + (spec (channel + (url (string-append "file://" directory)) + (name 'foo))) + (new (channel + (inherit spec) + (commit (oid->string (commit-id commit2))))) + (old (channel + (inherit spec) + (commit (oid->string (commit-id commit1)))))) + (define (validate-pull channel current commit relation) + (return + (and (eq? channel old) + (string=? + (oid->string (commit-id commit2)) + current) + (string=? + (oid->string (commit-id commit1)) + commit) + relation))) + (with-store + store + (latest-channel-instances + store + (list old) + #:current-channels + (list new) + #:validate-pull + validate-pull))))))) expected-value: descendant actual-value: descendant result: PASS test-name: channel-instances->manifest location: /home/james/Code/guix/tests/channels.scm:281 source: + (test-assert + "channel-instances->manifest" + (let* ((spec (lambda deps + `(channel + (version 0) + (dependencies + ,@(map (lambda (dep) + `(channel + (name ,dep) + (url "http://example.org"))) + deps))))) + (guix (make-instance #:name 'guix)) + (instance0 (make-instance #:name 'a)) + (instance1 + (make-instance #:name 'b #:spec (spec 'a))) + (instance2 + (make-instance #:name 'c #:spec (spec 'b))) + (instance3 + (make-instance #:name 'd #:spec (spec 'c 'a)))) + (%graft? #f) + (let ((source (channel-instance-checkout guix))) + (mkdir (string-append source "/build-aux")) + (call-with-output-file + (string-append + source + "/build-aux/build-self.scm") + (lambda (port) + (write '(begin + (use-modules (guix) (gnu packages bootstrap)) + (lambda _ (package->derivation %bootstrap-guile))) + port)))) + (with-store + store + (let () + (define manifest + (run-with-store + store + (channel-instances->manifest + (list guix + instance0 + instance1 + instance2 + instance3)))) + (define entries (manifest-entries manifest)) + (define (depends? drv in out) + (let ((set (list->set + (requisites + store + (list (derivation-file-name drv))))) + (in (map derivation-file-name in)) + (out (map derivation-file-name out))) + (and (every (cut set-contains? set <>) in) + (not (any (cut set-contains? set <>) out))))) + (define (lookup name) + (run-with-store + store + (lower-object + (manifest-entry-item + (manifest-lookup + manifest + (manifest-pattern (name name))))))) + (let ((drv-guix (lookup "guix")) + (drv0 (lookup "a")) + (drv1 (lookup "b")) + (drv2 (lookup "c")) + (drv3 (lookup "d"))) + (and (depends? + drv-guix + '() + (list drv0 drv1 drv2 drv3)) + (depends? drv0 (list) (list drv1 drv2 drv3)) + (depends? drv1 (list drv0) (list drv2 drv3)) + (depends? drv2 (list drv1) (list drv3)) + (depends? drv3 (list drv2 drv0) (list)))))))) actual-value: #t result: PASS hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m Initialized empty Git repository in /tmp/guix-directory.5HOQSm/.git/ [master (root-commit) 98f35e8] the commit 1 file changed, 1 insertion(+) create mode 100644 a.txt test-name: channel-news, no news location: /home/james/Code/guix/tests/channels.scm:357 source: + (test-equal + "channel-news, no news" + '() + (with-temporary-git-repository + directory + '((add "a.txt" "A") (commit "the commit")) + (with-repository + directory + repository + (let ((channel + (channel + (url (string-append "file://" directory)) + (name 'foo))) + (latest (reference-name->oid repository "HEAD"))) + (channel-news-for-commit + channel + (oid->string latest)))))) expected-value: () actual-value: () result: PASS hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m Initialized empty Git repository in /tmp/guix-directory.aIh9eU/.git/ [master (root-commit) 3fff5cd] first commit 1 file changed, 1 insertion(+) create mode 100644 .guix-channel [master f113eab] second commit 1 file changed, 1 insertion(+) create mode 100644 src/a.txt [master 28a0524] third commit 1 file changed, 1 insertion(+) create mode 100644 news.scm [master a7cb07c] fourth commit 1 file changed, 1 insertion(+) create mode 100644 src/b.txt [master 870f08c] fifth commit 1 file changed, 1 insertion(+), 1 deletion(-) test-name: channel-news, one entry location: /home/james/Code/guix/tests/channels.scm:368 source: + (test-assert + "channel-news, one entry" + (with-temporary-git-repository + directory + `((add ".guix-channel" + ,(object->string + '(channel (version 0) (news-file "news.scm")))) + (commit "first commit") + (add "src/a.txt" "A") + (commit "second commit") + (tag "tag-for-first-news-entry") + (add "news.scm" + ,(lambda (repository) + (let ((previous + (reference-name->oid repository "HEAD"))) + (object->string + `(channel-news + (version 0) + (entry (commit ,(oid->string previous)) + (title (en "New file!") (eo "Nova dosiero!")) + (body (en "Yeah, a.txt.")))))))) + (commit "third commit") + (add "src/b.txt" "B") + (commit "fourth commit") + (add "news.scm" + ,(lambda (repository) + (let ((second + (commit-id + (find-commit repository "second commit"))) + (previous + (reference-name->oid repository "HEAD"))) + (object->string + `(channel-news + (version 0) + (entry (commit ,(oid->string previous)) + (title (en "Another file!")) + (body (en "Yeah, b.txt."))) + (entry (tag "tag-for-first-news-entry") + (title (en "Old news.") (eo "Malnova?oj.")) + (body (en "For a.txt")))))))) + (commit "fifth commit")) + (with-repository + directory + repository + (define (find-commit* message) + (oid->string + (commit-id (find-commit repository message)))) + (let ((channel + (channel + (url (string-append "file://" directory)) + (name 'foo))) + (commit1 (find-commit* "first commit")) + (commit2 (find-commit* "second commit")) + (commit3 (find-commit* "third commit")) + (commit4 (find-commit* "fourth commit")) + (commit5 (find-commit* "fifth commit"))) + (and (null? (channel-news-for-commit channel commit2)) + (lset= string=? + (map channel-news-entry-commit + (channel-news-for-commit channel commit5)) + (list commit2 commit4)) + (lset= equal? + (map channel-news-entry-title + (channel-news-for-commit channel commit5)) + '((("en" . "Another file!")) + (("en" . "Old news.") ("eo" . "Malnova?oj.")))) + (lset= string=? + (map channel-news-entry-commit + (channel-news-for-commit channel commit3)) + (list commit2)) + (lset= string=? + (map channel-news-entry-commit + (channel-news-for-commit channel commit3 commit1)) + (list commit2)) + (lset= string=? + (map channel-news-entry-commit + (channel-news-for-commit channel commit5 commit3)) + (list commit4)) + (lset= string=? + (map channel-news-entry-commit + (channel-news-for-commit channel commit5 commit1)) + (list commit4 commit2)) + (lset= equal? + (map channel-news-entry-tag + (channel-news-for-commit channel commit5 commit1)) + '(#f "tag-for-first-news-entry"))))))) actual-value: #t result: PASS hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m Initialized empty Git repository in /tmp/guix-directory.4jfaWA/.git/ [master (root-commit) 425415a] first commit 2 files changed, 2 insertions(+) create mode 100644 .guix-channel create mode 100644 src/a.txt [master b17a82d] second commit 1 file changed, 1 insertion(+) create mode 100644 news.scm test-name: channel-news, annotated tag location: /home/james/Code/guix/tests/channels.scm:455 source: + (test-assert + "channel-news, annotated tag" + (with-temporary-git-repository + directory + `((add ".guix-channel" + ,(object->string + '(channel (version 0) (news-file "news.scm")))) + (add "src/a.txt" "A") + (commit "first commit") + (tag "tag-for-first-news-entry" + "This is an annotated tag.") + (add "news.scm" + ,(lambda (repository) + (let ((previous + (reference-name->oid repository "HEAD"))) + (object->string + `(channel-news + (version 0) + (entry (tag "tag-for-first-news-entry") + (title (en "New file!")) + (body (en "Yeah, a.txt.")))))))) + (commit "second commit")) + (with-repository + directory + repository + (define (find-commit* message) + (oid->string + (commit-id (find-commit repository message)))) + (let ((channel + (channel + (url (string-append "file://" directory)) + (name 'foo))) + (commit1 (find-commit* "first commit")) + (commit2 (find-commit* "second commit"))) + (and (null? (channel-news-for-commit channel commit1)) + (lset= equal? + (map channel-news-entry-title + (channel-news-for-commit channel commit2)) + '((("en" . "New file!")))) + (lset= string=? + (map channel-news-entry-tag + (channel-news-for-commit channel commit2)) + (list "tag-for-first-news-entry")) + (lset= string=? + (map channel-news-entry-commit + (channel-news-for-commit channel commit2)) + (list commit1))))))) actual-value: #t result: PASS hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m Initialized empty Git repository in /tmp/guix-directory.u7xQsR/.git/ [master (root-commit) ab4ed25] first commit 1 file changed, 1 insertion(+) create mode 100644 a.txt [master 64a8fad] second commit 1 file changed, 1 insertion(+) create mode 100644 b.scm test-name: latest-channel-instances, missing introduction for 'guix' location: /home/james/Code/guix/tests/channels.scm:501 source: + (test-assert + "latest-channel-instances, missing introduction for 'guix'" + (with-temporary-git-repository + directory + '((add "a.txt" "A") + (commit "first commit") + (add "b.scm" "#t") + (commit "second commit")) + (with-repository + directory + repository + (let* ((commit1 (find-commit repository "first")) + (commit2 (find-commit repository "second")) + (channel + (channel + (url (string-append "file://" directory)) + (name 'guix)))) + (guard (c ((formatted-message? c) + (->bool + (string-contains + (formatted-message-string c) + "introduction")))) + (with-store + store + (latest-channel-instances store (list channel)) + #f)))))) actual-value: #t result: PASS test-name: authenticate-channel, wrong first commit signer location: /home/james/Code/guix/tests/channels.scm:522 source: + (test-equal + "authenticate-channel, wrong first commit signer" + #t + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file + %ed25519-2-public-key-file + %ed25519-2-secret-key-file) + (with-temporary-git-repository + directory + `((add ".guix-channel" + ,(object->string + '(channel + (version 0) + (keyring-reference "master")))) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Charlie")))))) + (add "signer.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (commit + "first commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (add "random" ,(random-text)) + (commit + "second commit" + (signer + ,(key-fingerprint %ed25519-public-key-file)))) + (with-repository + directory + repository + (let* ((commit1 (find-commit repository "first")) + (commit2 (find-commit repository "second")) + (intro (make-channel-introduction + (commit-id-string commit1) + (openpgp-public-key-fingerprint + (read-openpgp-packet %ed25519-2-public-key-file)))) + (channel + (channel + (name 'example) + (url (string-append "file://" directory)) + (introduction intro)))) + (guard (c ((formatted-message? c) + (and (string-contains + (formatted-message-string c) + "initial commit") + (equal? + (formatted-message-arguments c) + (list (oid->string (commit-id commit1)) + (key-fingerprint %ed25519-public-key-file) + (key-fingerprint + %ed25519-2-public-key-file)))))) + (authenticate-channel + channel + directory + (commit-id-string commit2) + #:keyring-reference-prefix + "") + 'failed)))))) result: SKIP test-name: authenticate-channel, not a descendant of introductory commit location: /home/james/Code/guix/tests/channels.scm:572 source: + (test-equal + "authenticate-channel, not a descendant of introductory commit" + #t + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file + %ed25519-2-public-key-file + %ed25519-2-secret-key-file) + (with-temporary-git-repository + directory + `((add ".guix-channel" + ,(object->string + '(channel + (version 0) + (keyring-reference "master")))) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Charlie")))))) + (add "signer.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (commit + "first commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (branch "alternate-branch") + (checkout "alternate-branch") + (add "something.txt" ,(random-text)) + (commit + "intro commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (checkout "master") + (add "random" ,(random-text)) + (commit + "second commit" + (signer + ,(key-fingerprint %ed25519-public-key-file)))) + (with-repository + directory + repository + (let* ((commit1 (find-commit repository "first")) + (commit2 (find-commit repository "second")) + (commit0 + (commit-lookup + repository + (reference-target + (branch-lookup repository "alternate-branch")))) + (intro (make-channel-introduction + (commit-id-string commit0) + (openpgp-public-key-fingerprint + (read-openpgp-packet %ed25519-public-key-file)))) + (channel + (channel + (name 'example) + (url (string-append "file://" directory)) + (introduction intro)))) + (guard (c ((formatted-message? c) + (and (string-contains + (formatted-message-string c) + "not a descendant") + (equal? + (formatted-message-arguments c) + (list (oid->string (commit-id commit2)) + (oid->string (commit-id commit0))))))) + (authenticate-channel + channel + directory + (commit-id-string commit2) + #:keyring-reference-prefix + "") + 'failed)))))) result: SKIP test-name: authenticate-channel, .guix-authorizations location: /home/james/Code/guix/tests/channels.scm:630 source: + (test-equal + "authenticate-channel, .guix-authorizations" + #t + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file + %ed25519-2-public-key-file + %ed25519-2-secret-key-file) + (with-temporary-git-repository + directory + `((add ".guix-channel" + ,(object->string + '(channel + (version 0) + (keyring-reference "channel-keyring")))) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Charlie")))))) + (commit "zeroth commit") + (add "a.txt" "A") + (commit + "first commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (add "b.txt" "B") + (commit + "second commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (add "c.txt" "C") + (commit + "third commit" + (signer + ,(key-fingerprint %ed25519-2-public-key-file))) + (branch "channel-keyring") + (checkout "channel-keyring") + (add "signer.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (add "other.key" + ,(call-with-input-file + %ed25519-2-public-key-file + get-string-all)) + (commit "keyring commit") + (checkout "master")) + (with-repository + directory + repository + (let* ((commit1 (find-commit repository "first")) + (commit2 (find-commit repository "second")) + (commit3 (find-commit repository "third")) + (intro (make-channel-introduction + (commit-id-string commit1) + (openpgp-public-key-fingerprint + (read-openpgp-packet %ed25519-public-key-file)))) + (channel + (channel + (name 'example) + (url (string-append "file://" directory)) + (introduction intro)))) + (and (authenticate-channel + channel + directory + (commit-id-string commit2) + #:keyring-reference-prefix + "") + (guard (c ((unauthorized-commit-error? c) + (and (oid=? (git-authentication-error-commit c) + (commit-id commit3)) + (bytevector=? + (openpgp-public-key-fingerprint + (unauthorized-commit-error-signing-key c)) + (openpgp-public-key-fingerprint + (read-openpgp-packet + %ed25519-2-public-key-file)))))) + (authenticate-channel + channel + directory + (commit-id-string commit3) + #:keyring-reference-prefix + "") + 'failed))))))) result: SKIP test-name: latest-channel-instances, authenticate dependency location: /home/james/Code/guix/tests/channels.scm:699 source: + (test-equal + "latest-channel-instances, authenticate dependency" + #t + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file) + (with-temporary-git-repository + dependency-directory + `((add ".guix-channel" + ,(object->string + '(channel + (version 0) + (keyring-reference "master")))) + (add ".guix-authorizations" + ,(object->string `(authorizations (version 0) ()))) + (add "signer.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (commit + "zeroth commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (add "foo.txt" "evil") + (commit "unsigned commit")) + (with-repository + dependency-directory + dependency + (let* ((commit0 (find-commit dependency "zeroth")) + (commit1 (find-commit dependency "unsigned")) + (intro `(channel-introduction + (version 0) + (commit ,(commit-id-string commit0)) + (signer + ,(openpgp-format-fingerprint + (openpgp-public-key-fingerprint + (read-openpgp-packet + %ed25519-public-key-file))))))) + (with-temporary-git-repository + directory + `((add ".guix-channel" + ,(object->string + `(channel + (version 0) + (dependencies + (channel + (name test-channel) + (url ,dependency-directory) + (introduction ,intro)))))) + (commit "single commit")) + (let ((channel (channel (name 'test) (url directory)))) + (guard (c ((unsigned-commit-error? c) + (oid=? (git-authentication-error-commit c) + (commit-id commit1)))) + (with-store + store + (latest-channel-instances store (list channel)) + 'failed))))))))) result: SKIP Updating channel 'test' from Git repository at 'test'... Updating channel 'test-channel' from Git repository at 'https://example.com/test-channel'... Updating channel 'test' from Git repository at 'test'... Updating channel 'test-channel' from Git repository at 'https://example.com/test-channel'... Updating channel 'test-channel' from Git repository at 'https://example.com/test-channel'... Updating channel 'chan1' from Git repository at 'file:///tmp/guix-directory.3MyQBJ'... Updating channel 'chan2' from Git repository at 'file:///tmp/guix-directory.penyue'... Updating channel 'chan2' from Git repository at 'file:///tmp/guix-directory.penyue'... Updating channel 'chan1' from Git repository at 'file:///tmp/guix-directory.3MyQBJ'... Updating channel 'foo' from Git repository at 'file:///tmp/guix-directory.owcQbu'... Updating channel 'guix' from Git repository at 'file:///tmp/guix-directory.u7xQsR'... FAIL: tests/containers ====================== test-name: call-with-container, exit with 0 when there is no error location: /home/james/Code/guix/tests/containers.scm:51 source: + (test-assert + "call-with-container, exit with 0 when there is no error" + (zero? (call-with-container + '() + (const #t) + #:namespaces + '(user)))) actual-value: #t result: PASS test-name: call-with-container, user namespace location: /home/james/Code/guix/tests/containers.scm:56 source: + (test-assert + "call-with-container, user namespace" + (zero? (call-with-container + '() + (lambda () + (assert-exit + (and (zero? (getuid)) (zero? (getgid))))) + #:namespaces + '(user)))) actual-value: #t result: PASS test-name: call-with-container, user namespace, guest UID/GID location: /home/james/Code/guix/tests/containers.scm:65 source: + (test-assert + "call-with-container, user namespace, guest UID/GID" + (zero? (call-with-container + '() + (lambda () + (assert-exit + (and (= 42 (getuid)) (= 77 (getgid))))) + #:guest-uid + 42 + #:guest-gid + 77 + #:namespaces + '(user)))) actual-value: #t result: PASS test-name: call-with-container, uts namespace location: /home/james/Code/guix/tests/containers.scm:75 source: + (test-assert + "call-with-container, uts namespace" + (zero? (call-with-container + '() + (lambda () + (sethostname "test-container") + (primitive-exit 0)) + #:namespaces + '(user uts)))) actual-value: #t result: PASS test-name: call-with-container, pid namespace location: /home/james/Code/guix/tests/containers.scm:86 source: + (test-assert + "call-with-container, pid namespace" + (zero? (call-with-container + '() + (lambda () + (match (primitive-fork) + (0 (assert-exit (= 2 (getpid)))) + (pid (primitive-exit + (match (waitpid pid) + ((_ . status) + (status:exit-val status))))))) + #:namespaces + '(user pid)))) actual-value: #t result: PASS test-name: call-with-container, mnt namespace location: /home/james/Code/guix/tests/containers.scm:102 source: + (test-assert + "call-with-container, mnt namespace" + (zero? (call-with-container + (list (file-system + (device "none") + (mount-point "/testing") + (type "tmpfs") + (check? #f))) + (lambda () + (assert-exit (file-exists? "/testing"))) + #:namespaces + '(user mnt)))) actual-value: #t result: PASS test-name: call-with-container, mnt namespace, wrong bind mount location: /home/james/Code/guix/tests/containers.scm:114 source: + (test-equal + "call-with-container, mnt namespace, wrong bind mount" + `(system-error ,ENOENT) + (catch 'system-error + (lambda () + (call-with-container + (list (file-system + (device "/does-not-exist") + (mount-point "/foo") + (type "none") + (flags '(bind-mount)) + (check? #f))) + (const #t) + #:namespaces + '(user mnt))) + (lambda args + (list 'system-error (system-error-errno args))))) expected-value: (system-error 2) actual-value: (system-error 2) result: PASS test-name: call-with-container, all namespaces location: /home/james/Code/guix/tests/containers.scm:131 source: + (test-assert + "call-with-container, all namespaces" + (zero? (call-with-container + '() + (lambda () (primitive-exit 0))))) actual-value: #f actual-error: + (system-error + "mount" + "mount ~S on ~S: ~A" + ("none" + "/tmp/guix-directory.HckwrG/sys" + "Operation not permitted") + (1)) result: FAIL test-name: call-with-container, mnt namespace, root permissions location: /home/james/Code/guix/tests/containers.scm:138 source: + (test-assert + "call-with-container, mnt namespace, root permissions" + (zero? (call-with-container + '() + (lambda () + (assert-exit (= 493 (stat:perms (lstat "/"))))) + #:namespaces + '(user mnt)))) actual-value: #t result: PASS test-name: container-excursion location: /home/james/Code/guix/tests/containers.scm:146 source: + (test-assert + "container-excursion" + (call-with-temporary-directory + (lambda (root) + (match (list (pipe) (pipe)) + (((start-in . start-out) (end-in . end-out)) + (define (container) + (close end-out) + (close start-in) + (write 'ready start-out) + (close start-out) + (read end-in) + (close end-in)) + (define (namespaces pid) + (let ((pid (number->string pid))) + (map (lambda (ns) + (readlink (string-append "/proc/" pid "/ns/" ns))) + '("user" "ipc" "uts" "net" "pid" "mnt")))) + (let* ((pid (run-container root '() %namespaces 1 container)) + (container-namespaces (namespaces pid)) + (result + (begin + (close start-out) + (read start-in) + (close start-in) + (container-excursion + pid + (lambda () + (assert-exit + (equal? + container-namespaces + (namespaces (getpid))))))))) + (close end-in) + (write 'done end-out) + (close end-out) + (waitpid pid) + (zero? result))))))) actual-value: #f actual-error: + (system-error + "mount" + "mount ~S on ~S: ~A" + ("none" + "/tmp/guix-directory.8o71eR/sys" + "Operation not permitted") + (1)) result: FAIL test-name: container-excursion, same namespaces location: /home/james/Code/guix/tests/containers.scm:193 source: + (test-equal + "container-excursion, same namespaces" + 42 + (status:exit-val + (container-excursion + (getpid) + (lambda () (primitive-exit 42))))) expected-value: 42 actual-value: 42 result: PASS test-name: container-excursion* location: /home/james/Code/guix/tests/containers.scm:203 source: + (test-assert + "container-excursion*" + (call-with-temporary-directory + (lambda (root) + (define (namespaces pid) + (let ((pid (number->string pid))) + (map (lambda (ns) + (readlink (string-append "/proc/" pid "/ns/" ns))) + '("user" "ipc" "uts" "net" "pid" "mnt")))) + (let* ((pid (run-container + root + '() + %namespaces + 1 + (lambda () (sleep 100)))) + (expected (namespaces pid)) + (result + (container-excursion* + pid + (lambda () (namespaces 1))))) + (kill pid SIGKILL) + (equal? result expected))))) actual-value: #f actual-error: + (system-error + "mount" + "mount ~S on ~S: ~A" + ("none" + "/tmp/guix-directory.mL2sQN/sys" + "Operation not permitted") + (1)) result: FAIL test-name: container-excursion*, same namespaces location: /home/james/Code/guix/tests/containers.scm:224 source: + (test-equal + "container-excursion*, same namespaces" + 42 + (container-excursion* + (getpid) + (lambda () (* 6 7)))) expected-value: 42 actual-value: 42 result: PASS test-name: container-excursion*, /proc location: /home/james/Code/guix/tests/containers.scm:231 source: + (test-equal + "container-excursion*, /proc" + '("1" "2") + (call-with-temporary-directory + (lambda (root) + (let* ((pid (run-container + root + '() + %namespaces + 1 + (lambda () (sleep 100)))) + (result + (container-excursion* + pid + (lambda () + (scandir + "/proc" + (lambda (file) + (char-set-contains? + char-set:digit + (string-ref file 0)))))))) + (kill pid SIGKILL) + result)))) expected-value: ("1" "2") actual-value: #f actual-error: + (system-error + "mount" + "mount ~S on ~S: ~A" + ("none" + "/tmp/guix-directory.dv2See/sys" + "Operation not permitted") + (1)) result: FAIL test-name: eval/container, exit status location: /home/james/Code/guix/tests/containers.scm:252 source: + (test-equal + "eval/container, exit status" + 42 + (let* ((store (open-connection-for-tests)) + (status + (run-with-store + store + (eval/container (gexp (exit 42)))))) + (close-connection store) + (status:exit-val status))) expected-value: 42 actual-value: #f actual-error: + (system-error + "mount" + "mount ~S on ~S: ~A" + ("none" + "/tmp/guix-directory.P6T453/sys" + "Operation not permitted") + (1)) result: FAIL test-name: eval/container, writable user mapping location: /home/james/Code/guix/tests/containers.scm:261 source: + (test-assert + "eval/container, writable user mapping" + (call-with-temporary-directory + (lambda (directory) + (define store (open-connection-for-tests)) + (define result (string-append directory "/r")) + (define requisites* (store-lift requisites)) + (call-with-output-file result (const #t)) + (run-with-store + store + (mlet %store-monad + ((status + (eval/container + (gexp (begin + (use-modules (ice-9 ftw)) + (call-with-output-file + "/result" + (lambda (port) + (write (scandir (ungexp (%store-prefix))) + port))))) + #:mappings + (list (file-system-mapping + (source result) + (target "/result") + (writable? #t))))) + (reqs (requisites* + (list (derivation->output-path (%guile-for-build)))))) + (close-connection store) + (return + (and (zero? (pk 'status status)) + (lset= string=? + (cons* "." ".." (map basename reqs)) + (pk (call-with-input-file result read)))))))))) actual-value: #f actual-error: + (system-error + "mount" + "mount ~S on ~S: ~A" + ("none" + "/tmp/guix-directory.epJjXT/sys" + "Operation not permitted") + (1)) result: FAIL test-name: eval/container, non-empty load path location: /home/james/Code/guix/tests/containers.scm:294 source: + (test-assert + "eval/container, non-empty load path" + (call-with-temporary-directory + (lambda (directory) + (define store (open-connection-for-tests)) + (define result (string-append directory "/r")) + (define requisites* (store-lift requisites)) + (mkdir result) + (run-with-store + store + (mlet %store-monad + ((status + (eval/container + (with-imported-modules + '((guix build utils)) + (gexp (begin + (use-modules (guix build utils)) + (mkdir-p "/result/a/b/c")))) + #:mappings + (list (file-system-mapping + (source result) + (target "/result") + (writable? #t)))))) + (close-connection store) + (return + (and (zero? status) + (file-is-directory? + (string-append result "/a/b/c"))))))))) actual-value: #f actual-error: + (system-error + "mount" + "mount ~S on ~S: ~A" + ("none" + "/tmp/guix-directory.1eSYqM/sys" + "Operation not permitted") + (1)) result: FAIL SKIP: tests/cpio ================ test-name: file->cpio-header + write-cpio-header + read-cpio-header location: /home/james/Code/guix/tests/cpio.scm:44 source: + (test-assert + "file->cpio-header + write-cpio-header + read-cpio-header" + (let* ((header (file->cpio-header %test-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/james/Code/guix/tests/cpio.scm:55 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 SKIP: tests/git-authenticate ============================ hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m Initialized empty Git repository in /tmp/guix-directory.W5rT28/.git/ [master (root-commit) 3c1d22c] first commit 1 file changed, 1 insertion(+) create mode 100644 a.txt [master ffd0e17] second commit 1 file changed, 1 insertion(+) create mode 100644 b.txt test-name: unsigned commits location: /home/james/Code/guix/tests/git-authenticate.scm:47 source: + (test-assert + "unsigned commits" + (with-temporary-git-repository + directory + '((add "a.txt" "A") + (commit "first commit") + (add "b.txt" "B") + (commit "second commit")) + (with-repository + directory + repository + (let ((commit1 (find-commit repository "first")) + (commit2 (find-commit repository "second"))) + (guard (c ((unsigned-commit-error? c) + (oid=? (git-authentication-error-commit c) + (commit-id commit1)))) + (authenticate-commits + repository + (list commit1 commit2) + #:keyring-reference + "master") + 'failed))))) actual-value: #t result: PASS test-name: signed commits, SHA1 signature location: /home/james/Code/guix/tests/git-authenticate.scm:64 source: + (test-assert + "signed commits, SHA1 signature" + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file) + (call-with-output-file + (string-append (getenv "GNUPGHOME") "/gpg.conf") + (lambda (port) (display "digest-algo sha1" port))) + (with-temporary-git-repository + directory + `((add "a.txt" "A") + (add "signer.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Charlie")))))) + (commit + "first commit" + (signer + ,(key-fingerprint %ed25519-public-key-file)))) + (with-repository + directory + repository + (let ((commit (find-commit repository "first"))) + (guard (c ((unsigned-commit-error? c) + (oid=? (git-authentication-error-commit c) + (commit-id commit)))) + (authenticate-commits + repository + (list commit) + #:keyring-reference + "master") + 'failed)))))) result: SKIP test-name: signed commits, default authorizations location: /home/james/Code/guix/tests/git-authenticate.scm:93 source: + (test-assert + "signed commits, default authorizations" + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file) + (with-temporary-git-repository + directory + `((add "signer.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (commit "zeroth commit") + (add "a.txt" "A") + (commit + "first commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (add "b.txt" "B") + (commit + "second commit" + (signer + ,(key-fingerprint %ed25519-public-key-file)))) + (with-repository + directory + repository + (let ((commit1 (find-commit repository "first")) + (commit2 (find-commit repository "second"))) + (authenticate-commits + repository + (list commit1 commit2) + #:default-authorizations + (list (openpgp-public-key-fingerprint + (read-openpgp-packet %ed25519-public-key-file))) + #:keyring-reference + "master")))))) result: SKIP test-name: signed commits, .guix-authorizations location: /home/james/Code/guix/tests/git-authenticate.scm:117 source: + (test-assert + "signed commits, .guix-authorizations" + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file) + (with-temporary-git-repository + directory + `((add "signer.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Charlie")))))) + (commit "zeroth commit") + (add "a.txt" "A") + (commit + "first commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (add ".guix-authorizations" + ,(object->string `(authorizations (version 0) ()))) + (commit + "second commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (add "b.txt" "B") + (commit + "third commit" + (signer + ,(key-fingerprint %ed25519-public-key-file)))) + (with-repository + directory + repository + (let ((commit1 (find-commit repository "first")) + (commit2 (find-commit repository "second")) + (commit3 (find-commit repository "third"))) + (and (authenticate-commits + repository + (list commit1 commit2) + #:keyring-reference + "master") + (guard (c ((unauthorized-commit-error? c) + (and (oid=? (git-authentication-error-commit c) + (commit-id commit3)) + (bytevector=? + (openpgp-public-key-fingerprint + (unauthorized-commit-error-signing-key c)) + (openpgp-public-key-fingerprint + (read-openpgp-packet + %ed25519-public-key-file)))))) + (authenticate-commits + repository + (list commit1 commit2 commit3) + #:keyring-reference + "master") + 'failed))))))) result: SKIP test-name: signed commits, .guix-authorizations, unauthorized merge location: /home/james/Code/guix/tests/git-authenticate.scm:165 source: + (test-assert + "signed commits, .guix-authorizations, unauthorized merge" + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file + %ed25519-2-public-key-file + %ed25519-2-secret-key-file) + (with-temporary-git-repository + directory + `((add "signer1.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (add "signer2.key" + ,(call-with-input-file + %ed25519-2-public-key-file + get-string-all)) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Alice")))))) + (commit "zeroth commit") + (add "a.txt" "A") + (commit + "first commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (branch "devel") + (checkout "devel") + (add "devel/1.txt" "1") + (commit + "first devel commit" + (signer + ,(key-fingerprint %ed25519-2-public-key-file))) + (checkout "master") + (add "b.txt" "B") + (commit + "second commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (merge "devel" + "merge" + (signer + ,(key-fingerprint %ed25519-public-key-file)))) + (with-repository + directory + repository + (let ((master1 (find-commit repository "first commit")) + (master2 + (find-commit repository "second commit")) + (devel1 + (find-commit repository "first devel commit")) + (merge (find-commit repository "merge"))) + (define (correct? c commit) + (and (oid=? (git-authentication-error-commit c) + (commit-id commit)) + (bytevector=? + (openpgp-public-key-fingerprint + (unauthorized-commit-error-signing-key c)) + (openpgp-public-key-fingerprint + (read-openpgp-packet %ed25519-2-public-key-file))))) + (and (authenticate-commits + repository + (list master1 master2) + #:keyring-reference + "master") + (guard (c ((unauthorized-commit-error? c) + (correct? c devel1))) + (authenticate-commits + repository + (list master1 devel1) + #:keyring-reference + "master") + #f) + (guard (c ((unauthorized-commit-error? c) + (correct? c devel1))) + (authenticate-commits + repository + (list master1 master2 devel1 merge) + #:keyring-reference + "master") + #f))))))) result: SKIP test-name: signed commits, .guix-authorizations, authorized merge location: /home/james/Code/guix/tests/git-authenticate.scm:234 source: + (test-assert + "signed commits, .guix-authorizations, authorized merge" + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file + %ed25519-2-public-key-file + %ed25519-2-secret-key-file) + (with-temporary-git-repository + directory + `((add "signer1.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (add "signer2.key" + ,(call-with-input-file + %ed25519-2-public-key-file + get-string-all)) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Alice")))))) + (commit "zeroth commit") + (add "a.txt" "A") + (commit + "first commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (branch "devel") + (checkout "devel") + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Alice")) + (,(key-fingerprint %ed25519-2-public-key-file)))))) + (commit + "first devel commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (add "devel/2.txt" "2") + (commit + "second devel commit" + (signer + ,(key-fingerprint %ed25519-2-public-key-file))) + (checkout "master") + (add "b.txt" "B") + (commit + "second commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (merge "devel" + "merge" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (add "c.txt" "C") + (commit + "third commit" + (signer + ,(key-fingerprint %ed25519-2-public-key-file)))) + (with-repository + directory + repository + (let ((master1 (find-commit repository "first commit")) + (master2 + (find-commit repository "second commit")) + (devel1 + (find-commit repository "first devel commit")) + (devel2 + (find-commit repository "second devel commit")) + (merge (find-commit repository "merge")) + (master3 (find-commit repository "third commit"))) + (authenticate-commits + repository + (list master1 + master2 + devel1 + devel2 + merge + master3) + #:keyring-reference + "master")))))) result: SKIP test-name: signed commits, .guix-authorizations removed location: /home/james/Code/guix/tests/git-authenticate.scm:294 source: + (test-assert + "signed commits, .guix-authorizations removed" + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file) + (with-temporary-git-repository + directory + `((add "signer.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Charlie")))))) + (commit "zeroth commit") + (add "a.txt" "A") + (commit + "first commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (remove ".guix-authorizations") + (commit + "second commit" + (signer + ,(key-fingerprint %ed25519-public-key-file))) + (add "b.txt" "B") + (commit + "third commit" + (signer + ,(key-fingerprint %ed25519-public-key-file)))) + (with-repository + directory + repository + (let ((commit1 (find-commit repository "first")) + (commit2 (find-commit repository "second")) + (commit3 (find-commit repository "third"))) + (and (authenticate-commits + repository + (list commit1 commit2) + #:keyring-reference + "master") + (guard (c ((unauthorized-commit-error? c) + (oid=? (git-authentication-error-commit c) + (commit-id commit2)))) + (authenticate-commits + repository + (list commit1 commit2 commit3) + #:keyring-reference + "master") + 'failed))))))) result: SKIP test-name: introductory commit, valid signature location: /home/james/Code/guix/tests/git-authenticate.scm:335 source: + (test-assert + "introductory commit, valid signature" + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file) + (let ((fingerprint + (key-fingerprint %ed25519-public-key-file))) + (with-temporary-git-repository + directory + `((add "signer.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Charlie")))))) + (commit "zeroth commit" (signer ,fingerprint)) + (add "a.txt" "A") + (commit "first commit" (signer ,fingerprint))) + (with-repository + directory + repository + (let ((commit0 (find-commit repository "zero")) + (commit1 (find-commit repository "first"))) + (authenticate-repository + repository + (commit-id commit0) + (openpgp-fingerprint fingerprint) + #:keyring-reference + "master" + #:cache-key + (random-text)))))))) result: SKIP test-name: introductory commit, missing signature location: /home/james/Code/guix/tests/git-authenticate.scm:362 source: + (test-equal + "introductory commit, missing signature" + 'intro-lacks-signature + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file) + (let ((fingerprint + (key-fingerprint %ed25519-public-key-file))) + (with-temporary-git-repository + directory + `((add "signer.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Charlie")))))) + (commit "zeroth commit") + (add "a.txt" "A") + (commit "first commit" (signer ,fingerprint))) + (with-repository + directory + repository + (let ((commit0 (find-commit repository "zero"))) + (guard (c ((formatted-message? c) + (and (equal? + (formatted-message-arguments c) + (list (oid->string (commit-id commit0)))) + 'intro-lacks-signature))) + (authenticate-repository + repository + (commit-id commit0) + (openpgp-fingerprint fingerprint) + #:keyring-reference + "master" + #:cache-key + (random-text))))))))) result: SKIP test-name: introductory commit, wrong signature location: /home/james/Code/guix/tests/git-authenticate.scm:394 source: + (test-equal + "introductory commit, wrong signature" + 'wrong-intro-signing-key + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file + %ed25519-2-public-key-file + %ed25519-2-secret-key-file) + (let ((fingerprint + (key-fingerprint %ed25519-public-key-file)) + (wrong-fingerprint + (key-fingerprint %ed25519-2-public-key-file))) + (with-temporary-git-repository + directory + `((add "signer1.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (add "signer2.key" + ,(call-with-input-file + %ed25519-2-public-key-file + get-string-all)) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Charlie")))))) + (commit + "zeroth commit" + (signer ,wrong-fingerprint)) + (add "a.txt" "A") + (commit "first commit" (signer ,fingerprint))) + (with-repository + directory + repository + (let ((commit0 (find-commit repository "zero")) + (commit1 (find-commit repository "first"))) + (guard (c ((formatted-message? c) + (and (equal? + (formatted-message-arguments c) + (list (oid->string (commit-id commit0)) + wrong-fingerprint + fingerprint)) + 'wrong-intro-signing-key))) + (authenticate-repository + repository + (commit-id commit0) + (openpgp-fingerprint fingerprint) + #:keyring-reference + "master" + #:cache-key + (random-text))))))))) result: SKIP test-name: authenticate-repository, target not a descendant of intro location: /home/james/Code/guix/tests/git-authenticate.scm:434 source: + (test-equal + "authenticate-repository, target not a descendant of intro" + 'target-commit-not-a-descendant-of-intro + (with-fresh-gnupg-setup + (list %ed25519-public-key-file + %ed25519-secret-key-file) + (let ((fingerprint + (key-fingerprint %ed25519-public-key-file))) + (with-temporary-git-repository + directory + `((add "signer.key" + ,(call-with-input-file + %ed25519-public-key-file + get-string-all)) + (add ".guix-authorizations" + ,(object->string + `(authorizations + (version 0) + ((,(key-fingerprint %ed25519-public-key-file) + (name "Charlie")))))) + (commit "zeroth commit" (signer ,fingerprint)) + (branch "pre-intro-branch") + (checkout "pre-intro-branch") + (add "b.txt" "B") + (commit "alternate commit" (signer ,fingerprint)) + (checkout "master") + (add "a.txt" "A") + (commit "first commit" (signer ,fingerprint)) + (add "c.txt" "C") + (commit "second commit" (signer ,fingerprint))) + (with-repository + directory + repository + (let ((commit1 (find-commit repository "first")) + (commit-alt + (commit-lookup + repository + (reference-target + (branch-lookup repository "pre-intro-branch"))))) + (guard (c ((formatted-message? c) + (and (equal? + (formatted-message-arguments c) + (list (oid->string (commit-id commit-alt)) + (oid->string (commit-id commit1)))) + 'target-commit-not-a-descendant-of-intro))) + (authenticate-repository + repository + (commit-id commit1) + (openpgp-fingerprint fingerprint) + #:end + (commit-id commit-alt) + #:keyring-reference + "master" + #:cache-key + (random-text))))))))) result: SKIP SKIP: tests/hackage =================== Starting download of /tmp/guix-file.c6roHm From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.c6roHm From https://web.archive.org/web/20241109191828/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.c6roHm... could not find its Disarchive specification failed to download "/tmp/guix-file.c6roHm" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test 1 location: /home/james/Code/guix/tests/hackage.scm:215 source: + (test-assert + "hackage->guix-package test 1" + (eval-test-with-cabal test-cabal-1 match-ghc-foo)) actual-value: #t result: PASS Starting download of /tmp/guix-file.HEcNdr From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.HEcNdr From https://web.archive.org/web/20241109191829/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.HEcNdr... could not find its Disarchive specification failed to download "/tmp/guix-file.HEcNdr" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test 2 location: /home/james/Code/guix/tests/hackage.scm:218 source: + (test-assert + "hackage->guix-package test 2" + (eval-test-with-cabal test-cabal-2 match-ghc-foo)) actual-value: #t result: PASS Starting download of /tmp/guix-file.NZwn2X From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.NZwn2X From https://web.archive.org/web/20241109191829/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.NZwn2X... could not find its Disarchive specification failed to download "/tmp/guix-file.NZwn2X" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test 3 location: /home/james/Code/guix/tests/hackage.scm:221 source: + (test-assert + "hackage->guix-package test 3" + (eval-test-with-cabal + test-cabal-3 + match-ghc-foo + #:cabal-environment + '(("impl" . "ghc-7.8")))) actual-value: #t result: PASS Starting download of /tmp/guix-file.tgWP9x From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.tgWP9x From https://web.archive.org/web/20241109191830/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.tgWP9x... could not find its Disarchive specification failed to download "/tmp/guix-file.tgWP9x" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test 4 location: /home/james/Code/guix/tests/hackage.scm:225 source: + (test-assert + "hackage->guix-package test 4" + (eval-test-with-cabal + test-cabal-4 + match-ghc-foo + #:cabal-environment + '(("impl" . "ghc-7.8")))) actual-value: #t result: PASS Starting download of /tmp/guix-file.Ep2Me9 From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.Ep2Me9 From https://web.archive.org/web/20241109191830/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.Ep2Me9... could not find its Disarchive specification failed to download "/tmp/guix-file.Ep2Me9" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test 5 location: /home/james/Code/guix/tests/hackage.scm:229 source: + (test-assert + "hackage->guix-package test 5" + (eval-test-with-cabal + test-cabal-5 + match-ghc-foo + #:cabal-environment + '(("impl" . "ghc-7.8")))) actual-value: #t result: PASS Starting download of /tmp/guix-file.MEk26g From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.MEk26g From https://web.archive.org/web/20241109191831/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.MEk26g... could not find its Disarchive specification failed to download "/tmp/guix-file.MEk26g" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test 6 location: /home/james/Code/guix/tests/hackage.scm:253 source: + (test-assert + "hackage->guix-package test 6" + (eval-test-with-cabal + test-cabal-6 + match-ghc-foo-6)) actual-value: #t result: PASS Starting download of /tmp/guix-file.dZ63NN From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.dZ63NN From https://web.archive.org/web/20241109191831/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.dZ63NN... could not find its Disarchive specification failed to download "/tmp/guix-file.dZ63NN" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test multiline desc (layout) location: /home/james/Code/guix/tests/hackage.scm:271 source: + (test-assert + "hackage->guix-package test multiline desc (layout)" + (eval-test-with-cabal + test-cabal-multiline-layout + match-ghc-foo)) actual-value: #t result: PASS Starting download of /tmp/guix-file.DdH9GB From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.DdH9GB From https://web.archive.org/web/20241109191832/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.DdH9GB... could not find its Disarchive specification failed to download "/tmp/guix-file.DdH9GB" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test multiline desc (braced) location: /home/james/Code/guix/tests/hackage.scm:291 source: + (test-assert + "hackage->guix-package test multiline desc (braced)" + (eval-test-with-cabal + test-cabal-multiline-braced + match-ghc-foo)) actual-value: #t result: PASS Starting download of /tmp/guix-file.4j2e3A From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.4j2e3A From https://web.archive.org/web/20241109191832/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.4j2e3A... could not find its Disarchive specification failed to download "/tmp/guix-file.4j2e3A" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test mixed layout location: /home/james/Code/guix/tests/hackage.scm:309 source: + (test-assert + "hackage->guix-package test mixed layout" + (eval-test-with-cabal + test-cabal-mixed-layout + match-ghc-foo)) actual-value: #t result: PASS Starting download of /tmp/guix-file.OJQ8Wi From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.OJQ8Wi From https://web.archive.org/web/20241109191832/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.OJQ8Wi... could not find its Disarchive specification failed to download "/tmp/guix-file.OJQ8Wi" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test flag executable location: /home/james/Code/guix/tests/hackage.scm:334 source: + (test-assert + "hackage->guix-package test flag executable" + (eval-test-with-cabal + test-cabal-flag-executable + match-ghc-foo)) actual-value: #t result: PASS Starting download of /tmp/guix-file.YL46iN From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.YL46iN From https://web.archive.org/web/20241109191832/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.YL46iN... could not find its Disarchive specification failed to download "/tmp/guix-file.YL46iN" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test properties without space location: /home/james/Code/guix/tests/hackage.scm:353 source: + (test-assert + "hackage->guix-package test properties without space" + (eval-test-with-cabal + test-cabal-property-no-space + match-ghc-foo)) actual-value: #t result: PASS Syntax error: unexpected end of input ;;; (fail #f #f) test-name: hackage->guix-package test without final newline location: /home/james/Code/guix/tests/hackage.scm:368 source: + (test-assert + "hackage->guix-package test without final newline" + (eval-test-with-cabal + test-cabal-no-final-newline + match-ghc-foo)) actual-value: #f result: XFAIL Starting download of /tmp/guix-file.0V5UEW From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.0V5UEW From https://web.archive.org/web/20241109191833/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.0V5UEW... could not find its Disarchive specification failed to download "/tmp/guix-file.0V5UEW" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test internal libraries are ignored location: /home/james/Code/guix/tests/hackage.scm:388 source: + (test-assert + "hackage->guix-package test internal libraries are ignored" + (eval-test-with-cabal + test-cabal-internal-library-ignored + match-ghc-foo)) actual-value: #t result: PASS Starting download of /tmp/guix-file.VUEeIl From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.VUEeIl From https://web.archive.org/web/20241109191833/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.VUEeIl... could not find its Disarchive specification failed to download "/tmp/guix-file.VUEeIl" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test lonely if statement location: /home/james/Code/guix/tests/hackage.scm:481 source: + (test-assert + "hackage->guix-package test lonely if statement" + (eval-test-with-cabal + test-cabal-else + match-ghc-elif + #:cabal-environment + '(("os" . "guix")))) actual-value: #t result: PASS Starting download of /tmp/guix-file.6smPt7 From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.6smPt7 From https://web.archive.org/web/20241109191833/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.6smPt7... could not find its Disarchive specification failed to download "/tmp/guix-file.6smPt7" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test else statement location: /home/james/Code/guix/tests/hackage.scm:485 source: + (test-assert + "hackage->guix-package test else statement" + (eval-test-with-cabal + test-cabal-else + match-ghc-elif + #:cabal-environment + '(("os" . "guix")))) actual-value: #t result: PASS Starting download of /tmp/guix-file.osDdd8 From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.osDdd8 From https://web.archive.org/web/20241109191834/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.osDdd8... could not find its Disarchive specification failed to download "/tmp/guix-file.osDdd8" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test elif statement location: /home/james/Code/guix/tests/hackage.scm:489 source: + (test-assert + "hackage->guix-package test elif statement" + (eval-test-with-cabal + test-cabal-elif + match-ghc-elif + #:cabal-environment + '(("os" . "guix")))) actual-value: #t result: PASS Starting download of /tmp/guix-file.3RqYAi From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.3RqYAi From https://web.archive.org/web/20241109191834/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.3RqYAi... could not find its Disarchive specification failed to download "/tmp/guix-file.3RqYAi" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test elif statement with brackets location: /home/james/Code/guix/tests/hackage.scm:493 source: + (test-assert + "hackage->guix-package test elif statement with brackets" + (eval-test-with-cabal + test-cabal-elif-brackets + match-ghc-elif + #:cabal-environment + '(("os" . "guix")))) actual-value: #t result: PASS Starting download of /tmp/guix-file.0jmDPC From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.0jmDPC From https://web.archive.org/web/20241109191835/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.0jmDPC... could not find its Disarchive specification failed to download "/tmp/guix-file.0jmDPC" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test cabal revision location: /home/james/Code/guix/tests/hackage.scm:535 source: + (test-assert + "hackage->guix-package test cabal revision" + (eval-test-with-cabal + test-cabal-revision + match-ghc-foo-revision)) actual-value: #t result: PASS test-name: read-cabal test 1 location: /home/james/Code/guix/tests/hackage.scm:538 source: + (test-assert + "read-cabal test 1" + (match (call-with-input-string + test-read-cabal-1 + read-cabal) + ((("name" ("test-me")) + ('section + 'library + #f + (('if + ('flag "base4point8") + (("build-depends" ("base >= 4.8 && < 5"))) + (('if + ('flag "base4") + (("build-depends" ("base >= 4 && < 4.8"))) + (('if + ('flag "base3") + (("build-depends" ("base >= 3 && < 4"))) + (("build-depends" ("base < 3")))))))) + ('if + ('or + ('flag "base4point8") + ('and ('flag "base4") ('flag "base3"))) + (("build-depends" ("random"))) + ()) + ("build-depends" ("containers")) + ("exposed-modules" ("Test.QuickCheck.Exception"))))) + #t) + (x (pk 'fail x #f)))) actual-value: #t result: PASS test-name: read-cabal test: if brackets on the same line location: /home/james/Code/guix/tests/hackage.scm:558 source: + (test-assert + "read-cabal test: if brackets on the same line" + (match (call-with-input-string + test-read-cabal-2 + read-cabal) + ((("name" ("test-me")) + ('section + 'common + "defaults" + (('if + ('os "foobar") + (("cc-options" ("-DBARBAZ "))) + ())))) + #t) + (x (pk 'fail x #f)))) actual-value: #t result: PASS Syntax error: unexpected token : { (at line 4, column 4) Syntax error: unexpected end of input ;;; (fail #f #f) test-name: read-cabal test: property brackets on new line location: /home/james/Code/guix/tests/hackage.scm:569 source: + (test-assert + "read-cabal test: property brackets on new line" + (match (call-with-input-string + test-read-cabal-brackets-newline + read-cabal) + ((("name" ("test-me")) + ('section + 'common + "defaults" + (("build-depends" ("foobar , barbaz"))))) + #t) + (x (pk 'fail x #f)))) actual-value: #f result: XFAIL test-name: read-cabal test: library name location: /home/james/Code/guix/tests/hackage.scm:577 source: + (test-assert + "read-cabal test: library name" + (match (call-with-input-string + test-read-cabal-library-name + read-cabal) + ((("name" ("test-me")) + ('section + 'library + "foobar" + (("build-depends" ("foo, bar")))) + ('section + 'library + #f + (("build-depends" ("bar, baz"))))) + #t) + (x (pk 'fail x #f)))) actual-value: #t result: PASS Starting download of /tmp/guix-file.ihqro9 From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.ihqro9 From https://web.archive.org/web/20241109191835/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.ihqro9... could not find its Disarchive specification failed to download "/tmp/guix-file.ihqro9" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test cabal import location: /home/james/Code/guix/tests/hackage.scm:622 source: + (test-assert + "hackage->guix-package test cabal import" + (eval-test-with-cabal + test-cabal-import + match-ghc-foo-import)) actual-value: #t result: PASS Starting download of /tmp/guix-file.8mTqzy From https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'hackage.haskell.org' could not be verified: signer-not-found invalid Starting download of /tmp/guix-file.8mTqzy From https://web.archive.org/web/20241109191835/https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.8mTqzy... could not find its Disarchive specification failed to download "/tmp/guix-file.8mTqzy" from "https://hackage.haskell.org/package/foo/foo-1.0.0.tar.gz" test-name: hackage->guix-package test cabal multiple imports location: /home/james/Code/guix/tests/hackage.scm:667 source: + (test-assert + "hackage->guix-package test cabal multiple imports" + (eval-test-with-cabal + test-cabal-multiple-imports + match-ghc-foo-multiple-imports)) actual-value: #t result: PASS SKIP: tests/inferior ==================== test-name: open-inferior location: /home/james/Code/guix/tests/inferior.scm:55 source: + (test-equal + "open-inferior" + '(42 #t) + (let ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix"))) + (and (inferior? inferior) + (let ((a (inferior-eval '(apply * '(6 7)) inferior)) + (b (inferior-eval + '(@ (gnu packages base) coreutils) + inferior))) + (close-inferior inferior) + (list a (inferior-object? b)))))) expected-value: (42 #t) actual-value: (42 #t) result: PASS test-name: close-inferior location: /home/james/Code/guix/tests/inferior.scm:66 source: + (test-equal + "close-inferior" + '((hello) (world)) + (let* ((inferior1 + (open-inferior + %top-builddir + #:command + "scripts/guix")) + (lst1 (inferior-eval '(list 'hello) inferior1)) + (inferior2 + (open-inferior + %top-builddir + #:command + "scripts/guix")) + (lst2 (inferior-eval '(list 'world) inferior2))) + (close-inferior inferior1) + (close-inferior inferior2) + (list lst1 lst2))) expected-value: ((hello) (world)) actual-value: ((hello) (world)) result: PASS test-name: &inferior-exception location: /home/james/Code/guix/tests/inferior.scm:80 source: + (test-equal + "&inferior-exception" + '(a b c d) + (let ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix"))) + (guard (c ((inferior-exception? c) + (close-inferior inferior) + (and (eq? inferior (inferior-exception-inferior c)) + (match (inferior-exception-stack c) + (((_ (files lines columns)) ..1) + (member "guix/repl.scm" files))) + (inferior-exception-arguments c)))) + (inferior-eval '(throw 'a 'b 'c 'd) inferior) + 'badness))) expected-value: (a b c d) actual-value: (a b c d) result: PASS test-name: &inferior-exception, legacy mode location: /home/james/Code/guix/tests/inferior.scm:94 source: + (test-equal + "&inferior-exception, legacy mode" + '(a b c d) + (let ((inferior (open-inferior %top-builddir))) + (guard (c ((inferior-exception? c) + (close-inferior inferior) + (and (eq? inferior (inferior-exception-inferior c)) + (inferior-exception-arguments c)))) + (inferior-eval '(throw 'a 'b 'c 'd) inferior) + 'badness))) expected-value: (a b c d) actual-value: (a b c d) result: PASS test-name: inferior-packages location: /home/james/Code/guix/tests/inferior.scm:106 source: + (test-equal + "inferior-packages" + (take (sort (fold-packages + (lambda (package lst) + (cons (list (package-name package) + (package-version package) + (package-home-page package) + (package-location package)) + lst)) + '()) + (lambda (x y) (string file: "gnu/packages/games.scm" line: 7390 column: 2>) ("0xffff" "0.10" "https://github.com/pali/0xFFFF" #< file: "gnu/packages/flashing-tools.scm" line: 114 column: 2>) ("389-ds-base" "2.2.2" "https://directory.fedoraproject.org" #< file: "gnu/packages/openldap.scm" line: 214 column: 2>) ("4dtris" "0.4.3" "https://launchpad.net/4dtris/" #< file: "gnu/packages/games.scm" line: 9269 column: 2>) ("4ti2" "1.6.10" "https://4ti2.github.io" #< file: "gnu/packages/maths.scm" line: 883 column: 2>) ("7kaa" "2.15.6" "https://7kfans.com/" #< file: "gnu/packages/games.scm" line: 10941 column: 2>) ("9base" "7-0.63916da" "https://tools.suckless.org/9base/" #< file: "gnu/packages/suckless.scm" line: 1430 column: 2>) ("9yacc" "7-0.63916da" "https://tools.suckless.org/9base/" #< file: "gnu/packages/suckless.scm" line: 1399 column: 2>) ("a2jmidid" "9" "https://github.com/jackaudio/a2jmidid" #< file: "gnu/packages/music.scm" line: 7617 column: 2>) ("a2ps" "4.15.6" "https://www.gnu.org/software/a2ps/" #< file: "gnu/packages/pretty-print.scm" line: 60 column: 2>)) actual-value: (("0ad" "0.0.26-alpha" "https://play0ad.com" #< file: "gnu/packages/games.scm" line: 7390 column: 2>) ("0xffff" "0.10" "https://github.com/pali/0xFFFF" #< file: "gnu/packages/flashing-tools.scm" line: 114 column: 2>) ("389-ds-base" "2.2.2" "https://directory.fedoraproject.org" #< file: "gnu/packages/openldap.scm" line: 214 column: 2>) ("4dtris" "0.4.3" "https://launchpad.net/4dtris/" #< file: "gnu/packages/games.scm" line: 9269 column: 2>) ("4ti2" "1.6.10" "https://4ti2.github.io" #< file: "gnu/packages/maths.scm" line: 883 column: 2>) ("7kaa" "2.15.6" "https://7kfans.com/" #< file: "gnu/packages/games.scm" line: 10941 column: 2>) ("9base" "7-0.63916da" "https://tools.suckless.org/9base/" #< file: "gnu/packages/suckless.scm" line: 1430 column: 2>) ("9yacc" "7-0.63916da" "https://tools.suckless.org/9base/" #< file: "gnu/packages/suckless.scm" line: 1399 column: 2>) ("a2jmidid" "9" "https://github.com/jackaudio/a2jmidid" #< file: "gnu/packages/music.scm" line: 7617 column: 2>) ("a2ps" "4.15.6" "https://www.gnu.org/software/a2ps/" #< file: "gnu/packages/pretty-print.scm" line: 60 column: 2>)) result: PASS test-name: inferior-available-packages location: /home/james/Code/guix/tests/inferior.scm:135 source: + (test-equal + "inferior-available-packages" + (take (sort (fold-available-packages + (lambda* (name + version + result + #:key + supported? + deprecated? + #:allow-other-keys) + (if (and supported? (not deprecated?)) + (alist-cons name version result) + result)) + '()) + (lambda (x y) (stringlist + (lambda (package) + (list (package-name package) + (package-version package) + (package-location package))))) + (list (map ->list (find-packages-by-name "guile" #f)) + (map ->list + (find-packages-by-name "guile" "2.2")))) + (let* ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix")) + (->list + (lambda (package) + (list (inferior-package-name package) + (inferior-package-version package) + (inferior-package-location package)))) + (lst1 (map ->list + (lookup-inferior-packages inferior "guile"))) + (lst2 (map ->list + (lookup-inferior-packages inferior "guile" "2.2")))) + (close-inferior inferior) + (list lst1 lst2))) expected-value: ((("guile" "3.0.9" #< file: "gnu/packages/guile.scm" line: 351 column: 2>) ("guile" "2.2.7" #< file: "gnu/packages/guile.scm" line: 287 column: 2>) ("guile" "2.2.4" #< file: "gnu/packages/guile.scm" line: 338 column: 2>) ("guile" "2.0.14" #< file: "gnu/packages/guile.scm" line: 160 column: 2>) ("guile" "1.8.8" #< file: "gnu/packages/guile.scm" line: 77 column: 2>)) (("guile" "2.2.7" #< file: "gnu/packages/guile.scm" line: 287 column: 2>) ("guile" "2.2.4" #< file: "gnu/packages/guile.scm" line: 338 column: 2>))) actual-value: ((("guile" "3.0.9" #< file: "gnu/packages/guile.scm" line: 351 column: 2>) ("guile" "2.2.7" #< file: "gnu/packages/guile.scm" line: 287 column: 2>) ("guile" "2.2.4" #< file: "gnu/packages/guile.scm" line: 338 column: 2>) ("guile" "2.0.14" #< file: "gnu/packages/guile.scm" line: 160 column: 2>) ("guile" "1.8.8" #< file: "gnu/packages/guile.scm" line: 77 column: 2>)) (("guile" "2.2.7" #< file: "gnu/packages/guile.scm" line: 287 column: 2>) ("guile" "2.2.4" #< file: "gnu/packages/guile.scm" line: 338 column: 2>))) result: PASS test-name: lookup-inferior-packages and eq?-ness location: /home/james/Code/guix/tests/inferior.scm:176 source: + (test-assert + "lookup-inferior-packages and eq?-ness" + (let* ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix")) + (lst1 (lookup-inferior-packages inferior "guile")) + (lst2 (lookup-inferior-packages inferior "guile"))) + (close-inferior inferior) + (every eq? lst1 lst2))) actual-value: #t result: PASS test-name: inferior-package-inputs location: /home/james/Code/guix/tests/inferior.scm:184 source: + (test-equal + "inferior-package-inputs" + (let ((->list + (match-lambda + ((label (? package? package) . rest) + `(,label + (package + ,(package-name package) + ,(package-version package) + ,(package-location package)) + ,@rest))))) + (list (map ->list (package-inputs guile-3.0-latest)) + (map ->list + (package-native-inputs guile-3.0-latest)) + (map ->list + (package-propagated-inputs guile-3.0-latest)))) + (let* ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix")) + (guile (first (lookup-inferior-packages inferior "guile"))) + (->list + (match-lambda + ((label (? inferior-package? package) . rest) + `(,label + (package + ,(inferior-package-name package) + ,(inferior-package-version package) + ,(inferior-package-location package)) + ,@rest)))) + (result + (list (map ->list (inferior-package-inputs guile)) + (map ->list + (inferior-package-native-inputs guile)) + (map ->list + (inferior-package-propagated-inputs guile))))) + (close-inferior inferior) + result)) expected-value: ((("libffi" (package "libffi" "3.4.4" #< file: "gnu/packages/libffi.scm" line: 46 column: 2>)) ("libxcrypt" (package "libxcrypt" "4.4.36" #< file: "gnu/packages/crypto.scm" line: 1649 column: 2>)) ("bash-minimal" (package "bash-minimal" "5.1.16" #< file: "gnu/packages/bash.scm" line: 227 column: 2>))) (("pkg-config" (package "pkg-config" "0.29.2" #< file: "gnu/packages/pkg-config.scm" line: 46 column: 2>))) (("libunistring" (package "libunistring" "1.1" #< file: "gnu/packages/libunistring.scm" line: 36 column: 2>)) ("libgc" (package "libgc" "8.2.4" #< file: "gnu/packages/bdw-gc.scm" line: 35 column: 2>)))) actual-value: ((("libffi" (package "libffi" "3.4.4" #< file: "gnu/packages/libffi.scm" line: 46 column: 2>)) ("libxcrypt" (package "libxcrypt" "4.4.36" #< file: "gnu/packages/crypto.scm" line: 1649 column: 2>)) ("bash-minimal" (package "bash-minimal" "5.1.16" #< file: "gnu/packages/bash.scm" line: 227 column: 2>))) (("pkg-config" (package "pkg-config" "0.29.2" #< file: "gnu/packages/pkg-config.scm" line: 46 column: 2>))) (("libunistring" (package "libunistring" "1.1" #< file: "gnu/packages/libunistring.scm" line: 36 column: 2>)) ("libgc" (package "libgc" "8.2.4" #< file: "gnu/packages/bdw-gc.scm" line: 35 column: 2>)))) result: PASS test-name: inferior-package-search-paths location: /home/james/Code/guix/tests/inferior.scm:214 source: + (test-equal + "inferior-package-search-paths" + (package-native-search-paths guile-3.0) + (let* ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix")) + (guile (first (lookup-inferior-packages inferior "guile"))) + (result + (inferior-package-native-search-paths guile))) + (close-inferior inferior) + result)) expected-value: (#< variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #< variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>) actual-value: (#< variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #< variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>) result: PASS test-name: inferior-eval-with-store location: /home/james/Code/guix/tests/inferior.scm:223 source: + (test-equal + "inferior-eval-with-store" + (add-text-to-store %store "foo" "Hello, world!") + (let* ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix"))) + (inferior-eval-with-store + inferior + %store + '(lambda (store) + (add-text-to-store store "foo" "Hello, world!"))))) expected-value: "/home/james/Code/guix/test-tmp/store/n7zhiy3xqv7vrh94ka6lrlbfyyfra5zx-foo" actual-value: "/home/james/Code/guix/test-tmp/store/n7zhiy3xqv7vrh94ka6lrlbfyyfra5zx-foo" result: PASS test-name: inferior-eval-with-store, &store-protocol-error location: /home/james/Code/guix/tests/inferior.scm:232 source: + (test-assert + "inferior-eval-with-store, &store-protocol-error" + (let* ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix"))) + (guard (c ((store-protocol-error? c) + (string-contains + (store-protocol-error-message c) + "invalid character"))) + (inferior-eval-with-store + inferior + %store + '(lambda (store) + (add-text-to-store store "we|rd/?!@" "uh uh"))) + #f))) actual-value: 0 result: PASS test-name: inferior-eval-with-store, exception location: /home/james/Code/guix/tests/inferior.scm:244 source: + (test-equal + "inferior-eval-with-store, exception" + '(the-answer = 42) + (let ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix"))) + (guard (c ((inferior-exception? c) + (close-inferior inferior) + (inferior-exception-arguments c))) + (inferior-eval-with-store + inferior + %store + '(lambda (store) (throw 'the-answer '= 42)))))) expected-value: (the-answer = 42) actual-value: (the-answer = 42) result: PASS test-name: inferior-eval-with-store, not a procedure location: /home/james/Code/guix/tests/inferior.scm:255 source: + (test-equal + "inferior-eval-with-store, not a procedure" + 'wrong-type-arg + (let ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix"))) + (guard (c ((inferior-exception? c) + (close-inferior inferior) + (car (inferior-exception-arguments c)))) + (inferior-eval-with-store + inferior + %store + '(+ 1 2))))) expected-value: wrong-type-arg actual-value: wrong-type-arg result: PASS test-name: inferior-package-derivation location: /home/james/Code/guix/tests/inferior.scm:264 source: + (test-equal + "inferior-package-derivation" + (map derivation-file-name + (list (package-derivation + %store + %bootstrap-guile + "x86_64-linux") + (package-derivation + %store + %bootstrap-guile + "armhf-linux"))) + (let* ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix")) + (packages (inferior-packages inferior)) + (guile (find (lambda (package) + (string=? + (package-name %bootstrap-guile) + (inferior-package-name package))) + packages))) + (map derivation-file-name + (list (inferior-package-derivation + %store + guile + "x86_64-linux") + (inferior-package-derivation + %store + guile + "armhf-linux"))))) expected-value: ("/home/james/Code/guix/test-tmp/store/yc2jba001ypvb633qazah4sh6r0mywlv-guile-bootstrap-2.0.drv" "/home/james/Code/guix/test-tmp/store/1857i5zhcmhjrszab2jwzi6d0hc9sq9f-guile-bootstrap-2.0.drv") actual-value: ("/home/james/Code/guix/test-tmp/store/yc2jba001ypvb633qazah4sh6r0mywlv-guile-bootstrap-2.0.drv" "/home/james/Code/guix/test-tmp/store/1857i5zhcmhjrszab2jwzi6d0hc9sq9f-guile-bootstrap-2.0.drv") result: PASS test-name: inferior-package-replacement location: /home/james/Code/guix/tests/inferior.scm:282 source: + (test-equal + "inferior-package-replacement" + (package-derivation + %store + (package-replacement sqlite) + "x86_64-linux") + (let* ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix")) + (packages (inferior-packages inferior))) + (match (lookup-inferior-packages + inferior + (package-name sqlite) + (package-version sqlite)) + ((inferior-sqlite rest ...) + (inferior-package-derivation + %store + (inferior-package-replacement inferior-sqlite) + "x86_64-linux"))))) result: SKIP test-name: inferior-package->manifest-entry location: /home/james/Code/guix/tests/inferior.scm:298 source: + (test-equal + "inferior-package->manifest-entry" + (manifest-entry->list + (package->manifest-entry + (first (find-best-packages-by-name "guile" #f)))) + (let* ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix")) + (guile (first (lookup-inferior-packages inferior "guile"))) + (entry (inferior-package->manifest-entry guile))) + (close-inferior inferior) + (manifest-entry->list entry))) expected-value: ("guile" "3.0.9" "out" (#< variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #< variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>) (("libunistring" "1.1" "out" () ()) ("libgc" "8.2.4" "out" () ()))) actual-value: ("guile" "3.0.9" "out" (#< variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #< variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>) (("libunistring" "1.1" "out" () ()) ("libgc" "8.2.4" "out" () ()))) result: PASS test-name: packages->manifest location: /home/james/Code/guix/tests/inferior.scm:308 source: + (test-equal + "packages->manifest" + (map manifest-entry->list + (manifest-entries + (packages->manifest + (find-best-packages-by-name "guile" #f)))) + (let* ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix")) + (guile (first (lookup-inferior-packages inferior "guile"))) + (manifest (packages->manifest (list guile)))) + (close-inferior inferior) + (map manifest-entry->list + (manifest-entries manifest)))) expected-value: (("guile" "3.0.9" "out" (#< variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #< variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>) (("libunistring" "1.1" "out" () ()) ("libgc" "8.2.4" "out" () ())))) actual-value: (("guile" "3.0.9" "out" (#< variable: "GUILE_LOAD_PATH" files: ("share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f> #< variable: "GUILE_LOAD_COMPILED_PATH" files: ("lib/guile/3.0/site-ccache" "share/guile/site/3.0") separator: ":" file-type: directory file-pattern: #f>) (("libunistring" "1.1" "out" () ()) ("libgc" "8.2.4" "out" () ())))) result: PASS guix repl: warning: 'nix-protocol-error?' is deprecated, use 'store-protocol-error?' instead guix repl: warning: 'nix-protocol-error-message' is deprecated, use 'store-protocol-error-message' instead testtest-name: #:error-port stderr location: /home/james/Code/guix/tests/inferior.scm:319 source: + (test-equal + "#:error-port stderr" + 42 + (let ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix" + #:error-port + (current-error-port)))) + (and (inferior? inferior) + (inferior-eval + '(display "test" (current-error-port)) + inferior) + (let ((result + (inferior-eval '(apply * '(6 7)) inferior))) + (close-inferior inferior) + result)))) expected-value: 42 actual-value: 42 result: PASS test-name: #:error-port pipe location: /home/james/Code/guix/tests/inferior.scm:333 source: + (test-equal + "#:error-port pipe" + "42" + (match (pipe) + ((port-to-read-from . port-to-write-to) + (setvbuf port-to-read-from 'line) + (setvbuf port-to-write-to 'line) + (let ((inferior + (open-inferior + %top-builddir + #:command + "scripts/guix" + #:error-port + port-to-write-to))) + (and (inferior? inferior) + (begin + (inferior-eval + '(display "42\n" (current-error-port)) + inferior) + (let loop ((line (read-line port-to-read-from))) + (if (string=? line "42") + (begin (close-inferior inferior) line) + (loop (read-line port-to-read-from)))))))))) expected-value: "42" actual-value: "42" result: PASS SKIP: tests/pypi ================ test-name: guix-package->pypi-name, old URL style location: /home/james/Code/guix/tests/pypi.scm:210 source: + (test-equal + "guix-package->pypi-name, old URL style" + "psutil" + (guix-package->pypi-name + (dummy-package + "foo" + (source + (dummy-origin + (uri "https://pypi.org/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/james/Code/guix/tests/pypi.scm:218 source: + (test-equal + "guix-package->pypi-name, new URL style" + "certbot" + (guix-package->pypi-name + (dummy-package + "foo" + (source + (dummy-origin + (uri "https://pypi.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/james/Code/guix/tests/pypi.scm:226 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: guix-package->pypi-name, honor 'upstream-name' location: /home/james/Code/guix/tests/pypi.scm:235 source: + (test-equal + "guix-package->pypi-name, honor 'upstream-name'" + "bar-3" + (guix-package->pypi-name + (dummy-package + "foo" + (properties '((upstream-name . "bar-3")))))) expected-value: "bar-3" actual-value: "bar-3" result: PASS test-name: specification->requirement-name location: /home/james/Code/guix/tests/pypi.scm:242 source: + (test-equal + "specification->requirement-name" + '("Fizzy" + "PickyThing" + "SomethingWithMarker" + "requests" + "pip") + (map specification->requirement-name + test-specifications)) expected-value: ("Fizzy" "PickyThing" "SomethingWithMarker" "requests" "pip") actual-value: ("Fizzy" "PickyThing" "SomethingWithMarker" "requests" "pip") result: PASS test-name: parse-requires.txt location: /home/james/Code/guix/tests/pypi.scm:246 source: + (test-equal + "parse-requires.txt" + (list '("foo" "bar") '("pytest")) + (mock ((ice-9 ports) + call-with-input-file + call-with-input-string) + (parse-requires.txt test-requires.txt))) expected-value: (("foo" "bar") ("pytest")) actual-value: (("foo" "bar") ("pytest")) result: PASS test-name: parse-requires.txt - Beaker location: /home/james/Code/guix/tests/pypi.scm:252 source: + (test-equal + "parse-requires.txt - Beaker" + (list '() '("Mock" "coverage")) + (mock ((ice-9 ports) + call-with-input-file + call-with-input-string) + (parse-requires.txt test-requires.txt-beaker))) expected-value: (() ("Mock" "coverage")) actual-value: (() ("Mock" "coverage")) result: PASS test-name: parse-wheel-metadata, with extras location: /home/james/Code/guix/tests/pypi.scm:258 source: + (test-equal + "parse-wheel-metadata, with extras" + (list '("wrapt" "bar") '("tox" "bumpversion")) + (mock ((ice-9 ports) + call-with-input-file + call-with-input-string) + (parse-wheel-metadata test-metadata-with-extras))) expected-value: (("wrapt" "bar") ("tox" "bumpversion")) actual-value: (("wrapt" "bar") ("tox" "bumpversion")) result: PASS test-name: parse-wheel-metadata, with extras - Jedi location: /home/james/Code/guix/tests/pypi.scm:264 source: + (test-equal + "parse-wheel-metadata, with extras - Jedi" + (list '("parso") '("pytest")) + (mock ((ice-9 ports) + call-with-input-file + call-with-input-string) + (parse-wheel-metadata + test-metadata-with-extras-jedi))) expected-value: (("parso") ("pytest")) actual-value: (("parso") ("pytest")) result: PASS test-name: find-project-url, with numpy location: /home/james/Code/guix/tests/pypi.scm:270 source: + (test-equal + "find-project-url, with numpy" + "numpy" + (find-project-url + "numpy" + "https://files.pythonhosted.org/packages/0a/c8/a62767a6b374a0dfb02d2a0456e5f56a372cdd1689dbc6ffb6bf1ddedbc0/numpy-1.22.1.zip")) expected-value: "numpy" actual-value: "numpy" result: PASS test-name: find-project-url, uWSGI location: /home/james/Code/guix/tests/pypi.scm:276 source: + (test-equal + "find-project-url, uWSGI" + "uwsgi" + (find-project-url + "uWSGI" + "https://files.pythonhosted.org/packages/24/fd/93851e4a076719199868d4c918cc93a52742e68370188c1c570a6e42a54f/uwsgi-2.0.20.tar.gz")) expected-value: "uwsgi" actual-value: "uwsgi" result: PASS test-name: find-project-url, flake8-array-spacing location: /home/james/Code/guix/tests/pypi.scm:282 source: + (test-equal + "find-project-url, flake8-array-spacing" + "flake8_array_spacing" + (find-project-url + "flake8-array-spacing" + "https://files.pythonhosted.org/packages/a4/21/ff29b901128b681b7de7a2787b3aeb3e1f3cba4a8c0cffa9712cbff016bc/flake8_array_spacing-0.2.0.tar.gz")) expected-value: "flake8_array_spacing" actual-value: "flake8_array_spacing" result: PASS test-name: find-project-url, foo/goo location: /home/james/Code/guix/tests/pypi.scm:288 source: + (test-equal + "find-project-url, foo/goo" + "foo" + (find-project-url + "foo" + "https://files.pythonhosted.org/packages/f0/f00/goo-0.0.0.tar.gz")) expected-value: "foo" actual-value: "foo" result: PASS warning: project name foo does not appear verbatim in the PyPI URI hint: The PyPI URI is: `https://files.pythonhosted.org/packages/f0/f00/goo-0.0.0.tar.gz'. You should review the pypi-uri declaration in the generated package. You may need to replace "foo" with a substring of the PyPI URI that identifies the package. Starting download of /tmp/guix-file.xfPKit From http://localhost:34091/foo-1.0.0.tar.gz...  foo-1.0.0.tar.gz 275B 0B/s 00:00 [ ] 0.0%  foo-1.0.0.tar.gz 275B 312KiB/s 00:00 [##################] 100.0%  foo-1.0.0.tar.gz 275B 272KiB/s 00:00 [##################] 100.0% Starting download of /tmp/guix-file.xWmhTa From http://localhost:34091/foo-1.0.0-py2.py3-none-any.whl... download failed "http://localhost:34091/foo-1.0.0-py2.py3-none-any.whl" 404 "Such is life" Starting download of /tmp/guix-file.xWmhTa From https://web.archive.org/web/20241109192852/http://localhost:34091/foo-1.0.0-py2.py3-none-any.whl... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.xWmhTa... could not find its Disarchive specification failed to download "/tmp/guix-file.xWmhTa" from "http://localhost:34091/foo-1.0.0-py2.py3-none-any.whl" Starting download of /tmp/guix-file.9jsA42 From http://localhost:34091/foo-1.0.0.tar.gz...  foo-1.0.0.tar.gz 275B 0B/s 00:00 [ ] 0.0%  foo-1.0.0.tar.gz 275B 2.1MiB/s 00:00 [##################] 100.0%  foo-1.0.0.tar.gz 275B 831KiB/s 00:00 [##################] 100.0% Starting download of /tmp/guix-file.0yEQxr From http://localhost:34091/foo-1.0.0-py2.py3-none-any.whl... download failed "http://localhost:34091/foo-1.0.0-py2.py3-none-any.whl" 404 "Such is life" Starting download of /tmp/guix-file.0yEQxr From https://web.archive.org/web/20241109192852/http://localhost:34091/foo-1.0.0-py2.py3-none-any.whl... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.0yEQxr... could not find its Disarchive specification failed to download "/tmp/guix-file.0yEQxr" from "http://localhost:34091/foo-1.0.0-py2.py3-none-any.whl" test-name: pypi->guix-package, no wheel location: /home/james/Code/guix/tests/pypi.scm:294 source: + (test-assert + "pypi->guix-package, no wheel" + (let ((tarball + (pypi-tarball + "foo-1.0.0" + `(("src/bizarre.egg-info/requires.txt" + ,test-requires.txt)))) + (twice (lambda (lst) (append lst lst)))) + (with-pypi + (twice `(("/foo-1.0.0.tar.gz" 200 ,(file-dump tarball)) + ("/foo-1.0.0-py2.py3-none-any.whl" 404 "") + ("/foo/json" + 200 + ,(lambda (port) (display (foo-json) port))))) + (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 pyproject-build-system) + (propagated-inputs (list python-bar python-foo)) + (native-inputs (list python-pytest)) + (home-page "http://example.com") + (synopsis "summary") + (description "summary.") + (license license:lgpl2.0)) + (and (string=? default-sha256/base32 hash) + (equal? + (pypi->guix-package "foo" #:version "1.0.0") + (pypi->guix-package "foo")) + (guard (c ((error? c) #t)) + (pypi->guix-package "foo" #:version "42")))) + (x (pk 'fail x #f)))))) actual-value: #t result: PASS test-name: pypi->guix-package, wheels location: /home/james/Code/guix/tests/pypi.scm:329 source: + (test-assert + "pypi->guix-package, wheels" + (let ((tarball + (pypi-tarball + "foo-1.0.0" + '(("foo-1.0.0/foo.egg-info/requires.txt" + "wrong data to make sure we're testing wheels")))) + (wheel (wheel-file + "foo-1.0.0" + `(("METADATA" ,test-metadata))))) + (with-pypi + `(("/foo-1.0.0.tar.gz" 200 ,(file-dump tarball)) + ("/foo-1.0.0-py2.py3-none-any.whl" + 200 + ,(file-dump wheel)) + ("/foo/json" + 200 + ,(lambda (port) (display (foo-json) port)))) + (invalidate-memoization! pypi->guix-package) + (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 pyproject-build-system) + (propagated-inputs (list python-bar python-baz)) + (native-inputs (list python-pytest)) + (home-page "http://example.com") + (synopsis "summary") + (description "summary.") + (license license:lgpl2.0)) + (string=? default-sha256/base32 hash)) + (x (pk 'fail x #f)))))) result: SKIP Starting download of /tmp/guix-file.35HTBi From http://localhost:34499/foo-1.0.0.tar.gz...  foo-1.0.0.tar.gz 178B 0B/s 00:00 [ ] 0.0%  foo-1.0.0.tar.gz 178B 1.4MiB/s 00:00 [##################] 100.0%  foo-1.0.0.tar.gz 178B 848KiB/s 00:00 [##################] 100.0% Starting download of /tmp/guix-file.FvJS4p From http://localhost:34499/foo-1.0.0-py2.py3-none-any.whl... download failed "http://localhost:34499/foo-1.0.0-py2.py3-none-any.whl" 404 "Such is life" Starting download of /tmp/guix-file.FvJS4p From https://web.archive.org/web/20241109192853/http://localhost:34499/foo-1.0.0-py2.py3-none-any.whl... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.FvJS4p... could not find its Disarchive specification failed to download "/tmp/guix-file.FvJS4p" from "http://localhost:34499/foo-1.0.0-py2.py3-none-any.whl" warning: Cannot guess requirements from source archive: no requires.txt file found. test-name: pypi->guix-package, no usable requirement file. location: /home/james/Code/guix/tests/pypi.scm:365 source: + (test-assert + "pypi->guix-package, no usable requirement file." + (let ((tarball + (pypi-tarball + "foo-1.0.0" + '(("foo.egg-info/.empty" ""))))) + (with-pypi + `(("/foo-1.0.0.tar.gz" 200 ,(file-dump tarball)) + ("/foo-1.0.0-py2.py3-none-any.whl" 404 "") + ("/foo/json" + 200 + ,(lambda (port) (display (foo-json) port)))) + (invalidate-memoization! pypi->guix-package) + (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 pyproject-build-system) + (home-page "http://example.com") + (synopsis "summary") + (description "summary.") + (license license:lgpl2.0)) + (string=? default-sha256/base32 hash)) + (x (pk 'fail x #f)))))) actual-value: #t result: PASS Starting download of /tmp/guix-file.xa6B7c From http://localhost:46741/foo-99-1.0.0.tar.gz...  foo-99-1.0.0.tar.gz 281B 0B/s 00:00 [ ] 0.0%  foo-99-1.0.0.tar.gz 281B 2.6MiB/s 00:00 [##################] 100.0%  foo-99-1.0.0.tar.gz 281B 1.3MiB/s 00:00 [##################] 100.0% Starting download of /tmp/guix-file.ArDMcl From http://localhost:46741/foo-99-1.0.0-py2.py3-none-any.whl... download failed "http://localhost:46741/foo-99-1.0.0-py2.py3-none-any.whl" 404 "Such is life" Starting download of /tmp/guix-file.ArDMcl From https://web.archive.org/web/20241109192853/http://localhost:46741/foo-99-1.0.0-py2.py3-none-any.whl... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.ArDMcl... could not find its Disarchive specification failed to download "/tmp/guix-file.ArDMcl" from "http://localhost:46741/foo-99-1.0.0-py2.py3-none-any.whl" test-name: pypi->guix-package, package name contains "-" followed by digits location: /home/james/Code/guix/tests/pypi.scm:393 source: + (test-assert + "pypi->guix-package, package name contains \"-\" followed by digits" + (let ((tarball + (pypi-tarball + "foo-99-1.0.0" + `(("src/bizarre.egg-info/requires.txt" + ,test-requires.txt))))) + (with-pypi + `(("/foo-99-1.0.0.tar.gz" 200 ,(file-dump tarball)) + ("/foo-99-1.0.0-py2.py3-none-any.whl" 404 "") + ("/foo-99/json" + 200 + ,(lambda (port) + (display (foo-json #:name "foo-99") port)))) + (match (pypi->guix-package "foo-99") + (`(package + (name "python-foo-99") + (version "1.0.0") + (source + (origin + (method url-fetch) + (uri (pypi-uri "foo-99" version)) + (sha256 (base32 ,(? string? hash))))) + (properties '(("upstream-name" . "foo-99"))) + (build-system pyproject-build-system) + (propagated-inputs (list python-bar python-foo)) + (native-inputs (list python-pytest)) + (home-page "http://example.com") + (synopsis "summary") + (description "summary.") + (license license:lgpl2.0)) + (string=? default-sha256/base32 hash)) + (x (pk 'fail x #f)))))) actual-value: #t result: PASS Starting download of /tmp/guix-file.oSy7ZZ From http://localhost:40843/foo-1.0.0.tar.gz...  foo-1.0.0.tar.gz 275B 0B/s 00:00 [ ] 0.0%  foo-1.0.0.tar.gz 275B 2.6MiB/s 00:00 [##################] 100.0%  foo-1.0.0.tar.gz 275B 904KiB/s 00:00 [##################] 100.0% Starting download of /tmp/guix-file.lPMAO1 From http://localhost:40843/foo-1.0.0-py2.py3-none-any.whl... download failed "http://localhost:40843/foo-1.0.0-py2.py3-none-any.whl" 404 "Such is life" Starting download of /tmp/guix-file.lPMAO1 From https://web.archive.org/web/20241109192853/http://localhost:40843/foo-1.0.0-py2.py3-none-any.whl... X.509 certificate of 'web.archive.org' could not be verified: signer-not-found invalid Trying to use Disarchive to assemble /tmp/guix-file.lPMAO1... could not find its Disarchive specification failed to download "/tmp/guix-file.lPMAO1" from "http://localhost:40843/foo-1.0.0-py2.py3-none-any.whl" test-name: package-latest-release location: /home/james/Code/guix/tests/pypi.scm:423 source: + (test-equal + "package-latest-release" + (list '("foo-1.0.0.tar.gz") + '("foo-1.0.0.tar.gz.asc") + (list (upstream-input + (name "bar") + (downstream-name "python-bar") + (type 'propagated)) + (upstream-input + (name "foo") + (downstream-name "python-foo") + (type 'propagated)) + (upstream-input + (name "pytest") + (downstream-name "python-pytest") + (type 'native)))) + (let ((tarball + (pypi-tarball + "foo-1.0.0" + `(("src/bizarre.egg-info/requires.txt" + ,test-requires.txt))))) + (with-pypi + `(("/foo-1.0.0.tar.gz" 200 ,(file-dump tarball)) + ("/foo-1.0.0-py2.py3-none-any.whl" 404 "") + ("/foo/json" + 200 + ,(lambda (port) (display (foo-json) port)))) + (define source + (package-latest-release + (dummy-package + "python-foo" + (version "0.1.2") + (source + (dummy-origin + (method url-fetch) + (uri (pypi-uri "foo" version)))) + (build-system python-build-system)) + (list %pypi-updater))) + (list (map basename (upstream-source-urls source)) + (map basename + (upstream-source-signature-urls source)) + (upstream-source-inputs source))))) expected-value: (("foo-1.0.0.tar.gz") ("foo-1.0.0.tar.gz.asc") (#< name: "bar" downstream-name: "python-bar" type: propagated min-version: any max-version: any> #< name: "foo" downstream-name: "python-foo" type: propagated min-version: any max-version: any> #< name: "pytest" downstream-name: "python-pytest" type: native min-version: any max-version: any>)) actual-value: (("foo-1.0.0.tar.gz") ("foo-1.0.0.tar.gz.asc") (#< name: "bar" downstream-name: "python-bar" type: propagated min-version: any max-version: any> #< name: "foo" downstream-name: "python-foo" type: propagated min-version: any max-version: any> #< name: "pytest" downstream-name: "python-pytest" type: native min-version: any max-version: any>)) result: PASS SKIP: tests/syscalls ==================== test-name: mount, ENOENT location: /home/james/Code/guix/tests/syscalls.scm:43 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/james/Code/guix/tests/syscalls.scm:51 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: (2) result: PASS test-name: mounts location: /home/james/Code/guix/tests/syscalls.scm:60 source: + (test-assert + "mounts" + (let ((mounts (mounts))) + (any (match-lambda + ((point . type) + (let ((mount (find (lambda (mount) + (string=? (mount-point mount) point)) + mounts))) + (and mount (string=? (mount-type mount) type))))) + '(("/proc" . "proc") + ("/sys" . "sysfs") + ("/dev/shm" . "tmpfs"))))) actual-value: #t result: PASS test-name: mount-points location: /home/james/Code/guix/tests/syscalls.scm:74 source: + (test-assert + "mount-points" + (any (cute member <> (mount-points)) + '("/" "/proc" "/sys" "/dev"))) actual-value: ("/" "/proc" "/dev" "/dev/null" "/dev/zero" "/dev/full" "/dev/random" "/dev/urandom" "/dev/tty" "/dev/fuse" "/dev/pts" "/dev/console" "/dev/pts" "/dev/shm" "/dev/mqueue" "/etc/resolv.conf" "/etc/nsswitch.conf" "/etc/services" "/etc/hosts" "/gnu/store" "/home/james/.cache/guix" "/var/guix/daemon-socket/socket" "/home/james/Code/guix") result: PASS test-name: utime with AT_SYMLINK_NOFOLLOW location: /home/james/Code/guix/tests/syscalls.scm:81 source: + (test-equal + "utime with AT_SYMLINK_NOFOLLOW" + '(0 0) + (begin + (symlink "/nowhere" temp-file) + (utime temp-file 0 0 0 0 AT_SYMLINK_NOFOLLOW) + (let ((st (lstat temp-file))) + (delete-file temp-file) + (list (stat:mtime st) (stat:atime st))))) expected-value: (0 0) actual-value: (0 0) result: PASS test-name: swapon, ENOSYS/ENOENT/EPERM location: /home/james/Code/guix/tests/syscalls.scm:93 source: + (test-assert + "swapon, ENOSYS/ENOENT/EPERM" + (catch 'system-error + (lambda () (swapon "/does-not-exist") #f) + (lambda args + (memv (system-error-errno args) + (list EPERM ENOENT ENOSYS))))) actual-value: (1 2 38) result: PASS test-name: swapoff, ENOSYS/ENOENT/EINVAL/EPERM location: /home/james/Code/guix/tests/syscalls.scm:101 source: + (test-assert + "swapoff, ENOSYS/ENOENT/EINVAL/EPERM" + (catch 'system-error + (lambda () (swapoff "/does-not-exist") #f) + (lambda args + (memv (system-error-errno args) + (list EPERM EINVAL ENOENT ENOSYS))))) actual-value: (1 22 2 38) result: PASS test-name: mkdtemp! location: /home/james/Code/guix/tests/syscalls.scm:109 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/james/Code/guix/tests/syscalls.scm:117 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/james/Code/guix/tests/syscalls.scm:124 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/james/Code/guix/tests/syscalls.scm:141 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/james/Code/guix/tests/syscalls.scm:154 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/james/Code/guix/tests/syscalls.scm:183 source: + (test-equal + "pivot-root" + 'success! + (match (socketpair AF_UNIX SOCK_STREAM 0) + ((parent . child) + (match (clone (logior CLONE_NEWUSER CLONE_NEWNS SIGCHLD)) + (0 + (dynamic-wind + (const #t) + (lambda () + (close parent) + (call-with-temporary-directory + (lambda (root) + (display "ready\n" child) + (read child) + (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 (and (file-exists? "/test") 'success!) + child) + (close child))))) + (lambda () (primitive-exit 0)))) + (pid (close child) + (match (read parent) + ('ready + (call-with-output-file + (format #f "/proc/~d/setgroups" pid) + (lambda (port) (display "deny" port))) + (call-with-output-file + (format #f "/proc/~d/uid_map" pid) + (lambda (port) + (format port "0 ~d 1" (getuid)))) + (call-with-output-file + (format #f "/proc/~d/gid_map" pid) + (lambda (port) + (format port "0 ~d 1" (getgid)))) + (display "go!\n" parent) + (let ((result (read parent))) + (close parent) + (and (zero? (match (waitpid pid) + ((_ . status) + (status:exit-val + status)))) + result))))))))) expected-value: success! actual-value: success! result: PASS test-name: scandir*, ENOENT location: /home/james/Code/guix/tests/syscalls.scm:232 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/james/Code/guix/tests/syscalls.scm:240 source: + (test-equal + "scandir*, ASCII file names" + (scandir + (dirname + (search-path %load-path "guix/base32.scm")) + (const #t) + stringprocedure + 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/james/Code/guix/tests/syscalls.scm:274 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 (termios-input-speed termios) 0) + (> (termios-output-speed termios) 0)))) actual-value: #t result: PASS test-name: tcsetattr location: /home/james/Code/guix/tests/syscalls.scm:573 source: + (test-assert + "tcsetattr" + (let ((first (tcgetattr 0))) + (tcsetattr 0 (tcsetattr-action TCSANOW) first) + (equal? first (tcgetattr 0)))) actual-value: #t result: PASS test-name: terminal-window-size ENOTTY location: /home/james/Code/guix/tests/syscalls.scm:578 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/james/Code/guix/tests/syscalls.scm:589 source: + (test-assert + "terminal-columns" + (> (terminal-columns) 0)) actual-value: #t result: PASS test-name: terminal-columns non-file port location: /home/james/Code/guix/tests/syscalls.scm:592 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: terminal-rows location: /home/james/Code/guix/tests/syscalls.scm:596 source: + (test-assert + "terminal-rows" + (> (terminal-rows) 0)) actual-value: #t result: PASS test-name: terminal-string-width English location: /home/james/Code/guix/tests/syscalls.scm:599 source: + (test-equal + "terminal-string-width English" + 5 + (terminal-string-width "hello")) expected-value: 5 actual-value: 5 result: PASS test-name: terminal-string-width Japanese location: /home/james/Code/guix/tests/syscalls.scm:605 source: + (test-equal + "terminal-string-width Japanese" + 6 + (terminal-string-width "???")) result: SKIP test-name: openpty location: /home/james/Code/guix/tests/syscalls.scm:609 source: + (test-assert + "openpty" + (let ((head inferior (openpty))) + (and (integer? head) + (integer? inferior) + (let ((port (fdopen inferior "r+0"))) + (and (isatty? port) + (begin (close-port port) (close-fdes head) #t)))))) actual-value: #t result: PASS test-name: openpty + login-tty location: /home/james/Code/guix/tests/syscalls.scm:619 source: + (test-equal + "openpty + login-tty" + '(hello world) + (let ((head inferior (openpty))) + (match (primitive-fork) + (0 + (dynamic-wind + (const #t) + (lambda () + (setvbuf (current-input-port) 'none) + (close-fdes head) + (login-tty inferior) + (write (read)) + (read)) + (lambda () (primitive-_exit 42)))) + (pid (close-fdes inferior) + (let ((head (fdopen head "r+0"))) + (write '(hello world) head) + (let ((result (read head))) + (close-port head) + (waitpid pid) + result)))))) expected-value: (hello world) actual-value: (hello world) result: PASS test-name: utmpx-entries location: /home/james/Code/guix/tests/syscalls.scm:643 source: + (test-assert + "utmpx-entries" + (match (utmpx-entries) + (((? utmpx? entries) ...) + (every (lambda (entry) + (match (utmpx-user entry) + ((? string?) + (or (not (memv (utmpx-login-type entry) + (list (login-type INIT_PROCESS) + (login-type LOGIN_PROCESS) + (login-type USER_PROCESS)))) + (> (utmpx-pid entry) 0))) + (#f #t))) + entries)))) actual-value: #t result: PASS test-name: read-utmpx, EOF location: /home/james/Code/guix/tests/syscalls.scm:660 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/james/Code/guix/tests/syscalls.scm:665 source: + (test-assert + "read-utmpx" + (let ((result + (call-with-input-file + "/var/run/utmpx" + read-utmpx))) + (or (utmpx? result) (eof-object? result)))) result: SKIP test-name: add-to-entropy-count location: /home/james/Code/guix/tests/syscalls.scm:671 source: + (test-equal + "add-to-entropy-count" + EPERM + (call-with-output-file + "/dev/urandom" + (lambda (port) + (catch 'system-error + (lambda () (add-to-entropy-count port 77) #f) + (lambda args (system-error-errno args)))))) expected-value: 1 actual-value: 1 result: PASS warning: failed to delete /tmp/guix-directory.jpwlzM/??: No such file or directory warning: failed to delete /tmp/guix-directory.jpwlzM/??: No such file or directory warning: failed to delete /tmp/guix-directory.jpwlzM: Directory not empty RUN: tests/offload ================== test-name: #f location: /home/james/Code/guix/tests/offload.scm:55 source: + (test-assert + (machine-matches? + (deprecated-build-machine "i686-linux") + (build-requirements (system "i686-linux")))) actual-value: #t result: PASS test-name: #f location: /home/james/Code/guix/tests/offload.scm:60 source: + (test-assert + (machine-matches? + (new-build-machine '("i686-linux")) + (build-requirements (system "i686-linux")))) actual-value: #t result: PASS test-name: #f location: /home/james/Code/guix/tests/offload.scm:66 source: + (test-assert + (machine-matches? + (new-build-machine + '("armhf-linux" + "aarch64-linux" + "i686-linux" + "x86_64-linux")) + (build-requirements (system "armhf-linux")))) actual-value: #t result: PASS /home/james/Code/guix/tests/offload.scm:41:2: warning: The 'system' field is deprecated, please use 'systems' instead. FAIL: tests/guix-build-branch ============================= + guix build --version guix build (GNU Guix) 1.3.0.67051-2a6d96 Copyright (C) 2024 the Guix authors License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. + guile -c '(getaddrinfo "www.gnu.org" "80" AI_NUMERICSERV)' ++ guix build guile-gcrypt -d accepted connection from pid 16970, user james + orig_drv=/home/james/Code/guix/test-tmp/store/9s2c3ja1pcfj6qg41v9hx7nlan0921cg-guile-gcrypt-0.4.0.drv ++ guix build guile-gcrypt --with-branch=guile-gcrypt=master -d accepted connection from pid 16974, user james updating checkout of 'https://notabug.org/cwebber/guile-gcrypt.git'... guix build: error: cannot fetch branch 'master' from https://notabug.org/cwebber/guile-gcrypt.git: the SSL certificate is invalid + latest_drv= FAIL tests/guix-build-branch.sh (exit status: 1) FAIL: tests/guix-git-authenticate ================================= + '[' -d /home/james/Code/guix/.git ']' + guile -c '(use-modules (git)) (member "refs/heads/keyring" (branch-list (repository-open ".")))' + intro_commit=9edb3f66fd807b096b48283debdcddccfea34bad + intro_signer='BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA' + cache_key=test-17127 + guix git authenticate 9edb3f66fd807b096b48283debdcddccfea34bad 'BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA' --cache-key=test-17127 --stats --end=9549f0283a78fe36f2d4ff2a04ef8ad6b0c02604 guix git: error: Git error: cannot locate remote-tracking branch 'keyring' + v1_2_0_commit=a099685659b4bfa6b3218f84953cbb7ff9e88063 + guix git authenticate 9edb3f66fd807b096b48283debdcddccfea34bad 'BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA' --cache-key=test-17127 --stats --end=a099685659b4bfa6b3218f84953cbb7ff9e88063 guix git: error: Git error: cannot locate remote-tracking branch 'keyring' FAIL tests/guix-git-authenticate.sh (exit status: 1) FAIL: tests/guix-home ===================== + set -e + guix home --version guix home (GNU Guix) 1.3.0.67051-2a6d96 Copyright (C) 2024 the Guix authors License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. ++ guile -c '(use-modules (guix config))(display %localstatedir)' + localstatedir=/var ++ guile -c '(use-modules (guix config))(display %storedir)' + NIX_STORE_DIR=/gnu/store + GUIX_DAEMON_SOCKET=/var/guix/daemon-socket/socket + export NIX_STORE_DIR GUIX_DAEMON_SOCKET + guile -c '(use-modules (guix)) (exit (false-if-exception (open-connection)))' ++ dirname /gnu/store + STORE_PARENT=/gnu + export STORE_PARENT + test /gnu = / ++ mktemp -d + test_directory=/tmp/tmp.xj1nC1IQQ6 + trap 'chmod -Rf +w "$test_directory"; rm -rf "$test_directory"' EXIT + cd /tmp/tmp.xj1nC1IQQ6 + cat + echo -n '# dot-bashrc test file for guix home' + guix home extension-graph home.scm + grep 'label = "home-activation"' "140501370095072" [label = "home-activation", shape = box, fontname = sans]; + guix home extension-graph home.scm + grep 'label = "home-symlink-manager"' "140622484811488" [label = "home-symlink-manager", shape = box, fontname = sans]; + guix home extension-graph home.scm + grep 'label = "home"' "139816843624224" [label = "home", shape = box, fontname = sans]; + guix home shepherd-graph home.scm guix home: error: service of type 'home-shepherd' not found + container_supported + guile -c '((@ (guix scripts environment) assert-container-features))' + return 0 + SHELL=bash + guix home container home.scm -- true guix home: error: mount: mount "none" on "/tmp/guix-directory.OoVB5U/sys": Operation not permitted + chmod -Rf +w /tmp/tmp.xj1nC1IQQ6 + rm -rf /tmp/tmp.xj1nC1IQQ6 FAIL tests/guix-home.sh (exit status: 1) FAIL: tests/guix-environment-container ====================================== + set -e + guix environment --version guix environment (GNU Guix) 1.3.0.67051-2a6d96 Copyright (C) 2024 the Guix authors License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. + guile -c '((@ (guix scripts environment) assert-container-features))' + tmpdir=t-guix-environment-19776 + trap 'rm -r "$tmpdir"' EXIT + mkdir t-guix-environment-19776 + guix environment --container --ad-hoc --bootstrap guile-bootstrap -- guile -c '(exit 42)' accepted connection from pid 19787, user james guix environment: error: mount: mount "none" on "/tmp/guix-directory.G0PyvX/sys": Operation not permitted + test 1 = 42 + rm -r t-guix-environment-19776 FAIL tests/guix-environment-container.sh (exit status: 1)