8000 Improve error reporting in random extension by TimWolla · Pull Request #9071 · php/php-src · GitHub
[go: up one dir, main page]

Skip to content

Improve error reporting in random extension #9071

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Jul 25, 2022
Prev Previous commit
Next Next commit
Fix user_unsafe test
If an engine fails once it will be permanently poisoned by setting
`->last_unsafe`. This is undesirable for the test, because it skews the
results.

Fix this by creating a fresh engine for each "assertion".
  • Loading branch information
TimWolla committed Jul 20, 2022
commit 3e1844172dd8b6f2f6261fb02187067d18c803a5
63 changes: 34 additions & 29 deletions ext/random/tests/03_randomizer/user_unsafe.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -3,84 +3,82 @@ Random: Randomizer: User: Engine unsafe
--FILE--
<?php

// Empty generator
$randomizer = (new \Random\Randomizer(
new class () implements \Random\Engine {
public function generate(): string
{
return '';
}
use Random\Randomizer;

final class EmptyStringEngine implements \Random\Engine {
public function generate(): string
{
return '';
}
));
}

try {
var_dump($randomizer->getInt(0, 123));
var_dump((new Randomizer(new EmptyStringEngine()))->getInt(0, 123));
} catch (\RuntimeException $e) {
echo $e, PHP_EOL;
}

echo PHP_EOL, "-------", PHP_EOL, PHP_EOL;

try {
var_dump(bin2hex($randomizer->getBytes(1)));
var_dump(bin2hex((new Randomizer(new EmptyStringEngine()))->getBytes(1)));
} catch (\RuntimeException $e) {
echo $e, PHP_EOL;
}

echo PHP_EOL, "-------", PHP_EOL, PHP_EOL;

try {
var_dump($randomizer->shuffleArray(\range(1, 10)));
var_dump((new Randomizer(new EmptyStringEngine()))->shuffleArray(\range(1, 10)));
} catch (\RuntimeException $e) {
echo $e, PHP_EOL;
}

echo PHP_EOL, "-------", PHP_EOL, PHP_EOL;

try {
var_dump($randomizer->shuffleBytes('foobar'));
var_dump((new Randomizer(new EmptyStringEngine()))->shuffleBytes('foobar'));
} catch (\RuntimeException $e) {
echo $e, PHP_EOL;
}

echo PHP_EOL, "=======", PHP_EOL, PHP_EOL;

// Infinite loop
$randomizer = (new \Random\Randomizer(
new class () implements \Random\Engine {
public function generate(): string
{
return "\xff\xff\xff\xff\xff\xff\xff\xff";
}

final class HeavilyBiasedEngine implements \Random\Engine {
public function generate(): string
{
return "\xff\xff\xff\xff\xff\xff\xff\xff";
}
));
}

try {
var_dump($randomizer->getInt(0, 123));
var_dump((new Randomizer(new HeavilyBiasedEngine()))->getInt(0, 123));
} catch (\RuntimeException $e) {
echo $e, PHP_EOL;
}

echo PHP_EOL, "-------", PHP_EOL, PHP_EOL;

try {
var_dump(bin2hex($randomizer->getBytes(1)));
var_dump(bin2hex((new Randomizer(new HeavilyBiasedEngine()))->getBytes(1)));
} catch (\RuntimeException $e) {
echo $e, PHP_EOL;
}

echo PHP_EOL, "-------", PHP_EOL, PHP_EOL;

try {
var_dump($randomizer->shuffleArray(\range(1, 10)));
var_dump((new Randomizer(new HeavilyBiasedEngine()))->shuffleArray(\range(1, 10)));
} catch (\RuntimeException $e) {
echo $e, PHP_EOL;
}

echo PHP_EOL, "-------", PHP_EOL, PHP_EOL;

try {
var_dump($randomizer->shuffleBytes('foobar'));
var_dump((new Randomizer(new HeavilyBiasedEngine()))->shuffleBytes('foobar'));
} catch (\RuntimeException $e) {
echo $e, PHP_EOL;
}
Expand Down Expand Up @@ -147,21 +145,28 @@ Stack trace:

-------

RuntimeException: Random number generation failed in %s:%d
Stack trace:
#0 %s(%d): Random\Randomizer->getBytes(1)
#1 {main}
string(2) "ff"

-------

RuntimeException: Random number generation failed in %s:%d
RuntimeException: Failed to generate an acceptable random number in 50 attempts in %s:%d
Stack trace:
#0 %s(%d): Random\Randomizer->shuffleArray(Array)
#1 {main}

Next RuntimeException: Random number generation failed in %s:%d
Stack trace:
#0 %s(%d): Random\Randomizer->shuffleArray(Array)
#1 {main}

-------

RuntimeException: Random number generation failed in %s:%d
RuntimeException: Failed to generate an acceptable random number in 50 attempts in %s:%d
Stack trace:
#0 %s(%d): Random\Randomizer->shuffleBytes('foobar')
#1 {main}

Next RuntimeException: Random number generation failed in %s:%d
Stack trace:
#0 %s(%d): Random\Randomizer->shuffleBytes('foobar')
#1 {main}
0