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:
>Danny Milosavljevic * gnu/packages/astronomy.scm (stellarium): Update to 0.15.2. 2017-06-12gnu: stellarium: Fix build with Qt 5.9.Danny Milosavljevic * gnu/packages/astronomy.scm (stellarium)[arguments]: Add phase "patch-version-check". 2017-06-08gnu: gnuastro: Update to 0.3.Ludovic Courtès * gnu/packages/astronomy.scm (gnuastro): Update to 0.3. Adjust as suggested by 'guix lint'. 2017-03-30gnu: Use HTTPS for almost all gnu.org HOME-PAGEs.Tobias Geerinckx-Rice All HTTP gnu.org (and supported subdomain) HOME-PAGEs changed to HTTPS. 2017-03-20gnu: Add comments on why setting QT_QPA_PLATFORM for tests.Hartmut Goebel * gnu/packages/astronomy.scm (stellarium): Add comment. * gnu/packages/display-managers.scm (greenisland): dito. * gnu/packages/kde-frameworks.scm (kguiaddons, kwidgetsaddons, kcompletion, baloo, kbookmarks, kconfigwidgtes, kdesignerplugin, kemoticons, kglobalaccel, kiconthemes, kio, knewstuff, kparts, kpeople, krunner, kservice, ktexteditor, ktextwidgets, kxmlgui, plasma-framework): dito. * gnu/packages/qt.scm (qtsvg): dito. 2017-03-04gnu: stellarium: Use modular Qt.Danny Milosavljevic * gnu/packages/astronomy.scm (stellarium)[inputs]: Remove qt. Add qtbase, qtmultimedia, qtscript, qtserialport. [native-inputs]: Add qtbase, qttools. 2017-03-03gnu: stellarium: Fix package formatting.Danny Milosavljevic * gnu/packages/astronomy.scm (stellarium): Fix package formatting. 2017-03-02gnu: Merge the two stellaria into one.John Darrington * gnu/packages/astronomy.scm (stellaruim): Merge details from stellarium-0.14. * gnu/packages/education.scm (stellarium): Remove variable. 2017-03-02gnu: Add stellarium.John Darrington * gnu/packages/astronomy.scm (stellarium): New variable. 2017-01-15gnu: wcslib: Update to 5.16.Tobias Geerinckx-Rice * gnu/packages/astronomy.scm (wcslib): Update to 5.16. 2016-10-08gnu: gnuastro: Update to 0.2.Efraim Flashner * gnu/packages/astronomy.scm (gnuastro): Update to 0.2. [home-page]: Use https. 2016-09-12gnu: (cfitsio, wcslib): Change return values of custom phases.John Darrington * gnu/packages/astronomy.scm (cfitsio, wcslib): Return #t from patch phases. 2016-08-31gnu: wcslib: Correct formatting and grammar.John Darrington * gnu/packages/astronomy.scm (wcslib): Minor whitespace and grammatical changes. 2016-08-31gnu: Add gnuastroJohn Darrington * gnu/packages/astronomy.scm (gnuastro): New variable. 2016-08-31gnu: Add wcslibJohn Darrington * gnu/packages/astronomy.scm (wcslib): New variable. 2016-08-31gnu: Add cfitsioJohn Darrington * gnu/packages/astronomy.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add it.