DBAL421Test.php 1.57 KB
Newer Older
Steve Müller's avatar
Steve Müller committed
1 2 3
<?php

namespace Doctrine\Tests\DBAL\Functional\Ticket;
Sergei Morozov's avatar
Sergei Morozov committed
4 5

use Doctrine\Tests\DbalFunctionalTestCase;
6 7
use function in_array;
use function preg_match;
Steve Müller's avatar
Steve Müller committed
8 9 10 11

/**
 * @group DBAL-421
 */
Sergei Morozov's avatar
Sergei Morozov committed
12
class DBAL421Test extends DbalFunctionalTestCase
Steve Müller's avatar
Steve Müller committed
13 14 15 16 17
{
    protected function setUp()
    {
        parent::setUp();

Sergei Morozov's avatar
Sergei Morozov committed
18
        $platform = $this->connection->getDatabasePlatform()->getName();
Sergei Morozov's avatar
Sergei Morozov committed
19 20
        if (in_array($platform, ['mysql', 'sqlite'])) {
            return;
Steve Müller's avatar
Steve Müller committed
21
        }
Sergei Morozov's avatar
Sergei Morozov committed
22 23

        $this->markTestSkipped('Currently restricted to MySQL and SQLite.');
Steve Müller's avatar
Steve Müller committed
24 25 26 27
    }

    public function testGuidShouldMatchPattern()
    {
Sergei Morozov's avatar
Sergei Morozov committed
28
        $guid    = $this->connection->query($this->getSelectGuidSql())->fetchColumn();
Steve Müller's avatar
Steve Müller committed
29
        $pattern = '/[0-9A-F]{8}\-[0-9A-F]{4}\-[0-9A-F]{4}\-[8-9A-B][0-9A-F]{3}\-[0-9A-F]{12}/i';
Sergei Morozov's avatar
Sergei Morozov committed
30
        self::assertEquals(1, preg_match($pattern, $guid), 'GUID does not match pattern');
Steve Müller's avatar
Steve Müller committed
31 32 33 34 35 36 37 38
    }

    /**
     * This test does (of course) not proof that all generated GUIDs are
     * random, it should however provide some basic confidence.
     */
    public function testGuidShouldBeRandom()
    {
Sergei Morozov's avatar
Sergei Morozov committed
39
        $statement = $this->connection->prepare($this->getSelectGuidSql());
Sergei Morozov's avatar
Sergei Morozov committed
40
        $guids     = [];
Steve Müller's avatar
Steve Müller committed
41 42 43 44

        for ($i = 0; $i < 99; $i++) {
            $statement->execute();
            $guid = $statement->fetchColumn();
Sergei Morozov's avatar
Sergei Morozov committed
45
            self::assertNotContains($guid, $guids, 'Duplicate GUID detected');
Steve Müller's avatar
Steve Müller committed
46 47 48 49 50 51 52 53
            $guids[] = $guid;
        }

        $statement->closeCursor();
    }

    private function getSelectGuidSql()
    {
Sergei Morozov's avatar
Sergei Morozov committed
54
        return 'SELECT ' . $this->connection->getDatabasePlatform()->getGuidExpression();
Steve Müller's avatar
Steve Müller committed
55 56
    }
}