From 90886bd416d8220a42601e1c2802e9dcc2261414 Mon Sep 17 00:00:00 2001 From: bulk88 Date: Tue, 29 May 2018 17:15:18 -0400 Subject: [PATCH] XSConfig compatibility With XSConfig with p5p perl, or cperl, Test::Harness fails in t/nofork-mux.t because of reliance on internal implementation of Config.pm. Without using any external libraries or modules, fake not having fork by putting a shim between the XS FETCH sub/method and the Config class that traps and changes 'd_fork' key. Sample of error below that is fixed with this patch. C:\cpan\testharness>prove -v t/nofork-mux.t t/nofork-mux.t .. Not a HASH reference at t/lib/NoFork.pm line 7. Compilation failed in require at t/nofork-mux.t line 10. BEGIN failed--compilation aborted at t/nofork-mux.t line 10. Dubious, test returned 255 (wstat 65280, 0xff00) No subtests run Test Summary Report ------------------- t/nofork-mux.t (Wstat: 65280 Tests: 0 Failed: 0) Non-zero exit status: 255 Parse errors: No plan found in TAP output Files=1, Tests=0, 0 wallclock secs ( 0.11 usr + 0.00 sys = 0.11 CPU) Result: FAIL Original author of this code is Reini Urban, in cperl commit 42cac300080de7d3a9df8eed040750ec9583de20 "Test-Harness: fix 2 tests" on "Date: 9/28/2015 10:59:36 AM". The code was submitted upstream in Apr 2017 in https://github.com/Perl-Toolchain-Gang/Test-Harness/pull/63 but that PR stalled. I've extracted the minimum code needed to get T::H to pass with XSConfig with p5p perl and placed it in this patch so that the code can be published sooner. --- t/lib/NoFork.pm | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/t/lib/NoFork.pm b/t/lib/NoFork.pm index 0225e962..4c64879f 100644 --- a/t/lib/NoFork.pm +++ b/t/lib/NoFork.pm @@ -4,7 +4,21 @@ BEGIN { *CORE::GLOBAL::fork = sub { die "you should not fork" }; } use Config; -tied(%Config)->{d_fork} = 0; # blatant lie +if ($Config::Config{d_fork}) { + if (exists &Config::KEYS) { # compiled Config + *Config_FETCHorig = \&Config::FETCH; + no warnings 'redefine'; + *Config::FETCH = sub { + if ($_[0] and $_[1] eq 'd_fork') { + return 0; + } else { + return Config_FETCHorig(@_); + } + } + } else { + tied(%Config)->{d_fork} = 0; # uncompiled Config + } +} =begin TEST