Add unittests for the build module

This patch adds 26 tests for the build module. They can be tested by
running `make test_build` from the root of the autospec repo.
This commit is contained in:
Matthew Johnson
2017-04-25 16:55:07 -07:00
parent 11569333b4
commit 13c6cdd838
2 changed files with 408 additions and 0 deletions
+3
View File
@@ -25,6 +25,9 @@ test_license:
test_buildpattern:
PYTHONPATH=${CURDIR}/autospec python3 tests/test_buildpattern.py
test_build:
PYTHONPATH=${CURDIR}/autospec python3 tests/test_build.py
test_autospec:
python3 tests/test_autospec.py -c ${CASES}
+405
View File
@@ -0,0 +1,405 @@
import unittest
from unittest.mock import patch, mock_open
import build
import files
class TestBuildpattern(unittest.TestCase):
@classmethod
def setUpClass(self):
"""
Class setup method to configure necessary modules
"""
build.config.setup_patterns()
def setUp(self):
"""
Test setup method to reset the buildpattern module
"""
build.success = 0
build.round = 0
build.must_restart = 0
build.base_path = None
build.output_path = None
build.download_path = None
build.mock_cmd = '/usr/bin/mock'
build.buildreq.buildreqs = set()
build.config.config_opts['32bit'] = False
def test_setup_workingdir(self):
"""
Test that setup_workingdir sets the correct directory patterns
"""
build.tarball.name = "testtarball"
build.setup_workingdir("test_directory")
self.assertEqual(build.base_path, "test_directory")
self.assertEqual(build.output_path, "test_directory/output")
self.assertEqual(build.download_path,
"test_directory/output/testtarball")
def test_simple_pattern_pkgconfig(self):
"""
Test simple_pattern_pkgconfig with match
"""
build.buildreq.config.config_opts['32bit'] = False
build.simple_pattern_pkgconfig('line to test for testpkg.xyz',
r'testpkg.xyz',
'testpkg')
self.assertIn('pkgconfig(testpkg)', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_simple_pattern_pkgconfig_32bit(self):
"""
Test simple_pattern_pkgconfig with match and 32bit option set
"""
build.buildreq.config.config_opts['32bit'] = True
build.simple_pattern_pkgconfig('line to test for testpkg.zyx',
r'testpkg.zyx',
'testpkgz')
self.assertIn('pkgconfig(32testpkgz)', build.buildreq.buildreqs)
self.assertIn('pkgconfig(testpkgz)', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_simple_pattern_pkgconfig_no_match(self):
"""
Test simple_pattern_pkgconfig with no match, nothing should be modified
"""
build.simple_pattern_pkgconfig('line to test for somepkg.xyz',
r'testpkg.xyz',
'testpkg')
self.assertEqual(build.buildreq.buildreqs, set())
self.assertEqual(build.must_restart, 0)
def test_simple_pattern(self):
"""
Test simple_pattern with match. The main difference between
simple_pattern and simple_pattern_pkgconfig is the string that is added
to buildreq.buildreqs.
"""
build.simple_pattern('line to test for testpkg.xyz',
r'testpkg.xyz',
'testpkg')
self.assertIn('testpkg', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_simple_pattern_no_match(self):
"""
Test simple_pattern with no match, nothing should be modified
"""
build.simple_pattern('line to test for somepkg.xyz',
r'testpkg.xyz',
'testpkg')
self.assertEqual(build.buildreq.buildreqs, set())
self.assertEqual(build.must_restart, 0)
def test_failed_pattern_no_match(self):
"""
Test failed_pattern with no match
"""
build.failed_pattern('line to test for failure: somepkg', r'(test)', 0)
self.assertEqual(build.buildreq.buildreqs, set())
self.assertEqual(build.must_restart, 0)
def test_failed_pattern_no_buildtool(self):
"""
Test failed_pattern with buildtool unset and initial match, but no
match in failed_commands.
"""
build.failed_pattern('line to test for failure: testpkg', r'(test)', 0)
self.assertEqual(build.buildreq.buildreqs, set())
self.assertEqual(build.must_restart, 0)
def test_failed_pattern_no_buildtool_match(self):
"""
Test failed_pattern with buildtool unset and match in failed_commands
"""
build.failed_pattern('line to test for failure: lex', r'(lex)', 0)
self.assertIn('flex', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_pkgconfig(self):
"""
Test failed_pattern with buildtool set to pkgconfig
"""
build.buildreq.config.config_opts['32bit'] = False
build.failed_pattern('line to test for failure: testpkg.xyz',
r'(testpkg)',
0, # verbose=0
buildtool='pkgconfig')
self.assertIn('pkgconfig(testpkg)', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_R(self):
"""
Test failed_pattern with buildtool set to R
"""
build.failed_pattern('line to test for failure: testpkg.r',
r'(testpkg)',
0, # verbose=0
buildtool='R')
self.assertIn('R-testpkg', build.buildreq.buildreqs)
self.assertIn('R-testpkg', build.buildreq.requires)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_perl(self):
"""
Test failed_pattern with buildtool set to perl
"""
build.failed_pattern('line to test for failure: testpkg.pl',
r'(testpkg)',
0, # verbose=0
buildtool='perl')
self.assertIn('perl(testpkg)', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_pypi(self):
"""
Test failed_pattern with buildtool set to pypi
"""
build.failed_pattern('line to test for failure: testpkg.py',
r'(testpkg)',
0, # verbose=0
buildtool='pypi')
self.assertIn('testpkg-python', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_go(self):
"""
Test failed_pattern with buildtool set to go
"""
build.failed_pattern('line to test for failure: testpkg.go',
r'(testpkg)',
0, # verbose=0
buildtool='go')
self.assertIn('testpkg', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_golang_name(self):
"""
Test failed_pattern with buildtool set to go with golang name in the
line to search. Should compile a name with
golang-<domain>-<project>-<repo>.
"""
build.failed_pattern('http://github.com/test/project',
r'(http://github.com/test/project)',
0, # verbose=0
buildtool='go')
self.assertIn('golang-github-test-project', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_ruby(self):
"""
Test failed_pattern with buildtool set to ruby, but no match in
config.gems, it should just prepend 'rubygem-' to the package name.
"""
build.failed_pattern('line to test for failure: testpkg.rb',
r'(testpkg)',
0, # verbose=0
buildtool='ruby')
self.assertIn('rubygem-testpkg', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_ruby_gem_match(self):
"""
Test failed_pattern with buildtool set to ruby and a match in
config.gems. In the particular case of test/unit, the result should
be rubygem-test-unit.
"""
build.failed_pattern('line to test for failure: test/unit',
r'(test/unit)',
0, # verbose=0
buildtool='ruby')
self.assertIn('rubygem-test-unit', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_ruby_table(self):
"""
Test failed_pattern with buildtool set to ruby table and a match in
config.gems
"""
build.failed_pattern('line to test for failure: test/unit',
r'(test/unit)',
0, # verbose=0
buildtool='ruby table')
self.assertIn('rubygem-test-unit', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_ruby_table_no_match(self):
"""
Test failed_pattern with buildtool set to ruby table but no match in
config.gems. This should not modify anything.
"""
build.failed_pattern('line to test for failure: testpkg',
r'(testpkg)',
0, # verbose=0
buildtool='ruby table')
self.assertEqual(build.buildreq.buildreqs, set())
self.assertEqual(build.must_restart, 0)
def test_failed_pattern_maven(self):
"""
Test failed_pattern with buildtool set to maven, but no match in
config.maven_jars, it should just prepend 'jdk-' to the package name.
"""
build.failed_pattern('line to test for failure: testpkg',
r'(testpkg)',
0, # verbose=0
buildtool='maven')
self.assertIn('jdk-testpkg', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_failed_pattern_maven_match(self):
"""
Test failed_pattern with buildtool set to maven with a match in
config.maven_jars. In the particular case of apache, the corresponding
maven jar is 'jdk-apache-parent'
"""
build.failed_pattern('line to test for failure: apache',
r'(apache)',
0, # verbose=0
buildtool='maven')
self.assertIn('jdk-apache-parent', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_parse_build_resultsi_pkgconfig(self):
"""
Test parse_build_results with a test log indicating failure due to a
missing qmake package (pkgconfig error)
"""
def mock_util_call(cmd):
del cmd
build.config.setup_patterns()
build.config.config_opts['32bit'] = True
call_backup = build.util.call
build.util.call = mock_util_call
fm = files.FileManager()
open_name = 'build.open'
content = 'line 1\nwhich: no qmake\nexiting'
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
build.parse_build_results('testname', 0, fm)
build.util.call = call_backup
self.assertIn('pkgconfig(Qt)', build.buildreq.buildreqs)
self.assertIn('pkgconfig(32Qt)', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_parse_build_results_simple_pats(self):
"""
Test parse_build_results with a test log indicating failure due to a
missing httpd-dev package (simple pat error)
"""
def mock_util_call(cmd):
del cmd
build.config.setup_patterns()
call_backup = build.util.call
build.util.call = mock_util_call
fm = files.FileManager()
open_name = 'build.open'
content = 'line 1\nchecking for Apache test module support\nexiting'
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
build.parse_build_results('testname', 0, fm)
build.util.call = call_backup
self.assertIn('httpd-dev', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_parse_build_results_failed_pats(self):
"""
Test parse_build_results with a test log indicating failure due to a
missing testpkg (failed pat error). The specific error is a python
ImportError.
"""
def mock_util_call(cmd):
del cmd
build.config.setup_patterns()
call_backup = build.util.call
build.util.call = mock_util_call
fm = files.FileManager()
open_name = 'build.open'
content = 'line 1\nImportError: No module named testpkg\nexiting'
m_open = mock_open(read_data=content)
with patch(open_name, m_open, create=True):
build.parse_build_results('testname', 0, fm)
build.util.call = call_backup
self.assertIn('testpkg-python', build.buildreq.buildreqs)
self.assertEqual(build.must_restart, 1)
def test_set_mock(self):
"""
Test set_mock when user is not in the mock group
"""
class mock_getgrgid(object):
def __init__(self, g):
self.gr_name = 'not_mock'
def mock_getgroups():
return ['gr1', 'gr2', 'gr3']
def mock_exists(path):
return True
getgrgid_backup = build.grp.getgrgid
getgroups_backup = build.os.getgroups
exists_backup = build.os.path.exists
build.grp.getgrgid = mock_getgrgid
build.os.getgroups = mock_getgroups
build.os.path.exists = mock_exists
build.set_mock()
build.grp.getgrgid = getgrgid_backup
build.os.getgroups = getgroups_backup
build.os.path.exists = exists_backup
self.assertEqual(build.mock_cmd, 'sudo /usr/bin/mock')
def test_set_mock_user_in_mock_group(self):
"""
Test set_mock when user is in the mock group
"""
class mock_getgrgid(object):
def __init__(self, g):
self.gr_name = 'mock'
def mock_getgroups():
return ['gr1', 'gr2', 'gr3']
def mock_exists(path):
return True
getgrgid_backup = build.grp.getgrgid
getgroups_backup = build.os.getgroups
exists_backup = build.os.path.exists
build.grp.getgrgid = mock_getgrgid
build.os.getgroups = mock_getgroups
build.os.path.exists = mock_exists
build.set_mock()
build.grp.getgrgid = getgrgid_backup
build.os.getgroups = getgroups_backup
build.os.path.exists = exists_backup
self.assertEqual(build.mock_cmd, '/usr/bin/mock')
if __name__ == '__main__':
unittest.main(buffer=True)