QpContentEncoderAcceptanceTest.php 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. require_once 'Swift/Tests/SwiftUnitTestCase.php';
  3. require_once 'Swift/Mime/ContentEncoder/QpContentEncoder.php';
  4. require_once 'Swift/CharacterStream/ArrayCharacterStream.php';
  5. require_once 'Swift/CharacterReaderFactory/SimpleCharacterReaderFactory.php';
  6. require_once 'Swift/ByteStream/ArrayByteStream.php';
  7. class Swift_Mime_ContentEncoder_QpContentEncoderAcceptanceTest
  8. extends Swift_Tests_SwiftUnitTestCase
  9. {
  10. private $_samplesDir;
  11. private $_factory;
  12. public function setUp()
  13. {
  14. $this->_samplesDir = realpath(dirname(__FILE__) . '/../../../../_samples/charsets');
  15. $this->_factory = new Swift_CharacterReaderFactory_SimpleCharacterReaderFactory();
  16. }
  17. public function testEncodingAndDecodingSamples()
  18. {
  19. $sampleFp = opendir($this->_samplesDir);
  20. while (false !== $encodingDir = readdir($sampleFp)) {
  21. if (substr($encodingDir, 0, 1) == '.') {
  22. continue;
  23. }
  24. $encoding = $encodingDir;
  25. $charStream = new Swift_CharacterStream_NgCharacterStream(
  26. $this->_factory, $encoding);
  27. $encoder = new Swift_Mime_ContentEncoder_QpContentEncoder($charStream);
  28. $sampleDir = $this->_samplesDir . '/' . $encodingDir;
  29. if (is_dir($sampleDir)) {
  30. $fileFp = opendir($sampleDir);
  31. while (false !== $sampleFile = readdir($fileFp)) {
  32. if (substr($sampleFile, 0, 1) == '.') {
  33. continue;
  34. }
  35. $text = file_get_contents($sampleDir . '/' . $sampleFile);
  36. $os = new Swift_ByteStream_ArrayByteStream();
  37. $os->write($text);
  38. $is = new Swift_ByteStream_ArrayByteStream();
  39. $encoder->encodeByteStream($os, $is);
  40. $encoded = '';
  41. while (false !== $bytes = $is->read(8192)) {
  42. $encoded .= $bytes;
  43. }
  44. $this->assertEqual(
  45. quoted_printable_decode($encoded), $text,
  46. '%s: Encoded string should decode back to original string for sample ' .
  47. $sampleDir . '/' . $sampleFile
  48. );
  49. }
  50. closedir($fileFp);
  51. }
  52. }
  53. closedir($sampleFp);
  54. }
  55. public function testEncodingAndDecodingSamplesFromDiConfiguredInstance()
  56. {
  57. $sampleFp = opendir($this->_samplesDir);
  58. while (false !== $encodingDir = readdir($sampleFp)) {
  59. if (substr($encodingDir, 0, 1) == '.') {
  60. continue;
  61. }
  62. $encoding = $encodingDir;
  63. $encoder = $this->_createEncoderFromContainer();
  64. $sampleDir = $this->_samplesDir . '/' . $encodingDir;
  65. if (is_dir($sampleDir)) {
  66. $fileFp = opendir($sampleDir);
  67. while (false !== $sampleFile = readdir($fileFp)) {
  68. if (substr($sampleFile, 0, 1) == '.') {
  69. continue;
  70. }
  71. $text = file_get_contents($sampleDir . '/' . $sampleFile);
  72. $os = new Swift_ByteStream_ArrayByteStream();
  73. $os->write($text);
  74. $is = new Swift_ByteStream_ArrayByteStream();
  75. $encoder->encodeByteStream($os, $is);
  76. $encoded = '';
  77. while (false !== $bytes = $is->read(8192)) {
  78. $encoded .= $bytes;
  79. }
  80. $this->assertEqual(
  81. str_replace("\r\n", "\n", quoted_printable_decode($encoded)), str_replace("\r\n", "\n", $text),
  82. '%s: Encoded string should decode back to original string for sample ' .
  83. $sampleDir . '/' . $sampleFile
  84. );
  85. }
  86. closedir($fileFp);
  87. }
  88. }
  89. closedir($sampleFp);
  90. }
  91. public function testEncodingLFTextWithDiConfiguredInstance()
  92. {
  93. $encoder = $this->_createEncoderFromContainer();
  94. $this->assertEqual("a\r\nb\r\nc", $encoder->encodeString("a\nb\nc"));
  95. }
  96. public function testEncodingCRTextWithDiConfiguredInstance()
  97. {
  98. $encoder = $this->_createEncoderFromContainer();
  99. $this->assertEqual("a\r\nb\r\nc", $encoder->encodeString("a\rb\rc"));
  100. }
  101. public function testEncodingLFCRTextWithDiConfiguredInstance()
  102. {
  103. $encoder = $this->_createEncoderFromContainer();
  104. $this->assertEqual("a\r\n\r\nb\r\n\r\nc", $encoder->encodeString("a\n\rb\n\rc"));
  105. }
  106. public function testEncodingCRLFTextWithDiConfiguredInstance()
  107. {
  108. $encoder = $this->_createEncoderFromContainer();
  109. $this->assertEqual("a\r\nb\r\nc", $encoder->encodeString("a\r\nb\r\nc"));
  110. }
  111. public function testEncodingDotStuffingWithDiConfiguredInstance()
  112. {
  113. // Enable DotEscaping
  114. Swift_Preferences::getInstance()->setQPDotEscape(true);
  115. $encoder = $this->_createEncoderFromContainer();
  116. $this->assertEqual("a=2E\r\n=2E\r\n=2Eb\r\nc", $encoder->encodeString("a.\r\n.\r\n.b\r\nc"));
  117. // Return to default
  118. Swift_Preferences::getInstance()->setQPDotEscape(false);
  119. $encoder = $this->_createEncoderFromContainer();
  120. $this->assertEqual("a.\r\n.\r\n.b\r\nc", $encoder->encodeString("a.\r\n.\r\n.b\r\nc"));
  121. }
  122. public function testDotStuffingEncodingAndDecodingSamplesFromDiConfiguredInstance()
  123. {
  124. // Enable DotEscaping
  125. Swift_Preferences::getInstance()->setQPDotEscape(true);
  126. $this->testEncodingAndDecodingSamplesFromDiConfiguredInstance();
  127. // Disable DotStuffing to continue
  128. Swift_Preferences::getInstance()->setQPDotEscape(false);
  129. }
  130. // -- Private Methods
  131. private function _createEncoderFromContainer()
  132. {
  133. return Swift_DependencyContainer::getInstance()
  134. ->lookup('mime.qpcontentencoder')
  135. ;
  136. }
  137. }