mirror of
https://github.com/ramsey/uuid.git
synced 2026-06-14 15:56:48 +03:00
103 lines
3.0 KiB
PHP
103 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace Ramsey\Uuid\Test\Provider\Node;
|
|
|
|
use Ramsey\Uuid\Provider\Node\RandomNodeProvider;
|
|
use Ramsey\Uuid\Test\TestCase;
|
|
use AspectMock\Test as AspectMock;
|
|
|
|
class RandomNodeProviderTest extends TestCase
|
|
{
|
|
protected function setUp()
|
|
{
|
|
$this->skipIfHhvm();
|
|
parent::setUp();
|
|
}
|
|
|
|
protected function tearDown()
|
|
{
|
|
parent::tearDown();
|
|
AspectMock::clean();
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGetNodeUsesRandomBytes()
|
|
{
|
|
$bytes = pack('H*', base_convert(decbin(3892974093781), 2, 16));
|
|
|
|
$randomBytes = AspectMock::func('Ramsey\Uuid\Provider\Node', 'random_bytes', $bytes);
|
|
$provider = new RandomNodeProvider();
|
|
$provider->getNode();
|
|
$randomBytes->verifyInvoked(6);
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGetNodeSetsMulticastBit()
|
|
{
|
|
$bytes = pack('H*', base_convert(decbin(3892974093781), 2, 16));
|
|
$expectedBytesHex = '38a675685d50';
|
|
$decimal = 62287585500496;
|
|
$expectedNode = '39a675685d50';
|
|
|
|
AspectMock::func('Ramsey\Uuid\Provider\Node', 'random_bytes', $bytes);
|
|
$hexDec = AspectMock::func('Ramsey\Uuid\Provider\Node', 'hexdec', $decimal);
|
|
$provider = new RandomNodeProvider();
|
|
|
|
$this->assertSame($expectedNode, $provider->getNode());
|
|
$hexDec->verifyInvoked($expectedBytesHex);
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGetNodeAlreadyHasMulticastBit()
|
|
{
|
|
$bytes = pack('H*', base_convert(decbin(4492974093781), 2, 16));
|
|
$expectedBytesHex = '4161a1ff5d50';
|
|
$decimal = 71887585500496;
|
|
|
|
// We expect the same hex value for the node.
|
|
$expectedNode = $expectedBytesHex;
|
|
|
|
AspectMock::func('Ramsey\Uuid\Provider\Node', 'random_bytes', $bytes);
|
|
$hexDec = AspectMock::func('Ramsey\Uuid\Provider\Node', 'hexdec', $decimal);
|
|
$provider = new RandomNodeProvider();
|
|
|
|
$this->assertSame($expectedNode, $provider->getNode());
|
|
$hexDec->verifyInvoked($expectedBytesHex);
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess
|
|
* @preserveGlobalState disabled
|
|
*/
|
|
public function testGetNodeSetsMulticastBitForLowNodeValue()
|
|
{
|
|
$bytes = pack('H*', base_convert(decbin(1), 2, 16));
|
|
$expectedBytesHex = '10';
|
|
$decimal = 16;
|
|
$expectedNode = '010000000010';
|
|
|
|
AspectMock::func('Ramsey\Uuid\Provider\Node', 'random_bytes', $bytes);
|
|
$hexDec = AspectMock::func('Ramsey\Uuid\Provider\Node', 'hexdec', $decimal);
|
|
$provider = new RandomNodeProvider();
|
|
|
|
$this->assertSame($expectedNode, $provider->getNode());
|
|
$hexDec->verifyInvoked($expectedBytesHex);
|
|
}
|
|
|
|
public function testGetNodeAlwaysSetsMulticastBit()
|
|
{
|
|
$provider = new RandomNodeProvider();
|
|
|
|
$this->assertSame('010000000000', sprintf('%012x', hexdec($provider->getNode()) & 0x010000000000));
|
|
}
|
|
}
|