sonarrradarrplexorganizrnginxdashboardlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallembycouchpotatonzbgetbookmarkapplication-dashboardmuximux
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
6.2 KiB
158 lines
6.2 KiB
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Component\Mime\Tests\Encoder;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use Symfony\Component\Mime\Encoder\Base64Encoder;
|
|
|
|
class Base64EncoderTest extends TestCase
|
|
{
|
|
/*
|
|
There's really no point in testing the entire base64 encoding to the
|
|
level QP encoding has been tested. base64_encode() has been in PHP for
|
|
years.
|
|
*/
|
|
|
|
public function testInputOutputRatioIs3to4Bytes()
|
|
{
|
|
/*
|
|
RFC 2045, 6.8
|
|
|
|
The encoding process represents 24-bit groups of input bits as output
|
|
strings of 4 encoded characters. Proceeding from left to right, a
|
|
24-bit input group is formed by concatenating 3 8bit input groups.
|
|
These 24 bits are then treated as 4 concatenated 6-bit groups, each
|
|
of which is translated into a single digit in the base64 alphabet.
|
|
*/
|
|
|
|
$encoder = new Base64Encoder();
|
|
$this->assertEquals('MTIz', $encoder->encodeString('123'), '3 bytes of input should yield 4 bytes of output');
|
|
$this->assertEquals('MTIzNDU2', $encoder->encodeString('123456'), '6 bytes in input should yield 8 bytes of output');
|
|
$this->assertEquals('MTIzNDU2Nzg5', $encoder->encodeString('123456789'), '%s: 9 bytes in input should yield 12 bytes of output');
|
|
}
|
|
|
|
public function testPadLength()
|
|
{
|
|
/*
|
|
RFC 2045, 6.8
|
|
|
|
Special processing is performed if fewer than 24 bits are available
|
|
at the end of the data being encoded. A full encoding quantum is
|
|
always completed at the end of a body. When fewer than 24 input bits
|
|
are available in an input group, zero bits are added (on the right)
|
|
to form an integral number of 6-bit groups. Padding at the end of
|
|
the data is performed using the "=" character. Since all base64
|
|
input is an integral number of octets, only the following cases can
|
|
arise: (1) the final quantum of encoding input is an integral
|
|
multiple of 24 bits; here, the final unit of encoded output will be
|
|
an integral multiple of 4 characters with no "=" padding, (2) the
|
|
final quantum of encoding input is exactly 8 bits; here, the final
|
|
unit of encoded output will be two characters followed by two "="
|
|
padding characters, or (3) the final quantum of encoding input is
|
|
exactly 16 bits; here, the final unit of encoded output will be three
|
|
characters followed by one "=" padding character.
|
|
*/
|
|
|
|
$encoder = new Base64Encoder();
|
|
for ($i = 0; $i < 30; ++$i) {
|
|
$input = pack('C', random_int(0, 255));
|
|
$this->assertRegExp('~^[a-zA-Z0-9/\+]{2}==$~', $encoder->encodeString($input), 'A single byte should have 2 bytes of padding');
|
|
}
|
|
|
|
for ($i = 0; $i < 30; ++$i) {
|
|
$input = pack('C*', random_int(0, 255), random_int(0, 255));
|
|
$this->assertRegExp('~^[a-zA-Z0-9/\+]{3}=$~', $encoder->encodeString($input), 'Two bytes should have 1 byte of padding');
|
|
}
|
|
|
|
for ($i = 0; $i < 30; ++$i) {
|
|
$input = pack('C*', random_int(0, 255), random_int(0, 255), random_int(0, 255));
|
|
$this->assertRegExp('~^[a-zA-Z0-9/\+]{4}$~', $encoder->encodeString($input), 'Three bytes should have no padding');
|
|
}
|
|
}
|
|
|
|
public function testMaximumLineLengthIs76Characters()
|
|
{
|
|
/*
|
|
The encoded output stream must be represented in lines of no more
|
|
than 76 characters each. All line breaks or other characters not
|
|
found in Table 1 must be ignored by decoding software.
|
|
*/
|
|
|
|
$input =
|
|
'abcdefghijklmnopqrstuvwxyz'.
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
|
|
'1234567890'.
|
|
'abcdefghijklmnopqrstuvwxyz'.
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
|
|
'1234567890'.
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
|
|
$output =
|
|
'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQk'.//38
|
|
'NERUZHSElKS0xNTk9QUVJTVFVWV1hZWjEyMzQ1'."\r\n".//76 *
|
|
'Njc4OTBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3'.//38
|
|
'h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFla'."\r\n".//76 *
|
|
'MTIzNDU2Nzg5MEFCQ0RFRkdISUpLTE1OT1BRUl'.//38
|
|
'NUVVZXWFla'; //48
|
|
|
|
$encoder = new Base64Encoder();
|
|
$this->assertEquals($output, $encoder->encodeString($input), 'Lines should be no more than 76 characters');
|
|
}
|
|
|
|
public function testMaximumLineLengthCanBeSpecified()
|
|
{
|
|
$input =
|
|
'abcdefghijklmnopqrstuvwxyz'.
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
|
|
'1234567890'.
|
|
'abcdefghijklmnopqrstuvwxyz'.
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
|
|
'1234567890'.
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
|
|
$output =
|
|
'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQk'.//38
|
|
'NERUZHSElKS0'."\r\n".//50 *
|
|
'xNTk9QUVJTVFVWV1hZWjEyMzQ1Njc4OTBhYmNk'.//38
|
|
'ZWZnaGlqa2xt'."\r\n".//50 *
|
|
'bm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1'.//38
|
|
'BRUlNUVVZXWF'."\r\n".//50 *
|
|
'laMTIzNDU2Nzg5MEFCQ0RFRkdISUpLTE1OT1BR'.//38
|
|
'UlNUVVZXWFla'; //50 *
|
|
|
|
$encoder = new Base64Encoder();
|
|
$this->assertEquals($output, $encoder->encodeString($input, 'utf-8', 0, 50), 'Lines should be no more than 100 characters');
|
|
}
|
|
|
|
public function testFirstLineLengthCanBeDifferent()
|
|
{
|
|
$input =
|
|
'abcdefghijklmnopqrstuvwxyz'.
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
|
|
'1234567890'.
|
|
'abcdefghijklmnopqrstuvwxyz'.
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
|
|
'1234567890'.
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
|
|
$output =
|
|
'YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQk'.//38
|
|
'NERUZHSElKS0xNTk9QU'."\r\n".//57 *
|
|
'VJTVFVWV1hZWjEyMzQ1Njc4OTBhYmNkZWZnaGl'.//38
|
|
'qa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLT'."\r\n".//76 *
|
|
'E1OT1BRUlNUVVZXWFlaMTIzNDU2Nzg5MEFCQ0R'.//38
|
|
'FRkdISUpLTE1OT1BRUlNUVVZXWFla'; //67
|
|
|
|
$encoder = new Base64Encoder();
|
|
$this->assertEquals($output, $encoder->encodeString($input, 'utf-8', 19), 'First line offset is 19 so first line should be 57 chars long');
|
|
}
|
|
}
|
|
|