aboutsummaryrefslogtreecommitdiff
path: root/etc/system-tests.scm
blob: 221a63bb7f5ef32e93af530c03a17351599a98a1 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016, 2018-2020, 2022 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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/>.

(use-modules (gnu tests)
             (gnu packages package-management)
             (guix monads)
             (guix store)
             ((guix git-download) #:select (git-predicate))
             ((guix utils) #:select (current-source-directory))
             (git)
             (ice-9 match))

(define (source-commit directory)
  "Return the commit of the head of DIRECTORY or #f if it could not be
determined."
  (let ((repository #f))
    (catch 'git-error
      (lambda ()
        (set! repository (repository-open directory))
        (let* ((head   (repository-head repository))
               (target (reference-target head))
               (commit (oid->string target)))
          (repository-close! repository)
          commit))
      (lambda _
        (when repository
          (repository-close! repository))
        #f))))

(define (tests-for-current-guix source commit)
  "Return a list of tests for perform, using Guix built from SOURCE, a channel
instance."
  ;; Honor the 'TESTS' environment variable so that one can select a subset
  ;; of tests to run in the usual way:
  ;;
  ;;   make check-system TESTS=installed-os
  (let ((guix (channel-source->package source #:commit commit)))
    (map (lambda (test)
           (system-test
            (inherit test)
            (value (mparameterize %store-monad ((current-guix-package guix))
                     (system-test-value test)))))
         (match (getenv "TESTS")
           (#f
            (all-system-tests))
           ((= string-tokenize (tests ...))
            (filter (lambda (test)
                      (member (system-test-name test) tests))
                    (all-system-tests)))))))

(define (system-test->manifest-entry test)
  "Return a manifest entry for TEST, a system test."
  (manifest-entry
    (name (string-append "test." (system-test-name test)))
    (version "0")
    (item test)))

(define (system-test-manifest)
  "Return a manifest containing all the system tests, or all those selected by
the 'TESTS' environment variable."
  (define source
    (string-append (current-source-directory) "/.."))

  (define commit
    ;; Fetch the current commit ID so we can potentially build the same
    ;; derivation as ci.guix.gnu.org.
    (source-commit source))

  ;; Intern SOURCE so that 'build-from-source' in (guix channels) sees
  ;; "fresh" file names and thus doesn't find itself loading .go files
  ;; from ~/.cache/guile when it loads 'build-aux/build-self.scm'.
  (let* ((source (local-file source
                             (if commit
                                 (string-append "guix-"
                                                (string-take commit 7))
                                 "guix-source")
                             #:recursive? #t
                             #:select?
                             (or (git-predicate source)
                                 (const #t))))
         (tests  (tests-for-current-guix source commit)))
    (format (current-error-port) "Selected ~a system tests...~%"
            (length tests))

    (manifest (map system-test->manifest-entry tests))))

;; Return the manifest.
(system-test-manifest)
(with-test-package '((inputs `(("gmp" ,gmp) ("acl" ,acl) ,@(fold alist-delete (package-propagated-inputs coreutils) '("foo" "bar" "baz"))))) (list (package-inputs (@ (my-packages) my-coreutils)) (read-package-field (@ (my-packages) my-coreutils) 'inputs 3)))) (test-equal "input labels, replace" (list '() ;there's no "gmp" input to replace "\ (modify-inputs (package-propagated-inputs coreutils) (replace \"gmp\" gmp)))\n") (with-test-package '((inputs `(("gmp" ,gmp) ,@(alist-delete "gmp" (package-propagated-inputs coreutils))))) (list (package-inputs (@ (my-packages) my-coreutils)) (read-package-field (@ (my-packages) my-coreutils) 'inputs 2)))) (test-equal "input labels, 'safe' policy" (list `(("gmp" ,gmp) ("acl" ,acl)) "\ (inputs (list gmp acl))\n") (call-with-test-package '((inputs `(("GMP" ,gmp) ("ACL" ,acl))) (arguments '())) ;no build system arguments (lambda (directory) (define file (string-append directory "/my-packages.scm")) (system* "guix" "style" "-L" directory "my-coreutils" "-S" "inputs" "--input-simplification=safe") (load file) (list (package-inputs (@ (my-packages) my-coreutils)) (read-package-field (@ (my-packages) my-coreutils) 'inputs))))) (test-equal "input labels, 'safe' policy, trivial arguments" (list `(("gmp" ,gmp) ("mpfr" ,mpfr)) "\ (inputs (list gmp mpfr))\n") (call-with-test-package '((inputs `(("GMP" ,gmp) ("Mpfr" ,mpfr))) (arguments ;"trivial" arguments '(#:tests? #f #:test-target "whatever"))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (system* "guix" "style" "-L" directory "my-coreutils" "-S" "inputs" "--input-simplification=safe") (load file) (list (package-inputs (@ (my-packages) my-coreutils)) (read-package-field (@ (my-packages) my-coreutils) 'inputs))))) (test-equal "input labels, 'safe' policy, nothing changed" (list `(("GMP" ,gmp) ("ACL" ,acl)) "\ (inputs `((\"GMP\" ,gmp) (\"ACL\" ,acl)))\n") (call-with-test-package '((inputs `(("GMP" ,gmp) ("ACL" ,acl))) ;; Non-empty argument list, so potentially unsafe ;; input simplification. (arguments '(#:configure-flags (assoc-ref %build-inputs "GMP")))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (system* "guix" "style" "-L" directory "my-coreutils" "-S" "inputs" "--input-simplification=safe") (load file) (list (package-inputs (@ (my-packages) my-coreutils)) (read-package-field (@ (my-packages) my-coreutils) 'inputs))))) (test-equal "input labels, margin comment" (list `(("gmp" ,gmp)) `(("acl" ,acl)) " (inputs (list gmp)) ;margin comment\n" " (native-inputs (list acl)) ;another one\n") (call-with-test-package '((inputs `(("gmp" ,gmp))) (native-inputs `(("acl" ,acl)))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (substitute* file (("\"gmp\"(.*)$" _ rest) (string-append "\"gmp\"" (string-trim-right rest) " ;margin comment\n")) (("\"acl\"(.*)$" _ rest) (string-append "\"acl\"" (string-trim-right rest) " ;another one\n"))) (system* "cat" file) (system* "guix" "style" "-L" directory "-S" "inputs" "my-coreutils") (load file) (list (package-inputs (@ (my-packages) my-coreutils)) (package-native-inputs (@ (my-packages) my-coreutils)) (read-package-field (@ (my-packages) my-coreutils) 'inputs) (read-package-field (@ (my-packages) my-coreutils) 'native-inputs))))) (test-equal "input labels, margin comment on long list" (list (concatenate (make-list 4 `(("gmp" ,gmp) ("acl" ,acl)))) "\ (list gmp ;margin comment acl gmp ;margin comment acl gmp ;margin comment acl gmp ;margin comment acl))\n") (call-with-test-package '((inputs `(("gmp" ,gmp) ("acl" ,acl) ("gmp" ,gmp) ("acl" ,acl) ("gmp" ,gmp) ("acl" ,acl) ("gmp" ,gmp) ("acl" ,acl)))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (substitute* file (("\"gmp\"(.*)$" _ rest) (string-append "\"gmp\"" (string-trim-right rest) " ;margin comment\n"))) (system* "cat" file) (system* "guix" "style" "-L" directory "-S" "inputs" "my-coreutils") (load file) (list (package-inputs (@ (my-packages) my-coreutils)) (read-package-field (@ (my-packages) my-coreutils) 'inputs 8))))) (test-equal "input labels, line comment" (list `(("gmp" ,gmp) ("acl" ,acl)) "\ (inputs (list gmp ;; line comment! acl))\n") (call-with-test-package '((inputs `(("gmp" ,gmp) ("acl" ,acl)))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (substitute* file ((",gmp\\)(.*)$" _ rest) (string-append ",gmp)\n ;; line comment!\n" rest))) (system* "guix" "style" "-L" directory "-S" "inputs" "my-coreutils") (load file) (list (package-inputs (@ (my-packages) my-coreutils)) (read-package-field (@ (my-packages) my-coreutils) 'inputs 3))))) (test-equal "input labels, modify-inputs and margin comment" (list `(("gmp" ,gmp) ("acl" ,acl) ("mpfr" ,mpfr)) "\ (modify-inputs (package-propagated-inputs coreutils) (prepend gmp ;margin comment acl ;another one mpfr)))\n") (call-with-test-package '((inputs `(("gmp" ,gmp) ("acl" ,acl) ("mpfr" ,mpfr) ,@(package-propagated-inputs coreutils)))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (substitute* file ((",gmp\\)(.*)$" _ rest) (string-append ",gmp) ;margin comment" rest)) ((",acl\\)(.*)$" _ rest) (string-append ",acl) ;another one" rest))) (system* "guix" "style" "-L" directory "-S" "inputs" "my-coreutils") (load file) (list (package-inputs (@ (my-packages) my-coreutils)) (read-package-field (@ (my-packages) my-coreutils) 'inputs 4))))) (test-assert "gexpify arguments, already gexpified" (call-with-test-package '((arguments (list #:configure-flags #~'("--help")))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (define (fingerprint file) (let ((stat (stat file))) (list (stat:mtime stat) (stat:size stat)))) (define before (fingerprint file)) (system* "guix" "style" "-L" directory "my-coreutils" "-S" "arguments") (equal? (fingerprint file) before)))) (test-equal "gexpify arguments, non-gexp arguments, margin comment" (list (list #:tests? #f #:test-target "check") "\ (arguments (list #:tests? #f ;no tests #:test-target \"check\"))\n") (call-with-test-package '((arguments '(#:tests? #f #:test-target "check"))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (substitute* file (("#:tests\\? #f" all) (string-append all " ;no tests\n"))) (system* "guix" "style" "-L" directory "my-coreutils" "-S" "arguments") (load file) (list (package-arguments (@ (my-packages) my-coreutils)) (read-package-field (@ (my-packages) my-coreutils) 'arguments 2))))) (test-equal "gexpify arguments, phases and flags" "\ (list #:tests? #f #:configure-flags #~'(\"--fast\") #:make-flags #~(list (string-append \"CC=\" #$(cc-for-target))) #:phases #~(modify-phases %standard-phases ;; Line comment. whatever)))\n" (call-with-test-package '((arguments `(#:tests? #f #:configure-flags '("--fast") #:make-flags (list (string-append "CC=" ,(cc-for-target))) #:phases (modify-phases %standard-phases whatever)))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (substitute* file (("whatever") "\n;; Line comment. whatever")) (system* "guix" "style" "-L" directory "my-coreutils" "-S" "arguments") (load file) (read-package-field (@ (my-packages) my-coreutils) 'arguments 7)))) (test-equal "gexpify arguments, append arguments" "\ (append (list #:tests? #f #:configure-flags #~'(\"--fast\")) (package-arguments coreutils)))\n" (call-with-test-package '((arguments `(#:tests? #f #:configure-flags '("--fast") ,@(package-arguments coreutils)))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (system* "guix" "style" "-L" directory "my-coreutils" "-S" "arguments") (load file) (read-package-field (@ (my-packages) my-coreutils) 'arguments 3)))) (test-equal "gexpify arguments, substitute-keyword-arguments" "\ (substitute-keyword-arguments (package-arguments coreutils) ((#:tests? _ #f) #t) ((#:make-flags flags #~'()) #~(cons \"-DXYZ=yes\" #$flags))))\n" (call-with-test-package '((arguments (substitute-keyword-arguments (package-arguments coreutils) ((#:tests? _ #f) #t) ((#:make-flags flags ''()) `(cons "-DXYZ=yes" ,flags))))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (system* "guix" "style" "-L" directory "my-coreutils" "-S" "arguments") (load file) (read-package-field (@ (my-packages) my-coreutils) 'arguments 7)))) (test-equal "gexpify arguments, substitute-keyword-arguments + unquote-splicing" "\ (substitute-keyword-arguments (package-arguments coreutils) ((#:make-flags flags #~'()) #~(cons \"-DXYZ=yes\" #$@(if #t flags '())))))\n" (call-with-test-package '((arguments (substitute-keyword-arguments (package-arguments coreutils) ((#:make-flags flags ''()) `(cons "-DXYZ=yes" ,@(if #t flags '())))))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (system* "guix" "style" "-L" directory "my-coreutils" "-S" "arguments") (load file) (read-package-field (@ (my-packages) my-coreutils) 'arguments 6)))) (test-equal "gexpify arguments, append substitute-keyword-arguments" "\ (append (list #:tests? #f) (substitute-keyword-arguments (package-arguments coreutils) ((#:make-flags flags) #~(append `(\"-n\" ,%output) #$flags)))))\n" (call-with-test-package '((arguments `(#:tests? #f ,@(substitute-keyword-arguments (package-arguments coreutils) ((#:make-flags flags) `(append `("-n" ,%output) ,flags)))))) (lambda (directory) (define file (string-append directory "/my-packages.scm")) (system* "guix" "style" "-L" directory "my-coreutils" "-S" "arguments") (load file) (read-package-field (@ (my-packages) my-coreutils) 'arguments 5)))) (test-end) ;; Local Variables: ;; eval: (put 'with-test-package 'scheme-indent-function 1) ;; eval: (put 'call-with-test-package 'scheme-indent-function 1) ;; End: