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