diff --git a/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityStaticCacheTest.php b/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityStaticCacheTest.php index f1f81d72d1..b2be1e767e 100644 --- a/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityStaticCacheTest.php +++ b/core/tests/Drupal/KernelTests/Core/Entity/ContentEntityStaticCacheTest.php @@ -47,7 +47,57 @@ protected function setUp() { } /** - * Tests that loadUnchanged will not return the same entity object reference. + * Tests the static cache when loading content entities. + */ + public function testEntityLoad() { + /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */ + $entity_type_manager = $this->container->get('entity_type.manager'); + /** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */ + $storage = $entity_type_manager->getStorage($this->revEntityTypeId); + + $rev_entity_type = $entity_type_manager->getDefinition($this->revEntityTypeId); + $this->assertTrue($rev_entity_type->isStaticallyCacheable()); + $this->assertTrue($rev_entity_type->isPersistentlyCacheable()); + $this->assertTrue($rev_entity_type->isRevisionable()); + + /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */ + $entity = $storage->create(); + $entity->save(); + + $non_default_rev_id = $entity->getRevisionId(); + $entity->setNewRevision(); + $entity->save(); + + // Tests the three static cache rules for entity loading: + // 1. Loading an entity multiple times by its ID returns always the same + // entity object reference. + // 2. Loading an entity by its ID and by its default revision ID returns + // always the same entity object reference. + // 3. Loading an entity multiple times by its revision ID returns always the + // same entity object reference. + $this->assertSame($storage->load($entity->id()), $storage->load($entity->id())); + $this->assertSame($storage->load($entity->id()), $storage->loadRevision($entity->getRevisionId())); + $this->assertSame($storage->loadRevision($non_default_rev_id), $storage->loadRevision($non_default_rev_id)); + + // Test that after resetting the entity cache then different object + // references will be returned. + $entity = $storage->load($entity->id()); + $entity_default_revision = $storage->loadRevision($entity->getRevisionId()); + $entity_non_default_revision = $storage->loadRevision($non_default_rev_id); + $storage->resetCache(); + $this->assertNotSame($entity, $storage->load($entity->id())); + $this->assertNotSame($entity_default_revision, $storage->loadRevision($entity->getRevisionId())); + $this->assertNotSame($entity_non_default_revision, $storage->loadRevision($non_default_rev_id)); + + // Tests that the behavior for the three rules remains unchanged after + // resetting the entity cache. + $this->assertSame($storage->load($entity->id()), $storage->load($entity->id())); + $this->assertSame($storage->load($entity->id()), $storage->loadRevision($entity->getRevisionId())); + $this->assertSame($storage->loadRevision($non_default_rev_id), $storage->loadRevision($non_default_rev_id)); + } + + /** + * Tests that on loading unchanged entity a new object reference is returned. */ public function testLoadUnchanged() { /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */ @@ -66,16 +116,22 @@ public function testLoadUnchanged() { } /** - * Tests Storage::loadUnchanged returning different entity object reference. + * Helper method for ::testLoadUnchanged(). + * + * For revisionable entities both the loadUnchanged and loadRevisionUnchanged + * storage methods are tested and for non-revisionable entities only the + * loadUnchanged storage method is tested. * * @param string $entity_type_id * The entity type ID to test Storage::loadUnchanged() with. */ protected function doTestLoadUnchanged($entity_type_id) { foreach ([FALSE, TRUE] as $invalidate_entity_cache) { + /** @var \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager */ + $entity_type_manager = $this->container->get('entity_type.manager'); + $entity_type = $entity_type_manager->getDefinition($entity_type_id); /** @var \Drupal\Core\Entity\ContentEntityStorageInterface $storage */ - $storage = $this->container->get('entity_type.manager') - ->getStorage($entity_type_id); + $storage = $entity_type_manager->getStorage($entity_type_id); $entity = $storage->create(); $entity->save(); @@ -96,6 +152,18 @@ protected function doTestLoadUnchanged($entity_type_id) { $unchanged = $storage->loadUnchanged($entity->id()); $message = $invalidate_entity_cache ? 'loadUnchanged returns a different entity object reference when the entity cache is invalidated before that.' : 'loadUnchanged returns a different entity object reference when the entity cache is not invalidated before that.'; $this->assertNotSame($entity, $unchanged, $message); + + // For revisionable entities test the same way the + // Storage::loadRevisionUnchanged method as well. + if ($entity_type->isRevisionable()) { + $entity = $storage->loadRevision($entity->getRevisionId()); + if ($invalidate_entity_cache) { + Cache::invalidateTags(['entity_field_info']); + } + $unchanged = $storage->loadRevisionUnchanged($entity->getRevisionId()); + $message = $invalidate_entity_cache ? 'loadRevisionUnchanged returns a different entity object reference when the entity cache is invalidated before that.' : 'loadRevisionUnchanged returns a different entity object reference when the entity cache is not invalidated before that.'; + $this->assertNotSame($entity, $unchanged, $message); + } } }