diff --git a/core/includes/common.inc b/core/includes/common.inc index 668dc39..aa9a89f 100644 --- a/core/includes/common.inc +++ b/core/includes/common.inc @@ -5314,9 +5314,22 @@ function drupal_system_listing($mask, $directory, $key = 'name', $min_depth = 1) // themes as provided by a distribution. It is pristine in the same way that // the 'core/modules' directory is pristine for core; users should avoid // any modification by using the sites/all or sites/ directories. + $profiles = array(); $profile = drupal_get_profile(); - if (file_exists("profiles/$profile/$directory")) { - $searchdir[] = "profiles/$profile/$directory"; + // For SimpleTest to be able to test modules packaged together with a + // distribution we need to include the profile of the parent site (in which + // test runs are triggered). + $testing_profile = variable_get('simpletest_parent_profile', FALSE); + if ($testing_profile && $testing_profile != $profile) { + $profiles[] = $testing_profile; + } + // In case both profile directories contain the same extension, the actual + // profile always has precedence. + $profiles[] = $profile; + foreach ($profiles as $profile) { + if (file_exists("profiles/$profile/$directory")) { + $searchdir[] = "profiles/$profile/$directory"; + } } // Always search sites/all/* as well as the global directories. diff --git a/core/modules/simpletest/drupal_web_test_case.php b/core/modules/simpletest/drupal_web_test_case.php index 8168257..6db8013 100644 --- a/core/modules/simpletest/drupal_web_test_case.php +++ b/core/modules/simpletest/drupal_web_test_case.php @@ -1372,6 +1372,12 @@ class DrupalWebTestCase extends DrupalTestCase { variable_set('file_private_path', $private_files_directory); variable_set('file_temporary_path', $temp_files_directory); + // Set the 'simpletest_parent_profile' variable to add the parent profile's + // search path to the child site's search paths. + // @see drupal_system_listing() + // @todo This may need to be primed like 'install_profile' above. + variable_set('simpletest_parent_profile', $this->originalProfile); + // Include the testing profile. variable_set('install_profile', $this->profile); $profile_details = install_profile_info($this->profile, 'en'); diff --git a/core/modules/simpletest/simpletest.test b/core/modules/simpletest/simpletest.test index bd4427c..88c391b 100644 --- a/core/modules/simpletest/simpletest.test +++ b/core/modules/simpletest/simpletest.test @@ -616,3 +616,95 @@ class SimpleTestMissingCheckedRequirements extends DrupalWebTestCase { } } } + +/** + * Verifies that tests bundled with installation profile modules are found. + */ +class SimpleTestInstallationProfileModuleTestsTestCase extends DrupalWebTestCase { + /** + * Use the Testing profile. + * + * The Testing profile contains drupal_system_listing_compatible_test.test, + * which attempts to: + * - run tests using the Minimal profile (which does not contain the + * drupal_system_listing_compatible_test.module) + * - but still install the drupal_system_listing_compatible_test.module + * contained in the Testing profile. + * + * @see DrupalSystemListingCompatibleTestCase + */ + protected $profile = 'testing'; + + public static function getInfo() { + return array( + 'name' => 'Installation profile module tests', + 'description' => 'Verifies that tests bundled with installation profile modules are found.', + 'group' => 'SimpleTest', + ); + } + + function setUp() { + parent::setUp(array('simpletest')); + + $this->admin_user = $this->drupalCreateUser(array('administer unit tests')); + $this->drupalLogin($this->admin_user); + } + + /** + * Tests existence of test case located in an installation profile module. + */ + function testInstallationProfileTests() { + $this->drupalGet('admin/config/development/testing'); + $this->assertText('Installation profile module tests helper'); + $edit = array( + 'DrupalSystemListingCompatibleTestCase' => TRUE, + ); + $this->drupalPost(NULL, $edit, t('Run tests')); + $this->assertText('DrupalSystemListingCompatibleTestCase test executed.'); + } +} + +/** + * Verifies that tests in other installation profiles are not found. + * + * @see SimpleTestInstallationProfileModuleTestsTestCase + */ +class SimpleTestOtherInstallationProfileModuleTestsTestCase extends DrupalWebTestCase { + /** + * Use the Testing profile. + * + * The Testing profile contains drupal_system_listing_compatible_test.test, + * which attempts to: + * - run tests using the Minimal profile (which does not contain the + * drupal_system_listing_compatible_test.module) + * - but still install the drupal_system_listing_compatible_test.module + * contained in the Testing profile. + * + * @see SimpleTestInstallationProfileModuleTestsTestCase + * @see DrupalSystemListingCompatibleTestCase + */ + protected $profile = 'minimal'; + + public static function getInfo() { + return array( + 'name' => 'Other Installation profiles', + 'description' => 'Verifies that tests in other installation profiles are not found.', + 'group' => 'SimpleTest', + ); + } + + function setUp() { + parent::setUp(array('simpletest')); + + $this->admin_user = $this->drupalCreateUser(array('administer unit tests')); + $this->drupalLogin($this->admin_user); + } + + /** + * Tests that tests located in another installation profile do not appear. + */ + function testOtherInstallationProfile() { + $this->drupalGet('admin/config/development/testing'); + $this->assertNoText('Installation profile module tests helper'); + } +} diff --git a/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info b/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info index 53515e7..9ce4ca1 100644 --- a/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info +++ b/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.info @@ -4,3 +4,4 @@ package = Testing version = VERSION core = 8.x hidden = TRUE +files[] = drupal_system_listing_compatible_test.test diff --git a/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.test b/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.test new file mode 100644 index 0000000..198c1d8 --- /dev/null +++ b/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.test @@ -0,0 +1,37 @@ + 'Installation profile module tests helper', + 'description' => 'Verifies that tests in installation profile modules are found and may use another profile for running tests.', + 'group' => 'Installation profile', + ); + } + + function setUp() { + // Attempt to install a module in Testing profile, while this test runs with + // a different profile. + parent::setUp(array('drupal_system_listing_compatible_test')); + } + + /** + * Non-empty test* method required to executed the test case class. + */ + function testDrupalSystemListing() { + $this->pass(__CLASS__ . ' test executed.'); + } +}