public function newInstance() { $p = Runtime::getInstance()->getExecutable()->newInstance(array('-v')); $version = 'PHP ' . phpversion(); $this->assertEquals($version, $p->out->read(strlen($version))); $p->close(); }
/** * Issues a uses() command inside a new runtime for every class given * and returns a line indicating success or failure for each of them. * * @param string[] uses * @param string decl * @return var[] an array with three elements: exitcode, stdout and stderr contents */ protected function useAllOf($uses, $decl = '') { with($out = $err = '', $p = Runtime::getInstance()->newInstance(NULL, 'class', 'xp.runtime.Evaluate', array())); $p->in->write($decl . ' ClassLoader::registerPath(\'' . strtr($this->getClass()->getClassLoader()->path, '\\', '/') . '\'); $errors= 0; foreach (array("' . implode('", "', $uses) . '") as $class) { try { uses($class); echo "+OK ", $class, "\\n"; } catch (Throwable $e) { echo "-ERR ", $class, ": ", $e->getClassName(), "\\n"; $errors++; } } exit($errors); '); $p->in->close(); // Read output while ($b = $p->out->read()) { $out .= $b; } while ($b = $p->err->read()) { $err .= $b; } // Close child process $exitv = $p->close(); return array($exitv, explode("\n", rtrim($out)), explode("\n", rtrim($err))); }
/** * Setup this test case * */ public function setUp() { if (!Runtime::getInstance()->extensionAvailable('sockets')) { throw new PrerequisitesNotMetError('Sockets extension not available', NULL, array('ext/sockets')); } parent::setUp(); }
public function newInstance() { $p = Runtime::getInstance()->getExecutable()->newInstance($this->arguments('-v')); $version = defined('HHVM_VERSION') ? 'HipHop VM ' . HHVM_VERSION : 'PHP ' . PHP_VERSION; $this->assertEquals($version, $p->out->read(strlen($version))); $p->close(); }
/** * Setup method. Ensure extension we depend on is available * */ public function setUp() { $depend = $this->extension(); if (!Runtime::getInstance()->extensionAvailable($depend)) { throw new PrerequisitesNotMetError(ucfirst($depend) . ' support not available', NULL, array('ext/' . $depend)); } }
/** * Set up test and create fixture * */ public function setUp() { if (!Runtime::getInstance()->extensionAvailable('soap')) { throw new PrerequisitesNotMetError('PHP Soap extension not available', NULL, array('ext/soap')); } $this->fixture = new NativeSoapTypeMapper(); }
/** * Setup this test. Creates a 1x1 pixel image filled with white. * */ public function setUp() { if (!Runtime::getInstance()->extensionAvailable('gd')) { throw new PrerequisitesNotMetError('GD extension not available'); } $this->image = Image::create(1, 1); $this->image->fill($this->image->allocate(new Color('#ffffff'))); }
/** * Sets up test case * */ public function setUp() { parent::setUp(); $this->vendor = $this->vendorName(); // Check whether any PHP extensions are required by a specific test, // and skip if this extension is not loaded. This is done by checking // for an @ext annotation. $m = $this->getClass()->getMethod($this->name); if ($m->hasAnnotation('ext') && !Runtime::getInstance()->extensionAvailable($ext = $m->getAnnotation('ext'))) { throw new PrerequisitesNotMetError('Extension not available', NULL, array($ext)); } }
/** * Starts server in background * * @param string protocol */ public static function startServerWith($protocol) { // Start server process with($rt = Runtime::getInstance()); self::$serverProcess = $rt->getExecutable()->newInstance(array_merge($rt->startupOptions()->asArguments(), array($rt->bootstrapScript('class')), array('net.xp_framework.unittest.peer.server.TestingServer', $protocol))); self::$serverProcess->in->close(); // Check if startup succeeded $status = self::$serverProcess->out->readLine(); if (2 != sscanf($status, '+ Service %[0-9.]:%d', self::$bindAddress[0], self::$bindAddress[1])) { try { self::shutdownServer(); } catch (IllegalStateException $e) { $status .= $e->getMessage(); } throw new PrerequisitesNotMetError('Cannot start server: ' . $status, NULL); } }
/** * Issues a uses() command inside a new runtime for every class given * and returns a line indicating success or failure for each of them. * * @param string[] uses * @param string src * @return var[] an array with three elements: exitcode, stdout and stderr contents */ protected function runInNewRuntime($uses, $src) { with($out = $err = '', $p = Runtime::getInstance()->newInstance(NULL, 'class', 'xp.runtime.Evaluate', array())); $uses && $p->in->write('uses("' . implode('", "', $uses) . '");'); $p->in->write($src); $p->in->close(); // Read output while ($b = $p->out->read()) { $out .= $b; } while ($b = $p->err->read()) { $err .= $b; } // Close child process $exitv = $p->close(); return array($exitv, $out, $err); }
public static function startFtpServer() { // Arguments to server process $args = array('debugServerProtocolToFile' => NULL); // Start server process self::$serverProcess = Runtime::getInstance()->newInstance(NULL, 'class', 'net.xp_framework.unittest.peer.ftp.TestingServer', array_values($args)); self::$serverProcess->in->close(); // Check if startup succeeded $status = self::$serverProcess->out->readLine(); if (1 != sscanf($status, '+ Service %[0-9.:]', self::$bindAddress)) { try { self::shutdownFtpServer(); } catch (IllegalStateException $e) { $status .= $e->getMessage(); } throw new PrerequisitesNotMetError('Cannot start FTP server: ' . $status, NULL); } }
/** * Create a new runtime * * @return var[] an array with three elements: exitcode, stdout and stderr contents */ protected function run() { $runtime = Runtime::getInstance(); $options = $runtime->startupOptions()->withSetting('magic_quotes_gpc', 1)->withSetting('error_reporting', 'E_ALL'); $out = $err = ''; with($p = $runtime->newInstance($options, 'class', 'xp.runtime.Evaluate', array('return 1;'))); $p->in->close(); // Read output while ($b = $p->out->read()) { $out .= $b; } while ($b = $p->err->read()) { $err .= $b; } // Close child process $exitv = $p->close(); return array($exitv, $out, $err); }
public static function startApplicationServer() { // Arguments to server process $args = array('debugServerProtocolToFile' => NULL); // Start server process self::$serverProcess = Runtime::getInstance()->newInstance(NULL, 'class', 'net.xp_framework.unittest.remote.TestingServer', array_values($args)); self::$serverProcess->in->close(); // Check if startup succeeded $status = self::$serverProcess->out->readLine(); if (2 != sscanf($status, '+ Service %[0-9.]:%d', self::$bindAddress[0], self::$bindAddress[1])) { try { self::shutdownApplicationServer(); } catch (IllegalStateException $e) { $status .= $e->getMessage(); } throw new PrerequisitesNotMetError('Cannot start EASC server: ' . $status, NULL); } // Add classloader with CalculatorBean client classes $a = XPClass::forName(xp::nameOf(__CLASS__))->getPackage()->getPackage('deploy')->getResourceAsStream('beans.test.CalculatorBean.xar'); self::$clientClassesLoader = ClassLoader::registerLoader(new ArchiveClassLoader(new Archive($a))); }
/** * Switch storage algorithm backing * * @param int $type one of BACKING_MCRYPT, BACKING_OPENSSL, BACKING_PLAINTEXT * @throws lang.IllegalArgumentException If illegal backing type was given * @throws lang.IllegalStateException If chosen backing missed a extension dependency */ public static function useBacking($type) { switch ($type) { case self::BACKING_MCRYPT: if (!Runtime::getInstance()->extensionAvailable('mcrypt')) { throw new IllegalStateException('Backing "mcrypt" required but extension not available.'); } $engine = mcrypt_module_open(MCRYPT_DES, '', 'ecb', ''); $engineiv = mcrypt_create_iv(mcrypt_enc_get_iv_size($engine), MCRYPT_RAND); $key = substr(md5(uniqid()), 0, mcrypt_enc_get_key_size($engine)); mcrypt_generic_init($engine, $key, $engineiv); return self::setBacking(function ($value) use($engine) { return mcrypt_generic($engine, $value); }, function ($value) use($engine) { return rtrim(mdecrypt_generic($engine, $value), ""); }); case self::BACKING_OPENSSL: if (!Runtime::getInstance()->extensionAvailable('openssl')) { throw new IllegalStateException('Backing "openssl" required but extension not available.'); } $key = md5(uniqid()); $iv = substr(md5(uniqid()), 0, openssl_cipher_iv_length('des')); return self::setBacking(function ($value) use($key, $iv) { return openssl_encrypt($value, 'DES', $key, 0, $iv); }, function ($value) use($key, $iv) { return openssl_decrypt($value, 'DES', $key, 0, $iv); }); case self::BACKING_PLAINTEXT: return self::setBacking(function ($value) { return base64_encode($value); }, function ($value) { return base64_decode($value); }); default: throw new IllegalArgumentException('Invalid backing given: ' . xp::stringOf($type)); } }
public function memoryLimit() { $this->assertEquals(Primitive::$INT, Type::forName(gettype(Runtime::getInstance()->memoryLimit()))); }
/** * Return a file that is known to exist * * @return string */ protected function fileKnownToExist() { return realpath(Runtime::getInstance()->getExecutable()->getFilename()); }
public function fatalsForNonExistingXars() { $r = $this->runWith(Runtime::getInstance()->startupOptions()->withClassPath('/does-not-exist.xar')); $this->assertEquals(255, $r[0], 'exitcode'); $this->assertTrue((bool) strstr($r[1] . $r[2], '[bootstrap] Classpath element [/does-not-exist.xar] not found'), xp::stringOf(array('out' => $r[1], 'err' => $r[2]))); }
/** * Perform this action * * @param string[] args */ public function perform(array $args) { $installation = new Installation(); $installation->setBase(new Folder(isset($args[0]) ? $args[0] : dirname(Runtime::getInstance()->bootstrapScript()) . '/..')); $force = in_array('-f', $args); with($version = $installation->getVersion()); Console::writeLine('===> Local version ', $version, ' @ ', $installation->getBase()); if (strstr($version, '-dev')) { Console::writeLine('*** Cannot update development checkouts'); return 2; } // Query releases website for newer versions $c = new HttpConnection(self::UPGRADE_URL); $r = $c->get(new RequestData($version)); switch ($r->getStatusCode()) { case HttpConstants::STATUS_OK: case HttpConstants::STATUS_NOT_EXTENDED: Console::writeLine('*** ', $this->readLine($r->getInputStream())); return 2; case HttpConstants::STATUS_SEE_OTHER: $upgrade = $r->getHeader('X-Upgrade-To'); $base = $r->getHeader('Location'); Console::writeLine('---> Upgrading to ', $upgrade, ' (', $base, ')'); $target = new Folder($installation->getBase(), $upgrade); $target->exists() || $target->create(); // Verify dependencies $this->extract($base, 'depend', $target); with($p = new Properties($target->getURI() . 'depend.ini')); $verify = 1; $rtversion = phpversion(); $extensions = array_flip(array_map('strtolower', get_loaded_extensions())); foreach ($p->readSection('php') as $op => $compare) { if (!version_compare(phpversion(), $compare, $op)) { $verify &= $this->error('PHP version ' . $op . ' ' . $compare . ' required, have ' . $rtversion); } } foreach ($p->readSection('ext.required') as $ext => $usage) { if (!isset($extensions[$ext])) { $verify &= $this->error('PHP Extension ' . $ext . ' required for ' . $usage); } } foreach ($p->readSection('ext.conflict') as $ext => $usage) { if (isset($extensions[$ext])) { $verify &= $this->error('PHP Extension ' . $ext . ' conflicts (' . $usage . ')'); } } foreach ($p->readSection('ext.optional') as $ext => $usage) { if (!isset($extensions[$ext])) { $verify &= $this->error('PHP Extension ' . $ext . ' not found, needed for ' . $usage . ' (ignoring)'); } } foreach ($p->readSection('ini') as $setting => $match) { $value = ini_get($setting); if (!preg_match($match, $value)) { $verify &= $this->error('PHP .ini setting ' . $setting . ' needs to match ' . $match . ' (but is ' . $value . ')'); } } // Remove depend.ini, finally check if we should continue create(new File($p->getFilename()))->unlink(); if (!$verify) { if (!$force) { return 3; } Console::writeLine('!!! Ignoring errors because -f was passed'); } // Download base, tools, libraries and meta information $this->extract($base, 'base', $target); $this->extract($base, 'tools', $target); $this->extract($base, 'lib', $target); $this->extract($base, 'meta-inf', $target); // Verify it works by running the XP Framework core unittests $tests = array('net.xp_framework.unittest.core.**'); Console::writeLine('---> Running tests with [USE_XP=', $upgrade, ']:'); $rt = Runtime::getInstance(); set_include_path(implode(PATH_SEPARATOR, array(rtrim($target->getURI(), DIRECTORY_SEPARATOR), '', $target->getURI() . 'lib' . DIRECTORY_SEPARATOR . 'xp-net.xp_framework-' . $upgrade . '.xar'))); with($p = $rt->newInstance($rt->startupOptions(), 'class', 'xp.unittest.Runner', $tests)); $p->in->close(); while (!$p->out->eof()) { Console::writeLine($p->out->readLine()); } while (!$p->err->eof()) { Console::writeLine($p->err->readLine()); } $exit = $p->close(); // Nonzero exit means failure if (0 !== $exit) { Console::writeLine('*** Test run failed, please consult above error messsages'); Console::writeLine($p->getCommandLine()); return 2; } Console::writeLine('===> Done, installed @ ', $target); return 0; default: throw new IllegalStateException('Unexpected response ' . xp::stringOf($r)); } }
/** * Sets up test case * */ public function setUp() { if (!Runtime::getInstance()->extensionAvailable('zlib')) { throw new PrerequisitesNotMetError('ZLib support not available', NULL, array('ext/zlib')); } }
public static function verifySqlite3Extension() { if (!Runtime::getInstance()->extensionAvailable('sqlite3')) { throw new PrerequisitesNotMetError('Extension not available', NULL, array('sqlite3')); } }
/** * Sets up this unittest * * @throws unittest.PrerequisitesNotMetError */ public function setUp() { if (!Runtime::getInstance()->extensionAvailable('dom')) { throw new PrerequisitesNotMetError('DOM extension not loaded', NULL, array('ext/dom')); } }
/** * Setup this test. * */ public function setUp() { if (!Runtime::getInstance()->extensionAvailable('gd')) { throw new PrerequisitesNotMetError('GD extension not available'); } }
/** * Start new SQLRunner process * * @return lang.Process */ protected function newProcess() { with($rt = Runtime::getInstance()); $proc = $rt->getExecutable()->newInstance(array_merge($rt->startupOptions()->asArguments(), array($rt->bootstrapScript('class')), array('net.xp_framework.unittest.rdbms.integration.SQLRunner', $this->dsn))); $this->assertEquals('! Started', $proc->out->readLine()); return $proc; }
/** * Verify a the extension exists * * @return bool */ public function verify() { return Runtime::getInstance()->extensionAvailable($this->extension); }
/** * Called when a test run finishes. * * @param unittest.TestSuite suite * @param unittest.TestResult result */ public function testRunFinished(TestSuite $suite, TestResult $result) { $this->writeStatus(); $this->out->writeLine(); // Summary output $this->out->writeLinef("\n%s: %d/%d run (%d skipped), %d succeeded, %d failed", $result->failureCount() > 0 ? 'FAIL' : 'OK', $result->runCount(), $result->count(), $result->skipCount(), $result->successCount(), $result->failureCount()); $this->out->writeLinef('Memory used: %.2f kB (%.2f kB peak)', Runtime::getInstance()->memoryUsage() / 1024, Runtime::getInstance()->peakMemoryUsage() / 1024); $this->out->writeLinef('Time taken: %.3f seconds', $result->elapsed()); }
/** * Called when a test run finishes. * * @param unittest.TestSuite suite * @param unittest.TestResult result */ public function testRunFinished(TestSuite $suite, TestResult $result) { // Details if ($result->successCount() > 0) { $this->out->writeLine("\n---> Succeeeded:"); foreach (array_keys($result->succeeded) as $key) { $this->out->writeLine('* ', $result->succeeded[$key]); } } if ($result->skipCount() > 0) { $this->out->writeLine("\n---> Skipped:"); foreach (array_keys($result->skipped) as $key) { $this->out->writeLine('* ', $result->skipped[$key]); } } if ($result->failureCount() > 0) { $this->out->writeLine("\n---> Failed:"); foreach (array_keys($result->failed) as $key) { $this->out->writeLine('* ', $result->failed[$key]); } } $this->out->writeLinef("\n===> %s: %d run (%d skipped), %d succeeded, %d failed", $result->failureCount() ? 'FAIL' : 'OK', $result->runCount(), $result->skipCount(), $result->successCount(), $result->failureCount()); $this->out->writeLinef('===> Memory used: %.2f kB (%.2f kB peak)', Runtime::getInstance()->memoryUsage() / 1024, Runtime::getInstance()->peakMemoryUsage() / 1024); $this->out->writeLinef('===> Time taken: %.3f seconds', $result->elapsed()); }
public static function verifyExtensionAvailable() { if (!Runtime::getInstance()->extensionAvailable('com_dotnet')) { throw new PrerequisitesNotMetError('No COM extension available', NULL, array('ext/com_dotnet')); } }
/** * Actions executed at socket server startup. * * During this method execution, loggers are started and garbage collecting * process is launched. * * @since 5.1 */ public function onStart() { //OK $context = ModuleServerContext::instance('\\Innomatic\\Module\\Server\\ModuleServerContext'); if ($context->getConfig()->getKey('log_server_events') == 1 or $context->getConfig()->useDefaults()) { $this->serverLogEnabled = true; $this->serverLogger = new ModuleServerLogger($context->getHome() . 'core/log/module-services.log'); } if ($context->getConfig()->getKey('log_access_events') == 1) { $this->accessLogEnabled = true; $this->accessLogger = new ModuleServerLogger($context->getHome() . 'core/log/module-access.log'); } \Innomatic\Module\Session\ModuleSessionGarbageCollector::clean(); $this->authenticator = ModuleServerAuthenticator::instance('ModuleServerAuthenticator'); if ($this->serverLogEnabled) { $this->serverLogger->logEvent('Start'); } //loading net-registry $this->registryHandler = new ModuleRegistryHandler(); $this->registryHandler->parseRegistry(); Runtime::getInstance()->addShutdownHook($this, 'onHalt'); print 'Module: services-extension started and listening at port ' . $this->serversocket->getPort() . "\n"; }
/** * Called when a test run finishes. * * @param unittest.TestSuite suite * @param unittest.TestResult result */ public function testRunFinished(TestSuite $suite, TestResult $result) { $this->out->writeLine(']'); // Show failed test details $fail = FALSE; if ($result->failureCount() > 0) { $this->out->writeLine(); foreach ($result->failed as $failure) { $this->out->writeLine('F ', $failure); } $fail = TRUE; } $this->out->writeLinef("\n%s%s: %d/%d run (%d skipped), %d succeeded, %d failed%s", $this->colored ? $fail ? "[41;1;37m" : "[42;1;37m" : '', $fail ? 'FAIL' : 'OK', $result->runCount(), $result->count(), $result->skipCount(), $result->successCount(), $result->failureCount(), $this->colored ? "[0m" : ''); $this->out->writeLinef('Memory used: %.2f kB (%.2f kB peak)', Runtime::getInstance()->memoryUsage() / 1024, Runtime::getInstance()->peakMemoryUsage() / 1024); $this->out->writeLinef('Time taken: %.3f seconds', $result->elapsed()); }
public function setBaseAddsTrailingDirectorySeparator() { $file = Runtime::getInstance()->getExecutable()->getFilename(); $path = rtrim(realpath(dirname($file)), DIRECTORY_SEPARATOR); $this->processor->setBase($path); $this->assertEquals($path . DIRECTORY_SEPARATOR, $this->processor->getBase()); }