The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! perl
use strict;
use 5.006002;
use Compress::Bzip2;
use File::Spec;
use Memory::Usage;
# Note that Test::LeakTrace does not find the XS leaks here. Always use Memory::Usage also.

use constant MAX   => 5; # MAX times all files in t => 125MB with 75, 15MB with 5, 43MB with 25
use constant MAX_5 => MAX >= 5 ? MAX / 5 : 1;
my $bigfile = File::Spec->catfile('t', '090-tmp-bigfile.bz2');

sub t_compress {
  warn "Creating $bigfile ...\n";
  my $buf;
  my $mu = Memory::Usage->new();
  $mu->record("Before bzopen");
  my $bz = Compress::Bzip2::bzopen($bigfile, "w");
  for (0 .. MAX) {
    $mu->record("Before bzwrite: $_") unless $_ % MAX_5;
    for my $infile (glob "t/*") {
      next if $infile eq $bigfile;
      open(my $fh, "<", $infile);
      while ( read( $fh, $buf, 65335 ) ) {
        $bz->bzwrite( $buf );
      }
      close $fh;
    }
    $mu->record("After bzwrite: $_") unless $_ % MAX_5;
  }
  $bz->bzclose;
  $mu->record("After bzclose");
  $mu->dump();
  system("bunzip2", "-tv", $bigfile);
  warn("  size: ", -s $bigfile, "\n");
}

sub t_uncompress {
  warn "Uncompressing $bigfile 5x ...\n";
  my $buf;
  my $mu = Memory::Usage->new();
  for ( 1 .. 5 ) {
    my $bz = Compress::Bzip2::bzinflateInit( -verbosity => 0 );
    $mu->record("Before bunzip: $_");
    open( my $fh, '<', $bigfile );
    while ( read( $fh, $buf, 65335 ) ) {
        my ( $output, $status ) = $bz->bzinflate( $buf );
    }
    close($fh);
    $bz->bzclose();
    $mu->record("After bunzip: $_");
  }
  $mu->dump();
}

t_compress() unless -f $bigfile;
t_uncompress();

unlink $bigfile;