all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* [PATCH 0/2] Add a test for the Prosody service.
@ 2017-02-05 18:58 Clément Lassieur
  2017-02-05 18:58 ` [PATCH 1/2] service: shepherd: Replace spaces with hyphens in file names Clément Lassieur
  2017-02-05 18:58 ` [PATCH 2/2] tests: Add 'prosody-service-type' test Clément Lassieur
  0 siblings, 2 replies; 10+ messages in thread
From: Clément Lassieur @ 2017-02-05 18:58 UTC (permalink / raw)
  To: guix-devel

These patches add a test for the Prosody service.  I chose to use GNU Freetalk
as the XMPP client because it is scriptable through a Guile interface.

Thanks for your feedback!

Clément Lassieur (2):
  service: shepherd: Replace spaces with hyphens in file names.
  tests: Add 'prosody-service-type' test.

 gnu/services/messaging.scm |   5 +-
 gnu/services/shepherd.scm  |   2 +
 gnu/tests/messaging.scm    | 175 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 180 insertions(+), 2 deletions(-)
 create mode 100644 gnu/tests/messaging.scm

-- 
2.11.0

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/2] service: shepherd: Replace spaces with hyphens in file names.
  2017-02-05 18:58 [PATCH 0/2] Add a test for the Prosody service Clément Lassieur
@ 2017-02-05 18:58 ` Clément Lassieur
  2017-02-08 14:40   ` Ludovic Courtès
  2017-02-05 18:58 ` [PATCH 2/2] tests: Add 'prosody-service-type' test Clément Lassieur
  1 sibling, 1 reply; 10+ messages in thread
From: Clément Lassieur @ 2017-02-05 18:58 UTC (permalink / raw)
  To: guix-devel

* gnu/services/shepherd.scm (shepherd-service-file-name): Update
  'match-lambda' accordingly.

This fixes a bug whereby names of files defining services would be invalid if
'provisions' contained more than one element.
---
 gnu/services/shepherd.scm | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/gnu/services/shepherd.scm b/gnu/services/shepherd.scm
index d8d5006ab..583122054 100644
--- a/gnu/services/shepherd.scm
+++ b/gnu/services/shepherd.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -195,6 +196,7 @@ stored."
     (string-append "shepherd-"
                    (string-map (match-lambda
                                  (#\/ #\-)
+                                 (#\  #\-)
                                  (chr chr))
                                provisions)
                    ".scm")))
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 2/2] tests: Add 'prosody-service-type' test.
  2017-02-05 18:58 [PATCH 0/2] Add a test for the Prosody service Clément Lassieur
  2017-02-05 18:58 ` [PATCH 1/2] service: shepherd: Replace spaces with hyphens in file names Clément Lassieur
