diff --git a/tests/Frameworks/README.md b/tests/Frameworks/README.md
index 7f9e196292..227da68793 100644
--- a/tests/Frameworks/README.md
+++ b/tests/Frameworks/README.md
@@ -24,7 +24,13 @@ Link: https://laravel.com/docs/5.7/installation
In order to generate the sample Symfony apps we used the default commands from the framework's 'Getting started' guides.
- $ cd tests/Integration/Frameworks/Symfony
+ $ cd tests/Frameworks/Symfony
+
+### Symfony 3.3
+
+Link: https://symfony.com/doc/3.3/setup.html
+
+ $ composer create-project symfony/framework-standard-edition Version_3_3 "3.3.*"
### Symfony 3.4
diff --git a/tests/Frameworks/Symfony/Version_3_3/.gitattributes b/tests/Frameworks/Symfony/Version_3_3/.gitattributes
new file mode 100644
index 0000000000..a65496e829
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/.gitattributes
@@ -0,0 +1,5 @@
+bin/ linguist-generated
+var/ linguist-generated
+web/ linguist-generated
+LICENSE linguist-generated
+README.md linguist-generated
diff --git a/tests/Frameworks/Symfony/Version_3_3/.gitignore b/tests/Frameworks/Symfony/Version_3_3/.gitignore
new file mode 100644
index 0000000000..2f75ca1ce9
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/.gitignore
@@ -0,0 +1,17 @@
+/.web-server-pid
+/app/config/parameters.yml
+/build/
+/phpunit.xml
+/var/*
+!/var/cache
+/var/cache/*
+!var/cache/.gitkeep
+!/var/logs
+/var/logs/*
+!var/logs/.gitkeep
+!/var/sessions
+/var/sessions/*
+!var/sessions/.gitkeep
+!var/SymfonyRequirements.php
+/vendor/
+/web/bundles/
diff --git a/tests/Frameworks/Symfony/Version_3_3/LICENSE b/tests/Frameworks/Symfony/Version_3_3/LICENSE
new file mode 100644
index 0000000000..17d16a1336
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2004-2017 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/tests/Frameworks/Symfony/Version_3_3/README.md b/tests/Frameworks/Symfony/Version_3_3/README.md
new file mode 100644
index 0000000000..7b1f54dcda
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/README.md
@@ -0,0 +1,72 @@
+Symfony Standard Edition
+========================
+
+Welcome to the Symfony Standard Edition - a fully-functional Symfony
+application that you can use as the skeleton for your new applications.
+
+For details on how to download and get started with Symfony, see the
+[Installation][1] chapter of the Symfony Documentation.
+
+What's inside?
+--------------
+
+The Symfony Standard Edition is configured with the following defaults:
+
+ * An AppBundle you can use to start coding;
+
+ * Twig as the only configured template engine;
+
+ * Doctrine ORM/DBAL;
+
+ * Swiftmailer;
+
+ * Annotations enabled for everything.
+
+It comes pre-configured with the following bundles:
+
+ * **FrameworkBundle** - The core Symfony framework bundle
+
+ * [**SensioFrameworkExtraBundle**][6] - Adds several enhancements, including
+ template and routing annotation capability
+
+ * [**DoctrineBundle**][7] - Adds support for the Doctrine ORM
+
+ * [**TwigBundle**][8] - Adds support for the Twig templating engine
+
+ * [**SecurityBundle**][9] - Adds security by integrating Symfony's security
+ component
+
+ * [**SwiftmailerBundle**][10] - Adds support for Swiftmailer, a library for
+ sending emails
+
+ * [**MonologBundle**][11] - Adds support for Monolog, a logging library
+
+ * **WebProfilerBundle** (in dev/test env) - Adds profiling functionality and
+ the web debug toolbar
+
+ * **SensioDistributionBundle** (in dev/test env) - Adds functionality for
+ configuring and working with Symfony distributions
+
+ * [**SensioGeneratorBundle**][13] (in dev env) - Adds code generation
+ capabilities
+
+ * [**WebServerBundle**][14] (in dev env) - Adds commands for running applications
+ using the PHP built-in web server
+
+ * **DebugBundle** (in dev/test env) - Adds Debug and VarDumper component
+ integration
+
+All libraries and bundles included in the Symfony Standard Edition are
+released under the MIT or BSD license.
+
+Enjoy!
+
+[1]: https://symfony.com/doc/3.3/setup.html
+[6]: https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/index.html
+[7]: https://symfony.com/doc/3.3/doctrine.html
+[8]: https://symfony.com/doc/3.3/templating.html
+[9]: https://symfony.com/doc/3.3/security.html
+[10]: https://symfony.com/doc/3.3/email.html
+[11]: https://symfony.com/doc/3.3/logging.html
+[13]: https://symfony.com/doc/current/bundles/SensioGeneratorBundle/index.html
+[14]: https://symfony.com/doc/current/setup/built_in_web_server.html
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/.htaccess b/tests/Frameworks/Symfony/Version_3_3/app/.htaccess
new file mode 100644
index 0000000000..fb1de45bdb
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/.htaccess
@@ -0,0 +1,7 @@
+
+ Require all denied
+
+
+ Order deny,allow
+ Deny from all
+
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/AppCache.php b/tests/Frameworks/Symfony/Version_3_3/app/AppCache.php
new file mode 100644
index 0000000000..639ec2cd7e
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/AppCache.php
@@ -0,0 +1,7 @@
+getEnvironment(), ['dev', 'test'], true)) {
+ $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
+ $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
+ $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
+
+ if ('dev' === $this->getEnvironment()) {
+ $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
+ $bundles[] = new Symfony\Bundle\WebServerBundle\WebServerBundle();
+ }
+ }
+
+ return $bundles;
+ }
+
+ public function getRootDir()
+ {
+ return __DIR__;
+ }
+
+ public function getCacheDir()
+ {
+ return dirname(__DIR__).'/var/cache/'.$this->getEnvironment();
+ }
+
+ public function getLogDir()
+ {
+ return dirname(__DIR__).'/var/logs';
+ }
+
+ public function registerContainerConfiguration(LoaderInterface $loader)
+ {
+ $loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml');
+ }
+}
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/Resources/views/base.html.twig b/tests/Frameworks/Symfony/Version_3_3/app/Resources/views/base.html.twig
new file mode 100644
index 0000000000..bafd28d3bd
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/Resources/views/base.html.twig
@@ -0,0 +1,13 @@
+
+
+
+{% endblock %}
+
+{% block stylesheets %}
+
+{% endblock %}
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/config/config.yml b/tests/Frameworks/Symfony/Version_3_3/app/config/config.yml
new file mode 100644
index 0000000000..1a5c14761e
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/config/config.yml
@@ -0,0 +1,69 @@
+imports:
+ - { resource: parameters.yml }
+ - { resource: security.yml }
+ - { resource: services.yml }
+
+# Put parameters here that don't need to change on each machine where the app is deployed
+# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
+parameters:
+ locale: en
+
+framework:
+ #esi: ~
+ #translator: { fallbacks: ['%locale%'] }
+ secret: '%secret%'
+ router:
+ resource: '%kernel.project_dir%/app/config/routing.yml'
+ strict_requirements: ~
+ form: ~
+ csrf_protection: ~
+ validation: { enable_annotations: true }
+ #serializer: { enable_annotations: true }
+ templating:
+ engines: ['twig']
+ default_locale: '%locale%'
+ trusted_hosts: ~
+ session:
+ # https://symfony.com/doc/current/reference/configuration/framework.html#handler-id
+ handler_id: session.handler.native_file
+ save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'
+ fragments: ~
+ http_method_override: true
+ assets: ~
+ php_errors:
+ log: true
+
+# Twig Configuration
+twig:
+ debug: '%kernel.debug%'
+ strict_variables: '%kernel.debug%'
+
+# Doctrine Configuration
+doctrine:
+ dbal:
+ driver: pdo_mysql
+ host: '%database_host%'
+ port: '%database_port%'
+ dbname: '%database_name%'
+ user: '%database_user%'
+ password: '%database_password%'
+ charset: UTF8
+ # if using pdo_sqlite as your database driver:
+ # 1. add the path in parameters.yml
+ # e.g. database_path: '%kernel.project_dir%/var/data/data.sqlite'
+ # 2. Uncomment database_path in parameters.yml.dist
+ # 3. Uncomment next line:
+ #path: '%database_path%'
+
+ orm:
+ auto_generate_proxy_classes: '%kernel.debug%'
+ naming_strategy: doctrine.orm.naming_strategy.underscore
+ auto_mapping: true
+
+# Swiftmailer Configuration
+swiftmailer:
+ transport: '%mailer_transport%'
+ host: '%mailer_host%'
+ username: '%mailer_user%'
+ password: '%mailer_password%'
+ spool: { type: memory }
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/config/config_dev.yml b/tests/Frameworks/Symfony/Version_3_3/app/config/config_dev.yml
new file mode 100644
index 0000000000..3a43646808
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/config/config_dev.yml
@@ -0,0 +1,41 @@
+imports:
+ - { resource: config.yml }
+
+framework:
+ router:
+ resource: '%kernel.project_dir%/app/config/routing_dev.yml'
+ strict_requirements: true
+ profiler: { only_exceptions: false }
+
+web_profiler:
+ toolbar: true
+ intercept_redirects: false
+
+monolog:
+ handlers:
+ main:
+ type: stream
+ path: '%kernel.logs_dir%/%kernel.environment%.log'
+ level: debug
+ channels: ['!event']
+ console:
+ type: console
+ process_psr_3_messages: false
+ channels: ['!event', '!doctrine', '!console']
+ # To follow logs in real time, execute the following command:
+ # `bin/console server:log -vv`
+ server_log:
+ type: server_log
+ process_psr_3_messages: false
+ host: 127.0.0.1:9911
+ # uncomment to get logging in your browser
+ # you may have to allow bigger header sizes in your Web server configuration
+ #firephp:
+ # type: firephp
+ # level: info
+ #chromephp:
+ # type: chromephp
+ # level: info
+
+#swiftmailer:
+# delivery_addresses: ['me@example.com']
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/config/config_prod.yml b/tests/Frameworks/Symfony/Version_3_3/app/config/config_prod.yml
new file mode 100644
index 0000000000..5d460ceb7c
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/config/config_prod.yml
@@ -0,0 +1,22 @@
+imports:
+ - { resource: config.yml }
+
+#doctrine:
+# orm:
+# metadata_cache_driver: apc
+# result_cache_driver: apc
+# query_cache_driver: apc
+
+monolog:
+ handlers:
+ main:
+ type: fingers_crossed
+ action_level: error
+ handler: nested
+ nested:
+ type: stream
+ path: '%kernel.logs_dir%/%kernel.environment%.log'
+ level: debug
+ console:
+ type: console
+ process_psr_3_messages: false
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/config/config_test.yml b/tests/Frameworks/Symfony/Version_3_3/app/config/config_test.yml
new file mode 100644
index 0000000000..2f6d92503f
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/config/config_test.yml
@@ -0,0 +1,16 @@
+imports:
+ - { resource: config_dev.yml }
+
+framework:
+ test: ~
+ session:
+ storage_id: session.storage.mock_file
+ profiler:
+ collect: false
+
+web_profiler:
+ toolbar: false
+ intercept_redirects: false
+
+swiftmailer:
+ disable_delivery: true
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/config/parameters.yml.dist b/tests/Frameworks/Symfony/Version_3_3/app/config/parameters.yml.dist
new file mode 100644
index 0000000000..2c20ddc8a4
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/config/parameters.yml.dist
@@ -0,0 +1,19 @@
+# This file is a "template" of what your parameters.yml file should look like
+# Set parameters here that may be different on each deployment target of the app, e.g. development, staging, production.
+# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration
+parameters:
+ database_host: 127.0.0.1
+ database_port: ~
+ database_name: symfony
+ database_user: root
+ database_password: ~
+ # You should uncomment this if you want to use pdo_sqlite
+ #database_path: '%kernel.project_dir%/var/data/data.sqlite'
+
+ mailer_transport: smtp
+ mailer_host: 127.0.0.1
+ mailer_user: ~
+ mailer_password: ~
+
+ # A secret key that's used to generate certain security-related tokens
+ secret: ThisTokenIsNotSoSecretChangeIt
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/config/routing.yml b/tests/Frameworks/Symfony/Version_3_3/app/config/routing.yml
new file mode 100644
index 0000000000..2ec067f4c7
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/config/routing.yml
@@ -0,0 +1,3 @@
+app:
+ resource: '@AppBundle/Controller/'
+ type: annotation
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/config/routing_dev.yml b/tests/Frameworks/Symfony/Version_3_3/app/config/routing_dev.yml
new file mode 100644
index 0000000000..20602eb27b
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/config/routing_dev.yml
@@ -0,0 +1,14 @@
+_wdt:
+ resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml'
+ prefix: /_wdt
+
+_profiler:
+ resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml'
+ prefix: /_profiler
+
+_errors:
+ resource: '@TwigBundle/Resources/config/routing/errors.xml'
+ prefix: /_error
+
+_main:
+ resource: routing.yml
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/config/security.yml b/tests/Frameworks/Symfony/Version_3_3/app/config/security.yml
new file mode 100644
index 0000000000..0e0b7cb959
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/config/security.yml
@@ -0,0 +1,24 @@
+# To get started with security, check out the documentation:
+# https://symfony.com/doc/current/security.html
+security:
+
+ # https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
+ providers:
+ in_memory:
+ memory: ~
+
+ firewalls:
+ # disables authentication for assets and the profiler, adapt it according to your needs
+ dev:
+ pattern: ^/(_(profiler|wdt)|css|images|js)/
+ security: false
+
+ main:
+ anonymous: ~
+ # activate different ways to authenticate
+
+ # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
+ #http_basic: ~
+
+ # https://symfony.com/doc/current/security/form_login_setup.html
+ #form_login: ~
diff --git a/tests/Frameworks/Symfony/Version_3_3/app/config/services.yml b/tests/Frameworks/Symfony/Version_3_3/app/config/services.yml
new file mode 100644
index 0000000000..cdb1c65a54
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/app/config/services.yml
@@ -0,0 +1,35 @@
+# Learn more about services, parameters and containers at
+# https://symfony.com/doc/current/service_container.html
+parameters:
+ #parameter_name: value
+
+services:
+ # default configuration for services in *this* file
+ _defaults:
+ # automatically injects dependencies in your services
+ autowire: true
+ # automatically registers your services as commands, event subscribers, etc.
+ autoconfigure: true
+ # this means you cannot fetch services directly from the container via $container->get()
+ # if you need to do this, you can override this setting on individual services
+ public: false
+
+ # makes classes in src/AppBundle available to be used as services
+ # this creates a service per class whose id is the fully-qualified class name
+ AppBundle\:
+ resource: '../../src/AppBundle/*'
+ # you can exclude directories or files
+ # but if a service is unused, it's removed anyway
+ exclude: '../../src/AppBundle/{Entity,Repository,Tests}'
+
+ # controllers are imported separately to make sure they're public
+ # and have a tag that allows actions to type-hint services
+ AppBundle\Controller\:
+ resource: '../../src/AppBundle/Controller'
+ public: true
+ tags: ['controller.service_arguments']
+
+ # add more services, or override services that need manual wiring
+ # AppBundle\Service\ExampleService:
+ # arguments:
+ # $someArgument: 'some_value'
diff --git a/tests/Frameworks/Symfony/Version_3_3/bin/console b/tests/Frameworks/Symfony/Version_3_3/bin/console
new file mode 100755
index 0000000000..0629023acc
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/bin/console
@@ -0,0 +1,27 @@
+#!/usr/bin/env php
+getParameterOption(['--env', '-e'], getenv('SYMFONY_ENV') ?: 'dev');
+$debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(['--no-debug', '']) && $env !== 'prod';
+
+if ($debug) {
+ Debug::enable();
+}
+
+$kernel = new AppKernel($env, $debug);
+$application = new Application($kernel);
+$application->run($input);
diff --git a/tests/Frameworks/Symfony/Version_3_3/bin/symfony_requirements b/tests/Frameworks/Symfony/Version_3_3/bin/symfony_requirements
new file mode 100755
index 0000000000..a7bf65a1b8
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/bin/symfony_requirements
@@ -0,0 +1,146 @@
+#!/usr/bin/env php
+getPhpIniConfigPath();
+
+echo_title('Symfony Requirements Checker');
+
+echo '> PHP is using the following php.ini file:'.PHP_EOL;
+if ($iniPath) {
+ echo_style('green', ' '.$iniPath);
+} else {
+ echo_style('yellow', ' WARNING: No configuration file (php.ini) used by PHP!');
+}
+
+echo PHP_EOL.PHP_EOL;
+
+echo '> Checking Symfony requirements:'.PHP_EOL.' ';
+
+$messages = array();
+foreach ($symfonyRequirements->getRequirements() as $req) {
+ if ($helpText = get_error_message($req, $lineSize)) {
+ echo_style('red', 'E');
+ $messages['error'][] = $helpText;
+ } else {
+ echo_style('green', '.');
+ }
+}
+
+$checkPassed = empty($messages['error']);
+
+foreach ($symfonyRequirements->getRecommendations() as $req) {
+ if ($helpText = get_error_message($req, $lineSize)) {
+ echo_style('yellow', 'W');
+ $messages['warning'][] = $helpText;
+ } else {
+ echo_style('green', '.');
+ }
+}
+
+if ($checkPassed) {
+ echo_block('success', 'OK', 'Your system is ready to run Symfony projects');
+} else {
+ echo_block('error', 'ERROR', 'Your system is not ready to run Symfony projects');
+
+ echo_title('Fix the following mandatory requirements', 'red');
+
+ foreach ($messages['error'] as $helpText) {
+ echo ' * '.$helpText.PHP_EOL;
+ }
+}
+
+if (!empty($messages['warning'])) {
+ echo_title('Optional recommendations to improve your setup', 'yellow');
+
+ foreach ($messages['warning'] as $helpText) {
+ echo ' * '.$helpText.PHP_EOL;
+ }
+}
+
+echo PHP_EOL;
+echo_style('title', 'Note');
+echo ' The command console could use a different php.ini file'.PHP_EOL;
+echo_style('title', '~~~~');
+echo ' than the one used with your web server. To be on the'.PHP_EOL;
+echo ' safe side, please check the requirements from your web'.PHP_EOL;
+echo ' server using the ';
+echo_style('yellow', 'web/config.php');
+echo ' script.'.PHP_EOL;
+echo PHP_EOL;
+
+exit($checkPassed ? 0 : 1);
+
+function get_error_message(Requirement $requirement, $lineSize)
+{
+ if ($requirement->isFulfilled()) {
+ return;
+ }
+
+ $errorMessage = wordwrap($requirement->getTestMessage(), $lineSize - 3, PHP_EOL.' ').PHP_EOL;
+ $errorMessage .= ' > '.wordwrap($requirement->getHelpText(), $lineSize - 5, PHP_EOL.' > ').PHP_EOL;
+
+ return $errorMessage;
+}
+
+function echo_title($title, $style = null)
+{
+ $style = $style ?: 'title';
+
+ echo PHP_EOL;
+ echo_style($style, $title.PHP_EOL);
+ echo_style($style, str_repeat('~', strlen($title)).PHP_EOL);
+ echo PHP_EOL;
+}
+
+function echo_style($style, $message)
+{
+ // ANSI color codes
+ $styles = array(
+ 'reset' => "\033[0m",
+ 'red' => "\033[31m",
+ 'green' => "\033[32m",
+ 'yellow' => "\033[33m",
+ 'error' => "\033[37;41m",
+ 'success' => "\033[37;42m",
+ 'title' => "\033[34m",
+ );
+ $supports = has_color_support();
+
+ echo($supports ? $styles[$style] : '').$message.($supports ? $styles['reset'] : '');
+}
+
+function echo_block($style, $title, $message)
+{
+ $message = ' '.trim($message).' ';
+ $width = strlen($message);
+
+ echo PHP_EOL.PHP_EOL;
+
+ echo_style($style, str_repeat(' ', $width));
+ echo PHP_EOL;
+ echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT));
+ echo PHP_EOL;
+ echo_style($style, $message);
+ echo PHP_EOL;
+ echo_style($style, str_repeat(' ', $width));
+ echo PHP_EOL;
+}
+
+function has_color_support()
+{
+ static $support;
+
+ if (null === $support) {
+ if (DIRECTORY_SEPARATOR == '\\') {
+ $support = false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI');
+ } else {
+ $support = function_exists('posix_isatty') && @posix_isatty(STDOUT);
+ }
+ }
+
+ return $support;
+}
diff --git a/tests/Frameworks/Symfony/Version_3_3/composer.json b/tests/Frameworks/Symfony/Version_3_3/composer.json
new file mode 100644
index 0000000000..3d16d65941
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/composer.json
@@ -0,0 +1,69 @@
+{
+ "name": "symfony/framework-standard-edition",
+ "license": "MIT",
+ "type": "project",
+ "description": "The \"Symfony Standard Edition\" distribution",
+ "autoload": {
+ "psr-4": {
+ "AppBundle\\": "src/AppBundle"
+ },
+ "classmap": [ "app/AppKernel.php", "app/AppCache.php" ]
+ },
+ "autoload-dev": {
+ "psr-4": { "Tests\\": "tests/" },
+ "files": [ "vendor/symfony/symfony/src/Symfony/Component/VarDumper/Resources/functions/dump.php" ]
+ },
+ "require": {
+ "php": ">=5.5.9",
+ "doctrine/doctrine-bundle": "^1.6",
+ "doctrine/orm": "^2.5",
+ "incenteev/composer-parameter-handler": "^2.0",
+ "sensio/distribution-bundle": "^5.0.19",
+ "sensio/framework-extra-bundle": "^3.0.2",
+ "symfony/monolog-bundle": "^3.1.0",
+ "symfony/polyfill-apcu": "^1.0",
+ "symfony/swiftmailer-bundle": "^2.3.10",
+ "symfony/symfony": "3.3.*",
+ "twig/twig": "^1.0||^2.0"
+ },
+ "require-dev": {
+ "sensio/generator-bundle": "^3.0",
+ "symfony/phpunit-bridge": "^3.0"
+ },
+ "scripts": {
+ "symfony-scripts": [
+ "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters",
+ "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
+ "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
+ "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
+ "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile",
+ "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget"
+ ],
+ "post-install-cmd": [
+ "@symfony-scripts"
+ ],
+ "post-update-cmd": [
+ "@symfony-scripts"
+ ]
+ },
+ "config": {
+ "platform": {
+ "php": "5.5.9"
+ },
+ "sort-packages": true
+ },
+ "extra": {
+ "symfony-app-dir": "app",
+ "symfony-bin-dir": "bin",
+ "symfony-var-dir": "var",
+ "symfony-web-dir": "web",
+ "symfony-tests-dir": "tests",
+ "symfony-assets-install": "relative",
+ "incenteev-parameters": {
+ "file": "app/config/parameters.yml"
+ },
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ }
+}
diff --git a/tests/Frameworks/Symfony/Version_3_3/phpunit.xml.dist b/tests/Frameworks/Symfony/Version_3_3/phpunit.xml.dist
new file mode 100644
index 0000000000..5a12e6762f
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/phpunit.xml.dist
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+ tests
+
+
+
+
+
+ src
+
+ src/*Bundle/Resources
+ src/*/*Bundle/Resources
+ src/*/Bundle/*Bundle/Resources
+
+
+
+
diff --git a/tests/Frameworks/Symfony/Version_3_3/src/.htaccess b/tests/Frameworks/Symfony/Version_3_3/src/.htaccess
new file mode 100644
index 0000000000..fb1de45bdb
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/src/.htaccess
@@ -0,0 +1,7 @@
+
+ Require all denied
+
+
+ Order deny,allow
+ Deny from all
+
diff --git a/tests/Frameworks/Symfony/Version_3_3/src/AppBundle/AppBundle.php b/tests/Frameworks/Symfony/Version_3_3/src/AppBundle/AppBundle.php
new file mode 100644
index 0000000000..05123b6782
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/src/AppBundle/AppBundle.php
@@ -0,0 +1,9 @@
+render('default/index.html.twig', [
+ 'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
+ ]);
+ }
+}
diff --git a/tests/Frameworks/Symfony/Version_3_3/tests/AppBundle/Controller/DefaultControllerTest.php b/tests/Frameworks/Symfony/Version_3_3/tests/AppBundle/Controller/DefaultControllerTest.php
new file mode 100644
index 0000000000..594803cce9
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/tests/AppBundle/Controller/DefaultControllerTest.php
@@ -0,0 +1,18 @@
+request('GET', '/');
+
+ $this->assertEquals(200, $client->getResponse()->getStatusCode());
+ $this->assertContains('Welcome to Symfony', $crawler->filter('#container h1')->text());
+ }
+}
diff --git a/tests/Frameworks/Symfony/Version_3_3/var/SymfonyRequirements.php b/tests/Frameworks/Symfony/Version_3_3/var/SymfonyRequirements.php
new file mode 100644
index 0000000000..3b14a4022d
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/var/SymfonyRequirements.php
@@ -0,0 +1,817 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/*
+ * Users of PHP 5.2 should be able to run the requirements checks.
+ * This is why the file and all classes must be compatible with PHP 5.2+
+ * (e.g. not using namespaces and closures).
+ *
+ * ************** CAUTION **************
+ *
+ * DO NOT EDIT THIS FILE as it will be overridden by Composer as part of
+ * the installation/update process. The original file resides in the
+ * SensioDistributionBundle.
+ *
+ * ************** CAUTION **************
+ */
+
+/**
+ * Represents a single PHP requirement, e.g. an installed extension.
+ * It can be a mandatory requirement or an optional recommendation.
+ * There is a special subclass, named PhpIniRequirement, to check a php.ini configuration.
+ *
+ * @author Tobias Schultze
+ */
+class Requirement
+{
+ private $fulfilled;
+ private $testMessage;
+ private $helpText;
+ private $helpHtml;
+ private $optional;
+
+ /**
+ * Constructor that initializes the requirement.
+ *
+ * @param bool $fulfilled Whether the requirement is fulfilled
+ * @param string $testMessage The message for testing the requirement
+ * @param string $helpHtml The help text formatted in HTML for resolving the problem
+ * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
+ * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement
+ */
+ public function __construct($fulfilled, $testMessage, $helpHtml, $helpText = null, $optional = false)
+ {
+ $this->fulfilled = (bool) $fulfilled;
+ $this->testMessage = (string) $testMessage;
+ $this->helpHtml = (string) $helpHtml;
+ $this->helpText = null === $helpText ? strip_tags($this->helpHtml) : (string) $helpText;
+ $this->optional = (bool) $optional;
+ }
+
+ /**
+ * Returns whether the requirement is fulfilled.
+ *
+ * @return bool true if fulfilled, otherwise false
+ */
+ public function isFulfilled()
+ {
+ return $this->fulfilled;
+ }
+
+ /**
+ * Returns the message for testing the requirement.
+ *
+ * @return string The test message
+ */
+ public function getTestMessage()
+ {
+ return $this->testMessage;
+ }
+
+ /**
+ * Returns the help text for resolving the problem.
+ *
+ * @return string The help text
+ */
+ public function getHelpText()
+ {
+ return $this->helpText;
+ }
+
+ /**
+ * Returns the help text formatted in HTML.
+ *
+ * @return string The HTML help
+ */
+ public function getHelpHtml()
+ {
+ return $this->helpHtml;
+ }
+
+ /**
+ * Returns whether this is only an optional recommendation and not a mandatory requirement.
+ *
+ * @return bool true if optional, false if mandatory
+ */
+ public function isOptional()
+ {
+ return $this->optional;
+ }
+}
+
+/**
+ * Represents a PHP requirement in form of a php.ini configuration.
+ *
+ * @author Tobias Schultze
+ */
+class PhpIniRequirement extends Requirement
+{
+ /**
+ * Constructor that initializes the requirement.
+ *
+ * @param string $cfgName The configuration name used for ini_get()
+ * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false,
+ * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
+ * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false.
+ * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
+ * Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
+ * @param string|null $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived)
+ * @param string|null $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived)
+ * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
+ * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement
+ */
+ public function __construct($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null, $optional = false)
+ {
+ $cfgValue = ini_get($cfgName);
+
+ if (is_callable($evaluation)) {
+ if (null === $testMessage || null === $helpHtml) {
+ throw new InvalidArgumentException('You must provide the parameters testMessage and helpHtml for a callback evaluation.');
+ }
+
+ $fulfilled = call_user_func($evaluation, $cfgValue);
+ } else {
+ if (null === $testMessage) {
+ $testMessage = sprintf('%s %s be %s in php.ini',
+ $cfgName,
+ $optional ? 'should' : 'must',
+ $evaluation ? 'enabled' : 'disabled'
+ );
+ }
+
+ if (null === $helpHtml) {
+ $helpHtml = sprintf('Set %s to %s in php.ini*.',
+ $cfgName,
+ $evaluation ? 'on' : 'off'
+ );
+ }
+
+ $fulfilled = $evaluation == $cfgValue;
+ }
+
+ parent::__construct($fulfilled || ($approveCfgAbsence && false === $cfgValue), $testMessage, $helpHtml, $helpText, $optional);
+ }
+}
+
+/**
+ * A RequirementCollection represents a set of Requirement instances.
+ *
+ * @author Tobias Schultze
+ */
+class RequirementCollection implements IteratorAggregate
+{
+ /**
+ * @var Requirement[]
+ */
+ private $requirements = array();
+
+ /**
+ * Gets the current RequirementCollection as an Iterator.
+ *
+ * @return Traversable A Traversable interface
+ */
+ public function getIterator()
+ {
+ return new ArrayIterator($this->requirements);
+ }
+
+ /**
+ * Adds a Requirement.
+ *
+ * @param Requirement $requirement A Requirement instance
+ */
+ public function add(Requirement $requirement)
+ {
+ $this->requirements[] = $requirement;
+ }
+
+ /**
+ * Adds a mandatory requirement.
+ *
+ * @param bool $fulfilled Whether the requirement is fulfilled
+ * @param string $testMessage The message for testing the requirement
+ * @param string $helpHtml The help text formatted in HTML for resolving the problem
+ * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
+ */
+ public function addRequirement($fulfilled, $testMessage, $helpHtml, $helpText = null)
+ {
+ $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, false));
+ }
+
+ /**
+ * Adds an optional recommendation.
+ *
+ * @param bool $fulfilled Whether the recommendation is fulfilled
+ * @param string $testMessage The message for testing the recommendation
+ * @param string $helpHtml The help text formatted in HTML for resolving the problem
+ * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
+ */
+ public function addRecommendation($fulfilled, $testMessage, $helpHtml, $helpText = null)
+ {
+ $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, true));
+ }
+
+ /**
+ * Adds a mandatory requirement in form of a php.ini configuration.
+ *
+ * @param string $cfgName The configuration name used for ini_get()
+ * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false,
+ * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
+ * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false.
+ * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
+ * Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
+ * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived)
+ * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived)
+ * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
+ */
+ public function addPhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null)
+ {
+ $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, false));
+ }
+
+ /**
+ * Adds an optional recommendation in form of a php.ini configuration.
+ *
+ * @param string $cfgName The configuration name used for ini_get()
+ * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false,
+ * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement
+ * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false.
+ * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin.
+ * Example: You require a config to be true but PHP later removes this config and defaults it to true internally.
+ * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived)
+ * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived)
+ * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags)
+ */
+ public function addPhpIniRecommendation($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null)
+ {
+ $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, true));
+ }
+
+ /**
+ * Adds a requirement collection to the current set of requirements.
+ *
+ * @param RequirementCollection $collection A RequirementCollection instance
+ */
+ public function addCollection(RequirementCollection $collection)
+ {
+ $this->requirements = array_merge($this->requirements, $collection->all());
+ }
+
+ /**
+ * Returns both requirements and recommendations.
+ *
+ * @return Requirement[]
+ */
+ public function all()
+ {
+ return $this->requirements;
+ }
+
+ /**
+ * Returns all mandatory requirements.
+ *
+ * @return Requirement[]
+ */
+ public function getRequirements()
+ {
+ $array = array();
+ foreach ($this->requirements as $req) {
+ if (!$req->isOptional()) {
+ $array[] = $req;
+ }
+ }
+
+ return $array;
+ }
+
+ /**
+ * Returns the mandatory requirements that were not met.
+ *
+ * @return Requirement[]
+ */
+ public function getFailedRequirements()
+ {
+ $array = array();
+ foreach ($this->requirements as $req) {
+ if (!$req->isFulfilled() && !$req->isOptional()) {
+ $array[] = $req;
+ }
+ }
+
+ return $array;
+ }
+
+ /**
+ * Returns all optional recommendations.
+ *
+ * @return Requirement[]
+ */
+ public function getRecommendations()
+ {
+ $array = array();
+ foreach ($this->requirements as $req) {
+ if ($req->isOptional()) {
+ $array[] = $req;
+ }
+ }
+
+ return $array;
+ }
+
+ /**
+ * Returns the recommendations that were not met.
+ *
+ * @return Requirement[]
+ */
+ public function getFailedRecommendations()
+ {
+ $array = array();
+ foreach ($this->requirements as $req) {
+ if (!$req->isFulfilled() && $req->isOptional()) {
+ $array[] = $req;
+ }
+ }
+
+ return $array;
+ }
+
+ /**
+ * Returns whether a php.ini configuration is not correct.
+ *
+ * @return bool php.ini configuration problem?
+ */
+ public function hasPhpIniConfigIssue()
+ {
+ foreach ($this->requirements as $req) {
+ if (!$req->isFulfilled() && $req instanceof PhpIniRequirement) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns the PHP configuration file (php.ini) path.
+ *
+ * @return string|false php.ini file path
+ */
+ public function getPhpIniConfigPath()
+ {
+ return get_cfg_var('cfg_file_path');
+ }
+}
+
+/**
+ * This class specifies all requirements and optional recommendations that
+ * are necessary to run the Symfony Standard Edition.
+ *
+ * @author Tobias Schultze
+ * @author Fabien Potencier
+ */
+class SymfonyRequirements extends RequirementCollection
+{
+ const LEGACY_REQUIRED_PHP_VERSION = '5.3.3';
+ const REQUIRED_PHP_VERSION = '5.5.9';
+
+ /**
+ * Constructor that initializes the requirements.
+ */
+ public function __construct()
+ {
+ /* mandatory requirements follow */
+
+ $installedPhpVersion = phpversion();
+ $requiredPhpVersion = $this->getPhpRequiredVersion();
+
+ $this->addRecommendation(
+ $requiredPhpVersion,
+ 'Vendors should be installed in order to check all requirements.',
+ 'Run the composer install command.',
+ 'Run the "composer install" command.'
+ );
+
+ if (false !== $requiredPhpVersion) {
+ $this->addRequirement(
+ version_compare($installedPhpVersion, $requiredPhpVersion, '>='),
+ sprintf('PHP version must be at least %s (%s installed)', $requiredPhpVersion, $installedPhpVersion),
+ sprintf('You are running PHP version "%s", but Symfony needs at least PHP "%s" to run.
+ Before using Symfony, upgrade your PHP installation, preferably to the latest version.',
+ $installedPhpVersion, $requiredPhpVersion),
+ sprintf('Install PHP %s or newer (installed version is %s)', $requiredPhpVersion, $installedPhpVersion)
+ );
+ }
+
+ $this->addRequirement(
+ version_compare($installedPhpVersion, '5.3.16', '!='),
+ 'PHP version must not be 5.3.16 as Symfony won\'t work properly with it',
+ 'Install PHP 5.3.17 or newer (or downgrade to an earlier PHP version)'
+ );
+
+ $this->addRequirement(
+ is_dir(__DIR__.'/../vendor/composer'),
+ 'Vendor libraries must be installed',
+ 'Vendor libraries are missing. Install composer following instructions from http://getcomposer.org/. '.
+ 'Then run "php composer.phar install" to install them.'
+ );
+
+ $cacheDir = is_dir(__DIR__.'/../var/cache') ? __DIR__.'/../var/cache' : __DIR__.'/cache';
+
+ $this->addRequirement(
+ is_writable($cacheDir),
+ 'app/cache/ or var/cache/ directory must be writable',
+ 'Change the permissions of either "app/cache/" or "var/cache/" directory so that the web server can write into it.'
+ );
+
+ $logsDir = is_dir(__DIR__.'/../var/logs') ? __DIR__.'/../var/logs' : __DIR__.'/logs';
+
+ $this->addRequirement(
+ is_writable($logsDir),
+ 'app/logs/ or var/logs/ directory must be writable',
+ 'Change the permissions of either "app/logs/" or "var/logs/" directory so that the web server can write into it.'
+ );
+
+ if (version_compare($installedPhpVersion, '7.0.0', '<')) {
+ $this->addPhpIniRequirement(
+ 'date.timezone', true, false,
+ 'date.timezone setting must be set',
+ 'Set the "date.timezone" setting in php.ini* (like Europe/Paris).'
+ );
+ }
+
+ if (false !== $requiredPhpVersion && version_compare($installedPhpVersion, $requiredPhpVersion, '>=')) {
+ $timezones = array();
+ foreach (DateTimeZone::listAbbreviations() as $abbreviations) {
+ foreach ($abbreviations as $abbreviation) {
+ $timezones[$abbreviation['timezone_id']] = true;
+ }
+ }
+
+ $this->addRequirement(
+ isset($timezones[@date_default_timezone_get()]),
+ sprintf('Configured default timezone "%s" must be supported by your installation of PHP', @date_default_timezone_get()),
+ 'Your default timezone is not supported by PHP. Check for typos in your php.ini file and have a look at the list of deprecated timezones at http://php.net/manual/en/timezones.others.php.'
+ );
+ }
+
+ $this->addRequirement(
+ function_exists('iconv'),
+ 'iconv() must be available',
+ 'Install and enable the iconv extension.'
+ );
+
+ $this->addRequirement(
+ function_exists('json_encode'),
+ 'json_encode() must be available',
+ 'Install and enable the JSON extension.'
+ );
+
+ $this->addRequirement(
+ function_exists('session_start'),
+ 'session_start() must be available',
+ 'Install and enable the session extension.'
+ );
+
+ $this->addRequirement(
+ function_exists('ctype_alpha'),
+ 'ctype_alpha() must be available',
+ 'Install and enable the ctype extension.'
+ );
+
+ $this->addRequirement(
+ function_exists('token_get_all'),
+ 'token_get_all() must be available',
+ 'Install and enable the Tokenizer extension.'
+ );
+
+ $this->addRequirement(
+ function_exists('simplexml_import_dom'),
+ 'simplexml_import_dom() must be available',
+ 'Install and enable the SimpleXML extension.'
+ );
+
+ if (function_exists('apc_store') && ini_get('apc.enabled')) {
+ if (version_compare($installedPhpVersion, '5.4.0', '>=')) {
+ $this->addRequirement(
+ version_compare(phpversion('apc'), '3.1.13', '>='),
+ 'APC version must be at least 3.1.13 when using PHP 5.4',
+ 'Upgrade your APC extension (3.1.13+).'
+ );
+ } else {
+ $this->addRequirement(
+ version_compare(phpversion('apc'), '3.0.17', '>='),
+ 'APC version must be at least 3.0.17',
+ 'Upgrade your APC extension (3.0.17+).'
+ );
+ }
+ }
+
+ $this->addPhpIniRequirement('detect_unicode', false);
+
+ if (extension_loaded('suhosin')) {
+ $this->addPhpIniRequirement(
+ 'suhosin.executor.include.whitelist',
+ create_function('$cfgValue', 'return false !== stripos($cfgValue, "phar");'),
+ false,
+ 'suhosin.executor.include.whitelist must be configured correctly in php.ini',
+ 'Add "phar" to suhosin.executor.include.whitelist in php.ini*.'
+ );
+ }
+
+ if (extension_loaded('xdebug')) {
+ $this->addPhpIniRequirement(
+ 'xdebug.show_exception_trace', false, true
+ );
+
+ $this->addPhpIniRequirement(
+ 'xdebug.scream', false, true
+ );
+
+ $this->addPhpIniRecommendation(
+ 'xdebug.max_nesting_level',
+ create_function('$cfgValue', 'return $cfgValue > 100;'),
+ true,
+ 'xdebug.max_nesting_level should be above 100 in php.ini',
+ 'Set "xdebug.max_nesting_level" to e.g. "250" in php.ini* to stop Xdebug\'s infinite recursion protection erroneously throwing a fatal error in your project.'
+ );
+ }
+
+ $pcreVersion = defined('PCRE_VERSION') ? (float) PCRE_VERSION : null;
+
+ $this->addRequirement(
+ null !== $pcreVersion,
+ 'PCRE extension must be available',
+ 'Install the PCRE extension (version 8.0+).'
+ );
+
+ if (extension_loaded('mbstring')) {
+ $this->addPhpIniRequirement(
+ 'mbstring.func_overload',
+ create_function('$cfgValue', 'return (int) $cfgValue === 0;'),
+ true,
+ 'string functions should not be overloaded',
+ 'Set "mbstring.func_overload" to 0 in php.ini* to disable function overloading by the mbstring extension.'
+ );
+ }
+
+ /* optional recommendations follow */
+
+ if (file_exists(__DIR__.'/../vendor/composer')) {
+ require_once __DIR__.'/../vendor/autoload.php';
+
+ try {
+ $r = new ReflectionClass('Sensio\Bundle\DistributionBundle\SensioDistributionBundle');
+
+ $contents = file_get_contents(dirname($r->getFileName()).'/Resources/skeleton/app/SymfonyRequirements.php');
+ } catch (ReflectionException $e) {
+ $contents = '';
+ }
+ $this->addRecommendation(
+ file_get_contents(__FILE__) === $contents,
+ 'Requirements file should be up-to-date',
+ 'Your requirements file is outdated. Run composer install and re-check your configuration.'
+ );
+ }
+
+ $this->addRecommendation(
+ version_compare($installedPhpVersion, '5.3.4', '>='),
+ 'You should use at least PHP 5.3.4 due to PHP bug #52083 in earlier versions',
+ 'Your project might malfunction randomly due to PHP bug #52083 ("Notice: Trying to get property of non-object"). Install PHP 5.3.4 or newer.'
+ );
+
+ $this->addRecommendation(
+ version_compare($installedPhpVersion, '5.3.8', '>='),
+ 'When using annotations you should have at least PHP 5.3.8 due to PHP bug #55156',
+ 'Install PHP 5.3.8 or newer if your project uses annotations.'
+ );
+
+ $this->addRecommendation(
+ version_compare($installedPhpVersion, '5.4.0', '!='),
+ 'You should not use PHP 5.4.0 due to the PHP bug #61453',
+ 'Your project might not work properly due to the PHP bug #61453 ("Cannot dump definitions which have method calls"). Install PHP 5.4.1 or newer.'
+ );
+
+ $this->addRecommendation(
+ version_compare($installedPhpVersion, '5.4.11', '>='),
+ 'When using the logout handler from the Symfony Security Component, you should have at least PHP 5.4.11 due to PHP bug #63379 (as a workaround, you can also set invalidate_session to false in the security logout handler configuration)',
+ 'Install PHP 5.4.11 or newer if your project uses the logout handler from the Symfony Security Component.'
+ );
+
+ $this->addRecommendation(
+ (version_compare($installedPhpVersion, '5.3.18', '>=') && version_compare($installedPhpVersion, '5.4.0', '<'))
+ ||
+ version_compare($installedPhpVersion, '5.4.8', '>='),
+ 'You should use PHP 5.3.18+ or PHP 5.4.8+ to always get nice error messages for fatal errors in the development environment due to PHP bug #61767/#60909',
+ 'Install PHP 5.3.18+ or PHP 5.4.8+ if you want nice error messages for all fatal errors in the development environment.'
+ );
+
+ if (null !== $pcreVersion) {
+ $this->addRecommendation(
+ $pcreVersion >= 8.0,
+ sprintf('PCRE extension should be at least version 8.0 (%s installed)', $pcreVersion),
+ 'PCRE 8.0+ is preconfigured in PHP since 5.3.2 but you are using an outdated version of it. Symfony probably works anyway but it is recommended to upgrade your PCRE extension.'
+ );
+ }
+
+ $this->addRecommendation(
+ class_exists('DomDocument'),
+ 'PHP-DOM and PHP-XML modules should be installed',
+ 'Install and enable the PHP-DOM and the PHP-XML modules.'
+ );
+
+ $this->addRecommendation(
+ function_exists('mb_strlen'),
+ 'mb_strlen() should be available',
+ 'Install and enable the mbstring extension.'
+ );
+
+ $this->addRecommendation(
+ function_exists('utf8_decode'),
+ 'utf8_decode() should be available',
+ 'Install and enable the XML extension.'
+ );
+
+ $this->addRecommendation(
+ function_exists('filter_var'),
+ 'filter_var() should be available',
+ 'Install and enable the filter extension.'
+ );
+
+ if (!defined('PHP_WINDOWS_VERSION_BUILD')) {
+ $this->addRecommendation(
+ function_exists('posix_isatty'),
+ 'posix_isatty() should be available',
+ 'Install and enable the php_posix extension (used to colorize the CLI output).'
+ );
+ }
+
+ $this->addRecommendation(
+ extension_loaded('intl'),
+ 'intl extension should be available',
+ 'Install and enable the intl extension (used for validators).'
+ );
+
+ if (extension_loaded('intl')) {
+ // in some WAMP server installations, new Collator() returns null
+ $this->addRecommendation(
+ null !== new Collator('fr_FR'),
+ 'intl extension should be correctly configured',
+ 'The intl extension does not behave properly. This problem is typical on PHP 5.3.X x64 WIN builds.'
+ );
+
+ // check for compatible ICU versions (only done when you have the intl extension)
+ if (defined('INTL_ICU_VERSION')) {
+ $version = INTL_ICU_VERSION;
+ } else {
+ $reflector = new ReflectionExtension('intl');
+
+ ob_start();
+ $reflector->info();
+ $output = strip_tags(ob_get_clean());
+
+ preg_match('/^ICU version +(?:=> )?(.*)$/m', $output, $matches);
+ $version = $matches[1];
+ }
+
+ $this->addRecommendation(
+ version_compare($version, '4.0', '>='),
+ 'intl ICU version should be at least 4+',
+ 'Upgrade your intl extension with a newer ICU version (4+).'
+ );
+
+ if (class_exists('Symfony\Component\Intl\Intl')) {
+ $this->addRecommendation(
+ \Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion(),
+ sprintf('intl ICU version installed on your system is outdated (%s) and does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()),
+ 'To get the latest internationalization data upgrade the ICU system package and the intl PHP extension.'
+ );
+ if (\Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion()) {
+ $this->addRecommendation(
+ \Symfony\Component\Intl\Intl::getIcuDataVersion() === \Symfony\Component\Intl\Intl::getIcuVersion(),
+ sprintf('intl ICU version installed on your system (%s) does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()),
+ 'To avoid internationalization data inconsistencies upgrade the symfony/intl component.'
+ );
+ }
+ }
+
+ $this->addPhpIniRecommendation(
+ 'intl.error_level',
+ create_function('$cfgValue', 'return (int) $cfgValue === 0;'),
+ true,
+ 'intl.error_level should be 0 in php.ini',
+ 'Set "intl.error_level" to "0" in php.ini* to inhibit the messages when an error occurs in ICU functions.'
+ );
+ }
+
+ $accelerator =
+ (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable'))
+ ||
+ (extension_loaded('apc') && ini_get('apc.enabled'))
+ ||
+ (extension_loaded('Zend Optimizer+') && ini_get('zend_optimizerplus.enable'))
+ ||
+ (extension_loaded('Zend OPcache') && ini_get('opcache.enable'))
+ ||
+ (extension_loaded('xcache') && ini_get('xcache.cacher'))
+ ||
+ (extension_loaded('wincache') && ini_get('wincache.ocenabled'))
+ ;
+
+ $this->addRecommendation(
+ $accelerator,
+ 'a PHP accelerator should be installed',
+ 'Install and/or enable a PHP accelerator (highly recommended).'
+ );
+
+ if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
+ $this->addRecommendation(
+ $this->getRealpathCacheSize() >= 5 * 1024 * 1024,
+ 'realpath_cache_size should be at least 5M in php.ini',
+ 'Setting "realpath_cache_size" to e.g. "5242880" or "5M" in php.ini* may improve performance on Windows significantly in some cases.'
+ );
+ }
+
+ $this->addPhpIniRecommendation('short_open_tag', false);
+
+ $this->addPhpIniRecommendation('magic_quotes_gpc', false, true);
+
+ $this->addPhpIniRecommendation('register_globals', false, true);
+
+ $this->addPhpIniRecommendation('session.auto_start', false);
+
+ $this->addRecommendation(
+ class_exists('PDO'),
+ 'PDO should be installed',
+ 'Install PDO (mandatory for Doctrine).'
+ );
+
+ if (class_exists('PDO')) {
+ $drivers = PDO::getAvailableDrivers();
+ $this->addRecommendation(
+ count($drivers) > 0,
+ sprintf('PDO should have some drivers installed (currently available: %s)', count($drivers) ? implode(', ', $drivers) : 'none'),
+ 'Install PDO drivers (mandatory for Doctrine).'
+ );
+ }
+ }
+
+ /**
+ * Loads realpath_cache_size from php.ini and converts it to int.
+ *
+ * (e.g. 16k is converted to 16384 int)
+ *
+ * @return int
+ */
+ protected function getRealpathCacheSize()
+ {
+ $size = ini_get('realpath_cache_size');
+ $size = trim($size);
+ $unit = '';
+ if (!ctype_digit($size)) {
+ $unit = strtolower(substr($size, -1, 1));
+ $size = (int) substr($size, 0, -1);
+ }
+ switch ($unit) {
+ case 'g':
+ return $size * 1024 * 1024 * 1024;
+ case 'm':
+ return $size * 1024 * 1024;
+ case 'k':
+ return $size * 1024;
+ default:
+ return (int) $size;
+ }
+ }
+
+ /**
+ * Defines PHP required version from Symfony version.
+ *
+ * @return string|false The PHP required version or false if it could not be guessed
+ */
+ protected function getPhpRequiredVersion()
+ {
+ if (!file_exists($path = __DIR__.'/../composer.lock')) {
+ return false;
+ }
+
+ $composerLock = json_decode(file_get_contents($path), true);
+ foreach ($composerLock['packages'] as $package) {
+ $name = $package['name'];
+ if ('symfony/symfony' !== $name && 'symfony/http-kernel' !== $name) {
+ continue;
+ }
+
+ return (int) $package['version'][1] > 2 ? self::REQUIRED_PHP_VERSION : self::LEGACY_REQUIRED_PHP_VERSION;
+ }
+
+ return false;
+ }
+}
diff --git a/tests/Frameworks/Symfony/Version_3_3/var/cache/.gitkeep b/tests/Frameworks/Symfony/Version_3_3/var/cache/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/Frameworks/Symfony/Version_3_3/var/logs/.gitkeep b/tests/Frameworks/Symfony/Version_3_3/var/logs/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/Frameworks/Symfony/Version_3_3/var/sessions/.gitkeep b/tests/Frameworks/Symfony/Version_3_3/var/sessions/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/tests/Frameworks/Symfony/Version_3_3/web/.htaccess b/tests/Frameworks/Symfony/Version_3_3/web/.htaccess
new file mode 100644
index 0000000000..4dc725167d
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/web/.htaccess
@@ -0,0 +1,68 @@
+# Use the front controller as index file. It serves as a fallback solution when
+# every other rewrite/redirect fails (e.g. in an aliased environment without
+# mod_rewrite). Additionally, this reduces the matching process for the
+# start page (path "/") because otherwise Apache will apply the rewriting rules
+# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
+DirectoryIndex app.php
+
+# By default, Apache does not evaluate symbolic links if you did not enable this
+# feature in your server configuration. Uncomment the following line if you
+# install assets as symlinks or if you experience problems related to symlinks
+# when compiling LESS/Sass/CoffeScript assets.
+# Options FollowSymlinks
+
+# Disabling MultiViews prevents unwanted negotiation, e.g. "/app" should not resolve
+# to the front controller "/app.php" but be rewritten to "/app.php/app".
+
+ Options -MultiViews
+
+
+
+ RewriteEngine On
+
+ # Determine the RewriteBase automatically and set it as environment variable.
+ # If you are using Apache aliases to do mass virtual hosting or installed the
+ # project in a subdirectory, the base path will be prepended to allow proper
+ # resolution of the app.php file and to redirect to the correct URI. It will
+ # work in environments without path prefix as well, providing a safe, one-size
+ # fits all solution. But as you do not need it in this case, you can comment
+ # the following 2 lines to eliminate the overhead.
+ RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
+ RewriteRule ^(.*) - [E=BASE:%1]
+
+ # Sets the HTTP_AUTHORIZATION header removed by Apache
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Redirect to URI without front controller to prevent duplicate content
+ # (with and without `/app.php`). Only do this redirect on the initial
+ # rewrite by Apache and not on subsequent cycles. Otherwise we would get an
+ # endless redirect loop (request -> rewrite to front controller ->
+ # redirect -> request -> ...).
+ # So in case you get a "too many redirects" error or you always get redirected
+ # to the start page because your Apache does not expose the REDIRECT_STATUS
+ # environment variable, you have 2 choices:
+ # - disable this feature by commenting the following 2 lines or
+ # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
+ # following RewriteCond (best solution)
+ RewriteCond %{ENV:REDIRECT_STATUS} ^$
+ RewriteRule ^app\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
+
+ # If the requested filename exists, simply serve it.
+ # We only want to let Apache serve files and not directories.
+ RewriteCond %{REQUEST_FILENAME} -f
+ RewriteRule ^ - [L]
+
+ # Rewrite all other queries to the front controller.
+ RewriteRule ^ %{ENV:BASE}/app.php [L]
+
+
+
+
+ # When mod_rewrite is not available, we instruct a temporary redirect of
+ # the start page to the front controller explicitly so that the website
+ # and the generated links can still be used.
+ RedirectMatch 302 ^/$ /app.php/
+ # RedirectTemp cannot be used instead
+
+
diff --git a/tests/Frameworks/Symfony/Version_3_3/web/app.php b/tests/Frameworks/Symfony/Version_3_3/web/app.php
new file mode 100644
index 0000000000..943d0898f1
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/web/app.php
@@ -0,0 +1,21 @@
+loadClassCache();
+}
+//$kernel = new AppCache($kernel);
+
+// When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter
+//Request::enableHttpMethodParameterOverride();
+$request = Request::createFromGlobals();
+$response = $kernel->handle($request);
+$response->send();
+$kernel->terminate($request, $response);
diff --git a/tests/Frameworks/Symfony/Version_3_3/web/app_dev.php b/tests/Frameworks/Symfony/Version_3_3/web/app_dev.php
new file mode 100644
index 0000000000..d2ff583b23
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/web/app_dev.php
@@ -0,0 +1,31 @@
+loadClassCache();
+}
+$request = Request::createFromGlobals();
+$response = $kernel->handle($request);
+$response->send();
+$kernel->terminate($request, $response);
diff --git a/tests/Frameworks/Symfony/Version_3_3/web/apple-touch-icon.png b/tests/Frameworks/Symfony/Version_3_3/web/apple-touch-icon.png
new file mode 100644
index 0000000000..6e6b6ce170
Binary files /dev/null and b/tests/Frameworks/Symfony/Version_3_3/web/apple-touch-icon.png differ
diff --git a/tests/Frameworks/Symfony/Version_3_3/web/config.php b/tests/Frameworks/Symfony/Version_3_3/web/config.php
new file mode 100644
index 0000000000..fd7e17e6b6
--- /dev/null
+++ b/tests/Frameworks/Symfony/Version_3_3/web/config.php
@@ -0,0 +1,422 @@
+getFailedRequirements();
+$minorProblems = $symfonyRequirements->getFailedRecommendations();
+$hasMajorProblems = (bool) count($majorProblems);
+$hasMinorProblems = (bool) count($minorProblems);
+
+?>
+
+
+
+
+
+ Symfony Configuration Checker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Configuration Checker
+
+ This script analyzes your system to check whether is
+ ready to run Symfony applications.
+
+
+
+
Major problems
+
Major problems have been detected and must be fixed before continuing:
+
+
+
getTestMessage() ?>
+
getHelpHtml() ?>
+
+
+
+
+
+
+
Recommendations
+
+ Additionally, toTo enhance your Symfony experience,
+ it’s recommended that you fix the following:
+
+
+
+
getTestMessage() ?>
+
getHelpHtml() ?>
+
+
+
+
+
+ hasPhpIniConfigIssue()): ?>
+
*
+ getPhpIniConfigPath()): ?>
+ Changes to the php.ini file must be done in "getPhpIniConfigPath() ?>".
+
+ To change settings, create a "php.ini".
+
+
+
+
+
+
All checks passed successfully. Your system is ready to run Symfony applications.