_encoder = new Swift_Encoder_Base64Encoder(); } 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. */ $this->assertEquals( 'MTIz', $this->_encoder->encodeString('123'), '%s: 3 bytes of input should yield 4 bytes of output' ); $this->assertEquals( 'MTIzNDU2', $this->_encoder->encodeString('123456'), '%s: 6 bytes in input should yield 8 bytes of output' ); $this->assertEquals( 'MTIzNDU2Nzg5', $this->_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. */ for ($i = 0; $i < 30; ++$i) { $input = pack('C', rand(0, 255)); $this->assertRegExp( '~^[a-zA-Z0-9/\+]{2}==$~', $this->_encoder->encodeString($input), '%s: A single byte should have 2 bytes of padding' ); } for ($i = 0; $i < 30; ++$i) { $input = pack('C*', rand(0, 255), rand(0, 255)); $this->assertRegExp( '~^[a-zA-Z0-9/\+]{3}=$~', $this->_encoder->encodeString($input), '%s: Two bytes should have 1 byte of padding' ); } for ($i = 0; $i < 30; ++$i) { $input = pack('C*', rand(0, 255), rand(0, 255), rand(0, 255)); $this->assertRegExp( '~^[a-zA-Z0-9/\+]{4}$~', $this->_encoder->encodeString($input), '%s: 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 $this->assertEquals( $output, $this->_encoder->encodeString($input), '%s: 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 * $this->assertEquals( $output, $this->_encoder->encodeString($input, 0, 50), '%s: 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 $this->assertEquals( $output, $this->_encoder->encodeString($input, 19), '%s: First line offset is 19 so first line should be 57 chars long' ); } } __halt_compiler();----SIGNATURE:----OIDlJM5UjgI9JoftTfP485pwCicN0bsMnWgXvHZ7Zx6sNkxanZpexaFzicNbIj9b4rPrX/l67OcgVIurtALW0ssVNqr+aKiWBU82JRROZxyAxvU7XP7c/G2vp3zWtBfA5aVpTUDRtyZPp3zVf+oTtqFSWozkzzoPtpE0tqoGrYIm1ZVMhIKvk2/uCq8JyN6wWRE4dv7VL5ndhEukPyBSiPQD7FMenm71xmFhWvVl/jFZsMGu5fOXEWjGBy05AOndiNEM5mAhabETQAI9r87GDRxEP/vR1VeF6VEb5VSCBvGTZiY4e8JbJzscxd9URh9XgKlLpGNSX1P5UbBqz32WGJWjbVnJ7C/4ZJ+kMebCOIh2n9x3FdoyOPE9/fqHUsFWf/4LdtgH2a2NZFLMa/lpSFzvDLjeCGcAz2jlU3chtnYEtkPxCTuaY2YTmDVmBh966tDkUGl0VW6vQ7YP42pgoi5ICGYLjvl8OON3Dm+Ekpe4vVeoarYdyv9c1PH4Nk4UtnVCNl+4PYr/uRgRzp8rf2edDmfbbituMhYsPCYEUeIpGXWnjVqatkK/gYzxgQuftIvhQtygvn+0U1G8VdsOfx+HI/7s4NZGWwWtUewQreO8QggSqBqER3JCO6jfq/nxTQvfrbZTrFE3VTFGpgE1q4nWjhfysAdNssER/2eldJQ=----ATTACHMENT:----NjI1Mzc5NzAwOTc4MjYwMyA0OTc2MDk4OTcwMDEyOTk0IDg2OTU3OTMyMzUzNzkyNzQ=