Test2::Harness::Plugin - Base class for Test2::Harness
plugins.
This class holds the methods specific to Test2::Harness which is
the backend. Most of the time you actually want to subclass
App::Yath::Plugin which subclasses this class, and holds additional methods
that apply to yath (the UI layer).
You probably want to subclass App::Yath::Plugin instead. This
class here mainly exists to separate concerns, but is not something you
should use directly.
package Test2::Harness::Plugin::MyPlugin;
use parent 'Test2::Harness::Plugin';
# ... Define methods
1;
- $plugin->munge_search($input, $default_search, $settings)
- $input is an arrayref of files and/or directories
provided at the command line.
$default_search is an arrayref with
the default files/directories pulled in when nothing is specified at the
command ine.
$settings is an instance of
Test2::Harness::Settings
- $undef_or_inst = $plugin->claim_file($path, $settings)
- This is a chance for a plugin to claim a test file early, before
Test2::Harness takes care of it. If your plugin does not want to claim the
file just return undef. To claim the file return an instance of
Test2::Harness::TestFile created with $path.
- $plugin->munge_files(\@tests, $settings)
- This is an opportunity for your plugin to modify the data for any test
file that will be run. The first argument is an arrayref of
Test2::Harness::TestFile objects.
- $hashref = $plugin->duration_data($settings, $test_names)
- If defined, this can return a hashref of duration data. This should return
undef if no duration data is provided. The first plugin listed that
provides duration data wins, no other plugins will be checked once
duration data is obtained.
Example duration data:
{
't/foo.t' => 'medium',
't/bar.t' => 'short',
't/baz.t' => 'long',
}
- $hashref_or_arrayref = $plugin->coverage_data(\@changed)
- $hashref_or_arrayref = $plugin->coverage_data()
- If defined, this can return a hashref of all coverage data, or an arrayref
of tests that cover the tests listed in @changed.
This should return undef if no coverage data is available. The first
plugin to provide coverage data wins, no other plugins will be checked
once coverage data has been obtained.
Examples:
[
'foo.t',
'bar.t',
'baz.t',
]
{
'lib/Foo.pm' => [
't/foo.t',
't/integration.t',
],
'lib/Bar.pm' => [
't/bar.t',
't/integration.t',
],
}
- $plugin->post_process_coverage_tests($settings, \@tests)
- This is an opportunity for a plugin to do post-processing on the list of
coverage tests to run. This is mainly useful to remove duplicates if
multiple plugins add coverage data, or merging entries where applicable.
This will be called after all plugins have generated their coverage test
list.
Plugins may implement this without implementing
coverage_data(), making this useful if you want to use a
pre-existing coverage module and want to do post-processing on what it
provides.
- $plugin->inject_run_data(meta => $meta, fields => $fields, run
=> $run)
- This is a callback that lets your plugin add meta-data or custom fields to
the run event. The meta-data and fields are available in the event log,
and are particularily useful to App::Yath::UI.
sub inject_run_data {
my $class = shift;
my %params = @_;
my $meta = $params{meta};
my $fields = $params{fields};
# Meta-data is a hash, each plugin should define its own key, and put
# data under that key
$meta->{MyPlugin}->{stuff} = "Stuff!";
# Fields is an array of fields that a UI might want to display when showing the run.
push @$fields => {name => 'MyPlugin', details => "Human Friendly Stuff", raw => "Less human friendly stuff", data => $all_the_stuff};
return;
}
- $plugin->setup($settings)
- This is a callback that lets you run setup logic when the runner starts.
Note that in a persistent runner this is run once on startup, it is not
run for each "run" command against the
persistent runner.
- $plugin->teardown($settings)
- This is a callback that lets you run teardown logic when the runner stops.
Note that in a persistent runner this is run once on termination, it is
not run for each "run" command against
the persistent runner.
- @files = $plugin->changed_files($settings)
- Get a list of files that have changed. Plugins are free to define what
"changed" means. This may be used by the finder to determine
what tests to run based on coverage data collected in previous runs.
Note that data from all changed_files() calls from all
plugins will be merged.
- ($type, $value) = $plugin->changed_diff($settings)
- Generate a diff that can be used to calculate changed files/subs for which
to run tests. Unlike changed_files(), only 1 diff will be used,
first plugin listed that returns one wins. This is not run at all if a
diff is provided via --changed-diff.
Diffs must be in the same format as this git command:
git diff -U1000000 -W --minimal BASE_BRANCH_OR_COMMIT
Some other diff formats may work by chance, but they are not
dirfectly supported. In the future other diff formats may be directly
supported, but not yet.
The following return sets are allowed:
- $exit = $plugin->shellcall($settings, $name, $cmd)
- $exit = $plugin->shellcall($settings, $name, @cmd)
- This is essentially the same as
"system()" except that STDERR and STDOUT
are redirected to files that the yath collector will pick up so that any
output from the command will be seen as events and will be part of the
yath log. If no workspace is available this will not redirect IO and it
will be identical to calling "system()".
This is particularily useful in
"setup()" and
"teardown()" when running external
commands, specially any that daemonize and continue to produce output
after the setup/teardown method has completed.
$name is required because it will be
used for filenames, and will be used as the output tag (best to limit it
to 8 characters).
- $plugin->redirect_io($settings, $name)
- WARNING: This must NEVER be called in a primary yath process. Only
use this in forked processes that you control. If this is used in a main
process it could hide ALL output.
This will redirect STDERR and STDOUT to files that will be
picked up by the yath collector so that any output appears as proper
yath events and will be included in the yath log.
$name is required because it will be
used for filenames, and will be used as the output tag (best to limit it
to 8 characters).
- $plugin->TO_JSON
- This is here as a bare minimum serialization method. It returns the plugin
class name.
The source code repository for Test2-Harness can be found at
http://github.com/Test-More/Test2-Harness/.
Copyright 2020 Chad Granum <exodist7@gmail.com>.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
See http://dev.perl.org/licenses/