Patchwork gnu: Add system test for the rpcbind-daemon service.

login
register
mail settings
Submitter John Darrington
Date Dec. 12, 2016, 5:44 a.m.
Message ID <1481521490-9289-1-git-send-email-jmd@gnu.org>
Download mbox | patch
Permalink /patch/18381/
State New
Headers show

Comments

John Darrington - Dec. 12, 2016, 5:44 a.m.
* gnu/tests/nfs.scm: New file.
* gnu/local.mk: Add it.
---
 gnu/local.mk      |   1 +
 gnu/tests/nfs.scm | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 143 insertions(+)
 create mode 100644 gnu/tests/nfs.scm
Ludovic Courtès - Dec. 13, 2016, 11 p.m.
John Darrington <jmd@gnu.org> skribis:

> * gnu/tests/nfs.scm: New file.
> * gnu/local.mk: Add it.

Awesome!  :-)

> +(define %base-os
> +  (operating-system
> +    (host-name "olitupmok")
> +    (timezone "Europe/Berlin")
> +    (locale "en_US.UTF-8")
> +
> +    (bootloader (grub-configuration (device "/dev/sdX")))
> +    (file-systems %base-file-systems)
> +    (firmware '())

This line is not needed, is it?

> +    (users %base-user-accounts)
> +    (services (cons (dhcp-client-service)
> +                    %base-services))))

You can add ‘rpc-service’ and the ‘rpcbind’ package right here…

> +(define (os-with-service service)
> +  "Return a test operating system that runs SERVICE."
> +  (operating-system
> +    (inherit %base-os)
> +    (packages (cons*
> +               rpcbind
> +               %base-packages))
> +    (services (cons service
> +                    (operating-system-user-services %base-os)))))

… and remove this procedure.

> +    (define test
> +      (with-imported-modules '((gnu build marionette))
> +        #~(begin
> +            (use-modules (gnu build marionette)
> +                         (srfi srfi-26)
> +                         (srfi srfi-64)
> +                         (ice-9 match))

Looks like srfi-26 and match are unused and can be removed.

> +            (define marionette
> +              ;; Enable TCP forwarding of the guest's port 111.
> +              (make-marionette (list #$command)))

Outdated comment, no?

> +            (test-begin "nfs-daemon")

Or “rpcbind-daemon” rather?

> +            ;; Check the socket file and that the service is still running.
> +            (test-assert "RPC socket exists"
> +              (begin
> +                (wait-for-socket #$socket)
> +                (marionette-eval

I think it should be ‘and’ instead of ‘begin’.

> +(define %test-nfs
> +  (system-test
> +   (name "nfs")
> +   (description "Test some things related to NFS.")

s/nfs/rpcbind/ ?

OK with these changes.

Thanks for taking the time to write this test!

Ludo’.

Patch

diff --git a/gnu/local.mk b/gnu/local.mk
index c6cb55b..eb7a8b6 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -450,6 +450,7 @@  GNU_SYSTEM_MODULES =				\
 						\
   %D%/tests.scm					\
   %D%/tests/base.scm				\
+  %D%/tests/nfs.scm				\
   %D%/tests/install.scm				\
   %D%/tests/mail.scm				\
   %D%/tests/ssh.scm
diff --git a/gnu/tests/nfs.scm b/gnu/tests/nfs.scm
new file mode 100644
index 0000000..d830d73
--- /dev/null
+++ b/gnu/tests/nfs.scm
@@ -0,0 +1,142 @@ 
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016 John Darrington <jmd@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/>.
+
+(define-module (gnu tests nfs)
+  #:use-module (gnu tests)
+  #:use-module (gnu system)
+  #:use-module (gnu system grub)
+  #:use-module (gnu system file-systems)
+  #:use-module (gnu system shadow)
+  #:use-module (gnu system vm)
+  #:use-module (gnu services)
+  #:use-module (gnu services base)
+  #:use-module (gnu services nfs)
+  #:use-module (gnu services networking)
+  #:use-module (gnu packages onc-rpc)
+  #:use-module (guix gexp)
+  #:use-module (guix store)
+  #:use-module (guix monads)
+  #:export (%test-nfs))
+
+(define %base-os
+  (operating-system
+    (host-name "olitupmok")
+    (timezone "Europe/Berlin")
+    (locale "en_US.UTF-8")
+
+    (bootloader (grub-configuration (device "/dev/sdX")))
+    (file-systems %base-file-systems)
+    (firmware '())
+    (users %base-user-accounts)
+    (services (cons (dhcp-client-service)
+                    %base-services))))
+
+(define (os-with-service service)
+  "Return a test operating system that runs SERVICE."
+  (operating-system
+    (inherit %base-os)
+    (packages (cons*
+               rpcbind
+               %base-packages))
+    (services (cons service
+                    (operating-system-user-services %base-os)))))
+
+(define (run-nfs-test name rpc-service socket)
+  "Run a test of an OS running RPC-SERVICE, which should create SOCKET."
+  (mlet* %store-monad ((os ->   (marionette-operating-system
+                                 (os-with-service rpc-service)
+                                 #:imported-modules '((gnu services herd)
+                                                      (guix combinators))))
+                       (command (system-qemu-image/shared-store-script
+                                 os #:graphic? #f)))
+    (define test
+      (with-imported-modules '((gnu build marionette))
+        #~(begin
+            (use-modules (gnu build marionette)
+                         (srfi srfi-26)
+                         (srfi srfi-64)
+                         (ice-9 match))
+
+            (define marionette
+              ;; Enable TCP forwarding of the guest's port 111.
+              (make-marionette (list #$command)))
+
+            (define (wait-for-socket file)
+              ;; Wait until SOCKET  exists in the guest
+              (marionette-eval
+               `(let loop ((i 10))
+                  (cond ((and (file-exists? ,file)
+                              (eq? 'socket (stat:type (stat ,file))))
+                         #t)
+                        ((> i 0)
+                         (sleep 1)
+                         (loop (- i 1)))
+                        (else
+                         (error "Socket didn't show up: " ,file))))
+               marionette))
+
+            (mkdir #$output)
+            (chdir #$output)
+
+            (test-begin "nfs-daemon")
+
+            ;; Wait for the rpcbind daemon to be up and running.
+            (test-eq "RPC service running"
+              'running!
+              (marionette-eval
+               '(begin
+                  (use-modules (gnu services herd))
+                  (start-service 'rpcbind-daemon)
+                  'running!)
+               marionette))
+
+            ;; Check the socket file and that the service is still running.
+            (test-assert "RPC socket exists"
+              (begin
+                (wait-for-socket #$socket)
+                (marionette-eval
+                 '(begin
+                    (use-modules (gnu services herd)
+                                 (srfi srfi-1))
+
+                    (live-service-running
+                     (find (lambda (live)
+                             (memq 'rpcbind-daemon
+                                   (live-service-provision live)))
+                           (current-services))))
+                 marionette)))
+
+            (test-assert "Probe RPC daemon"
+              (marionette-eval
+               '(zero? (system* "rpcinfo" "-p"))
+               marionette))
+
+            (test-end)
+            (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
+
+    (gexp->derivation name test)))
+
+(define %test-nfs
+  (system-test
+   (name "nfs")
+   (description "Test some things related to NFS.")
+   (value (run-nfs-test name
+                        (service rpcbind-service-type
+                                 (rpcbind-configuration))
+                        "/var/run/rpcbind.sock"))))