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")
/td> 2020-11-16gnu: squashfs-tools: Cross compile....* gnu/packages/compression.scm (squashfs-tools)[arguments]: Use cc-for-target in make-flags. Efraim Flashner 2020-11-16gnu: lz4: Cross compile....* gnu/packages/compression.scm (lz4)[arguments]: When targeting another system use cc-for-target in make-flags. Efraim Flashner 2020-11-11Merge branch 'master' into stagingMarius Bakke 2020-11-08gnu: atool: Update source URI....* gnu/packages/compression.scm (atool)[source]: Update to new source URI. Efraim Flashner 2020-11-06gnu: lz4: Add a :static output....* gnu/packages/compression.scm (lz4)[outputs]: Add "static" to this new field. [arguments]: Replace the ‘delete-static-library’ phase with ‘move-static-library’. Tobias Geerinckx-Rice 2020-10-19Merge branch 'staging'...Conflicts: gnu/packages/admin.scm gnu/packages/commencement.scm gnu/packages/gdb.scm gnu/packages/llvm.scm gnu/packages/package-management.scm gnu/packages/tls.scm Maxim Cournoyer 2020-10-12gnu: lz4: Cross-compile....* gnu/packages/compression.scm (lz4)[arguments]: Use CC-FOR-TARGET. Tobias Geerinckx-Rice 2020-09-26gnu: lzlib: Don't build static library....* gnu/packages/compression.scm (lzlib)[arguments]: Pass "--disable-static". Ludovic Courtès 2020-09-26gnu: lzlib: Support cross-compilation....Until now, since lzlib's 'configure' ignores '--host', we'd always end up building it natively. * gnu/packages/compression.scm (lzlib)[arguments]: Use (cc-for-target) instead of "gcc". Ludovic Courtès 2020-09-24gnu: Add tarlz....* gnu/packages/compression.scm (tarlz): New variable. Guillaume Le Vaillant 2020-08-26Merge remote-tracking branch 'origin/master' into core-updatesMathieu Othacehe 2020-08-11gnu: innoextract: Update to 1.9....* gnu/packages/compression.scm (innoextract): Update to 1.9. [source]: Download from official home page. [arguments]: Remove obsolete configure flag. Tobias Geerinckx-Rice 2020-07-28gnu: pixz: Update to 1.0.7....* gnu/packages/compression.scm (pixz): Update to 1.0.7. Tobias Geerinckx-Rice 2020-07-23Merge branch 'master' into core-updates...Conflicts: gnu/packages/ruby.scm Jakub Kądziołka 2020-07-19gnu: libzip: Update to 1.7.3....* gnu/packages/compression.scm (libzip): Update to 1.7.3. Tobias Geerinckx-Rice 2020-07-17gnu: lbzip2: Update to 2.5-0.b6dc48a....* gnu/packages/compression.scm (lbzip2): Update to 2.5-0.b6dc48a. [source]: Use GIT-FETCH and GIT-FILE-NAME. Remove snippet. [arguments]: Add ‘unpack-gnulib’ and custom bootstrap phase. [native-inputs]: Add autoconf, automake, gnulib, and perl. [home-page]: Use source repository. Tobias Geerinckx-Rice 2020-07-14gnu: libzip: Update to 1.7.2....* gnu/packages/compression.scm (libzip): Update to 1.7.2. Tobias Geerinckx-Rice 2020-07-12gnu: Remove ".git" from "https://github/…/….git"....Until now, 'lookup-origin' and thus 'lookup-origin-revision' in (guix swh) would sometimes return #f for these because the ".git" URLs are redirects to the non-".git" URLs. Consequently, 'guix lint -c archival' would keep saying "scheduled Software Heritage archival"; likewise, the fallback download code would fail. * gnu/packages/ada.scm, gnu/packages/admin.scm, gnu/packages/aidc.scm, gnu/packages/algebra.scm, gnu/packages/android.scm, gnu/packages/animation.scm, gnu/packages/arcan.scm, gnu/packages/assembly.scm, gnu/packages/audio.scm, gnu/packages/authentication.scm, gnu/packages/avr.scm, gnu/packages/axoloti.scm, gnu/packages/backup.scm, gnu/packages/bash.scm, gnu/packages/benchmark.scm, gnu/packages/bioconductor.scm, gnu/packages/bioinformatics.scm, gnu/packages/bittorrent.scm, gnu/packages/boost.scm, gnu/packages/build-tools.scm, gnu/packages/c.scm, gnu/packages/calendar.scm, gnu/packages/cdrom.scm, gnu/packages/check.scm, gnu/packages/chemistry.scm, gnu/packages/chez.scm, gnu/packages/clojure.scm, gnu/packages/code.scm, gnu/packages/compression.scm, gnu/packages/compton.scm, gnu/packages/coq.scm, gnu/packages/cpp.scm, gnu/packages/cran.scm, gnu/packages/crypto.scm, gnu/packages/curl.scm, gnu/packages/databases.scm, gnu/packages/datastructures.scm, gnu/packages/debug.scm, gnu/packages/disk.scm, gnu/packages/distributed.scm, gnu/packages/django.scm, gnu/packages/dlang.scm, gnu/packages/dns.scm, gnu/packages/docker.scm, gnu/packages/education.scm, gnu/packages/efi.scm, gnu/packages/elixir.scm, gnu/packages/emacs-xyz.scm, gnu/packages/embedded.scm, gnu/packages/emulators.scm, gnu/packages/engineering.scm, gnu/packages/erlang.scm, gnu/packages/fabric-management.scm, gnu/packages/file-systems.scm, gnu/packages/finance.scm, gnu/packages/firmware.scm, gnu/packages/flashing-tools.scm, gnu/packages/fonts.scm, gnu/packages/fontutils.scm, gnu/packages/fpga.scm, gnu/packages/game-development.scm, gnu/packages/games.scm, gnu/packages/genealogy.scm, gnu/packages/genimage.scm, gnu/packages/geo.scm, gnu/packages/gimp.scm, gnu/packages/gl.scm, gnu/packages/gnome-xyz.scm, gnu/packages/gnome.scm, gnu/packages/gnuzilla.scm, gnu/packages/golang.scm, gnu/packages/gpodder.scm, gnu/packages/graph.scm, gnu/packages/graphics.scm, gnu/packages/graphviz.scm, gnu/packages/groff.scm, gnu/packages/groovy.scm, gnu/packages/gtk.scm, gnu/packages/guile-xyz.scm, gnu/packages/guile.scm, gnu/packages/hardware.scm, gnu/packages/haskell-apps.scm, gnu/packages/haskell-xyz.scm, gnu/packages/hexedit.scm, gnu/packages/i2p.scm, gnu/packages/ibus.scm, gnu/packages/image-processing.scm, gnu/packages/image-viewers.scm, gnu/packages/image.scm, gnu/packages/ipfs.scm, gnu/packages/java-graphics.scm, gnu/packages/java-maths.scm, gnu/packages/java.scm, gnu/packages/javascript.scm, gnu/packages/jrnl.scm, gnu/packages/julia.scm, gnu/packages/jupyter.scm, gnu/packages/kodi.scm, gnu/packages/language.scm, gnu/packages/lego.scm, gnu/packages/less.scm, gnu/packages/libusb.scm, gnu/packages/linux.scm, gnu/packages/lirc.scm, gnu/packages/lisp-xyz.scm, gnu/packages/llvm.scm, gnu/packages/logging.scm, gnu/packages/lolcode.scm, gnu/packages/lua.scm, gnu/packages/lxde.scm, gnu/packages/lxqt.scm, gnu/packages/machine-learning.scm, gnu/packages/mail.scm, gnu/packages/markup.scm, gnu/packages/maths.scm, gnu/packages/maven.scm, gnu/packages/mes.scm, gnu/packages/messaging.scm, gnu/packages/monitoring.scm, gnu/packages/mpd.scm, gnu/packages/music.scm, gnu/packages/networking.scm, gnu/packages/node-xyz.scm, gnu/packages/ocaml.scm, gnu/packages/ocr.scm, gnu/packages/onc-rpc.scm, gnu/packages/opencl.scm, gnu/packages/opencog.scm, gnu/packages/pantheon.scm, gnu/packages/password-utils.scm, gnu/packages/patchutils.scm, gnu/packages/pdf.scm, gnu/packages/perl6.scm, gnu/packages/phabricator.scm, gnu/packages/popt.scm, gnu/packages/printers.scm, gnu/packages/prolog.scm, gnu/packages/protobuf.scm, gnu/packages/pulseaudio.scm, gnu/packages/python-crypto.scm, gnu/packages/python-web.scm, gnu/packages/python-xyz.scm, gnu/packages/qt.scm, gnu/packages/radio.scm, gnu/packages/rails.scm, gnu/packages/rdf.scm, gnu/packages/rednotebook.scm, gnu/packages/rpc.scm, gnu/packages/rsync.scm, gnu/packages/ruby.scm, gnu/packages/rust.scm, gnu/packages/scheme.scm, gnu/packages/screen.scm, gnu/packages/security-token.scm, gnu/packages/selinux.scm, gnu/packages/serialization.scm, gnu/packages/shells.scm, gnu/packages/shellutils.scm, gnu/packages/simh.scm, gnu/packages/sml.scm, gnu/packages/ssh.scm, gnu/packages/statistics.scm, gnu/packages/stenography.scm, gnu/packages/sync.scm, gnu/packages/syncthing.scm, gnu/packages/synergy.scm, gnu/packages/telephony.scm, gnu/packages/terminals.scm, gnu/packages/tex.scm, gnu/packages/texinfo.scm, gnu/packages/text-editors.scm, gnu/packages/textutils.scm, gnu/packages/time.scm, gnu/packages/tmux.scm, gnu/packages/tor.scm, gnu/packages/toys.scm, gnu/packages/version-control.scm, gnu/packages/video.scm, gnu/packages/vim.scm, gnu/packages/virtualization.scm, gnu/packages/vlang.scm, gnu/packages/vnc.scm, gnu/packages/vpn.scm, gnu/packages/web-browsers.scm, gnu/packages/web.scm, gnu/packages/wireservice.scm, gnu/packages/wm.scm, gnu/packages/wxwidgets.scm, gnu/packages/xdisorg.scm, gnu/packages/xml.scm, gnu/packages/xorg.scm, tests/lint.scm: Remove trailing ".git" from 'git-reference' URL. Ludovic Courtès 2020-07-09gnu: zutils: Update to 1.9....* gnu/packages/compression.scm (zutils): Update to 1.9. Tobias Geerinckx-Rice 2020-07-09gnu: zutils: Fix test failure....* gnu/packages/compression.scm (zutils)[arguments]: Add a ‘disable-failing-tests’ phase. Tobias Geerinckx-Rice 2020-06-30gnu: zstd: Update to 1.4.5....* gnu/packages/compression.scm (zstd): Update to 1.4.5. [arguments]: Add new work-arounds for new Makefile problems. Tobias Geerinckx-Rice 2020-06-30gnu: zstd: Follow GNU conventions for make variables....* gnu/packages/compression.scm (zstd)[arguments]: Use lowercase ones where possible. Tobias Geerinckx-Rice 2020-06-27gnu: libzip: Update to 1.7.1....* gnu/packages/compression.scm (libzip): Update to 1.7.1. Marius Bakke 2020-06-14Merge branch 'master' into core-updatesMarius Bakke 2020-06-02gnu: clzip: Fix cross-compilation....* gnu/packages/compression.scm (clzip)[arguments]: Use CC-FOR-TARGET. Tobias Geerinckx-Rice 2020-06-02gnu: lunzip: Fix cross-compilation....* gnu/packages/compression.scm (lunzip)[arguments]: Use CC-FOR-TARGET. Tobias Geerinckx-Rice 2020-06-02gnu: pigz: Fix cross-compilation....* gnu/packages/compression.scm (pigz)[arguments]: Use CC-FOR-TARGET. Tobias Geerinckx-Rice 2020-06-02gnu: xarchiver: Update to 0.5.4.15....* gnu/packages/compression.scm (xarchiver): Update to 0.5.4.15. Tobias Geerinckx-Rice 2020-05-29gnu: Use 'cc-for-target' instead of custom implementations....* gnu/packages/compression.scm (ecm)[arguments]: In #:make-flags, remove TARGET binding and use CC-FOR-TARGET instead. * gnu/packages/linux.scm (powerstat, crda, cachefilesd)[arguments]: Likewise. * gnu/packages/mail.scm (alpine)[arguments]: Likewise. * gnu/packages/music.scm (lsp-plugins)[arguments]: Likewise. * gnu/packages/radio.scm (dump1090)[arguments]: Likewise. * gnu/packages/suckless.scm (blind, dmenu, spoon, slock, st, surf, sent, wificurse, sbm, prout, noice, human, fortify-headers, colors, libutf, scron)[arguments]: Likewise. Marius Bakke 2020-05-25gnu: quazip: Update to 0.9.1....* gnu/packages/compression.scm (quazip): Update to 0.9.1. Efraim Flashner