rmail 0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/NEWS +309 -0
- data/NOTES +14 -0
- data/README +83 -0
- data/THANKS +25 -0
- data/TODO +112 -0
- data/guide/Intro.txt +122 -0
- data/guide/MIME.txt +6 -0
- data/guide/TableOfContents.txt +13 -0
- data/install.rb +1023 -0
- data/lib/rmail.rb +50 -0
- data/lib/rmail/address.rb +829 -0
- data/lib/rmail/header.rb +987 -0
- data/lib/rmail/mailbox.rb +62 -0
- data/lib/rmail/mailbox/mboxreader.rb +182 -0
- data/lib/rmail/message.rb +201 -0
- data/lib/rmail/parser.rb +412 -0
- data/lib/rmail/parser/multipart.rb +217 -0
- data/lib/rmail/parser/pushbackreader.rb +173 -0
- data/lib/rmail/serialize.rb +190 -0
- data/lib/rmail/utils.rb +59 -0
- data/rmail.gemspec +17 -0
- data/tests/addrgrammar.txt +113 -0
- data/tests/data/mbox.odd +4 -0
- data/tests/data/mbox.simple +8 -0
- data/tests/data/multipart/data.1 +5 -0
- data/tests/data/multipart/data.10 +1 -0
- data/tests/data/multipart/data.11 +9 -0
- data/tests/data/multipart/data.12 +9 -0
- data/tests/data/multipart/data.13 +3 -0
- data/tests/data/multipart/data.14 +3 -0
- data/tests/data/multipart/data.15 +3 -0
- data/tests/data/multipart/data.16 +3 -0
- data/tests/data/multipart/data.17 +0 -0
- data/tests/data/multipart/data.2 +5 -0
- data/tests/data/multipart/data.3 +2 -0
- data/tests/data/multipart/data.4 +3 -0
- data/tests/data/multipart/data.5 +1 -0
- data/tests/data/multipart/data.6 +2 -0
- data/tests/data/multipart/data.7 +3 -0
- data/tests/data/multipart/data.8 +5 -0
- data/tests/data/multipart/data.9 +4 -0
- data/tests/data/parser.badmime1 +4 -0
- data/tests/data/parser.badmime2 +6 -0
- data/tests/data/parser.nested-multipart +75 -0
- data/tests/data/parser.nested-simple +12 -0
- data/tests/data/parser.nested-simple2 +16 -0
- data/tests/data/parser.nested-simple3 +21 -0
- data/tests/data/parser.rfc822 +65 -0
- data/tests/data/parser.simple-mime +24 -0
- data/tests/data/parser/multipart.1 +8 -0
- data/tests/data/parser/multipart.10 +4 -0
- data/tests/data/parser/multipart.11 +12 -0
- data/tests/data/parser/multipart.12 +12 -0
- data/tests/data/parser/multipart.13 +6 -0
- data/tests/data/parser/multipart.14 +6 -0
- data/tests/data/parser/multipart.15 +6 -0
- data/tests/data/parser/multipart.16 +6 -0
- data/tests/data/parser/multipart.2 +8 -0
- data/tests/data/parser/multipart.3 +5 -0
- data/tests/data/parser/multipart.4 +6 -0
- data/tests/data/parser/multipart.5 +4 -0
- data/tests/data/parser/multipart.6 +5 -0
- data/tests/data/parser/multipart.7 +6 -0
- data/tests/data/parser/multipart.8 +8 -0
- data/tests/data/parser/multipart.9 +7 -0
- data/tests/data/transparency/absolute.1 +5 -0
- data/tests/data/transparency/absolute.2 +1 -0
- data/tests/data/transparency/absolute.3 +2 -0
- data/tests/data/transparency/absolute.4 +3 -0
- data/tests/data/transparency/absolute.5 +4 -0
- data/tests/data/transparency/absolute.6 +49 -0
- data/tests/data/transparency/message.1 +73 -0
- data/tests/data/transparency/message.2 +34 -0
- data/tests/data/transparency/message.3 +63 -0
- data/tests/data/transparency/message.4 +5 -0
- data/tests/data/transparency/message.5 +15 -0
- data/tests/data/transparency/message.6 +1185 -0
- data/tests/runtests.rb +35 -0
- data/tests/testaddress.rb +1192 -0
- data/tests/testbase.rb +207 -0
- data/tests/testheader.rb +1207 -0
- data/tests/testmailbox.rb +47 -0
- data/tests/testmboxreader.rb +161 -0
- data/tests/testmessage.rb +257 -0
- data/tests/testparser.rb +634 -0
- data/tests/testparsermultipart.rb +205 -0
- data/tests/testpushbackreader.rb +40 -0
- data/tests/testserialize.rb +264 -0
- data/tests/testtestbase.rb +112 -0
- data/tests/testtranspparency.rb +105 -0
- metadata +143 -0
data/tests/testparser.rb
ADDED
@@ -0,0 +1,634 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2002, 2003, 2004 Matt Armstrong. All rights reserved.
|
4
|
+
#
|
5
|
+
# Redistribution and use in source and binary forms, with or without
|
6
|
+
# modification, are permitted provided that the following conditions are met:
|
7
|
+
#
|
8
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer.
|
10
|
+
# 2. Redistributions in binary form must reproduce the above copyright
|
11
|
+
# notice, this list of conditions and the following disclaimer in the
|
12
|
+
# documentation and/or other materials provided with the distribution.
|
13
|
+
# 3. The name of the author may not be used to endorse or promote products
|
14
|
+
# derived from this software without specific prior written permission.
|
15
|
+
#
|
16
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
17
|
+
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
18
|
+
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
19
|
+
# NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
20
|
+
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
21
|
+
# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
22
|
+
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
23
|
+
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
24
|
+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
25
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
26
|
+
#
|
27
|
+
|
28
|
+
require 'tests/testbase'
|
29
|
+
require 'rmail/parser'
|
30
|
+
|
31
|
+
class TestRMailStreamParser < TestBase
|
32
|
+
|
33
|
+
class RecordingStreamHandler
|
34
|
+
def initialize(history)
|
35
|
+
@history = history
|
36
|
+
end
|
37
|
+
def method_missing(symbol, *args)
|
38
|
+
@history << [ symbol ].concat(args)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_stream_parser_simple
|
43
|
+
string_msg = \
|
44
|
+
'From matt@lickey.com Mon Dec 24 00:00:06 2001
|
45
|
+
From: matt@example.net
|
46
|
+
To: matt@example.com
|
47
|
+
Subject: test message
|
48
|
+
|
49
|
+
message body
|
50
|
+
has two lines
|
51
|
+
'
|
52
|
+
|
53
|
+
string_as_file(string_msg) { |f|
|
54
|
+
RMail::StreamParser.parse(f, RMail::StreamHandler.new)
|
55
|
+
f.rewind
|
56
|
+
history = []
|
57
|
+
RMail::StreamParser.parse(f, RecordingStreamHandler.new(history))
|
58
|
+
expected = [
|
59
|
+
[:mbox_from, "From matt@lickey.com Mon Dec 24 00:00:06 2001"],
|
60
|
+
[:header_field, "From: matt@example.net", "From",
|
61
|
+
"matt@example.net"],
|
62
|
+
[:header_field, "To: matt@example.com", "To", "matt@example.com"],
|
63
|
+
[:header_field, "Subject: test message", "Subject", "test message"],
|
64
|
+
[:body_begin],
|
65
|
+
[:body_chunk, "message body\nhas two lines\n"],
|
66
|
+
[:body_end]]
|
67
|
+
assert_equal(expected, history)
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_stream_parser_multipart
|
72
|
+
string_msg = \
|
73
|
+
'Content-Type: multipart/mixed; boundary="aa"
|
74
|
+
MIME-Version: 1.0
|
75
|
+
|
76
|
+
preamble
|
77
|
+
--aa
|
78
|
+
Header1: hi mom
|
79
|
+
|
80
|
+
body1
|
81
|
+
--aa--
|
82
|
+
epilogue
|
83
|
+
'
|
84
|
+
|
85
|
+
string_as_file(string_msg) { |f|
|
86
|
+
RMail::StreamParser.parse(f, RMail::StreamHandler.new)
|
87
|
+
f.rewind
|
88
|
+
history = []
|
89
|
+
RMail::StreamParser.parse(f, RecordingStreamHandler.new(history))
|
90
|
+
expected = [
|
91
|
+
[:header_field, "Content-Type: multipart/mixed; boundary=\"aa\"",
|
92
|
+
"Content-Type", "multipart/mixed; boundary=\"aa\""],
|
93
|
+
[:header_field, "MIME-Version: 1.0", "MIME-Version", "1.0"],
|
94
|
+
[:multipart_body_begin],
|
95
|
+
[:preamble_chunk, "preamble"],
|
96
|
+
[:part_begin],
|
97
|
+
[:header_field, "Header1: hi mom", "Header1", "hi mom"],
|
98
|
+
[:body_begin],
|
99
|
+
[:body_chunk, "body1"],
|
100
|
+
[:body_end],
|
101
|
+
[:part_end],
|
102
|
+
[:epilogue_chunk, "epilogue\n"],
|
103
|
+
[:multipart_body_end, ["\n--aa\n", "\n--aa--\n"], "aa"]
|
104
|
+
]
|
105
|
+
assert_equal(expected, history)
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
class TestRMailParser < TestBase
|
113
|
+
|
114
|
+
def common_test_parse(m)
|
115
|
+
assert_instance_of(RMail::Message, m)
|
116
|
+
assert_equal("From matt@lickey.com Mon Dec 24 00:00:06 2001",
|
117
|
+
m.header.mbox_from)
|
118
|
+
assert_equal("matt@example.net", m.header[0])
|
119
|
+
assert_equal("matt@example.net", m.header['from'])
|
120
|
+
assert_equal("matt@example.com", m.header[1])
|
121
|
+
assert_equal("matt@example.com", m.header['to'])
|
122
|
+
assert_equal("test message", m.header[2])
|
123
|
+
assert_equal("test message", m.header['subject'])
|
124
|
+
assert_equal("message body\nhas two lines\n", m.body)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_parse
|
128
|
+
p = RMail::Parser.new
|
129
|
+
|
130
|
+
string_msg = <<-EOF
|
131
|
+
From matt@lickey.com Mon Dec 24 00:00:06 2001
|
132
|
+
From: matt@example.net
|
133
|
+
To: matt@example.com
|
134
|
+
Subject: test message
|
135
|
+
|
136
|
+
message body
|
137
|
+
has two lines
|
138
|
+
EOF
|
139
|
+
|
140
|
+
m = string_as_file(string_msg) { |f|
|
141
|
+
p.parse(f)
|
142
|
+
}
|
143
|
+
common_test_parse(m)
|
144
|
+
|
145
|
+
m = p.parse(string_msg)
|
146
|
+
common_test_parse(m)
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_parse_simple_mime
|
150
|
+
p = RMail::Parser.new
|
151
|
+
m = data_as_file('parser.simple-mime') { |f|
|
152
|
+
p.parse(f)
|
153
|
+
}
|
154
|
+
|
155
|
+
assert_instance_of(RMail::Message, m)
|
156
|
+
assert_equal("Nathaniel Borenstein <nsb@bellcore.com>", m.header[0])
|
157
|
+
assert_equal("Nathaniel Borenstein <nsb@bellcore.com>", m.header['from'])
|
158
|
+
assert_equal("Ned Freed <ned@innosoft.com>", m.header[1])
|
159
|
+
assert_equal("Ned Freed <ned@innosoft.com>", m.header['To'])
|
160
|
+
assert_equal("Sun, 21 Mar 1993 23:56:48 -0800 (PST)", m.header[2])
|
161
|
+
assert_equal("Sun, 21 Mar 1993 23:56:48 -0800 (PST)",
|
162
|
+
m.header['Date'])
|
163
|
+
assert_equal("Sun, 21 Mar 1993 23:56:48 -0800 (PST)",
|
164
|
+
m.header['Date'])
|
165
|
+
assert_equal("Sample message", m.header[3])
|
166
|
+
assert_equal("Sample message", m.header['Subject'])
|
167
|
+
assert_equal("1.0", m.header[4])
|
168
|
+
assert_equal("1.0", m.header['MIME-Version'])
|
169
|
+
assert_equal("multipart/mixed; boundary=\"simple boundary\"",
|
170
|
+
m.header[5])
|
171
|
+
assert_equal("multipart/mixed; boundary=\"simple boundary\"",
|
172
|
+
m.header['Content-Type'])
|
173
|
+
|
174
|
+
# Verify preamble
|
175
|
+
assert_equal(%q{This is the preamble. It is to be ignored, though it
|
176
|
+
is a handy place for composition agents to include an
|
177
|
+
explanatory note to non-MIME conformant readers.
|
178
|
+
},
|
179
|
+
m.preamble)
|
180
|
+
|
181
|
+
# Verify the first part
|
182
|
+
assert_equal(%q{This is implicitly typed plain US-ASCII text.
|
183
|
+
It does NOT end with a linebreak.}, m.part(0).body)
|
184
|
+
assert_equal(nil, m.part(0).header['content-type'])
|
185
|
+
|
186
|
+
# Verify the second part
|
187
|
+
assert_equal(%q{This is explicitly typed plain US-ASCII text.
|
188
|
+
It DOES end with a linebreak.
|
189
|
+
}, m.part(1).body)
|
190
|
+
assert_equal("text/plain; charset=us-ascii",
|
191
|
+
m.part(1).header['content-type'])
|
192
|
+
|
193
|
+
# Verify the epilogue
|
194
|
+
assert_equal("\nThis is the epilogue. It is also to be ignored.\n",
|
195
|
+
m.epilogue)
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_parse_nested_simple
|
199
|
+
m = data_as_file('parser.nested-simple') { |f|
|
200
|
+
RMail::Parser.new.parse(f)
|
201
|
+
}
|
202
|
+
assert_nil(m.preamble)
|
203
|
+
assert_nil(m.part(0).preamble)
|
204
|
+
assert_equal("", m.part(0).epilogue)
|
205
|
+
assert_equal("", m.epilogue)
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_parser_nested_simple2
|
209
|
+
m = data_as_file('parser.nested-simple2') { |f|
|
210
|
+
RMail::Parser.new.parse(f)
|
211
|
+
}
|
212
|
+
|
213
|
+
assert_nil(m.preamble)
|
214
|
+
assert_nil(m.part(0).preamble)
|
215
|
+
assert_equal("", m.part(0).epilogue)
|
216
|
+
assert_equal("\n", m.epilogue)
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_parser_nested_simple3
|
220
|
+
m = data_as_file('parser.nested-simple3') { |f|
|
221
|
+
RMail::Parser.new.parse(f)
|
222
|
+
}
|
223
|
+
|
224
|
+
assert_equal("\n", m.preamble)
|
225
|
+
assert_equal("\n", m.part(0).preamble)
|
226
|
+
assert_equal("\n", m.part(0).epilogue)
|
227
|
+
assert_equal("\n\n", m.epilogue)
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_parse_nested_multipart
|
231
|
+
p = RMail::Parser.new
|
232
|
+
m = data_as_file('parser.nested-multipart') { |f|
|
233
|
+
p.parse(f)
|
234
|
+
}
|
235
|
+
|
236
|
+
# Verify preamble and epilogue
|
237
|
+
assert_equal("This is level 1's preamble.\n", m.preamble)
|
238
|
+
assert_equal("\nThis is level 1's epilogue.\n\n", m.epilogue)
|
239
|
+
|
240
|
+
# Verify a smattering of headers
|
241
|
+
assert_equal("multipart/mixed; boundary=\"=-=-=\"",
|
242
|
+
m.header['content-type'])
|
243
|
+
assert_equal("Some nested multiparts", m.header['subject'])
|
244
|
+
|
245
|
+
# Verify part 0
|
246
|
+
begin
|
247
|
+
part = m.part(0)
|
248
|
+
assert_equal(0, part.header.length)
|
249
|
+
assert_equal("Let's see here.\n", part.body)
|
250
|
+
end
|
251
|
+
|
252
|
+
# Verify part 1
|
253
|
+
begin
|
254
|
+
part = m.part(1)
|
255
|
+
assert_nil(part.preamble)
|
256
|
+
assert_nil(part.epilogue)
|
257
|
+
assert_equal(1, part.header.length)
|
258
|
+
assert_equal("inline", part.header['content-disposition'])
|
259
|
+
assert_equal("This is the first part.\n", part.body)
|
260
|
+
end
|
261
|
+
|
262
|
+
# Verify part 2
|
263
|
+
begin
|
264
|
+
part = m.part(2)
|
265
|
+
assert_equal(1, part.header.length)
|
266
|
+
assert_equal("multipart/mixed; boundary=\"==-=-=\"",
|
267
|
+
part.header['content-type'])
|
268
|
+
assert_equal("This is level 2's preamble.\n", part.preamble)
|
269
|
+
assert_equal("This is level 2's epilogue. It has no trailing end of line.", part.epilogue)
|
270
|
+
|
271
|
+
# Verify part 2.0
|
272
|
+
begin
|
273
|
+
part = m.part(2).part(0)
|
274
|
+
assert_nil(part.preamble)
|
275
|
+
assert_nil(part.epilogue)
|
276
|
+
assert_equal(1, part.header.length)
|
277
|
+
assert_equal("inline", part.header['content-disposition'])
|
278
|
+
assert_equal("This is the first nested part.\n", part.body)
|
279
|
+
end
|
280
|
+
|
281
|
+
# Verify part 2.1
|
282
|
+
begin
|
283
|
+
part = m.part(2).part(1)
|
284
|
+
assert_nil(part.preamble)
|
285
|
+
assert_nil(part.epilogue)
|
286
|
+
assert_equal(1, part.header.length)
|
287
|
+
assert_equal("inline", part.header['content-disposition'])
|
288
|
+
assert_equal("This is the second nested part.\n", part.body)
|
289
|
+
end
|
290
|
+
|
291
|
+
# Verify part 2.2
|
292
|
+
begin
|
293
|
+
part = m.part(2).part(2)
|
294
|
+
assert_equal(1, part.header.length)
|
295
|
+
assert_equal("multipart/mixed; boundary=\"===-=-=\"",
|
296
|
+
part.header['content-type'])
|
297
|
+
assert_equal("This is level 3's preamble.\n", part.preamble)
|
298
|
+
assert_equal("This is level 3's epilogue.\n", part.epilogue)
|
299
|
+
|
300
|
+
# Verify part 2.2.0
|
301
|
+
begin
|
302
|
+
part = m.part(2).part(2).part(0)
|
303
|
+
assert_equal(0, part.header.length)
|
304
|
+
assert_equal("This is the first doubly nested part.\n", part.body)
|
305
|
+
end
|
306
|
+
|
307
|
+
# Verify part 2.2.1
|
308
|
+
begin
|
309
|
+
part = m.part(2).part(2).part(1)
|
310
|
+
assert_nil(part.preamble)
|
311
|
+
assert_nil(part.epilogue)
|
312
|
+
assert_equal(1, part.header.length)
|
313
|
+
assert_equal("inline", part.header['content-disposition'])
|
314
|
+
assert_equal("This is the second doubly nested part.\n", part.body)
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
# Verify part 3
|
319
|
+
begin
|
320
|
+
part = m.part(3)
|
321
|
+
assert_nil(part.preamble)
|
322
|
+
assert_nil(part.epilogue)
|
323
|
+
assert_equal(1, part.header.length)
|
324
|
+
assert_equal("inline", part.header['content-disposition'])
|
325
|
+
assert_equal("This is the third part.\n", part.body)
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
def test_parse_badmime1
|
331
|
+
p = RMail::Parser.new
|
332
|
+
1.upto(File.stat(data_filename('parser.badmime1')).size + 10) { |size|
|
333
|
+
m = nil
|
334
|
+
data_as_file('parser.badmime1') do |f|
|
335
|
+
p.chunk_size = size
|
336
|
+
assert_no_exception("failed for chunk size #{size.to_s}") {
|
337
|
+
m = p.parse(f)
|
338
|
+
}
|
339
|
+
end
|
340
|
+
assert_equal(m, p.parse(m.to_s))
|
341
|
+
}
|
342
|
+
end
|
343
|
+
|
344
|
+
def test_parse_badmime2
|
345
|
+
p = RMail::Parser.new
|
346
|
+
1.upto(File.stat(data_filename('parser.badmime2')).size + 10) { |size|
|
347
|
+
m = nil
|
348
|
+
data_as_file('parser.badmime2') do |f|
|
349
|
+
p.chunk_size = size
|
350
|
+
assert_no_exception("failed for chunk size #{size.to_s}") {
|
351
|
+
m = p.parse(f)
|
352
|
+
}
|
353
|
+
end
|
354
|
+
assert_equal(m, p.parse(m.to_s))
|
355
|
+
}
|
356
|
+
end
|
357
|
+
|
358
|
+
def test_parse_multipart_01
|
359
|
+
m = data_as_file('parser/multipart.1') do |f|
|
360
|
+
RMail::Parser.new.parse(f)
|
361
|
+
end
|
362
|
+
|
363
|
+
assert_equal("preamble", m.preamble)
|
364
|
+
assert_equal("epilogue\n", m.epilogue)
|
365
|
+
assert_equal(1, m.body.length)
|
366
|
+
|
367
|
+
begin
|
368
|
+
part = m.part(0)
|
369
|
+
assert_equal(1, part.header.length)
|
370
|
+
assert_nil(part.body)
|
371
|
+
assert_nil(part.preamble)
|
372
|
+
assert_nil(part.epilogue)
|
373
|
+
assert_equal("part1", part.header[0])
|
374
|
+
end
|
375
|
+
|
376
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
377
|
+
assert_equal(["\n--aa\n", "\n--aa--\n"], delimiters)
|
378
|
+
assert_equal("aa", delimiters_boundary)
|
379
|
+
end
|
380
|
+
|
381
|
+
def test_parse_multipart_02
|
382
|
+
m = data_as_file('parser/multipart.2') do |f|
|
383
|
+
RMail::Parser.new.parse(f)
|
384
|
+
end
|
385
|
+
|
386
|
+
assert_nil(m.preamble)
|
387
|
+
assert_equal("\n", m.epilogue)
|
388
|
+
assert_equal(1, m.body.length)
|
389
|
+
|
390
|
+
begin
|
391
|
+
part = m.part(0)
|
392
|
+
assert_equal(0, part.header.length)
|
393
|
+
assert_nil(part.body)
|
394
|
+
assert_nil(part.preamble)
|
395
|
+
assert_nil(part.epilogue)
|
396
|
+
end
|
397
|
+
|
398
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
399
|
+
assert_equal(["\n--aa\n", "\n--aa--\n"], delimiters)
|
400
|
+
assert_equal("aa", delimiters_boundary)
|
401
|
+
end
|
402
|
+
|
403
|
+
def test_parse_multipart_03
|
404
|
+
m = data_as_file('parser/multipart.3') do |f|
|
405
|
+
RMail::Parser.new.parse(f)
|
406
|
+
end
|
407
|
+
|
408
|
+
assert_nil(m.preamble)
|
409
|
+
assert_equal("", m.epilogue)
|
410
|
+
assert_equal(1, m.body.length)
|
411
|
+
|
412
|
+
begin
|
413
|
+
part = m.part(0)
|
414
|
+
assert_equal(0, part.header.length)
|
415
|
+
assert_nil(part.body)
|
416
|
+
assert_nil(part.preamble)
|
417
|
+
assert_nil(part.epilogue)
|
418
|
+
end
|
419
|
+
|
420
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
421
|
+
assert_equal(["--aa\n", "--aa--\n"], delimiters)
|
422
|
+
assert_equal("aa", delimiters_boundary)
|
423
|
+
end
|
424
|
+
|
425
|
+
def test_parse_multipart_04
|
426
|
+
m = data_as_file('parser/multipart.4') do |f|
|
427
|
+
RMail::Parser.new.parse(f)
|
428
|
+
end
|
429
|
+
|
430
|
+
assert_equal("preamble", m.preamble)
|
431
|
+
assert_equal("epilogue\n", m.epilogue)
|
432
|
+
assert_equal([], m.body)
|
433
|
+
|
434
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
435
|
+
assert_equal(["\n--aa--\n"], delimiters)
|
436
|
+
assert_equal("aa", delimiters_boundary)
|
437
|
+
end
|
438
|
+
|
439
|
+
def test_parse_multipart_05
|
440
|
+
m = data_as_file('parser/multipart.5') do |f|
|
441
|
+
RMail::Parser.new.parse(f)
|
442
|
+
end
|
443
|
+
|
444
|
+
assert_nil(m.preamble)
|
445
|
+
assert_equal("", m.epilogue)
|
446
|
+
assert_equal([], m.body)
|
447
|
+
|
448
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
449
|
+
assert_equal(["--aa--\n"], delimiters)
|
450
|
+
assert_equal("aa", delimiters_boundary)
|
451
|
+
end
|
452
|
+
|
453
|
+
def test_parse_multipart_06
|
454
|
+
m = data_as_file('parser/multipart.6') do |f|
|
455
|
+
RMail::Parser.new.parse(f)
|
456
|
+
end
|
457
|
+
|
458
|
+
assert_nil(m.preamble)
|
459
|
+
assert_equal("", m.epilogue)
|
460
|
+
assert_equal([], m.body)
|
461
|
+
|
462
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
463
|
+
assert_equal(["\n--aa--\n"], delimiters)
|
464
|
+
assert_equal("aa", delimiters_boundary)
|
465
|
+
end
|
466
|
+
|
467
|
+
def test_parse_multipart_07
|
468
|
+
m = data_as_file('parser/multipart.7') do |f|
|
469
|
+
RMail::Parser.new.parse(f)
|
470
|
+
end
|
471
|
+
|
472
|
+
assert_equal("preamble\n", m.preamble)
|
473
|
+
assert_equal("", m.epilogue)
|
474
|
+
assert_equal([], m.body)
|
475
|
+
|
476
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
477
|
+
assert_equal(["\n--aa--\n"], delimiters)
|
478
|
+
assert_equal("aa", delimiters_boundary)
|
479
|
+
end
|
480
|
+
|
481
|
+
def test_parse_multipart_08
|
482
|
+
m = data_as_file('parser/multipart.8') do |f|
|
483
|
+
RMail::Parser.new.parse(f)
|
484
|
+
end
|
485
|
+
|
486
|
+
assert_equal("preamble", m.preamble)
|
487
|
+
assert_equal("epilogue", m.epilogue)
|
488
|
+
assert_equal(1, m.body.length)
|
489
|
+
|
490
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
491
|
+
assert_equal(["\n--aa\n", "\n--aa--\n"], delimiters)
|
492
|
+
assert_equal("aa", delimiters_boundary)
|
493
|
+
end
|
494
|
+
|
495
|
+
def test_parse_multipart_09
|
496
|
+
m = data_as_file('parser/multipart.9') do |f|
|
497
|
+
RMail::Parser.new.parse(f)
|
498
|
+
end
|
499
|
+
|
500
|
+
assert_nil(m.preamble)
|
501
|
+
assert_equal("", m.epilogue)
|
502
|
+
assert_equal(1, m.body.length)
|
503
|
+
|
504
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
505
|
+
assert_equal(["\n--aa\n", "\n--aa--"], delimiters)
|
506
|
+
assert_equal("aa", delimiters_boundary)
|
507
|
+
end
|
508
|
+
|
509
|
+
def test_parse_multipart_10
|
510
|
+
m = data_as_file('parser/multipart.10') do |f|
|
511
|
+
RMail::Parser.new.parse(f)
|
512
|
+
end
|
513
|
+
|
514
|
+
assert_nil(m.preamble)
|
515
|
+
assert_equal("", m.epilogue)
|
516
|
+
assert_equal(0, m.body.length)
|
517
|
+
|
518
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
519
|
+
assert_equal(["--aa--"], delimiters)
|
520
|
+
assert_equal("aa", delimiters_boundary)
|
521
|
+
end
|
522
|
+
|
523
|
+
def test_parse_multipart_11
|
524
|
+
m = data_as_file('parser/multipart.11') do |f|
|
525
|
+
RMail::Parser.new.parse(f)
|
526
|
+
end
|
527
|
+
|
528
|
+
assert_equal("preamble", m.preamble)
|
529
|
+
assert_equal("epilogue\n", m.epilogue)
|
530
|
+
assert_equal(3, m.body.length)
|
531
|
+
|
532
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
533
|
+
assert_equal(["\n--aa\t\n", "\n--aa \n", "\n--aa \t \t\n", "\n--aa-- \n"],
|
534
|
+
delimiters)
|
535
|
+
assert_equal("aa", delimiters_boundary)
|
536
|
+
end
|
537
|
+
|
538
|
+
def test_parse_multipart_12
|
539
|
+
m = data_as_file('parser/multipart.12') do |f|
|
540
|
+
RMail::Parser.new.parse(f)
|
541
|
+
end
|
542
|
+
|
543
|
+
assert_equal("preamble\n--aaZ\npart1\n--aa ignored\npart2\n--aa \t \tignored\npart3\n--aa--ignored\nepilogue\n", m.preamble)
|
544
|
+
assert_nil(m.epilogue)
|
545
|
+
assert_equal(0, m.body.length)
|
546
|
+
|
547
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
548
|
+
assert_equal([""], delimiters)
|
549
|
+
assert_equal("aa", delimiters_boundary)
|
550
|
+
end
|
551
|
+
|
552
|
+
def test_parse_multipart_13
|
553
|
+
m = data_as_file('parser/multipart.13') do |f|
|
554
|
+
RMail::Parser.new.parse(f)
|
555
|
+
end
|
556
|
+
|
557
|
+
assert_equal("preamble", m.preamble)
|
558
|
+
assert_nil(m.epilogue)
|
559
|
+
assert_equal(1, m.body.length)
|
560
|
+
|
561
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
562
|
+
assert_equal(["\n--aa\n", ""], delimiters)
|
563
|
+
assert_equal("aa", delimiters_boundary)
|
564
|
+
end
|
565
|
+
|
566
|
+
def test_parse_multipart_14
|
567
|
+
m = data_as_file('parser/multipart.14') do |f|
|
568
|
+
RMail::Parser.new.parse(f)
|
569
|
+
end
|
570
|
+
|
571
|
+
assert_equal("preamble", m.preamble)
|
572
|
+
assert_nil(m.epilogue)
|
573
|
+
assert_equal(1, m.body.length)
|
574
|
+
|
575
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
576
|
+
assert_equal(["\n--aa\n", ""], delimiters)
|
577
|
+
assert_equal("aa", delimiters_boundary)
|
578
|
+
end
|
579
|
+
|
580
|
+
def test_parse_multipart_15
|
581
|
+
m = data_as_file('parser/multipart.15') do |f|
|
582
|
+
RMail::Parser.new.parse(f)
|
583
|
+
end
|
584
|
+
|
585
|
+
assert_equal("preamble\nline1\nline2\n", m.preamble)
|
586
|
+
assert_nil(m.epilogue)
|
587
|
+
assert_equal(0, m.body.length)
|
588
|
+
|
589
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
590
|
+
assert_equal([""], delimiters)
|
591
|
+
assert_equal("aa", delimiters_boundary)
|
592
|
+
end
|
593
|
+
|
594
|
+
def test_parse_multipart_16
|
595
|
+
m = data_as_file('parser/multipart.16') do |f|
|
596
|
+
RMail::Parser.new.parse(f)
|
597
|
+
end
|
598
|
+
|
599
|
+
assert_equal("preamble\nline1\nline2", m.preamble)
|
600
|
+
assert_nil(m.epilogue)
|
601
|
+
assert_equal(0, m.body.length)
|
602
|
+
|
603
|
+
delimiters, delimiters_boundary = m.get_delimiters
|
604
|
+
assert_equal([""], delimiters)
|
605
|
+
assert_equal("aa", delimiters_boundary)
|
606
|
+
end
|
607
|
+
|
608
|
+
def test_rmail_parser_s_read
|
609
|
+
|
610
|
+
string_msg = <<-EOF
|
611
|
+
From matt@lickey.com Mon Dec 24 00:00:06 2001
|
612
|
+
From: matt@example.net
|
613
|
+
To: matt@example.com
|
614
|
+
Subject: test message
|
615
|
+
|
616
|
+
message body
|
617
|
+
has two lines
|
618
|
+
EOF
|
619
|
+
|
620
|
+
m = string_as_file(string_msg) { |f|
|
621
|
+
RMail::Parser.read(f)
|
622
|
+
}
|
623
|
+
common_test_parse(m)
|
624
|
+
|
625
|
+
m = RMail::Parser.read(string_msg)
|
626
|
+
common_test_parse(m)
|
627
|
+
end
|
628
|
+
|
629
|
+
def test_s_new
|
630
|
+
p = RMail::Parser.new
|
631
|
+
assert_instance_of(RMail::Parser, p)
|
632
|
+
end
|
633
|
+
|
634
|
+
end
|