1#!/usr/bin/perl 2 3# Test that we can reset a file midway through parsing. 4 5use strict; 6 7use File::Temp qw(tempfile); 8use Test::More; 9use lib 't'; 10use Mail::Mbox::MessageParser; 11use Mail::Mbox::MessageParser::Config; 12use File::Spec::Functions qw(:ALL); 13use Test::Utils; 14use FileHandle; 15 16eval 'require Storable;'; 17 18my @files = <t/mailboxes/*.txt>; 19@files = grep { $_ ne 't/mailboxes/vm-emacs.txt' } @files; 20 21plan (tests => 6 * scalar (@files)); 22 23foreach my $filename (@files) 24{ 25 print "Testing filename: $filename\n"; 26 27 print "Testing partial mailbox reset with Perl implementation\n"; 28 TestPartialRead($filename,0,0); 29 30 SKIP: 31 { 32 print "Testing partial mailbox reset with Cache implementation\n"; 33 34 skip('Storable not installed',1) unless defined $Storable::VERSION; 35 36 InitializeCache($filename); 37 38 TestPartialRead($filename,1,0); 39 } 40 41 SKIP: 42 { 43 print "Testing partial mailbox reset with Grep implementation\n"; 44 45 skip('GNU grep not available',1) 46 unless defined $Mail::Mbox::MessageParser::Config{'programs'}{'grep'}; 47 48 TestPartialRead($filename,0,1); 49 } 50 51 print "Testing full mailbox reset with Perl implementation\n"; 52 TestFullRead($filename,0,0); 53 54 SKIP: 55 { 56 print "Testing full mailbox reset with Cache implementation\n"; 57 58 skip('Storable not installed',1) unless defined $Storable::VERSION; 59 60 TestFullRead($filename,1,0); 61 } 62 63 SKIP: 64 { 65 print "Testing full mailbox reset with Grep implementation\n"; 66 67 skip('GNU grep not available',1) 68 unless defined $Mail::Mbox::MessageParser::Config{'programs'}{'grep'}; 69 70 TestFullRead($filename,0,1); 71 } 72} 73 74# --------------------------------------------------------------------------- 75 76sub TestPartialRead 77{ 78 my $filename = shift; 79 my $enable_cache = shift; 80 my $enable_grep = shift; 81 82 my $testname = [splitdir($0)]->[-1]; 83 $testname =~ s/\.t//; 84 85 my ($folder_name) = $filename =~ /\/([^\/\\]*)\.txt$/; 86 87 my ($output_fh, $output_fn) = tempfile(); 88 binmode $output_fh; 89 90 my $filehandle = new FileHandle($filename); 91 92 my ($cache_fh, $cache_fn) = tempfile(); 93 94 Mail::Mbox::MessageParser::SETUP_CACHE({'file_name' => $cache_fn}) 95 if $enable_cache; 96 97 my $folder_reader = 98 new Mail::Mbox::MessageParser( { 99 'file_name' => $filename, 100 'file_handle' => $filehandle, 101 'enable_cache' => $enable_cache, 102 'enable_grep' => $enable_grep, 103 } ); 104 105 die $folder_reader unless ref $folder_reader; 106 107 # Read just 1 email 108 $folder_reader->read_next_email(); 109 110 $folder_reader->reset(); 111 112 print $output_fh $folder_reader->prologue; 113 114 # This is the main loop. It's executed once for each email 115 while(!$folder_reader->end_of_file()) 116 { 117 my $email = $folder_reader->read_next_email(); 118 print $output_fh 119 "number: " . $folder_reader->number() . $folder_reader->endline() . 120 "line: " . $folder_reader->line_number() . $folder_reader->endline() . 121 "offset: " . $folder_reader->offset() . $folder_reader->endline() . 122 "bytes: " . $folder_reader->length() . $folder_reader->endline() . 123 $$email; 124 } 125 126 $output_fh->close(); 127 128 my $compare_filename = catfile('t','results',"${testname}_${folder_name}.stdout"); 129 130 CheckDiffs([$compare_filename,$output_fn]); 131} 132 133# --------------------------------------------------------------------------- 134 135sub TestFullRead 136{ 137 my $filename = shift; 138 my $enable_cache = shift; 139 my $enable_grep = shift; 140 141 my $testname = [splitdir($0)]->[-1]; 142 $testname =~ s#\.t##; 143 144 my ($folder_name) = $filename =~ /\/([^\/\\]*)\.txt$/; 145 146 my ($output_fh, $output_fn) = tempfile(); 147 binmode $output_fh; 148 149 my $filehandle = new FileHandle($filename); 150 151 my ($cache_fh, $cache_fn) = tempfile(); 152 153 Mail::Mbox::MessageParser::SETUP_CACHE({'file_name' => $cache_fn}) 154 if $enable_cache; 155 156 my $folder_reader = 157 new Mail::Mbox::MessageParser( { 158 'file_name' => $filename, 159 'file_handle' => $filehandle, 160 'enable_cache' => $enable_cache, 161 'enable_grep' => $enable_grep, 162 'debug' => $ENV{TEST_VERBOSE}, 163 } ); 164 165 die $folder_reader unless ref $folder_reader; 166 167 # Read whole mailbox 168 while(!$folder_reader->end_of_file()) 169 { 170 $folder_reader->read_next_email(); 171 } 172 173 $folder_reader->reset(); 174 175 print $output_fh $folder_reader->prologue; 176 177 # This is the main loop. It's executed once for each email 178 while(!$folder_reader->end_of_file()) 179 { 180 my $email = $folder_reader->read_next_email(); 181 print $output_fh 182 "number: " . $folder_reader->number() . $folder_reader->endline() . 183 "line: " . $folder_reader->line_number() . $folder_reader->endline() . 184 "offset: " . $folder_reader->offset() . $folder_reader->endline() . 185 "bytes: " . $folder_reader->length() . $folder_reader->endline() . 186 $$email; 187 } 188 189 $output_fh->close(); 190 191 my $compare_filename = 192 catfile('t','results',"${testname}_${folder_name}.stdout"); 193 194 CheckDiffs([$compare_filename,$output_fn]); 195} 196 197# --------------------------------------------------------------------------- 198