#801394: fix a PHP error when enabling a module that fails requirements, and extend the tests.

From: Damien Tournoud <damien@tournoud.net>


---
 simpletest/tests/system_requirements_test.info    |    8 ++++++
 simpletest/tests/system_requirements_test.install |   18 +++++++++++++
 simpletest/tests/system_requirements_test.module  |    2 +
 simpletest/tests/system_test.module               |    5 ++--
 system/system.admin.inc                           |    4 ++-
 system/system.test                                |   29 +++++++++++++++++++++
 6 files changed, 63 insertions(+), 3 deletions(-)
 create mode 100644 simpletest/tests/system_requirements_test.info
 create mode 100644 simpletest/tests/system_requirements_test.install
 create mode 100644 simpletest/tests/system_requirements_test.module

diff --git modules/simpletest/tests/system_requirements_test.info modules/simpletest/tests/system_requirements_test.info
new file mode 100644
index 0000000..442e134
--- /dev/null
+++ modules/simpletest/tests/system_requirements_test.info
@@ -0,0 +1,8 @@
+; $Id$
+name = "System requirements test"
+description = "Support module for testing system requirements."
+package = Testing
+version = VERSION
+core = 7.x
+files[] = system_requirements_test.module
+hidden = TRUE
diff --git modules/simpletest/tests/system_requirements_test.install modules/simpletest/tests/system_requirements_test.install
new file mode 100644
index 0000000..b1e6733
--- /dev/null
+++ modules/simpletest/tests/system_requirements_test.install
@@ -0,0 +1,18 @@
+<?php
+// $Id$
+
+/**
+ * Implements hook_requirements().
+ */
+function system_requirements_test_requirements($phase) {
+  $requirements = array();
+  if (variable_get('system_requirements_test_fail_requirements', FALSE)) {
+    $requirements['test_requirement'] = array(
+      'title' => 'Test requirement',
+      'value' => 'Failed',
+      'severity' => REQUIREMENT_ERROR,
+      'description' => 'system_requirements_test_requirements() failed test requirement',
+    );
+  }
+  return $requirements;
+}
\ No newline at end of file
diff --git modules/simpletest/tests/system_requirements_test.module modules/simpletest/tests/system_requirements_test.module
new file mode 100644
index 0000000..13bb990
--- /dev/null
+++ modules/simpletest/tests/system_requirements_test.module
@@ -0,0 +1,2 @@
+<?php
+// $Id$
diff --git modules/simpletest/tests/system_test.module modules/simpletest/tests/system_test.module
index 2d7d9aa..391ef5f 100644
--- modules/simpletest/tests/system_test.module
+++ modules/simpletest/tests/system_test.module
@@ -227,8 +227,9 @@ function system_test_system_info_alter(&$info, $file, $type) {
     }
   }
 
-  // Make the system_dependencies_test visible by default.
-  if ($file->name == 'system_dependencies_test') {
+  // Make the system_dependencies_test and system_dependencies_test modules
+  // visible by default.
+  if ($file->name == 'system_dependencies_test' || $file->name == 'system_requirements_test') {
     $info['hidden'] = FALSE;
   }
 }
diff --git modules/system/system.admin.inc modules/system/system.admin.inc
index da415e6..8ec3380 100644
--- modules/system/system.admin.inc
+++ modules/system/system.admin.inc
@@ -1220,7 +1220,9 @@ function system_modules_submit($form, &$form_state) {
       if (!drupal_check_module($module)) {
         unset($new_modules[$key]);
       }
-      $sort[$module] = $files[$module]->sort;
+      else {
+        $sort[$module] = $files[$module]->sort;
+      }
     }
     array_multisort($sort, SORT_DESC, $new_modules);
     module_enable($new_modules, FALSE);
diff --git modules/system/system.test modules/system/system.test
index 273244b..34cf776 100644
--- modules/system/system.test
+++ modules/system/system.test
@@ -167,6 +167,35 @@ class EnableDisableTestCase extends ModuleTestCase {
     $info = variable_get('entity_cache_test');
     $this->assertNotNull($info, t('Entity information must not be NULL'));
   }
+
+  /**
+   * Test requirements checking during installation.
+   */
+  function testModuleRequirements() {
+    // Ask system_requirements_test_requirements() to fail the requirements.
+    variable_set('system_requirements_test_fail_requirements', TRUE);
+
+    // Try installing the module.
+    $edit = array();
+    $edit['modules[Testing][system_requirements_test][enable]'] = 'system_requirements_test';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+
+    // We should fail with a requirement error.
+    $this->assertText('system_requirements_test_requirements() failed test requirement', t('Module failed requirements.'));
+    $this->assertModules(array('system_requirements_test'), FALSE);
+
+    // Ask system_requirements_test_requirements() to pass the requirements.
+    variable_set('system_requirements_test_fail_requirements', FALSE);
+
+    // Try installing the module.
+    $edit = array();
+    $edit['modules[Testing][system_requirements_test][enable]'] = 'system_requirements_test';
+    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
+
+    // We should pass now.
+    $this->assertNoText('system_requirements_test_requirements() failed test requirement', t('Module passed requirements.'));
+    $this->assertModules(array('system_requirements_test'), TRUE);
+  }
 }
 
 /**
