1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
package Test::Utils;
use strict;
use Exporter;
use Test::More;
use Text::Diff;
use FileHandle::Unget;
use File::Path;
use File::Spec::Functions qw(:ALL);
use vars qw( @EXPORT @ISA );
use Mail::Mbox::MessageParser;
use Mail::Mbox::MessageParser::MetaInfo;
@ISA = qw( Exporter );
@EXPORT = qw( CheckDiffs InitializeCache ModuleInstalled
Broken_Pipe No_such_file_or_directory
);
# ---------------------------------------------------------------------------
sub CheckDiffs
{
my @pairs = @_;
local $Test::Builder::Level = 2;
foreach my $pair (@pairs)
{
my $filename = $pair->[0];
my $output_filename = $pair->[1];
print "Comparing $output_filename to $filename\n";
my @diffs;
diff $output_filename, $filename, { STYLE => 'OldStyle', OUTPUT => \@diffs };
my $numdiffs = grep { /^[\d,]+[acd][\d,]+$/ } @diffs;
if ($numdiffs != 0)
{
open DIFF_OUTPUT, ">$output_filename.diff";
print DIFF_OUTPUT "diff \"$output_filename\" \"$filename\"\n";
print DIFF_OUTPUT @diffs;
close DIFF_OUTPUT;
print "Failed, with $numdiffs differences.\n";
print " See $output_filename.diff.\n";
ok(0,"Computing differences between $filename and $output_filename");
return;
}
else
{
print "Output $output_filename looks good.\n";
unlink $output_filename;
}
}
ok(1,"Computing differences");
}
# ---------------------------------------------------------------------------
sub InitializeCache
{
my $filename = shift;
my $cache_file = catfile('t','temp','cache');
rmtree $cache_file;
Mail::Mbox::MessageParser::SETUP_CACHE({'file_name' => $cache_file});
my $filehandle = new FileHandle::Unget($filename);
my $folder_reader =
new Mail::Mbox::MessageParser( {
'file_name' => $filename,
'file_handle' => $filehandle,
'enable_cache' => 1,
'enable_grep' => 0,
} );
die $folder_reader unless ref $folder_reader;
my $prologue = $folder_reader->prologue;
# This is the main loop. It's executed once for each email
while(!$folder_reader->end_of_file())
{
$folder_reader->read_next_email();
}
$filehandle->close();
Mail::Mbox::MessageParser::MetaInfo::WRITE_CACHE();
# Check that the cache is actually there
die "Couldn't initialize cache" unless -e $cache_file;
}
# ---------------------------------------------------------------------------
sub ModuleInstalled
{
my $module_name = shift;
$module_name =~ s#::#/#g;
$module_name .= '.pm';
foreach my $inc (@INC)
{
return 1 if -e catfile($inc,$module_name);
}
return 0;
}
# ---------------------------------------------------------------------------
sub No_such_file_or_directory
{
my $filename = 0;
$filename++ while -e $filename;
local $!;
my $foo = new FileHandle;
$foo->open($filename);
die q{Couldn't determine local text for "No such file or directory"}
if $! eq '';
return $!;
}
# ---------------------------------------------------------------------------
# I think this works, but I haven't been able to test it because I can't find
# a system which will report a broken pipe. Also, is there a pure Perl way of
# doing this?
sub Broken_Pipe
{
mkdir catdir('t','temp'), 0700;
my $script_path = catfile('t','temp','broken_pipe.pl');
my $dev_null = devnull();
open F, ">$script_path";
print F<<EOF;
unless (open B, '-|')
{
open(F, "|$^X -pe 'print' 2>$dev_null");
print F 'x';
close F;
exit;
}
EOF
close F;
my $result = `$^X $script_path 2>&1 1>$dev_null`;
$result = '' unless defined $result;
return $result;
}
# ---------------------------------------------------------------------------
1;
|