strict per item in config_files

This commit is contained in:
Yuming Zhu 2019-10-09 19:06:01 +08:00 committed by Tomas Kopecek
parent 153ac4058d
commit b2b8d5f9cc
8 changed files with 141 additions and 86 deletions

View file

@ -190,15 +190,17 @@ class ConfigFileTestCase(unittest.TestCase):
self.manager.isdir = mock.patch("os.path.isdir").start()
self.manager.isfile = mock.patch("os.path.isfile").start()
self.manager.access = mock.patch("os.access", return_value=True).start()
self.manager.open = mock_open().start()
self.manager.cp_clz = mock.patch("six.moves.configparser.ConfigParser",
spec=True).start()
self.manager.scp_clz = mock.patch("six.moves.configparser.SafeConfigParser",
spec=True).start()
self.manager.rcp_clz = mock.patch("six.moves.configparser.RawConfigParser",
spec=True).start()
self.mocks = [self.manager.logging,
self.manager.isdir,
if six.PY2:
self.real_parser_clz = self.manager.scp_clz
else:
self.real_parser_clz = self.manager.cp_clz
self.mocks = [self.manager.isdir,
self.manager.isfile,
self.manager.access,
self.manager.open,
@ -214,42 +216,45 @@ class ConfigFileTestCase(unittest.TestCase):
mock.patch.stopall()
def test_read_config_files(self):
# bad config_files
for files in [0,
False,
set(),
dict(),
object(),
('string', True),
[('str', True, 'str')],
[tuple()],]:
with self.assertRaises(koji.GenericError):
koji.read_config_files(files)
# string as config_files
files = 'test1.conf'
default = 'default.conf'
self.manager.isdir.return_value = False
conf = koji.read_config_files(files, default=default)
conf = koji.read_config_files(files)
self.manager.isdir.assert_called_once_with(files)
self.manager.open.assert_called_once_with(default, 'r')
if six.PY2:
self.assertTrue(isinstance(conf,
six.moves.configparser.SafeConfigParser.__class__))
self.manager.scp_clz.assert_called_once()
self.manager.scp_clz.return_value.readfp.assert_called_once()
self.manager.scp_clz.return_value.read.assert_called_once_with([files])
else:
self.assertTrue(isinstance(conf,
six.moves.configparser.ConfigParser.__class__))
self.manager.cp_clz.assert_called_once()
self.manager.cp_clz.return_value.read_file.assert_called_once()
self.manager.cp_clz.return_value.read.assert_called_once_with([files])
# no default
self.reset_mock()
koji.read_config_files(files)
self.manager.open.assert_not_called()
self.real_parser_clz.assert_called_once()
self.real_parser_clz.return_value.read.assert_called_once_with([files])
# list as config_files
self.reset_mock()
files = ['test1.conf', 'test2.conf']
koji.read_config_files(files)
self.manager.open.assert_not_called()
if six.PY2:
parser_clz = self.manager.scp_clz
else:
parser_clz = self.manager.cp_clz
parser_clz.assert_called_once()
parser_clz.return_value.read.assert_called_once_with(files)
self.real_parser_clz.assert_called_once()
self.real_parser_clz.return_value.read.assert_called_once_with(files)
# tuple as config_files
self.reset_mock()
files = ('test1.conf', 'test2.conf')
koji.read_config_files(files)
# raw
self.reset_mock()
@ -263,31 +268,37 @@ class ConfigFileTestCase(unittest.TestCase):
# strict
# case1, not a file
self.reset_mock()
self.manager.isfile.side_effect = [True, False]
files = [('test1.conf',), ('test2.conf', True)]
self.manager.isfile.return_value = False
with self.assertRaises(koji.ConfigurationError) as cm:
koji.read_config_files(files, strict=True)
koji.read_config_files(files)
self.assertEqual(cm.exception.args[0],
"Config file test2.conf can't be opened.")
self.manager.open.assert_not_called()
self.assertEqual(self.manager.isdir.call_count, 2)
self.assertEqual(self.manager.isfile.call_count, 2)
self.manager.access.assert_not_called()
# case2, inaccessible
self.reset_mock()
self.manager.isfile.side_effect = None
self.manager.isfile.return_value = True
self.manager.access.side_effect = [True, False]
self.manager.access.return_value = False
with self.assertRaises(koji.ConfigurationError) as cm:
koji.read_config_files(files, strict=True)
koji.read_config_files(files)
self.assertEqual(cm.exception.args[0],
"Config file test2.conf can't be opened.")
self.manager.open.assert_not_called()
self.assertEqual(self.manager.isdir.call_count, 2)
self.assertEqual(self.manager.isfile.call_count, 2)
self.assertEqual(self.manager.access.call_count, 2)
# directories
# strict==False
self.reset_mock()
files = ['test1.conf', 'testdir1', 'test2.conf', 'testdir2']
self.manager.isdir.side_effect = [False, True, False, True]
files = ['test1.conf', 'gooddir', 'test2.conf', 'emptydir', 'nonexistdir']
self.manager.isdir.side_effect = lambda f: False \
if f in ['test1.conf', 'test2.conf', 'nonexistdir'] else True
self.manager.isfile.side_effect = lambda f: False \
if f == 'test1-4.dir.conf' else True
self.manager.access.side_effect = None
if f in ['nonexistdir', 'gooddir/test1-4.dir.conf'] else True
self.manager.access.return_value = True
with mock.patch("os.listdir", side_effect=[['test1-2.conf',
'test1-1.conf',
@ -295,20 +306,49 @@ class ConfigFileTestCase(unittest.TestCase):
'test1-4.dir.conf'],
[]]) as listdir_mock:
conf = koji.read_config_files(files)
listdir_mock.assert_has_calls([call('testdir1'), call('testdir2')])
if six.PY2:
parser_clz = self.manager.scp_clz
else:
parser_clz = self.manager.cp_clz
parser_clz.assert_called_once()
parser_clz.return_value.read.assert_called_once_with(
listdir_mock.assert_has_calls([call('gooddir'), call('emptydir')])
self.real_parser_clz.assert_called_once()
self.real_parser_clz.return_value.read.assert_called_once_with(
['test1.conf',
'testdir1/test1-1.conf',
'testdir1/test1-2.conf',
'testdir1/test1-4.dir.conf',
'gooddir/test1-1.conf',
'gooddir/test1-2.conf',
'test2.conf'])
self.manager.logging.debug.assert_called_once_with(
"No config files found in directory: testdir2")
self.assertEqual(self.manager.isdir.call_count, 5)
self.assertEqual(self.manager.isfile.call_count, 6)
self.assertEqual(self.manager.access.call_count, 4)
# strict==True
# case1
self.reset_mock()
files[1] = ('gooddir', True)
with mock.patch("os.listdir", return_value=['test1-2.conf',
'test1-1.conf',
'test1-3.txt',
'test1-4.dir.conf']
) as listdir_mock:
with self.assertRaises(koji.ConfigurationError) as cm:
conf = koji.read_config_files(files)
self.assertEqual(cm.exception.args[0],
"Config file gooddir/test1-4.dir.conf can't be"
" opened.")
listdir_mock.assert_called_once_with('gooddir')
# case2
self.reset_mock()
files[1] = ('gooddir', False)
files[3] = ('emptydir', True)
with mock.patch("os.listdir", side_effect=[['test1-2.conf',
'test1-1.conf',
'test1-3.txt',
'test1-4.dir.conf'],
[]]
) as listdir_mock:
with self.assertRaises(koji.ConfigurationError) as cm:
conf = koji.read_config_files(files)
self.assertEqual(cm.exception.args[0],
'No config files found in directory: emptydir')
self.assertEqual(listdir_mock.call_count, 2)
class MavenUtilTestCase(unittest.TestCase):