summaryrefslogtreecommitdiff
path: root/gnu/tests
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/tests')
-rw-r--r--gnu/tests/desktop.scm212
-rw-r--r--gnu/tests/telephony.scm412
2 files changed, 407 insertions, 217 deletions
diff --git a/gnu/tests/desktop.scm b/gnu/tests/desktop.scm
index 57069c0ede..25971f9225 100644
--- a/gnu/tests/desktop.scm
+++ b/gnu/tests/desktop.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017, 2021 Ludovic Courtès <[email protected]>
+;;; Copyright © 2021 muradm <[email protected]>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -18,13 +19,17 @@
(define-module (gnu tests desktop)
#:use-module (gnu tests)
+ #:use-module (gnu packages shells)
#:use-module (gnu services)
+ #:use-module (gnu services base)
#:use-module (gnu services dbus)
#:use-module (gnu services desktop)
+ #:use-module (gnu system)
#:use-module (gnu system vm)
#:use-module (guix gexp)
#:use-module (srfi srfi-1)
- #:export (%test-elogind))
+ #:export (%test-elogind
+ %test-minimal-desktop))
;;;
@@ -100,3 +105,208 @@
#:imported-modules '((gnu services herd)
(guix combinators)))))
(run-elogind-test (virtual-machine os))))))
+
+
+;;;
+;;; Seatd/greetd based minimal desktop
+;;;
+
+(define %minimal-services
+ (append
+ (modify-services %base-services
+ ;; greetd-service-type provides "greetd" PAM service
+ (delete login-service-type)
+ ;; and can be used in place of mingetty-service-type
+ (delete mingetty-service-type))
+ (list
+ (service seatd-service-type)
+ (service greetd-service-type
+ (greetd-configuration
+ (terminals
+ (list
+ ;; we can make any terminal active by default
+ (greetd-terminal-configuration (terminal-vt "1") (terminal-switch #t))
+ ;; we can make environment without XDG_RUNTIME_DIR set
+ ;; even provide our own environment variables
+ (greetd-terminal-configuration
+ (terminal-vt "2")
+ (default-session-command
+ (greetd-agreety-session
+ (extra-env '(("MY_VAR" . "1")))
+ (xdg-env? #f))))
+ ;; we can use different shell instead of default bash
+ (greetd-terminal-configuration
+ (terminal-vt "3")
+ (default-session-command
+ (greetd-agreety-session (command (file-append zsh "/bin/zsh")))))
+ ;; we can use any other executable command as greeter
+ (greetd-terminal-configuration
+ (terminal-vt "4")
+ (default-session-command (program-file "my-noop-greeter" #~(exit))))
+ (greetd-terminal-configuration (terminal-vt "5"))
+ (greetd-terminal-configuration (terminal-vt "6"))))))
+ ;; mingetty-service-type can be used in parallel
+ ;; if needed to do so, do not (delete login-service-type)
+ ;; as illustrated above
+ #| (service mingetty-service-type (mingetty-configuration (tty "tty8"))) |#)))
+
+(define-syntax-rule (minimal-operating-system user-services ...)
+ "Return an operating system that includes USER-SERVICES in addition to
+minimal %BASE-SERVICES."
+ (operating-system (inherit %simple-os)
+ (services (cons* user-services ... %minimal-services))))
+
+(define (run-minimal-desktop-test os vm)
+ (define test
+ (with-imported-modules '((gnu build marionette)
+ (guix build syscalls))
+ #~(begin
+ (use-modules (gnu build marionette)
+ (guix build syscalls)
+ (srfi srfi-1)
+ (srfi srfi-64)
+ (ice-9 pretty-print))
+
+ (define marionette
+ (make-marionette #$vm))
+
+ (define (file-get-all-strings fname)
+ (marionette-eval '(use-modules (rnrs io ports)) marionette)
+ (wait-for-file fname marionette #:read 'get-string-all))
+
+ (define (wait-for-unix-socket-m socket)
+ (wait-for-unix-socket socket marionette))
+
+ (mkdir #$output)
+ (chdir #$output)
+
+ (test-runner-current (system-test-runner #$output))
+ (test-begin "minimal-desktop")
+
+ (test-assert "seatd is ready"
+ (wait-for-unix-socket-m "/run/seatd.sock"))
+
+ (test-equal "login user on tty1"
+ "alice\n"
+ (begin
+ ;; Wait for tty1.
+ (marionette-eval
+ '(begin
+ (use-modules (gnu services herd))
+ (start-service 'term-tty1))
+ marionette)
+ (marionette-control "sendkey ctrl-alt-f1" marionette)
+
+ ;; login as root change alice password and exit
+ ;; then login as alice
+ (for-each
+ (lambda (cmd) (marionette-type cmd marionette) (sleep 1))
+ (list
+ "root\n"
+ "passwd alice\n"
+ "alice\n"
+ "alice\n"
+ "exit\n"
+ "alice\n"
+ "alice\n"
+ "id -un > logged-in\n"))
+
+ (file-get-all-strings "/home/alice/logged-in")))
+
+ (test-equal "validate user environment"
+ '("SEATD_SOCK=/run/seatd.sock"
+ "XDG_RUNTIME_DIR=/run/user/1000"
+ "XDG_SEAT=seat0"
+ "XDG_VTNR=1")
+
+ (begin
+ (marionette-type "env > env\n" marionette)
+ (sleep 1)
+
+ (define user-env (string-tokenize
+ (file-get-all-strings "/home/alice/env")))
+
+ (define (expected-var var)
+ (any (lambda (s) (string-contains var s))
+ '("SEATD_SOCK"
+ "XDG_RUNTIME_DIR"
+ "XDG_SEAT"
+ "XDG_VTNR")))
+
+ (sort (filter expected-var user-env) string<?)))
+
+ (test-assert "validate SEATD_SOCK and GREETD_SOCK"
+ (begin
+ (marionette-type "env > env\n" marionette)
+ (sleep 1)
+
+ (define (sock-var? var)
+ (any (lambda (s) (string-contains var s))
+ '("SEATD_SOCK" "GREETD_SOCK")))
+
+ (define (sock-var-sock var)
+ (car (cdr (string-split var #\=))))
+
+ (let*
+ ((out (file-get-all-strings "/home/alice/env"))
+ (out (string-tokenize out))
+ (out (filter sock-var? out))
+ (socks (map sock-var-sock out))
+ (socks (map wait-for-unix-socket-m socks)))
+ (and (= 2 (length socks)) (every identity socks)))))
+
+ (test-assert "greetd is ready"
+ (begin
+ (marionette-type "ps -C greetd -o pid,args --no-headers > ps-greetd\n"
+ marionette)
+ (sleep 1)
+
+ (define (greetd-daemon? cmd)
+ (string-contains cmd "config"))
+
+ (define (greetd-cmd-to-pid cmd)
+ (car (string-split cmd #\space)))
+
+ (define (greetd-pid-to-sock pid)
+ (string-append "/run/greetd-" pid ".sock"))
+
+ (let* ((out (file-get-all-strings "/home/alice/ps-greetd"))
+ (out (string-split out #\newline))
+ (out (map string-trim-both out))
+ (out (filter greetd-daemon? out))
+ (pids (map greetd-cmd-to-pid out))
+ (socks (map greetd-pid-to-sock pids))
+ (socks (map wait-for-unix-socket-m socks)))
+ (every identity socks))))
+
+ ;; a bit weak, but tests everything at once actually
+ (test-equal "check /run/user/<uid> mounted and writable"
+ "alice\n"
+ (begin
+ (marionette-type "echo alice > /run/user/1000/test\n" marionette)
+ (file-get-all-strings "/run/user/1000/test")))
+
+ (test-assert "screendump"
+ (begin
+ (marionette-control (string-append "screendump " #$output
+ "/tty1.ppm")
+ marionette)
+ (file-exists? "tty1.ppm")))
+
+ (test-end))))
+
+ (gexp->derivation "minimal-desktop" test))
+
+(define %test-minimal-desktop
+ (system-test
+ (name "minimal-desktop")
+ (description
+ "Test whether we can log in when seatd and greetd is enabled")
+ (value
+ (let* ((os (marionette-operating-system
+ (minimal-operating-system)
+ #:imported-modules '((gnu services herd)
+ (guix combinators))))
+ (vm (virtual-machine os)))
+ (run-minimal-desktop-test (virtualized-operating-system os '())
+ #~(list #$vm))))))
diff --git a/gnu/tests/telephony.scm b/gnu/tests/telephony.scm
index bc464a431a..16ee313f69 100644
--- a/gnu/tests/telephony.scm
+++ b/gnu/tests/telephony.scm
@@ -20,6 +20,7 @@
#:use-module (gnu)
#:use-module (gnu packages)
#:use-module (gnu packages guile)
+ #:use-module (gnu packages guile-xyz)
#:use-module (gnu tests)
#:use-module (gnu system vm)
#:use-module (gnu services)
@@ -125,221 +126,204 @@ accounts provisioning feature of the service."
"Account.username"))
(define test
- (with-imported-modules (source-module-closure
- '((gnu build marionette)
- (gnu build jami-service)))
- #~(begin
- (use-modules (rnrs base)
- (srfi srfi-11)
- (srfi srfi-64)
- (gnu build marionette)
- (gnu build jami-service))
-
- (define marionette
- (make-marionette (list #$vm)))
-
- (test-runner-current (system-test-runner #$output))
- (test-begin "jami")
-
- (test-assert "service is running"
- (marionette-eval
- '(begin
- (use-modules (gnu services herd))
- (match (start-service 'jami)
- (#f #f)
- (('service response-parts ...)
- (match (assq-ref response-parts 'running)
- ((pid) (number? pid))))))
- marionette))
-
- (test-assert "service can be stopped"
- (marionette-eval
- '(begin
- (use-modules (gnu services herd)
- (rnrs base))
- (setenv "PATH" "/run/current-system/profile/bin")
- (let ((pid (match (start-service 'jami)
- (#f #f)
- (('service response-parts ...)
- (match (assq-ref response-parts 'running)
- ((pid) pid))))))
-
- (assert (number? pid))
-
- (match (stop-service 'jami)
- (services ;a list of service symbols
- (member 'jami services)))
- ;; Sometimes, the process still appear in pgrep, even
- ;; though we are using waitpid after sending it SIGTERM
- ;; in the service; use retries.
+ (with-extensions (list guile-packrat ;used by guile-ac-d-bus
+ guile-ac-d-bus
+ ;; Fibers is needed to provide the non-blocking
+ ;; variant of the 'sleep' procedure.
+ guile-fibers)
+ (with-imported-modules (source-module-closure
+ '((gnu build marionette)
+ (gnu build dbus-service)
+ (gnu build jami-service)))
+ #~(begin
+ (use-modules (rnrs base)
+ (srfi srfi-11)
+ (srfi srfi-64)
+ (gnu build marionette)
+ (gnu build dbus-service)
+ (gnu build jami-service))
+
+ (setenv "DBUS_SESSION_BUS_ADDRESS" "unix:path=/var/run/jami/bus")
+
+ (define marionette
+ (make-marionette (list #$vm)))
+
+ (test-runner-current (system-test-runner #$output))
+ (test-begin "jami")
+
+ (test-assert "service is running"
+ (marionette-eval
+ '(begin
+ (use-modules (gnu build jami-service))
+ (jami-service-available?))
+ marionette))
+
+ (test-assert "service can be stopped"
+ (marionette-eval
+ '(begin
+ (use-modules (gnu build jami-service)
+ (gnu services herd)
+ (rnrs base))
+ (assert (jami-service-available?))
+
+ (stop-service 'jami)
+
+ (with-retries 20 1 (not (jami-service-available?))))
+ marionette))
+
+ (test-assert "service can be restarted"
+ (marionette-eval
+ '(begin
+ (use-modules (gnu build dbus-service)
+ (gnu build jami-service)
+ (gnu services herd)
+ (rnrs base) )
+ ;; Start the service.
+ (start-service 'jami)
+ (with-retries 20 1 (jami-service-available?))
+ ;; Restart the service.
+ (restart-service 'jami)
+ (with-retries 20 1 (jami-service-available?)))
+ marionette))
+
+ (unless #$provisioning? (test-skip 1))
+ (test-assert "jami accounts provisioning, account present"
+ (marionette-eval
+ '(begin
+ (use-modules (gnu build dbus-service)
+ (gnu services herd)
+ (rnrs base))
+ ;; Accounts take some time to appear after being added.
(with-retries 20 1
- (not (zero? (status:exit-val
- (system* "pgrep" "jamid")))))))
- marionette))
-
- (test-assert "service can be restarted"
- (marionette-eval
- '(begin
- (use-modules (gnu services herd)
- (rnrs base))
- ;; Start and retrieve the current PID.
- (define pid (match (start-service 'jami)
- (#f #f)
- (('service response-parts ...)
- (match (assq-ref response-parts 'running)
- ((pid) pid)))))
- (assert (number? pid))
-
- ;; Restart the service.
- (restart-service 'jami)
-
- (define new-pid (match (start-service 'jami)
- (#f #f)
- (('service response-parts ...)
- (match (assq-ref response-parts 'running)
- ((pid) pid)))))
- (assert (number? new-pid))
-
- (not (eq? pid new-pid)))
- marionette))
-
- (unless #$provisioning? (test-skip 1))
- (test-assert "jami accounts provisioning, account present"
- (marionette-eval
- '(begin
- (use-modules (gnu services herd)
- (rnrs base))
- ;; Accounts take some time to appear after being added.
- (with-retries 20 1
- (with-shepherd-action 'jami ('list-accounts) results
+ (with-shepherd-action 'jami ('list-accounts) results
+ (let ((account (assoc-ref (car results) #$username)))
+ (assert (string=? #$username
+ (assoc-ref account
+ "Account.username")))))))
+ marionette))
+
+ (unless #$provisioning? (test-skip 1))
+ (test-assert "jami accounts provisioning, allowed-contacts"
+ (marionette-eval
+ '(begin
+ (use-modules (gnu services herd)
+ (rnrs base)
+ (srfi srfi-1))
+
+ ;; Public mode is disabled.
+ (with-shepherd-action 'jami ('list-account-details)
+ results
(let ((account (assoc-ref (car results) #$username)))
- (assert (string=? #$username
+ (assert (string=? "false"
(assoc-ref account
- "Account.username")))))))
- marionette))
-
- (unless #$provisioning? (test-skip 1))
- (test-assert "jami accounts provisioning, allowed-contacts"
- (marionette-eval
- '(begin
- (use-modules (gnu services herd)
- (rnrs base)
- (srfi srfi-1))
-
- ;; Public mode is disabled.
- (with-shepherd-action 'jami ('list-account-details)
- results
- (let ((account (assoc-ref (car results) #$username)))
- (assert (string=? "false"
- (assoc-ref account
- "DHT.PublicInCalls")))))
-
- ;; Allowed contacts match those declared in the configuration.
- (with-shepherd-action 'jami ('list-contacts) results
- (let ((contacts (assoc-ref (car results) #$username)))
- (assert (lset= string-ci=? contacts '#$%allowed-contacts)))))
- marionette))
-
- (unless #$provisioning? (test-skip 1))
- (test-assert "jami accounts provisioning, moderators"
- (marionette-eval
- '(begin
- (use-modules (gnu services herd)
- (rnrs base)
- (srfi srfi-1))
-
- ;; Moderators match those declared in the configuration.
- (with-shepherd-action 'jami ('list-moderators) results
- (let ((moderators (assoc-ref (car results) #$username)))
- (assert (lset= string-ci=? moderators '#$%moderators))))
-
- ;; Moderators can be added via the Shepherd action.
- (with-shepherd-action 'jami
- ('add-moderator "cccccccccccccccccccccccccccccccccccccccc"
- #$username) results
- (let ((moderators (car results)))
- (assert (lset= string-ci=? moderators
- (cons "cccccccccccccccccccccccccccccccccccccccc"
- '#$%moderators))))))
- marionette))
-
- (unless #$provisioning? (test-skip 1))
- (test-assert "jami service actions, ban/unban contacts"
- (marionette-eval
- '(begin
- (use-modules (gnu services herd)
- (rnrs base)
- (srfi srfi-1))
-
- ;; Globally ban a contact.
- (with-shepherd-action 'jami
- ('ban-contact "1dbcb0f5f37324228235564b79f2b9737e9a008f") _
- (with-shepherd-action 'jami ('list-banned-contacts) results
- (every (match-lambda
- ((username . banned-contacts)
- (member "1dbcb0f5f37324228235564b79f2b9737e9a008f"
- banned-contacts)))
- (car results))))
-
- ;; Ban a contact for a single account.
- (with-shepherd-action 'jami
- ('ban-contact "dddddddddddddddddddddddddddddddddddddddd"
- #$username) _
- (with-shepherd-action 'jami ('list-banned-contacts) results
- (every (match-lambda
- ((username . banned-contacts)
- (let ((found? (member "dddddddddddddddddddddddddddddddddddddddd"
- banned-contacts)))
- (if (string=? #$username username)
- found?
- (not found?)))))
- (car results)))))
- marionette))
-
- (unless #$provisioning? (test-skip 1))
- (test-assert "jami service actions, enable/disable accounts"
- (marionette-eval
- '(begin
- (use-modules (gnu services herd)
- (rnrs base))
-
- (with-shepherd-action 'jami
- ('disable-account #$username) _
- (with-shepherd-action 'jami ('list-accounts) results
- (let ((account (assoc-ref (car results) #$username)))
- (assert (string= "false"
- (assoc-ref account "Account.enable"))))))
-
- (with-shepherd-action 'jami
- ('enable-account #$username) _
- (with-shepherd-action 'jami ('list-accounts) results
- (let ((account (assoc-ref (car results) #$username)))
- (assert (string= "true"
- (assoc-ref account "Account.enable")))))))
- marionette))
-
- (unless #$provisioning? (test-skip 1))
- (test-assert "jami account parameters"
- (marionette-eval
- '(begin
- (use-modules (gnu services herd)
- (rnrs base)
- (srfi srfi-1))
-
- (with-shepherd-action 'jami ('list-account-details) results
- (let ((account-details (assoc-ref (car results)
- #$username)))
- (assert (lset<=
- equal?
- '(("Account.hostname" .
- "bootstrap.me;fallback.another.host")
- ("Account.peerDiscovery" . "false")
- ("Account.rendezVous" . "true")
- ("RingNS.uri" . "https://my.name.server"))
- account-details)))))
- marionette))
-
- (test-end))))
+ "DHT.PublicInCalls")))))
+
+ ;; Allowed contacts match those declared in the configuration.
+ (with-shepherd-action 'jami ('list-contacts) results
+ (let ((contacts (assoc-ref (car results) #$username)))
+ (assert (lset= string-ci=? contacts '#$%allowed-contacts)))))
+ marionette))
+
+ (unless #$provisioning? (test-skip 1))
+ (test-assert "jami accounts provisioning, moderators"
+ (marionette-eval
+ '(begin
+ (use-modules (gnu services herd)
+ (rnrs base)
+ (srfi srfi-1))
+
+ ;; Moderators match those declared in the configuration.
+ (with-shepherd-action 'jami ('list-moderators) results
+ (let ((moderators (assoc-ref (car results) #$username)))
+ (assert (lset= string-ci=? moderators '#$%moderators))))
+
+ ;; Moderators can be added via the Shepherd action.
+ (with-shepherd-action 'jami
+ ('add-moderator "cccccccccccccccccccccccccccccccccccccccc"
+ #$username) results
+ (let ((moderators (car results)))
+ (assert (lset= string-ci=? moderators
+ (cons "cccccccccccccccccccccccccccccccccccccccc"
+ '#$%moderators))))))
+ marionette))
+
+ (unless #$provisioning? (test-skip 1))
+ (test-assert "jami service actions, ban/unban contacts"
+ (marionette-eval
+ '(begin
+ (use-modules (gnu services herd)
+ (rnrs base)
+ (srfi srfi-1))
+
+ ;; Globally ban a contact.
+ (with-shepherd-action 'jami
+ ('ban-contact "1dbcb0f5f37324228235564b79f2b9737e9a008f") _
+ (with-shepherd-action 'jami ('list-banned-contacts) results
+ (every (match-lambda
+ ((username . banned-contacts)
+ (member "1dbcb0f5f37324228235564b79f2b9737e9a008f"
+ banned-contacts)))
+ (car results))))
+
+ ;; Ban a contact for a single account.
+ (with-shepherd-action 'jami
+ ('ban-contact "dddddddddddddddddddddddddddddddddddddddd"
+ #$username) _
+ (with-shepherd-action 'jami ('list-banned-contacts) results
+ (every (match-lambda
+ ((username . banned-contacts)
+ (let ((found? (member "dddddddddddddddddddddddddddddddddddddddd"
+ banned-contacts)))
+ (if (string=? #$username username)
+ found?
+ (not found?)))))
+ (car results)))))
+ marionette))
+
+ (unless #$provisioning? (test-skip 1))
+ (test-assert "jami service actions, enable/disable accounts"
+ (marionette-eval
+ '(begin
+ (use-modules (gnu services herd)
+ (rnrs base))
+
+ (with-shepherd-action 'jami
+ ('disable-account #$username) _
+ (with-shepherd-action 'jami ('list-accounts) results
+ (let ((account (assoc-ref (car results) #$username)))
+ (assert (string= "false"
+ (assoc-ref account "Account.enable"))))))
+
+ (with-shepherd-action 'jami
+ ('enable-account #$username) _
+ (with-shepherd-action 'jami ('list-accounts) results
+ (let ((account (assoc-ref (car results) #$username)))
+ (assert (string= "true"
+ (assoc-ref account "Account.enable")))))))
+ marionette))
+
+ (unless #$provisioning? (test-skip 1))
+ (test-assert "jami account parameters"
+ (marionette-eval
+ '(begin
+ (use-modules (gnu services herd)
+ (rnrs base)
+ (srfi srfi-1))
+
+ (with-shepherd-action 'jami ('list-account-details) results
+ (let ((account-details (assoc-ref (car results)
+ #$username)))
+ (assert (lset<=
+ equal?
+ '(("Account.hostname" .
+ "bootstrap.me;fallback.another.host")
+ ("Account.peerDiscovery" . "false")
+ ("Account.rendezVous" . "true")
+ ("RingNS.uri" . "https://my.name.server"))
+ account-details)))))
+ marionette))
+
+ (test-end)))))
(gexp->derivation (if provisioning?
"jami-provisioning-test"
@@ -357,7 +341,3 @@ accounts provisioning feature of the service."
(name "jami-provisioning")
(description "Provisioning test for the jami service.")
(value (run-jami-test #:provisioning? #t))))
-
-;; Local Variables:
-;; eval: (put 'with-retries 'scheme-indent-function 2)
-;; End: