summary refs log tree commit diff
path: root/gnu/tests/cuirass.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/tests/cuirass.scm')
-rw-r--r--gnu/tests/cuirass.scm288
1 files changed, 171 insertions, 117 deletions
diff --git a/gnu/tests/cuirass.scm b/gnu/tests/cuirass.scm
index 86a06d3069..04a7a71dcf 100644
--- a/gnu/tests/cuirass.scm
+++ b/gnu/tests/cuirass.scm
@@ -31,20 +31,90 @@
   #:use-module (gnu services databases)
   #:use-module (gnu services networking)
   #:use-module (gnu system nss)
+  #:use-module (guix channels)
   #:use-module (guix gexp)
   #:use-module (guix store)
   #:export (%cuirass-test
-            %cuirass-remote-test))
+            %cuirass-remote-test
+            %cuirass-simple-test))
 
-(define* (run-cuirass-test name #:key remote-build?)
-  (define %cuirass-specs
+(define %derivation-file
+  (scheme-file
+   "derivation.scm"
+   '(begin
+      (use-modules (guix)
+                   (srfi srfi-1)
+                   (ice-9 match))
+
+      (define (derivation->alist store drv)
+        `((#:derivation . ,(derivation-file-name drv))
+          (#:log . ,(log-file store (derivation-file-name drv)))
+          (#:outputs . ,(filter-map (lambda (res)
+                                      (match res
+                                        ((name . path)
+                                         `(,name . ,path))))
+                                    (derivation->output-paths drv)))
+          (#:nix-name . ,(derivation-name drv))
+          (#:system . ,(derivation-system drv))
+          (#:max-silent-time . 3600)
+          (#:timeout . 3600)))
+
+      (define (cuirass-jobs store arguments)
+        (let* ((file (plain-file "test" "this is a test derivation"))
+               (job-name "test-job")
+               (drv  (run-with-store store
+                       (gexp->derivation
+                        job-name
+                        #~(begin
+                            (mkdir #$output)
+                            (symlink #$file
+                                     (string-append #$output "/file")))))))
+          (list (lambda ()
+                  `((#:job-name . ,job-name)
+                    ,@(derivation->alist store drv)))))))))
+
+(define git-service
+  ;; Create a Git repository to host Cuirass' specification.
+  (simple-service
+   'create-git-directory activation-service-type
+   #~(begin
+       (let* ((git (string-append #$git "/bin/git"))
+              (main "/tmp/cuirass-main")
+              (file (string-append main "/build-aux/cuirass/gnu-system.scm")))
+         (mkdir-p (dirname file))
+         (with-directory-excursion main
+           (copy-file #$%derivation-file file)
+           (invoke git "config" "--global" "user.email"
+                   "charlie@example.org")
+           (invoke git "config" "--global" "user.name" "A U Thor")
+           (invoke git "init")
+           (invoke git "add" ".")
+           (invoke git "commit" "-m" "That's a commit."))))))
+
+(define cow-service
+  ;; The Guix-daemon & Cuirass will complain if the store is
+  ;; read-only. Create a store overlay to solve this issue.
+  (simple-service
+   'mount-cow-store activation-service-type
+   #~(begin
+       (use-modules (guix build syscalls)
+                    (guix build utils))
+       (mkdir-p "/rw-store")
+       (mount "none" "/rw-store" "tmpfs")
+
+       (mkdir-p "/rw-store/upper")
+       (mkdir-p "/rw-store/work")
+       (mount "none" "/gnu/store" "overlay" 0
+              "lowerdir=/gnu/store,upperdir=/rw-store/upper,workdir=/rw-store/work"))))
+
+(define %cuirass-specs
     #~(list
        '((#:name . "test")
          (#:load-path-inputs . ())
          (#:package-path-inputs . ())
          (#:proc-input . "main")
-         (#:proc-file . "derivation.scm")
-         (#:proc . main)
+         (#:proc-file . "build-aux/cuirass/gnu-system.scm")
+         (#:proc . cuirass-jobs)
          (#:proc-args . ())
          (#:inputs . (((#:name . "main")
                        (#:url . "file:///tmp/cuirass-main/")
@@ -54,103 +124,25 @@
          (#:build-outputs . ())
          (#:priority . 1))))
 
-  (define %derivation-file
-    (scheme-file
-     "derivation.scm"
-     '(begin
-        (use-modules (guix)
-                     (srfi srfi-1)
-                     (ice-9 match))
-
-        (define (derivation->alist store drv)
-          `((#:derivation . ,(derivation-file-name drv))
-            (#:log . ,(log-file store (derivation-file-name drv)))
-            (#:outputs . ,(filter-map (lambda (res)
-                                        (match res
-                                          ((name . path)
-                                           `(,name . ,path))))
-                                      (derivation->output-paths drv)))
-            (#:nix-name . ,(derivation-name drv))
-            (#:system . ,(derivation-system drv))
-            (#:max-silent-time . 3600)
-            (#:timeout . 3600)))
-
-        (define (main store arguments)
-          (let* ((file (plain-file "test" "this is a test derivation"))
-                 (job-name "test-job")
-                 (drv  (run-with-store store
-                         (gexp->derivation
-                          job-name
-                          #~(begin
-                              (mkdir #$output)
-                              (symlink #$file
-                                       (string-append #$output "/file")))))))
-            (list (lambda ()
-                    `((#:job-name . ,job-name)
-                      ,@(derivation->alist store drv)))))))))
-
-  (define os
-    (marionette-operating-system
-     (simple-operating-system
-      (service cuirass-service-type
-               (cuirass-configuration
-                (specifications %cuirass-specs)
-                (remote-server (and remote-build?
-                                    (cuirass-remote-server-configuration)))
-                (host "0.0.0.0")
-                (use-substitutes? #t)))
-      (service dhcp-client-service-type)
-      ;; Create a Git repository to host Cuirass' specification.
-      (simple-service
-       'create-git-directory activation-service-type
-       #~(begin
-           (let* ((git (string-append #$git "/bin/git"))
-                  (main "/tmp/cuirass-main")
-                  (file (string-append main "/derivation.scm")))
-             (mkdir-p main)
-             (with-directory-excursion main
-               (copy-file #$%derivation-file file)
-               (invoke git "config" "--global" "user.email"
-                       "charlie@example.org")
-               (invoke git "config" "--global" "user.name" "A U Thor")
-               (invoke git "init")
-               (invoke git "add" ".")
-               (invoke git "commit" "-m" "That's a commit.")))))
-      ;; The Guix-daemon & Cuirass will complain if the store is
-      ;; read-only. Create a store overlay to solve this issue.
-      (simple-service
-       'mount-cow-store activation-service-type
-       #~(begin
-           (use-modules (guix build syscalls)
-                        (guix build utils))
-           (mkdir-p "/rw-store")
-           (mount "none" "/rw-store" "tmpfs")
-
-           (mkdir-p "/rw-store/upper")
-           (mkdir-p "/rw-store/work")
-           (mount "none" "/gnu/store" "overlay" 0
-                  "lowerdir=/gnu/store,upperdir=/rw-store/upper,workdir=/rw-store/work")))
-      (service postgresql-service-type
-               (postgresql-configuration
-                (postgresql postgresql-10)))
-      (service postgresql-role-service-type))
-     #:imported-modules '((gnu services herd)
-                          (guix combinators)
-                          (guix build syscalls)
-                          (guix build utils))))
+(define* (cuirass-services #:key remote-build?)
+  (list
+   (service cuirass-service-type
+            (cuirass-configuration
+             (specifications %cuirass-specs)
+             (remote-server (and remote-build?
+                                 (cuirass-remote-server-configuration)))
+             (host "0.0.0.0")
+             (use-substitutes? #t)))))
 
+(define (run-cuirass-test name os)
   (define os*
-    (operating-system
-      (inherit os)
-      (name-service-switch %mdns-host-lookup-nss)
-      (services
-       (append (if remote-build?
-                   (list
-                    (service avahi-service-type)
-                    (service cuirass-remote-worker-service-type
-                             (cuirass-remote-worker-configuration)))
-                   '())
-               (operating-system-user-services os)))))
+    (let ((modules '((gnu services herd)
+                     (guix combinators)
+                     (guix build syscalls)
+                     (guix build utils))))
+      (marionette-operating-system
+       os
+       #:imported-modules modules)))
 
   (define cuirass-web-port 8081)
   (define forward-port 5000)
@@ -199,6 +191,23 @@
 
             (test-begin "cuirass")
 
+            ;; XXX: Shepherd reads the config file *before* binding its
+            ;; control socket, so /var/run/shepherd/socket might not exist yet
+            ;; when the 'marionette' service is started.
+            (test-assert "shepherd socket ready"
+              (marionette-eval
+               `(begin
+                  (use-modules (gnu services herd))
+                  (let loop ((i 10))
+                    (cond ((file-exists? (%shepherd-socket-file))
+                           #t)
+                          ((> i 0)
+                           (sleep 1)
+                           (loop (- i 1)))
+                          (else
+                           'failure))))
+               marionette))
+
             ;; Wait for cuirass to be up and running.
             (test-assert "cuirass running"
               (marionette-eval
@@ -219,8 +228,7 @@
                  #:times 5
                  #:delay 5)))
 
-            (test-equal "cuirass-web evaluation"
-              "test"
+            (test-assert "cuirass-web evaluation"
               (begin
                 (retry
                  (lambda ()
@@ -230,8 +238,9 @@
                             (false-if-exception
                              (json-string->scm
                               (utf8->string text)))))
-                       (and result
-                            (assoc-ref result "specification")))))
+                       (eq? (and result
+                                 (assoc-ref result "id"))
+                            1))))
                  #:times 5
                  #:delay 5)))
 
@@ -249,11 +258,7 @@
                              (utf8->string text))))
                        (match (vector->list result)
                          ((build)
-                          (and (string=? (assoc-ref build "job")
-                                         "test-job")
-                               (or (not #$remote-build?)
-                                   ;; Check if the build is started.
-                                   (= (assoc-ref build "buildstatus") -1))))
+                          (string=? (assoc-ref build "job") "test-job"))
                          (else #f)))))
                  #:times 5
                  #:delay 10)))
@@ -264,13 +269,62 @@
   (gexp->derivation name test))
 
 (define %cuirass-test
-  (system-test
-   (name "cuirass")
-   (description "Connect to a Cuirass server.")
-   (value (run-cuirass-test name))))
+  (let ((os (operating-system
+              (inherit %simple-os)
+              (services
+               (append (list cow-service
+                             (service dhcp-client-service-type)
+                             git-service)
+                       (cuirass-services)
+                       (operating-system-user-services %simple-os))))))
+    (system-test
+     (name "cuirass")
+     (description "Connect to a Cuirass server.")
+     (value
+      (run-cuirass-test name os)))))
 
 (define %cuirass-remote-test
-  (system-test
-   (name "cuirass-remote")
-   (description "Connect to a Cuirass server with remote build.")
-   (value (run-cuirass-test name #:remote-build? #t))))
+  (let ((os (operating-system
+              (inherit %simple-os)
+              (name-service-switch %mdns-host-lookup-nss)
+              (services
+               (append (list (service avahi-service-type)
+                             cow-service
+                             (service dhcp-client-service-type)
+                             git-service)
+                       (cuirass-services #:remote-build? #t)
+                       (operating-system-user-services %simple-os))))))
+    (system-test
+     (name "cuirass-remote")
+     (description "Connect to a Cuirass server with remote build.")
+     (value (run-cuirass-test name os)))))
+
+(define simple-cuirass-service
+  (service cuirass-service-type
+           (cuirass-configuration
+            (specifications
+             (simple-cuirass-configuration->specs
+              (simple-cuirass-configuration
+               (build 'all)
+               (channels
+                (list (channel
+                       (name 'guix)
+                       (url "file:///tmp/cuirass-main/")))))))
+            (host "0.0.0.0")
+            (use-substitutes? #t))))
+
+(define %cuirass-simple-test
+  (let ((os (operating-system
+              (inherit %simple-os)
+              (services
+               (append
+                (list cow-service
+                      (service dhcp-client-service-type)
+                      git-service
+                      simple-cuirass-service)
+                (operating-system-user-services %simple-os))))))
+    (system-test
+     (name "cuirass-simple")
+     (description "Connect to a simple Cuirass server.")
+     (value
+      (run-cuirass-test name os)))))