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