FileByteStreamAcceptanceTest.php 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. require_once 'Swift/Tests/SwiftUnitTestCase.php';
  3. require_once 'Swift/InputByteStream.php';
  4. require_once 'Swift/ByteStream/FileByteStream.php';
  5. require_once 'Swift/StreamFilters/StringReplacementFilter.php';
  6. class Swift_ByteStream_FileByteStreamAcceptanceTest
  7. extends Swift_Tests_SwiftUnitTestCase
  8. {
  9. private $_tmpDir;
  10. private $_testFile;
  11. public function skip()
  12. {
  13. $this->skipUnless(
  14. SWIFT_TMP_DIR, 'Cannot run test without a writable directory to use (' .
  15. 'define SWIFT_TMP_DIR in tests/config.php if you wish to run this test)'
  16. );
  17. }
  18. public function setUp()
  19. {
  20. $this->_tmpDir = SWIFT_TMP_DIR;
  21. $this->_testFile = $this->_tmpDir . '/swift-test-file' . __CLASS__;
  22. file_put_contents($this->_testFile, 'abcdefghijklm');
  23. }
  24. public function tearDown()
  25. {
  26. unlink($this->_testFile);
  27. }
  28. public function testFileDataCanBeRead()
  29. {
  30. $file = $this->_createFileStream($this->_testFile);
  31. $str = '';
  32. while (false !== $bytes = $file->read(8192)) {
  33. $str .= $bytes;
  34. }
  35. $this->assertEqual('abcdefghijklm', $str);
  36. }
  37. public function testFileDataCanBeReadSequentially()
  38. {
  39. $file = $this->_createFileStream($this->_testFile);
  40. $this->assertEqual('abcde', $file->read(5));
  41. $this->assertEqual('fghijklm', $file->read(8));
  42. $this->assertFalse($file->read(1));
  43. }
  44. public function testFilenameIsReturned()
  45. {
  46. $file = $this->_createFileStream($this->_testFile);
  47. $this->assertEqual($this->_testFile, $file->getPath());
  48. }
  49. public function testFileCanBeWrittenTo()
  50. {
  51. $file = $this->_createFileStream(
  52. $this->_testFile, true
  53. );
  54. $file->write('foobar');
  55. $this->assertEqual('foobar', $file->read(8192));
  56. }
  57. public function testReadingFromThenWritingToFile()
  58. {
  59. $file = $this->_createFileStream(
  60. $this->_testFile, true
  61. );
  62. $file->write('foobar');
  63. $this->assertEqual('foobar', $file->read(8192));
  64. $file->write('zipbutton');
  65. $this->assertEqual('zipbutton', $file->read(8192));
  66. }
  67. public function testWritingToFileWithCanonicalization()
  68. {
  69. $file = $this->_createFileStream(
  70. $this->_testFile, true
  71. );
  72. $file->addFilter($this->_createFilter(array("\r\n", "\r"), "\n"), 'allToLF');
  73. $file->write("foo\r\nbar\r");
  74. $file->write("\nzip\r\ntest\r");
  75. $file->flushBuffers();
  76. $this->assertEqual("foo\nbar\nzip\ntest\n", file_get_contents($this->_testFile));
  77. }
  78. public function testBindingOtherStreamsMirrorsWriteOperations()
  79. {
  80. $file = $this->_createFileStream(
  81. $this->_testFile, true
  82. );
  83. $is1 = $this->_createMockInputStream();
  84. $is2 = $this->_createMockInputStream();
  85. $this->_checking(Expectations::create()
  86. -> one($is1)->write('x')
  87. -> one($is2)->write('x')
  88. -> one($is1)->write('y')
  89. -> one($is2)->write('y')
  90. );
  91. $file->bind($is1);
  92. $file->bind($is2);
  93. $file->write('x');
  94. $file->write('y');
  95. }
  96. public function testBindingOtherStreamsMirrorsFlushOperations()
  97. {
  98. $file = $this->_createFileStream(
  99. $this->_testFile, true
  100. );
  101. $is1 = $this->_createMockInputStream();
  102. $is2 = $this->_createMockInputStream();
  103. $this->_checking(Expectations::create()
  104. -> one($is1)->flushBuffers()
  105. -> one($is2)->flushBuffers()
  106. );
  107. $file->bind($is1);
  108. $file->bind($is2);
  109. $file->flushBuffers();
  110. }
  111. public function testUnbindingStreamPreventsFurtherWrites()
  112. {
  113. $file = $this->_createFileStream(
  114. $this->_testFile, true
  115. );
  116. $is1 = $this->_createMockInputStream();
  117. $is2 = $this->_createMockInputStream();
  118. $this->_checking(Expectations::create()
  119. -> one($is1)->write('x')
  120. -> one($is2)->write('x')
  121. -> one($is1)->write('y')
  122. );
  123. $file->bind($is1);
  124. $file->bind($is2);
  125. $file->write('x');
  126. $file->unbind($is2);
  127. $file->write('y');
  128. }
  129. // -- Creation methods
  130. private function _createFilter($search, $replace)
  131. {
  132. return new Swift_StreamFilters_StringReplacementFilter($search, $replace);
  133. }
  134. private function _createMockInputStream()
  135. {
  136. return $this->_mock('Swift_InputByteStream');
  137. }
  138. private function _createFileStream($file, $writable = false)
  139. {
  140. return new Swift_ByteStream_FileByteStream($file, $writable);
  141. }
  142. }