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