From: Andrew Dunstan Date: Wed, 1 Apr 2026 17:54:41 +0000 (-0400) Subject: perl tap: Show die reason in TAP output X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=76540fdedf405c01518007bef3bdd96e0b96d390;p=thirdparty%2Fpostgresql.git perl tap: Show die reason in TAP output Install a $SIG{__DIE__} handler in the INIT block of Utils.pm that emits the die message as a TAP diagnostic. Previously, an unexpected die (e.g. from safe_psql) produced only "no plan was declared" with no indication of the actual error. The handler also calls done_testing() to suppress that confusing message. Dies during compilation ($^S undefined) and inside eval ($^S == 1) are left alone. Author: Jelte Fennema-Nio Reviewed-by: Andrew Dunstan Reviewed-by: Corey Huinker Reviewed-by: Zsolt Parragi Reviewed-by: Nazir Bilal Yavuz Reviewed-by: Andres Freund Discussion: https://postgr.es/m/DFYFWM053WHS.10K8ZPJ605UFK@jeltef.nl Discussion: https://postgr.es/m/20220222181924.eehi7o4pmneeb4hm%40alap3.anarazel.de --- diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index b781d76a98b..e87df9b45e7 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -244,6 +244,24 @@ INIT autoflush STDOUT 1; autoflush STDERR 1; autoflush $testlog 1; + + # Because of the above redirection the tap output wouldn't contain + # information about tests failing due to die etc. Fix that by also + # printing the failure to the original stderr. + $SIG{__DIE__} = sub { + # Ignore dies because of syntax errors, those will be displayed + # correctly anyway. + return if !defined $^S; + + # Ignore dies inside evals + return if $^S == 1; + + diag("die: $_[0]"); + # Also call done_testing() to avoid the confusing "no plan was declared" + # message in TAP output when a test dies. + eval { done_testing(); } + }; + } END