From 0a7220483d2818d0cdb1da56cc6445e94bb4f37c Mon Sep 17 00:00:00 2001 From: Dries Buytaert Date: Fri, 4 Feb 2011 19:34:38 +0000 Subject: [PATCH] - Patch #1049116 by solotandem, David_Rothstein: module_enable() doesn't account for version strings in dependencies[]. --- includes/module.inc | 2 +- modules/simpletest/tests/module.test | 21 +++++++++++++++++++++ modules/simpletest/tests/module_test.module | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/includes/module.inc b/includes/module.inc index aa061e1953b..14b394cc7f2 100644 --- a/includes/module.inc +++ b/includes/module.inc @@ -372,7 +372,7 @@ function module_enable($module_list, $enable_dependencies = TRUE) { // Add dependencies to the list, with a placeholder weight. // The new modules will be processed as the while loop continues. - foreach ($module_data[$module]->info['dependencies'] as $dependency) { + foreach (array_keys($module_data[$module]->requires) as $dependency) { if (!isset($module_list[$dependency])) { $module_list[$dependency] = 0; } diff --git a/modules/simpletest/tests/module.test b/modules/simpletest/tests/module.test index 711a739ab6e..8e76e5c5415 100644 --- a/modules/simpletest/tests/module.test +++ b/modules/simpletest/tests/module.test @@ -212,6 +212,27 @@ class ModuleUnitTest extends DrupalWebTestCase { $uninstalled_modules = variable_get('test_module_uninstall_order', array()); $this->assertTrue(in_array('comment', $uninstalled_modules), t('Comment module is in the list of uninstalled modules.')); $this->assertFalse(in_array($profile, $uninstalled_modules), t('The installation profile is not in the list of uninstalled modules.')); + + // Enable forum module again, which should enable both the poll module and + // php module. But, this time do it with poll module declaring a dependency + // on a specific version of php module in its info file. Make sure that + // module_enable() still works. + variable_set('dependency_test', 'version dependency'); + drupal_static_reset('system_rebuild_module_data'); + $result = module_enable(array('forum')); + $this->assertTrue($result, t('module_enable() returns the correct value.')); + // Verify that the fake dependency chain was installed. + $this->assertTrue(module_exists('poll') && module_exists('php'), t('Dependency chain was installed by module_enable().')); + // Verify that the original module was installed. + $this->assertTrue(module_exists('forum'), t('Module installation with version dependencies succeeded.')); + // Finally, verify that the modules were enabled in the correct order. + $enable_order = variable_get('test_module_enable_order', array()); + $php_position = array_search('php', $enable_order); + $poll_position = array_search('poll', $enable_order); + $forum_position = array_search('forum', $enable_order); + $php_before_poll = $php_position !== FALSE && $poll_position !== FALSE && $php_position < $poll_position; + $poll_before_forum = $poll_position !== FALSE && $forum_position !== FALSE && $poll_position < $forum_position; + $this->assertTrue($php_before_poll && $poll_before_forum, t('Modules were enabled in the correct order by module_enable().')); } } diff --git a/modules/simpletest/tests/module_test.module b/modules/simpletest/tests/module_test.module index d3f46e2cbf0..97c33305fa5 100644 --- a/modules/simpletest/tests/module_test.module +++ b/modules/simpletest/tests/module_test.module @@ -36,6 +36,20 @@ function module_test_system_info_alter(&$info, $file, $type) { $info['dependencies'][] = 'php'; } } + elseif (variable_get('dependency_test', FALSE) == 'version dependency') { + if ($file->name == 'forum') { + // Make the forum module depend on poll. + $info['dependencies'][] = 'poll'; + } + elseif ($file->name == 'poll') { + // Make poll depend on a specific version of php module. + $info['dependencies'][] = 'php (1.x)'; + } + elseif ($file->name == 'php') { + // Set php module to a version compatible with the above. + $info['version'] = '7.x-1.0'; + } + } if ($file->name == 'seven' && $type == 'theme') { $info['regions']['test_region'] = t('Test region'); }