X-Git-Url: http://git.hcoop.net/jackhill/guix/guix.git/blobdiff_plain/43badf261f4688c8a7a7a9004a4bff8acb205835..2be5c2652a5fd79089048905ff6be60d74244d7b:/tests/channels.scm diff --git a/tests/channels.scm b/tests/channels.scm index 2c857083e9..1b6f640c4a 100644 --- a/tests/channels.scm +++ b/tests/channels.scm @@ -26,8 +26,12 @@ #:use-module (guix derivations) #:use-module (guix sets) #:use-module (guix gexp) - #:use-module ((guix utils) - #:select (error-location? error-location location-line)) + #:use-module ((guix diagnostics) + #:select (error-location? + error-location location-line + formatted-message? + formatted-message-string + formatted-message-arguments)) #:use-module ((guix build utils) #:select (which)) #:use-module (git) #:use-module (guix git) @@ -212,12 +216,12 @@ (commit (oid->string (commit-id commit2))))) (old (channel (inherit spec) (commit (oid->string (commit-id commit1)))))) - (define (validate-pull channel current instance relation) + (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)) - (channel-instance-commit instance)) + commit) relation))) (with-store store @@ -402,8 +406,30 @@ (channel-news-for-commit channel commit5 commit1)) '(#f "tag-for-first-news-entry"))))))) +(unless (which (git-command)) (test-skip 1)) +(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 + ;; Attempt a downgrade from NEW to OLD. + (latest-channel-instances store (list channel)) + #f)))))) + (unless (gpg+git-available?) (test-skip 1)) -(test-assert "authenticate-channel, wrong first commit signer" +(test-equal "authenticate-channel, wrong first commit signer" + #t (with-fresh-gnupg-setup (list %ed25519-public-key-file %ed25519-secret-key-file %ed25519bis-public-key-file @@ -422,28 +448,38 @@ (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")) - (intro ((@@ (guix channels) make-channel-introduction) + (commit2 (find-commit repository "second")) + (intro (make-channel-introduction (commit-id-string commit1) (openpgp-public-key-fingerprint (read-openpgp-packet - %ed25519bis-public-key-file)) ;different key - #f)) ;no signature + %ed25519bis-public-key-file)))) ;different key (channel (channel (name 'example) (url (string-append "file://" directory)) (introduction intro)))) - (guard (c ((message? c) - (->bool (string-contains (condition-message c) - "initial commit")))) + (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 + %ed25519bis-public-key-file)))))) (authenticate-channel channel directory - (commit-id-string commit1) + (commit-id-string commit2) #:keyring-reference-prefix "") 'failed)))))) (unless (gpg+git-available?) (test-skip 1)) -(test-assert "authenticate-channel, .guix-authorizations" +(test-equal "authenticate-channel, .guix-authorizations" + #t (with-fresh-gnupg-setup (list %ed25519-public-key-file %ed25519-secret-key-file %ed25519bis-public-key-file @@ -481,12 +517,11 @@ (let* ((commit1 (find-commit repository "first")) (commit2 (find-commit repository "second")) (commit3 (find-commit repository "third")) - (intro ((@@ (guix channels) make-channel-introduction) + (intro (make-channel-introduction (commit-id-string commit1) (openpgp-public-key-fingerprint (read-openpgp-packet - %ed25519-public-key-file)) - #f)) ;no signature + %ed25519-public-key-file)))) (channel (channel (name 'example) (url (string-append "file://" directory)) (introduction intro)))) @@ -511,4 +546,54 @@ #:keyring-reference-prefix "") 'failed))))))) +(unless (gpg+git-available?) (test-skip 1)) +(test-equal "latest-channel-instances, authenticate dependency" + #t + ;; Make sure that a channel dependency that has an introduction is + ;; authenticated. This test checks that an authentication error is raised + ;; as it should when authenticating the dependency. + (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))))))))) + (test-end "channels")