The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- mode: perl -*-

use Test::More tests => 9;
use Fcntl;

BEGIN {
  use_ok('Compress::Bzip2');
};

our ( $debugf, $BZIP );

do './t/lib.pl';

my $INFILE = catfile( qw(bzlib-src sample0.ref) );
( my $MODELFILE = $INFILE ) =~ s/\.ref$/.bz2/;
my $PREFIX = catfile( qw(t 041-tmp) );

## verbosity 0-4, small 0,1, blockSize100k 1-9, workFactor 0-250, readUncompressed 0,1
my ( $d, $err, $in, $out, $buf, $res );

$d = Compress::Bzip2->new( -workFactor => 1000 );
ok( $d, "object created in spite of error" );
$err = $d->bzerror;
ok( $err, "error is set '$err' vs '$bzerrno'" );

$d->bzclearerr;

$err = $d->bzerror;
ok( !$err, "after bzclearerr, error is not set '$err' vs '$bzerrno'" );
my $TMPFILE = "$PREFIX-protected.bz2";
unlink( $TMPFILE ) if -f $TMPFILE;

SKIP: {
  skip "bzclose handle not with 5.6", 2 if $] < 5.008;
  sysopen( $out, $TMPFILE, O_WRONLY|O_CREAT ) or die "failed $TMPFILE $!";
  ok( $d->bzopen( $out, "w" ), "bzopen with file handle instead of file" );

  open( $in, "<", $INFILE );
  while ( my $ln = sysread( $in, $buf, 512 ) ) {
    $res = $d->bzwrite( $buf, $ln );
    if ( $res < 0 ) {
      print STDERR "error: $res $bzerrno\n";
      last;
    }
  }

  $res = $d->bzclose;
  ok( !$res, "file was closed $res $Compress::Bzip2::bzerrno" );
}

close($in);

if ($] < 5.008) {
  require File::Copy;
  File::Copy::syscopy($MODELFILE, $TMPFILE);
  chmod( 0644, $TMPFILE ) or die;
}
ok ( compare_binary_files( $MODELFILE, $TMPFILE ), "no differences with $MODELFILE reference" );

chmod( 0000, $TMPFILE ) or die;

SKIP: {
  skip "0000 but writable ($>/$^O)", 2 if -w $TMPFILE;

  $d = Compress::Bzip2->new( -verbosity => $debugf ? 4 : 0, -blockSize100k => 1 );
  $res = $d->bzopen( $TMPFILE, "w" );

  ok( !$res, "open failed" );

  $res = $d->bzerror;
  ok( $res, "error set, is '$res' '$bzerrno'" );
}