aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2017-2018, 2020-2021, 2024 Ludovic Courtès <ludo@gnu.org>
;;;
;;; 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-store-database)
  #:use-module (guix tests)
  #:use-module (guix store)
  #:use-module (guix store database)
  #:use-module (guix build store-copy)
  #:use-module ((guix build utils)
                #:select (mkdir-p delete-file-recursively
                          call-with-temporary-output-file))
  #:use-module (srfi srfi-26)
  #:use-module (srfi srfi-64))

;; Test the (guix store database) module.

(define %store
  (open-connection-for-tests))


(test-begin "store-database")

(test-assert "register-items"
  (let ((file (string-append (%store-prefix) "/" (make-string 32 #\f)
                             "-fake")))
    (when (valid-path? %store file)
      (delete-paths %store (list file)))
    (false-if-exception (delete-file file))

    (let ((ref (add-text-to-store %store "ref-of-fake" (random-text)))
          (drv (string-append file ".drv")))
      (call-with-output-file file
        (cut display "This is a fake store item.\n" <>))
      (reset-timestamps file)
      (with-database (store-database-file) db
        (register-items db (list (store-info file drv (list ref)))))

      (and (valid-path? %store file)
           (equal? (references %store file) (list ref))
           (null? (valid-derivers %store file))
           (null? (referrers %store file))
           (list (stat:mtime (lstat file))
                 (stat:mtime (lstat ref)))))))

(test-equal "register-items, directory"
  '(1 1 1)
  (let ((file (string-append (%store-prefix) "/" (make-string 32 #\f)
                             "-fake-directory")))
    (when (valid-path? %store file)
      (delete-paths %store (list file)))
    (false-if-exception (delete-file-recursively file))

    (let ((drv (string-append file ".drv")))
      (mkdir-p (string-append file "/a"))
      (call-with-output-file (string-append file "/a/b")
        (const #t))
      (reset-timestamps file)
      (with-database (store-database-file) db
        (register-items db (list (store-info file drv '()))))

      (and (valid-path? %store file)
           (null? (references %store file))
           (null? (valid-derivers %store file))
           (null? (referrers %store file))
           (list (stat:mtime (lstat file))
                 (stat:mtime (lstat (string-append file "/a")))
                 (stat:mtime (lstat (string-append file "/a/b"))))))))

(test-equal "new database"
  (list 1 2)
  (call-with-temporary-output-file
   (lambda (db-file port)
     (delete-file db-file)
     (with-database db-file db
       (register-valid-path db
                            #:path "/gnu/foo"
                            #:references '()
                            #:deriver "/gnu/foo.drv"
                            #:hash (string-append "sha256:" (make-string 64 #\e))
                            #:nar-size 1234)
       (register-valid-path db
                            #:path "/gnu/bar"
                            #:references '("/gnu/foo")
                            #:deriver "/gnu/bar.drv"
                            #:hash (string-append "sha256:" (make-string 64 #\a))
                            #:nar-size 4321)
       (list (valid-path-id db "/gnu/foo")
             (valid-path-id db "/gnu/bar"))))))

(test-assert "register-valid-path with unregistered references"
  ;; Make sure we get a "NOT NULL constraint failed: Refs.reference" error
  ;; when we try to add references that are not registered yet.  Better safe
  ;; than sorry.
  (call-with-temporary-output-file
   (lambda (db-file port)
     (delete-file db-file)
     (catch 'sqlite-error
       (lambda ()
         (with-database db-file db
           (register-valid-path db #:path "/gnu/foo"
                                #:references '("/gnu/bar")
                                #:deriver "/gnu/foo.drv"
                                #:hash (string-append "sha256:" (make-string 64 #\e))
                                #:nar-size 1234))
         #f)
       (lambda args
         (pk 'welcome-exception! args)
         #t)))))

(test-equal "register-valid-path with incorrect size"
  'out-of-range
  (call-with-temporary-output-file
   (lambda (db-file port)
     (delete-file db-file)
     (catch #t
       (lambda ()
         (with-database db-file db
           (register-valid-path db #:path "/gnu/foo"
                                #:references '("/gnu/bar")
                                #:deriver "/gnu/foo.drv"
                                #:hash (string-append "sha256:" (make-string 64 #\e))
                                #:nar-size -1234))
         #f)
       (lambda (key . _)
         key)))))

(test-end "store-database")
ge-Id: Ia8df618178066cad320eecea0299337224e23a73 Janneke Nieuwenhuizen 2024-04-14maint: Help help2man generate reproducible man-pages....* doc/local.mk (SOURCE_DATE_EPOCH): New exported variable. Change-Id: I6636693695d5502657f1475d93d31949e0b0b39d Janneke Nieuwenhuizen 2024-04-14maint: Generate 'doc/version.texi' reproducibly....* doc/local.mk ($(srcdir)/doc/stamp-vti): New rule (overriding one provided by Automake). Co-authored-by: Janneke Nieuwenhuizen <janneke@gnu.org> Change-Id: If44965e9a3ecfb45865c58ee7a558951be8d15ae Timothy Sample 2024-04-03maint: Fix help2man for guix subcommands with `make V=2'....* doc/local.mk ($(srcdir)/%D%/guix-%.1): Use AM_V_HELP2MAN and cater for make's `@' silencing at the start of the command. Change-Id: Id80c48f0d7697167fea64700a7fe140003732d28 Janneke Nieuwenhuizen 2024-04-01nls: Update translations....* po/guix/ar.po: New file. * po/guix/LINGUAS: Add 'ar'. * po/doc/guix-cookbook.pt_BR.po: New file. * po/doc/local.mk: Add 'pt_BR' cookbook. * doc/local.mk: Add 'pt_BR' cookbook. * doc/htmlxref.cnf: Update URLs for cookbook. * doc/build.scm (%cookbook-languages): Add 'ko', 'pt_BR'. * doc/guix-cookbook.texi (Top): Mention 'ko', 'pt_BR' cookbook. Change-Id: Id1846ca100263b3fc1fa2ed52654c670270ee809 Florian Pelz 2023-08-29doc: Fix a potential problem in man page generation rule....Since commit ca8acad3 ("build: Add dependency on guix script for help2man targets."), the $< special Make variable in the recipe was matching scripts/guix instead of the more specific 'guix/scripts/%.scm' source. * doc/local.mk ($(srcdir)/%D%/guix-%.1): Move the scripts/guix prerequisite to the end. Maxim Cournoyer 2023-08-25build: Add dependency on guix script for help2man targets....* doc/local.mk: Add dependency on guix script for help2man targets. Signed-off-by: Ludovic Courtès <ludo@gnu.org> Josselin Poiret 2022-11-19doc: Build more man pages....* doc/local.mk (sub_commands_mans): Add guix-container.1, guix-copy.1, guix-describe.1, guix-git.1, guix-graph.1, guix-home.1, guix-offload.1, guix-pack.1, guix-processes.1, guix-repl.1, guix-shell.1, guix-style.1. Signed-off-by: Ludovic Courtès <ludo@gnu.org> Hilton Chain 2022-04-02nls: Enforce translation thresholds....* po/doc/guix-cookbook.es.po: Remove file. * po/doc/guix-cookbook.fa.po: Remove file. * po/doc/guix-cookbook.fi.po: Remove file. * po/doc/guix-cookbook.pt_BR.po: Remove file. * po/doc/guix-cookbook.ru.po: Remove file. * po/doc/guix-cookbook.uk.po: Remove file. * po/doc/guix-cookbook.zh_Hans.po: Remove file. * po/doc/guix-manual.fa.po: Remove file. * po/doc/guix-manual.fi.po: Remove file. * po/doc/guix-manual.it.po: Remove file. * po/doc/guix-manual.ko.po: Remove file. * po/doc/guix-manual.sk.po: Remove file. * po/doc/local.mk: Remove them. * doc/local.mk: Remove them. Julien Lepiller 2022-03-01nls: Update translations....* po/doc/guix-cookbook.uk.po: New file. * po/doc/local.mk: Add uk cookbook. * doc/local.mk: Add uk cookbook. * po/guix/fa.po: New file. * po/guix/uk.po: New file. * po/guix/LINGUAS: Add fa and uk. Julien Lepiller 2022-02-04nls: Update translations....* po/doc/guix-cookbook.pt_BR.po: New file. * po/doc/local.mk: Add it. * doc/local.mk: Add pt_BR cookbook. Julien Lepiller 2022-01-09nls: Update translations....* po/doc/guix-cookbook.fi.po: New file. * po/doc/guix-manual.fi.po: New file. * po/doc/local.mk: Add them. * doc/local.mk: Add them. * po/guix/fi.po: New file. * po/guix/LINGUAS: Add it. Julien Lepiller