summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRicardo Wurmus <rekado@elephly.net>2018-10-13 08:39:23 +0200
committerRicardo Wurmus <rekado@elephly.net>2018-12-09 13:55:22 +0100
commitaf12790bdd3805bbd7bca2b7c1d9045666f377eb (patch)
tree1d60a9b45098f39a2b3455bd27bf932f4de5ffbf /tests
parentd7e24652426dd4291eb8592dfcf1aed3a41289aa (diff)
downloadgnu-guix-af12790bdd3805bbd7bca2b7c1d9045666f377eb.tar
gnu-guix-af12790bdd3805bbd7bca2b7c1d9045666f377eb.tar.gz
guix: Add support for channel dependencies.
* guix/channels.scm (<channel-metadata>): New record. (read-channel-metadata, channel-instance-dependencies): New procedures. (latest-channel-instances): Include channel dependencies; add optional argument PREVIOUS-CHANNELS. (channel-instance-derivations): Build derivation for additional channels and add it as dependency to the channel instance derivation. * doc/guix.texi (Channels): Add subsection "Declaring Channel Dependencies". * tests/channels.scm: New file. * Makefile.am (SCM_TESTS): Add it.
Diffstat (limited to 'tests')
-rw-r--r--tests/channels.scm139
1 files changed, 139 insertions, 0 deletions
diff --git a/tests/channels.scm b/tests/channels.scm
new file mode 100644
index 0000000000..f3fc383ac3
--- /dev/null
+++ b/tests/channels.scm
@@ -0,0 +1,139 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (test-channels)
+ #:use-module (guix channels)
+ #:use-module ((guix build syscalls) #:select (mkdtemp!))
+ #:use-module (guix tests)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-64)
+ #:use-module (ice-9 match))
+
+(test-begin "channels")
+
+(define* (make-instance #:key
+ (name 'fake)
+ (commit "cafebabe")
+ (spec #f))
+ (define instance-dir (mkdtemp! "/tmp/checkout.XXXXXX"))
+ (and spec
+ (with-output-to-file (string-append instance-dir "/.guix-channel")
+ (lambda _ (format #t "~a" spec))))
+ ((@@ (guix channels) channel-instance)
+ name commit instance-dir))
+
+(define instance--boring (make-instance))
+(define instance--no-deps
+ (make-instance #:spec
+ '(channel
+ (version 0)
+ (dependencies
+ (channel
+ (name test-channel)
+ (url "https://example.com/test-channel"))))))
+(define instance--simple
+ (make-instance #:spec
+ '(channel
+ (version 0)
+ (dependencies
+ (channel
+ (name test-channel)
+ (url "https://example.com/test-channel"))))))
+(define instance--with-dupes
+ (make-instance #:spec
+ '(channel
+ (version 0)
+ (dependencies
+ (channel
+ (name test-channel)
+ (url "https://example.com/test-channel"))
+ (channel
+ (name test-channel)
+ (url "https://example.com/test-channel")
+ (commit "abc1234"))
+ (channel
+ (name test-channel)
+ (url "https://example.com/test-channel-elsewhere"))))))
+
+(define read-channel-metadata
+ (@@ (guix channels) read-channel-metadata))
+
+
+(test-equal "read-channel-metadata returns #f if .guix-channel does not exist"
+ #f
+ (read-channel-metadata instance--boring))
+
+(test-assert "read-channel-metadata returns <channel-metadata>"
+ (every (@@ (guix channels) channel-metadata?)
+ (map read-channel-metadata
+ (list instance--no-deps
+ instance--simple
+ instance--with-dupes))))
+
+(test-assert "read-channel-metadata dependencies are channels"
+ (let ((deps ((@@ (guix channels) channel-metadata-dependencies)
+ (read-channel-metadata instance--simple))))
+ (match deps
+ (((? channel? dep)) #t)
+ (_ #f))))
+
+(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) latest-repository-commit
+ (lambda* (store url #:key ref)
+ (match url
+ ("test" (values test-dir 'whatever))
+ (_ (values "/not-important" 'not-important)))))
+ (let ((instances (latest-channel-instances #f (list channel))))
+ (and (eq? 2 (length instances))
+ (lset= eq?
+ '(test test-channel)
+ (map (compose channel-name channel-instance-channel)
+ instances)))))))
+
+(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) latest-repository-commit
+ (lambda* (store url #:key ref)
+ (match url
+ ("test" (values test-dir 'whatever))
+ (_ (values "/not-important" 'not-important)))))
+ (let ((instances (latest-channel-instances #f (list channel))))
+ (and (eq? 2 (length instances))
+ (lset= eq?
+ '(test test-channel)
+ (map (compose channel-name channel-instance-channel)
+ instances))
+ ;; only the most specific channel dependency should remain,
+ ;; i.e. the one with a specified commit.
+ (find (lambda (instance)
+ (and (eq? (channel-name
+ (channel-instance-channel instance))
+ 'test-channel)
+ (eq? (channel-commit
+ (channel-instance-channel instance))
+ 'abc1234)))
+ instances))))))
+
+(test-end "channels")