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.'
);
}
}
|