tmail 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/LICENSE +21 -0
  2. data/README +157 -0
  3. data/bat/changelog +19 -0
  4. data/bat/clobber/package +10 -0
  5. data/bat/compile +42 -0
  6. data/bat/config.yaml +8 -0
  7. data/bat/prepare +8 -0
  8. data/bat/publish +51 -0
  9. data/bat/rdoc +42 -0
  10. data/bat/release +12 -0
  11. data/bat/setup +1616 -0
  12. data/bat/stats +138 -0
  13. data/bat/tag +25 -0
  14. data/bat/test +25 -0
  15. data/ext/tmail/Makefile +25 -0
  16. data/ext/tmail/base64/MANIFEST +4 -0
  17. data/ext/tmail/base64/base64.c +264 -0
  18. data/ext/tmail/base64/depend +1 -0
  19. data/ext/tmail/base64/extconf.rb +38 -0
  20. data/ext/tmail/scanner_c/MANIFEST +4 -0
  21. data/ext/tmail/scanner_c/depend +1 -0
  22. data/ext/tmail/scanner_c/extconf.rb +38 -0
  23. data/ext/tmail/scanner_c/scanner_c.c +582 -0
  24. data/lib/tmail.rb +4 -0
  25. data/lib/tmail/Makefile +19 -0
  26. data/lib/tmail/address.rb +245 -0
  27. data/lib/tmail/attachments.rb +47 -0
  28. data/lib/tmail/base64.rb +75 -0
  29. data/lib/tmail/compat.rb +39 -0
  30. data/lib/tmail/config.rb +71 -0
  31. data/lib/tmail/core_extensions.rb +67 -0
  32. data/lib/tmail/encode.rb +524 -0
  33. data/lib/tmail/header.rb +931 -0
  34. data/lib/tmail/index.rb +8 -0
  35. data/lib/tmail/interface.rb +540 -0
  36. data/lib/tmail/loader.rb +1 -0
  37. data/lib/tmail/mail.rb +507 -0
  38. data/lib/tmail/mailbox.rb +435 -0
  39. data/lib/tmail/mbox.rb +1 -0
  40. data/lib/tmail/net.rb +282 -0
  41. data/lib/tmail/obsolete.rb +137 -0
  42. data/lib/tmail/parser.rb +1475 -0
  43. data/lib/tmail/parser.y +381 -0
  44. data/lib/tmail/port.rb +379 -0
  45. data/lib/tmail/quoting.rb +142 -0
  46. data/lib/tmail/require_arch.rb +56 -0
  47. data/lib/tmail/scanner.rb +44 -0
  48. data/lib/tmail/scanner_r.rb +263 -0
  49. data/lib/tmail/stringio.rb +279 -0
  50. data/lib/tmail/tmail.rb +1 -0
  51. data/lib/tmail/utils.rb +281 -0
  52. data/lib/tmail/version.rb +38 -0
  53. data/meta/icli.yaml +16 -0
  54. data/meta/tmail-1.1.1.roll +24 -0
  55. data/sample/data/multipart +23 -0
  56. data/sample/data/normal +29 -0
  57. data/sample/data/sendtest +5 -0
  58. data/sample/data/simple +14 -0
  59. data/sample/data/test +27 -0
  60. data/sample/extract-attachements.rb +33 -0
  61. data/sample/from-check.rb +26 -0
  62. data/sample/multipart.rb +26 -0
  63. data/sample/parse-bench.rb +68 -0
  64. data/sample/parse-test.rb +19 -0
  65. data/sample/sendmail.rb +94 -0
  66. data/test/extctrl.rb +6 -0
  67. data/test/fixtures/raw_base64_decoded_string +0 -0
  68. data/test/fixtures/raw_base64_email +83 -0
  69. data/test/fixtures/raw_base64_encoded_string +1 -0
  70. data/test/fixtures/raw_email +14 -0
  71. data/test/fixtures/raw_email10 +20 -0
  72. data/test/fixtures/raw_email11 +34 -0
  73. data/test/fixtures/raw_email12 +32 -0
  74. data/test/fixtures/raw_email13 +29 -0
  75. data/test/fixtures/raw_email2 +114 -0
  76. data/test/fixtures/raw_email3 +70 -0
  77. data/test/fixtures/raw_email4 +59 -0
  78. data/test/fixtures/raw_email5 +19 -0
  79. data/test/fixtures/raw_email6 +20 -0
  80. data/test/fixtures/raw_email7 +66 -0
  81. data/test/fixtures/raw_email8 +47 -0
  82. data/test/fixtures/raw_email9 +28 -0
  83. data/test/fixtures/raw_email_quoted_with_0d0a +14 -0
  84. data/test/fixtures/raw_email_simple +11 -0
  85. data/test/fixtures/raw_email_with_illegal_boundary +58 -0
  86. data/test/fixtures/raw_email_with_multipart_mixed_quoted_boundary +50 -0
  87. data/test/fixtures/raw_email_with_nested_attachment +100 -0
  88. data/test/fixtures/raw_email_with_partially_quoted_subject +14 -0
  89. data/test/fixtures/raw_email_with_quoted_illegal_boundary +58 -0
  90. data/test/kcode.rb +14 -0
  91. data/test/test_address.rb +1128 -0
  92. data/test/test_attachments.rb +35 -0
  93. data/test/test_base64.rb +63 -0
  94. data/test/test_encode.rb +77 -0
  95. data/test/test_header.rb +885 -0
  96. data/test/test_helper.rb +2 -0
  97. data/test/test_mail.rb +623 -0
  98. data/test/test_mbox.rb +126 -0
  99. data/test/test_port.rb +430 -0
  100. data/test/test_scanner.rb +209 -0
  101. data/test/test_utils.rb +37 -0
  102. metadata +205 -0
