Merge branch '4.x' into 5.x

This commit is contained in:
Ben Ramsey
2025-06-25 18:42:16 -05:00
48 changed files with 423 additions and 84 deletions
+63 -29
View File
@@ -16,6 +16,8 @@ use Ramsey\Uuid\Test\TestCase;
class UnixTimeGeneratorTest extends TestCase
{
private const ITERATIONS = 2000;
#[RunInSeparateProcess]
#[PreserveGlobalState(false)]
public function testGenerate(): void
@@ -33,7 +35,11 @@ class UnixTimeGeneratorTest extends TestCase
$bytes = $unixTimeGenerator->generate(null, null, $dateTime);
$this->assertSame($expectedBytes, $bytes);
$this->assertSame(
$expectedBytes,
$bytes,
'Failed asserting that "' . bin2hex($bytes) . '" is equal to "' . bin2hex($expectedBytes) . '"',
);
}
#[RunInSeparateProcess]
@@ -44,9 +50,13 @@ class UnixTimeGeneratorTest extends TestCase
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator);
$previous = '';
for ($i = 0; $i < 25; $i++) {
for ($i = 0; $i < self::ITERATIONS; $i++) {
$bytes = $unixTimeGenerator->generate();
$this->assertTrue($bytes > $previous);
$this->assertTrue(
$bytes > $previous,
'Failed on iteration ' . $i . ' when evaluating ' . bin2hex($bytes) . ' > ' . bin2hex($previous),
);
$previous = $bytes;
}
}
@@ -59,9 +69,13 @@ class UnixTimeGeneratorTest extends TestCase
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator);
$previous = '';
for ($i = 0; $i < 25; $i++) {
for ($i = 0; $i < self::ITERATIONS; $i++) {
$bytes = $unixTimeGenerator->generate(null, null, $dateTime);
$this->assertTrue($bytes > $previous);
$this->assertTrue(
$bytes > $previous,
'Failed on iteration ' . $i . ' when evaluating ' . bin2hex($bytes) . ' > ' . bin2hex($previous),
);
$previous = $bytes;
}
}
@@ -73,9 +87,13 @@ class UnixTimeGeneratorTest extends TestCase
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator, 4);
$previous = '';
for ($i = 0; $i < 25; $i++) {
for ($i = 0; $i < self::ITERATIONS; $i++) {
$bytes = $unixTimeGenerator->generate();
$this->assertTrue($bytes > $previous);
$this->assertTrue(
$bytes > $previous,
'Failed on iteration ' . $i . ' when evaluating ' . bin2hex($bytes) . ' > ' . bin2hex($previous),
);
$previous = $bytes;
}
}
@@ -88,9 +106,13 @@ class UnixTimeGeneratorTest extends TestCase
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator, 4);
$previous = '';
for ($i = 0; $i < 25; $i++) {
for ($i = 0; $i < self::ITERATIONS; $i++) {
$bytes = $unixTimeGenerator->generate(null, null, $dateTime);
$this->assertTrue($bytes > $previous);
$this->assertTrue(
$bytes > $previous,
'Failed on iteration ' . $i . ' when evaluating ' . bin2hex($bytes) . ' > ' . bin2hex($previous),
);
$previous = $bytes;
}
}
@@ -103,22 +125,26 @@ class UnixTimeGeneratorTest extends TestCase
$randomGenerator->expects()->generate(16)->andReturns(
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
);
$randomGenerator->expects()->generate(10)->times(24)->andReturns(
$randomGenerator->allows()->generate(10)->andReturns(
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
);
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator);
$previous = '';
for ($i = 0; $i < 25; $i++) {
for ($i = 0; $i < self::ITERATIONS; $i++) {
$bytes = $unixTimeGenerator->generate();
$this->assertTrue($bytes > $previous);
$this->assertTrue(
$bytes > $previous,
'Failed on iteration ' . $i . ' when evaluating ' . bin2hex($bytes) . ' > ' . bin2hex($previous),
);
$previous = $bytes;
}
}
#[RunInSeparateProcess]
#[PreserveGlobalState(false)]
public function testGenerateProducesMonotonicResultsStartingWithAllBitsSetWithSameDate(): void
public function testGenerateRollsOverWithAllBitsSetWithSameDate(): void
{
$dateTime = new DateTimeImmutable('now');
@@ -127,17 +153,19 @@ class UnixTimeGeneratorTest extends TestCase
$randomGenerator->expects()->generate(16)->andReturns(
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
);
$randomGenerator->expects()->generate(10)->times(24)->andReturns(
$randomGenerator->allows()->generate(10)->andReturns(
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
);
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator);
$previous = '';
for ($i = 0; $i < 25; $i++) {
$bytes = $unixTimeGenerator->generate(null, null, $dateTime);
$this->assertTrue($bytes > $previous);
}
// We can only call this twice before the overflow kicks in, "randomizing" all the bits back to 1's, according to
// our mocked random generator. As a result, we can't run this in a loop like with the other monotonicity tests
// in this class; it starts failing at the third loop. This is okay, since our goal is to test the overflow.
$first = $unixTimeGenerator->generate(null, null, $dateTime);
$second = $unixTimeGenerator->generate(null, null, $dateTime);
$this->assertTrue($second > $first);
}
#[RunInSeparateProcess]
@@ -149,22 +177,26 @@ class UnixTimeGeneratorTest extends TestCase
$randomGenerator->expects()->generate(16)->andReturns(
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
);
$randomGenerator->expects()->generate(10)->times(24)->andReturns(
$randomGenerator->allows()->generate(10)->andReturns(
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
);
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator, 4);
$previous = '';
for ($i = 0; $i < 25; $i++) {
for ($i = 0; $i < self::ITERATIONS; $i++) {
$bytes = $unixTimeGenerator->generate();
$this->assertTrue($bytes > $previous);
$this->assertTrue(
$bytes > $previous,
'Failed on iteration ' . $i . ' when evaluating ' . bin2hex($bytes) . ' > ' . bin2hex($previous),
);
$previous = $bytes;
}
}
#[RunInSeparateProcess]
#[PreserveGlobalState(false)]
public function testGenerateProducesMonotonicResultsStartingWithAllBitsSetWithSameDateFor32BitPath(): void
public function testGenerateRollsOverWithAllBitsSetWithSameDateFor32BitPath(): void
{
$dateTime = new DateTimeImmutable('now');
@@ -173,16 +205,18 @@ class UnixTimeGeneratorTest extends TestCase
$randomGenerator->expects()->generate(16)->andReturns(
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
);
$randomGenerator->expects()->generate(10)->times(24)->andReturns(
$randomGenerator->allows()->generate(10)->andReturns(
"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
);
$unixTimeGenerator = new UnixTimeGenerator($randomGenerator, 4);
$previous = '';
for ($i = 0; $i < 25; $i++) {
$bytes = $unixTimeGenerator->generate(null, null, $dateTime);
$this->assertTrue($bytes > $previous);
}
// We can only call this twice before the overflow kicks in, "randomizing" all the bits back to 1's, according to
// our mocked random generator. As a result, we can't run this in a loop like with the other monotonicity tests
// in this class; it starts failing at the third loop. This is okay, since our goal is to test the overflow.
$first = $unixTimeGenerator->generate(null, null, $dateTime);
$second = $unixTimeGenerator->generate(null, null, $dateTime);
$this->assertTrue($second > $first);
}
}