flake8/tests/unit/test_checker_manager.py
Craig Silverstein a5573fc864 Move all uses of pool inside run_parallel().
This includes creating the pool, tearing it down under normal use, and
tearing it down in case of exception.

Doing this makes it harder to leak processes, as for instance was
happening in #410.

Fixes #410
2018-03-02 20:49:31 -08:00

68 lines
2.4 KiB
Python

"""Tests for the Manager object for FileCheckers."""
import errno
import mock
import pytest
from flake8 import checker
def style_guide_mock(**kwargs):
"""Create a mock StyleGuide object."""
kwargs.setdefault('diff', False)
kwargs.setdefault('jobs', '4')
style_guide = mock.Mock()
style_guide.options = mock.Mock(**kwargs)
return style_guide
def test_oserrors_cause_serial_fall_back():
"""Verify that OSErrors will cause the Manager to fallback to serial."""
err = OSError(errno.ENOSPC, 'Ominous message about spaceeeeee')
style_guide = style_guide_mock()
with mock.patch('_multiprocessing.SemLock', side_effect=err):
manager = checker.Manager(style_guide, [], [])
manager.run()
assert manager.using_multiprocessing is False
@mock.patch('flake8.utils.is_windows', return_value=False)
def test_oserrors_are_reraised(is_windows):
"""Verify that unexpected OSErrors will cause the Manager to reraise."""
err = OSError(errno.EAGAIN, 'Ominous message')
style_guide = style_guide_mock()
with mock.patch('_multiprocessing.SemLock', side_effect=err):
with pytest.raises(OSError):
manager = checker.Manager(style_guide, [], [])
manager.run()
def test_multiprocessing_is_disabled():
"""Verify not being able to import multiprocessing forces jobs to 0."""
style_guide = style_guide_mock()
with mock.patch('flake8.checker.multiprocessing', None):
manager = checker.Manager(style_guide, [], [])
assert manager.jobs == 0
def test_make_checkers():
"""Verify that we create a list of FileChecker instances."""
style_guide = style_guide_mock()
files = ['file1', 'file2']
checkplugins = mock.Mock()
checkplugins.to_dictionary.return_value = {
'ast_plugins': [],
'logical_line_plugins': [],
'physical_line_plugins': [],
}
with mock.patch('flake8.checker.multiprocessing', None):
manager = checker.Manager(style_guide, files, checkplugins)
with mock.patch('flake8.utils.filenames_from') as filenames_from:
filenames_from.side_effect = [['file1'], ['file2']]
with mock.patch('flake8.utils.fnmatch', return_value=True):
with mock.patch('flake8.processor.FileProcessor'):
manager.make_checkers()
for file_checker in manager.checkers:
assert file_checker.filename in files