diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php index ea6f26eb06ab4da97434dd11a3d338e26bba1985..f9a1031695eeb5fc8839bfa4f74dfccd888cc350 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. */ @@ -323,6 +322,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. */ 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 565ed0886411ed3179981a7d80bb625919b2d2e2..5f0846073221a8158862d8d4bc7486f7cf8e2738 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 @@ -8,6 +8,17 @@ use Drupal\Core\Entity\EntityInterface; 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 + // Drupal\field\Tests\FieldInfoTest::testFieldInfoCache(). + if (state()->get('field_test.clear_info_cache_in_hook_entity_info')) { + field_info_cache_clear(); + } +} + /** * Implements hook_entity_info_alter(). */