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