Aleksander Machniak
2016-05-22 0344b168276f80189e2254c75a762aff5b517b6b
commit | author | age
e82492 1 <?php
AM 2
3 /**
9b05f1 4  * Test class to test rcube_mime class
e82492 5  *
AM 6  * @package Tests
7  */
9b05f1 8 class Framework_Mime extends PHPUnit_Framework_TestCase
e82492 9 {
AM 10
11     /**
12      * Test decoding of single e-mail address strings
13      * Uses rcube_mime::decode_address_list()
14      */
15     function test_decode_single_address()
16     {
17         $headers = array(
18             0  => 'test@domain.tld',
19             1  => '<test@domain.tld>',
20             2  => 'Test <test@domain.tld>',
21             3  => 'Test Test <test@domain.tld>',
22             4  => 'Test Test<test@domain.tld>',
23             5  => '"Test Test" <test@domain.tld>',
24             6  => '"Test Test"<test@domain.tld>',
25             7  => '"Test \\" Test" <test@domain.tld>',
26             8  => '"Test<Test" <test@domain.tld>',
27             9  => '=?ISO-8859-1?B?VGVzdAo=?= <test@domain.tld>',
28             10 => '=?ISO-8859-1?B?VGVzdAo=?=<test@domain.tld>', // #1487068
29             // comments in address (#1487673)
30             11 => 'Test (comment) <test@domain.tld>',
31             12 => '"Test" (comment) <test@domain.tld>',
32             13 => '"Test (comment)" (comment) <test@domain.tld>',
33             14 => '(comment) <test@domain.tld>',
34             15 => 'Test <test@(comment)domain.tld>',
35             16 => 'Test Test ((comment)) <test@domain.tld>',
36             17 => 'test@domain.tld (comment)',
37             18 => '"Test,Test" <test@domain.tld>',
38             // 1487939
39             19 => 'Test <"test test"@domain.tld>',
40             20 => '<"test test"@domain.tld>',
41             21 => '"test test"@domain.tld',
fd0fd3 42             // invalid (#1489092)
AM 43             22 => '"John Doe @ SomeBusinessName" <MAILER-DAEMON>',
5140c3 44             23 => '=?UTF-8?B?IlRlc3QsVGVzdCI=?= <test@domain.tld>',
2b8f03 45             // invalid, but we do our best to parse correctly
AM 46             24 => '"email@test.com" <>',
f01666 47             // valid with redundant quoting (#1490040)
AM 48             25 => '"user"@"domain.tld"',
e82492 49         );
AM 50
51         $results = array(
52             0  => array(1, '', 'test@domain.tld'),
53             1  => array(1, '', 'test@domain.tld'),
54             2  => array(1, 'Test', 'test@domain.tld'),
55             3  => array(1, 'Test Test', 'test@domain.tld'),
56             4  => array(1, 'Test Test', 'test@domain.tld'),
57             5  => array(1, 'Test Test', 'test@domain.tld'),
58             6  => array(1, 'Test Test', 'test@domain.tld'),
59             7  => array(1, 'Test " Test', 'test@domain.tld'),
60             8  => array(1, 'Test<Test', 'test@domain.tld'),
61             9  => array(1, 'Test', 'test@domain.tld'),
62             10 => array(1, 'Test', 'test@domain.tld'),
63             11 => array(1, 'Test', 'test@domain.tld'),
64             12 => array(1, 'Test', 'test@domain.tld'),
65             13 => array(1, 'Test (comment)', 'test@domain.tld'),
66             14 => array(1, '', 'test@domain.tld'),
67             15 => array(1, 'Test', 'test@domain.tld'),
68             16 => array(1, 'Test Test', 'test@domain.tld'),
69             17 => array(1, '', 'test@domain.tld'),
70             18 => array(1, 'Test,Test', 'test@domain.tld'),
71             19 => array(1, 'Test', '"test test"@domain.tld'),
72             20 => array(1, '', '"test test"@domain.tld'),
73             21 => array(1, '', '"test test"@domain.tld'),
fd0fd3 74             // invalid (#1489092)
AM 75             22 => array(1, 'John Doe @ SomeBusinessName', 'MAILER-DAEMON'),
5140c3 76             23 => array(1, 'Test,Test', 'test@domain.tld'),
2b8f03 77             24 => array(1, '', 'email@test.com'),
f01666 78             25 => array(1, '', 'user@domain.tld'),
e82492 79         );
AM 80
81         foreach ($headers as $idx => $header) {
82             $res = rcube_mime::decode_address_list($header);
83
84             $this->assertEquals($results[$idx][0], count($res), "Rows number in result for header: " . $header);
85             $this->assertEquals($results[$idx][1], $res[1]['name'], "Name part decoding for header: " . $header);
86             $this->assertEquals($results[$idx][2], $res[1]['mailto'], "Email part decoding for header: " . $header);
87         }
88     }
89
90     /**
91      * Test decoding of header values
92      * Uses rcube_mime::decode_mime_string()
93      */
94     function test_header_decode_qp()
95     {
96         $test = array(
97             // #1488232: invalid character "?"
98             'quoted-printable (1)' => array(
99                 'in'  => '=?utf-8?Q?Certifica=C3=A7=C3=A3??=',
100                 'out' => 'Certifica=C3=A7=C3=A3?',
101             ),
102             'quoted-printable (2)' => array(
103                 'in'  => '=?utf-8?Q?Certifica=?= =?utf-8?Q?C3=A7=C3=A3?=',
104                 'out' => 'Certifica=C3=A7=C3=A3',
105             ),
106             'quoted-printable (3)' => array(
107                 'in'  => '=?utf-8?Q??= =?utf-8?Q??=',
108                 'out' => '',
109             ),
110             'quoted-printable (4)' => array(
111                 'in'  => '=?utf-8?Q??= a =?utf-8?Q??=',
112                 'out' => ' a ',
113             ),
114             'quoted-printable (5)' => array(
115                 'in'  => '=?utf-8?Q?a?= =?utf-8?Q?b?=',
116                 'out' => 'ab',
117             ),
118             'quoted-printable (6)' => array(
119                 'in'  => '=?utf-8?Q?   ?= =?utf-8?Q?a?=',
120                 'out' => '   a',
121             ),
122             'quoted-printable (7)' => array(
123                 'in'  => '=?utf-8?Q?___?= =?utf-8?Q?a?=',
124                 'out' => '   a',
125             ),
126         );
127
128         foreach ($test as $idx => $item) {
129             $res = rcube_mime::decode_mime_string($item['in'], 'UTF-8');
130             $res = quoted_printable_encode($res);
131
132             $this->assertEquals($item['out'], $res, "Header decoding for: " . $idx);
133         }
134     }
6d41d8 135
TB 136     /**
137      * Test format=flowed unfolding
138      */
139     function test_format_flowed()
140     {
141         $raw = file_get_contents(TESTS_DIR . 'src/format-flowed-unfolded.txt');
142         $flowed = file_get_contents(TESTS_DIR . 'src/format-flowed.txt');
143
144         $this->assertEquals($flowed, rcube_mime::format_flowed($raw, 80), "Test correct folding and space-stuffing");
145     }
146
147     /**
148      * Test format=flowed unfolding
149      */
150     function test_unfold_flowed()
151     {
152         $flowed = file_get_contents(TESTS_DIR . 'src/format-flowed.txt');
153         $unfolded = file_get_contents(TESTS_DIR . 'src/format-flowed-unfolded.txt');
154
155         $this->assertEquals($unfolded, rcube_mime::unfold_flowed($flowed), "Test correct unfolding of quoted lines");
156     }
7439d3 157
AM 158     /**
13e0a6 159      * Test format=flowed unfolding (#1490284)
AM 160      */
161     function test_unfold_flowed2()
162     {
163         $flowed   = "> culpa qui officia deserunt mollit anim id est laborum.\r\n"
164                     ."> \r\n"
165                     ."Sed ut perspiciatis unde omnis iste natus error \r\nsit voluptatem";
166         $unfolded = "> culpa qui officia deserunt mollit anim id est laborum.\r\n"
167                     ."> \r\n"
168                     ."Sed ut perspiciatis unde omnis iste natus error sit voluptatem";
169
170         $this->assertEquals($unfolded, rcube_mime::unfold_flowed($flowed), "Test correct unfolding of quoted lines [2]");
171     }
172
173     /**
7439d3 174      * Test wordwrap()
AM 175      */
176     function test_wordwrap()
177     {
178         $samples = array(
179             array(
180                 array("aaaa aaaa\n           aaaa"),
181                 "aaaa aaaa\n           aaaa",
182             ),
183             array(
184                 array("123456789 123456789 123456789 123", 29),
185                 "123456789 123456789 123456789\n123",
186             ),
187             array(
188                 array("123456789   3456789 123456789", 29),
189                 "123456789   3456789 123456789",
190             ),
191             array(
192                 array("123456789 123456789 123456789   123", 29),
193                 "123456789 123456789 123456789\n  123",
194             ),
195             array(
196                 array("abc", 1, "\n", true),
197                 "a\nb\nc",
198             ),
199             array(
200                 array("ąść", 1, "\n", true, 'UTF-8'),
201                 "ą\nś\nć",
202             ),
203             array(
204                 array(">abc\n>def", 2, "\n", true),
205                 ">abc\n>def",
206             ),
207             array(
208                 array("abc def", 3, "-"),
209                 "abc-def",
210             ),
1041aa 211             array(
AM 212                 array("----------------------------------------------------------------------------------------\nabc                        def123456789012345", 76),
213                 "----------------------------------------------------------------------------------------\nabc                        def123456789012345",
214             ),
2ce019 215             array(
AM 216                 array("-------\nabc def", 5),
217                 "-------\nabc\ndef",
218             ),
db108e 219             array(
AM 220                 array("http://xx.xxx.xx.xxx:8080/addressbooks/roundcubexxxxx%40xxxxxxxxxxxxxxxxxxxxxxx.xx.xx/testing/", 70),
221                 "http://xx.xxx.xx.xxx:8080/addressbooks/roundcubexxxxx%40xxxxxxxxxxxxxxxxxxxxxxx.xx.xx/testing/",
222             ),
0f1521 223             array(
AM 224                 array("this-is-just-some-blabla-to-make-this-more-than-seventy-five-characters-in-a-row -- this line should be wrapped", 20, "\n"),
225                 "this-is-just-some-blabla-to-make-this-more-than-seventy-five-characters-in-a-row\n-- this line should\nbe wrapped",
226             ),
7439d3 227         );
AM 228
229         foreach ($samples as $sample) {
230             $this->assertEquals($sample[1], call_user_func_array(array('rcube_mime', 'wordwrap'), $sample[0]), "Test text wrapping");
231         }
232     }
233
f7427f 234     /**
AM 235      * Test parse_message()
236      */
237     function test_parse_message()
238     {
239         $file   = file_get_contents(__DIR__ . '/../src/html.msg');
240         $result = rcube_mime::parse_message($file);
241
242         $this->assertInstanceOf('rcube_message_part', $result);
243         $this->assertSame('multipart/alternative', $result->mimetype);
244         $this->assertSame('1.0', $result->headers['mime-version']);
245         $this->assertSame('=_68eeaf4ab95b5312965e45c33362338e', $result->ctype_parameters['boundary']);
246         $this->assertSame('1',              $result->parts[0]->mime_id);
247         $this->assertSame(12,               $result->parts[0]->size);
248         $this->assertSame('text/plain',     $result->parts[0]->mimetype);
249         $this->assertSame("this is test",   $result->parts[0]->body);
250         $this->assertSame('2',              $result->parts[1]->mime_id);
251         $this->assertSame(0,                $result->parts[1]->size);
252         $this->assertSame('multipart/related', $result->parts[1]->mimetype);
253         $this->assertCount(2,               $result->parts[1]->parts);
254         $this->assertSame('2.1',            $result->parts[1]->parts[0]->mime_id);
255         $this->assertSame(257,              $result->parts[1]->parts[0]->size);
256         $this->assertSame('text/html',      $result->parts[1]->parts[0]->mimetype);
257         $this->assertSame('UTF-8',          $result->parts[1]->parts[0]->charset);
258         $this->assertRegExp('/<html>/',     $result->parts[1]->parts[0]->body);
259         $this->assertSame('2.2',            $result->parts[1]->parts[1]->mime_id);
260         $this->assertSame(793,              $result->parts[1]->parts[1]->size);
261         $this->assertSame('image/jpeg',     $result->parts[1]->parts[1]->mimetype);
262         $this->assertSame('base64',          $result->parts[1]->parts[1]->encoding);
263         $this->assertSame('inline',          $result->parts[1]->parts[1]->disposition);
264         $this->assertSame('photo-mini.jpg', $result->parts[1]->parts[1]->filename);
265     }
e82492 266 }