public function newInstance()
 {
     $p = Runtime::getInstance()->getExecutable()->newInstance(array('-v'));
     $version = 'PHP ' . phpversion();
     $this->assertEquals($version, $p->out->read(strlen($version)));
     $p->close();
 }
Example #2
0
 /**
  * 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();
 }
Example #4
0
 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())));
 }
Example #16
0
 /**
  * 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 ? "" : "" : '', $fail ? 'FAIL' : 'OK', $result->runCount(), $result->count(), $result->skipCount(), $result->successCount(), $result->failureCount(), $this->colored ? "" : '');
     $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());
 }