summaryrefslogtreecommitdiff
path: root/modules/simpletest/drupal_test_suite.php
blob: bbc33e220c4fbf29b6005d23971dc9334e393e4a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?php
// $Id$

/**
 * Implementes getTestInstances to allow access to the test objects from outside
 */
class DrupalTestSuite extends TestSuite {
  var $_cleanupModules   = array();

  function DrupalTestSuite($label) {
    $this->TestSuite($label);
  }

  /**
   * @return array of instantiated tests that this GroupTests holds
   */
  function getTestInstances() {
    for ($i = 0, $count = count($this->_test_cases); $i < $count; $i++) {
      if (is_string($this->_test_cases[$i])) {
        $class = $this->_test_cases[$i];
        $this->_test_cases[$i] = &new $class();
      }
    }
    return $this->_test_cases;
  }
}

class DrupalTests extends DrupalTestSuite {
  /**
   * Constructor
   * @param array   $class_list  list containing the classes of tests to be processed
   *                             default: NULL - run all tests
   */
  function DrupalTests($class_list = NULL) {
    static $classes;
    $this->DrupalTestSuite('Drupal Unit Tests');

    /* Tricky part to avoid double inclusion */
    if (!$classes) {

      $files = array();
      foreach (array_keys(module_rebuild_cache()) as $module) {
        $module_path = drupal_get_path('module', $module);
        $test = $module_path . "/$module.test";
        if (file_exists($test)) {
          $files[] = $test;
        }
      }

      $existing_classes = get_declared_classes();
      foreach ($files as $file) {
        include_once($file);
      }
      $classes = array_diff(get_declared_classes(), $existing_classes);
    }
    if (!is_null($class_list)) {
      $classes = $class_list;
    }
    if (count($classes) == 0) {
      drupal_set_message('No test cases found.', 'error');
      return;
    }
    $groups = array();
    foreach ($classes as $class) {
      if (!is_subclass_of($class, 'DrupalWebTestCase') && !is_subclass_of($class, 'DrupalUnitTestCase')) {
        continue;
      }
      $this->_addClassToGroups($groups, $class);
    }
    foreach ($groups as $group_name => $group) {
      $group_test = &new DrupalTestSuite($group_name);
      foreach ($group as $key => $v) {
        $group_test->addTestCase($group[$key]);
      }
      $this->addTestCase($group_test);
    }
  }

  /**
   * Adds a class to a groups array specified by the getInfo of the group
   * @param array  $groups Group of categorized tests
   * @param string $class  Name of a class
   */
  function _addClassToGroups(&$groups, $class) {
    $test = &new $class();
    if (method_exists($test, 'getInfo')) {
      $info = $test->getInfo();
      $groups[$info['group']][] = $test;
    }
  }

  /**
   * Invokes run() on all of the held test cases, instantiating
   * them if necessary.
   * The Drupal version uses paintHeader instead of paintGroupStart
   * to avoid collapsing of the very top level.
   *
   * @param SimpleReporter $reporter    Current test reporter.
   * @access public
   */
  function run(&$reporter) {
    cache_clear_all();
    @set_time_limit(0);
    ignore_user_abort(TRUE);

    // Disable devel output, check simpletest settings page
    if (!variable_get('simpletest_devel', FALSE)) {
      $GLOBALS['devel_shutdown'] = FALSE;
    }

    $result = parent::run($reporter);

    // Restores modules
    foreach ($this->_cleanupModules as $name => $status) {
      db_query("UPDATE {system} SET status = %d WHERE name = '%s' AND type = 'module'", $status, $name);
    }
    $this->_cleanupModules = array();

    return $result;
  }
}