Source code for pytest_dbfixtures.factories.mysql

# Copyright (C) 2013 by Clearcode <http://clearcode.cc>
# and associates (see AUTHORS).

# This file is part of pytest-dbfixtures.

# pytest-dbfixtures is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# pytest-dbfixtures is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.

# You should have received a copy of the GNU Lesser General Public License
# along with pytest-dbfixtures.  If not, see <http://www.gnu.org/licenses/>.

import os
import shutil
import subprocess

import pytest
from path import path

from pytest_dbfixtures.executors import TCPExecutor
from pytest_dbfixtures.port import get_port
from pytest_dbfixtures.utils import get_config


def remove_mysql_directory(datadir):
    """
    Check mysql directory. Recursively delete a directory tree if exist.

    :param str datadir: path to datadir

    """
    if os.path.isdir(datadir):
        shutil.rmtree(datadir)


def init_mysql_directory(mysql_init, datadir):
    """
    #. Remove mysql directory if exist.
    #. `Initialize MySQL data directory
        <https://dev.mysql.com/doc/refman/5.0/en/mysql-install-db.html>`_

    :param str mysql_init: mysql_init executable
    :param str datadir: path to datadir

    """
    remove_mysql_directory(datadir)
    init_directory = (
        mysql_init,
        '--user=%s' % os.getenv('USER'),
        '--datadir=%s' % datadir,
    )
    subprocess.check_output(' '.join(init_directory), shell=True)


[docs]def mysql_proc(executable=None, admin_executable=None, init_executable=None, host=None, port=None, params=None, logs_prefix=''): """ Mysql server process factory. :param str executable: path to mysql executable :param str admin_executable: path to mysql_admin executable :param str init_executable: path to mysql_init executable :param str host: hostname :param str port: exact port (e.g. '8000') or randomly selected port: '?' - any random available port '2000-3000' - random available port from a given range '4002,4003' - random of 4002 or 4003 ports :param str params: additional command-line mysqld parameters :param str logs_prefix: prefix for log filename :rtype: func :returns: function which makes a redis process """ @pytest.fixture(scope='session') def mysql_proc_fixture(request): """ #. Get config. #. Initialize MySQL data directory #. `Start a mysqld server <https://dev.mysql.com/doc/refman/5.0/en/mysqld-safe.html>`_ #. Stop server and remove directory after tests. `See <https://dev.mysql.com/doc/refman/5.6/en/mysqladmin.html>`_ :param FixtureRequest request: fixture request object :rtype: pytest_dbfixtures.executors.TCPExecutor :returns: tcp executor """ config = get_config(request) mysql_exec = executable or config.mysql.mysql_server mysql_admin_exec = admin_executable or config.mysql.mysql_admin mysql_init = init_executable or config.mysql.mysql_init mysql_port = get_port(port or config.mysql.port) mysql_host = host or config.mysql.host mysql_params = params or config.mysql.params datadir = '/tmp/mysqldata_{port}'.format(port=mysql_port) pidfile = '/tmp/mysql-server.{port}.pid'.format(port=mysql_port) unixsocket = '/tmp/mysql.{port}.sock'.format(port=mysql_port) logsdir = path(request.config.getvalue('logsdir')) logfile_path = logsdir / '{prefix}mysql-server.{port}.log'.format( prefix=logs_prefix, port=mysql_port ) init_mysql_directory(mysql_init, datadir) mysql_executor = TCPExecutor( ''' {mysql_server} --datadir={datadir} --pid-file={pidfile} --port={port} --socket={socket} --log-error={logfile_path} --skip-syslog {params} ''' .format( mysql_server=mysql_exec, port=mysql_port, datadir=datadir, pidfile=pidfile, socket=unixsocket, logfile_path=logfile_path, params=mysql_params, ), host=mysql_host, port=mysql_port, ) mysql_executor.start() def stop_server_and_remove_directory(): shutdown_server = ( mysql_admin_exec, '--socket=%s' % unixsocket, '--user=%s' % config.mysql.user, 'shutdown' ) subprocess.check_output(' '.join(shutdown_server), shell=True) mysql_executor.stop() remove_mysql_directory(datadir) request.addfinalizer(stop_server_and_remove_directory) return mysql_executor return mysql_proc_fixture