aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2020 Oleg Pykhalov <go.wigust@gmail.com>
;;;
;;; 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 package-management)
  #:use-module (gnu packages base)
  #:use-module (gnu packages package-management)
  #:use-module (gnu services)
  #:use-module (gnu services networking)
  #:use-module (gnu services nix)
  #:use-module (gnu system)
  #:use-module (gnu system vm)
  #:use-module (gnu tests)
  #:use-module (guix gexp)
  #:use-module (guix packages)
  #:export (%test-nix))

;;; Commentary:
;;;
;;; This module provides a test definition for the nix-daemon
;;;
;;; Code:

(define* (run-nix-test name test-os)
  "Run tests in TEST-OS, which has nix-daemon running."
  (define os
    (marionette-operating-system
     test-os
     #:imported-modules '((gnu services herd))))

  (define vm
    (virtual-machine
     (operating-system os)
     (port-forwardings '((8080 . 80)))
     (memory-size 1024)))

  (define test
    (with-imported-modules '((gnu build marionette))
      #~(begin
          (use-modules (srfi srfi-11)
                       (srfi srfi-64)
                       (gnu build marionette)
                       (web client)
                       (web response))

          (define marionette
            (make-marionette (list #$vm)))

          (test-runner-current (system-test-runner #$output))
          (test-begin #$name)

          ;; 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))

          (test-assert "Nix daemon running"
            (marionette-eval
             '(begin
                ;; Wait for nix-daemon to be up and running.
                (start-service 'nix-daemon)
                (zero? (system* (string-append #$nix "/bin/nix")
                                "--experimental-features" "nix-command"
                                "store" "ping" "--store" "daemon")))
             marionette))

          (test-end))))

  (gexp->derivation (string-append name "-test") test))

(define %nix-os
  ;; Return operating system under test.
  (let ((base-os
         (simple-operating-system
          (service nix-service-type)
          (service dhcp-client-service-type))))
    (operating-system
      (inherit base-os)
      (packages (cons nix (operating-system-packages base-os))))))

(define %test-nix
  (system-test
   (name "nix")
   (description "Connect to a running nix-daemon")
   (value (run-nix-test name %nix-os))))

;;; package-management.scm ends here
rg (default (xorg-configuration))) (xauth-path sddm-configuration-xauth-path (default (file-append xauth "/bin/xauth"))) (xephyr-path sddm-configuration-xephyr-path (default (file-append xorg-server "/bin/Xephyr"))) (xdisplay-start sddm-configuration-xdisplay-start (default (file-append sddm "/share/sddm/scripts/Xsetup"))) (xdisplay-stop sddm-configuration-xdisplay-stop (default (file-append sddm "/share/sddm/scripts/Xstop"))) (xsession-command sddm-configuration-xsession-command (default (xinitrc))) (xsessions-directory sddm-configuration-xsessions-directory (default "/run/current-system/profile/share/xsessions")) (minimum-vt sddm-configuration-minimum-vt (default 7)) ;; [Autologin] (auto-login-user sddm-configuration-auto-login-user (default "")) ;; valid values are xfce.desktop gnome.desktop weston.desktop hawaii.desktop (auto-login-session sddm-configuration-auto-login-session (default "")) (relogin? sddm-configuration-relogin? (default #f))) (define (sddm-configuration-file config) (mixed-text-file "sddm.conf" " [General] DisplayServer=" (sddm-configuration-display-server config) " Numlock=" (sddm-configuration-numlock config) " HaltCommand=" (sddm-configuration-halt-command config) " RebootCommand=" (sddm-configuration-reboot-command config) " [Users] DefaultPath=" (sddm-configuration-default-path config) " MinimumUid=" (number->string (sddm-configuration-minimum-uid config))" MaximumUid=" (number->string (sddm-configuration-maximum-uid config))" RememberLastUser=" (if (sddm-configuration-remember-last-user? config) "true" "false") " RememberLastSession=" (if (sddm-configuration-remember-last-session? config) "true" "false") " HideUsers=" (sddm-configuration-hide-users config) " Hideshells=" (sddm-configuration-hide-shells config) " [Theme] Current=" (sddm-configuration-theme config) " ThemeDir=" (sddm-configuration-themes-directory config) " FacesDir=" (sddm-configuration-faces-directory config) " [Wayland] SessionCommand=" (sddm-configuration-session-command config) " SessionDir=" (sddm-configuration-sessions-directory config) " [X11] ServerPath=" (xorg-start-command (sddm-configuration-xorg config)) " XauthPath=" (sddm-configuration-xauth-path config) " XephyrPath=" (sddm-configuration-xephyr-path config) " DisplayCommand=" (sddm-configuration-xdisplay-start config) " DisplayStopCommand=" (sddm-configuration-xdisplay-stop config) " SessionCommand=" (sddm-configuration-xsession-command config) " SessionDir=" (sddm-configuration-xsessions-directory config) " MinimumVT=" (number->string (sddm-configuration-minimum-vt config)) " ServerArguments=" (string-join (xorg-configuration-server-arguments (sddm-configuration-xorg config))) " [Autologin] User=" (sddm-configuration-auto-login-user config) " Session=" (sddm-configuration-auto-login-session config) " Relogin=" (if (sddm-configuration-relogin? config) "true" "false") " ")) (define (sddm-shepherd-service config) "Return a <shepherd-service> for sddm with CONFIG." (define sddm (sddm-configuration-sddm config)) (define qt6? (version-prefix? "6" (package-version (lookup-package-input sddm "qtbase")))) (define sddm-command #~(list (string-append #$sddm "/bin/sddm"))) (list (shepherd-service (documentation "SDDM display manager.") (requirement '(user-processes elogind pam)) (provision '(xorg-server display-manager)) (start #~(make-forkexec-constructor #$sddm-command ;; some theme need icon,qml,data so add path to env. #:environment-variables (cons* "XDG_DATA_DIRS=/run/current-system/profile/share" "XDG_CONFIG_DIRS=/run/current-system/profile/etc/xdg" #$(string-append "QT_PLUGIN_PATH=/run/current-system/profile/lib/qt" (if qt6? "6" "5") "/plugins") #$(string-append "QML" (if qt6? "" "2") "_IMPORT_PATH=/run/current-system/profile/lib/qt" (if qt6? "6" "5") "/qml") (default-environment-variables)))) (stop #~(make-kill-destructor))))) (define (sddm-etc-service config) (list `("sddm.conf" ,(sddm-configuration-file config)))) (define (sddm-pam-service config) "Return a PAM service for @command{sddm}." (pam-service (name "sddm") (auth (list (pam-entry (control "requisite") (module "pam_nologin.so")) (pam-entry (control "required") (module "pam_env.so")) (pam-entry (control "required") (module "pam_succeed_if.so") (arguments (list (string-append "uid >= " (number->string (sddm-configuration-minimum-uid config))) "quiet"))) ;; should be factored out into system-auth (pam-entry (control "required") (module "pam_unix.so")))) (account (list ;; should be factored out into system-account (pam-entry (control "required") (module "pam_unix.so")))) (password (list ;; should be factored out into system-password (pam-entry (control "required") (module "pam_unix.so") (arguments (list "sha512" "shadow" "try_first_pass"))))) (session (list ;; lfs has a required pam_limits.so ;; should be factored out into system-session (pam-entry (control "required") (module "pam_unix.so")))))) (define (sddm-greeter-pam-service) "Return a PAM service for @command{sddm-greeter}." (pam-service (name "sddm-greeter") (auth (list ;; Load environment from /etc/environment and ~/.pam_environment (pam-entry (control "required") (module "pam_env.so")) ;; Always let the greeter start without authentication (pam-entry (control "required") (module "pam_permit.so")))) (account (list ;; No action required for account management (pam-entry (control "required") (module "pam_permit.so")))) (password (list ;; Can't change password (pam-entry (control "required") (module "pam_deny.so")))) (session (list ;; Setup session (pam-entry (control "required") (module "pam_unix.so")))))) (define (sddm-autologin-pam-service config) "Return a PAM service for @command{sddm-autologin}" (pam-service (name "sddm-autologin") (auth (list (pam-entry (control "requisite") (module "pam_nologin.so")) (pam-entry (control "required") (module "pam_succeed_if.so") (arguments (list (string-append "uid >= " (number->string (sddm-configuration-minimum-uid config))) "quiet"))) (pam-entry (control "required") (module "pam_permit.so")))) (account (list (pam-entry (control "include") (module "sddm")))) (password (list (pam-entry (control "required") (module "pam_deny.so")))) (session (list (pam-entry (control "include") (module "sddm")))))) (define (sddm-pam-services config) (list (sddm-pam-service config) (sddm-greeter-pam-service) (sddm-autologin-pam-service config))) (define %sddm-accounts (list (user-group (name "sddm") (system? #t)) (user-account (name "sddm") (group "sddm") (system? #t) (comment "SDDM user") (home-directory "/var/lib/sddm") (shell (file-append shadow "/sbin/nologin"))))) ;; Add default themes to profile (define sddm-profile-service (compose list sddm-configuration-sddm)) (define sddm-service-type (handle-xorg-configuration sddm-configuration (service-type (name 'sddm) (extensions (list (service-extension shepherd-root-service-type sddm-shepherd-service) (service-extension etc-service-type sddm-etc-service) (service-extension pam-root-service-type sddm-pam-services) (service-extension account-service-type (const %sddm-accounts)) (service-extension profile-service-type sddm-profile-service) (service-extension localed-service-type (compose xorg-configuration-keyboard-layout sddm-configuration-xorg)))) (default-value (sddm-configuration)) (description "Run SDDM, a display and log-in manager for X11 and Wayland."))))