From ca4bcc180e3d2885737e1d8e2e95ac3230976d46 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Thu, 21 Aug 2014 14:58:57 +0200 Subject: [PATCH] SFTP: Add test for put() from local file. --- tests/Functional/Net/SFTPLargeFileTest.php | 72 ++++++++++++++++++++++ tests/PhpseclibTestCase.php | 20 +++++- 2 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 tests/Functional/Net/SFTPLargeFileTest.php diff --git a/tests/Functional/Net/SFTPLargeFileTest.php b/tests/Functional/Net/SFTPLargeFileTest.php new file mode 100644 index 00000000..3b1128df --- /dev/null +++ b/tests/Functional/Net/SFTPLargeFileTest.php @@ -0,0 +1,72 @@ + + * @copyright 2014 Andreas Fischer + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ + +require_once 'Crypt/Base.php'; + +class Functional_Net_SFTPLargeFileTest extends PhpseclibFunctionalTestCase +{ + protected $sftp; + protected $scratchDir; + + static public function setUpBeforeClass() + { + if (!extension_loaded('mcrypt')) { + self::markTestSkipped('This test depends on mcrypt for performance.'); + } + parent::setUpBeforeClass(); + self::ensureConstant('CRYPT_AES_MODE', CRYPT_MODE_MCRYPT); + self::ensureConstant('CRYPT_BLOWFISH_MODE', CRYPT_MODE_MCRYPT); + self::ensureConstant('CRYPT_DES_MODE', CRYPT_MODE_MCRYPT); + self::ensureConstant('CRYPT_RC2_MODE', CRYPT_MODE_MCRYPT); + self::ensureConstant('CRYPT_RC4_MODE', CRYPT_MODE_MCRYPT); + self::ensureConstant('CRYPT_RIJNDAEL_MODE', CRYPT_MODE_MCRYPT); + self::ensureConstant('CRYPT_TWOFISH_MODE', CRYPT_MODE_MCRYPT); + } + + 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() + { + $this->sftp->chdir($this->getEnv('SSH_HOME')); + $this->sftp->delete($this->scratchDir); + parent::tearDown(); + } + + /** + * @group github298 + * @group github455 + * @group github457 + */ + public function testPutSizeLocalFile() + { + $tmp_filename = $this->createTempFile(128, 1024 * 1024); + $filename = 'file-large-from-local.txt'; + + $this->assertTrue( + $this->sftp->put($filename, $tmp_filename, NET_SFTP_LOCAL_FILE), + 'Failed asserting that local file could be successfully put().' + ); + + $this->assertSame( + 128 * 1024 * 1024, + $this->sftp->size($filename), + 'Failed asserting that uploaded local file has the expected length.' + ); + } +} diff --git a/tests/PhpseclibTestCase.php b/tests/PhpseclibTestCase.php index cca14f56..5cdfe04e 100644 --- a/tests/PhpseclibTestCase.php +++ b/tests/PhpseclibTestCase.php @@ -21,15 +21,29 @@ abstract class PhpseclibTestCase extends PHPUnit_Framework_TestCase /** * Creates a temporary file on the local filesystem and returns its path. - * All files created using this method will be deleted from the filesystem - * on tearDown(), i.e. after each test method was run. + * The $number_of_writes and $bytes_per_write parameters can be used to + * write $number_of_writes * $bytes_per_write times the character 'a' to the + * temporary file. All files created using this method will be deleted from + * the filesystem on tearDown(), i.e. after each test method was run. + * + * @param int $number_of_writes + * @param int $bytes_per_write * * @return string */ - protected function createTempFile() + protected function createTempFile($number_of_writes = 0, $bytes_per_write = 0) { $filename = tempnam(sys_get_temp_dir(), 'phpseclib-test-'); + $this->assertTrue(file_exists($filename)); $this->tempFilesToUnlinkOnTearDown[] = $filename; + if ($number_of_writes > 0 && $bytes_per_write > 0) { + $fp = fopen($filename, 'wb'); + for ($i = 0; $i < $number_of_writes; ++$i) { + fwrite($fp, str_repeat('a', $bytes_per_write)); + } + fclose($fp); + $this->assertSame($number_of_writes * $bytes_per_write, filesize($filename)); + } return $filename; }