#!/usr/bin/perl -w
use strict;
use warnings;
use Test::More;
use File::Spec;
use MIME::Tools;
use MIME::Decoder;
#------------------------------------------------------------
# BEGIN
#------------------------------------------------------------
# Is gzip available? Quick and dirty test:
my $has_gzip;
foreach (split $^O eq "MSWin32" ? ';' : ':', $ENV{PATH}) {
last if ($has_gzip = -x "$_/gzip");
}
if ($has_gzip) {
require MIME::Decoder::Gzip64;
install MIME::Decoder::Gzip64 'x-gzip64';
}
# Get list of encodings we think we provide:
my @encodings = ('base64',
'quoted-printable',
'7bit',
'8bit',
'binary',
($has_gzip ? 'x-gzip64' : ()),
'x-uuencode',
'binhex');
plan( tests => scalar @encodings);
# Report what tests we may be skipping:
diag($has_gzip
? "Using gzip: $has_gzip"
: "No gzip: skipping x-gzip64 test");
# Test each encoding in turn:
my ($e, $eno) = (undef, 0);
foreach $e (@encodings) {
++$eno;
my $warning;
local $SIG{__WARN__} = sub {
$warning = $@;
};
my $decoder = MIME::Decoder->new($e);
unless(defined($decoder)) {
my $msg = "Encoding/decoding of $e not supported -- skipping test";
if( $warning =~ /^Can't locate ([^\s]+)/ ) {
$msg .= " (Can't locate $1)";
}
pass($msg);
next;
}
my $infile = File::Spec->catfile('.', 'testin', 'fun.txt');
my $encfile = File::Spec->catfile('.', 'testout', "fun.en$eno");
my $decfile = File::Spec->catfile('.', 'testout', "fun.de$eno");
# Encode:
open IN, "<$infile" or die "open $infile: $!";
open OUT, ">$encfile" or die "open $encfile: $!";
binmode IN; binmode OUT;
$decoder->encode(\*IN, \*OUT) or next;
close OUT;
close IN;
# Decode:
open IN, "<$encfile" or die "open $encfile: $!";
open OUT, ">$decfile" or die "open $decfile: $!";
binmode IN; binmode OUT;
$decoder->decode(\*IN, \*OUT) or next;
close OUT;
close IN;
# Can we compare?
if ($e =~ /^(binhex|base64|quoted-printable|binary|x-gzip64|x-uuencode)$/i) {
is(-s $infile, -s $decfile, "Encoding/decoding of $e: size of $infile == size of $decfile");
}
else {
pass("Encoding/decoding of $e: size not comparable, marking pass anyway");
}
}