Skip to content
Snippets Groups Projects
Verified Commit 9a1ce8c4 authored by Dave Long's avatar Dave Long
Browse files

Issue #2972573 by borisson_, Lendude, rpayanm, acbramley, anmolgoyal74,...

Issue #2972573 by borisson_, Lendude, rpayanm, acbramley, anmolgoyal74, ravi.shankar, pooja saraah, Anchal_gupta, Krzysztof Domański, longwave, lauriii, jonathanshaw, smustgrave, Wim Leers, Matroskeen, catch: randomMachineName() should conform to processMachineName() pattern
parent e8073004
No related branches found
No related tags found
45 merge requests!12227Issue #3181946 by jonmcl, mglaman,!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4594Applying patch for Views Global Text area field to allow extra HTML tags. As video, source and iframe tag is not rendering. Due to which Media embedded video and remote-video not rendering in Views Global Text area field.,!3878Removed unused condition head title for views,!38582585169-10.1.x,!3818Issue #2140179: $entity->original gets stale between updates,!3742Issue #3328429: Create item list field formatter for displaying ordered and unordered lists,!3731Claro: role=button on status report items,!3668Resolve #3347842 "Deprecate the trusted",!3651Issue #3347736: Create new SDC component for Olivero (header-search),!3546refactored dialog.pcss file,!3531Issue #3336994: StringFormatter always displays links to entity even if the user in context does not have access,!3502Issue #3335308: Confusing behavior with FormState::setFormState and FormState::setMethod,!3478Issue #3337882: Deleted menus are not removed from content type config,!3452Issue #3332701: Refactor Claro's tablesort-indicator stylesheet,!3451Issue #2410579: Allows setting the current language programmatically.,!3355Issue #3209129: Scrolling problems when adding a block via layout builder,!3226Issue #2987537: Custom menu link entity type should not declare "bundle" entity key,!3154Fixes #2987987 - CSRF token validation broken on routes with optional parameters.,!3147Issue #3328457: Replace most substr($a, $i) where $i is negative with str_ends_with(),!3146Issue #3328456: Replace substr($a, 0, $i) with str_starts_with(),!3133core/modules/system/css/components/hidden.module.css,!31312878513-10.1.x,!2964Issue #2865710 : Dependencies from only one instance of a widget are used in display modes,!2812Issue #3312049: [Followup] Fix Drupal.Commenting.FunctionComment.MissingReturnType returns for NULL,!2614Issue #2981326: Replace non-test usages of \Drupal::logger() with IoC injection,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2062Issue #3246454: Add weekly granularity to views date sort,!1591Issue #3199697: Add JSON:API Translation experimental module,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!877Issue #2708101: Default value for link text is not saved,!844Resolve #3036010 "Updaters",!673Issue #3214208: FinishResponseSubscriber could create duplicate headers,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493,!485Sets the autocomplete attribute for username/password input field on login form.,!213Issue #2906496: Give Media a menu item under Content,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer
......@@ -33,6 +33,13 @@ class Random {
*/
protected $names = [];
/**
* A list of unique names generated by machineName().
*
* @var string[]
*/
protected array $machineNames = [];
/**
* Generates a random string of ASCII characters of codes 32 to 126.
*
......@@ -130,6 +137,51 @@ public function name($length = 8, $unique = FALSE) {
return $str;
}
/**
* Generates a string containing lowercase letters and numbers.
*
* This method is used to generate strings that are compliant with Drupal
* machine names. This doesn't include underscores, dashes and periods since
* those are not compatible with all machine names.
*
* @param int $length
* Length of random string to generate.
* @param bool $unique
* If TRUE ensures that the random string returned is unique.
* Defaults to FALSE.
*
* @return string
* Randomly generated string.
*
* @throws \RuntimeException
* Thrown if a unique machine name cannot be generated within the allowed
* number of random attempts.
*
* @see \Drupal\Component\Utility\Random::string()
*/
public function machineName(int $length = 8, bool $unique = FALSE): string {
$values = array_merge(range('a', 'z'), range(0, 9));
$start_characters = range('a', 'z');
$counter = 0;
do {
if ($counter == static::MAXIMUM_TRIES) {
throw new \RuntimeException('Unable to generate a unique random machine name');
}
$str = $start_characters[array_rand($start_characters)];
for ($i = 1; $i < $length; $i++) {
$str .= $values[array_rand($values)];
}
$counter++;
} while ($unique && isset($this->machineNames[$str]));
if ($unique) {
$this->machineNames[$str] = TRUE;
}
return $str;
}
/**
* Generate a string that looks like a word (letters only, alternating consonants and vowels).
*
......
......@@ -101,7 +101,7 @@ public static function stringValidate(string $string): bool {
* @see \Drupal\Component\Utility\Random::name()
*/
public static function machineName(int $length = 8): string {
return static::getGenerator()->name($length, TRUE);
return static::getGenerator()->machineName($length, TRUE);
}
/**
......
......@@ -115,6 +115,51 @@ public function testRandomStringNonUnique() {
$this->assertTrue(TRUE, 'No exception thrown when uniqueness is not enforced.');
}
/**
* Tests unique random name generation.
*
* @covers ::machineName
*/
public function testRandomMachineNamesUniqueness(): void {
$names = [];
$random = new Random();
for ($i = 0; $i <= 25; $i++) {
$str = $random->machineName(1, TRUE);
$this->assertArrayNotHasKey($str, $names, 'Generated duplicate random name ' . $str);
$names[$str] = TRUE;
}
}
/**
* Tests infinite loop prevention whilst generating random names.
*
* @covers ::machineName
*/
public function testRandomMachineNameException(): void {
// There are fewer than 100 possibilities so an exception should occur to
// prevent infinite loops.
$this->expectException(\RuntimeException::class);
$random = new Random();
for ($i = 0; $i <= 100; $i++) {
$random->machineName(1, TRUE);
}
}
/**
* Tests random name generation if uniqueness is not enforced.
*
* @covers ::machineName
*/
public function testRandomMachineNameNonUnique(): void {
// There are fewer than 100 possibilities meaning if uniqueness was
// enforced, there would be an exception.
$random = new Random();
for ($i = 0; $i <= 100; $i++) {
$random->machineName(1);
}
$this->expectNotToPerformAssertions();
}
/**
* Tests random object generation to ensure the expected number of properties.
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment