The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/sw/bin/perl -w
#
# Blatantly based on the YAML::Syck leak testcases written by Clayton 
# O'Neill and Andrew Danforth

use strict;
use Convert::Bencode_XS qw(bencode bdecode);
use Test::More tests => 6;

SKIP: {
    eval { require Devel::Leak }
      or skip( "Devel::Leak not installed", 6 );

    my $struct = { foo => 'bar', nums => [ 1,2,3 ], this => 'that' };
    my $encoded = bencode($struct);

    my $handle;
    my $diff;

    bencode($struct);

    my $before = Devel::Leak::NoteSV($handle);
    bencode($struct) foreach( 1 .. 100);
    $diff = Devel::Leak::NoteSV($handle) - $before;
    is( $diff, 0, "No leaks - bencode" );

    # Run one decode to create all the expected SVs
    bdecode($encoded);

    $before = Devel::Leak::NoteSV($handle);
    bdecode($encoded) foreach ( 1 .. 100 );
    $diff = Devel::Leak::NoteSV($handle) - $before;
    is( $diff, 0, "No leaks - bdecode" );

    $encoded = 'd3:food4:this4:thate3:bar';
    eval { bdecode($encoded) };
    ok ( $@, "bdecode failed (expected)" );
    eval { bdecode($encoded) };
    $before = Devel::Leak::NoteSV($handle);
    eval { bdecode($encoded) };
    $diff = Devel::Leak::NoteSV($handle) - $before;
    is( $diff, 0, "No leaks - bdecode incomplete dictionary" );

    $encoded = 'l3:foo3:bar';
    eval { bdecode($encoded) };
    ok ( $@, "bdecode failed (expected)" );
    eval { bdecode($encoded) };
    $before = Devel::Leak::NoteSV($handle);
    eval { bdecode($encoded) };
    $diff = Devel::Leak::NoteSV($handle) - $before;
    is( $diff, 0, "No leaks - bdecode incomplete list" );
}