Test::Weaken::ExtraBits -- various extras for Test::Weaken
use Test::Weaken::ExtraBits;
This is a few helper functions for use with Test::Weaken.
Test::Weaken
Nothing is exported by default, but the functions can be requested individually in the usual Exporter style (see Exporter).
Exporter
use Test::Weaken::ExtraBits qw(ignore_Class_Singleton);
$io = Test::Weaken::ExtraBits::contents_glob_IO ($ref)
If $ref is a globref then return the contents of its IO slot. This is the underlying Perl I/O of a file handle.
$ref
IO
Note that Test::Weaken 3.006 doesn't track IO objects by default so to detect leaks of them add to tracked_types too,
tracked_types
leaks (constructor => sub { ... }, contents => \&Test::Weaken::ExtraBits::contents_glob_IO, tracked_types => ['IO']);
This is good for detecting an open file leaked through a Perl-level dup (see "open" in perlfunc) even after its original $fh handle is destroyed and freed.
$fh
open my $dupfh, '<', $fh; # $dupfh holds and uses *$fh{IO}
$bool = Test::Weaken::ExtraBits::ignore_global_functions ($ref)
Return true if $ref is a coderef to a global function like
sub foo {}
A global function is identified by the $ref having a name and the current function under that name equal to this $ref. Plain functions created as sub foo {} etc work, but redefinitions or function-creating modules like Memoize or constant generally don't.
Memoize
constant
The name in a coderef is essentially just a string from its original creation. Things like Memoize etc often end up with anonymous functions. constant only ends up with a name in the symtab optimization case.
See Sub::Name to add a name to a coderef, though you probably wouldn't want that merely to make ignore_global_functions() work. (Though a name can help caller() and stack backtraces too.)
ignore_global_functions()
caller()
$bool = ignore_functions ($ref, $funcname, $funcname, ...)
Return true if $ref is a coderef to any of the given named functions. This is designed for use when making an ignore handler,
sub my_ignore_callback { my ($ref) = @_; return (ignore_functions ($ref, 'Foo::Bar::somefunc', 'Quux::anotherfunc') || ...); }
Each $funcname argument should be a fully-qualified string like Foo::Bar::somefunc. Any functions which doesn't exist are skipped, so it doesn't matter if a particular package is loaded yet, etc.
$funcname
Foo::Bar::somefunc
If you've got coderefs to functions you want to ignore then there's no need for ignore_functions(), just test $ref==$mycoderef etc.
ignore_functions()
$ref==$mycoderef
$bool = Test::Weaken::ExtraBits::ignore_Class_Singleton ($ref)
Return true if $ref is the singleton instance object of a class using Class::Singleton. If Class::Singleton is not loaded or not used by the $ref object then return false.
Class::Singleton
Generally Class::Singleton objects are permanent, existing for the duration of the program. This ignore helps skip them.
The current implementation requires Class::Singleton version 1.04 for its has_instance() method.
has_instance()
$bool = Test::Weaken::ExtraBits::ignore_DBI_globals ($ref)
Return true if $ref is one of the various DBI module global objects.
DBI
This is slightly dependent on the DBI implementation but currently means any DBI::dr driver object. A driver object is created permanently for each driver loaded. DBI::db handles (created and destroyed in the usual way) refer to their respective driver object.
DBI::dr
DBI::db
A bug in Perl through to at least 5.10.1 related to lvalue substr() means certain scratchpad temporaries holding "ImplementorClass" strings in DBI end up still alive after DBI::db and DBI::st objects have finished with them, looking like leaks, but not. They aren't recognised by ignore_DBI_globals currently. A workaround is to do a dummy DBI::db handle creation to flush out the old scratchpad.
substr()
DBI::st
ignore_DBI_globals
Test::Weaken, Test::Weaken::Gtk2
Class::Singleton, DBI
http://user42.tuxfamily.org/test-variousbits/index.html
Copyright 2008, 2009, 2010, 2011, 2012, 2015 Kevin Ryde
Test-VariousBits 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, or (at your option) any later version.
Test-VariousBits 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 Test-VariousBits. If not, see http://www.gnu.org/licenses/.
To install Test::VariousBits, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Test::VariousBits
CPAN shell
perl -MCPAN -e shell install Test::VariousBits
For more information on module installation, please visit the detailed CPAN module installation guide.