From d23c20f1d054935d4d865adfbfb5777c512444e1 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Tue, 20 Oct 2015 00:55:09 +0200 Subject: Add 'guix challenge'. * guix/scripts/challenge.scm, tests/challenge.scm: New files. * Makefile.am (MODULES): Add the former. (SCM_TESTS): Add the latter. * doc.am (SUBCOMMANDS): Add 'challenge'. * doc/guix.texi (Substitutes): Add xref to 'guix challenge'. (Invoking guix challenge): New node. * doc/contributing.texi (Submitting Patches): Add note about using 'guix challenge'. * po/guix/POTFILES.in: Add guix/scripts/challenge.scm. --- tests/challenge.scm | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 tests/challenge.scm (limited to 'tests') diff --git a/tests/challenge.scm b/tests/challenge.scm new file mode 100644 index 0000000000..e53cacd333 --- /dev/null +++ b/tests/challenge.scm @@ -0,0 +1,114 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2015 Ludovic Courtès +;;; +;;; 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 . + +(define-module (test-challenge) + #:use-module (guix tests) + #:use-module (guix hash) + #:use-module (guix store) + #:use-module (guix monads) + #:use-module (guix derivations) + #:use-module (guix gexp) + #:use-module (guix scripts challenge) + #:use-module (guix scripts substitute) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:use-module (srfi srfi-64) + #:use-module (rnrs bytevectors) + #:use-module (ice-9 match)) + +(define %store + (open-connection-for-tests)) + +(define query-path-hash* + (store-lift query-path-hash)) + +(define-syntax-rule (test-assertm name exp) + (test-assert name + (run-with-store %store exp + #:guile-for-build (%guile-for-build)))) + +(define* (call-with-derivation-narinfo* drv thunk hash) + (lambda (store) + (with-derivation-narinfo drv (sha256 => hash) + (values (run-with-store store (thunk)) store)))) + +(define-syntax with-derivation-narinfo* + (syntax-rules (sha256 =>) + ((_ drv (sha256 => hash) body ...) + (call-with-derivation-narinfo* drv + (lambda () body ...) + hash)))) + + +(test-begin "challenge") + +(test-assertm "no discrepancies" + (let ((text (random-text))) + (mlet* %store-monad ((drv (gexp->derivation "something" + #~(call-with-output-file + #$output + (lambda (port) + (display #$text port))))) + (out -> (derivation->output-path drv))) + (mbegin %store-monad + (built-derivations (list drv)) + (mlet %store-monad ((hash (query-path-hash* out))) + (with-derivation-narinfo* drv (sha256 => hash) + (>>= (discrepancies (list out) (%test-substitute-urls)) + (lift1 null? %store-monad)))))))) + +(test-assertm "one discrepancy" + (let ((text (random-text))) + (mlet* %store-monad ((drv (gexp->derivation "something" + #~(call-with-output-file + #$output + (lambda (port) + (display #$text port))))) + (out -> (derivation->output-path drv))) + (mbegin %store-monad + (built-derivations (list drv)) + (mlet* %store-monad ((hash (query-path-hash* out)) + (wrong-hash + -> (let* ((w (bytevector-copy hash)) + (b (bytevector-u8-ref w 0))) + (bytevector-u8-set! w 0 + (modulo (+ b 1) 128)) + w))) + (with-derivation-narinfo* drv (sha256 => wrong-hash) + (>>= (discrepancies (list out) (%test-substitute-urls)) + (match-lambda + ((discrepancy) + (return + (and (string=? out (discrepancy-item discrepancy)) + (bytevector=? hash + (discrepancy-local-sha256 + discrepancy)) + (match (discrepancy-narinfos discrepancy) + ((bad) + (bytevector=? wrong-hash + (narinfo-hash->sha256 + (narinfo-hash bad)))))))))))))))) + +(test-end) + + +(exit (= (test-runner-fail-count (test-runner-current)) 0)) + +;;; Local Variables: +;;; eval: (put 'with-derivation-narinfo* 'scheme-indent-function 2) +;;; End: -- cgit v1.2.3