aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017, 2020, 2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2022 Simon Tournier <zimon.toutoune@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 (test-cache)
  #:use-module (guix cache)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-19)
  #:use-module (srfi srfi-64)
  #:use-module ((guix build syscalls) #:select (lock-file))
  #:use-module ((guix utils) #:select (call-with-temporary-directory))
  #:use-module ((rnrs io ports) #:select (get-string-all))
  #:use-module (ice-9 match))

(test-begin "cache")

(test-equal "remove-expired-cache-entries"
  '("o" "l" "d")
  (let* ((removed '())
         (now     (time-second (current-time time-monotonic)))
         (ttl     100)
         (stamp   (match-lambda
                    ((or "n" "e" "w") (+ now 100))
                    ((or "o" "l" "d") (- now 100))))
         (delete  (lambda (entry)
                    (set! removed (cons entry removed)))))
    (remove-expired-cache-entries (reverse '("n" "e" "w"
                                             "o" "l" "d"))
                                  #:entry-expiration stamp
                                  #:delete-entry delete)
    removed))

(define-syntax-rule (test-cache-cleanup cache exp ...)
  (call-with-temporary-directory
   (lambda (cache)
     (let* ((deleted '())
            (delete! (lambda (entry)
                       (set! deleted (cons entry deleted)))))
       exp ...
       (maybe-remove-expired-cache-entries cache
                                           (const '("a" "b" "c"))
                                           #:entry-expiration (const 0)
                                           #:delete-entry delete!)
       (reverse deleted)))))

(test-equal "maybe-remove-expired-cache-entries, first cleanup"
  '("a" "b" "c")
  (test-cache-cleanup cache))

(test-equal "maybe-remove-expired-cache-entries, no cleanup needed"
  '()
  (test-cache-cleanup cache
    (call-with-output-file (string-append cache "/last-expiry-cleanup")
      (lambda (port)
        (display (+ (time-second (current-time time-monotonic)) 100)
                 port)))))

(test-equal "maybe-remove-expired-cache-entries, cleanup needed"
  '("a" "b" "c")
  (test-cache-cleanup cache
    (call-with-output-file (string-append cache "/last-expiry-cleanup")
      (lambda (port)
        (display 0 port)))))

(let ((pid #f))
  (test-equal "maybe-remove-expired-cache-entries, cleanup needed but lock taken"
    '()
    (test-cache-cleanup cache
      (let ((in+out (pipe)))
        (match (primitive-fork)
          (0 (dynamic-wind
               (const #t)
               (lambda ()
                 (close-port (car in+out))
                 (let ((port (lock-file
                              (string-append cache "/last-expiry-cleanup"))))
                   (display 0 port)
                   (display "done!\n" (cdr in+out))
                   (close-port (cdr in+out))
                   (sleep 100)))
               (lambda ()
                 (primitive-exit 0))))
          (n
           (set! pid n)
           (close-port (cdr in+out))
           (pk 'chr (get-string-all (car in+out)))
           (close-port (car in+out)))))))

  (when pid (kill pid SIGKILL)))

(test-equal "maybe-remove-expired-cache-entries, empty cache"
  '("a" "b" "c")
  (test-cache-cleanup cache
    (call-with-output-file (string-append cache "/last-expiry-cleanup")
      (lambda (port)
        (display "" port)))))

(test-equal "maybe-remove-expired-cache-entries, corrupted cache"
  '("a" "b" "c")
  (test-cache-cleanup cache
    (call-with-output-file (string-append cache "/last-expiry-cleanup")
      (lambda (port)
        (display "1\"34657890" port)))))

(test-end "cache")

;;; Local Variables:
;;; eval: (put 'test-cache-cleanup 'scheme-indent-function 1)
;;; End:
span>Ludovic Courtès 2017-01-24mapped-devices: 'source' can be a list of strings....Reported by myglc2 <myglc2@gmail.com>. * gnu/system/mapped-devices.scm (<mapped-device>)[source]: Update comment to note that this can be a list of strings. Ludovic Courtès 2017-01-16file-systems: 'file-system-needed-for-boot?' is #t for parents of the store....Suggested by John Darrington <john@darrington.wattle.id.au>. * gnu/system/file-systems.scm (%not-slash): New variable. (file-prefix?): New procedure. (file-system-needed-for-boot?): Use it to check whether FS holds the store. * tests/file-systems.scm ("file-system-needed-for-boot?"): New test. * gnu/tests/install.scm (%separate-store-os)[file-systems]: Remove 'needed-for-boot?' field for "/gnu". Ludovic Courtès 2017-01-10system: Add btrfs file system support....* gnu/build/file-systems.scm (%btrfs-endianness, btrfs-superblock?, read-btrfs-superblock, btrfs-superblock-uuid, btrfs-superblock-volume-name, check-btrfs-file-system): New variables. (%paritition-label-readers, %partition-uuid-readers): Add btrfs readers. * gnu/system/linux-initrd.scm (linux-modules): Add btrfs modules when a btrfs file-system is used. * gnu/tests/install.scm (%btrfs-root-os %btrfs-root-os-source, %btrfs-root-installation-script, %test-btrfs-root-os): New system test. * doc/guix.texi: Adjust accordingly. Fixes <http://bugs.gnu.org/19280>. David Craven 2017-01-03system: grub: Load relevant EFI modules on EFI systems....* gnu/system/grub.scm (eye-candy)[setup-gfxterm-body]: Add 'insmod' invocations when ${grub_platform} is "efi". Ludovic Courtès 2016-12-19install: The list of services is now a plain list....* gnu/system/install.scm (installation-services): Rename to... (%installation-services): ... this. Turn into a list instead of a thunk. Ludovic Courtès 2016-12-18linux-initrd: Support FAT filesystems....* gnu/system/linux-initrd.scm (base-initrd): When a FAT filesystem is present: Add fatfsck/static in 'helper-packages'; and add nls_iso8859-1 in 'linux-modules'. Marius Bakke 2016-12-16install: Add dosfstools....* gnu/system/install.scm (installation-os)[packages]: Add DOSFSTOOLS. Ludovic Courtès 2016-11-28doc: Suggest installing gvfs....* gnu/system/examples/desktop.tmpl: Add gvfs to the system-wide list of packages. Ricardo Wurmus 2016-11-24doc: Document encrypted root partitions....This is a followup to f7f292d359e0eb77617f4ecf6b3164f868ec1784. * doc/guix.texi (Preparing for Installation): Give commands for encrypted root installation. (Proceeding with the Installation): Add item about mapped devices. (File Systems): Mention that 'dependencies' can list <mapped-device> objects. * gnu/system/examples/desktop.tmpl (mapped-devices): New field. (file-systems): Add 'dependencies' field. Ludovic Courtès 2016-11-23mapped-devices: Use 'cryptsetup-static' in 'luks-device-mapping'....* gnu/system/mapped-devices.scm (open-luks-device): Use CRYPTSETUP-STATIC instead of CRYPTSETUP. Use 'file-append'. (close-luks-device): Likewise. Ludovic Courtès 2016-11-19vm: Disable initrd-time QEMU networking for VM images....Fixes <http://bugs.gnu.org/24943>. Reported by dian_cecht@zoho.com. * gnu/system/vm.scm (system-qemu-image)[initrd]: Remove #:qemu-networking? #t. (virtualized-operating-system): Likewise Ludovic Courtès 2016-11-10container: Pass a list of <file-system> objects as things to mount....* gnu/build/linux-container.scm (mount-file-systems): 'mounts' is now a list of <file-system> objects instead of a list of lists ("specs"). Add call to 'file-system->spec' as the argument to 'mount-file-system'. (run-container, call-with-container): Adjust docstring accordingly. * gnu/system/file-systems.scm (spec->file-system): New procedure. * gnu/system/linux-container.scm (container-script)[script]: Call 'spec->file-system' inside gexp. * guix/scripts/environment.scm (launch-environment/container): Remove call to 'file-system->spec'. * tests/containers.scm ("call-with-container, mnt namespace") ("call-with-container, mnt namespace, wrong bind mount"): Pass a list of <file-system> objects. Ludovic Courtès 2016-11-10linux-container: Use 'source-module-closure' when generating the script....* gnu/system/linux-container.scm (container-script)[script]: Use 'source-module-closure' in 'with-imported-modules' form. Ludovic Courtès 2016-11-08system: Use grub from bootloader configuration....* gnu/system/grub.scm (gnu): Export grub-configuration-grub. * guix/scripts/system.scm (perform-action): Use it. (define-module): Don't import (gnu packages grub). Co-authored-by: Danny Milosavljevic <dannym@scratchpost.org> Marius Bakke 2016-11-06gnu: Remove comment which is factually incorrect....* gnu/system/pam.scm: Remove incorrect comment. John Darrington 2016-10-30system: Record store file system info in each generation....* gnu/system.scm (<boot-parameters>)[store-device, store-mount-point]: New fields. (read-boot-parameters): Initialize them. (operating-system-grub.cfg): Likewise. Remove STORE-FS argument from call to 'grub-configuration-file'. (operating-system-parameters-file): Add 'store' element in 'boot-parameters'. * gnu/system/grub.scm (strip-mount-point): Replace 'store-fs' parameter by 'mount-point'; adjust accordingly. Adjust callers. (<menu-entry>)[device, device-mount-point]: New fields. (eye-candy): Replace 'root-fs' parameter by 'store-device'; add 'store-mount-point'. Use keyword arguments for 'system' and 'port'. (grub-root-search): Remove 'root-fs' by 'device' and adjust accordingly. (grub-configuration-file): Remove 'store-fs' parameter. Adjust accordingly. * guix/scripts/system.scm (previous-grub-entries): Initialize 'device' and 'device-mount-point' fields from PARAMS. * doc/guix.texi (GRUB Configuration): Document 'device' and 'device-mount-point'. Explain that 'linux' can be prefixed by a GRUB device name. Co-authored-by: Ludovic Courtès <ludo@gnu.org> Chris Marusich