File Coverage

blib/lib/Test2/Plugin/MemUsage.pm
Criterion Covered Total %
statement 30 30 100.0
branch 9 18 50.0
condition n/a
subroutine 6 6 100.0
pod 0 1 0.0
total 45 55 81.8


line stmt bran cond sub pod time code
1             package Test2::Plugin::MemUsage;
2 1     1   73980 use strict;
  1         2  
  1         28  
3 1     1   5 use warnings;
  1         2  
  1         61  
4              
5             our $VERSION = '0.002003';
6              
7 1     1   6 use Test2::API qw/test2_add_callback_exit/;
  1         2  
  1         540  
8              
9             my $ADDED_HOOK = 0;
10              
11             sub import {
12 1 50   1   31 return if $ADDED_HOOK++;
13              
14 1         3 test2_add_callback_exit(\&send_mem_event);
15             }
16              
17 1     1   6671 sub proc_file { "/proc/$$/status" }
18              
19             sub send_mem_event {
20 1     1 0 413 my ($ctx, $real, $new) = @_;
21              
22 1         4 my $file = proc_file();
23 1 50       25 return unless -f $file;
24              
25 1         4 my $stats;
26             {
27 1 50       2 open(my $fh, '<', $file) or die "Could not open file '$file' (<): $!";
  1         39  
28 1         6 local $/;
29 1         32 $stats = <$fh>;
30 1 50       19 close($fh) or die "Could not close file '$file': $!";
31             }
32              
33 1 50       4 return unless $stats;
34              
35 1         8 my %mem = (peak => ['NA', ''], size => ['NA', ''], rss => ['NA', '']);
36 1 50       14 $mem{peak} = [$1, $2] if $stats =~ m/VmPeak:\s+(\d+) (\S+)/;
37 1 50       9 $mem{size} = [$1, $2] if $stats =~ m/VmSize:\s+(\d+) (\S+)/;
38 1 50       8 $mem{rss} = [$1, $2] if $stats =~ m/VmRSS:\s+(\d+) (\S+)/;
39              
40 1 50       4 return unless grep { $_[0] ne 'NA' } values %mem;
  3         12  
41              
42 1         8 $mem{details} = "rss: $mem{rss}->[0]$mem{rss}->[1]\nsize: $mem{size}->[0]$mem{size}->[1]\npeak: $mem{peak}->[0]$mem{peak}->[1]";
43              
44             $ctx->send_ev2(
45             memory => \%mem,
46             about => {package => __PACKAGE__, details => $mem{details}},
47             info => [{tag => 'MEMORY', details => $mem{details}}],
48              
49             harness_job_fields => [
50             {name => 'mem_rss', details => $mem{rss}->[0] . $mem{rss}->[1]},
51             {name => 'mem_size', details => $mem{size}->[0] . $mem{size}->[1]},
52 1         18 {name => 'mem_peak', details => $mem{peak}->[0] . $mem{peak}->[1]},
53             ],
54             );
55             }
56              
57             1;
58              
59             __END__