diff --git a/phpseclib/Net/SFTP/Stream.php b/phpseclib/Net/SFTP/Stream.php index 7db29979..0085b959 100644 --- a/phpseclib/Net/SFTP/Stream.php +++ b/phpseclib/Net/SFTP/Stream.php @@ -280,14 +280,17 @@ class Net_SFTP_Stream if ($this->size === false) { if ($this->mode[0] == 'r') { return false; + } else { + $this->sftp->touch($path); + $this->size = 0; } } else { switch ($this->mode[0]) { case 'x': return false; case 'w': - case 'c': $this->sftp->truncate($path, 0); + $this->size = 0; } } diff --git a/tests/Functional/Net/SFTPLargeFileTest.php b/tests/Functional/Net/SFTPLargeFileTest.php index 69a757da..1e85b1fa 100644 --- a/tests/Functional/Net/SFTPLargeFileTest.php +++ b/tests/Functional/Net/SFTPLargeFileTest.php @@ -8,11 +8,8 @@ require_once 'Crypt/Base.php'; -class Functional_Net_SFTPLargeFileTest extends PhpseclibFunctionalTestCase +class Functional_Net_SFTPLargeFileTest extends Functional_Net_SFTPTestCase { - protected $sftp; - protected $scratchDir; - static public function setUpBeforeClass() { if (!extension_loaded('mcrypt') && !extension_loaded('openssl')) { @@ -21,28 +18,6 @@ class Functional_Net_SFTPLargeFileTest extends PhpseclibFunctionalTestCase parent::setUpBeforeClass(); } - public function setUp() - { - $this->scratchDir = uniqid('phpseclib-sftp-large-scratch-'); - - $this->sftp = new Net_SFTP($this->getEnv('SSH_HOSTNAME')); - $this->assertTrue($this->sftp->login( - $this->getEnv('SSH_USERNAME'), - $this->getEnv('SSH_PASSWORD') - )); - $this->assertTrue($this->sftp->mkdir($this->scratchDir)); - $this->assertTrue($this->sftp->chdir($this->scratchDir)); - } - - public function tearDown() - { - if ($this->sftp) { - $this->sftp->chdir($this->getEnv('SSH_HOME')); - $this->sftp->delete($this->scratchDir); - } - parent::tearDown(); - } - /** * @group github298 * @group github455 diff --git a/tests/Functional/Net/SFTPStreamTest.php b/tests/Functional/Net/SFTPStreamTest.php new file mode 100644 index 00000000..6d731449 --- /dev/null +++ b/tests/Functional/Net/SFTPStreamTest.php @@ -0,0 +1,33 @@ + + * @copyright 2015 Andreas Fischer + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ + +// Registers sftp:// as a side effect. +require_once 'Net/SFTP/Stream.php'; + +class Functional_Net_SFTPStreamTest extends Functional_Net_SFTPTestCase +{ + public function testFopenFcloseCreatesFile() + { + $context = stream_context_create(array( + 'sftp' => array('session' => $this->sftp), + )); + $fp = fopen($this->buildUrl('fooo.txt'), 'wb', false, $context); + $this->assertTrue(is_resource($fp)); + fclose($fp); + $this->assertSame(0, $this->sftp->size('fooo.txt')); + } + + protected function buildUrl($suffix) + { + return sprintf( + 'sftp://via-context/%s/%s', + $this->sftp->pwd(), + $suffix + ); + } +} diff --git a/tests/Functional/Net/SFTPTestCase.php b/tests/Functional/Net/SFTPTestCase.php new file mode 100644 index 00000000..080e4f8f --- /dev/null +++ b/tests/Functional/Net/SFTPTestCase.php @@ -0,0 +1,39 @@ + + * @copyright 2015 Andreas Fischer + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ + +/** + * This class provides each test method with a new and empty $this->scratchDir. + */ +abstract class Functional_Net_SFTPTestCase extends PhpseclibFunctionalTestCase +{ + protected $sftp; + protected $scratchDir; + + public function setUp() + { + parent::setUp(); + $this->scratchDir = uniqid('phpseclib-sftp-scratch-'); + + $this->sftp = new Net_SFTP($this->getEnv('SSH_HOSTNAME')); + $this->assertTrue($this->sftp->login( + $this->getEnv('SSH_USERNAME'), + $this->getEnv('SSH_PASSWORD') + )); + $this->assertTrue($this->sftp->mkdir($this->scratchDir)); + $this->assertTrue($this->sftp->chdir($this->scratchDir)); + } + + public function tearDown() + { + if ($this->sftp) { + $this->sftp->chdir($this->getEnv('SSH_HOME')); + $this->sftp->delete($this->scratchDir); + } + parent::tearDown(); + } +}