xref: /openbsd-src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/EventFacet/Trace.pm (revision 5486feefcc8cb79b19e014ab332cc5dfd05b3b33)
15759b3d2Safresh1package Test2::EventFacet::Trace;
25759b3d2Safresh1use strict;
35759b3d2Safresh1use warnings;
45759b3d2Safresh1
5*5486feefSafresh1our $VERSION = '1.302199';
65759b3d2Safresh1
75759b3d2Safresh1BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) }
85759b3d2Safresh1
9f3efcd01Safresh1use Test2::Util qw/get_tid pkg_to_file gen_uid/;
10*5486feefSafresh1use Time::HiRes qw/time/;
115759b3d2Safresh1use Carp qw/confess/;
125759b3d2Safresh1
13*5486feefSafresh1use Test2::Util::HashBase qw{^frame ^pid ^tid ^cid -hid -nested details -buffered -uuid -huuid <full_caller <stamp};
145759b3d2Safresh1
155759b3d2Safresh1{
165759b3d2Safresh1    no warnings 'once';
175759b3d2Safresh1    *DETAIL = \&DETAILS;
185759b3d2Safresh1    *detail = \&details;
195759b3d2Safresh1    *set_detail = \&set_details;
205759b3d2Safresh1}
215759b3d2Safresh1
225759b3d2Safresh1sub init {
235759b3d2Safresh1    confess "The 'frame' attribute is required"
245759b3d2Safresh1        unless $_[0]->{+FRAME};
255759b3d2Safresh1
265759b3d2Safresh1    $_[0]->{+DETAILS} = delete $_[0]->{detail} if $_[0]->{detail};
275759b3d2Safresh1
28f3efcd01Safresh1    unless (defined($_[0]->{+PID}) || defined($_[0]->{+TID}) || defined($_[0]->{+CID})) {
295759b3d2Safresh1        $_[0]->{+PID} = $$        unless defined $_[0]->{+PID};
305759b3d2Safresh1        $_[0]->{+TID} = get_tid() unless defined $_[0]->{+TID};
315759b3d2Safresh1    }
32f3efcd01Safresh1}
335759b3d2Safresh1
345759b3d2Safresh1sub snapshot {
355759b3d2Safresh1    my ($orig, @override) = @_;
365759b3d2Safresh1    bless {%$orig, @override}, __PACKAGE__;
375759b3d2Safresh1}
385759b3d2Safresh1
395759b3d2Safresh1sub signature {
405759b3d2Safresh1    my $self = shift;
415759b3d2Safresh1
425759b3d2Safresh1    # Signature is only valid if all of these fields are defined, there is no
435759b3d2Safresh1    # signature if any is missing. '0' is ok, but '' is not.
445759b3d2Safresh1    return join ':' => map { (defined($_) && length($_)) ? $_ : return undef } (
455759b3d2Safresh1        $self->{+CID},
465759b3d2Safresh1        $self->{+PID},
475759b3d2Safresh1        $self->{+TID},
485759b3d2Safresh1        $self->{+FRAME}->[1],
495759b3d2Safresh1        $self->{+FRAME}->[2],
505759b3d2Safresh1    );
515759b3d2Safresh1}
525759b3d2Safresh1
535759b3d2Safresh1sub debug {
545759b3d2Safresh1    my $self = shift;
555759b3d2Safresh1    return $self->{+DETAILS} if $self->{+DETAILS};
565759b3d2Safresh1    my ($pkg, $file, $line) = $self->call;
575759b3d2Safresh1    return "at $file line $line";
585759b3d2Safresh1}
595759b3d2Safresh1
605759b3d2Safresh1sub alert {
615759b3d2Safresh1    my $self = shift;
625759b3d2Safresh1    my ($msg) = @_;
635759b3d2Safresh1    warn $msg . ' ' . $self->debug . ".\n";
645759b3d2Safresh1}
655759b3d2Safresh1
665759b3d2Safresh1sub throw {
675759b3d2Safresh1    my $self = shift;
685759b3d2Safresh1    my ($msg) = @_;
695759b3d2Safresh1    die $msg . ' ' . $self->debug . ".\n";
705759b3d2Safresh1}
715759b3d2Safresh1
725759b3d2Safresh1sub call { @{$_[0]->{+FRAME}} }
735759b3d2Safresh1
74256a93a4Safresh1sub full_call { @{$_[0]->{+FULL_CALLER}} }
75256a93a4Safresh1
765759b3d2Safresh1sub package { $_[0]->{+FRAME}->[0] }
775759b3d2Safresh1sub file    { $_[0]->{+FRAME}->[1] }
785759b3d2Safresh1sub line    { $_[0]->{+FRAME}->[2] }
795759b3d2Safresh1sub subname { $_[0]->{+FRAME}->[3] }
805759b3d2Safresh1
81256a93a4Safresh1sub warning_bits { $_[0]->{+FULL_CALLER} ? $_[0]->{+FULL_CALLER}->[9] : undef }
82256a93a4Safresh1
835759b3d2Safresh11;
845759b3d2Safresh1
855759b3d2Safresh1__END__
865759b3d2Safresh1
875759b3d2Safresh1=pod
885759b3d2Safresh1
895759b3d2Safresh1=encoding UTF-8
905759b3d2Safresh1
915759b3d2Safresh1=head1 NAME
925759b3d2Safresh1
935759b3d2Safresh1Test2::EventFacet::Trace - Debug information for events
945759b3d2Safresh1
955759b3d2Safresh1=head1 DESCRIPTION
965759b3d2Safresh1
975759b3d2Safresh1The L<Test2::API::Context> object, as well as all L<Test2::Event> types need to
985759b3d2Safresh1have access to information about where they were created.  This object
995759b3d2Safresh1represents that information.
1005759b3d2Safresh1
1015759b3d2Safresh1=head1 SYNOPSIS
1025759b3d2Safresh1
1035759b3d2Safresh1    use Test2::EventFacet::Trace;
1045759b3d2Safresh1
1055759b3d2Safresh1    my $trace = Test2::EventFacet::Trace->new(
1065759b3d2Safresh1        frame => [$package, $file, $line, $subname],
1075759b3d2Safresh1    );
1085759b3d2Safresh1
1095759b3d2Safresh1=head1 FACET FIELDS
1105759b3d2Safresh1
1115759b3d2Safresh1=over 4
1125759b3d2Safresh1
1135759b3d2Safresh1=item $string = $trace->{details}
1145759b3d2Safresh1
1155759b3d2Safresh1=item $string = $trace->details()
1165759b3d2Safresh1
1175759b3d2Safresh1Used as a custom trace message that will be used INSTEAD of
1185759b3d2Safresh1C<< at <FILE> line <LINE> >> when calling C<< $trace->debug >>.
1195759b3d2Safresh1
1205759b3d2Safresh1=item $frame = $trace->{frame}
1215759b3d2Safresh1
1225759b3d2Safresh1=item $frame = $trace->frame()
1235759b3d2Safresh1
1245759b3d2Safresh1Get the call frame arrayref.
1255759b3d2Safresh1
126256a93a4Safresh1    [$package, $file, $line, $subname]
127256a93a4Safresh1
1285759b3d2Safresh1=item $int = $trace->{pid}
1295759b3d2Safresh1
1305759b3d2Safresh1=item $int = $trace->pid()
1315759b3d2Safresh1
1325759b3d2Safresh1The process ID in which the event was generated.
1335759b3d2Safresh1
1345759b3d2Safresh1=item $int = $trace->{tid}
1355759b3d2Safresh1
1365759b3d2Safresh1=item $int = $trace->tid()
1375759b3d2Safresh1
1385759b3d2Safresh1The thread ID in which the event was generated.
1395759b3d2Safresh1
1405759b3d2Safresh1=item $id = $trace->{cid}
1415759b3d2Safresh1
1425759b3d2Safresh1=item $id = $trace->cid()
1435759b3d2Safresh1
1445759b3d2Safresh1The ID of the context that was used to create the event.
1455759b3d2Safresh1
1465759b3d2Safresh1=item $uuid = $trace->{uuid}
1475759b3d2Safresh1
1485759b3d2Safresh1=item $uuid = $trace->uuid()
1495759b3d2Safresh1
1505759b3d2Safresh1The UUID of the context that was used to create the event. (If uuid tagging was
1515759b3d2Safresh1enabled)
1525759b3d2Safresh1
153256a93a4Safresh1=item ($pkg, $file, $line, $subname) = $trace->call
154256a93a4Safresh1
155256a93a4Safresh1Get the basic call info as a list.
156256a93a4Safresh1
157256a93a4Safresh1=item @caller = $trace->full_call
158256a93a4Safresh1
159256a93a4Safresh1Get the full caller(N) results.
160256a93a4Safresh1
161256a93a4Safresh1=item $warning_bits = $trace->warning_bits
162256a93a4Safresh1
163256a93a4Safresh1Get index 9 from the full caller info. This is the warnings_bits field.
164256a93a4Safresh1
165256a93a4Safresh1The value of this is not portable across perl versions or even processes.
166256a93a4Safresh1However it can be used in the process that generated it to reproduce the
167256a93a4Safresh1warnings settings in a new scope.
168256a93a4Safresh1
169256a93a4Safresh1    eval <<EOT;
170256a93a4Safresh1    BEGIN { ${^WARNING_BITS} = $trace->warning_bits };
171256a93a4Safresh1    ... context's warning settings apply here ...
172256a93a4Safresh1    EOT
173256a93a4Safresh1
1745759b3d2Safresh1=back
1755759b3d2Safresh1
1765759b3d2Safresh1=head2 DISCOURAGED HUB RELATED FIELDS
1775759b3d2Safresh1
1785759b3d2Safresh1These fields were not always set properly by tools. These are B<MOSTLY>
1795759b3d2Safresh1deprecated by the L<Test2::EventFacet::Hub> facets. These fields are not
1805759b3d2Safresh1required, and may only reflect the hub that was current when the event was
1815759b3d2Safresh1created, which is not necessarily the same as the hub the event was sent
1825759b3d2Safresh1through.
1835759b3d2Safresh1
1845759b3d2Safresh1Some tools did do a good job setting these to the correct hub, but you cannot
1855759b3d2Safresh1always rely on that. Use the 'hubs' facet list instead.
1865759b3d2Safresh1
1875759b3d2Safresh1=over 4
1885759b3d2Safresh1
1895759b3d2Safresh1=item $hid = $trace->{hid}
1905759b3d2Safresh1
1915759b3d2Safresh1=item $hid = $trace->hid()
1925759b3d2Safresh1
1935759b3d2Safresh1The ID of the hub that was current when the event was created.
1945759b3d2Safresh1
1955759b3d2Safresh1=item $huuid = $trace->{huuid}
1965759b3d2Safresh1
1975759b3d2Safresh1=item $huuid = $trace->huuid()
1985759b3d2Safresh1
1995759b3d2Safresh1The UUID of the hub that was current when the event was created. (If uuid
2005759b3d2Safresh1tagging was enabled).
2015759b3d2Safresh1
2025759b3d2Safresh1=item $int = $trace->{nested}
2035759b3d2Safresh1
2045759b3d2Safresh1=item $int = $trace->nested()
2055759b3d2Safresh1
2065759b3d2Safresh1How deeply nested the event is.
2075759b3d2Safresh1
2085759b3d2Safresh1=item $bool = $trace->{buffered}
2095759b3d2Safresh1
2105759b3d2Safresh1=item $bool = $trace->buffered()
2115759b3d2Safresh1
2125759b3d2Safresh1True if the event was buffered and not sent to the formatter independent of a
2135759b3d2Safresh1parent (This should never be set when nested is C<0> or C<undef>).
2145759b3d2Safresh1
2155759b3d2Safresh1=back
2165759b3d2Safresh1
2175759b3d2Safresh1=head1 METHODS
2185759b3d2Safresh1
2195759b3d2Safresh1B<Note:> All facet frames are also methods.
2205759b3d2Safresh1
2215759b3d2Safresh1=over 4
2225759b3d2Safresh1
2235759b3d2Safresh1=item $trace->set_detail($msg)
2245759b3d2Safresh1
2255759b3d2Safresh1=item $msg = $trace->detail
2265759b3d2Safresh1
2275759b3d2Safresh1Used to get/set a custom trace message that will be used INSTEAD of
2285759b3d2Safresh1C<< at <FILE> line <LINE> >> when calling C<< $trace->debug >>.
2295759b3d2Safresh1
2305759b3d2Safresh1C<detail()> is an alias to the C<details> facet field for backwards
2315759b3d2Safresh1compatibility.
2325759b3d2Safresh1
2335759b3d2Safresh1=item $str = $trace->debug
2345759b3d2Safresh1
2355759b3d2Safresh1Typically returns the string C<< at <FILE> line <LINE> >>. If C<detail> is set
2365759b3d2Safresh1then its value will be returned instead.
2375759b3d2Safresh1
2385759b3d2Safresh1=item $trace->alert($MESSAGE)
2395759b3d2Safresh1
2405759b3d2Safresh1This issues a warning at the frame (filename and line number where
2415759b3d2Safresh1errors should be reported).
2425759b3d2Safresh1
2435759b3d2Safresh1=item $trace->throw($MESSAGE)
2445759b3d2Safresh1
2455759b3d2Safresh1This throws an exception at the frame (filename and line number where
2465759b3d2Safresh1errors should be reported).
2475759b3d2Safresh1
2485759b3d2Safresh1=item ($package, $file, $line, $subname) = $trace->call()
2495759b3d2Safresh1
2505759b3d2Safresh1Get the caller details for the debug-info. This is where errors should be
2515759b3d2Safresh1reported.
2525759b3d2Safresh1
2535759b3d2Safresh1=item $pkg = $trace->package
2545759b3d2Safresh1
2555759b3d2Safresh1Get the debug-info package.
2565759b3d2Safresh1
2575759b3d2Safresh1=item $file = $trace->file
2585759b3d2Safresh1
2595759b3d2Safresh1Get the debug-info filename.
2605759b3d2Safresh1
2615759b3d2Safresh1=item $line = $trace->line
2625759b3d2Safresh1
2635759b3d2Safresh1Get the debug-info line number.
2645759b3d2Safresh1
2655759b3d2Safresh1=item $subname = $trace->subname
2665759b3d2Safresh1
2675759b3d2Safresh1Get the debug-info subroutine name.
2685759b3d2Safresh1
2695759b3d2Safresh1=item $sig = trace->signature
2705759b3d2Safresh1
2715759b3d2Safresh1Get a signature string that identifies this trace. This is used to check if
272f3efcd01Safresh1multiple events are related. The signature includes pid, tid, file, line
273f3efcd01Safresh1number, and the cid.
2745759b3d2Safresh1
2755759b3d2Safresh1=back
2765759b3d2Safresh1
2775759b3d2Safresh1=head1 SOURCE
2785759b3d2Safresh1
2795759b3d2Safresh1The source code repository for Test2 can be found at
280*5486feefSafresh1L<https://github.com/Test-More/test-more/>.
2815759b3d2Safresh1
2825759b3d2Safresh1=head1 MAINTAINERS
2835759b3d2Safresh1
2845759b3d2Safresh1=over 4
2855759b3d2Safresh1
2865759b3d2Safresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt>
2875759b3d2Safresh1
2885759b3d2Safresh1=back
2895759b3d2Safresh1
2905759b3d2Safresh1=head1 AUTHORS
2915759b3d2Safresh1
2925759b3d2Safresh1=over 4
2935759b3d2Safresh1
2945759b3d2Safresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt>
2955759b3d2Safresh1
2965759b3d2Safresh1=back
2975759b3d2Safresh1
2985759b3d2Safresh1=head1 COPYRIGHT
2995759b3d2Safresh1
300256a93a4Safresh1Copyright 2020 Chad Granum E<lt>exodist@cpan.orgE<gt>.
3015759b3d2Safresh1
3025759b3d2Safresh1This program is free software; you can redistribute it and/or
3035759b3d2Safresh1modify it under the same terms as Perl itself.
3045759b3d2Safresh1
305*5486feefSafresh1See L<https://dev.perl.org/licenses/>
3065759b3d2Safresh1
3075759b3d2Safresh1=cut
308