mirror of
https://github.com/ramsey/uuid.git
synced 2026-06-14 15:56:48 +03:00
Check clock sequence and local identifier boundaries
This commit is contained in:
@@ -8,7 +8,7 @@ use Mockery;
|
||||
use Ramsey\Uuid\Converter\Number\GenericNumberConverter;
|
||||
use Ramsey\Uuid\Converter\NumberConverterInterface;
|
||||
use Ramsey\Uuid\Converter\Time\GenericTimeConverter;
|
||||
use Ramsey\Uuid\Exception\InvalidArgumentException;
|
||||
use Ramsey\Uuid\Exception\DceSecurityException;
|
||||
use Ramsey\Uuid\Generator\DceSecurityGenerator;
|
||||
use Ramsey\Uuid\Generator\DefaultTimeGenerator;
|
||||
use Ramsey\Uuid\Generator\TimeGeneratorInterface;
|
||||
@@ -44,7 +44,6 @@ class DceSecurityGeneratorTest extends TestCase
|
||||
int $providedDomain,
|
||||
?IntegerObject $providedId,
|
||||
?Hexadecimal $providedNode,
|
||||
?int $providedClockSeq,
|
||||
string $expectedId,
|
||||
string $expectedDomain,
|
||||
string $expectedNode,
|
||||
@@ -68,7 +67,7 @@ class DceSecurityGeneratorTest extends TestCase
|
||||
|
||||
$dceSecurityGenerator = new DceSecurityGenerator($numberConverter, $timeGenerator, $dceSecurityProvider);
|
||||
|
||||
$bytes = $dceSecurityGenerator->generate($providedDomain, $providedId, $providedNode, $providedClockSeq);
|
||||
$bytes = $dceSecurityGenerator->generate($providedDomain, $providedId, $providedNode);
|
||||
|
||||
$this->assertSame($expectedId, bin2hex(substr($bytes, 0, 4)));
|
||||
$this->assertSame($expectedDomain, bin2hex(substr($bytes, 9, 1)));
|
||||
@@ -91,7 +90,6 @@ class DceSecurityGeneratorTest extends TestCase
|
||||
'providedDomain' => Uuid::DCE_DOMAIN_PERSON,
|
||||
'providedId' => null,
|
||||
'providedNode' => null,
|
||||
'providedClockSeq' => null,
|
||||
'expectedId' => '000003e9',
|
||||
'expectedDomain' => '00',
|
||||
'expectedNode' => '001122334455',
|
||||
@@ -106,7 +104,6 @@ class DceSecurityGeneratorTest extends TestCase
|
||||
'providedDomain' => Uuid::DCE_DOMAIN_GROUP,
|
||||
'providedId' => null,
|
||||
'providedNode' => null,
|
||||
'providedClockSeq' => null,
|
||||
'expectedId' => '000007d1',
|
||||
'expectedDomain' => '01',
|
||||
'expectedNode' => '001122334455',
|
||||
@@ -121,7 +118,6 @@ class DceSecurityGeneratorTest extends TestCase
|
||||
'providedDomain' => Uuid::DCE_DOMAIN_ORG,
|
||||
'providedId' => new IntegerObject('4294967295'),
|
||||
'providedNode' => null,
|
||||
'providedClockSeq' => null,
|
||||
'expectedId' => 'ffffffff',
|
||||
'expectedDomain' => '02',
|
||||
'expectedNode' => '001122334455',
|
||||
@@ -138,7 +134,7 @@ class DceSecurityGeneratorTest extends TestCase
|
||||
|
||||
$generator = new DceSecurityGenerator($numberConverter, $timeGenerator, $dceSecurityProvider);
|
||||
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
$this->expectException(DceSecurityException::class);
|
||||
$this->expectExceptionMessage('Local domain must be a valid DCE Security domain');
|
||||
|
||||
$generator->generate(42);
|
||||
@@ -152,9 +148,133 @@ class DceSecurityGeneratorTest extends TestCase
|
||||
|
||||
$generator = new DceSecurityGenerator($numberConverter, $timeGenerator, $dceSecurityProvider);
|
||||
|
||||
$this->expectException(InvalidArgumentException::class);
|
||||
$this->expectException(DceSecurityException::class);
|
||||
$this->expectExceptionMessage('A local identifier must be provided for the org domain');
|
||||
|
||||
$generator->generate(Uuid::DCE_DOMAIN_ORG);
|
||||
}
|
||||
|
||||
public function testClockSequenceLowerBounds(): void
|
||||
{
|
||||
$dceSecurityProvider = Mockery::mock(DceSecurityProviderInterface::class);
|
||||
$nodeProvider = Mockery::mock(NodeProviderInterface::class);
|
||||
$timeProvider = new FixedTimeProvider(new Time(1583527677, 111984));
|
||||
|
||||
$calculator = new BrickMathCalculator();
|
||||
$numberConverter = new GenericNumberConverter($calculator);
|
||||
$timeConverter = new GenericTimeConverter($calculator);
|
||||
$timeGenerator = new DefaultTimeGenerator($nodeProvider, $timeConverter, $timeProvider);
|
||||
|
||||
$dceSecurityGenerator = new DceSecurityGenerator($numberConverter, $timeGenerator, $dceSecurityProvider);
|
||||
|
||||
$bytes = $dceSecurityGenerator->generate(
|
||||
Uuid::DCE_DOMAIN_ORG,
|
||||
new IntegerObject(1001),
|
||||
new Hexadecimal('0123456789ab'),
|
||||
0
|
||||
);
|
||||
|
||||
$hex = bin2hex($bytes);
|
||||
|
||||
$this->assertSame('000003e9', substr($hex, 0, 8));
|
||||
$this->assertSame('5feb01ea', substr($hex, 8, 8));
|
||||
$this->assertSame('00', substr($hex, 16, 2));
|
||||
$this->assertSame('02', substr($hex, 18, 2));
|
||||
$this->assertSame('0123456789ab', substr($hex, 20));
|
||||
}
|
||||
|
||||
public function testClockSequenceUpperBounds(): void
|
||||
{
|
||||
$dceSecurityProvider = Mockery::mock(DceSecurityProviderInterface::class);
|
||||
$nodeProvider = Mockery::mock(NodeProviderInterface::class);
|
||||
$timeProvider = new FixedTimeProvider(new Time(1583527677, 111984));
|
||||
|
||||
$calculator = new BrickMathCalculator();
|
||||
$numberConverter = new GenericNumberConverter($calculator);
|
||||
$timeConverter = new GenericTimeConverter($calculator);
|
||||
$timeGenerator = new DefaultTimeGenerator($nodeProvider, $timeConverter, $timeProvider);
|
||||
|
||||
$dceSecurityGenerator = new DceSecurityGenerator($numberConverter, $timeGenerator, $dceSecurityProvider);
|
||||
|
||||
$bytes = $dceSecurityGenerator->generate(
|
||||
Uuid::DCE_DOMAIN_ORG,
|
||||
new IntegerObject(1001),
|
||||
new Hexadecimal('0123456789ab'),
|
||||
63
|
||||
);
|
||||
|
||||
$hex = bin2hex($bytes);
|
||||
|
||||
$this->assertSame('000003e9', substr($hex, 0, 8));
|
||||
$this->assertSame('5feb01ea', substr($hex, 8, 8));
|
||||
$this->assertSame('3f', substr($hex, 16, 2));
|
||||
$this->assertSame('02', substr($hex, 18, 2));
|
||||
$this->assertSame('0123456789ab', substr($hex, 20));
|
||||
}
|
||||
|
||||
public function testExceptionThrownWhenClockSequenceTooLow(): void
|
||||
{
|
||||
$dceSecurityProvider = Mockery::mock(DceSecurityProviderInterface::class);
|
||||
$timeGenerator = Mockery::mock(TimeGeneratorInterface::class);
|
||||
$numberConverter = Mockery::mock(NumberConverterInterface::class);
|
||||
|
||||
$dceSecurityGenerator = new DceSecurityGenerator($numberConverter, $timeGenerator, $dceSecurityProvider);
|
||||
|
||||
$this->expectException(DceSecurityException::class);
|
||||
$this->expectExceptionMessage(
|
||||
'Clock sequence out of bounds; it must be a value between 0 and 63'
|
||||
);
|
||||
|
||||
$dceSecurityGenerator->generate(Uuid::DCE_DOMAIN_ORG, null, null, -1);
|
||||
}
|
||||
|
||||
public function testExceptionThrownWhenClockSequenceTooHigh(): void
|
||||
{
|
||||
$dceSecurityProvider = Mockery::mock(DceSecurityProviderInterface::class);
|
||||
$timeGenerator = Mockery::mock(TimeGeneratorInterface::class);
|
||||
$numberConverter = Mockery::mock(NumberConverterInterface::class);
|
||||
|
||||
$dceSecurityGenerator = new DceSecurityGenerator($numberConverter, $timeGenerator, $dceSecurityProvider);
|
||||
|
||||
$this->expectException(DceSecurityException::class);
|
||||
$this->expectExceptionMessage(
|
||||
'Clock sequence out of bounds; it must be a value between 0 and 63'
|
||||
);
|
||||
|
||||
$dceSecurityGenerator->generate(Uuid::DCE_DOMAIN_ORG, null, null, 64);
|
||||
}
|
||||
|
||||
public function testExceptionThrownWhenLocalIdTooLow(): void
|
||||
{
|
||||
$dceSecurityProvider = Mockery::mock(DceSecurityProviderInterface::class);
|
||||
$timeGenerator = Mockery::mock(TimeGeneratorInterface::class);
|
||||
$numberConverter = Mockery::mock(NumberConverterInterface::class);
|
||||
|
||||
$dceSecurityGenerator = new DceSecurityGenerator($numberConverter, $timeGenerator, $dceSecurityProvider);
|
||||
|
||||
$this->expectException(DceSecurityException::class);
|
||||
$this->expectExceptionMessage(
|
||||
'Local identifier out of bounds; it must be a value between 0 and 4294967295'
|
||||
);
|
||||
|
||||
$dceSecurityGenerator->generate(Uuid::DCE_DOMAIN_ORG, new IntegerObject(-1));
|
||||
}
|
||||
|
||||
public function testExceptionThrownWhenLocalIdTooHigh(): void
|
||||
{
|
||||
$dceSecurityProvider = Mockery::mock(DceSecurityProviderInterface::class);
|
||||
$timeGenerator = Mockery::mock(TimeGeneratorInterface::class);
|
||||
|
||||
$calculator = new BrickMathCalculator();
|
||||
$numberConverter = new GenericNumberConverter($calculator);
|
||||
|
||||
$dceSecurityGenerator = new DceSecurityGenerator($numberConverter, $timeGenerator, $dceSecurityProvider);
|
||||
|
||||
$this->expectException(DceSecurityException::class);
|
||||
$this->expectExceptionMessage(
|
||||
'Local identifier out of bounds; it must be a value between 0 and 4294967295'
|
||||
);
|
||||
|
||||
$dceSecurityGenerator->generate(Uuid::DCE_DOMAIN_ORG, new IntegerObject('4294967296'));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user