#!perl
use Test::More;
use Test::Deep;
use Test::Exception;
use Data::Dumper;
use autodie;
plan 'tests' => 6;
use Pg::Explain;
my $plan_source = q{ QUERY PLAN
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Hash Left Join (cost=11.83..13.98 rows=11 width=268) (actual time=0.264..0.360 rows=42 loops=1)
Hash Cond: (p.gid = g.gid)
InitPlan 1 (returns $0)
-> Aggregate (cost=9.92..9.93 rows=1 width=0) (actual time=0.088..0.088 rows=1 loops=1)
-> Foreign Scan on passwd (cost=0.00..9.70 rows=87 width=0) (actual time=0.010..0.079 rows=42 loops=1)
Foreign File: /etc/passwd
Foreign File Size: 2079
-> Foreign Scan on passwd p (cost=0.00..2.10 rows=11 width=168) (actual time=0.019..0.090 rows=42 loops=1)
Foreign File: /etc/passwd
Foreign File Size: 2079
-> Hash (cost=1.80..1.80 rows=8 width=100) (actual time=0.112..0.112 rows=71 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 4kB
-> Foreign Scan on groups g (cost=0.00..1.80 rows=8 width=100) (actual time=0.013..0.080 rows=71 loops=1)
Foreign File: /etc/group
Foreign File Size: 987
Total runtime: 0.511 ms
};
my $explain = Pg::Explain->new( 'source' => $plan_source );
isa_ok( $explain, 'Pg::Explain' );
isa_ok( $explain->top_node, 'Pg::Explain::Node' );
lives_ok(
sub {
$explain->anonymize();
},
'Anonymization works',
);
my $textual = $explain->as_text();
ok( $textual !~ /passwd/, 'anonymize() hides foreign file names (passwd)' );
ok( $textual !~ /group/, 'anonymize() hides foreign file names (group)' );
my @files = $textual =~ m{^\s*Foreign File: (.*?)\s*$}mg;
my %counts = ();
for my $f ( @files ) {
$counts{$f}++;
}
my @just_counts = sort { $a <=> $b } values %counts;
my $counts_string = join ',', @just_counts;
ok( $counts_string eq '1,2', 'Same file anonymized to the same string' );
exit;