diff options
-rw-r--r-- | gnu/local.mk | 1 | ||||
-rw-r--r-- | gnu/packages/mail.scm | 60 | ||||
-rw-r--r-- | gnu/packages/patches/public-inbox-fix-spawn-test.patch | 43 |
3 files changed, 91 insertions, 13 deletions
diff --git a/gnu/local.mk b/gnu/local.mk index 576c1a3eb6..e38eb05205 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1651,6 +1651,7 @@ dist_patch_DATA = \ %D%/packages/patches/psm-disable-memory-stats.patch \ %D%/packages/patches/psm-ldflags.patch \ %D%/packages/patches/psm-repro.patch \ + %D%/packages/patches/public-inbox-fix-spawn-test.patch \ %D%/packages/patches/pulseaudio-fix-mult-test.patch \ %D%/packages/patches/pulseaudio-longer-test-timeout.patch \ %D%/packages/patches/pulseview-qt515-compat.patch \ diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm index 47a62b00de..5d2fbdeff5 100644 --- a/gnu/packages/mail.scm +++ b/gnu/packages/mail.scm @@ -88,6 +88,7 @@ #:use-module (gnu packages django) #:use-module (gnu packages dns) #:use-module (gnu packages docbook) + #:use-module (gnu packages docker) #:use-module (gnu packages documentation) #:use-module (gnu packages emacs) #:use-module (gnu packages enchant) @@ -4085,10 +4086,16 @@ Git and exports them in maildir format or to an MDA through a pipe.") (sha256 (base32 "0xni1l54v1z3p0zb52807maay0yqabp8jgf5iras5zmhgjyk3swz")) - (file-name (git-file-name name version)))) + (file-name (git-file-name name version)) + (patches (search-patches "public-inbox-fix-spawn-test.patch")))) (build-system perl-build-system) (arguments - '(#:tests? #f + `(#:imported-modules (,@%perl-build-system-modules + (guix build syscalls)) + #:modules ((guix build perl-build-system) + (guix build syscalls) + (guix build utils) + (ice-9 match)) #:phases (modify-phases %standard-phases (add-before 'configure 'qualify-paths @@ -4097,18 +4104,45 @@ Git and exports them in maildir format or to an MDA through a pipe.") (substitute* "lib/PublicInbox/Xapcmd.pm" (("'xapian-compact'") (format #f "'~a'" (search-input-file inputs - "/bin/xapian-compact")))))) + "/bin/xapian-compact")))) + (substitute* "lib/PublicInbox/TestCommon.pm" + ;; This is only used for tests, but get it from ‘inputs’ so + ;; that cross builds won't hold a reference to a package built + ;; for another architecture. + (("/bin/cp") (search-input-file inputs "/bin/cp"))))) (add-before 'check 'pre-check (lambda _ - (substitute* "t/spawn.t" - (("\\['env'\\]") (string-append "['" (which "env") "']"))) - (substitute* "t/ds-leak.t" - (("/bin/sh") (which "sh"))) - (invoke "./certs/create-certs.perl") - ;; XXX: This test fails due to zombie process is not reaped by - ;; the builder. - (substitute* "t/httpd-unix.t" - (("^SKIP: \\{") "SKIP: { skip('Guix');")))) + (invoke "./certs/create-certs.perl"))) + (replace 'check + (lambda* (#:key target + (tests? (not target)) (test-flags '()) + #:allow-other-keys) + (if tests? + (match (primitive-fork) + (0 ;child process + ;; lei tests build UNIX domain sockets in the temporary + ;; directory, but the path of those sockets can be at most + ;; 108 chars and Guix' default value for the variables + ;; below already use 47 chars. Use the shortest temporary + ;; path possible to avoid hitting the limit. + (setenv "TEMP" "/tmp") + (setenv "TEMPDIR" "/tmp") + (setenv "TMP" "/tmp") + (setenv "TMPDIR" "/tmp") + + ;; Use tini so that signals are properly handled and + ;; doubly-forked processes get reaped; otherwise, + ;; lei-daemon is kept as a zombie and the testsuite + ;; fails thinking that it didn't quit as it should. + (set-child-subreaper!) + (apply execlp "tini" "--" + "make" "check" test-flags)) + (pid + (match (waitpid pid) + ((_ . status) + (unless (zero? status) + (error "`make check' exited with status" status)))))) + (format #t "test suite not run~%")))) (add-after 'install 'wrap-programs (lambda* (#:key inputs outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) @@ -4127,7 +4161,7 @@ Git and exports them in maildir format or to an MDA through a pipe.") (find-files (string-append out "/bin"))))))))) (native-inputs (list ;; For testing. - lsof openssl)) + lsof openssl tini)) (inputs (list bash-minimal curl diff --git a/gnu/packages/patches/public-inbox-fix-spawn-test.patch b/gnu/packages/patches/public-inbox-fix-spawn-test.patch new file mode 100644 index 0000000000..2739b1974d --- /dev/null +++ b/gnu/packages/patches/public-inbox-fix-spawn-test.patch @@ -0,0 +1,43 @@ +From 5593489d9c3ce22b1942f35c7ebb0e06fcf2bfa8 Mon Sep 17 00:00:00 2001 +From: Thiago Jung Bauermann <bauermann@kolabnow.com> +Date: Fri, 10 Jun 2022 12:39:18 -0300 +Subject: [PATCH] t/spawn: Find invalid PID to try to join its process group + +In the container used to build packages of the GNU Guix distribution, PID 1 +runs as the same user as the test so this spawn that should fail actually +succeeds. + +Fix the problem by going through different PIDs and picking one that +either doesn't exist or we aren't allowed to signal. +--- + +This patch is taken from the public-inbox repository and will appear in the +release after v1.8. + + t/spawn.t | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/t/spawn.t b/t/spawn.t +index 6168c1f6171c..5fc99a2a101c 100644 +--- a/t/spawn.t ++++ b/t/spawn.t +@@ -24,7 +24,18 @@ SKIP: { + is(waitpid($pid, 0), $pid, 'waitpid succeeds on spawned process'); + is($?, 0, 'true exited successfully'); + pipe(my ($r, $w)) or BAIL_OUT; +- $pid = eval { spawn(['true'], undef, { pgid => 1, 2 => $w }) }; ++ ++ # Find invalid PID to try to join its process group. ++ my $wrong_pgid = 1; ++ for (my $i=0x7fffffff; $i >= 2; $i--) { ++ if (kill(0, $i) == 0) { ++ $wrong_pgid = $i; ++ last; ++ } ++ } ++ ++ # Test spawn behavior when it can't join the requested process group. ++ $pid = eval { spawn(['true'], undef, { pgid => $wrong_pgid, 2 => $w }) }; + close $w; + my $err = do { local $/; <$r> }; + # diag "$err ($@)"; |