Revision history for Test-Trap 0.3.5 Wed 27 Jul 2022 05:58:02 AM CEST No changes to the libraries, just to the tests. Perl best practices form a moving target. - Stop using bareword filehandles; if it isn't deprecated already, it will be. - RT #143716: Perl pulled the rug from under me on untainting environment variables when it stopped treating an empty string as a safe PATH. Fix by deleting the offending environment variables instead, as suggested by Graham Knop. 0.3.4 Sun Oct 14 20:39:41 CEST 2018 For this release, many thanks go to Todd Rinaldo, who found that my fix for the $^E clobbering wound up clobbering $! in every basic test. - Declared some required and optional dependencies. - RT #127112 is addressed, using the patch from TODDR@cpan.org augmented wtih a comment. - A regression test has been added for this. 0.3.3 Tue Aug 22 02:06:09 CEST 2017 For this release, many thanks go to Slaven Rezic, who found that Test::More::is() (or Test2::Formatter::TAP::write()) clobbers $^E on Windows. - RT #105125 is addressed: The tests now use a copy of $^E taken before Test::More gets a chance to touch it. - Further, the Test::Trap test methods might also clobber $^E (via Test::More or other modules), so they now localize $^E before invoking the callback. - Regression tests have been added for this. 0.3.2 Tue Feb 24 00:19:23 CET 2015 The tempfile-preserve strategy was (always) broken on non-perlio perls. Also, some of the tests were (recently) noisy on old perls. Test::Trap::Builder::TempFile: - add a GOTPERLIO guard to each IO_LAYERS block. Tests: - 03-files.pl now avoid "used only once" warnings. 0.3.1 Mon Feb 23 21:43:30 CET 2015 This release doesn't touch library code, but addresses some test issues: - It fixes RT #102271 by checking for the presence of a utf8-layer on the original STDOUT, instead of assuming its absence. - It makes some test code cleaner. - It silences redefine warnings during testing on certain platforms. Library files: No change but version bump. Tests: - 03-files* now use another global to specify the class to require, replacing a quick-and-dirty hack that turned out to be noisy on some platforms, including Cygwin. - {15-tempfile,16-systemsafe}-options.t now check for the presence of utf8-layer on STDOUT, instead of assuming its absence. (Either of the environment variables PERL_UNICODE and PERL5OPT could cause such a layer to be present, and there might be other ways to do it.) 0.3.0 Thu Dec 18 21:57:51 CET 2014 This release, in brief: - improves clarity through nomenclature: * renames "(output layer) backend implementation" to "(capture) strategy", for more standard nomenclature (and less of a mouthful); * renames "pseudo-layer" to "multi-layer" (if so declared) or "non-trapping layer" (neither is a direct analogue to PerlIO pseudo layers, so the nomenclature was misleading); - adds (import) options to the TempFile and SystemSafe capture strategy factories, allowing for different ways to handle PerlIO layers; - using these for two new standard capture strategies, "tempfile-preserve" and "systemsafe-preserve"; and - fixes a bug in SystemSafe. And, in more detail ... Test::Trap::Builder: - Changes method names per the nomenclature changes, leaving back-compat aliases behind. - Changes error message per the nomenclature changes. (No back-compat possible, sorry.) - Updates the documentation. Test::Trap::Builder::{TempFile,SystemSafe}: - Import now takes arguments: strategy name (default {"tempfile","systemsafe"}); and strategy options (default empty hash). - The following options are supported: preserve_io_layers (boolean; default false); and io_layers (colon-separated string; default unset). Test::Trap::Builder::SystemSafe: - Fixes a bug where the original perlio layers were not restored after the trap was sprung. Test::Trap::Builder::{PerlIO,TempFile,SystemSafe}: - Updates the code in accordance with Test::Trap::Builder changes; see above. - Updates the documentation. Test::Trap: - Imports new capture strategy, "tempfile-preserve", from TempFile with option preserve_io_layers. - Imports new capture strategy, "systemsafe-preserve", from SystemSafe with option preserve_io_layers. - Updates the code in accordance with Test::Trap::Builder changes; see above. - Updates the documentation. Tests: - changes variable names and comments in accordance with nomenclature changes; - adds tests for the no-restore bug in t/03-files.pl (hence for each tested strategy); - adds t/03-files-{tempfile,systemsafe}-preserve.t to run the basic tests against the new capture strategies; - accounts for the changed error message in t/06-layers.t; - adds t/{15-tempfile,16-systemsafe}-options.t to check capture strategies of varying options. 0.2.5 Sun Nov 16 18:31:42 CET 2014 This release localizes $! (ERRNO) for internal operations that change it, as suggested by Felipe Gasper. For the same operations, it also localizes $^E (extended OS error). Library files: - Localize $! and $^E for internal operations that change them. Tests: - Check that bare test blocks leave $!, %!, and $^E unchanged, but that blocks that modify $! and $^E still do so. Also: - Added Module::Build to the configure_requires. - Fix emacs mode line on t/14-leaks.t. - Better comments in lib/Test/Trap/Builder.pm. 0.2.4 Sun Mar 30 10:02:16 CEST 2014 This release fixes a memory leak with the default tempfile backend layer implementation for trapping output. The systemsafe alternative backend had the same kind of leak, and has also been fixed. (The perlio alternative backend was not affected.) Thanks go again to Felipe Gasper for discovering this! Test::Trap::Builder: - Add a method ExceptionFunction to make it easier to avoid circular references arising from registered closures. Document and export this method. Test::Trap::Builder::TempFile: - Break a circular reference chain. Test::Trap::Builder::SystemSafe: - Break a similar but slightly more complicated circular reference chain. Tests: - Added t/14-leaks.t to check that the reference count is as expected, at least with trivial code and standard setup for all three output layer backends. Also: - Use ebhanssen@cpan.org for my email address. - Update copyright years. - Update MANIFEST.SKIP &c for use of git (goodbye subversion). 0.2.3 Mon Dec 30 14:46:15 CET 2013 Library files: - RT #87263: typo fixes, courtesy dsteinbrunner@pobox.com. - Localize the trap coderef, so that it does not hold on to what it closes over, creating stale references, but lets them go out of scope; thanks go to Felipe Gasper. Documentation: - Some clarification for RT #91687: Wrong exit code after die. Tests: - Regression test for the stale references. 0.2.2 Fri Mar 2 02:23:04 CET 2012 Test::Trap::Builder::TempFile & Test::Trap::Builder::SystemSafe: - RT #61776: Remove temporary files at first opportunity; thanks go to Ian Goodacre. Documentation: - RT #61773: return from trap function Document what trap { ... } returns. Tests: - RT #75430: Failing tests in 06-layer.t Convert a number of die_is to die_like, handling cases with and without trailing comma from carp. - Unset another taint-checked environment variable, CDPATH; thanks go to CPAN testers. 0.2.1 Tue Dec 29 23:14:45 CET 2009 Documentation: - fix a typo, [RT #48941]; thanks go to David Taylor; Tests: - use .PL-files to build the test files t/08-fork.t and t/11-systemsafe-basic.t instead of dispatching through *-taint.t and *-no-taint.t files at runtime; Build: - setup the build of the above test files in Build.PL; - add a ACTION_distmeta override to check for patch to or version of Module::Build::Compat with correct handling of PL_FILES/PL_files; - update the MANIFEST and .SKIP files accordingly. 0.2.0 Tue Sep 30 04:28:30 CEST 2008 Test::Trap::Builder::SystemSafe: - add explicit close()s, as it seems various files otherwise remain open for too long; - register the teardown sub as soon as we have a tempfile, so that we'll close it in teardown even if internal exceptions are raised; Test::Trap::Builder::Tempfile: - added an explicit close($fh), as it seems it otherwise remains open for too long; - register the teardown sub as soon as we have a tempfile, so that we'll close it in teardown even if internal exceptions are raised; Test::Trap::Builder: - add an ' id ' member to the object, for use with tag-on properties, as the ref stringification does not survive a pseudo-fork (inside-out objects are *hard*); - make sure all registered teardowns are called, even after one or more internal exceptions; Test::Trap: - use a different workaround (by way of Teardown) for $SIG{__WARN__} temporary value, as it seems local %SIG does not restore the previous value or lack thereof upon scope exit (may perlbug that one); Tests: - add a regression test for $SIG{__WARN__} restoration to t/03-files.pl; - add a regression test for the ", <$fh> line 1." bug to t/03-files.pl; - t/03-files.pl and t/06-layers.t: add necessary close()s and local *FH to make sure all files are closed before exiting (as otherwise, tempfiles are not being cleaned on windows); - added "~" to the characters accepted in the $^X path, for t/11-systemsafe-basic.pl; - reorganize: move "unnumbered" tests to xt/author; Build: - bump the minor version number, in response to the internal changes in Test::Trap::Builder; - don't list Config as a prereq, as that seems to mess up CPANPLUS(?) installations; - updated MANIFEST, MANIFEST.SKIP, and Build.PL (adding ACTION_authortest) in accordance with the above test reorganization. 0.1.2 Fri Sep 12 17:30:42 CEST 2008 Test::Trap::Builder::TempFile: - use *$globref, not $globref directly -- I have no idea why this suddenly broke, but it did; Tests: - make t/10-tester.t independent of the exact format of the Test::More diagnostics -- just dependent on it staying the same within one process; - thanks go to Andreas Koenig, cpantesters, and Michael Schwern for providing early warning that this was going to fail! - make t/03-files.pl use backticks (`) instead of null chars (\0) as a warning record separator -- makeshift fix -- I should do better, but this must do for now; Build: - up the perl dependency to 5.6.2 -- 5.6.0/5.6.1 may be salvageable, but do not seem worth it. 0.1.1 Tue Mar 11 20:08:31 CET 2008 Documentation: - document the indexing/slicing of ->return and ->warn; - smaller tweaks; - new methods *_isa_ok; Test::Trap: - usage patterns clearly indicate we need *_isa_ok tests: a $trap->did_return w/BAIL_OUT followed by an isa_ok($trap->return(0)) w/BAIL_OUT must constitute the clearest test-trap anti-pattern since C<() = trap {...}>; - note: *_can_ok is still out, since it does not take any kind of name, and the TTB interface still expects a name; Tests: - subclass Pod::Coverage so that it treats the functions "imported" from Test::Trap::Builder as though they were native, not imported, to the package we're testing; - update t/pod-coverage.t to ignore the latest methods and functions somehow documented: layer:*, *_isa_ok, Next, Prop, Run, etc; - prevent t/99-coverage.t exiting with code 8 on success, now that Test-Simple actually catches that stuff; Build: - up the Test::Tester dependency to 0.107 -- I don't know what broke t/10-tester.t; I don't think it was anything of mine -- but upgrading Test::Tester fixed it. 0.1.0 Mon Jan 14 18:31:09 CET 2008 Overall: - Continuing to fix small stuff, but also beginning to mess with the interfaces, adding new stuff and rewriting most of the builder. - Applied a patch from Michael Schilli (in response to a bug reported by Kimo Rosenbaum) adding UNLINK => 1 to the arguments for File::Temp::tempfile(). (Duh!) Documentation: - revised section on TTB exports; - revised section on TTB methods; - document the new pseudo-layers; Nomenclature: - s/trapper layer/trap layer/g; - s/trap (module|package)/trapper/g; # (and similar) - s/result object/trap object/g; # consistency - s/object/trap/g; # argspec ~~ clarity - s/all/entirety/g; # argspec ~~ s/adjective/noun/ - s/indexed/element/g; # argspec ~~ s/adjective/noun/ - ... but keep backwards compatibility with the previous argspec, for now (just don't advertise it in the docs); Test::Trap::Builder: - clean up the test method generation code; - clean up the accessor method generation code; - clean up the layer registration code; - pass the args string to the simple layers; - new export method: Prop, returning a hash for tag-on properies; - new export method: DESTROY, cleaning up tag-on properties; - new export method: TestFailure, running on_test_failure tag-on; - new export method: TestAccessor, returning test_accessor tag-on; - pull out members test and accessor, as these are conceptually (private) trapper class state, not builder instance members; - pull out member output_layer_backend, as this is conceptually (private) builder class state, not a builder instance member; - turn members _code, _layers, _teardown, _test_accessor, and _exception, (all without the leading underscore) into tag-on properties, rather than pollute the trap object; - get rid of more trap object pollution: __exception; - in test callback argspecs, refer to trap objects as "trap", not "object"; - better handling of exceptions in layers and teardown. Test::Trap: - run the test failure callback from the quiet() test; - new utility method: diag_all, basically {diag dump $self}; - new utility method: diag_all_once, a "smarter" version. - new (non-default) pseudo-layers: :void - user code is trapped in void context :scalar - user code is trapped in scalar context :list - user code is trapped in list context :on_fail() - method name for test failures callback Tests: - full coverage for the new methods and exception handling; - t/00-load.t does BAIL_OUT if Test::Trap cannot be used; - t/07-subclass.t no longer needs to test the case of the empty default_output_layer_backends(), since this has now been removed from the extension interface; - t/06-layers.t cleaned up and expanded to cover the new layers; except - t/10-tester.t covers the :on_fail() layer; - t/10-tester.t now tests a simple non-leaveby accessor too; - t/11-systemsafe-basic.pl now actually prints diagnostics when the system() call fails. Duh! (I still don't know why some Cygwin setups fails these tests, but I'd sure like to.) 0.0.23 Mon Jun 25 22:47:50 CEST 2007 More blead stuff; otherwise just making a convenient small-stuff cut. Test::Trap: - Don't use IO::Handle here. (Only needed with File::Temp.) Test::Trap::Builder::PerlIO: - Don't need ->autoflush, nor IO::Handle. Test::Trap::Builder::TempFile: - Need IO::Handle, so use it. Test::Trap::Builder::SystemSafe: - Need IO::Handle, so use it. - The strange buffering bug seems to have disappeared (between revisions 99 and 100), though I have no idea how. This ought to mean I no longer need to maintain the clumsy work-around. So, removed! Tests: - As a concession to the CPANTS game, reinstated the pod tests. :) - The regression test for the workaround for the pseudo-fork bug was broken. Fixed by using the (implicit) :default layer in t/08-fork.pl. - t/02-reentrant.t caused a warning under bleed. Fixed. - t/03-files.pl is now blead-ready (warning texts changed). - t/11-systemsafe-basic.pl now detects system() failure and fails the relevant tests as well (thank you cpan testsers). 0.0.22 Sun May 20 23:21:36 CEST 2007 No big changes this time. Cleanup: - remove unused Getopt::Long from tests; - rearrange some tests for better readability; - rewrite some systemsafe pod for better readability. Tests: - delete $ENV{ENV} (tainted); - for coverage, first don't use Test::More in t/99-coverage.t; - for coverage, test the internals of exiting breaking badly; - simpler (and better covering) subclass tests. Test::Trap: - don't AUTOLOAD on behalf of Test::More after all (unclean); - last TEST_TRAP_EXITING rather than goto EXITING (avoid collisions). Test::Trap::Builder: - localize the builder's internals of the trap object, so that they are gone as soon as the trap has sprung, leaving pay data only; - last TEST_TRAP_BUILDER_INTERNAL_EXCEPTION rather than goto INTERNAL_EXCEPTION (avoid collision); - note (in the pod) a caveat for diamond inheritance wrt autogeneration of test methods. Build: - don't include author's tests (pod*, kwalitee, etc) in the tarball; - note _all_ mandatory module dependencies (overkill?). 0.0.21 Sun Oct 29 15:53:07 CET 2006 Test::Trap::Builder::SystemSafe: - Fix typo in the NAME section of the POD. Test::Trap::Builder: - Export a method ->TestAccessor, giving the tested accessor's name. - Remove (ugly) register method ->test_method. - Add (cleaner) register method ->test. Test::Trap: - Better diagnostics to failing *_ok/*_nok test. - AUTOLOAD Test::More when required. 0.0.20 Sun Oct 22 09:21:55 CEST 2006 Test::Trap::Builder: - Backend implementations are now methods, almost layers, not functions. - Called with the (layer) name, the fileno, and the globref. - local(*$globref) is now left to the implementation. - Add method ->trap, implementing trap entry. - Add exportable methods Run, Next, Exception, Teardown: - Run runs the user's code; - Next continues to the next layer; - Exception raises an internal exception; - Teardown registers cleanup code. Test::Trap::Builder::TempFile, Test::Trap::Builder::PerlIO: - Use ->Teardown instead of &DESTROY. Add Test::Trap::Builder::SystemSafe. - Add three test scripts for this. - Work hard, and make those tests pass on 5.6.2! :-) t/03-files.pl: Simpler, less hacky, choice of backend. t/07-subclass.t: Use the core alarm(), not the Time::HiRes one. t/08-fork.t: Remember to wait() on all children. t/99-coverage.t: What I cannot test without hacking. t/*{-no-,-}taint.t: - Since Windows fork() does not work with taint mode. t/*.t, t/*.pl: - Add comments and refactor into subroutines. - Replace pass()/fail() with simpler/clearer ok(). 0.0.19 Wed Sep 27 20:48:20 CEST 2006 No new functionality -- just bugfixes! Address three portability issues: - added binmode to the second handle on the tempfile; - skip timout tests if Time::HiRes::ualarm cannot be imported; - todo & skip the fork test on windows; - thanks go to Alexandr Ciornii for reporting these failures! Also: - document the fork() issue on Windows as a Test::Trap bug; - just skip the fork tests on platforms without fork; - drop the Time::HiRes dependency (we only need it for a test); - a little more POD and code (readability) cleanup. 0.0.18 Mon Sep 25 23:49:48 CEST 2006 Basically just pushing to get a well-packaged version out. Packaged with a newer MB to get a (hopefully) better META.yml. Cleaned up the error messages somewhat. 0.0.17 Sat Sep 23 00:47:13 CEST 2006 Overview: - Test::Temp gets new optional layers: :stdout(perlio) :stdout(tempfile) :stderr(perlio) :stderr(tempfile) - Test::Temp interface is otherwise unchanged. - Test::Trap::Builder interface is mostly unchanged, but now: - treats braces in layer names as syntactical; - has an interface for registering output layer backends; - also lets you register default backends; - has some more changes in non-interface (internal) functions. - Test::Trap::Builder::TempFile added. - Test::Trap::Builder::PerlIO added. Added a File::Temp backend for output layers, and require it. Made the PerlIO backend optional, and require no more than 5.6.0. Moved each backend to its own file. Update the tests to cover both backends. Skip the PerlIO backend tests if PerlIO is not availible. For whatever reason, make noisy ugly META.yml after upgrades. Let the user specify implementation, f ex: ":stdout(perlio)". Test this new interface. Update the POD. 0.0.16 Tue Sep 19 21:52:03 CEST 2006 Note dependency on perl 5.8.0 and Time::HiRes. Pod updates to Builder.pm. Added tests for layer permutation :raw:warn:stderr:stdout:exit:die. Added tester tests for TODO and SKIP. 0.0.15 Mon Sep 18 23:53:05 CEST 2006 Move the extension interface into its own Test::Trap::Builder. Change the extension interface somewhat: - methods on the builder object, not the calling package; - simpler methods for making accessors; - methods also for registering test method prototypes; - generate test methods from accessor + test pairs; - ... even if the test or accessor is inherited; - &layer_implementation needs both $module and $Builder now; - update the tests accordingly. Also, added some new tests for the builder. 0.0.14 Tue Sep 5 16:40:13 CEST 2006 Rewrite the "layer:$name" methods: - return the layer implementation rather than be it, and - can handle multi_layer definitions as well, - changing &layer, &layer_implementation, and &multi_layer. Update the POD accordingly. Add an example using the extension interface. Polish the POD, and add some more vertical spacing. 0.0.13 Tue Aug 29 06:54:05 CEST 2006 Add the standard test methods. Document them -- overall, not one by one. Test them -- using Test::Tester. Add a dependency on Test::Tester. Add a trustme for the pod coverage check. Add a dependency on Data::Dump (for quoting, more or less). Add factories for accessors and test methods. Let array accessors produce elements and slices as well. Add extra test methods: did_die, did_exit, did_return, quiet. Document these. Test them -- using Test::Tester. 0.0.12 Sun Aug 27 03:05:45 CEST 2006 Don't trap exits in children! Revert to outer exit-handler instead. Test undefined *CORE::GLOBAL::exit. Test forked exits. Document the fork/exit caveat. Rename some layers: :return:raw are now :raw:flow. Base non-empty layer specifications too on :default. Tests updated accordingly. 0.0.11 Sun Aug 27 01:51:30 CEST 2006 Test a bad class definition. Clean up the code. 0.0.10 Sun Aug 27 01:18:09 CEST 2006 Add tests for subclassing. Implement subclassing. 0.0.9 Sat Aug 26 23:51:26 CEST 2006 Implement layers as methods, anonymous or with mangled names. Update the special layers test accordingly. Move POD to beyond __END__. 0.0.8 Sat Aug 26 22:19:53 CEST 2006 s/mode/leaveby/g; 0.0.7 Thu Aug 24 04:35:04 CEST 2006 Implement user-defined trapper layers! Wrappers are now layers! Test trapper layers! 0.0.6 Thu Aug 24 02:28:08 CEST 2006 Protect the method calls of the local $trap test. Pull the wrapper list out of the exported sub and into its factory. Add a &write_trapper factory to replace &_trap_std{err,out}. Trap warnings as well. Add tests for trapping warnings. 0.0.5 Wed Aug 23 18:32:28 CEST 2006 Back to exporting just a scalar instead of the glob. Export an anonymous closure combo instead of our $trap / &trap. Eliminate our $trap / &trap. (Use a factory instead.) Update the tests accordingly. 0.0.4 Wed Aug 23 15:44:00 CEST 2006 New test: Apply local() to the scalar. Implementation: Export a glob instead of just the scalar. 0.0.3 Wed Aug 23 03:39:03 CEST 2006 Decompose the different wrappers. Eliminate the %trap hash. Update tests to account for: - missing 'die' was '', is now undef; - void 'return' was [undef], is now []; - missing 'return' was context dependent, is now undef. 0.0.2 Wed Aug 23 00:01:14 CEST 2006 Export a global scalar, by default $trap, instead of &trapped. Make &trap merely the default name of the function. Update tests accordingly. Test for ->import failing in various ways. Query exists &CORE::GLOBAL::exit instead of defined *...{CODE}. Add pod. 0.0.1 Sun Aug 6 15:26:47 CEST 2006 Began extracting useful stuff from messy old code.