@@ -0,0 +1,35 @@
1
+ require 'tmail'
2
+ require 'test/unit'
3
+ require 'test_helper'
4
+
5
+ class TestAttachments < Test::Unit::TestCase
6
+
7
+ def test_attachment
8
+ mail = TMail::Mail.new
9
+ mail.mime_version = "1.0"
10
+ mail.set_content_type 'multipart', 'mixed', {'boundary' => 'Apple-Mail-13-196941151'}
11
+ mail.body =<<HERE
12
+ --Apple-Mail-13-196941151
13
+ Content-Transfer-Encoding: quoted-printable
14
+ Content-Type: text/plain;
15
+ charset=ISO-8859-1;
16
+ delsp=yes;
17
+ format=flowed
18
+
19
+ This is the first part.
20
+
21
+ --Apple-Mail-13-196941151
22
+ Content-Type: text/x-ruby-script; name="hello.rb"
23
+ Content-Transfer-Encoding: 7bit
24
+ Content-Disposition: attachment;
25
+ filename="api.rb"
26
+
27
+ puts "Hello, world!"
28
+ gets
29
+
30
+ --Apple-Mail-13-196941151--
31
+ HERE
32
+ assert_equal(true, mail.multipart?)
33
+ assert_equal(1, mail.attachments.length)
34
+ end
35
+ end
@@ -0,0 +1,63 @@
1
+ require 'tmail/base64'
2
+ require 'test/unit'
3
+
4
+ class TestTMailBase64 < Test::Unit::TestCase
5
+ def try(orig)
6
+ ok = [orig].pack('m').delete("\r\n")
7
+ result = TMail::Base64.c_encode(orig)
8
+ assert_equal ok, result, "str=#{orig.inspect}"
9
+ assert_equal orig, TMail::Base64.c_decode(result), "str=#{orig.inspect}"
10
+ end
11
+
12
+ def test_normal
13
+ try ''
14
+ try 'a'
15
+ try 'ab'
16
+ try 'abc'
17
+ try 'abcd'
18
+ try 'abcde'
19
+ try 'abcdef'
20
+ try 'abcdefg'
21
+ try 'abcdefgh'
22
+ try 'abcdefghi'
23
+ try 'abcdefghij'
24
+ try 'abcdefghijk'
25
+ try 'abcdefghijkl'
26
+ try 'abcdefghijklm'
27
+ try 'abcdefghijklmn'
28
+ try 'abcdefghijklmno'
29
+ try 'abcdefghijklmnop'
30
+ try 'abcdefghijklmnopq'
31
+ try 'abcdefghijklmnopqr'
32
+ try 'abcdefghijklmnopqrs'
33
+ try 'abcdefghijklmnopqrst'
34
+ try 'abcdefghijklmnopqrstu'
35
+ try 'abcdefghijklmnopqrstuv'
36
+ try 'abcdefghijklmnopqrstuvw'
37
+ try 'abcdefghijklmnopqrstuvwx'
38
+ try 'abcdefghijklmnopqrstuvwxy'
39
+ try 'abcdefghijklmnopqrstuvwxyz'
40
+ end
41
+
42
+ def test_dangerous_chars
43
+ ["\0", "\001", "\002", "\003", "\0xfd", "\0xfe", "\0xff"].each do |ch|
44
+ 1.upto(96) do |len|
45
+ try ch * len
46
+ end
47
+ end
48
+ end
49
+
50
+ def test_random
51
+ 16.times do
52
+ try make_random_string(96)
53
+ end
54
+ end
55
+
56
+ def make_random_string(len)
57
+ buf = ''
58
+ len.times do
59
+ buf << rand(255)
60
+ end
61
+ buf
62
+ end
63
+ end
@@ -0,0 +1,77 @@
1
+ require 'tmail/port'
2
+ require 'tmail/encode'
3
+ require 'nkf'
4
+ require 'test/unit'
5
+
6
+ class TestEncode < Test::Unit::TestCase
7
+
8
+ SRCS = [
9
+ "a cde あいうえおあいうえおあいうえおあいうえおあいうえお",
10
+ "a cde あいうえおあいうえおあいうえおあいうえおあいうえ",
11
+ "a cde あいうえおあいうえおあいうえおあいうえおあいう",
12
+ "a cde あいうえおあいうえおあいうえおあいうえおあい",
13
+ "a cde あいうえおあいうえおあいうえおあいうえおあ",
14
+ "a cde あいうえおあいうえおあいうえおあいうえお", #
15
+ "a cde あいうえおあいうえおあいうえおあいうえ",
16
+ "a cde あいうえおあいうえおあいうえおあいう",
17
+ "a cde あいうえおあいうえおあいうえおあい",
18
+ "a cde あいうえおあいうえおあいうえおあ",
19
+ "a cde あいうえおあいうえおあいうえお",
20
+ "a cde あいうえおあいうえおあいうえ",
21
+ "a cde あいうえおあいうえおあいう",
22
+ "a cde あいうえおあいうえおあい",
23
+ "a cde あいうえおあいうえおあ",
24
+ "a cde あいうえおあいうえお",
25
+ "a cde あいうえおあいうえ",
26
+ "a cde あいうえおあいう",
27
+ "a cde あいうえおあい",
28
+ "a cde あいうえおあ",
29
+ "a cde あいうえお",
30
+ "a cde あいうえ",
31
+ "a cde あいう",
32
+ "a cde あい",
33
+ "a cde あ",
34
+ "aあa aあa aあa aあa"
35
+ ]
36
+
37
+ OK = [
38
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgkKiQiJCQkJiQoJCokIiQkJCYkKCQqGyhC?=",
39
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgkKiQiJCQkJiQoJCokIiQkJCYkKBsoQg==?=",
40
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=",
41
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgkKiQiJCQkJiQoJCokIiQkGyhC?=",
42
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgkKiQiJCQkJiQoJCokIhsoQg==?=",
43
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgkKiQiJCQkJiQoJCobKEI=?=",
44
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgkKiQiJCQkJiQoGyhC?=",
45
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgkKiQiJCQkJhsoQg==?=",
46
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgkKiQiJCQbKEI=?=",
47
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgkKiQiGyhC?=",
48
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgkKhsoQg==?=",
49
+ "a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=\n\t=?iso-2022-jp?B?GyRCJCgbKEI=?=",
50
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkJCYbKEI=?=',
51
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIiQkGyhC?=',
52
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCokIhsoQg==?=',
53
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoJCobKEI=?=',
54
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJiQoGyhC?=',
55
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQkJhsoQg==?=',
56
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiJCQbKEI=?=',
57
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQiGyhC?=',
58
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgkKhsoQg==?=',
59
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJCQmJCgbKEI=?=',
60
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJCQmGyhC?=',
61
+ 'a cde =?iso-2022-jp?B?GyRCJCIkJBsoQg==?=',
62
+ 'a cde =?iso-2022-jp?B?GyRCJCIbKEI=?=',
63
+ "=?iso-2022-jp?B?YRskQiQiGyhCYSBhGyRCJCIbKEJhIGEbJEIkIhsoQmEgYQ==?=\n\t=?iso-2022-jp?B?GyRCJCIbKEJh?="
64
+ ]
65
+
66
+ def test_s_encode
67
+ SRCS.each_index do |i|
68
+ assert_equal crlf(OK[i]),
69
+ TMail::Encoder.encode(NKF.nkf('-j', SRCS[i]))
70
+ end
71
+ end
72
+
73
+ def crlf( str )
74
+ str.gsub(/\n|\r\n|\r/) { "\r\n" }
75
+ end
76
+
77
+ end
@@ -0,0 +1,885 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+ require 'tmail'
3
+ require 'tmail/header'
4
+ require 'kcode'
5
+ require 'extctrl'
6
+ require 'test/unit'
7
+ require 'time'
8
+ require 'test_helper'
9
+
10
+ class UnstructuredHeaderTester < Test::Unit::TestCase
11
+ def test_s_new
12
+ %w( Subject SUBJECT sUbJeCt
13
+ X-My-Header ).each do |name|
14
+ h = TMail::HeaderField.new(name, 'This is test header.')
15
+ assert_instance_of TMail::UnstructuredHeader, h,
16
+ 'Header.new: name=' + name.dump
17
+ end
18
+ end
19
+
20
+ def test_to_s
21
+ # I must write more and more test.
22
+ [
23
+ 'This is test header.',
24
+ # "This is \r\n\ttest header"
25
+ # "JAPANESE STRING"
26
+ ''
27
+ ]\
28
+ .each do |str|
29
+ h = TMail::HeaderField.new('Subject', str)
30
+ assert_equal str, h.decoded
31
+ assert_equal str, h.to_s
32
+ end
33
+ end
34
+ end
35
+
36
+ class DateTimeHeaderTester < Test::Unit::TestCase
37
+ def test_s_new
38
+ %w( Date Resent-Date ).each do |name|
39
+ h = TMail::HeaderField.new(name, 'Tue, 4 Dec 2001 10:49:32 +0900')
40
+ assert_instance_of TMail::DateTimeHeader, h, name
41
+ end
42
+ end
43
+
44
+ def test_date
45
+ h = TMail::HeaderField.new('Date', 'Tue, 4 Dec 2001 10:49:32 +0900')
46
+ assert_instance_of Time, h.date
47
+ assert_equal false, h.date.gmt?
48
+ assert_equal Time.parse('Tue, 4 Dec 2001 10:49:32 +0900'), h.date
49
+ end
50
+
51
+ def test_empty__illegal?
52
+ [ [false, 'Tue, 4 Dec 2001 10:49:32 +0900'],
53
+ [false, 'Sat, 15 Dec 2001 12:51:38 +0900'],
54
+ [true, 'Sat, 15 Dec 2001 12:51:38'],
55
+ [true, 'Sat, 15 Dec 2001 12:51'],
56
+ [true, 'Sat,'] ].each do |wrong, str|
57
+
58
+ h = TMail::HeaderField.new('Date', str)
59
+ assert_equal wrong, h.empty?, str
60
+ assert_equal wrong, h.illegal?, str
61
+ end
62
+ end
63
+
64
+ def test_to_s
65
+ h = TMail::HeaderField.new('Date', 'Tue, 4 Dec 2001 10:49:32 +0900')
66
+ time = Time.parse('Tue, 4 Dec 2001 10:49:32 +0900').strftime("%a,%e %b %Y %H:%M:%S %z")
67
+ assert_equal time, h.to_s
68
+ assert_equal h.to_s, h.decoded
69
+ ok = h.to_s
70
+
71
+ h = TMail::HeaderField.new('Date', 'Tue, 4 Dec 2001 01:49:32 +0000')
72
+ assert_equal ok, h.to_s
73
+
74
+ h = TMail::HeaderField.new('Date', 'Tue, 4 Dec 2001 01:49:32 GMT')
75
+ assert_equal ok, h.to_s
76
+ end
77
+ end
78
+
79
+ class AddressHeaderTester < Test::Unit::TestCase
80
+ def test_s_new
81
+ %w( To Cc Bcc From Reply-To
82
+ Resent-To Resent-Cc Resent-Bcc
83
+ Resent-From Resent-Reply-To ).each do |name|
84
+ h = TMail::HeaderField.new(name, 'aamine@loveruby.net')
85
+ assert_instance_of TMail::AddressHeader, h, name
86
+ end
87
+ end
88
+
89
+ def validate_case( str, isempty, to_s, comments, succ )
90
+ h = TMail::HeaderField.new('To', str)
91
+ assert_equal isempty, h.empty?, str.inspect + " (empty?)\n"
92
+ assert_instance_of Array, h.addrs, str.inspect + " (is a)\n"
93
+ assert_equal succ.size, h.addrs.size, str.inspect + " (size)\n"
94
+ h.addrs.each do |a|
95
+ ok = succ.shift
96
+ assert_equal ok[:phrase], a.phrase, str.inspect + " (phrase)\n"
97
+ assert_equal ok[:routes], a.routes, str.inspect + " (routes)\n"
98
+ assert_equal ok[:spec], a.spec, str.inspect + " (spec)\n"
99
+ end
100
+ assert_equal comments, h.comments, str.inspect + " (comments)\n"
101
+ assert_equal to_s, h.to_s, str.inspect + " (to_s)\n" if to_s
102
+ assert_equal to_s, h.decoded, str.inspect + " (decoded)\n" if to_s
103
+ end
104
+
105
+ def test_ATTRS
106
+ validate_case 'aamine@loveruby.net',
107
+ false,
108
+ 'aamine@loveruby.net',
109
+ [],
110
+ [{ :phrase => nil,
111
+ :routes => [],
112
+ :spec => 'aamine@loveruby.net' }]
113
+
114
+ validate_case 'Minero Aoki <aamine@loveruby.net> (comment)',
115
+ false,
116
+ 'Minero Aoki <aamine@loveruby.net> (comment)',
117
+ ['comment'],
118
+ [{ :phrase => 'Minero Aoki',
119
+ :routes => [],
120
+ :spec => 'aamine@loveruby.net' }]
121
+
122
+ validate_case 'aamine@loveruby.net, , taro@softica.org',
123
+ false,
124
+ 'aamine@loveruby.net, taro@softica.org',
125
+ [],
126
+ [{ :phrase => nil,
127
+ :routes => [],
128
+ :spec => 'aamine@loveruby.net' },
129
+ { :phrase => nil,
130
+ :routes => [],
131
+ :spec => 'taro@softica.org' }]
132
+
133
+ validate_case '',
134
+ true,
135
+ nil,
136
+ [],
137
+ []
138
+
139
+ validate_case '(comment only)',
140
+ true,
141
+ nil,
142
+ ['comment only'],
143
+ []
144
+
145
+ kcode('EUC') {
146
+ validate_case 'hoge@example.jp (=?ISO-2022-JP?B?GyRCJUYlOSVIGyhC?=)',
147
+ false,
148
+ "hoge@example.jp (\245\306\245\271\245\310)",
149
+ ["\245\306\245\271\245\310"],
150
+ [{ :phrase => nil,
151
+ :routes => [],
152
+ :spec => 'hoge@example.jp'}]
153
+ }
154
+ end
155
+ end
156
+
157
+ class SingleAddressHeaderTester < Test::Unit::TestCase
158
+ def test_s_new
159
+ h = TMail::HeaderField.new('Sender', 'aamine@loveruby.net')
160
+ assert_instance_of TMail::SingleAddressHeader, h
161
+ end
162
+
163
+ def test_addr
164
+ h = TMail::HeaderField.new('Sender', 'aamine@loveruby.net')
165
+ assert_not_nil h.addr
166
+ assert_instance_of TMail::Address, h.addr
167
+ assert_equal 'aamine@loveruby.net', h.addr.spec
168
+ assert_equal nil, h.addr.phrase
169
+ assert_equal [], h.addr.routes
170
+ end
171
+
172
+ def test_to_s
173
+ str = 'Minero Aoki <aamine@loveruby.net>, "AOKI, Minero" <aamine@softica.org>'
174
+ h = TMail::HeaderField.new('Sender', str)
175
+ assert_equal 'Minero Aoki <aamine@loveruby.net>', h.to_s
176
+ end
177
+ end
178
+
179
+ class ReturnPathHeaderTester < Test::Unit::TestCase
180
+ def test_s_new
181
+ %w( Return-Path ).each do |name|
182
+ h = TMail::HeaderField.new(name, '<aamine@loveruby.net>')
183
+ assert_instance_of TMail::ReturnPathHeader, h, name
184
+ assert_equal false, h.empty?
185
+ assert_equal false, h.illegal?
186
+ end
187
+ end
188
+
189
+ def test_ATTRS
190
+ h = TMail::HeaderField.new('Return-Path', '<@a,@b,@c:aamine@loveruby.net>')
191
+ assert_not_nil h.addr
192
+ assert_instance_of TMail::Address, h.addr
193
+ assert_equal 'aamine@loveruby.net', h.addr.spec
194
+ assert_equal nil, h.addr.phrase
195
+ assert_equal ['a', 'b', 'c'], h.addr.routes
196
+
197
+ assert_not_nil h.routes
198
+ assert_instance_of Array, h.routes
199
+ assert_equal ['a', 'b', 'c'], h.routes
200
+ assert_equal h.addr.routes, h.routes
201
+
202
+ assert_not_nil h.spec
203
+ assert_instance_of String, h.spec
204
+ assert_equal 'aamine@loveruby.net', h.spec
205
+
206
+ # missing '<' '>'
207
+ h = TMail::HeaderField.new('Return-Path', 'xxxx@yyyy')
208
+ assert_equal 'xxxx@yyyy', h.spec
209
+
210
+ h = TMail::HeaderField.new('Return-Path', '<>')
211
+ assert_instance_of TMail::Address, h.addr
212
+ assert_nil h.addr.local
213
+ assert_nil h.addr.domain
214
+ assert_nil h.addr.spec
215
+ assert_nil h.spec
216
+ end
217
+
218
+ def test_to_s
219
+ body = 'Minero Aoki <@a,@b,@c:aamine@loveruby.net>'
220
+ h = TMail::HeaderField.new('Return-Path', body)
221
+ assert_equal '<@a,@b,@c:aamine@loveruby.net>', h.to_s
222
+ assert_equal h.to_s, h.decoded
223
+
224
+ body = 'aamine@loveruby.net'
225
+ h = TMail::HeaderField.new('Return-Path', body)
226
+ assert_equal '<aamine@loveruby.net>', h.to_s
227
+ assert_equal h.to_s, h.decoded
228
+
229
+ body = '<>'
230
+ h = TMail::HeaderField.new('Return-Path', body)
231
+ assert_equal '<>', h.to_s
232
+ end
233
+ end
234
+
235
+ class MessageIdHeaderTester < Test::Unit::TestCase
236
+ def test_s_new
237
+ %w( Message-Id MESSAGE-ID Message-ID
238
+ Resent-Message-Id Content-Id ).each do |name|
239
+ h = TMail::HeaderField.new(name, '<20020103xg88.k0@mail.loveruby.net>')
240
+ assert_instance_of TMail::MessageIdHeader, h
241
+ end
242
+ end
243
+
244
+ def test_id
245
+ str = '<20020103xg88.k0@mail.loveruby.net>'
246
+ h = TMail::HeaderField.new('Message-Id', str)
247
+ assert_not_nil h.id
248
+ assert_equal str, h.id
249
+
250
+ id = '<20020103xg88.k0@mail.loveruby.net>'
251
+ str = id + ' (comm(ent))'
252
+ h = TMail::HeaderField.new('Message-Id', str)
253
+ assert_not_nil h.id
254
+ assert_equal id, h.id
255
+ end
256
+
257
+ def test_id=
258
+ h = TMail::HeaderField.new('Message-Id', '')
259
+ h.id = str = '<20020103xg88.k0@mail.loveruby.net>'
260
+ assert_not_nil h.id
261
+ assert_equal str, h.id
262
+ end
263
+ end
264
+
265
+ class ReferencesHeaderTester < Test::Unit::TestCase
266
+ def test_s_new
267
+ str = '<20020103xg88.k0@mail.loveruby.net>'
268
+ %w( References REFERENCES ReFeReNcEs
269
+ In-Reply-To ).each do |name|
270
+ h = TMail::HeaderField.new(name, str)
271
+ assert_instance_of TMail::ReferencesHeader, h, name
272
+ end
273
+ end
274
+
275
+ def test_ATTRS
276
+ id1 = '<20020103xg88.k0@mail.loveruby.net>'
277
+ id2 = '<20011204103415.64DB.GGB03124@nifty.ne.jp>'
278
+ phr = 'message of "Wed, 17 Mar 1999 18:42:07 +0900"'
279
+ str = id1 + ' ' + phr + ' ' + id2
280
+
281
+ h = TMail::HeaderField.new('References', str)
282
+
283
+ ok = [id1, id2]
284
+ h.each_id do |i|
285
+ assert_equal ok.shift, i
286
+ end
287
+ ok = [id1, id2]
288
+ assert_equal ok, h.ids
289
+ h.each_id do |i|
290
+ assert_equal ok.shift, i
291
+ end
292
+
293
+ ok = [phr]
294
+ assert_equal ok, h.phrases
295
+ h.each_phrase do |i|
296
+ assert_equal ok.shift, i
297
+ end
298
+ ok = [phr]
299
+ h.each_phrase do |i|
300
+ assert_equal ok.shift, i
301
+ end
302
+
303
+
304
+ # test 2
305
+ # 'In-Reply-To'
306
+ # 'aamine@dp.u-netsurf.ne.jp's message of "Fri, 8 Jan 1999 03:49:37 +0900"'
307
+ end
308
+
309
+ def test_to_s
310
+ id1 = '<20020103xg88.k0@mail.loveruby.net>'
311
+ id2 = '<20011204103415.64DB.GGB03124@nifty.ne.jp>'
312
+ phr = 'message of "Wed, 17 Mar 1999 18:42:07 +0900"'
313
+ str = id1 + ' ' + phr + ' ' + id2
314
+
315
+ h = TMail::HeaderField.new('References', str)
316
+ assert_equal id1 + ' ' + id2, h.to_s
317
+ end
318
+ end
319
+
320
+ class ReceivedHeaderTester < Test::Unit::TestCase
321
+ HEADER1 = <<EOS
322
+ from helium.ruby-lang.org (helium.ruby-lang.org [210.251.121.214])
323
+ by doraemon.edit.ne.jp (8.12.1/8.12.0) via TCP with ESMTP
324
+ id fB41nwEj007438 for <aamine@mx.edit.ne.jp>;
325
+ Tue, 4 Dec 2001 10:49:58 +0900 (JST)
326
+ EOS
327
+ HEADER2 = <<EOS
328
+ from helium.ruby-lang.org (localhost [127.0.0.1])
329
+ by helium.ruby-lang.org (Postfix) with ESMTP
330
+ id 8F8951AF3F; Tue, 4 Dec 2001 10:49:32 +0900 (JST)
331
+ EOS
332
+ HEADER3 = <<EOS
333
+ from smtp1.dti.ne.jp (smtp1.dti.ne.jp [202.216.228.36])
334
+ by helium.ruby-lang.org (Postfix) with ESMTP id CE3A1C3
335
+ for <ruby-list@ruby-lang.org>; Tue, 4 Dec 2001 10:49:31 +0900 (JST)
336
+ EOS
337
+
338
+ =begin dangerous headers
339
+ # 2-word WITH (this header is also wrong in semantic)
340
+ # I cannot support this.
341
+ Received: by mebius with Microsoft Mail
342
+ id <01BE2B9D.9051EAA0@mebius>; Sat, 19 Dec 1998 22:18:54 -0800
343
+ =end
344
+
345
+ def test_s_new
346
+ %w( Received ).each do |name|
347
+ h = TMail::HeaderField.new(name, HEADER1)
348
+ assert_instance_of TMail::ReceivedHeader, h, name
349
+ end
350
+ end
351
+
352
+ def test_ATTRS
353
+ h = TMail::HeaderField.new('Received', HEADER1)
354
+ assert_instance_of String, h.from
355
+ assert_equal 'helium.ruby-lang.org', h.from
356
+
357
+ assert_instance_of String, h.by
358
+ assert_equal 'doraemon.edit.ne.jp', h.by
359
+
360
+ assert_instance_of String, h.via
361
+ assert_equal 'TCP', h.via
362
+
363
+ assert_instance_of Array, h.with
364
+ assert_equal %w(ESMTP), h.with
365
+
366
+ assert_instance_of String, h.id
367
+ assert_equal 'fB41nwEj007438', h.id
368
+
369
+ assert_instance_of String, h._for
370
+ assert_equal 'aamine@mx.edit.ne.jp', h._for # must be <a> ?
371
+
372
+ assert_instance_of Time, h.date
373
+ time = Time.parse('Tue, 4 Dec 2001 10:49:58 +0900')
374
+ assert_equal time, h.date
375
+
376
+ h = TMail::HeaderField.new('Received', '; Tue, 4 Dec 2001 10:49:58 +0900')
377
+ assert_nil h.from
378
+ assert_nil h.by
379
+ assert_nil h.via
380
+ assert_equal [], h.with
381
+ assert_nil h.id
382
+ assert_nil h._for
383
+ time = Time.parse('Tue, 4 Dec 2001 10:49:58 +0900')
384
+ assert_equal time, h.date
385
+
386
+ # without date
387
+ h = TMail::HeaderField.new('Received', 'by NeXT.Mailer (1.144.2)')
388
+ assert_nil h.from
389
+ assert_equal 'NeXT.Mailer', h.by
390
+ assert_nil h.via
391
+ assert_equal [], h.with
392
+ assert_nil h.id
393
+ assert_nil h._for
394
+ assert_nil h.date
395
+
396
+ # FROM is not a domain
397
+ h = TMail::HeaderField.new('Received',
398
+ 'from someuser@example.com; Tue, 24 Nov 1998 07:59:39 -0500')
399
+ assert_equal 'example.com', h.from
400
+ assert_nil h.by
401
+ assert_nil h.via
402
+ assert_equal [], h.with
403
+ assert_nil h.id
404
+ assert_nil h._for
405
+ time = Time.parse('Tue, 24 Nov 1998 07:59:39 -0500')
406
+ assert_equal time, h.date
407
+
408
+ =begin
409
+ # FOR is not route-addr.
410
+ # item order is wrong.
411
+ h = TMail::HeaderField.new('Received',
412
+ 'from aamine by mail.softica.org with local for list@softica.org id 12Vm3N-00044L-01; Fri, 17 Mar 2000 10:59:53 +0900')
413
+ assert_equal 'aamine', h.from
414
+ assert_equal 'mail.softica.org', h.by
415
+ assert_nil h.via
416
+ assert_equal ['local'], h.with
417
+ assert_equal '12Vm3N-00044L-01', h.id
418
+ assert_equal 'list@softica.org', h._for
419
+ assert_equal Time.local(2000,4,17, 10,59,53), h.date
420
+ =end
421
+
422
+ # word + domain-literal in FROM
423
+ h = TMail::HeaderField.new('Received',
424
+ 'from localhost [192.168.1.1]; Sat, 19 Dec 1998 22:19:50 PST')
425
+ assert_equal 'localhost', h.from
426
+ assert_nil h.by
427
+ assert_nil h.via
428
+ assert_equal [], h.with
429
+ assert_nil h.id
430
+ assert_nil h._for
431
+ time = Time.parse('Sat, 19 Dec 1998 22:19:50 PST')
432
+ assert_equal time, h.date
433
+
434
+ # addr-spec in BY (must be a domain)
435
+ h = TMail::HeaderField.new('Received',
436
+ 'by aamine@loveruby.net; Wed, 24 Feb 1999 14:34:20 +0900')
437
+ assert_equal 'loveruby.net', h.by
438
+ end
439
+
440
+ def test_to_s
441
+ h = TMail::HeaderField.new('Received', HEADER1)
442
+ time = Time.parse('Tue, 4 Dec 2001 10:49:58 +0900').strftime("%a,%e %b %Y %H:%M:%S %z")
443
+ assert_equal "from helium.ruby-lang.org by doraemon.edit.ne.jp via TCP with ESMTP id fB41nwEj007438 for <aamine@mx.edit.ne.jp>; #{time}", h.to_s
444
+
445
+ [
446
+ 'from harmony.loveruby.net',
447
+ 'by mail.loveruby.net',
448
+ 'via TCP',
449
+ 'with ESMTP',
450
+ 'id LKJHSDFG',
451
+ 'for <aamine@loveruby.net>',
452
+ "; #{time}"
453
+ ]\
454
+ .each do |str|
455
+ h = TMail::HeaderField.new('Received', str)
456
+ assert_equal str, h.to_s, 'ReceivedHeader#to_s: data=' + str.dump
457
+ end
458
+ end
459
+ end
460
+
461
+ class KeywordsHeaderTester < Test::Unit::TestCase
462
+ def test_s_new
463
+ %w( Keywords KEYWORDS KeYwOrDs ).each do |name|
464
+ h = TMail::HeaderField.new(name, 'key, word, is, keyword')
465
+ assert_instance_of TMail::KeywordsHeader, h
466
+ end
467
+ end
468
+
469
+ def test_keys
470
+ h = TMail::HeaderField.new('Keywords', 'key, word, is, keyword')
471
+ assert_instance_of Array, h.keys
472
+ assert_equal %w(key word is keyword), h.keys
473
+ end
474
+ end
475
+
476
+ class EncryptedHeaderTester < Test::Unit::TestCase
477
+ def test_s_new
478
+ %w( Encrypted ).each do |name|
479
+ h = TMail::HeaderField.new(name, 'lot17 solt')
480
+ assert_instance_of TMail::EncryptedHeader, h
481
+ end
482
+ end
483
+
484
+ def test_encrypter
485
+ h = TMail::HeaderField.new('Encrypted', 'lot17 solt')
486
+ assert_equal 'lot17', h.encrypter
487
+ end
488
+
489
+ def test_encrypter=
490
+ h = TMail::HeaderField.new('Encrypted', 'lot17 solt')
491
+ h.encrypter = 'newscheme'
492
+ assert_equal 'newscheme', h.encrypter
493
+ end
494
+
495
+ def test_keyword
496
+ h = TMail::HeaderField.new('Encrypted', 'lot17 solt')
497
+ assert_equal 'solt', h.keyword
498
+ h = TMail::HeaderField.new('Encrypted', 'lot17')
499
+ assert_equal nil, h.keyword
500
+ end
501
+
502
+ def test_keyword=
503
+ h = TMail::HeaderField.new('Encrypted', 'lot17 solt')
504
+ h.keyword = 'newscheme'
505
+ assert_equal 'newscheme', h.keyword
506
+ end
507
+ end
508
+
509
+ class MimeVersionHeaderTester < Test::Unit::TestCase
510
+ def test_s_new
511
+ %w( Mime-Version MIME-VERSION MiMe-VeRsIoN ).each do |name|
512
+ h = TMail::HeaderField.new(name, '1.0')
513
+ assert_instance_of TMail::MimeVersionHeader, h
514
+ end
515
+ end
516
+
517
+ def test_ATTRS
518
+ h = TMail::HeaderField.new('Mime-Version', '1.0')
519
+ assert_equal 1, h.major
520
+ assert_equal 0, h.minor
521
+ assert_equal '1.0', h.version
522
+
523
+ h = TMail::HeaderField.new('Mime-Version', '99.77 (is ok)')
524
+ assert_equal 99, h.major
525
+ assert_equal 77, h.minor
526
+ assert_equal '99.77', h.version
527
+ end
528
+
529
+ def test_major=
530
+ h = TMail::HeaderField.new('Mime-Version', '1.1')
531
+ h.major = 2
532
+ assert_equal 2, h.major
533
+ assert_equal 1, h.minor
534
+ assert_equal 2, h.major
535
+ h.major = 3
536
+ assert_equal 3, h.major
537
+ end
538
+
539
+ def test_minor=
540
+ h = TMail::HeaderField.new('Mime-Version', '2.3')
541
+ assert_equal 3, h.minor
542
+ h.minor = 5
543
+ assert_equal 5, h.minor
544
+ assert_equal 2, h.major
545
+ end
546
+
547
+ def test_to_s
548
+ h = TMail::HeaderField.new('Mime-Version', '1.0 (first version)')
549
+ assert_equal '1.0', h.to_s
550
+ end
551
+
552
+ def test_empty?
553
+ h = TMail::HeaderField.new('Mime-Version', '')
554
+ assert_equal true, h.empty?
555
+ end
556
+ end
557
+
558
+ class ContentTypeHeaderTester < Test::Unit::TestCase
559
+ def test_s_new
560
+ %w( Content-Type CONTENT-TYPE CoNtEnT-TyPe ).each do |name|
561
+ h = TMail::HeaderField.new(name, 'text/plain; charset=iso-2022-jp')
562
+ assert_instance_of TMail::ContentTypeHeader, h, name
563
+ end
564
+ end
565
+
566
+ def test_ATTRS
567
+ h = TMail::HeaderField.new('Content-Type', 'text/plain; charset=iso-2022-jp')
568
+ assert_equal 'text', h.main_type
569
+ assert_equal 'plain', h.sub_type
570
+ assert_equal 1, h.params.size
571
+ assert_equal 'iso-2022-jp', h.params['charset']
572
+
573
+ h = TMail::HeaderField.new('Content-Type', 'Text/Plain; Charset=shift_jis')
574
+ assert_equal 'text', h.main_type
575
+ assert_equal 'plain', h.sub_type
576
+ assert_equal 1, h.params.size
577
+ assert_equal 'shift_jis', h.params['charset']
578
+ end
579
+
580
+ def test_multipart_with_legal_unquoted_boundary
581
+ h = TMail::HeaderField.new('Content-Type', 'multipart/mixed; boundary=dDRMvlgZJXvWKvBx')
582
+ assert_equal 'multipart', h.main_type
583
+ assert_equal 'mixed', h.sub_type
584
+ assert_equal 1, h.params.size
585
+ assert_equal 'dDRMvlgZJXvWKvBx', h.params['boundary']
586
+ end
587
+
588
+ def test_multipart_with_legal_quoted_boundary_should_retain_quotations
589
+ h = TMail::HeaderField.new('Content-Type', 'multipart/mixed; boundary="dDRMvlgZJXvWKvBx"')
590
+ assert_equal 'multipart', h.main_type
591
+ assert_equal 'mixed', h.sub_type
592
+ assert_equal 1, h.params.size
593
+ assert_equal 'dDRMvlgZJXvWKvBx', h.params['boundary']
594
+ end
595
+
596
+ def test_multipart_with_illegal_unquoted_boundary_should_add_quotations
597
+ h = TMail::HeaderField.new('Content-Type', 'multipart/alternative; boundary=----=_=NextPart_000_0093_01C81419.EB75E850')
598
+ assert_equal 'multipart', h.main_type
599
+ assert_equal 'alternative', h.sub_type
600
+ assert_equal 1, h.params.size
601
+ assert_equal '----=_=NextPart_000_0093_01C81419.EB75E850', h.params['boundary']
602
+ end
603
+
604
+ def test_multipart_with_illegal_quoted_boundary_should_retain_quotations
605
+ h = TMail::HeaderField.new('Content-Type', 'multipart/alternative; boundary="----=_=NextPart_000_0093_01C81419.EB75E850"')
606
+ assert_equal 'multipart', h.main_type
607
+ assert_equal 'alternative', h.sub_type
608
+ assert_equal 1, h.params.size
609
+ assert_equal '----=_=NextPart_000_0093_01C81419.EB75E850', h.params['boundary']
610
+ end
611
+
612
+ def test_main_type=
613
+ h = TMail::HeaderField.new('Content-Type', 'text/plain; charset=iso-2022-jp')
614
+ assert_equal 'text', h.main_type
615
+ h.main_type = 'multipart'
616
+ assert_equal 'multipart', h.main_type
617
+ assert_equal 'multipart', h.main_type
618
+ h.main_type = 'TEXT'
619
+ assert_equal 'text', h.main_type
620
+ end
621
+
622
+ def test_sub_type=
623
+ h = TMail::HeaderField.new('Content-Type', 'text/plain; charset=iso-2022-jp')
624
+ assert_equal 'plain', h.sub_type
625
+ h.sub_type = 'html'
626
+ assert_equal 'html', h.sub_type
627
+ h.sub_type = 'PLAIN'
628
+ assert_equal 'plain', h.sub_type
629
+ end
630
+ end
631
+
632
+ class ContentEncodingHeaderTester < Test::Unit::TestCase
633
+ def test_s_new
634
+ %w( Content-Transfer-Encoding CONTENT-TRANSFER-ENCODING
635
+ COnteNT-TraNSFer-ENCodiNG ).each do |name|
636
+ h = TMail::HeaderField.new(name, 'Base64')
637
+ assert_instance_of TMail::ContentTransferEncodingHeader, h
638
+ end
639
+ end
640
+
641
+ def test_encoding
642
+ h = TMail::HeaderField.new('Content-Transfer-Encoding', 'Base64')
643
+ assert_equal 'base64', h.encoding
644
+
645
+ h = TMail::HeaderField.new('Content-Transfer-Encoding', '7bit')
646
+ assert_equal '7bit', h.encoding
647
+ end
648
+
649
+ def test_encoding=
650
+ h = TMail::HeaderField.new('Content-Transfer-Encoding', 'Base64')
651
+ assert_equal 'base64', h.encoding
652
+ h.encoding = '7bit'
653
+ assert_equal '7bit', h.encoding
654
+ end
655
+
656
+ def test_to_s
657
+ h = TMail::HeaderField.new('Content-Transfer-Encoding', 'Base64')
658
+ assert_equal 'Base64', h.to_s
659
+ assert_equal h.to_s, h.decoded
660
+ assert_equal h.to_s, h.encoded
661
+ end
662
+
663
+ def test_insertion_of_headers_and_encoding_them_short
664
+ mail = TMail::Mail.new
665
+ mail['X-Mail-Header'] = "short bit of data"
666
+ assert_equal("X-Mail-Header: short bit of data\r\n\r\n", mail.encoded)
667
+ end
668
+
669
+ def test_insertion_of_headers_and_encoding_them_more_than_78_char_total_with_whitespace
670
+ mail = TMail::Mail.new
671
+ mail['X-Ruby-Talk'] = "<11152772-AAFA-4614-95FD-9071A4BDF4A111152772-AAFA 4614-95FD-9071A4BDF4A1@grayproductions.net>"
672
+ assert_equal("X-Ruby-Talk: <11152772-AAFA-4614-95FD-9071A4BDF4A111152772-AAFA\r\n\t4614-95FD-9071A4BDF4A1@grayproductions.net>\r\n\r\n", mail.encoded)
673
+ result = TMail::Mail.parse(mail.encoded)
674
+ assert_equal(mail['X-Ruby-Talk'].to_s, result['X-Ruby-Talk'].to_s)
675
+ end
676
+
677
+ def test_insertion_of_headers_and_encoding_them_more_than_78_char_total_with_whitespace
678
+ mail = TMail::Mail.new
679
+ mail['X-Ruby-Talk'] = "<11152772-AAFA-4614-95FD-9071A4BDF4A111152772-AAFA 4614-95FD-9071A4BDF4A1@grayproductions.net11152772-AAFA-4614-95FD-9071A4BDF4A111152772-AAFA 4614-95FD-9071A4BDF4A1@grayproductions.net>"
680
+ assert_equal("X-Ruby-Talk: <11152772-AAFA-4614-95FD-9071A4BDF4A111152772-AAFA\r\n\t4614-95FD-9071A4BDF4A1@grayproductions.net11152772-AAFA-4614-95FD-9071A4BDF4A111152772-AAFA\r\n\t4614-95FD-9071A4BDF4A1@grayproductions.net>\r\n\r\n", mail.encoded)
681
+ result = TMail::Mail.parse(mail.encoded)
682
+ assert_equal(mail['X-Ruby-Talk'].to_s, result['X-Ruby-Talk'].to_s)
683
+ end
684
+
685
+ def test_insertion_of_headers_and_encoding_them_more_than_78_char_total_without_whitespace
686
+ mail = TMail::Mail.new
687
+ mail['X-Ruby-Talk'] = "<11152772-AAFA-4614-95FD-9071A4BDF4A111152772-AAFA-4614-95FD-9071A4BDF4A1@grayproductions.net>"
688
+ assert_equal("X-Ruby-Talk: <11152772-AAFA-4614-95FD-9071A4BDF4A111152772-AAFA-4614-95FD-9071A4BDF4A1@grayproductions.net>\r\n\r\n", mail.encoded)
689
+ result = TMail::Mail.parse(mail.encoded)
690
+ assert_equal(mail['X-Ruby-Talk'].to_s, result['X-Ruby-Talk'].to_s)
691
+ end
692
+
693
+ def test_insertion_of_headers_and_encoding_them_less_than_998_char_total_without_whitespace
694
+ mail = TMail::Mail.new
695
+ text_with_whitespace = ""; 985.times{text_with_whitespace << "a"}
696
+ mail['Reply-To'] = "#{text_with_whitespace}"
697
+ assert_equal("Reply-To: #{text_with_whitespace}\r\n\r\n", mail.encoded)
698
+ result = TMail::Mail.parse(mail.encoded)
699
+ assert_equal(mail['Reply-To'].to_s, result['Reply-To'].to_s)
700
+ end
701
+
702
+ def test_insertion_of_headers_and_encoding_them_more_than_998_char_total_without_whitespace
703
+ mail = TMail::Mail.new
704
+ text_with_whitespace = ""; 1200.times{text_with_whitespace << "a"}
705
+ before_text = ""; 985.times{before_text << "a"}
706
+ after_text = ""; 215.times{after_text << "a"}
707
+ mail['X-Ruby-Talk'] = "#{text_with_whitespace}"
708
+ assert_equal("X-Ruby-Talk: #{before_text}\r\n\t#{after_text}\r\n\r\n", mail.encoded)
709
+ end
710
+
711
+ def test_insertion_of_headers_and_encoding_with_1_more_than_998_char_total_without_whitespace
712
+ mail = TMail::Mail.new
713
+ text_with_whitespace = ""; 996.times{text_with_whitespace << "a"}
714
+ before_text = ""; 995.times{before_text << "a"}
715
+ after_text = ""; 1.times{after_text << "a"}
716
+ mail['X'] = "#{text_with_whitespace}"
717
+ assert_equal("X: #{before_text}\r\n\t#{after_text}\r\n\r\n", mail.encoded)
718
+ end
719
+
720
+ def test_insertion_of_headers_and_encoding_with_exactly_998_char_total_without_whitespace
721
+ mail = TMail::Mail.new
722
+ text_with_whitespace = ""; 995.times{text_with_whitespace << "a"}
723
+ before_text = ""; 995.times{before_text << "a"}
724
+ mail['X'] = "#{text_with_whitespace}"
725
+ assert_equal("X: #{before_text}\r\n\r\n", mail.encoded)
726
+ end
727
+ end
728
+
729
+ class ContentDispositionHeaderTester < Test::Unit::TestCase
730
+ def test_s_new
731
+ %w( Content-Disposition CONTENT-DISPOSITION
732
+ ConTENt-DIsPOsition ).each do |name|
733
+ h = TMail::HeaderField.new(name, 'attachment; filename="README.txt.pif"')
734
+ assert_instance_of TMail::ContentDispositionHeader, h
735
+ end
736
+ end
737
+
738
+ def test_ATTRS
739
+ begin
740
+ _test_ATTRS
741
+ _test_tspecials
742
+ _test_rfc2231_decode
743
+ #_test_rfc2231_encode
744
+ _test_raw_iso2022jp
745
+ _test_raw_eucjp
746
+ _test_raw_sjis
747
+ _test_code_conversion
748
+ ensure
749
+ $KCODE = 'NONE'
750
+ end
751
+ end
752
+
753
+ def _test_ATTRS
754
+ $KCODE = 'NONE'
755
+
756
+ h = TMail::HeaderField.new('Content-Disposition',
757
+ 'attachment; filename="README.txt.pif"')
758
+ assert_equal 'attachment', h.disposition
759
+ assert_equal 1, h.params.size
760
+ assert_equal 'README.txt.pif', h.params['filename']
761
+
762
+ h = TMail::HeaderField.new('Content-Disposition',
763
+ 'attachment; Filename="README.txt.pif"')
764
+ assert_equal 'attachment', h.disposition
765
+ assert_equal 1, h.params.size
766
+ assert_equal 'README.txt.pif', h.params['filename']
767
+
768
+ h = TMail::HeaderField.new('Content-Disposition',
769
+ 'attachment; filename=')
770
+ assert_equal true, h.empty?
771
+ assert_nil h.params
772
+ assert_nil h['filename']
773
+ end
774
+
775
+ def _test_tspecials
776
+ h = TMail::HeaderField.new('Content-Disposition', 'a; n=a')
777
+ h['n'] = %q|()<>[];:@\\,"/?=|
778
+ assert_equal 'a; n="()<>[];:@\\\\,\"/?="',
779
+ h.encoded
780
+ end
781
+
782
+ def _test_rfc2231_decode
783
+ $KCODE = 'EUC'
784
+
785
+ h = TMail::HeaderField.new('Content-Disposition',
786
+ "attachment; filename*=iso-2022-jp'ja'%1b$B$Q$i$`%1b%28B")
787
+ assert_equal 'attachment', h.disposition
788
+ assert_equal 1, h.params.size
789
+ assert_equal "\244\321\244\351\244\340", h.params['filename']
790
+ end
791
+
792
+ def _test_rfc2231_encode
793
+ $KCODE = 'EUC'
794
+
795
+ h = TMail::HeaderField.new('Content-Disposition', 'a; n=a')
796
+ h['n'] = "\245\265\245\363\245\327\245\353.txt"
797
+ assert_equal "a; n*=iso-2022-jp'ja'%1B$B%255%25s%25W%25k%1B%28B.txt",
798
+ h.encoded
799
+
800
+ h = TMail::HeaderField.new('Content-Disposition', 'a; n=a')
801
+ h['n'] = "\245\265()<>[];:@\\,\"/?=%*'"
802
+ assert_equal "a;\r\n\tn*=iso-2022-jp'ja'%1B$B%255%1B%28B%28%29%3C%3E%5B%5D%3B%3A%40%5C%2C%22%2F%3F%3D%25%2A%27",
803
+ h.encoded
804
+ end
805
+
806
+ def _test_raw_iso2022jp
807
+ $KCODE = 'EUC'
808
+ # raw iso2022jp string in value (token)
809
+ h = TMail::HeaderField.new('Content-Disposition',
810
+ %Q<attachment; filename=\e$BF|K\\8l\e(B.doc>)
811
+ assert_equal 'attachment', h.disposition
812
+ assert_equal 1, h.params.size
813
+ # assert_equal "\e$BF|K\\8l\e(B.doc", h.params['filename']
814
+ assert_equal "\306\374\313\334\270\354.doc", h.params['filename']
815
+
816
+ # raw iso2022jp string in value (quoted string)
817
+ h = TMail::HeaderField.new('Content-Disposition',
818
+ %Q<attachment; filename="\e$BF|K\\8l\e(B.doc">)
819
+ assert_equal 'attachment', h.disposition
820
+ assert_equal 1, h.params.size
821
+ # assert_equal "\e$BF|K\\8l\e(B.doc", h.params['filename']
822
+ assert_equal "\306\374\313\334\270\354.doc", h.params['filename']
823
+ end
824
+
825
+ def _test_raw_eucjp
826
+ $KCODE = 'EUC'
827
+ # raw EUC-JP string in value (token)
828
+ h = TMail::HeaderField.new('Content-Disposition',
829
+ %Q<attachment; filename=\306\374\313\334\270\354.doc>)
830
+ assert_equal 'attachment', h.disposition
831
+ assert_equal 1, h.params.size
832
+ assert_equal "\306\374\313\334\270\354.doc", h.params['filename']
833
+
834
+ # raw EUC-JP string in value (quoted-string)
835
+ h = TMail::HeaderField.new('Content-Disposition',
836
+ %Q<attachment; filename="\306\374\313\334\270\354.doc">)
837
+ assert_equal 'attachment', h.disposition
838
+ assert_equal 1, h.params.size
839
+ assert_equal "\306\374\313\334\270\354.doc", h.params['filename']
840
+ end
841
+
842
+ def _test_raw_sjis
843
+ $KCODE = 'SJIS'
844
+ # raw SJIS string in value (token)
845
+ h = TMail::HeaderField.new('Content-Disposition',
846
+ %Q<attachment; filename=\223\372\226{\214\352.doc>)
847
+ assert_equal 'attachment', h.disposition
848
+ assert_equal 1, h.params.size
849
+ assert_equal "\223\372\226{\214\352.doc", h.params['filename']
850
+
851
+ # raw SJIS string in value (quoted-string)
852
+ h = TMail::HeaderField.new('Content-Disposition',
853
+ %Q<attachment; filename="\223\372\226{\214\352.doc">)
854
+ assert_equal 'attachment', h.disposition
855
+ assert_equal 1, h.params.size
856
+ assert_equal "\223\372\226{\214\352.doc", h.params['filename']
857
+ end
858
+
859
+ def _test_code_conversion
860
+ # JIS -> $KCODE auto conversion
861
+ $KCODE = 'EUC'
862
+ h = TMail::HeaderField.new('Content-Disposition',
863
+ %Q<attachment; filename=\e$BF|K\\8l\e(B.doc>)
864
+ assert_equal 'attachment', h.disposition
865
+ assert_equal 1, h.params.size
866
+ assert_equal "\306\374\313\334\270\354.doc", h.params['filename']
867
+
868
+ $KCODE = 'SJIS'
869
+ h = TMail::HeaderField.new('Content-Disposition',
870
+ %Q<attachment; filename=\e$BF|K\\8l\e(B.doc>)
871
+ assert_equal 'attachment', h.disposition
872
+ assert_equal 1, h.params.size
873
+ assert_equal "\223\372\226{\214\352.doc", h.params['filename']
874
+ end
875
+
876
+ def test_disposition=
877
+ h = TMail::HeaderField.new('Content-Disposition',
878
+ 'attachment; filename="README.txt.pif"')
879
+ assert_equal 'attachment', h.disposition
880
+ h.disposition = 'virus'
881
+ assert_equal 'virus', h.disposition
882
+ h.disposition = 'AtTaChMeNt'
883
+ assert_equal 'attachment', h.disposition
884
+ end
885
+ end