summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Pott2015-11-03 17:27:58 (GMT)
committerAlex Pott2015-11-03 17:27:58 (GMT)
commit7d05e583e1e5457ecc3f21205415ef5d46034f82 (patch)
tree5907bbca5d7a06567088d26c148eb6c6c008ac80
parent2d342c0f63da56bdc9262851c36c6a85a7ac5c96 (diff)
Revert "Issue #2510380 by Wim Leers, DuaelFr, mlewand, quicksketch, Reinmar, oleq: Images cannot be linked in CKEditor"
This reverts commit 2d342c0f63da56bdc9262851c36c6a85a7ac5c96.
-rw-r--r--core/modules/ckeditor/js/plugins/drupalimage/plugin.js110
-rw-r--r--core/modules/ckeditor/js/plugins/drupalimagecaption/plugin.js22
-rw-r--r--core/modules/ckeditor/js/plugins/drupallink/plugin.js76
-rw-r--r--core/modules/filter/src/Plugin/Filter/FilterCaption.php6
-rw-r--r--core/modules/filter/src/Tests/FilterUnitTest.php14
-rw-r--r--core/modules/simpletest/simpletest.module19
-rwxr-xr-xcore/scripts/run-tests.sh245
7 files changed, 97 insertions, 395 deletions
diff --git a/core/modules/ckeditor/js/plugins/drupalimage/plugin.js b/core/modules/ckeditor/js/plugins/drupalimage/plugin.js
index c481264..80921c2 100644
--- a/core/modules/ckeditor/js/plugins/drupalimage/plugin.js
+++ b/core/modules/ckeditor/js/plugins/drupalimage/plugin.js
@@ -65,11 +65,14 @@
}
widgetDefinition.allowedContent = new CKEDITOR.style(allowedContentDefinition);
+ // Override the 'link' part, to completely disable image2's link
+ // support: http://dev.ckeditor.com/ticket/11341.
+ widgetDefinition.parts.link = 'This is a nonsensical selector to disable this functionality completely';
+
// Override downcast(): since we only accept <img> in our upcast method,
// the element is already correct. We only need to update the element's
// data-entity-uuid attribute.
widgetDefinition.downcast = function (element) {
- element.attributes['data-entity-type'] = this.data['data-entity-type'];
element.attributes['data-entity-uuid'] = this.data['data-entity-uuid'];
};
@@ -173,18 +176,6 @@
return widget;
};
};
-
- var originalInit = widgetDefinition.init;
- widgetDefinition.init = function () {
- originalInit.call(this);
-
- // Update data.link object with attributes if the link has been
- // discovered.
- // @see plugins/image2/plugin.js/init() in CKEditor; this is similar.
- if (this.parts.link) {
- this.setData('link', CKEDITOR.plugins.link.parseLinkAttributes(editor, this.parts.link));
- }
- };
});
// Add a widget#edit listener to every instance of image2 widget in order
@@ -242,86 +233,25 @@
}
},
+ // Disable image2's integration with the link/drupallink plugins: don't
+ // allow the widget itself to become a link. Support for that may be added
+ // by an text filter that adds a data- attribute specifically for that.
afterInit: function (editor) {
- linkCommandIntegrator(editor);
- }
-
- });
-
- /**
- * Integrates the drupalimage widget with the drupallink plugin.
- *
- * Makes images linkable.
- *
- * @param {CKEDITOR.editor} editor
- * A CKEditor instance.
- */
- function linkCommandIntegrator(editor) {
- // Nothing to integrate with if the drupallink plugin is not loaded.
- if (!editor.plugins.drupallink) {
- return;
- }
-
- // Override default behaviour of 'drupalunlink' command.
- editor.getCommand('drupalunlink').on('exec', function (evt) {
- var widget = getFocusedWidget(editor);
-
- // Override 'drupalunlink' only when link truly belongs to the widget. If
- // wrapped inline widget in a link, let default unlink work.
- // @see https://dev.ckeditor.com/ticket/11814
- if (!widget || !widget.parts.link) {
- return;
- }
-
- widget.setData('link', null);
-
- // Selection (which is fake) may not change if unlinked image in focused
- // widget, i.e. if captioned image. Let's refresh command state manually
- // here.
- this.refresh(editor, editor.elementPath());
-
- evt.cancel();
- });
-
- // Override default refresh of 'drupalunlink' command.
- editor.getCommand('drupalunlink').on('refresh', function (evt) {
- var widget = getFocusedWidget(editor);
-
- if (!widget) {
- return;
+ if (editor.plugins.drupallink) {
+ var cmd = editor.getCommand('drupallink');
+ // Needs to be refreshed on selection changes.
+ cmd.contextSensitive = 1;
+ // Disable command and cancel event when the image widget is selected.
+ cmd.on('refresh', function (evt) {
+ var widget = editor.widgets.focused;
+ if (widget && widget.name === 'image') {
+ this.setState(CKEDITOR.TRISTATE_DISABLED);
+ evt.cancel();
+ }
+ });
}
-
- // Note that widget may be wrapped in a link, which
- // does not belong to that widget (#11814).
- this.setState(widget.data.link || widget.wrapper.getAscendant('a') ?
- CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED);
-
- evt.cancel();
- });
- }
-
- /**
- * Gets the focused widget, if of the type specific for this plugin.
- *
- * @param {CKEDITOR.editor} editor
- * A CKEditor instance.
- *
- * @return {?CKEDITOR.plugins.widget}
- * The focused image2 widget instance, or null.
- */
- function getFocusedWidget(editor) {
- var widget = editor.widgets.focused;
-
- if (widget && widget.name === 'image') {
- return widget;
}
- return null;
- }
-
- // Expose an API for other plugins to interact with drupalimage widgets.
- CKEDITOR.plugins.drupalimage = {
- getFocusedWidget: getFocusedWidget
- };
+ });
})(jQuery, Drupal, CKEDITOR);
diff --git a/core/modules/ckeditor/js/plugins/drupalimagecaption/plugin.js b/core/modules/ckeditor/js/plugins/drupalimagecaption/plugin.js
index 9fba103..8dd91b1 100644
--- a/core/modules/ckeditor/js/plugins/drupalimagecaption/plugin.js
+++ b/core/modules/ckeditor/js/plugins/drupalimagecaption/plugin.js
@@ -71,9 +71,10 @@
// data-caption attributes.
var originalDowncast = widgetDefinition.downcast;
widgetDefinition.downcast = function (element) {
- var img = findElementByName(element, 'img');
- originalDowncast.call(this, img);
-
+ var img = originalDowncast.call(this, element);
+ if (!img) {
+ img = findElementByName(element, 'img');
+ }
var caption = this.editables.caption;
var captionHtml = caption && caption.getData();
var attrs = img.attributes;
@@ -90,14 +91,10 @@
attrs['data-align'] = this.data.align;
}
}
+ attrs['data-entity-type'] = this.data['data-entity-type'];
+ attrs['data-entity-uuid'] = this.data['data-entity-uuid'];
- // If img is wrapped with a link, we want to return that link.
- if (img.parent.name === 'a') {
- return img.parent;
- }
- else {
- return img;
- }
+ return img;
};
// We want to upcast <img> elements to a DOM structure required by the
@@ -118,11 +115,6 @@
element = originalUpcast.call(this, element, data);
var attrs = element.attributes;
-
- if (element.parent.name === 'a') {
- element = element.parent;
- }
-
var retElement = element;
var caption;
diff --git a/core/modules/ckeditor/js/plugins/drupallink/plugin.js b/core/modules/ckeditor/js/plugins/drupallink/plugin.js
index 2cc9bc1..e9fb555 100644
--- a/core/modules/ckeditor/js/plugins/drupallink/plugin.js
+++ b/core/modules/ckeditor/js/plugins/drupallink/plugin.js
@@ -31,8 +31,6 @@
modes: {wysiwyg: 1},
canUndo: true,
exec: function (editor) {
- var drupalImageUtils = CKEDITOR.plugins.drupalimage;
- var focusedImageWidget = drupalImageUtils && drupalImageUtils.getFocusedWidget(editor);
var linkElement = getSelectedLink(editor);
var linkDOMElement = null;
@@ -58,30 +56,9 @@
existingValues[attributeName] = linkElement.data('cke-saved-' + attributeName) || attribute.nodeValue;
}
}
- // Or, if an image widget is focused, we're editing a link wrapping
- // an image widget.
- else if (focusedImageWidget && focusedImageWidget.data.link) {
- var url = focusedImageWidget.data.link.url;
- existingValues.href = url.protocol + url.url;
- }
// Prepare a save callback to be used upon saving the dialog.
var saveCallback = function (returnValues) {
- // If an image widget is focused, we're not editing an independent
- // link, but we're wrapping an image widget in a link.
- if (focusedImageWidget) {
- var urlMatch = returnValues.attributes.href.match(urlRegex);
- focusedImageWidget.setData('link', {
- type: 'url',
- url: {
- protocol: urlMatch[1],
- url: urlMatch[2]
- }
- });
- editor.fire('saveSnapshot');
- return;
- }
-
editor.fire('saveSnapshot');
// Create a new link element if needed.
@@ -279,57 +256,4 @@
return null;
}
- var urlRegex = /^((?:http|https):\/\/)?(.*)$/;
-
- /**
- * The image2 plugin is currently tightly coupled to the link plugin: it
- * calls CKEDITOR.plugins.link.parseLinkAttributes().
- *
- * Drupal 8's CKEditor build doesn't include the 'link' plugin. Because it
- * includes its own link plugin that integrates with Drupal's dialog system.
- * So, to allow images to be linked, we need to duplicate the necessary subset
- * of the logic.
- *
- * @todo Remove once we update to CKEditor 4.5.5.
- * @see https://dev.ckeditor.com/ticket/13885
- */
- CKEDITOR.plugins.link = CKEDITOR.plugins.link || {
- parseLinkAttributes: function (editor, element) {
- var href = (element && (element.data('cke-saved-href') || element.getAttribute('href'))) || '';
- var urlMatch = href.match(urlRegex);
- return {
- type: 'url',
- url: {
- protocol: urlMatch[1],
- url: urlMatch[2]
- }
- };
- },
- getLinkAttributes: function (editor, data) {
- var set = {};
-
- var protocol = (data.url && typeof data.url.protocol !== 'undefined') ? data.url.protocol : 'http://';
- var url = (data.url && CKEDITOR.tools.trim(data.url.url)) || '';
- set['data-cke-saved-href'] = (url.indexOf('/') === 0) ? url : protocol + url;
-
- // Browser need the "href" fro copy/paste link to work. (#6641)
- if (set['data-cke-saved-href']) {
- set.href = set['data-cke-saved-href'];
- }
-
- // Remove all attributes which are not currently set.
- var removed = {};
- for (var s in set) {
- if (set.hasOwnProperty(s)) {
- delete removed[s];
- }
- }
-
- return {
- set: set,
- removed: CKEDITOR.tools.objectKeys(removed)
- };
- }
- };
-
})(jQuery, Drupal, drupalSettings, CKEDITOR);
diff --git a/core/modules/filter/src/Plugin/Filter/FilterCaption.php b/core/modules/filter/src/Plugin/Filter/FilterCaption.php
index 76a1125..37c18cc 100644
--- a/core/modules/filter/src/Plugin/Filter/FilterCaption.php
+++ b/core/modules/filter/src/Plugin/Filter/FilterCaption.php
@@ -55,17 +55,15 @@ class FilterCaption extends FilterBase {
// Given the updated node and caption: re-render it with a caption, but
// bubble up the value of the class attribute of the captioned element,
// this allows it to collaborate with e.g. the filter_align filter.
- $tag = $node->tagName;
$classes = $node->getAttribute('class');
$node->removeAttribute('class');
- $node = ($node->parentNode->tagName === 'a') ? $node->parentNode : $node;
$filter_caption = array(
'#theme' => 'filter_caption',
// We pass the unsanitized string because this is a text format
// filter, and after filtering, we always assume the output is safe.
// @see \Drupal\filter\Element\ProcessedText::preRenderText()
'#node' => FilteredMarkup::create($node->C14N()),
- '#tag' => $tag,
+ '#tag' => $node->tagName,
'#caption' => $caption,
'#classes' => $classes,
);
@@ -80,7 +78,7 @@ class FilterCaption extends FilterBase {
// Import the updated node from the new DOMDocument into the original
// one, importing also the child nodes of the updated node.
$updated_node = $dom->importNode($updated_node, TRUE);
- // Finally, replace the original node with the new node.
+ // Finally, replace the original image node with the new image node!
$node->parentNode->replaceChild($updated_node, $node);
}
diff --git a/core/modules/filter/src/Tests/FilterUnitTest.php b/core/modules/filter/src/Tests/FilterUnitTest.php
index 801db4e..54a738d 100644
--- a/core/modules/filter/src/Tests/FilterUnitTest.php
+++ b/core/modules/filter/src/Tests/FilterUnitTest.php
@@ -184,13 +184,6 @@ class FilterUnitTest extends KernelTestBase {
$this->assertIdentical($expected, $output->getProcessedText());
$this->assertIdentical($attached_library, $output->getAttachments());
- // Ensure the caption filter works for linked images.
- $input = '<a href="http://example.com/llamas/are/awesome/but/kittens/are/cool/too"><img src="llama.jpg" data-caption="Loquacious llama!" /></a>';
- $expected = '<figure role="group"><a href="http://example.com/llamas/are/awesome/but/kittens/are/cool/too"><img src="llama.jpg" /></a>' . "\n" . '<figcaption>Loquacious llama!</figcaption></figure>';
- $output = $test($input);
- $this->assertIdentical($expected, $output->getProcessedText());
- $this->assertIdentical($attached_library, $output->getAttachments());
-
// So far we've tested that the caption filter works correctly. But we also
// want to make sure that it works well in tandem with the "Limit allowed
// HTML tags" filter, which it is typically used with.
@@ -308,13 +301,6 @@ class FilterUnitTest extends KernelTestBase {
$output = $test($input);
$this->assertIdentical($expected, $output->getProcessedText());
$this->assertIdentical($attached_library, $output->getAttachments());
-
- // Ensure both filters together work for linked images.
- $input = '<a href="http://example.com/llamas/are/awesome/but/kittens/are/cool/too"><img src="llama.jpg" data-caption="Loquacious llama!" data-align="center" /></a>';
- $expected = '<figure role="group" class="align-center"><a href="http://example.com/llamas/are/awesome/but/kittens/are/cool/too"><img src="llama.jpg" /></a>' . "\n" . '<figcaption>Loquacious llama!</figcaption></figure>';
- $output = $test($input);
- $this->assertIdentical($expected, $output->getProcessedText());
- $this->assertIdentical($attached_library, $output->getAttachments());
}
/**
diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module
index 74d348e..b994352 100644
--- a/core/modules/simpletest/simpletest.module
+++ b/core/modules/simpletest/simpletest.module
@@ -170,20 +170,17 @@ function simpletest_run_tests($test_list) {
* @param $unescaped_test_classnames
* An array of test class names, including full namespaces, to be passed as
* a regular expression to PHPUnit's --filter option.
- * @param int $status
- * (optional) The exit status code of the PHPUnit process will be assigned to
- * this variable.
*
* @return array
* The parsed results of PHPUnit's JUnit XML output, in the format of
* {simpletest}'s schema.
*/
-function simpletest_run_phpunit_tests($test_id, array $unescaped_test_classnames, &$status = NULL) {
+function simpletest_run_phpunit_tests($test_id, array $unescaped_test_classnames) {
$phpunit_file = simpletest_phpunit_xml_filepath($test_id);
- simpletest_phpunit_run_command($unescaped_test_classnames, $phpunit_file, $status);
- // A $status of 0 = passed test, 1 = failed test, > 1 indicates segfault
+ $ret = simpletest_phpunit_run_command($unescaped_test_classnames, $phpunit_file);
+ // A return value of 0 = passed test, 1 = failed test, > 1 indicates segfault
// timeout, or other type of failure.
- if ($status > 1) {
+ if ($ret > 1) {
// Something broke during the execution of phpunit.
// Return an error record of all failed classes.
$rows[] = [
@@ -254,14 +251,11 @@ function simpletest_phpunit_configuration_filepath() {
* a regular expression to PHPUnit's --filter option.
* @param string $phpunit_file
* A filepath to use for PHPUnit's --log-junit option.
- * @param int $status
- * (optional) The exit status code of the PHPUnit process will be assigned to
- * this variable.
*
* @return string
* The results as returned by exec().
*/
-function simpletest_phpunit_run_command(array $unescaped_test_classnames, $phpunit_file, &$status = NULL) {
+function simpletest_phpunit_run_command(array $unescaped_test_classnames, $phpunit_file) {
// Setup an environment variable containing the database connection so that
// functional tests can connect to the database.
putenv('SIMPLETEST_DB=' . Database::getConnectionInfoAsUrl());
@@ -298,8 +292,7 @@ function simpletest_phpunit_run_command(array $unescaped_test_classnames, $phpun
// exec in a subshell so that the environment is isolated when running tests
// via the simpletest UI.
- $ret = exec(join($command, " "), $output, $status);
-
+ exec(join($command, " "), $output, $ret);
chdir($old_cwd);
putenv('SIMPLETEST_DB=');
return $ret;
diff --git a/core/scripts/run-tests.sh b/core/scripts/run-tests.sh
index 0ad9a5c..9ca309f 100755
--- a/core/scripts/run-tests.sh
+++ b/core/scripts/run-tests.sh
@@ -23,68 +23,46 @@ const SIMPLETEST_SCRIPT_COLOR_EXCEPTION = 33; // Brown.
// Restricting the chunk of queries prevents memory exhaustion.
const SIMPLETEST_SCRIPT_SQLITE_VARIABLE_LIMIT = 350;
-const SIMPLETEST_SCRIPT_EXIT_SUCCESS = 0;
-const SIMPLETEST_SCRIPT_EXIT_FAILURE = 1;
-const SIMPLETEST_SCRIPT_EXIT_EXCEPTION = 2;
-
// Set defaults and get overrides.
list($args, $count) = simpletest_script_parse_args();
if ($args['help'] || $count == 0) {
simpletest_script_help();
- exit(($count == 0) ? SIMPLETEST_SCRIPT_EXIT_FAILURE : SIMPLETEST_SCRIPT_EXIT_SUCCESS);
+ exit;
}
simpletest_script_init();
-try {
- $request = Request::createFromGlobals();
- $kernel = TestRunnerKernel::createFromRequest($request, $autoloader);
- $kernel->prepareLegacyRequest($request);
-}
-catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
-}
+$request = Request::createFromGlobals();
+$kernel = TestRunnerKernel::createFromRequest($request, $autoloader);
+$kernel->prepareLegacyRequest($request);
if ($args['execute-test']) {
simpletest_script_setup_database();
simpletest_script_run_one_test($args['test-id'], $args['execute-test']);
// Sub-process exited already; this is just for clarity.
- exit(SIMPLETEST_SCRIPT_EXIT_SUCCESS);
+ exit;
}
if ($args['list']) {
// Display all available tests.
echo "\nAvailable test groups & classes\n";
echo "-------------------------------\n\n";
- try {
- $groups = simpletest_test_get_all($args['module']);
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ $groups = simpletest_test_get_all($args['module']);
foreach ($groups as $group => $tests) {
echo $group . "\n";
foreach ($tests as $class => $info) {
echo " - $class\n";
}
}
- exit(SIMPLETEST_SCRIPT_EXIT_SUCCESS);
+ exit;
}
simpletest_script_setup_database(TRUE);
if ($args['clean']) {
// Clean up left-over tables and directories.
- try {
- simpletest_clean_environment();
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ simpletest_clean_environment();
echo "\nEnvironment cleaned.\n";
// Get the status messages and print them.
@@ -92,7 +70,7 @@ if ($args['clean']) {
foreach ($messages['status'] as $text) {
echo " - " . $text . "\n";
}
- exit(SIMPLETEST_SCRIPT_EXIT_SUCCESS);
+ exit;
}
$test_list = simpletest_script_get_test_list();
@@ -107,7 +85,7 @@ for ($i = 0; $i < $args['repeat']; $i++) {
}
// Execute tests.
-$status = simpletest_script_execute_batch($tests_to_run);
+simpletest_script_execute_batch($tests_to_run);
// Stop the timer.
simpletest_script_reporter_timer_stop();
@@ -126,17 +104,11 @@ if ($args['xml']) {
// Clean up all test results.
if (!$args['keep-results']) {
- try {
- simpletest_clean_results_table();
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ simpletest_clean_results_table();
}
// Test complete, exit.
-exit($status);
+exit;
/**
* Print help text.
@@ -323,7 +295,7 @@ function simpletest_script_parse_args() {
else {
// Argument not found in list.
simpletest_script_print_error("Unknown argument '$arg'.");
- exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
+ exit;
}
}
else {
@@ -336,7 +308,7 @@ function simpletest_script_parse_args() {
// Validate the concurrency argument
if (!is_numeric($args['concurrency']) || $args['concurrency'] <= 0) {
simpletest_script_print_error("--concurrency must be a strictly positive integer.");
- exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
+ exit;
}
if ($args['browser']) {
@@ -371,7 +343,7 @@ function simpletest_script_init() {
else {
simpletest_script_print_error('Unable to automatically determine the path to the PHP interpreter. Supply the --php command line argument.');
simpletest_script_help();
- exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
+ exit();
}
// Get URL from arguments.
@@ -469,7 +441,7 @@ function simpletest_script_setup_database($new = FALSE) {
}
catch (\InvalidArgumentException $e) {
simpletest_script_print_error('Invalid --dburl. Reason: ' . $e->getMessage());
- exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
+ exit(1);
}
}
// Otherwise, use the default database connection from settings.php.
@@ -480,7 +452,7 @@ function simpletest_script_setup_database($new = FALSE) {
// If there is no default database connection for tests, we cannot continue.
if (!isset($databases['default']['default'])) {
simpletest_script_print_error('Missing default database connection for tests. Use --dburl to specify one.');
- exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
+ exit(1);
}
Database::addConnectionInfo('default', 'default', $databases['default']['default']);
@@ -524,33 +496,21 @@ function simpletest_script_setup_database($new = FALSE) {
}
catch (\PDOException $e) {
simpletest_script_print_error($databases['test-runner']['default']['driver'] . ': ' . $e->getMessage());
- exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
+ exit(1);
}
if ($new && $sqlite) {
require_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'simpletest') . '/simpletest.install';
foreach (simpletest_schema() as $name => $table_spec) {
- try {
- if ($schema->tableExists($name)) {
- $schema->dropTable($name);
- }
- $schema->createTable($name, $table_spec);
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
+ if ($schema->tableExists($name)) {
+ $schema->dropTable($name);
}
+ $schema->createTable($name, $table_spec);
}
}
// Verify that the Simpletest database schema exists by checking one table.
- try {
- if (!$schema->tableExists('simpletest')) {
- simpletest_script_print_error('Missing Simpletest database schema. Either install Simpletest module or use the --sqlite parameter.');
- exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
- }
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
+ if (!$schema->tableExists('simpletest')) {
+ simpletest_script_print_error('Missing Simpletest database schema. Either install Simpletest module or use the --sqlite parameter.');
+ exit(1);
}
}
@@ -560,8 +520,6 @@ function simpletest_script_setup_database($new = FALSE) {
function simpletest_script_execute_batch($test_classes) {
global $args, $test_ids;
- $total_status = SIMPLETEST_SCRIPT_EXIT_SUCCESS;
-
// Multi-process execution.
$children = array();
while (!empty($test_classes) || !empty($children)) {
@@ -570,16 +528,8 @@ function simpletest_script_execute_batch($test_classes) {
break;
}
- try {
- $test_id = Database::getConnection('default', 'test-runner')
- ->insert('simpletest_test_id')
- ->useDefaults(array('test_id'))
- ->execute();
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ $test_id = Database::getConnection('default', 'test-runner')
+ ->insert('simpletest_test_id')->useDefaults(array('test_id'))->execute();
$test_ids[] = $test_id;
$test_class = array_shift($test_classes);
@@ -589,7 +539,7 @@ function simpletest_script_execute_batch($test_classes) {
if (!is_resource($process)) {
echo "Unable to fork test process. Aborting.\n";
- exit(SIMPLETEST_SCRIPT_EXIT_SUCCESS);
+ exit;
}
// Register our new child.
@@ -610,11 +560,7 @@ function simpletest_script_execute_batch($test_classes) {
if (empty($status['running'])) {
// The child exited, unregister it.
proc_close($child['process']);
- if ($status['exitcode'] === SIMPLETEST_SCRIPT_EXIT_FAILURE) {
- $total_status = max($status['exitcode'], $total_status);
- }
- elseif ($status['exitcode']) {
- $total_status = $status['exitcode'];
+ if ($status['exitcode']) {
echo 'FATAL ' . $child['class'] . ': test runner returned a non-zero error code (' . $status['exitcode'] . ').' . "\n";
if ($args['die-on-fail']) {
list($db_prefix, ) = simpletest_last_test_get($child['test_id']);
@@ -635,19 +581,19 @@ function simpletest_script_execute_batch($test_classes) {
}
}
}
- return $total_status;
}
/**
* Run a group of phpunit tests.
*/
function simpletest_script_run_phpunit($test_id, $class) {
+
$reflection = new \ReflectionClass($class);
if ($reflection->hasProperty('runLimit')) {
set_time_limit($reflection->getStaticPropertyValue('runLimit'));
}
- $results = simpletest_run_phpunit_tests($test_id, array($class), $status);
+ $results = simpletest_run_phpunit_tests($test_id, array($class));
simpletest_process_phpunit_results($results);
// Map phpunit results to a data structure we can pass to
@@ -682,7 +628,6 @@ function simpletest_script_run_phpunit($test_id, $class) {
foreach ($summaries as $class => $summary) {
simpletest_script_reporter_display_summary($class, $summary);
}
- return $status;
}
/**
@@ -703,28 +648,23 @@ function simpletest_script_run_one_test($test_id, $test_class) {
}
$test = new $class_name($test_id);
if (is_subclass_of($test_class, '\PHPUnit_Framework_TestCase')) {
- $status = simpletest_script_run_phpunit($test_id, $test_class);
+ simpletest_script_run_phpunit($test_id, $test_class);
}
else {
$test->dieOnFail = (bool) $args['die-on-fail'];
$test->verbose = (bool) $args['verbose'];
$test->run($methods);
simpletest_script_reporter_display_summary($test_class, $test->results);
-
- $status = SIMPLETEST_SCRIPT_EXIT_SUCCESS;
- // Finished, kill this runner.
- if ($test->results['#fail'] || $test->results['#exception']) {
- $status = SIMPLETEST_SCRIPT_EXIT_FAILURE;
- }
}
- exit($status);
+ // Finished, kill this runner.
+ exit(0);
}
// DrupalTestCase::run() catches exceptions already, so this is only reached
// when an exception is thrown in the wrapping test runner environment.
catch (Exception $e) {
echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
+ exit(1);
}
}
@@ -786,13 +726,7 @@ function simpletest_script_cleanup($test_id, $test_class, $exitcode) {
return;
}
// Retrieve the last database prefix used for testing.
- try {
- list($db_prefix,) = simpletest_last_test_get($test_id);
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ list($db_prefix, ) = simpletest_last_test_get($test_id);
// If no database prefix was found, then the test was not set up correctly.
if (empty($db_prefix)) {
@@ -807,13 +741,7 @@ function simpletest_script_cleanup($test_id, $test_class, $exitcode) {
$messages[] = "- Found database prefix '$db_prefix' for test ID $test_id.";
// Read the log file in case any fatal errors caused the test to crash.
- try {
- simpletest_log_read($test_id, $db_prefix, $test_class);
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ simpletest_log_read($test_id, $db_prefix, $test_class);
// Check whether a test site directory was setup already.
// @see \Drupal\simpletest\TestBase::prepareEnvironment()
@@ -835,19 +763,12 @@ function simpletest_script_cleanup($test_id, $test_class, $exitcode) {
}
// Clear out all database tables from the test.
- try {
- $schema = Database::getConnection('default', 'default')->schema();
- $count = 0;
- foreach ($schema->findTables($db_prefix . '%') as $table) {
- $schema->dropTable($table);
- $count++;
- }
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
+ $schema = Database::getConnection('default', 'default')->schema();
+ $count = 0;
+ foreach ($schema->findTables($db_prefix . '%') as $table) {
+ $schema->dropTable($table);
+ $count++;
}
-
if ($count) {
$messages[] = "- Removed $count leftover tables.";
}
@@ -871,13 +792,7 @@ function simpletest_script_get_test_list() {
$test_list = array();
if ($args['all'] || $args['module']) {
- try {
- $groups = simpletest_test_get_all($args['module']);
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ $groups = simpletest_test_get_all($args['module']);
$all_tests = array();
foreach ($groups as $group => $tests) {
$all_tests = array_merge($all_tests, array_keys($tests));
@@ -893,20 +808,14 @@ function simpletest_script_get_test_list() {
$test_list[] = $test_class;
}
else {
- try {
- $groups = simpletest_test_get_all();
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ $groups = simpletest_test_get_all();
$all_classes = array();
foreach ($groups as $group) {
$all_classes = array_merge($all_classes, array_keys($group));
}
simpletest_script_print_error('Test class not found: ' . $class_name);
simpletest_script_print_alternatives($class_name, $all_classes, 6);
- exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
+ exit(1);
}
}
}
@@ -915,7 +824,7 @@ function simpletest_script_get_test_list() {
foreach ($args['test_names'] as $file) {
if (!file_exists($file)) {
simpletest_script_print_error('File not found: ' . $file);
- exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
+ exit;
}
$content = file_get_contents($file);
// Extract a potential namespace.
@@ -994,13 +903,7 @@ function simpletest_script_get_test_list() {
}
}
else {
- try {
- $groups = simpletest_test_get_all();
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ $groups = simpletest_test_get_all();
foreach ($args['test_names'] as $group_name) {
if (isset($groups[$group_name])) {
$test_list = array_merge($test_list, array_keys($groups[$group_name]));
@@ -1008,7 +911,7 @@ function simpletest_script_get_test_list() {
else {
simpletest_script_print_error('Test group not found: ' . $group_name);
simpletest_script_print_alternatives($group_name, array_keys($groups));
- exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
+ exit(1);
}
}
}
@@ -1016,7 +919,7 @@ function simpletest_script_get_test_list() {
if (empty($test_list)) {
simpletest_script_print_error('No valid tests were specified.');
- exit(SIMPLETEST_SCRIPT_EXIT_FAILURE);
+ exit;
}
return $test_list;
}
@@ -1090,13 +993,7 @@ function simpletest_script_reporter_display_summary($class, $results) {
function simpletest_script_reporter_write_xml_results() {
global $args, $test_ids, $results_map;
- try {
- $results = simpletest_script_load_messages_by_test_id($test_ids);
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ $results = simpletest_script_load_messages_by_test_id($test_ids);
$test_class = '';
$xml_files = array();
@@ -1186,13 +1083,7 @@ function simpletest_script_reporter_display_results() {
echo "Detailed test results\n";
echo "---------------------\n";
- try {
- $results = simpletest_script_load_messages_by_test_id($test_ids);
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ $results = simpletest_script_load_messages_by_test_id($test_ids);
$test_class = '';
foreach ($results as $result) {
if (isset($results_map[$result->status])) {
@@ -1340,16 +1231,10 @@ function simpletest_script_load_messages_by_test_id($test_ids) {
}
foreach ($test_id_chunks as $test_id_chunk) {
- try {
- $result_chunk = Database::getConnection('default', 'test-runner')
- ->query("SELECT * FROM {simpletest} WHERE test_id IN ( :test_ids[] ) ORDER BY test_class, message_id", array(
- ':test_ids[]' => $test_id_chunk,
- ))->fetchAll();
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ $result_chunk = Database::getConnection('default', 'test-runner')
+ ->query("SELECT * FROM {simpletest} WHERE test_id IN ( :test_ids[] ) ORDER BY test_class, message_id", array(
+ ':test_ids[]' => $test_id_chunk,
+ ))->fetchAll();
if ($result_chunk) {
$results = array_merge($results, $result_chunk);
}
@@ -1364,20 +1249,14 @@ function simpletest_script_load_messages_by_test_id($test_ids) {
function simpletest_script_open_browser() {
global $test_ids;
- try {
- $connection = Database::getConnection('default', 'test-runner');
- $results = $connection->select('simpletest')
- ->fields('simpletest')
- ->condition('test_id', $test_ids, 'IN')
- ->orderBy('test_class')
- ->orderBy('message_id')
- ->execute()
- ->fetchAll();
- }
- catch (Exception $e) {
- echo (string) $e;
- exit(SIMPLETEST_SCRIPT_EXIT_EXCEPTION);
- }
+ $connection = Database::getConnection('default', 'test-runner');
+ $results = $connection->select('simpletest')
+ ->fields('simpletest')
+ ->condition('test_id', $test_ids, 'IN')
+ ->orderBy('test_class')
+ ->orderBy('message_id')
+ ->execute()
+ ->fetchAll();
// Get the results form.
$form = array();