1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
<?php
class Swift_Encoder_Rfc2231EncoderTest extends \SwiftMailerTestCase
{
private $_rfc2045Token = '/^[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E]+$/D';
/* --
This algorithm is described in RFC 2231, but is barely touched upon except
for mentioning bytes can be represented as their octet values (e.g. %20 for
the SPACE character).
The tests here focus on how to use that representation to always generate text
which matches RFC 2045's definition of "token".
*/
public function testEncodingAsciiCharactersProducesValidToken()
{
$charStream = $this->getMockery('Swift_CharacterStream');
$string = '';
foreach (range(0x00, 0x7F) as $octet) {
$char = pack('C', $octet);
$string .= $char;
$charStream->shouldReceive('read')
->once()
->andReturn($char);
}
$charStream->shouldReceive('flushContents')
->once();
$charStream->shouldReceive('importString')
->once()
->with($string);
$charStream->shouldReceive('read')
->atLeast()->times(1)
->andReturn(false);
$encoder = new Swift_Encoder_Rfc2231Encoder($charStream);
$encoded = $encoder->encodeString($string);
foreach (explode("\r\n", $encoded) as $line) {
$this->assertRegExp($this->_rfc2045Token, $line,
'%s: Encoder should always return a valid RFC 2045 token.');
}
}
public function testEncodingNonAsciiCharactersProducesValidToken()
{
$charStream = $this->getMockery('Swift_CharacterStream');
$string = '';
foreach (range(0x80, 0xFF) as $octet) {
$char = pack('C', $octet);
$string .= $char;
$charStream->shouldReceive('read')
->once()
->andReturn($char);
}
$charStream->shouldReceive('flushContents')
->once();
$charStream->shouldReceive('importString')
->once()
->with($string);
$charStream->shouldReceive('read')
->atLeast()->times(1)
->andReturn(false);
$encoder = new Swift_Encoder_Rfc2231Encoder($charStream);
$encoded = $encoder->encodeString($string);
foreach (explode("\r\n", $encoded) as $line) {
$this->assertRegExp($this->_rfc2045Token, $line,
'%s: Encoder should always return a valid RFC 2045 token.');
}
}
public function testMaximumLineLengthCanBeSet()
{
$charStream = $this->getMockery('Swift_CharacterStream');
$string = '';
for ($x = 0; $x < 200; ++$x) {
$char = 'a';
$string .= $char;
$charStream->shouldReceive('read')
->once()
->andReturn($char);
}
$charStream->shouldReceive('flushContents')
->once();
$charStream->shouldReceive('importString')
->once()
->with($string);
$charStream->shouldReceive('read')
->atLeast()->times(1)
->andReturn(false);
$encoder = new Swift_Encoder_Rfc2231Encoder($charStream);
$encoded = $encoder->encodeString($string, 0, 75);
$this->assertEquals(
str_repeat('a', 75)."\r\n".
str_repeat('a', 75)."\r\n".
str_repeat('a', 50),
$encoded,
'%s: Lines should be wrapped at each 75 characters'
);
}
public function testFirstLineCanHaveShorterLength()
{
$charStream = $this->getMockery('Swift_CharacterStream');
$string = '';
for ($x = 0; $x < 200; ++$x) {
$char = 'a';
$string .= $char;
$charStream->shouldReceive('read')
->once()
->andReturn($char);
}
$charStream->shouldReceive('flushContents')
->once();
$charStream->shouldReceive('importString')
->once()
->with($string);
$charStream->shouldReceive('read')
->atLeast()->times(1)
->andReturn(false);
$encoder = new Swift_Encoder_Rfc2231Encoder($charStream);
$encoded = $encoder->encodeString($string, 25, 75);
$this->assertEquals(
str_repeat('a', 50)."\r\n".
str_repeat('a', 75)."\r\n".
str_repeat('a', 75),
$encoded,
'%s: First line should be 25 bytes shorter than the others.'
);
}
}
|