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:
resentty): Likewise. * gnu/packages/screen.scm (byobu): Likewise. * gnu/packages/storage.scm (ceph): Likewise. * gnu/packages/syndication.scm (liferea): Likewise. * gnu/packages/task-management.scm (blanket): Likewise. * gnu/packages/text-editors.scm (manuskript): Likewise. * gnu/packages/version-control.scm (gitless, cgit, git-when-merged) (git-imerge): Likewise. * gnu/packages/video.scm (pitivi): Likewise. * gnu/packages/virtualization.scm (criu): Likewise. * gnu/packages/xfce.scm (catfish): Likewise. Maxim Cournoyer 2021-01-03gnu: sddm: Update to 0.19.0....* gnu/packages/display-managers.scm (sddm): Update to 0.19.0. Signed-off-by: Efraim Flashner <efraim@flashner.co.il> Vincent Legoll atches/gcc-8-sort-libtool-find-output.patch: New patch. * gnu/local.mk (dist_patch_DATA): Register it. * gnu/packages/gcc.scm (gcc-8)[source]: Apply it. Carl Dong 2021-06-13gnu: GCC: Switch to GCC 10....* gnu/packages/patches/gcc-cross-gxx-include-dir.patch: New file. * gnu/packages/patches/gcc-10-cross-environment-variables.patch: New file. * gnu/packages/gcc.scm (gcc): Point to GCC-10. (gcc-objc): Point to GCC-OBJC-10. (gcc-objc++): Point to GCC-OBJC++-10. * gnu/packages/cross-base.scm (cross-gcc)[source](patches): Apply the new patches. Marius Bakke 2021-06-06Merge branch 'master' into core-updates... Conflicts: gnu/local.mk gnu/packages/algebra.scm gnu/packages/bioinformatics.scm gnu/packages/curl.scm gnu/packages/docbook.scm gnu/packages/emacs-xyz.scm gnu/packages/maths.scm gnu/packages/plotutils.scm gnu/packages/python-web.scm gnu/packages/python-xyz.scm gnu/packages/radio.scm gnu/packages/readline.scm gnu/packages/tls.scm gnu/packages/xml.scm gnu/packages/xorg.scm Marius Bakke 2021-06-01gnu: gcc-9: Update to 9.4.0....* gnu/packages/gcc.scm (gcc-9): Update to 9.4.0. Efraim Flashner 2021-05-22Merge branch 'master' into core-updatesMarius Bakke 2021-05-22gnu: gfortran: Remove obsolete workaround....* gnu/packages/gcc.scm (gfortran): Use GCC directly. Marius Bakke 2021-05-15gnu: gcc-8: Update to 8.5.0....* gnu/packages/gcc.scm (gcc-8): Update to 8.5.0. Efraim Flashner 2021-05-09Merge branch 'master' into core-updates... Conflicts: gnu/local.mk gnu/packages/bioinformatics.scm gnu/packages/django.scm gnu/packages/gtk.scm gnu/packages/llvm.scm gnu/packages/python-web.scm gnu/packages/python.scm gnu/packages/tex.scm guix/build-system/asdf.scm guix/build/emacs-build-system.scm guix/profiles.scm Marius Bakke 2021-04-27gnu: Add gdc-11....* gnu/packages/gcc.scm (gdc-11): New variable. Efraim Flashner 2021-04-27gnu: Add gcc-toolchain-11....* gnu/packages/gcc.scm (gcc-11): New variable. * gnu/packages/commencement.scm (gcc-toolchain-11): New variable. Efraim Flashner 2021-04-16Merge remote-tracking branch 'origin/master' into core-updates... Conflicts: gnu/local.mk gnu/packages/boost.scm gnu/packages/chez.scm gnu/packages/compression.scm gnu/packages/crates-io.scm gnu/packages/docbook.scm gnu/packages/engineering.scm gnu/packages/gcc.scm gnu/packages/gl.scm gnu/packages/gtk.scm gnu/packages/nettle.scm gnu/packages/python-check.scm gnu/packages/python-xyz.scm gnu/packages/radio.scm gnu/packages/rust.scm gnu/packages/sqlite.scm guix/build-system/node.scm Efraim Flashner 2021-04-12gnu: gcc: Update gcc to 8....* gnu/packages/gcc.scm (gcc): Define as gcc-8. * gnu/packages/commencement.scm (gcc-toolchain-7): Use make-gcc-toolchain procedure. (gcc-toolchain-8): Define as gcc-toolchain. * gnu/packages/game-development (python2-renpy)[native-inputs], * gnu/packages/gnome.scm (gnome-commander)[native-inputs], * gnu/packages/wm.scm (waybar)[native-inputs]: Remove gcc-8. Efraim Flashner 2021-04-09gnu: gcc-10: Update to 10.3.0....* gnu/packages/gcc.scm (gcc-10): Update to 10.3.0. Efraim Flashner 2021-03-25gnu: gcc: Fix comment about gfortran....Added by: cb4805e34c9997edca14743516b9a0fde6303d1c Fixes: 0681f05486d901c92637c098bb7afddef35068b0 * gnu/packages/gcc.scm (gcc): Fix comment about gfortran. Signed-off-by: Christopher Baines <mail@cbaines.net> Vincent Legoll 2021-03-24gnu: make-libstdc++: Unconditionally apply powerpc substitution....* gnu/packages/gcc.scm (make-libstdc++)[arguments]: Use modify-phases. Apply powerpc directory substitution on all architectures. Efraim Flashner 2021-03-24gnu: gcc-4.7: Unconditionally apply powerpc substitution....* gnu/packages/gcc.scm (gcc-4.7)[arguments]: Adjust 'pre-configure phase to always apply powerpc substitution. Efraim Flashner 2021-03-24Merge remote-tracking branch 'origin/master' into core-updatesEfraim Flashner 2021-03-23gnu: gcc-4.7: On powerpc64le, fix /lib64 references....Fixes: <https://bugs.gnu.org/46253>. * gnu/packages/gcc.scm (gcc-4.7)[#:phases][pre-configure]: When the gcc/config/rs6000 directory exists, replace "/lib64" with "/lib" in all files within it. Note that this fix will be picked up by any package that re-uses the pre-configure phase from gcc-4.7 (e.g., all the usual gcc packages). (make-libstdc++)[#:phases][fix-rs6000-libdir]: New phase, which does the same as above. It was necessary to duplicate the fix here because make-libstdc++ does not re-use the pre-configure phase from gcc-4.7. Chris Marusich