BEGIN { if ($ENV{PERL_CORE}) { chdir 't' if -d 't'; @INC = ("../lib", "lib/compress"); } } use lib qw(t t/compress); use strict; use warnings; use bytes; use Test::More ; use CompTestUtils; BEGIN { plan(skip_all => "IO::Compress::Zstd not available" ) unless eval { require IO::Compress::Zstd; require IO::Uncompress::UnZstd; 1 } ; # use Test::NoWarnings, if available my $extra = 0 ; $extra = 1 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; plan tests => 12 + $extra ; } SKIP: { title "Check long content isn't truncated for uncompression"; # https://github.com/pmqs/IO-Compress-Zstd/issues/1 # $ zstdcat setup.zst | cksum - # 1769531523 17204641 - # $ zstdcat setup.zst | wc # 213003 907461 17204641 # $ zstdcat setup.zst | md5sum # 3f5b564eea6aa4bb39ebecad0b98d70b - my $filename = 't/files/setup.zst'; # Don't distribute file on CPAN skip "test file not available", 11 unless -e $filename ; eval { require Digest::MD5 } or skip "Digest::MD5 not available", 11; my $tmpDir ; my $lex = LexDir->new( $tmpDir ); my $original_compressed = readFile($filename); my $IN = new IO::Uncompress::UnZstd $filename or die "cannot open '$filename': $!\n"; my $length = 0; my $md5 = Digest::MD5->new ; my $uncompressed; while (<$IN>) { $length += length($_); $md5->add($_); $uncompressed .= $_ ; } is $length, 17204641, "Length matches"; is $md5->hexdigest, '3f5b564eea6aa4bb39ebecad0b98d70b', 'MD5 checksums match'; my $text = "$tmpDir/text"; writeFile($text, $uncompressed); # use IO::Compress::Zstd to an in-memory buffer use IO::Compress::Zstd qw(zstd $ZstdError); use IO::Uncompress::UnZstd qw(unzstd $UnZstdError); my $compressed; ok zstd \$uncompressed => \$compressed; my $new_uncompressed; unzstd \$compressed => \$new_uncompressed; ok $new_uncompressed eq $uncompressed; my $here; my $OUT = new IO::Compress::Zstd \$here ; for (split /\n/, $new_uncompressed) { print $OUT "$_\n"; } close $OUT ; ok length($here); ok unzstd \$here => \$new_uncompressed, transparent => 0 or diag "unstd failed"; ok $new_uncompressed eq $uncompressed; # output to a file my $outFileZstd = "$tmpDir/file1"; $OUT = new IO::Compress::Zstd $outFileZstd ; for (split /\n/, $new_uncompressed) { print $OUT "$_\n"; } close $OUT ; ok unzstd $outFileZstd => \$new_uncompressed, transparent => 0 or diag "unstd failed"; ok $new_uncompressed eq $uncompressed; { # Read from <> local @ARGV = $text ; my $outB ; my $FH = new IO::Compress::Zstd \$outB or die "$ZstdError"; # select $FH; while (<>) { print $FH $_; } close $FH ; $new_uncompressed = ''; ok unzstd \$outB => \$new_uncompressed, transparent => 0 or diag "unstd failed"; ok $new_uncompressed eq $uncompressed; } }