rmail-sup 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/NEWS +323 -0
  3. data/NOTES +14 -0
  4. data/README +83 -0
  5. data/Rakefile +184 -0
  6. data/THANKS +25 -0
  7. data/TODO +115 -0
  8. data/guide/Intro.txt +122 -0
  9. data/guide/MIME.txt +6 -0
  10. data/guide/TableOfContents.txt +13 -0
  11. data/install.rb +1023 -0
  12. data/lib/rmail.rb +50 -0
  13. data/lib/rmail/address.rb +841 -0
  14. data/lib/rmail/header.rb +981 -0
  15. data/lib/rmail/mailbox.rb +62 -0
  16. data/lib/rmail/mailbox/mboxreader.rb +182 -0
  17. data/lib/rmail/message.rb +201 -0
  18. data/lib/rmail/parser.rb +412 -0
  19. data/lib/rmail/parser/multipart.rb +217 -0
  20. data/lib/rmail/parser/pushbackreader.rb +173 -0
  21. data/lib/rmail/serialize.rb +190 -0
  22. data/lib/rmail/utils.rb +59 -0
  23. data/test/addrgrammar.txt +113 -0
  24. data/test/data/mbox.odd +4 -0
  25. data/test/data/mbox.simple +8 -0
  26. data/test/data/multipart/data.1 +5 -0
  27. data/test/data/multipart/data.10 +1 -0
  28. data/test/data/multipart/data.11 +9 -0
  29. data/test/data/multipart/data.12 +9 -0
  30. data/test/data/multipart/data.13 +3 -0
  31. data/test/data/multipart/data.14 +3 -0
  32. data/test/data/multipart/data.15 +3 -0
  33. data/test/data/multipart/data.16 +3 -0
  34. data/test/data/multipart/data.17 +0 -0
  35. data/test/data/multipart/data.2 +5 -0
  36. data/test/data/multipart/data.3 +2 -0
  37. data/test/data/multipart/data.4 +3 -0
  38. data/test/data/multipart/data.5 +1 -0
  39. data/test/data/multipart/data.6 +2 -0
  40. data/test/data/multipart/data.7 +3 -0
  41. data/test/data/multipart/data.8 +5 -0
  42. data/test/data/multipart/data.9 +4 -0
  43. data/test/data/parser.badmime1 +4 -0
  44. data/test/data/parser.badmime2 +6 -0
  45. data/test/data/parser.nested-multipart +75 -0
  46. data/test/data/parser.nested-simple +12 -0
  47. data/test/data/parser.nested-simple2 +16 -0
  48. data/test/data/parser.nested-simple3 +21 -0
  49. data/test/data/parser.rfc822 +65 -0
  50. data/test/data/parser.simple-mime +24 -0
  51. data/test/data/parser/multipart.1 +8 -0
  52. data/test/data/parser/multipart.10 +4 -0
  53. data/test/data/parser/multipart.11 +12 -0
  54. data/test/data/parser/multipart.12 +12 -0
  55. data/test/data/parser/multipart.13 +6 -0
  56. data/test/data/parser/multipart.14 +6 -0
  57. data/test/data/parser/multipart.15 +6 -0
  58. data/test/data/parser/multipart.16 +6 -0
  59. data/test/data/parser/multipart.2 +8 -0
  60. data/test/data/parser/multipart.3 +5 -0
  61. data/test/data/parser/multipart.4 +6 -0
  62. data/test/data/parser/multipart.5 +4 -0
  63. data/test/data/parser/multipart.6 +5 -0
  64. data/test/data/parser/multipart.7 +6 -0
  65. data/test/data/parser/multipart.8 +8 -0
  66. data/test/data/parser/multipart.9 +7 -0
  67. data/test/data/transparency/absolute.1 +5 -0
  68. data/test/data/transparency/absolute.2 +1 -0
  69. data/test/data/transparency/absolute.3 +2 -0
  70. data/test/data/transparency/absolute.4 +3 -0
  71. data/test/data/transparency/absolute.5 +4 -0
  72. data/test/data/transparency/absolute.6 +49 -0
  73. data/test/data/transparency/message.1 +73 -0
  74. data/test/data/transparency/message.2 +34 -0
  75. data/test/data/transparency/message.3 +63 -0
  76. data/test/data/transparency/message.4 +5 -0
  77. data/test/data/transparency/message.5 +15 -0
  78. data/test/data/transparency/message.6 +1185 -0
  79. data/test/runtests.rb +35 -0
  80. data/test/testaddress.rb +1204 -0
  81. data/test/testbase.rb +204 -0
  82. data/test/testheader.rb +1225 -0
  83. data/test/testmailbox.rb +47 -0
  84. data/test/testmboxreader.rb +161 -0
  85. data/test/testmessage.rb +257 -0
  86. data/test/testparser.rb +634 -0
  87. data/test/testparsermultipart.rb +205 -0
  88. data/test/testpushbackreader.rb +40 -0
  89. data/test/testserialize.rb +264 -0
  90. data/test/testtestbase.rb +116 -0
  91. data/test/testtranspparency.rb +105 -0
  92. data/version +1 -0
  93. metadata +149 -0
@@ -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 'test/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_nothing_raised("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_nothing_raised("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