<?php

namespace Doctrine\Tests\DBAL\Driver\Mysqli;

use Doctrine\DBAL\Driver\Mysqli\MysqliConnection;
use Doctrine\DBAL\Driver\Mysqli\MysqliException;
use Doctrine\Tests\DbalTestCase;

class MysqliConnectionTest extends DbalTestCase
{
    /**
     * The mysqli driver connection mock under test.
     *
     * @var \Doctrine\DBAL\Driver\Mysqli\MysqliConnection|\PHPUnit_Framework_MockObject_MockObject
     */
    private $connectionMock;

    protected function setUp()
    {
        if ( ! extension_loaded('mysqli')) {
            $this->markTestSkipped('mysqli is not installed.');
        }

        parent::setUp();

        $this->connectionMock = $this->getMockBuilder(MysqliConnection::class)
            ->disableOriginalConstructor()
            ->getMockForAbstractClass();
    }

    public function testDoesNotRequireQueryForServerVersion()
    {
        $this->assertFalse($this->connectionMock->requiresQueryForServerVersion());
    }

    public function testRestoresErrorHandlerOnException()
    {
        $handler = function () { self::fail('Never expected this to be called'); };
        $default_handler = set_error_handler($handler);

        try {
            new MysqliConnection(['host' => '255.255.255.255'], 'user', 'pass');
            self::fail('An exception was supposed to be raised');
        } catch (MysqliException $e) {
            self::assertSame('Network is unreachable', $e->getMessage());
        }

        self::assertSame($handler, set_error_handler($default_handler), 'Restoring error handler failed.');
        restore_error_handler();
        restore_error_handler();
    }

    /**
     * @dataProvider secureMissingParamsProvider
     */
    public function testThrowsExceptionWhenMissingMandatorySecureParams(array $secureParams)
    {
        $this->expectException(MysqliException::class);
        $msg = '"ssl_key" and "ssl_cert" parameters are mandatory when using secure connection parameters.';
        $this->expectExceptionMessage($msg);

        new MysqliConnection($secureParams, 'xxx', 'xxx');
    }

    public function secureMissingParamsProvider()
    {
        return [
            [
                ['ssl_cert' => 'cert.pem']
            ],
            [
                ['ssl_key' => 'key.pem']
            ],
            [
                ['ssl_key' => 'key.pem', 'ssl_ca' => 'ca.pem', 'ssl_capath' => 'xxx', 'ssl_cipher' => 'xxx']
            ],
            [
                ['ssl_ca' => 'ca.pem', 'ssl_capath' => 'xxx', 'ssl_cipher' => 'xxx']
            ]
        ];
    }
}