diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityIdLengthException.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityIdLengthException.php new file mode 100644 index 0000000..49cc736 --- /dev/null +++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityIdLengthException.php @@ -0,0 +1,15 @@ +original = $this->loadUnchanged($id); } + // Check the configuration entity ID length. + // @see \Drupal\Core\Config\Entity\ConfigEntityStorage::MAX_ID_LENGTH + if (strlen($entity->{$this->idKey}) > self::MAX_ID_LENGTH) { + throw new ConfigEntityIdLengthException(String::format('Configuration entity ID @id exceeds maximum allowed length of @len characters.', array( + '@id' => $entity->{$this->idKey}, + '@len' => self::MAX_ID_LENGTH, + ))); + } + $entity->preSave($this); $this->invokeHook('presave', $entity); diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php index 19ebaff..7af051a 100644 --- a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php +++ b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php @@ -7,8 +7,11 @@ namespace Drupal\config\Tests; +use Drupal\Component\Utility\String; use Drupal\Core\Entity\EntityMalformedException; use Drupal\Core\Entity\EntityStorageException; +use Drupal\Core\Config\Entity\ConfigEntityStorage; +use Drupal\Core\Config\Entity\ConfigEntityIdLengthException; use Drupal\Core\Language\Language; use Drupal\simpletest\WebTestBase; @@ -142,6 +145,56 @@ function testCRUD() { $this->assertIdentical($config_test->isNew(), FALSE); $this->assertIdentical($config_test->getOriginalId(), $expected['id']); + // Verify that a configuration entity can be saved with an ID of the + // maximum allowed length, but not longer. + + // Test with a short ID. By default randomName() generates an 8 character + // name. + $id_length_config_test = entity_create('config_test', array( + 'id' => $this->randomName(), + )); + try { + $id_length_config_test->save(); + $this->pass(String::format("config_test entity with ID length @len was saved.", array( + '@len' => strlen($id_length_config_test->id)) + )); + } + catch (ConfigEntityIdLengthException $e) { + $this->fail($e->getMessage()); + } + + // Test with an ID of the maximum allowed length. + $id_length_config_test = entity_create('config_test', array( + 'id' => $this->randomName(ConfigEntityStorage::MAX_ID_LENGTH), + )); + try { + $id_length_config_test->save(); + $this->pass(String::format("config_test entity with ID length @len was saved.", array( + '@len' => strlen($id_length_config_test->id), + ))); + } + catch (ConfigEntityIdLengthException $e) { + $this->fail($e->getMessage()); + } + + // Test with an ID exeeding the maximum allowed length. + $id_length_config_test = entity_create('config_test', array( + 'id' => $this->randomName(ConfigEntityStorage::MAX_ID_LENGTH + 1), + )); + try { + $status = $id_length_config_test->save(); + $this->fail(String::format("config_test entity with ID length @len exceeding the maximum allowed length of @max saved successfully", array( + '@len' => strlen($id_length_config_test->id), + '@max' => ConfigEntityStorage::MAX_ID_LENGTH, + ))); + } + catch (ConfigEntityIdLengthException $e) { + $this->pass(String::format("config_test entity with ID length @len exceeding the maximum allowed length of @max failed to save", array( + '@len' => strlen($id_length_config_test->id), + '@max' => ConfigEntityStorage::MAX_ID_LENGTH, + ))); + } + // Ensure that creating an entity with the same id as an existing one is not // possible. $same_id = entity_create('config_test', array(