From 9487e3a9e7ce81eaa365bfd49f81d450f79ab8f3 Mon Sep 17 00:00:00 2001 From: Francis Besset Date: Wed, 24 Jul 2013 23:18:41 +0200 Subject: [PATCH 1/3] Fixed tests which require a webserver --- composer.json | 4 +- phpunit.xml.dist | 4 + src/BeSimple/SoapBundle/composer.json | 4 +- .../Tests/AbstractWebserverTest.php | 55 +++ src/BeSimple/SoapClient/Tests/CurlTest.php | 120 +----- .../SoapClient/Tests/WsdlDownloaderTest.php | 383 +++++++++--------- src/BeSimple/SoapClient/WsdlDownloader.php | 134 +++--- src/BeSimple/SoapClient/composer.json | 4 + src/BeSimple/SoapClient/phpunit.xml.dist | 5 + src/BeSimple/SoapCommon/composer.json | 1 + 10 files changed, 352 insertions(+), 362 deletions(-) create mode 100644 src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php diff --git a/composer.json b/composer.json index 6ae1be8..4c196ef 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,9 @@ "besimple/soap-server": "self.version" }, "require-dev": { - "mikey179/vfsStream": "dev-master" + "ext-mcrypt": "*", + "mikey179/vfsStream": "dev-master", + "symfony/process": ">=2.3,<2.4-dev" }, "autoload": { "psr-0": { "BeSimple\\": "src/" } diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 09ecd8f..eaf287b 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -12,6 +12,10 @@ bootstrap="vendor/autoload.php" > + + + + ./src/BeSimple/*/Tests/ diff --git a/src/BeSimple/SoapBundle/composer.json b/src/BeSimple/SoapBundle/composer.json index 6dd3701..3f973dd 100644 --- a/src/BeSimple/SoapBundle/composer.json +++ b/src/BeSimple/SoapBundle/composer.json @@ -24,9 +24,9 @@ "ext-soap": "*", "besimple/soap-common": "self.version", "ass/xmlsecurity": "dev-master", - "zendframework/zend-soap": "2.1.*", - "zendframework/zend-mime": "2.1.*", "zendframework/zend-mail": "2.1.*", + "zendframework/zend-mime": "2.1.*", + "zendframework/zend-soap": "2.1.*", "symfony/http-foundation": ">=2.0,<2.4-dev" }, "suggest": { diff --git a/src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php b/src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php new file mode 100644 index 0000000..54e5be4 --- /dev/null +++ b/src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php @@ -0,0 +1,55 @@ + + * (c) Francis Besset + * + * This source file is subject to the MIT license that is bundled + * with this source code in the file LICENSE. + */ + +namespace BeSimple\SoapClient\Tests; + +use Symfony\Component\Process\PhpExecutableFinder; +use Symfony\Component\Process\ProcessBuilder; + +/** + * @author francis.besset@gmail.com + */ +abstract class AbstractWebServerTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ProcessBuilder + */ + static protected $webserver; + static protected $websererPortLength; + + public static function setUpBeforeClass() + { + if (version_compare(PHP_VERSION, '5.4.0', '<')) { + self::markTestSkipped('PHP Webserver is available from PHP 5.4'); + } + + self::$webserver = ProcessBuilder::create(array( + 'exec', // used exec binary (https://github.com/symfony/symfony/issues/5759) + (new PhpExecutableFinder())->find(), + '-S', + sprintf('localhost:%d', WEBSERVER_PORT), + '-t', + __DIR__.DIRECTORY_SEPARATOR.'Fixtures', + ))->getProcess(); + + self::$webserver->start(); + usleep(100000); + + self::$websererPortLength = strlen(WEBSERVER_PORT); + } + + public static function tearDownAfterClass() + { + self::$webserver->stop(0); + usleep(100000); + } +} diff --git a/src/BeSimple/SoapClient/Tests/CurlTest.php b/src/BeSimple/SoapClient/Tests/CurlTest.php index f8fc24b..a7e8541 100644 --- a/src/BeSimple/SoapClient/Tests/CurlTest.php +++ b/src/BeSimple/SoapClient/Tests/CurlTest.php @@ -17,167 +17,91 @@ use BeSimple\SoapClient\Curl; /** * @author Andreas Schamberger */ -class CurlTest extends \PHPUnit_Framework_TestCase +class CurlTest extends AbstractWebserverTest { - protected $webserverProcessId; - - protected function startPhpWebserver() - { - $this->markTestSkipped('Start a local webserver is not the best practice'); - - $dir = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'; - if ('Windows' == substr(php_uname('s'), 0, 7)) { - $powershellCommand = "\$app = start-process php.exe -ArgumentList '-S localhost:8000 -t ".$dir."' -WindowStyle 'Hidden' -passthru; Echo \$app.Id;"; - $shellCommand = 'powershell -command "& {'.$powershellCommand.'}"'; - } else { - $shellCommand = "nohup php -S localhost:8000 -t ".$dir." &"; - } - $output = array(); - exec($shellCommand, $output); - $this->webserverProcessId = $output[0]; // pid is in first element - } - - protected function stopPhpWebserver() - { - if (!is_null($this->webserverProcessId)) { - if ('Windows' == substr(php_uname('s'), 0, 7 )) { - exec('TASKKILL /F /PID ' . $this->webserverProcessId); - } else { - exec('kill ' . $this->webserverProcessId); - } - $this->webserverProcessId = null; - } - } - public function testExec() { - $this->startPhpWebserver(); - $curl = new Curl(); - $this->assertTrue($curl->exec('http://localhost:8000/curl.txt')); - $this->assertTrue($curl->exec('http://localhost:8000/404.txt')); - - $this->stopPhpWebserver(); + $this->assertTrue($curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT))); + $this->assertTrue($curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT))); } public function testGetErrorMessage() { - $this->startPhpWebserver(); - $curl = new Curl(); $curl->exec('http://unknown/curl.txt'); $this->assertEquals('Could not connect to host', $curl->getErrorMessage()); - $curl->exec('xyz://localhost:8000/@404.txt'); + $curl->exec(sprintf('xyz://localhost:%d/@404.txt', WEBSERVER_PORT)); $this->assertEquals('Unknown protocol. Only http and https are allowed.', $curl->getErrorMessage()); $curl->exec(''); $this->assertEquals('Unable to parse URL', $curl->getErrorMessage()); - - $this->stopPhpWebserver(); } public function testGetRequestHeaders() { - $this->startPhpWebserver(); - $curl = new Curl(); - $curl->exec('http://localhost:8000/curl.txt'); - $this->assertEquals(136, strlen($curl->getRequestHeaders())); + $curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT)); + $this->assertEquals(132 + self::$websererPortLength, strlen($curl->getRequestHeaders())); - $curl->exec('http://localhost:8000/404.txt'); - $this->assertEquals(135, strlen($curl->getRequestHeaders())); - - $this->stopPhpWebserver(); + $curl->exec(sprintf('http://localhost:%s/404.txt', WEBSERVER_PORT)); + $this->assertEquals(131 + self::$websererPortLength, strlen($curl->getRequestHeaders())); } public function testGetResponse() { - $this->startPhpWebserver(); - $curl = new Curl(); - $curl->exec('http://localhost:8000/curl.txt'); - $this->assertEquals(150, strlen($curl->getResponse())); + $curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT)); + $this->assertSame('OK', $curl->getResponseStatusMessage()); + $this->assertEquals(145 + self::$websererPortLength, strlen($curl->getResponse())); - $curl->exec('http://localhost:8000/404.txt'); - $this->assertEquals(1282, strlen($curl->getResponse())); - - $this->stopPhpWebserver(); + $curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT)); + $this->assertSame('Not Found', $curl->getResponseStatusMessage()); } public function testGetResponseBody() { - $this->startPhpWebserver(); - $curl = new Curl(); - $curl->exec('http://localhost:8000/curl.txt'); + $curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT)); $this->assertEquals('This is a testfile for cURL.', $curl->getResponseBody()); - - $this->stopPhpWebserver(); } public function testGetResponseContentType() { - $this->startPhpWebserver(); - $curl = new Curl(); - $curl->exec('http://localhost:8000/curl.txt'); + $curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT)); $this->assertEquals('text/plain; charset=UTF-8', $curl->getResponseContentType()); - $curl->exec('http://localhost:8000/404.txt'); + $curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT)); $this->assertEquals('text/html; charset=UTF-8', $curl->getResponseContentType()); - - $this->stopPhpWebserver(); } public function testGetResponseHeaders() { - $this->startPhpWebserver(); - $curl = new Curl(); - $curl->exec('http://localhost:8000/curl.txt'); - $this->assertEquals(122, strlen($curl->getResponseHeaders())); + $curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT)); + $this->assertEquals(117 + self::$websererPortLength, strlen($curl->getResponseHeaders())); - $curl->exec('http://localhost:8000/404.txt'); - $this->assertEquals(130, strlen($curl->getResponseHeaders())); - - $this->stopPhpWebserver(); + $curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT)); + $this->assertEquals(124 + self::$websererPortLength, strlen($curl->getResponseHeaders())); } public function testGetResponseStatusCode() { - $this->startPhpWebserver(); - $curl = new Curl(); - $curl->exec('http://localhost:8000/curl.txt'); + $curl->exec(sprintf('http://localhost:%d/curl.txt', WEBSERVER_PORT)); $this->assertEquals(200, $curl->getResponseStatusCode()); - $curl->exec('http://localhost:8000/404.txt'); + $curl->exec(sprintf('http://localhost:%d/404.txt', WEBSERVER_PORT)); $this->assertEquals(404, $curl->getResponseStatusCode()); - - $this->stopPhpWebserver(); - } - - public function testGetResponseStatusMessage() - { - $this->startPhpWebserver(); - - $curl = new Curl(); - - $curl->exec('http://localhost:8000/curl.txt'); - $this->assertEquals('OK', $curl->getResponseStatusMessage()); - - $curl->exec('http://localhost:8000/404.txt'); - $this->assertEquals('Not Found', $curl->getResponseStatusMessage()); - - $this->stopPhpWebserver(); } } diff --git a/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php b/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php index 8f3825f..f42e2e7 100644 --- a/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php +++ b/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php @@ -13,256 +13,245 @@ namespace BeSimple\SoapClient\Tests; use BeSimple\SoapClient\WsdlDownloader; +use BeSimple\SoapCommon\Cache; use BeSimple\SoapClient\Curl; +use org\bovigo\vfs\vfsStream; +use org\bovigo\vfs\vfsStreamWrapper; /** * @author Andreas Schamberger + * @author Francis Besset */ -class WsdlDownloaderTest extends \PHPUnit_Framework_TestCase +class WsdlDownloaderTest extends AbstractWebserverTest { - protected $webserverProcessId; - - protected function startPhpWebserver() + /** + * @dataProvider provideDownload + */ + public function testDownload($source, $regexp, $nbDownloads) { - $this->markTestSkipped('Start a local webserver is not the best practice'); + $wsdlCacheDir = vfsStream::setup('wsdl'); + $wsdlCacheUrl = $wsdlCacheDir->url('wsdl'); - $dir = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'; - if ('Windows' == substr(php_uname('s'), 0, 7)) { - $powershellCommand = "\$app = start-process php.exe -ArgumentList '-S localhost:8000 -t ".$dir."' -WindowStyle 'Hidden' -passthru; Echo \$app.Id;"; - $shellCommand = 'powershell -command "& {'.$powershellCommand.'}"'; - } else { - $shellCommand = "nohup php -S localhost:8000 -t ".$dir." &"; - } - $output = array(); - exec($shellCommand, $output); - $this->webserverProcessId = $output[0]; // pid is in first element + Cache::setEnabled(Cache::ENABLED); + Cache::setDirectory($wsdlCacheUrl); + $cacheDirForRegExp = preg_quote($wsdlCacheUrl, '#'); + + $wsdlDownloader = new WsdlDownloader(new Curl()); + $this->assertCount(0, $wsdlCacheDir->getChildren()); + + $cacheFileName = $wsdlDownloader->download($source); + $this->assertCount($nbDownloads, $wsdlCacheDir->getChildren()); + + $this->assertRegExp('#'.sprintf($regexp, $cacheDirForRegExp).'#', file_get_contents($cacheFileName)); } - protected function stopPhpWebserver() + public function provideDownload() { - if (!is_null($this->webserverProcessId)) { - if ('Windows' == substr(php_uname('s'), 0, 7)) { - exec('TASKKILL /F /PID ' . $this->webserverProcessId); - } else { - exec('kill ' . $this->webserverProcessId); - } - $this->webserverProcessId = null; - } - } - - public function testDownload() - { - $this->startPhpWebserver(); - - $curl = new Curl(); - $wd = new WsdlDownloader($curl); - - $cacheDir = ini_get('soap.wsdl_cache_dir'); - if (!is_dir($cacheDir)) { - $cacheDir = sys_get_temp_dir(); - $cacheDirForRegExp = preg_quote($cacheDir); - } - - $tests = array( - 'localWithAbsolutePath' => array( - 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_absolute.xml', - 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~', + return array( + array( + __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_absolute.xml', + '%s/wsdl_[a-f0-9]{32}\.cache', + 2, ), - 'localWithRelativePath' => array( - 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_relative.xml', - 'assertRegExp' => '~.*\.\./type_include\.xsd.*~', + array( + __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_relative.xml', + '\.\./type_include\.xsd', + 1, ), - 'remoteWithAbsolutePath' => array( - 'source' => 'http://localhost:8000/xsdinclude/xsdinctest_absolute.xml', - 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~', + array( + sprintf('http://localhost:%d/xsdinclude/xsdinctest_absolute.xml', WEBSERVER_PORT), + '%s/wsdl_[a-f0-9]{32}\.cache', + 2, ), - 'remoteWithAbsolutePath' => array( - 'source' => 'http://localhost:8000/xsdinclude/xsdinctest_relative.xml', - 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~', + array( + sprintf('http://localhost:%d/xsdinclude/xsdinctest_relative.xml', WEBSERVER_PORT), + '%s/wsdl_[a-f0-9]{32}\.cache', + 2, ), ); - - foreach ($tests as $name => $values) { - $cacheFileName = $wd->download($values['source']); - $result = file_get_contents($cacheFileName); - $this->assertRegExp($values['assertRegExp'], $result, $name); - unlink($cacheFileName); - } - - $this->stopPhpWebserver(); } public function testIsRemoteFile() { - $curl = new Curl(); - $wd = new WsdlDownloader($curl); + $wsdlDownloader = new WsdlDownloader(new Curl()); - $class = new \ReflectionClass($wd); - $method = $class->getMethod('isRemoteFile'); - $method->setAccessible(true); + $r = new \ReflectionClass($wsdlDownloader); + $m = $r->getMethod('isRemoteFile'); + $m->setAccessible(true); - $this->assertTrue($method->invoke($wd, 'http://www.php.net/')); - $this->assertTrue($method->invoke($wd, 'http://localhost/')); - $this->assertTrue($method->invoke($wd, 'http://mylocaldomain/')); - $this->assertTrue($method->invoke($wd, 'http://www.php.net/dir/test.html')); - $this->assertTrue($method->invoke($wd, 'http://localhost/dir/test.html')); - $this->assertTrue($method->invoke($wd, 'http://mylocaldomain/dir/test.html')); - $this->assertTrue($method->invoke($wd, 'https://www.php.net/')); - $this->assertTrue($method->invoke($wd, 'https://localhost/')); - $this->assertTrue($method->invoke($wd, 'https://mylocaldomain/')); - $this->assertTrue($method->invoke($wd, 'https://www.php.net/dir/test.html')); - $this->assertTrue($method->invoke($wd, 'https://localhost/dir/test.html')); - $this->assertTrue($method->invoke($wd, 'https://mylocaldomain/dir/test.html')); - $this->assertFalse($method->invoke($wd, 'c:/dir/test.html')); - $this->assertFalse($method->invoke($wd, '/dir/test.html')); - $this->assertFalse($method->invoke($wd, '../dir/test.html')); + $this->assertTrue($m->invoke($wsdlDownloader, 'http://www.php.net/')); + $this->assertTrue($m->invoke($wsdlDownloader, 'http://localhost/')); + $this->assertTrue($m->invoke($wsdlDownloader, 'http://mylocaldomain/')); + $this->assertTrue($m->invoke($wsdlDownloader, 'http://www.php.net/dir/test.html')); + $this->assertTrue($m->invoke($wsdlDownloader, 'http://localhost/dir/test.html')); + $this->assertTrue($m->invoke($wsdlDownloader, 'http://mylocaldomain/dir/test.html')); + $this->assertTrue($m->invoke($wsdlDownloader, 'https://www.php.net/')); + $this->assertTrue($m->invoke($wsdlDownloader, 'https://localhost/')); + $this->assertTrue($m->invoke($wsdlDownloader, 'https://mylocaldomain/')); + $this->assertTrue($m->invoke($wsdlDownloader, 'https://www.php.net/dir/test.html')); + $this->assertTrue($m->invoke($wsdlDownloader, 'https://localhost/dir/test.html')); + $this->assertTrue($m->invoke($wsdlDownloader, 'https://mylocaldomain/dir/test.html')); + $this->assertFalse($m->invoke($wsdlDownloader, 'c:/dir/test.html')); + $this->assertFalse($m->invoke($wsdlDownloader, '/dir/test.html')); + $this->assertFalse($m->invoke($wsdlDownloader, '../dir/test.html')); } - public function testResolveWsdlIncludes() + /** + * @dataProvider provideResolveWsdlIncludes + */ + public function testResolveWsdlIncludes($source, $cacheFile, $remoteParentUrl, $regexp, $nbDownloads) { - $this->startPhpWebserver(); + $wsdlCacheDir = vfsStream::setup('wsdl'); + $wsdlCacheUrl = $wsdlCacheDir->url('wsdl'); - $curl = new Curl(); - $wd = new WsdlDownloader($curl); + Cache::setEnabled(Cache::ENABLED); + Cache::setDirectory($wsdlCacheUrl); + $cacheDirForRegExp = preg_quote($wsdlCacheUrl, '#'); - $class = new \ReflectionClass($wd); - $method = $class->getMethod('resolveRemoteIncludes'); - $method->setAccessible(true); + $wsdlDownloader = new WsdlDownloader(new Curl()); + $r = new \ReflectionClass($wsdlDownloader); + $m = $r->getMethod('resolveRemoteIncludes'); + $m->setAccessible(true); - $cacheDir = ini_get('soap.wsdl_cache_dir'); - if (!is_dir($cacheDir)) { - $cacheDir = sys_get_temp_dir(); - $cacheDirForRegExp = preg_quote($cacheDir); - } + $this->assertCount(0, $wsdlCacheDir->getChildren()); - $remoteUrlAbsolute = 'http://localhost:8000/wsdlinclude/wsdlinctest_absolute.xml'; - $remoteUrlRelative = 'http://localhost:8000/wsdlinclude/wsdlinctest_relative.xml'; - $tests = array( - 'localWithAbsolutePath' => array( - 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/wsdlinclude/wsdlinctest_absolute.xml', - 'cacheFile' => $cacheDir.'/cache_local_absolute.xml', - 'remoteParentUrl' => null, - 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~', - ), - 'localWithRelativePath' => array( - 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/wsdlinclude/wsdlinctest_relative.xml', - 'cacheFile' => $cacheDir.'/cache_local_relative.xml', - 'remoteParentUrl' => null, - 'assertRegExp' => '~.*\.\./wsdl_include\.wsdl.*~', - ), - 'remoteWithAbsolutePath' => array( - 'source' => $remoteUrlAbsolute, - 'cacheFile' => $cacheDir.'/cache_remote_absolute.xml', - 'remoteParentUrl' => $remoteUrlAbsolute, - 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~', - ), - 'remoteWithAbsolutePath' => array( - 'source' => $remoteUrlRelative, - 'cacheFile' => $cacheDir.'/cache_remote_relative.xml', - 'remoteParentUrl' => $remoteUrlRelative, - 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~', - ), - ); + $cacheFile = sprintf($cacheFile, $wsdlCacheUrl); + $m->invoke($wsdlDownloader, file_get_contents($source), $cacheFile, $remoteParentUrl); + $this->assertCount($nbDownloads, $wsdlCacheDir->getChildren()); - foreach ($tests as $name => $values) { - $wsdl = file_get_contents($values['source']); - $method->invoke($wd, $wsdl, $values['cacheFile'], $values['remoteParentUrl']); - $result = file_get_contents($values['cacheFile']); - $this->assertRegExp($values['assertRegExp'], $result, $name); - unlink($values['cacheFile']); - } - - $this->stopPhpWebserver(); + $this->assertRegExp('#'.sprintf($regexp, $cacheDirForRegExp).'#', file_get_contents($cacheFile)); } - public function testResolveXsdIncludes() + public function provideResolveWsdlIncludes() { - $this->startPhpWebserver(); + $remoteUrlAbsolute = sprintf('http://localhost:%d/wsdlinclude/wsdlinctest_absolute.xml', WEBSERVER_PORT); + $remoteUrlRelative = sprintf('http://localhost:%d/wsdlinclude/wsdlinctest_relative.xml', WEBSERVER_PORT); - $curl = new Curl(); - $wd = new WsdlDownloader($curl); - - $class = new \ReflectionClass($wd); - $method = $class->getMethod('resolveRemoteIncludes'); - $method->setAccessible(true); - - $cacheDir = ini_get('soap.wsdl_cache_dir'); - if (!is_dir($cacheDir)) { - $cacheDir = sys_get_temp_dir(); - $cacheDirForRegExp = preg_quote($cacheDir); - } - - $remoteUrlAbsolute = 'http://localhost:8000/xsdinclude/xsdinctest_absolute.xml'; - $remoteUrlRelative = 'http://localhost:8000/xsdinclude/xsdinctest_relative.xml'; - $tests = array( - 'localWithAbsolutePath' => array( - 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_absolute.xml', - 'cacheFile' => $cacheDir.'/cache_local_absolute.xml', - 'remoteParentUrl' => null, - 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~', + return array( + array( + __DIR__.DIRECTORY_SEPARATOR.'Fixtures/wsdlinclude/wsdlinctest_absolute.xml', + '%s/cache_local_absolute.xml', + null, + '%s/wsdl_[a-f0-9]{32}.cache', + 2, ), - 'localWithRelativePath' => array( - 'source' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_relative.xml', - 'cacheFile' => $cacheDir.'/cache_local_relative.xml', - 'remoteParentUrl' => null, - 'assertRegExp' => '~.*\.\./type_include\.xsd.*~', + array( + __DIR__.DIRECTORY_SEPARATOR.'Fixtures/wsdlinclude/wsdlinctest_relative.xml', + '%s/cache_local_relative.xml', + null, + '\.\./wsdl_include\.wsdl', + 1, ), - 'remoteWithAbsolutePath' => array( - 'source' => $remoteUrlAbsolute, - 'cacheFile' => $cacheDir.'/cache_remote_absolute.xml', - 'remoteParentUrl' => $remoteUrlAbsolute, - 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~', + array( + $remoteUrlAbsolute, + '%s/cache_remote_absolute.xml', + $remoteUrlAbsolute, + '%s/wsdl_[a-f0-9]{32}\.cache', + 2, ), - 'remoteWithAbsolutePath' => array( - 'source' => $remoteUrlRelative, - 'cacheFile' => $cacheDir.'/cache_remote_relative.xml', - 'remoteParentUrl' => $remoteUrlRelative, - 'assertRegExp' => '~.*'.$cacheDirForRegExp.'\\\wsdl_.*\.cache.*~', + array( + $remoteUrlRelative, + '%s/cache_remote_relative.xml', + $remoteUrlRelative, + '%s/wsdl_[a-f0-9]{32}\.cache', + 2 ), ); + } - foreach ($tests as $name => $values) { - $wsdl = file_get_contents($values['source']); - $method->invoke($wd, $wsdl, $values['cacheFile'], $values['remoteParentUrl']); - $result = file_get_contents($values['cacheFile']); - $this->assertRegExp($values['assertRegExp'], $result, $name); - unlink($values['cacheFile']); - } + /** + * @dataProvider provideResolveXsdIncludes + */ + public function testResolveXsdIncludes($source, $cacheFile, $remoteParentUrl, $regexp, $nbDownloads) + { + $wsdlCacheDir = vfsStream::setup('wsdl'); + $wsdlCacheUrl = $wsdlCacheDir->url('wsdl'); - $this->stopPhpWebserver(); + Cache::setEnabled(Cache::ENABLED); + Cache::setDirectory($wsdlCacheUrl); + $cacheDirForRegExp = preg_quote($wsdlCacheUrl, '#'); + + $wsdlDownloader = new WsdlDownloader(new Curl()); + $r = new \ReflectionClass($wsdlDownloader); + $m = $r->getMethod('resolveRemoteIncludes'); + $m->setAccessible(true); + + $this->assertCount(0, $wsdlCacheDir->getChildren()); + + $cacheFile = sprintf($cacheFile, $wsdlCacheUrl); + $m->invoke($wsdlDownloader, file_get_contents($source), $cacheFile, $remoteParentUrl); + $this->assertCount($nbDownloads, $wsdlCacheDir->getChildren()); + + $this->assertRegExp('#'.sprintf($regexp, $cacheDirForRegExp).'#', file_get_contents($cacheFile)); + } + + public function provideResolveXsdIncludes() + { + $remoteUrlAbsolute = sprintf('http://localhost:%d/xsdinclude/xsdinctest_absolute.xml', WEBSERVER_PORT); + $remoteUrlRelative = sprintf('http://localhost:%d/xsdinclude/xsdinctest_relative.xml', WEBSERVER_PORT); + + return array( + array( + __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_absolute.xml', + '%s/cache_local_absolute.xml', + null, + '%s/wsdl_[a-f0-9]{32}\.cache', + 2, + ), + array( + __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_relative.xml', + '%s/cache_local_relative.xml', + null, + '\.\./type_include\.xsd', + 1, + ), + array( + $remoteUrlAbsolute, + '%s/cache_remote_absolute.xml', + $remoteUrlAbsolute, + '%s/wsdl_[a-f0-9]{32}\.cache', + 2, + ), + array( + $remoteUrlRelative, + '%s/cache_remote_relative.xml', + $remoteUrlRelative, + '%s/wsdl_[a-f0-9]{32}\.cache', + 2, + ), + ); } public function testResolveRelativePathInUrl() { - $curl = new Curl(); - $wd = new WsdlDownloader($curl); + $wsdlDownloader = new WsdlDownloader(new Curl()); - $class = new \ReflectionClass($wd); - $method = $class->getMethod('resolveRelativePathInUrl'); - $method->setAccessible(true); + $r = new \ReflectionClass($wsdlDownloader); + $m = $r->getMethod('resolveRelativePathInUrl'); + $m->setAccessible(true); - $this->assertEquals('http://localhost:8080/test', $method->invoke($wd, 'http://localhost:8080/sub', '/test')); - $this->assertEquals('http://localhost:8080/test', $method->invoke($wd, 'http://localhost:8080/sub/', '/test')); + $this->assertEquals('http://localhost:8080/test', $m->invoke($wsdlDownloader, 'http://localhost:8080/sub', '/test')); + $this->assertEquals('http://localhost:8080/test', $m->invoke($wsdlDownloader, 'http://localhost:8080/sub/', '/test')); - $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub', '/test')); - $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/', '/test')); + $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub', '/test')); + $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/', '/test')); - $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost', './test')); - $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/', './test')); + $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost', './test')); + $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/', './test')); - $this->assertEquals('http://localhost/sub/test', $method->invoke($wd, 'http://localhost/sub/sub', './test')); - $this->assertEquals('http://localhost/sub/sub/test', $method->invoke($wd, 'http://localhost/sub/sub/', './test')); + $this->assertEquals('http://localhost/sub/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub', './test')); + $this->assertEquals('http://localhost/sub/sub/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/', './test')); - $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/sub', '../test')); - $this->assertEquals('http://localhost/sub/test', $method->invoke($wd, 'http://localhost/sub/sub/', '../test')); + $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub', '../test')); + $this->assertEquals('http://localhost/sub/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/', '../test')); - $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/sub/sub', '../../test')); - $this->assertEquals('http://localhost/sub/test', $method->invoke($wd, 'http://localhost/sub/sub/sub/', '../../test')); + $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub', '../../test')); + $this->assertEquals('http://localhost/sub/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub/', '../../test')); - $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/sub/sub/sub', '../../../test')); - $this->assertEquals('http://localhost/sub/test', $method->invoke($wd, 'http://localhost/sub/sub/sub/sub/', '../../../test')); + $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub/sub', '../../../test')); + $this->assertEquals('http://localhost/sub/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub/sub/', '../../../test')); - $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/sub/sub', '../../../test')); - $this->assertEquals('http://localhost/test', $method->invoke($wd, 'http://localhost/sub/sub/sub/', '../../../test')); + $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub', '../../../test')); + $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub/', '../../../test')); } } diff --git a/src/BeSimple/SoapClient/WsdlDownloader.php b/src/BeSimple/SoapClient/WsdlDownloader.php index 9f62fe4..6e403ce 100644 --- a/src/BeSimple/SoapClient/WsdlDownloader.php +++ b/src/BeSimple/SoapClient/WsdlDownloader.php @@ -12,6 +12,7 @@ namespace BeSimple\SoapClient; +use BeSimple\SoapCommon\Cache; use BeSimple\SoapCommon\Helper; /** @@ -66,22 +67,18 @@ class WsdlDownloader * @param boolean $resolveRemoteIncludes WSDL/XSD include enabled? * @param boolean $cacheWsdl Cache constant */ - public function __construct(Curl $curl, $resolveRemoteIncludes = true, $cacheWsdl = WSDL_CACHE_DISK) + public function __construct(Curl $curl, $resolveRemoteIncludes = true, $cacheWsdl = Cache::TYPE_DISK) { - $this->curl = $curl; - $this->resolveRemoteIncludes = $resolveRemoteIncludes; + $this->curl = $curl; + $this->resolveRemoteIncludes = (Boolean) $resolveRemoteIncludes; + // get current WSDL caching config - $this->cacheEnabled = (bool) ini_get('soap.wsdl_cache_enabled'); - if ($this->cacheEnabled === true - && $cacheWsdl === WSDL_CACHE_NONE) { - $this->cacheEnabled = false; + $this->cacheEnabled = $cacheWsdl === Cache::TYPE_NONE ? Cache::DISABLED : Cache::ENABLED == Cache::isEnabled(); + + if ($this->cacheEnabled) { + $this->cacheDir = Cache::getDirectory(); + $this->cacheTtl = Cache::getLifetime(); } - $this->cacheDir = ini_get('soap.wsdl_cache_dir'); - if (!is_dir($this->cacheDir)) { - $this->cacheDir = sys_get_temp_dir(); - } - $this->cacheDir = rtrim($this->cacheDir, '/\\'); - $this->cacheTtl = ini_get('soap.wsdl_cache_ttl'); } /** @@ -96,40 +93,39 @@ class WsdlDownloader // download and cache remote WSDL files or local ones where we want to // resolve remote XSD includes $isRemoteFile = $this->isRemoteFile($wsdl); - if ($isRemoteFile === true || $this->resolveRemoteIncludes === true) { - $cacheFile = $this->cacheDir . DIRECTORY_SEPARATOR . 'wsdl_' . md5($wsdl) . '.cache'; - if ($this->cacheEnabled === false - || !file_exists($cacheFile) - || (filemtime($cacheFile) + $this->cacheTtl) < time()) { - if ($isRemoteFile === true) { + if ($isRemoteFile || $this->resolveRemoteIncludes) { + $cacheFilePath = $this->cacheDir.DIRECTORY_SEPARATOR.'wsdl_'.md5($wsdl).'.cache'; + + if (!$this->cacheEnabled || !file_exists($cacheFilePath) || (filemtime($cacheFilePath) + $this->cacheTtl) < time()) { + if ($isRemoteFile) { // execute request $responseSuccessfull = $this->curl->exec($wsdl); // get content - if ($responseSuccessfull === true) { + if ($responseSuccessfull) { $response = $this->curl->getResponseBody(); - if ($this->resolveRemoteIncludes === true) { - $this->resolveRemoteIncludes($response, $cacheFile, $wsdl); + + if ($this->resolveRemoteIncludes) { + $this->resolveRemoteIncludes($response, $cacheFilePath, $wsdl); } else { - file_put_contents($cacheFile, $response); + file_put_contents($cacheFilePath, $response); } } else { throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl ."'"); } } elseif (file_exists($wsdl)) { $response = file_get_contents($wsdl); - $this->resolveRemoteIncludes($response, $cacheFile); + $this->resolveRemoteIncludes($response, $cacheFilePath); } else { throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl ."'"); } } - return $cacheFile; + return $cacheFilePath; } elseif (file_exists($wsdl)) { - return realpath($wsdl); - } else { - throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl ."'"); } + + throw new \ErrorException("SOAP-ERROR: Parsing WSDL: Couldn't load from '" . $wsdl ."'"); } /** @@ -141,35 +137,36 @@ class WsdlDownloader */ private function isRemoteFile($file) { - $isRemoteFile = false; // @parse_url to suppress E_WARNING for invalid urls - if (($url = @parse_url($file)) !== false) { - if (isset($url['scheme']) && substr($url['scheme'], 0, 4) == 'http') { - $isRemoteFile = true; + if (false !== $url = @parse_url($file)) { + if (isset($url['scheme']) && 'http' === substr($url['scheme'], 0, 4)) { + return true; } } - return $isRemoteFile; + return false; } /** * Resolves remote WSDL/XSD includes within the WSDL files. * - * @param string $xml XML file - * @param string $cacheFile Cache file name - * @param boolean $parentFile Parent file name + * @param string $xml XML file + * @param string $cacheFilePath Cache file name + * @param boolean $parentFilePath Parent file name * * @return void */ - private function resolveRemoteIncludes($xml, $cacheFile, $parentFile = null) + private function resolveRemoteIncludes($xml, $cacheFilePath, $parentFilePath = null) { $doc = new \DOMDocument(); $doc->loadXML($xml); + $xpath = new \DOMXPath($doc); $xpath->registerNamespace(Helper::PFX_XML_SCHEMA, Helper::NS_XML_SCHEMA); $xpath->registerNamespace(Helper::PFX_WSDL, Helper::NS_WSDL); + // WSDL include/import - $query = './/' . Helper::PFX_WSDL . ':include | .//' . Helper::PFX_WSDL . ':import'; + $query = './/'.Helper::PFX_WSDL.':include | .//'.Helper::PFX_WSDL.':import'; $nodes = $xpath->query($query); if ($nodes->length > 0) { foreach ($nodes as $node) { @@ -177,32 +174,34 @@ class WsdlDownloader if ($this->isRemoteFile($location)) { $location = $this->download($location); $node->setAttribute('location', $location); - } elseif (!is_null($parentFile)) { - $location = $this->resolveRelativePathInUrl($parentFile, $location); + } elseif (null !== $parentFilePath) { + $location = $this->resolveRelativePathInUrl($parentFilePath, $location); $location = $this->download($location); $node->setAttribute('location', $location); } } } + // XML schema include/import - $query = './/' . Helper::PFX_XML_SCHEMA . ':include | .//' . Helper::PFX_XML_SCHEMA . ':import'; + $query = './/'.Helper::PFX_XML_SCHEMA.':include | .//'.Helper::PFX_XML_SCHEMA.':import'; $nodes = $xpath->query($query); if ($nodes->length > 0) { foreach ($nodes as $node) { if ($node->hasAttribute('schemaLocation')) { - $schemaLocation = $node->getAttribute('schemaLocation'); - if ($this->isRemoteFile($schemaLocation)) { - $schemaLocation = $this->download($schemaLocation); - $node->setAttribute('schemaLocation', $schemaLocation); - } elseif (null !== $parentFile) { - $schemaLocation = $this->resolveRelativePathInUrl($parentFile, $schemaLocation); - $schemaLocation = $this->download($schemaLocation); - $node->setAttribute('schemaLocation', $schemaLocation); + $schemaLocation = $node->getAttribute('schemaLocation'); + if ($this->isRemoteFile($schemaLocation)) { + $schemaLocation = $this->download($schemaLocation); + $node->setAttribute('schemaLocation', $schemaLocation); + } elseif (null !== $parentFilePath) { + $schemaLocation = $this->resolveRelativePathInUrl($parentFilePath, $schemaLocation); + $schemaLocation = $this->download($schemaLocation); + $node->setAttribute('schemaLocation', $schemaLocation); } } } } - $doc->save($cacheFile); + + $doc->save($cacheFilePath); } /** @@ -216,46 +215,53 @@ class WsdlDownloader private function resolveRelativePathInUrl($base, $relative) { $urlParts = parse_url($base); + // combine base path with relative path - if (isset($urlParts['path']) && strpos($relative, '/') === 0) { + if (isset($urlParts['path']) && '/' === $relative{0}) { // $relative is absolute path from domain (starts with /) $path = $relative; } elseif (isset($urlParts['path']) && strrpos($urlParts['path'], '/') === (strlen($urlParts['path']) )) { // base path is directory - $path = $urlParts['path'] . $relative; + $path = $urlParts['path'].$relative; } elseif (isset($urlParts['path'])) { // strip filename from base path - $path = substr($urlParts['path'], 0, strrpos($urlParts['path'], '/')) . '/' . $relative; + $path = substr($urlParts['path'], 0, strrpos($urlParts['path'], '/')).'/'.$relative; } else { // no base path - $path = '/' . $relative; + $path = '/'.$relative; } + // foo/./bar ==> foo/bar - $path = preg_replace('~/\./~', '/', $path); // remove double slashes - $path = preg_replace('~/+~', '/', $path); + $path = preg_replace(array('#/\./#', '#/+#'), '/', $path); + // split path by '/' $parts = explode('/', $path); + // resolve /../ foreach ($parts as $key => $part) { - if ($part == "..") { - $keyToDelete = $key-1; + if ('..' === $part) { + $keyToDelete = $key - 1; + while ($keyToDelete > 0) { if (isset($parts[$keyToDelete])) { unset($parts[$keyToDelete]); + break; - } else { - $keyToDelete--; } + + $keyToDelete--; } + unset($parts[$key]); } } - $hostname = $urlParts['scheme'] . '://' . $urlParts['host']; + + $hostname = $urlParts['scheme'].'://'.$urlParts['host']; if (isset($urlParts['port'])) { - $hostname .= ':' . $urlParts['port']; + $hostname .= ':'.$urlParts['port']; } - return $hostname . implode('/', $parts); + return $hostname.implode('/', $parts); } -} \ No newline at end of file +} diff --git a/src/BeSimple/SoapClient/composer.json b/src/BeSimple/SoapClient/composer.json index 8cf7483..352d888 100644 --- a/src/BeSimple/SoapClient/composer.json +++ b/src/BeSimple/SoapClient/composer.json @@ -26,6 +26,10 @@ "besimple/soap-common": "self.version", "ass/xmlsecurity": "dev-master" }, + "require-dev": { + "mikey179/vfsStream": "dev-master", + "symfony/process": ">=2.3,<2.4-dev" + }, "autoload": { "psr-0": { "BeSimple\\SoapClient": "" } }, diff --git a/src/BeSimple/SoapClient/phpunit.xml.dist b/src/BeSimple/SoapClient/phpunit.xml.dist index 13bd743..e223604 100644 --- a/src/BeSimple/SoapClient/phpunit.xml.dist +++ b/src/BeSimple/SoapClient/phpunit.xml.dist @@ -11,6 +11,11 @@ syntaxCheck="false" bootstrap="vendor/autoload.php" > + + + + + ./Tests/ diff --git a/src/BeSimple/SoapCommon/composer.json b/src/BeSimple/SoapCommon/composer.json index a3962af..04f3bc2 100644 --- a/src/BeSimple/SoapCommon/composer.json +++ b/src/BeSimple/SoapCommon/composer.json @@ -25,6 +25,7 @@ "ass/xmlsecurity": "dev-master" }, "require-dev": { + "ext-mcrypt": "*", "mikey179/vfsStream": "dev-master" }, "autoload": { From fe4e821ff51ab8a69280438d9187a2407fbb40a3 Mon Sep 17 00:00:00 2001 From: Francis Besset Date: Wed, 24 Jul 2013 23:44:50 +0200 Subject: [PATCH 2/3] Fixed syntax for PHP 5.3 --- src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php b/src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php index 54e5be4..a7bc6d4 100644 --- a/src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php +++ b/src/BeSimple/SoapClient/Tests/AbstractWebserverTest.php @@ -32,9 +32,10 @@ abstract class AbstractWebServerTest extends \PHPUnit_Framework_TestCase self::markTestSkipped('PHP Webserver is available from PHP 5.4'); } + $phpFinder = new PhpExecutableFinder(); self::$webserver = ProcessBuilder::create(array( 'exec', // used exec binary (https://github.com/symfony/symfony/issues/5759) - (new PhpExecutableFinder())->find(), + $phpFinder->find(), '-S', sprintf('localhost:%d', WEBSERVER_PORT), '-t', From 0c5d2c54ab439af0112e126de4fe3fcf0c6a7271 Mon Sep 17 00:00:00 2001 From: Francis Besset Date: Thu, 25 Jul 2013 09:29:22 +0200 Subject: [PATCH 3/3] Fixed tests --- composer.json | 1 + src/BeSimple/SoapClient/.gitignore | 1 + .../wsdlinclude/wsdlinctest_absolute.xml | 2 +- .../xsdinclude/xsdinctest_absolute.xml | 2 +- .../SoapClient/Tests/WsdlDownloaderTest.php | 40 ++++++++++++++++--- src/BeSimple/SoapClient/composer.json | 1 + 6 files changed, 39 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 4c196ef..546d544 100644 --- a/composer.json +++ b/composer.json @@ -38,6 +38,7 @@ "require-dev": { "ext-mcrypt": "*", "mikey179/vfsStream": "dev-master", + "symfony/filesystem": ">=2.3,<2.4-dev", "symfony/process": ">=2.3,<2.4-dev" }, "autoload": { diff --git a/src/BeSimple/SoapClient/.gitignore b/src/BeSimple/SoapClient/.gitignore index c49a5d8..db0e5ff 100644 --- a/src/BeSimple/SoapClient/.gitignore +++ b/src/BeSimple/SoapClient/.gitignore @@ -1,3 +1,4 @@ vendor/ composer.lock phpunit.xml +Tests/Fixtures/build_include/ diff --git a/src/BeSimple/SoapClient/Tests/Fixtures/wsdlinclude/wsdlinctest_absolute.xml b/src/BeSimple/SoapClient/Tests/Fixtures/wsdlinclude/wsdlinctest_absolute.xml index dae033e..2f59ba1 100644 --- a/src/BeSimple/SoapClient/Tests/Fixtures/wsdlinclude/wsdlinctest_absolute.xml +++ b/src/BeSimple/SoapClient/Tests/Fixtures/wsdlinclude/wsdlinctest_absolute.xml @@ -1,5 +1,5 @@ wsdlincludetest - + diff --git a/src/BeSimple/SoapClient/Tests/Fixtures/xsdinclude/xsdinctest_absolute.xml b/src/BeSimple/SoapClient/Tests/Fixtures/xsdinclude/xsdinctest_absolute.xml index dc1b373..166e549 100644 --- a/src/BeSimple/SoapClient/Tests/Fixtures/xsdinclude/xsdinctest_absolute.xml +++ b/src/BeSimple/SoapClient/Tests/Fixtures/xsdinclude/xsdinctest_absolute.xml @@ -3,7 +3,7 @@ xsdinctest - + diff --git a/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php b/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php index f42e2e7..27f419e 100644 --- a/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php +++ b/src/BeSimple/SoapClient/Tests/WsdlDownloaderTest.php @@ -15,6 +15,7 @@ namespace BeSimple\SoapClient\Tests; use BeSimple\SoapClient\WsdlDownloader; use BeSimple\SoapCommon\Cache; use BeSimple\SoapClient\Curl; +use Symfony\Component\Filesystem\Filesystem; use org\bovigo\vfs\vfsStream; use org\bovigo\vfs\vfsStreamWrapper; @@ -24,6 +25,10 @@ use org\bovigo\vfs\vfsStreamWrapper; */ class WsdlDownloaderTest extends AbstractWebserverTest { + static protected $filesystem; + + static protected $fixturesPath; + /** * @dataProvider provideDownload */ @@ -49,7 +54,7 @@ class WsdlDownloaderTest extends AbstractWebserverTest { return array( array( - __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_absolute.xml', + __DIR__.DIRECTORY_SEPARATOR.'Fixtures/build_include/xsdinctest_absolute.xml', '%s/wsdl_[a-f0-9]{32}\.cache', 2, ), @@ -59,7 +64,7 @@ class WsdlDownloaderTest extends AbstractWebserverTest 1, ), array( - sprintf('http://localhost:%d/xsdinclude/xsdinctest_absolute.xml', WEBSERVER_PORT), + sprintf('http://localhost:%d/build_include/xsdinctest_absolute.xml', WEBSERVER_PORT), '%s/wsdl_[a-f0-9]{32}\.cache', 2, ), @@ -124,12 +129,12 @@ class WsdlDownloaderTest extends AbstractWebserverTest public function provideResolveWsdlIncludes() { - $remoteUrlAbsolute = sprintf('http://localhost:%d/wsdlinclude/wsdlinctest_absolute.xml', WEBSERVER_PORT); + $remoteUrlAbsolute = sprintf('http://localhost:%d/build_include/wsdlinctest_absolute.xml', WEBSERVER_PORT); $remoteUrlRelative = sprintf('http://localhost:%d/wsdlinclude/wsdlinctest_relative.xml', WEBSERVER_PORT); return array( array( - __DIR__.DIRECTORY_SEPARATOR.'Fixtures/wsdlinclude/wsdlinctest_absolute.xml', + __DIR__.DIRECTORY_SEPARATOR.'Fixtures/build_include/wsdlinctest_absolute.xml', '%s/cache_local_absolute.xml', null, '%s/wsdl_[a-f0-9]{32}.cache', @@ -187,12 +192,12 @@ class WsdlDownloaderTest extends AbstractWebserverTest public function provideResolveXsdIncludes() { - $remoteUrlAbsolute = sprintf('http://localhost:%d/xsdinclude/xsdinctest_absolute.xml', WEBSERVER_PORT); + $remoteUrlAbsolute = sprintf('http://localhost:%d/build_include/xsdinctest_absolute.xml', WEBSERVER_PORT); $remoteUrlRelative = sprintf('http://localhost:%d/xsdinclude/xsdinctest_relative.xml', WEBSERVER_PORT); return array( array( - __DIR__.DIRECTORY_SEPARATOR.'Fixtures/xsdinclude/xsdinctest_absolute.xml', + __DIR__.DIRECTORY_SEPARATOR.'Fixtures/build_include/xsdinctest_absolute.xml', '%s/cache_local_absolute.xml', null, '%s/wsdl_[a-f0-9]{32}\.cache', @@ -254,4 +259,27 @@ class WsdlDownloaderTest extends AbstractWebserverTest $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub', '../../../test')); $this->assertEquals('http://localhost/test', $m->invoke($wsdlDownloader, 'http://localhost/sub/sub/sub/', '../../../test')); } + + public static function setUpBeforeClass() + { + parent::setUpBeforeClass(); + + self::$filesystem = new Filesystem(); + self::$fixturesPath = __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR; + self::$filesystem->mkdir(self::$fixturesPath.'build_include'); + + foreach (array('wsdlinclude/wsdlinctest_absolute.xml', 'xsdinclude/xsdinctest_absolute.xml') as $file) { + $content = file_get_contents(self::$fixturesPath.$file); + $content = preg_replace('#'.preg_quote('%location%').'#', sprintf('localhost:%d', WEBSERVER_PORT), $content); + + self::$filesystem->dumpFile(self::$fixturesPath.'build_include'.DIRECTORY_SEPARATOR.pathinfo($file, PATHINFO_BASENAME), $content); + } + } + + public static function tearDownAfterClass() + { + parent::tearDownAfterClass(); + + self::$filesystem->remove(self::$fixturesPath.'build_include'); + } } diff --git a/src/BeSimple/SoapClient/composer.json b/src/BeSimple/SoapClient/composer.json index 352d888..3df0b70 100644 --- a/src/BeSimple/SoapClient/composer.json +++ b/src/BeSimple/SoapClient/composer.json @@ -28,6 +28,7 @@ }, "require-dev": { "mikey179/vfsStream": "dev-master", + "symfony/filesystem": ">=2.3,<2.4-dev", "symfony/process": ">=2.3,<2.4-dev" }, "autoload": {