diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php index ea6f26e..f9a1031 100644 --- a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php +++ b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php @@ -297,7 +297,6 @@ function testFieldMap() { $this->assertEqual($map, $expected); } - /** * Test that the field_info settings convenience functions work. */ @@ -324,6 +323,31 @@ function testSettingsInfo() { } /** + * Tests that the field info cache can be built correctly. + */ + function testFieldInfoCache() { + // Create a test field and ensure it's in the array returned by + // field_info_fields(). + $field_name = drupal_strtolower($this->randomName()); + $field = array( + 'field_name' => $field_name, + 'type' => 'test_field', + ); + field_create_field($field); + $fields = field_info_fields(); + $this->assertTrue(isset($fields[$field_name]), 'The test field is initially found in the array returned by field_info_fields().'); + + // Now rebuild the field info cache, and set a variable which will cause + // the cache to be cleared while it's being rebuilt; see + // field_test_entity_info(). Ensure the test field is still in the returned + // array. + field_info_cache_clear(); + state()->set('field_test.clear_info_cache_in_hook_entity_info', TRUE); + $fields = field_info_fields(); + $this->assertTrue(isset($fields[$field_name]), 'The test field is found in the array returned by field_info_fields() even if its cache is cleared while being rebuilt.'); + } + + /** * Test that the widget definition functions work. */ function testWidgetDefinition() { diff --git a/core/modules/field/tests/modules/field_test/field_test.entity.inc b/core/modules/field/tests/modules/field_test/field_test.entity.inc index 81c116d..1a3b9f2 100644 --- a/core/modules/field/tests/modules/field_test/field_test.entity.inc +++ b/core/modules/field/tests/modules/field_test/field_test.entity.inc @@ -9,6 +9,17 @@ use Drupal\field_test\Plugin\Core\Entity\TestEntity; /** + * Implements hook_entity_info(). + */ +function field_test_entity_info() { + // If requested, clear the field cache while this is being called. + // see testFieldInfoCache(). + if (state()->get('field_test.clear_info_cache_in_hook_entity_info')) { + field_info_cache_clear(); + } +} + +/** * Implements hook_entity_info_alter(). */ function field_test_entity_info_alter(&$entity_info) {