Index: modules/simpletest/drupal_web_test_case.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/drupal_web_test_case.php,v
retrieving revision 1.169
diff -u -r1.169 drupal_web_test_case.php
--- modules/simpletest/drupal_web_test_case.php	10 Nov 2009 22:06:09 -0000	1.169
+++ modules/simpletest/drupal_web_test_case.php	10 Nov 2009 23:48:40 -0000
@@ -1015,6 +1015,48 @@
     }
   }
 
+/*
+ * Generate a list of module dependencies for installation.
+ * 
+ * @return List of modules and dependencies to install.
+ */
+  protected function getModuleDependencies($modules, $more_modules = array(), $dependencies = array()) {
+    // Check if the dependencies list has been created (Drupal 7).
+    if (empty($dependencies)) {
+      if (function_exists('system_rebuild_module_data')) {
+        $dependencies = system_rebuild_module_data();
+      }
+    }
+    // Check if the dependencies list has been created (Drupal 6).
+    if (empty($dependencies)) {
+      include_once './includes/module.inc';
+      $dependencies = module_rebuild_cache();
+    }
+
+    foreach ($modules as $module) {
+      // Check if module is already activated.
+      if (!$dependencies[$module]->status) {
+        // Check if there are any dependencies of the module and, if so, recursively go through them.
+        if (!empty($dependencies[$module]->info['dependencies'])) {
+          // Check if there are any modules that already exist in the list.
+          $dep_modules = array_diff($dependencies[$module]->info['dependencies'], $more_modules);
+          if (!empty($dep_modules)) {
+            // Merge the current list of modules with the dependencies.
+            $more_modules = $this->getModuleDependencies($dep_modules, $more_modules, $dependencies);
+          }
+        }
+        // Check if module is already in the list.
+        $key = array_search($module, $more_modules);
+        if ($key === FALSE) {
+          // Add the original module back to the list.
+          $more_modules[] = $module;
+        }
+      }
+    }
+
+    return $more_modules;
+  }
+
   /**
    * Generates a random database prefix, runs the install scripts on the
    * prefixed database and enable the specified modules. After installation
@@ -1070,7 +1112,7 @@
 
     // Install additional modules one at a time in order to make sure that the
     // list of modules is updated between each module's installation.
-    $modules = func_get_args();
+    $modules = $this->getModuleDependencies(func_get_args());
     foreach ($modules as $module) {
       drupal_install_modules(array($module), TRUE);
     }