@ 2017-02-05 18:58 ` Clément Lassieur
  2017-02-06  9:48   ` Clément Lassieur
  2017-02-08 14:47   ` Ludovic Courtès
  1 sibling, 2 replies; 10+ messages in thread
From: Clément Lassieur @ 2017-02-05 18:58 UTC (permalink / raw)
  To: guix-devel

* gnu/tests/messaging.scm: New file.
* gnu/services/messaging.scm: New exported procedure.
  (<shepherd-service>)[provision]: Add 'xmpp-daemon'.
---
 gnu/services/messaging.scm |   5 +-
 gnu/tests/messaging.scm    | 175 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 178 insertions(+), 2 deletions(-)
 create mode 100644 gnu/tests/messaging.scm

diff --git a/gnu/services/messaging.scm b/gnu/services/messaging.scm
index aa398970b..9f59d6eac 100644
--- a/gnu/services/messaging.scm
+++ b/gnu/services/messaging.scm
@@ -40,7 +40,8 @@
             mod-muc-configuration
             ssl-configuration
 
-            %default-modules-enabled))
+            %default-modules-enabled
+            prosody-configuration-pidfile))
 
 ;;; Commentary:
 ;;;
@@ -592,7 +593,7 @@ See also @url{http://prosody.im/doc/modules/mod_muc}."
                                   (zero? (system* #$prosodyctl-bin #$@args))))))
     (list (shepherd-service
            (documentation "Run the Prosody XMPP server")
-           (provision '(prosody))
+           (provision '(prosody xmpp-daemon))
            (requirement '(networking syslogd user-processes))
            (start (prosodyctl-action "start"))
            (stop (prosodyctl-action "stop"))))))
diff --git a/gnu/tests/messaging.scm b/gnu/tests/messaging.scm
new file mode 100644
index 000000000..b7f97ab98
--- /dev/null
+++ b/gnu/tests/messaging.scm
@@ -0,0 +1,175 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Clément Lassieur <clement@lassieur.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 messaging)
+  #: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 messaging)
+  #:use-module (gnu services networking)
+  #:use-module (gnu packages messaging)
+  #:use-module (guix gexp)
+  #:use-module (guix store)
+  #:use-module (guix monads)
+  #:export (%test-prosody))
+
+(define %base-os
+  (operating-system
+    (host-name "komputilo")
+    (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)
+    (services (cons service
+                    (operating-system-user-services %base-os)))))
+
+(define (run-xmpp-test name xmpp-service pid-file create-account)
+  "Run a test of an OS running XMPP-SERVICE, which writes its PID to PID-FILE."
+  (mlet* %store-monad ((os -> (marionette-operating-system
+                               (os-with-service xmpp-service)
+                               #:imported-modules '((gnu services herd))))
+                       (command (system-qemu-image/shared-store-script
+                                 os #:graphic? #f))
+                       (username -> "alice")
+                       (server -> "localhost")
+                       (jid -> (string-append username "@" server))
+                       (password -> "correct horse battery staple")
+                       (port -> 15222)
+                       (message -> "hello world"))
+
+    (define script.ft
+      (scheme-file
+       "script.ft"
+       #~(begin
+           (define (handle-received-message time from nickname message)
+             (if (equal? message #$message)
+                 (ft-quit 0)
+                 (ft-quit 1)))
+           (add-hook! ft-message-receive-hook handle-received-message)
+
+           (ft-set-jid! #$jid)
+           (ft-set-password! #$password)
+           (ft-set-server! #$server)
+           (ft-set-port! #$port)
+           (ft-set-sslconn! #f)
+           (ft-connect-blocking)
+           (ft-send-message #$jid #$message)
+           (ft-main-loop))))
+
+    (define test
+      (with-imported-modules '((gnu build marionette))
+        #~(begin
+            (use-modules (gnu build marionette)
+                         (srfi srfi-64))
+
+            (define marionette
+              ;; Enable TCP forwarding of the guest's port 5222.
+              (make-marionette (list #$command "-net"
+                                     (string-append "user,hostfwd=tcp::"
+                                                    (number->string #$port)
+                                                    "-:5222"))))
+
+            (define (wait-for-file file)
+              ;; Wait until FILE exists in the guest; 'read' its content and
+              ;; return it.
+              (marionette-eval
+               `(let loop ((i 10))
+                  (cond ((file-exists? ,file)
+                         (call-with-input-file ,file read))
+                        ((> i 0)
+                         (begin
+                           (sleep 1))
+                         (loop (- i 1)))
+                        (else
+                         (error "file didn't show up" ,file))))
+               marionette))
+
+            (mkdir #$output)
+            (chdir #$output)
+
+            (test-begin "xmpp")
+
+            ;; Wait for XMPP service to be up and running.
+            (test-eq "service running"
+              'running!
+              (marionette-eval
+               '(begin
+                  (use-modules (gnu services herd))
+                  (start-service 'xmpp-daemon)
+                  'running!)
+               marionette))
+
+            ;; Check XMPP service's PID.
+            (test-assert "service process id"
+              (let ((pid (number->string (wait-for-file #$pid-file))))
+                (marionette-eval `(zero? (system* "ps" "-p" ,pid))
+                                 marionette)))
+
+            ;; Alice sends an XMPP message to herself, with Freetalk.
+            (test-assert "client-to-server communication"
+              (let ((freetalk-bin (string-append #$freetalk "/bin/freetalk")))
+                (marionette-eval '(system* #$create-account #$jid #$password)
+                                 marionette)
+                ;; Freetalk requires write access to $HOME.
+                (setenv "HOME" "/tmp")
+                (zero? (system* freetalk-bin "-s" #$script.ft))))
+
+            (test-end)
+            (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
+
+    (gexp->derivation name test)))
+
+(define %create-prosody-account
+  (program-file
+   "create-account"
+   #~(let* ((jid (cadr (command-line)))
+            (password (caddr (command-line)))
+            (password-input (string-append "\"" password "\n" password "\""))
+            (prosodyctl-bin #$(file-append prosody "/bin/prosodyctl")))
+       (system (string-join
+                `("echo" ,password-input "|" ,prosodyctl-bin "adduser" ,jid)
+                " ")))))
+
+(define %test-prosody
+  (let* ((config (prosody-configuration
+                  (virtualhosts
+                   (list
+                    (virtualhost-configuration
+                     (domain "localhost")))))))
+    (system-test
+     (name "prosody")
+     (description "Connect to a running Prosody daemon.")
+     (value (run-xmpp-test name
+                           (service prosody-service-type config)
+                           (prosody-configuration-pidfile config)
+                           %create-prosody-account)))))
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] tests: Add 'prosody-service-type' test.
  2017-02-05 18:58 ` [PATCH 2/2] tests: Add 'prosody-service-type' test Clément Lassieur
@ 2017-02-06  9:48   ` Clément Lassieur
  2017-02-08 14:47   ` Ludovic Courtès
  1 sibling, 0 replies; 10+ messages in thread
From: Clément Lassieur @ 2017-02-06  9:48 UTC (permalink / raw)
  To: guix-devel

> +    (define script.ft
> +      (scheme-file
> +       "script.ft"
> +       #~(begin
> +           (define (handle-received-message time from nickname message)
> +             (if (equal? message #$message)
> +                 (ft-quit 0)
> +                 (ft-quit 1)))
> +           (add-hook! ft-message-receive-hook handle-received-message)
> +
> +           (ft-set-jid! #$jid)
> +           (ft-set-password! #$password)
> +           (ft-set-server! #$server)
> +           (ft-set-port! #$port)
> +           (ft-set-sslconn! #f)
> +           (ft-connect-blocking)
> +           (ft-send-message #$jid #$message)
> +           (ft-main-loop))))

Maybe I should add a timeout somewhere, so the test doesn't wait forever
if the message is not actually received.  WDYT?

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/2] service: shepherd: Replace spaces with hyphens in file names.
  2017-02-05 18:58 ` [PATCH 1/2] service: shepherd: Replace spaces with hyphens in file names Clément Lassieur
@ 2017-02-08 14:40   ` Ludovic Courtès
  0 siblings, 0 replies; 10+ messages in thread
From: Ludovic Courtès @ 2017-02-08 14:40 UTC (permalink / raw)
  To: Clément Lassieur; +Cc: guix-devel

Clément Lassieur <clement@lassieur.org> skribis:

> * gnu/services/shepherd.scm (shepherd-service-file-name): Update
>   'match-lambda' accordingly.
>
> This fixes a bug whereby names of files defining services would be invalid if
> 'provisions' contained more than one element.

Good catch!  Applied, thanks.

Ludo’.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] tests: Add 'prosody-service-type' test.
  2017-02-05 18:58 ` [PATCH 2/2] tests: Add 'prosody-service-type' test Clément Lassieur
  2017-02-06  9:48   ` Clément Lassieur
@ 2017-02-08 14:47   ` Ludovic Courtès
  2017-02-10 18:17     ` [PATCH] " Clément Lassieur
  2017-02-10 18:27     ` [PATCH 2/2] " Clément Lassieur
  1 sibling, 2 replies; 10+ messages in thread
From: Ludovic Courtès @ 2017-02-08 14:47 UTC (permalink / raw)
  To: Clément Lassieur; +Cc: guix-devel

Hello!

Clément Lassieur <clement@lassieur.org> skribis:

> * gnu/tests/messaging.scm: New file.
> * gnu/services/messaging.scm: New exported procedure.
>   (<shepherd-service>)[provision]: Add 'xmpp-daemon'.

Awesome!

Please also add the new file to gnu/local.mk.

> +(define %base-os
> +  (operating-system
> +    (host-name "komputilo")
> +    (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)
> +    (services (cons service
> +                    (operating-system-user-services %base-os)))))
> +
> +(define (run-xmpp-test name xmpp-service pid-file create-account)
> +  "Run a test of an OS running XMPP-SERVICE, which writes its PID to PID-FILE."
> +  (mlet* %store-monad ((os -> (marionette-operating-system
> +                               (os-with-service xmpp-service)
> +                               #:imported-modules '((gnu services herd))))

I think you can remove ‘os-with-service’ and simply add the Prosody
service explicitly in ‘%base-os’ (which could be rename ‘%prosody-os’
maybe).

> +    (define script.ft
> +      (scheme-file
> +       "script.ft"
> +       #~(begin
> +           (define (handle-received-message time from nickname message)
> +             (if (equal? message #$message)
> +                 (ft-quit 0)
> +                 (ft-quit 1)))
> +           (add-hook! ft-message-receive-hook handle-received-message)
> +
> +           (ft-set-jid! #$jid)
> +           (ft-set-password! #$password)
> +           (ft-set-server! #$server)
> +           (ft-set-port! #$port)
> +           (ft-set-sslconn! #f)
> +           (ft-connect-blocking)
> +           (ft-send-message #$jid #$message)
> +           (ft-main-loop))))

Very neat that this can be done in Scheme too.  :-)

If it’s possible, I agree that adding a timeout (say 1 minute) would be
nice.

> +            ;; Check XMPP service's PID.
> +            (test-assert "service process id"
> +              (let ((pid (number->string (wait-for-file #$pid-file))))
> +                (marionette-eval `(zero? (system* "ps" "-p" ,pid))
> +                                 marionette)))

I think (file-exists? (string-append "/proc/" pid)) would be enough.

> +(define %create-prosody-account
> +  (program-file
> +   "create-account"
> +   #~(let* ((jid (cadr (command-line)))
> +            (password (caddr (command-line)))

Better use ‘match’ here.  :-)

   (match (command-line)
     ((command jid password)
      …))

Could you send an updated patch?

Thank you!

Ludo’.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH] tests: Add 'prosody-service-type' test.
  2017-02-08 14:47   ` Ludovic Courtès
@ 2017-02-10 18:17     ` Clément Lassieur
  2017-02-10 22:42       ` Ludovic Courtès
  2017-02-10 18:27     ` [PATCH 2/2] " Clément Lassieur
  1 sibling, 1 reply; 10+ messages in thread
From: Clément Lassieur @ 2017-02-10 18:17 UTC (permalink / raw)
  To: guix-devel

* gnu/tests/messaging.scm: New file.
* gnu/services/messaging.scm: New exported procedure.
  (<shepherd-service>)[provision]: Add 'xmpp-daemon'.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add it.
---
 gnu/local.mk               |   1 +
 gnu/services/messaging.scm |   5 +-
 gnu/tests/messaging.scm    | 194 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 198 insertions(+), 2 deletions(-)
 create mode 100644 gnu/tests/messaging.scm

diff --git a/gnu/local.mk b/gnu/local.mk
index 4d6e4b05d..25fb3b44f 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -459,6 +459,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/tests/nfs.scm				\
   %D%/tests/install.scm				\
   %D%/tests/mail.scm				\
+  %D%/tests/messaging.scm			\
   %D%/tests/ssh.scm				\
   %D%/tests/web.scm
 
diff --git a/gnu/services/messaging.scm b/gnu/services/messaging.scm
index aa398970b..9f59d6eac 100644
--- a/gnu/services/messaging.scm
+++ b/gnu/services/messaging.scm
@@ -40,7 +40,8 @@
             mod-muc-configuration
             ssl-configuration
 
-            %default-modules-enabled))
+            %default-modules-enabled
+            prosody-configuration-pidfile))
 
 ;;; Commentary:
 ;;;
@@ -592,7 +593,7 @@ See also @url{http://prosody.im/doc/modules/mod_muc}."
                                   (zero? (system* #$prosodyctl-bin #$@args))))))
     (list (shepherd-service
            (documentation "Run the Prosody XMPP server")
-           (provision '(prosody))
+           (provision '(prosody xmpp-daemon))
            (requirement '(networking syslogd user-processes))
            (start (prosodyctl-action "start"))
            (stop (prosodyctl-action "stop"))))))
diff --git a/gnu/tests/messaging.scm b/gnu/tests/messaging.scm
new file mode 100644
index 000000000..b0c8254ce
--- /dev/null
+++ b/gnu/tests/messaging.scm
@@ -0,0 +1,194 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Clément Lassieur <clement@lassieur.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 messaging)
+  #: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 messaging)
+  #:use-module (gnu services networking)
+  #:use-module (gnu packages messaging)
+  #:use-module (guix gexp)
+  #:use-module (guix store)
+  #:use-module (guix monads)
+  #:export (%test-prosody))
+
+(define %base-os
+  (operating-system
+    (host-name "komputilo")
+    (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)
+    (services (cons service
+                    (operating-system-user-services %base-os)))))
+
+(define (run-xmpp-test name xmpp-service pid-file create-account)
+  "Run a test of an OS running XMPP-SERVICE, which writes its PID to PID-FILE."
+  (mlet* %store-monad ((os -> (marionette-operating-system
+                               (os-with-service xmpp-service)
+                               #:imported-modules '((gnu services herd))))
+                       (command (system-qemu-image/shared-store-script
+                                 os #:graphic? #f))
+                       (username -> "alice")
+                       (server -> "localhost")
+                       (jid -> (string-append username "@" server))
+                       (password -> "correct horse battery staple")
+                       (port -> 15222)
+                       (message -> "hello world")
+                       (witness -> "/tmp/freetalk-witness"))
+
+    (define script.ft
+      (scheme-file
+       "script.ft"
+       #~(begin
+           (define (handle-received-message time from nickname message)
+             (define (touch file-name)
+               (call-with-output-file file-name (const #t)))
+             (when (equal? message #$message)
+               (touch #$witness)))
+           (add-hook! ft-message-receive-hook handle-received-message)
+
+           (ft-set-jid! #$jid)
+           (ft-set-password! #$password)
+           (ft-set-server! #$server)
+           (ft-set-port! #$port)
+           (ft-set-sslconn! #f)
+           (ft-connect-blocking)
+           (ft-send-message #$jid #$message)
+
+           (ft-set-daemon)
+           (ft-main-loop))))
+
+    (define test
+      (with-imported-modules '((gnu build marionette))
+        #~(begin
+            (use-modules (gnu build marionette)
+                         (srfi srfi-64))
+
+            (define marionette
+              ;; Enable TCP forwarding of the guest's port 5222.
+              (make-marionette (list #$command "-net"
+                                     (string-append "user,hostfwd=tcp::"
+                                                    (number->string #$port)
+                                                    "-:5222"))))
+
+            (define (guest-wait-for-file file)
+              ;; Wait until FILE exists in the guest; 'read' its content and
+              ;; return it.
+              (marionette-eval
+               `(let loop ((i 10))
+                  (cond ((file-exists? ,file)
+                         (call-with-input-file ,file read))
+                        ((> i 0)
+                         (begin
+                           (sleep 1))
+                         (loop (- i 1)))
+                        (else
+                         (error "file didn't show up" ,file))))
+               marionette))
+
+            (define (host-wait-for-file file)
+              ;; Wait until FILE exists in the host.
+              (let loop ((i 60))
+                (cond ((file-exists? file)
+                       #t)
+                      ((> i 0)
+                       (begin
+                         (sleep 1))
+                       (loop (- i 1)))
+                      (else
+                       (error "file didn't show up" file)))))
+
+            (mkdir #$output)
+            (chdir #$output)
+
+            (test-begin "xmpp")
+
+            ;; Wait for XMPP service to be up and running.
+            (test-eq "service running"
+              'running!
+              (marionette-eval
+               '(begin
+                  (use-modules (gnu services herd))
+                  (start-service 'xmpp-daemon)
+                  'running!)
+               marionette))
+
+            ;; Check XMPP service's PID.
+            (test-assert "service process id"
+              (let ((pid (number->string (guest-wait-for-file #$pid-file))))
+                (marionette-eval `(file-exists? (string-append "/proc/" ,pid))
+                                 marionette)))
+
+            ;; Alice sends an XMPP message to herself, with Freetalk.
+            (test-assert "client-to-server communication"
+              (let ((freetalk-bin (string-append #$freetalk "/bin/freetalk")))
+                (marionette-eval '(system* #$create-account #$jid #$password)
+                                 marionette)
+                ;; Freetalk requires write access to $HOME.
+                (setenv "HOME" "/tmp")
+                (system* freetalk-bin "-s" #$script.ft)
+                (host-wait-for-file #$witness)))
+
+            (test-end)
+            (exit (= (test-runner-fail-count (test-runner-current)) 0)))))
+
+    (gexp->derivation name test)))
+
+(define %create-prosody-account
+  (program-file
+   "create-account"
+   #~(begin
+       (use-modules (ice-9 match))
+       (match (command-line)
+         ((command jid password)
+          (let ((password-input (format #f "\"~a~%~a\"" password password))
+                (prosodyctl #$(file-append prosody "/bin/prosodyctl")))
+            (system (string-join
+                     `("echo" ,password-input "|" ,prosodyctl "adduser" ,jid)
+                     " "))))))))
+
+(define %test-prosody
+  (let* ((config (prosody-configuration
+                  (virtualhosts
+                   (list
+                    (virtualhost-configuration
+                     (domain "localhost")))))))
+    (system-test
+     (name "prosody")
+     (description "Connect to a running Prosody daemon.")
+     (value (run-xmpp-test name
+                           (service prosody-service-type config)
+                           (prosody-configuration-pidfile config)
+                           %create-prosody-account)))))
-- 
2.11.1

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] tests: Add 'prosody-service-type' test.
  2017-02-08 14:47   ` Ludovic Courtès
  2017-02-10 18:17     ` [PATCH] " Clément Lassieur
@ 2017-02-10 18:27     ` Clément Lassieur
  2017-02-10 22:24       ` Ludovic Courtès
  1 sibling, 1 reply; 10+ messages in thread
From: Clément Lassieur @ 2017-02-10 18:27 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: guix-devel

Hi Ludovic,

Ludovic Courtès <ludo@gnu.org> writes:

> Hello!
>
> Clément Lassieur <clement@lassieur.org> skribis:
>
>> * gnu/tests/messaging.scm: New file.
>> * gnu/services/messaging.scm: New exported procedure.
>>   (<shepherd-service>)[provision]: Add 'xmpp-daemon'.
>
> Awesome!
>
> Please also add the new file to gnu/local.mk.

Done.

>> +(define %base-os
>> +  (operating-system
>> +    (host-name "komputilo")
>> +    (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)
>> +    (services (cons service
>> +                    (operating-system-user-services %base-os)))))
>> +
>> +(define (run-xmpp-test name xmpp-service pid-file create-account)
>> +  "Run a test of an OS running XMPP-SERVICE, which writes its PID to PID-FILE."
>> +  (mlet* %store-monad ((os -> (marionette-operating-system
>> +                               (os-with-service xmpp-service)
>> +                               #:imported-modules '((gnu services herd))))
>
> I think you can remove ‘os-with-service’ and simply add the Prosody
> service explicitly in ‘%base-os’ (which could be rename ‘%prosody-os’
> maybe).

But then, my test wouldn't be generic anymore, would it?  I would like
it to be Prosody-independent, so that one can add, say, the ejabberd
service easily.  That's why I call the service 'xmpp-daemon' instead of
'prosody'.  WDYT?

>> +    (define script.ft
>> +      (scheme-file
>> +       "script.ft"
>> +       #~(begin
>> +           (define (handle-received-message time from nickname message)
>> +             (if (equal? message #$message)
>> +                 (ft-quit 0)
>> +                 (ft-quit 1)))
>> +           (add-hook! ft-message-receive-hook handle-received-message)
>> +
>> +           (ft-set-jid! #$jid)
>> +           (ft-set-password! #$password)
>> +           (ft-set-server! #$server)
>> +           (ft-set-port! #$port)
>> +           (ft-set-sslconn! #f)
>> +           (ft-connect-blocking)
>> +           (ft-send-message #$jid #$message)
>> +           (ft-main-loop))))
>
> Very neat that this can be done in Scheme too.  :-)
>
> If it’s possible, I agree that adding a timeout (say 1 minute) would be
> nice.

Done.

>> +            ;; Check XMPP service's PID.
>> +            (test-assert "service process id"
>> +              (let ((pid (number->string (wait-for-file #$pid-file))))
>> +                (marionette-eval `(zero? (system* "ps" "-p" ,pid))
>> +                                 marionette)))
>
> I think (file-exists? (string-append "/proc/" pid)) would be enough.

Done.

>> +(define %create-prosody-account
>> +  (program-file
>> +   "create-account"
>> +   #~(let* ((jid (cadr (command-line)))
>> +            (password (caddr (command-line)))
>
> Better use ‘match’ here.  :-)
>
>    (match (command-line)
>      ((command jid password)
>       …))

Done.

> Could you send an updated patch?

Done! Thanks for the review!

Clément

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/2] tests: Add 'prosody-service-type' test.
  2017-02-10 18:27     ` [PATCH 2/2] " Clément Lassieur
@ 2017-02-10 22:24       ` Ludovic Courtès
  0 siblings, 0 replies; 10+ messages in thread
From: Ludovic Courtès @ 2017-02-10 22:24 UTC (permalink / raw)
  To: Clément Lassieur; +Cc: guix-devel

Hello Clément,

Clément Lassieur <clement@lassieur.org> skribis:

> Ludovic Courtès <ludo@gnu.org> writes:

[...]

>>> +(define (run-xmpp-test name xmpp-service pid-file create-account)
>>> +  "Run a test of an OS running XMPP-SERVICE, which writes its PID to PID-FILE."
>>> +  (mlet* %store-monad ((os -> (marionette-operating-system
>>> +                               (os-with-service xmpp-service)
>>> +                               #:imported-modules '((gnu services herd))))
>>
>> I think you can remove ‘os-with-service’ and simply add the Prosody
>> service explicitly in ‘%base-os’ (which could be rename ‘%prosody-os’
>> maybe).
>
> But then, my test wouldn't be generic anymore, would it?  I would like
> it to be Prosody-independent, so that one can add, say, the ejabberd
> service easily.  That's why I call the service 'xmpp-daemon' instead of
> 'prosody'.  WDYT?

I think you’re right.  :-)  I didn’t know you had this in mind, but it’s
a good idea.

Ludo’.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] tests: Add 'prosody-service-type' test.
  2017-02-10 18:17     ` [PATCH] " Clément Lassieur
@ 2017-02-10 22:42       ` Ludovic Courtès
  0 siblings, 0 replies; 10+ messages in thread
From: Ludovic Courtès @ 2017-02-10 22:42 UTC (permalink / raw)
  To: Clément Lassieur; +Cc: guix-devel

Clément Lassieur <clement@lassieur.org> skribis:

> * gnu/tests/messaging.scm: New file.
> * gnu/services/messaging.scm: New exported procedure.
>   (<shepherd-service>)[provision]: Add 'xmpp-daemon'.
> * gnu/local.mk (GNU_SYSTEM_MODULES): Add it.

Pushed, thanks!

Ludo’.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2017-02-10 22:42 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-05 18:58 [PATCH 0/2] Add a test for the Prosody service Clément Lassieur
2017-02-05 18:58 ` [PATCH 1/2] service: shepherd: Replace spaces with hyphens in file names Clément Lassieur
2017-02-08 14:40   ` Ludovic Courtès
2017-02-05 18:58 ` [PATCH 2/2] tests: Add 'prosody-service-type' test Clément Lassieur
2017-02-06  9:48   ` Clément Lassieur
2017-02-08 14:47   ` Ludovic Courtès
2017-02-10 18:17     ` [PATCH] " Clément Lassieur
2017-02-10 22:42       ` Ludovic Courtès
2017-02-10 18:27     ` [PATCH 2/2] " Clément Lassieur
2017-02-10 22:24       ` Ludovic Courtès

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.