From 096a6b9ea0af4c35a0bf5340afaac1bb4668f2aa Mon Sep 17 00:00:00 2001 From: Yuming Zhu Date: Nov 14 2016 03:17:34 +0000 Subject: ut: koji.utils - cases for related Maven build utils --- diff --git a/koji/util.py b/koji/util.py index 61599d9..4d47d55 100644 --- a/koji/util.py +++ b/koji/util.py @@ -572,7 +572,6 @@ def parse_maven_params(confs, chain=False, scratch=False): conf_fd.close() builds = {} for package in config.sections(): - params = {} buildtype = 'maven' if config.has_option(package, 'type'): buildtype = config.get(package, 'type') diff --git a/tests/data/maven/bad_empty_config.ini b/tests/data/maven/bad_empty_config.ini new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/data/maven/bad_empty_config.ini diff --git a/tests/data/maven/bad_scmurl_config.ini b/tests/data/maven/bad_scmurl_config.ini new file mode 100644 index 0000000..5e8bb9c --- /dev/null +++ b/tests/data/maven/bad_scmurl_config.ini @@ -0,0 +1,16 @@ +[pkg] +type=maven +patches=patchurl +specfile=specfile +goals=goal1 goal2 +profiles=profile1 profile2 +packages=pkg1 pkg2 +jvm_options=--opt1 --opt2=val +maven_options=--opt1 --opt2=val +properties: p1=1 + p2 + p3=ppp3 +envs:e1=1 + e2=2 +buildrequires=r1 r2 +otheropts=others \ No newline at end of file diff --git a/tests/data/maven/bad_type_config.ini b/tests/data/maven/bad_type_config.ini new file mode 100644 index 0000000..a26f990 --- /dev/null +++ b/tests/data/maven/bad_type_config.ini @@ -0,0 +1,17 @@ +[pkg] +type=other +scmurl=scmurl +patches=patchurl +specfile=specfile +goals=goal1 goal2 +profiles=profile1 profile2 +packages=pkg1 pkg2 +jvm_options=--opt1 --opt2=val +maven_options=--opt1 --opt2=val +properties: p1=1 + p2 + p3=ppp3 +envs:e1=1 + e2=2 +buildrequires=r1 r2 +otheropts=others \ No newline at end of file diff --git a/tests/data/maven/bad_wrapper_config.ini b/tests/data/maven/bad_wrapper_config.ini new file mode 100644 index 0000000..7bd8050 --- /dev/null +++ b/tests/data/maven/bad_wrapper_config.ini @@ -0,0 +1,17 @@ +[pkg] +type=wrapper +scmurl=scmurl +patches=patchurl +specfile=specfile +goals=goal1 goal2 +profiles=profile1 profile2 +packages=pkg1 pkg2 +jvm_options=--opt1 --opt2=val +maven_options=--opt1 --opt2=val +properties: p1=1 + p2 + p3=ppp3 +envs:e1=1 + e2=2 +buildrequires=r1 r2 +otheropts=others \ No newline at end of file diff --git a/tests/data/maven/config.ini b/tests/data/maven/config.ini new file mode 100644 index 0000000..1bc3511 --- /dev/null +++ b/tests/data/maven/config.ini @@ -0,0 +1,52 @@ +[pkg1] +scmurl=scmurl +patches=patchurl +specfile=specfile +goals=goal1 goal2 +profiles=profile1 profile2 +packages=pkg1 pkg2 +jvm_options=--opt1 --opt2=val +maven_options=--opt1 --opt2=val +properties: p1=1 + p2 + p3=ppp3 +envs:e1=1 + e2=2 +buildrequires=r1 r2 +otheropts=others + +[pkg2] +type=maven +scmurl=scmurl +patches=patchurl +specfile=specfile +goals=goal1 goal2 +profiles=profile1 profile2 +packages=pkg1 pkg2 +jvm_options=--opt1 --opt2=val +maven_options=--opt1 --opt2=val +properties: p1=1 + p2 + p3=ppp3 +envs:e1=1 + e2=2 +buildrequires=r1 r2 +otheropts=others + +[pkg3] +type=wrapper +scmurl=scmurl +patches=patchurl +specfile=specfile +goals=goal1 goal2 +profiles=profile1 profile2 +packages=pkg1 pkg2 +jvm_options=--opt1 --opt2=val +maven_options=--opt1 --opt2=val +properties: p1=1 + p2 + p3=ppp3 +envs:e1=1 + e2=2 +buildrequires=r1 +otheropts=others diff --git a/tests/data/maven/good_config.ini b/tests/data/maven/good_config.ini new file mode 100644 index 0000000..e45861c --- /dev/null +++ b/tests/data/maven/good_config.ini @@ -0,0 +1,16 @@ +[pkg4] +scmurl=scmurl +patches=patchurl +specfile=specfile +goals=goal1 goal2 +profiles=profile1 profile2 +packages=pkg1 pkg2 +jvm_options=--opt1 --opt2=val +maven_options=--opt1 --opt2=val +properties: p1=1 + p2 + p3=ppp3 +envs:e1=1 + e2=2 +buildrequires=r1 r2 +otheropts=others \ No newline at end of file diff --git a/tests/test_utils.py b/tests/test_utils.py index 68bec02..1db7eb9 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,6 +1,10 @@ import mock import unittest +from mock import call +import os +import optparse +import ConfigParser import koji import koji.util @@ -77,7 +81,6 @@ class MiscFunctionTestCase(unittest.TestCase): islink.assert_called_once_with(dst) move.assert_not_called() - @mock.patch('urllib2.urlopen') @mock.patch('tempfile.TemporaryFile') @mock.patch('shutil.copyfileobj') @@ -92,7 +95,7 @@ class MiscFunctionTestCase(unittest.TestCase): path = 'relative/file/path' url = 'http://example.com/koji/relative/file/path' - #using topurl, no tempfile + # using topurl, no tempfile fo = koji.openRemoteFile(path, topurl) m_urlopen.assert_called_once_with(url) m_urlopen.return_value.close.assert_called_once() @@ -104,7 +107,7 @@ class MiscFunctionTestCase(unittest.TestCase): for m in mocks: m.reset_mock() - #using topurl + tempfile + # using topurl + tempfile tempdir = '/tmp/koji/1234' fo = koji.openRemoteFile(path, topurl, tempdir=tempdir) m_urlopen.assert_called_once_with(url) @@ -117,7 +120,7 @@ class MiscFunctionTestCase(unittest.TestCase): for m in mocks: m.reset_mock() - #using topdir + # using topdir topdir = '/mnt/mykojidir' filename = '/mnt/mykojidir/relative/file/path' fo = koji.openRemoteFile(path, topdir=topdir) @@ -135,3 +138,308 @@ class MiscFunctionTestCase(unittest.TestCase): koji.openRemoteFile(path) for m in mocks: m.assert_not_called() + + +class MavenUtilTestCase(unittest.TestCase): + """Test maven relative functions""" + maxDiff = None + + def test_maven_config_opt_adapter(self): + """Test class MavenConfigOptAdapter""" + conf = mock.MagicMock() + section = 'section' + adapter = koji.util.MavenConfigOptAdapter(conf, section) + self.assertIs(adapter._conf, conf) + self.assertIs(adapter._section, section) + conf.has_option.return_value = True + adapter.goals + adapter.properties + adapter.someattr + conf.has_option.return_value = False + with self.assertRaises(AttributeError) as cm: + adapter.noexistsattr + self.assertEquals(cm.exception.args[0], 'noexistsattr') + self.assertEquals(conf.mock_calls, [call.has_option(section, 'goals'), + call.get(section, 'goals'), + call.get().split(), + call.has_option(section, 'properties'), + call.get(section, 'properties'), + call.get().splitlines(), + call.has_option(section, 'someattr'), + call.get('section', 'someattr'), + call.has_option(section, 'noexistsattr')]) + + def test_maven_opts(self): + """Test maven_opts function""" + values = optparse.Values({ + 'scmurl': 'scmurl', + 'patches': 'patchurl', + 'specfile': 'specfile', + 'goals': ['goal1', 'goal2'], + 'profiles': ['profile1', 'profile2'], + 'packages': ['pkg1', 'pkg2'], + 'jvm_options': ['--opt1', '--opt2=val'], + 'maven_options': ['--opt1', '--opt2=val'], + 'properties': ['p1=1', 'p2', 'p3=ppp3'], + 'envs': ['e1=1', 'e2=2'], + 'buildrequires': ['r1', 'r2'], + 'otheropts': 'others'}) + self.assertEqual(koji.util.maven_opts(values), { + 'scmurl': 'scmurl', + 'patches': 'patchurl', + 'specfile': 'specfile', + 'goals': ['goal1', 'goal2'], + 'profiles': ['profile1', 'profile2'], + 'packages': ['pkg1', 'pkg2'], + 'jvm_options': ['--opt1', '--opt2=val'], + 'maven_options': ['--opt1', '--opt2=val'], + 'properties': {'p2': None, 'p3': 'ppp3', 'p1': '1'}, + 'envs': {'e1': '1', 'e2': '2'}}) + self.assertEqual(koji.util.maven_opts(values, chain=True, scratch=True), { + 'scmurl': 'scmurl', + 'patches': 'patchurl', + 'specfile': 'specfile', + 'goals': ['goal1', 'goal2'], + 'profiles': ['profile1', 'profile2'], + 'packages': ['pkg1', 'pkg2'], + 'jvm_options': ['--opt1', '--opt2=val'], + 'maven_options': ['--opt1', '--opt2=val'], + 'properties': {'p2': None, 'p3': 'ppp3', 'p1': '1'}, + 'envs': {'e1': '1', 'e2': '2'}, + 'buildrequires': ['r1', 'r2']}) + self.assertEqual(koji.util.maven_opts(values, chain=False, scratch=True), { + 'scmurl': 'scmurl', + 'patches': 'patchurl', + 'specfile': 'specfile', + 'goals': ['goal1', 'goal2'], + 'profiles': ['profile1', 'profile2'], + 'packages': ['pkg1', 'pkg2'], + 'jvm_options': ['--opt1', '--opt2=val'], + 'maven_options': ['--opt1', '--opt2=val'], + 'properties': {'p2': None, 'p3': 'ppp3', 'p1': '1'}, + 'envs': {'e1': '1', 'e2': '2'}, + 'scratch': True}) + values = optparse.Values({'envs': ['e1']}) + with self.assertRaises(ValueError) as cm: + koji.util.maven_opts(values) + self.assertEqual( + cm.exception.args[0], + "Environment variables must be in NAME=VALUE format") + + def test_maven_params(self): + """Test maven_params function""" + config = self._read_conf('/data/maven/config.ini') + self.assertEqual(koji.util.maven_params(config, 'pkg1'), { + 'scmurl': 'scmurl', + 'patches': 'patchurl', + 'specfile': 'specfile', + 'goals': ['goal1', 'goal2'], + 'profiles': ['profile1', 'profile2'], + 'packages': ['pkg1', 'pkg2'], + 'jvm_options': ['--opt1', '--opt2=val'], + 'maven_options': ['--opt1', '--opt2=val'], + 'properties': {'p2': None, 'p3': 'ppp3', 'p1': '1'}, + 'envs': {'e1': '1', 'e2': '2'}}) + + def test_wrapper_params(self): + """Test wrapper_params function""" + config = self._read_conf('/data/maven/config.ini') + self.assertEqual(koji.util.wrapper_params(config, 'pkg2'), { + 'type': 'maven', + 'scmurl': 'scmurl', + 'buildrequires': ['r1', 'r2'], + 'create_build': True}) + self.assertEqual(koji.util.wrapper_params(config, 'pkg2', scratch=True), { + 'type': 'maven', + 'scmurl': 'scmurl', + 'buildrequires': ['r1', 'r2']}) + + def test_parse_maven_params(self): + """Test parse_maven_params function""" + path = os.path.dirname(__file__) + # single conf file, and chain=False, scratch=False + confs = path + '/data/maven/config.ini' + self.assertEqual(koji.util.parse_maven_params(confs), { + 'pkg1': { + 'scmurl': 'scmurl', + 'patches': 'patchurl', + 'specfile': 'specfile', + 'goals': ['goal1', 'goal2'], + 'profiles': ['profile1', 'profile2'], + 'packages': ['pkg1', 'pkg2'], + 'jvm_options': ['--opt1', '--opt2=val'], + 'maven_options': ['--opt1', '--opt2=val'], + 'properties': {'p2': None, 'p3': 'ppp3', 'p1': '1'}, + 'envs': {'e1': '1', 'e2': '2'}}, + 'pkg2': { + 'scmurl': 'scmurl', + 'patches': 'patchurl', + 'specfile': 'specfile', + 'goals': ['goal1', 'goal2'], + 'profiles': ['profile1', 'profile2'], + 'packages': ['pkg1', 'pkg2'], + 'jvm_options': ['--opt1', '--opt2=val'], + 'maven_options': ['--opt1', '--opt2=val'], + 'properties': {'p2': None, 'p3': 'ppp3', 'p1': '1'}, + 'envs': {'e1': '1', 'e2': '2'}}, + 'pkg3': { + 'type': 'wrapper', + 'scmurl': 'scmurl', + 'buildrequires': ['r1'], + 'create_build': True}}) + + # multiple conf file, and chain=True, scratch=False + confs = [confs, path + '/data/maven/good_config.ini'] + self.assertEqual(koji.util.parse_maven_params(confs, chain=True), { + 'pkg1': { + 'scmurl': 'scmurl', + 'patches': 'patchurl', + 'specfile': 'specfile', + 'goals': ['goal1', 'goal2'], + 'profiles': ['profile1', 'profile2'], + 'packages': ['pkg1', 'pkg2'], + 'jvm_options': ['--opt1', '--opt2=val'], + 'maven_options': ['--opt1', '--opt2=val'], + 'properties': {'p2': None, 'p3': 'ppp3', 'p1': '1'}, + 'envs': {'e1': '1', 'e2': '2'}, + 'buildrequires': ['r1', 'r2']}, + 'pkg2': { + 'scmurl': 'scmurl', + 'patches': 'patchurl', + 'specfile': 'specfile', + 'goals': ['goal1', 'goal2'], + 'profiles': ['profile1', 'profile2'], + 'packages': ['pkg1', 'pkg2'], + 'jvm_options': ['--opt1', '--opt2=val'], + 'maven_options': ['--opt1', '--opt2=val'], + 'properties': {'p2': None, 'p3': 'ppp3', 'p1': '1'}, + 'envs': {'e1': '1', 'e2': '2'}, + 'buildrequires': ['r1', 'r2']}, + 'pkg3': { + 'type': 'wrapper', + 'scmurl': 'scmurl', + 'buildrequires': ['r1'], + 'create_build': True}, + 'pkg4': { + 'scmurl': 'scmurl', + 'patches': 'patchurl', + 'specfile': 'specfile', + 'goals': ['goal1', 'goal2'], + 'profiles': ['profile1', 'profile2'], + 'packages': ['pkg1', 'pkg2'], + 'jvm_options': ['--opt1', '--opt2=val'], + 'maven_options': ['--opt1', '--opt2=val'], + 'properties': {'p2': None, 'p3': 'ppp3', 'p1': '1'}, + 'envs': {'e1': '1', 'e2': '2'}, + 'buildrequires': ['r1', 'r2']}, + }) + + # bad conf file - type=wrapper and len(params.get('buildrequires')!=1) + confs = path + '/data/maven/bad_wrapper_config.ini' + with self.assertRaises(ValueError) as cm: + koji.util.parse_maven_params(confs) + self.assertEqual( + cm.exception.args[0], + 'A wrapper-rpm must depend on exactly one package') + + # bad conf file - type is neither 'maven' nor 'wrapper') + confs = path + '/data/maven/bad_type_config.ini' + with self.assertRaises(ValueError) as cm: + koji.util.parse_maven_params(confs) + self.assertEqual(cm.exception.args[0], 'Unsupported build type: other') + + # bad conf file - no scmurl param + confs = path + '/data/maven/bad_scmurl_config.ini' + with self.assertRaises(ValueError) as cm: + koji.util.parse_maven_params(confs) + self.assertEqual( + cm.exception.args[0], + 'pkg is missing the scmurl parameter') + + # bad conf file - empty dict returned + confs = path + '/data/maven/bad_empty_config.ini' + with self.assertRaises(ValueError) as cm: + koji.util.parse_maven_params(confs) + self.assertEqual( + cm.exception.args[0], + 'No sections found in: %s' % + confs) + + def test_parse_maven_param(self): + """Test parse_maven_param function""" + path = os.path.dirname(__file__) + # single conf file, and chain=False, scratch=False + confs = path + '/data/maven/config.ini' + with mock.patch('koji.util.parse_maven_params', + return_value={ + 'pkg1': {'sth': 'pkg1'}, + 'pkg2': {'sth': 'pkg2'}, + 'pkg3': {'sth': 'pkg3'}}): + self.assertEqual( + koji.util.parse_maven_param( + confs, section='pkg1'), { + 'pkg1': { + 'sth': 'pkg1'}}) + with self.assertRaises(ValueError) as cm: + koji.util.parse_maven_param(confs, section='pkg4') + self.assertEqual( + cm.exception.args[0], + 'Section pkg4 does not exist in: %s' % + confs) + with self.assertRaises(ValueError) as cm: + koji.util.parse_maven_param(confs) + self.assertEqual( + cm.exception.args[0], + 'Multiple sections in: %s, you must specify the section' % + confs) + with mock.patch('koji.util.parse_maven_params', return_value={ + 'pkg': {'sth': 'pkg'}}): + self.assertEqual(koji.util.parse_maven_param(confs), + {'pkg': {'sth': 'pkg'}}) + + def test_parse_maven_chain(self): + """Test parse_maven_chain function""" + path = os.path.dirname(__file__) + confs = path + '/data/maven/config.ini' + with mock.patch('koji.util.parse_maven_params', + return_value={ + 'pkg1': {'buildrequires': ['pkg2', 'pkg3']}, + 'pkg2': {'buildrequires': ['pkg3']}, + 'pkg3': {'sth': 'sth'}}): + self.assertEqual(koji.util.parse_maven_chain(confs), + {'pkg1': {'buildrequires': ['pkg2', 'pkg3']}, + 'pkg2': {'buildrequires': ['pkg3']}, + 'pkg3': {'sth': 'sth'}}) + # circular deps + with mock.patch('koji.util.parse_maven_params', + return_value={ + 'pkg1': {'buildrequires': ['pkg2', 'pkg3']}, + 'pkg2': {'buildrequires': ['pkg3']}, + 'pkg3': {'buildrequires': ['pkg1']}}): + with self.assertRaises(ValueError) as cm: + koji.util.parse_maven_chain(confs) + self.assertEqual( + cm.exception.args[0], + 'No possible build order, missing/circular dependencies') + # missing deps + with mock.patch('koji.util.parse_maven_params', + return_value={ + 'pkg1': {'buildrequires': ['pkg2', 'pkg3']}, + 'pkg2': {'buildrequires': ['pkg3']}, + 'pkg3': {'buildrequires': ['pkg4']}}): + with self.assertRaises(ValueError) as cm: + koji.util.parse_maven_chain(confs) + self.assertEqual( + cm.exception.args[0], + 'No possible build order, missing/circular dependencies') + + def _read_conf(self, cfile): + config = ConfigParser.ConfigParser() + path = os.path.dirname(__file__) + with open(path + cfile, 'r') as conf_file: + config.readfp(conf_file) + return config + + +if __name__ == '__main__': + unittest.main()