From 0a6b178c96c0e1e4f3cc375f37899149bcb24ca1 Mon Sep 17 00:00:00 2001 From: Angie Byron <webchick@24967.no-reply.drupal.org> Date: Thu, 9 Oct 2008 02:49:36 +0000 Subject: [PATCH] #316344 by boombatower: Add meta refresh support to SimpleTest to allow programmatically dealing with Batch API and such. --- modules/simpletest/drupal_web_test_case.php | 32 +++++++++++++++ modules/simpletest/simpletest.module | 45 +++++++-------------- 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/modules/simpletest/drupal_web_test_case.php b/modules/simpletest/drupal_web_test_case.php index 7b6eca355cab..332cbcc7c361 100644 --- a/modules/simpletest/drupal_web_test_case.php +++ b/modules/simpletest/drupal_web_test_case.php @@ -877,6 +877,11 @@ function drupalGet($path, $options = array()) { // previous options. $out = $this->curlExec(array(CURLOPT_HTTPGET => TRUE, CURLOPT_URL => url($path, $options), CURLOPT_HEADER => FALSE, CURLOPT_NOBODY => FALSE)); $this->refreshVariables(); // Ensure that any changes to variables in the other thread are picked up. + + // Replace original page output with new output from redirected page(s). + if (($new = $this->checkForMetaRefresh())) { + $out = $new; + } return $out; } @@ -952,6 +957,11 @@ function drupalPost($path, $edit, $submit, $options = array()) { $out = $this->curlExec(array(CURLOPT_URL => $action, CURLOPT_POST => TRUE, CURLOPT_POSTFIELDS => $post, CURLOPT_HEADER => FALSE)); // Ensure that any changes to variables in the other thread are picked up. $this->refreshVariables(); + + // Replace original page output with new output from redirected page(s). + if (($new = $this->checkForMetaRefresh())) { + $out = $new; + } return $out; } } @@ -964,6 +974,28 @@ function drupalPost($path, $edit, $submit, $options = array()) { } } + /** + * Check for meta refresh tag and if found call drupalGet() recursively. This + * function looks for the http-equiv attribute to be set to "Refresh" + * and is case-sensitive. + * + * @return + * Either the new page content or FALSE. + */ + private function checkForMetaRefresh() { + if ($this->drupalGetContent() != '' && $this->parse()) { + $refresh = $this->xpath('//meta[@http-equiv="Refresh"]'); + if (!empty($refresh)) { + // Parse the content attribute of the meta tag for the format: + // "[delay]: URL=[page_to_redirect_to]". + if (preg_match('/\d+;\s*URL=(?P<url>.*)/i', $refresh[0]['content'], $match)) { + return $this->drupalGet($this->getAbsoluteUrl(decode_entities($match['url']))); + } + } + } + return FALSE; + } + /** * Retrieves only the headers for a Drupal path or an absolute path. * diff --git a/modules/simpletest/simpletest.module b/modules/simpletest/simpletest.module index 80f47f54e8d9..8ef584ca4679 100644 --- a/modules/simpletest/simpletest.module +++ b/modules/simpletest/simpletest.module @@ -191,7 +191,7 @@ function simpletest_test_form() { '#value' => t('Clean environment'), '#submit' => array('simpletest_clean_environment'), ); - + return $form; } @@ -291,8 +291,6 @@ function _simpletest_format_summary_line($summary) { * Run selected tests. */ function simpletest_test_form_submit($form, &$form_state) { - $batch_mode = !preg_match("/^simpletest\d+$/", $_SERVER['HTTP_USER_AGENT']); - // Ensure that all classes are loaded before we create instances to get test information and run. simpletest_get_all_tests(); @@ -304,10 +302,10 @@ function simpletest_test_form_submit($form, &$form_state) { } } if (count($tests_list) > 0 ) { - simpletest_run_tests($tests_list, 'drupal', $batch_mode); + simpletest_run_tests($tests_list, 'drupal'); } else { - drupal_set_message(t('No test has been selected.'), 'error'); + drupal_set_message(t('No test(s) selected.'), 'error'); } } @@ -318,37 +316,24 @@ function simpletest_test_form_submit($form, &$form_state) { * @param $reporter * Which reporter to use. Allowed values are: text, xml, html and drupal, * drupal being the default. - * @param $batch_mode - * Whether to use the batch API or not. */ -function simpletest_run_tests($test_list, $reporter = 'drupal', $batch_mode = FALSE) { +function simpletest_run_tests($test_list, $reporter = 'drupal') { global $db_prefix, $db_prefix_original; cache_clear_all(); $test_id = db_insert('simpletest_test_id')->useDefaults(array('test_id'))->execute(); - if ($batch_mode) { - $batch = array( - 'title' => t('Running SimpleTests'), - 'operations' => array( - array('_simpletest_batch_operation', array($test_list, $test_id) - ), + $batch = array( + 'title' => t('Running SimpleTests'), + 'operations' => array( + array('_simpletest_batch_operation', array($test_list, $test_id)), ), - 'finished' => '_simpletest_batch_finished', - 'redirect' => 'admin/build/testing', - 'progress_message' => t('Processing tests.'), - 'css' => array(drupal_get_path('module', 'simpletest') .'/simpletest.css'), - 'init_message' => t('SimpleTest is initializing...') . ' ' . format_plural(count($test_list), "one test case will run.", "@count test cases will run."), - ); - batch_set($batch); - } - else { - simpletest_get_all_tests(); - foreach ($test_list as $test_class) { - $test = new $test_class($test_id); - $test->run(); - } - $_SESSION['test_id'] = $test_id; - } + 'finished' => '_simpletest_batch_finished', + 'redirect' => 'admin/build/testing', + 'progress_message' => t('Processing tests.'), + 'css' => array(drupal_get_path('module', 'simpletest') . '/simpletest.css'), + 'init_message' => t('SimpleTest is initializing...') . ' ' . format_plural(count($test_list), "one test case will run.", "@count test cases will run."), + ); + batch_set($batch); } /** -- GitLab