mirror of
https://github.com/clearlinux/autospec.git
synced 2026-09-04 12:51:39 +00:00
Many different components require the target download path and it is needed early. Previously code existed to attempt to autodetect its location and so defining the path was enforced later in the build process. This created problems with ordering functions based on this requirement but since the target path is now certain to be defined at startup (due to previous changes) we can better align the location and initialization of the data to the Config class. As part of this change also avoid requiring the temporary working directory to be setup as part of the Build class. This is done as a cleanup due to the only real user of this location being the Content class. This also drops the stand-alone pkg_integrety main function that was initially used as a one off test to avoid needing to run autospec to validate the integrity of a package. This feature was seldom used and doesn't function well without handling configuration so it was dropped.
265 lines
8.7 KiB
Python
265 lines
8.7 KiB
Python
from contextlib import redirect_stdout
|
|
from io import BytesIO, StringIO
|
|
import os
|
|
import tempfile
|
|
import unittest
|
|
from unittest.mock import patch, mock_open, MagicMock
|
|
|
|
import pycurl
|
|
|
|
import config
|
|
import download
|
|
import license
|
|
import util
|
|
|
|
|
|
class TestLicense(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
license.licenses = []
|
|
|
|
def test_add_license(self):
|
|
"""
|
|
Test add_license from valid string, Apache-2 should be translated to
|
|
Apache-2.0
|
|
"""
|
|
conf = config.Config("")
|
|
conf.setup_patterns()
|
|
self.assertTrue(license.add_license('Apache-2', conf.license_translations, conf.license_blacklist))
|
|
self.assertIn('Apache-2.0', license.licenses)
|
|
|
|
def test_add_license_present(self):
|
|
"""
|
|
Test add_license from valid string, but license is already present in
|
|
the licenses list. Should return True and should not modify the
|
|
licenses list. GPL-3 translates to GPL-3.0.
|
|
"""
|
|
conf = config.Config("")
|
|
conf.setup_patterns()
|
|
license.licenses.append('GPL-3.0')
|
|
self.assertTrue(license.add_license('GPL-3', conf.license_translations, conf.license_blacklist))
|
|
self.assertEqual(['GPL-3.0'], license.licenses)
|
|
|
|
def test_add_license_blacklisted(self):
|
|
"""
|
|
Test add_license from string in license_blacklist. Should return False
|
|
and should not modify the licenses list.
|
|
"""
|
|
conf = config.Config("")
|
|
conf.setup_patterns()
|
|
# sanity check to make sure the licenses list is empty before the later
|
|
# assertIn() call
|
|
self.assertEqual(license.licenses, [])
|
|
|
|
self.assertFalse(license.add_license('License', conf.license_translations, conf.license_blacklist))
|
|
self.assertNotIn('License', license.licenses)
|
|
|
|
def test_license_from_copying_hash(self):
|
|
"""
|
|
Test license_from_copying_hash with valid license file
|
|
"""
|
|
conf = config.Config("")
|
|
conf.setup_patterns()
|
|
license.license_from_copying_hash('tests/COPYING_TEST', '', conf, '')
|
|
self.assertIn('GPL-3.0', license.licenses)
|
|
|
|
def test_license_from_copying_hash_no_license_show(self):
|
|
"""
|
|
Test license_from_copying_hash with invalid hash and no license_show
|
|
set
|
|
"""
|
|
conf = config.Config("")
|
|
conf.setup_patterns()
|
|
# remove the hash from license_hashes
|
|
del(conf.license_hashes[license.get_sha1sum('tests/COPYING_TEST')])
|
|
conf.license_show = "license.show.url"
|
|
license.license_from_copying_hash('tests/COPYING_TEST', '', conf, '')
|
|
|
|
self.assertEquals(license.licenses, [])
|
|
|
|
def test_license_from_copying_hash_bad_license(self):
|
|
"""
|
|
Test license_from_copying_hash with invalid license file
|
|
"""
|
|
conf = config.Config("")
|
|
content = util.get_contents("tests/COPYING_TEST").replace(b"GNU", b"SNU")
|
|
m_open = MagicMock()
|
|
m_open.__str__.return_value = content
|
|
|
|
with patch('license.get_contents', m_open, create=True):
|
|
license.license_from_copying_hash('copying.txt', '', conf, '')
|
|
|
|
self.assertEquals(license.licenses, [])
|
|
|
|
def test_license_from_copying_hash_license_server_excep(self):
|
|
"""
|
|
Test license_from_copying_hash with license server when pycurl raises
|
|
an exception.
|
|
"""
|
|
class MockCurl():
|
|
URL = None
|
|
WRITEDATA = None
|
|
POSTFIELDS = None
|
|
FOLLOWLOCATION = 0
|
|
FAILONERROR = False
|
|
CONNECTTIMEOUT = 0
|
|
TIMEOUT = 0
|
|
LOW_SPEED_LIMIT = 0
|
|
LOW_SPEED_TIME = 0
|
|
def setopt(_, __, ___):
|
|
pass
|
|
|
|
def perform(_):
|
|
raise pycurl.error('Test Exception')
|
|
|
|
def close(_):
|
|
pass
|
|
|
|
# set the mock curl
|
|
download.pycurl.Curl = MockCurl
|
|
|
|
conf = config.Config("")
|
|
conf.license_fetch = 'license.server.url'
|
|
|
|
# let's check that the proper thing is being printed as well
|
|
out = StringIO()
|
|
with redirect_stdout(out):
|
|
with self.assertRaises(SystemExit):
|
|
license.license_from_copying_hash('tests/COPYING_TEST', '', conf, '')
|
|
|
|
self.assertIn('Unable to fetch license.server.url: Test Exception', out.getvalue())
|
|
|
|
# unset the manual mock
|
|
download.pycurl.Curl = pycurl.Curl
|
|
|
|
def test_license_from_copying_hash_license_server(self):
|
|
"""
|
|
Test license_from_copying_hash with license server. This is heavily
|
|
mocked.
|
|
"""
|
|
class MockBytesIO(BytesIO):
|
|
"""
|
|
Mock class for BytesIO to set returnvalue of BytesIO.getvalue()
|
|
"""
|
|
def getvalue(_):
|
|
return 'GPL-3.0'.encode('utf-8')
|
|
|
|
# set the mocks
|
|
download.BytesIO = MockBytesIO
|
|
|
|
class MockCurl():
|
|
URL = None
|
|
WRITEDATA = None
|
|
POSTFIELDS = None
|
|
FOLLOWLOCATION = 0
|
|
FAILONERROR = False
|
|
CONNECTTIMEOUT = 0
|
|
TIMEOUT = 0
|
|
LOW_SPEED_LIMIT = 0
|
|
LOW_SPEED_TIME = 0
|
|
def setopt(_, __, ___):
|
|
pass
|
|
|
|
def perform(_):
|
|
pass
|
|
|
|
def close(_):
|
|
pass
|
|
|
|
def getinfo(_, __):
|
|
return 200
|
|
|
|
# set the mock curl
|
|
download.pycurl.Curl = MockCurl
|
|
|
|
conf = config.Config("")
|
|
conf.license_fetch = 'license.server.url'
|
|
|
|
# let's check that the proper thing is being printed as well
|
|
out = StringIO()
|
|
with redirect_stdout(out):
|
|
license.license_from_copying_hash('tests/COPYING_TEST', '', conf, '')
|
|
|
|
self.assertIn('GPL-3.0', license.licenses)
|
|
self.assertIn('License : GPL-3.0 (server)', out.getvalue())
|
|
|
|
# unset the manual mock
|
|
download.BytesIO = BytesIO
|
|
|
|
# unset the manual mock
|
|
download.pycurl.Curl = pycurl.Curl
|
|
|
|
def test_scan_for_licenses(self):
|
|
"""
|
|
Test scan_for_licenses in temporary directory with valid license file
|
|
"""
|
|
conf = config.Config("")
|
|
conf.setup_patterns()
|
|
with open('tests/COPYING_TEST', 'rb') as copyingf:
|
|
content = copyingf.read()
|
|
|
|
with tempfile.TemporaryDirectory() as tmpd:
|
|
# create the copying file
|
|
with open(os.path.join(tmpd, 'COPYING'), 'w') as newcopyingf:
|
|
newcopyingf.write(content.decode('utf-8'))
|
|
# create some cruft for testing
|
|
for testf in ['testlib.c', 'testmain.c', 'testheader.h']:
|
|
with open(os.path.join(tmpd, testf), 'w') as newtestf:
|
|
newtestf.write('test content')
|
|
license.scan_for_licenses(tmpd, conf, '')
|
|
|
|
self.assertIn('GPL-3.0', license.licenses)
|
|
|
|
def test_scan_for_licenses_none(self):
|
|
"""
|
|
Test scan_for_licenses in temporary directory with no matching files.
|
|
Should not add any licenses, should print a fatal message, should exit
|
|
with a status code of 1.
|
|
"""
|
|
conf = config.Config("")
|
|
conf.setup_patterns()
|
|
with tempfile.TemporaryDirectory() as tmpd:
|
|
# create some cruft for testing
|
|
for testf in ['testlib.c', 'testmain.c', 'testheader.h']:
|
|
with open(os.path.join(tmpd, testf), 'w') as newtestf:
|
|
newtestf.write('test content')
|
|
# let's check that the proper thing is being printed as well
|
|
out = StringIO()
|
|
with redirect_stdout(out):
|
|
with self.assertRaises(SystemExit) as thread:
|
|
license.scan_for_licenses(tmpd, conf, '')
|
|
|
|
self.assertEqual(thread.exception.code, 1)
|
|
self.assertIn("Cannot find any license", out.getvalue())
|
|
self.assertEqual(license.licenses, [])
|
|
|
|
def test_load_specfile(self):
|
|
"""
|
|
Test load_specfile with populated license list. This method is not
|
|
normally tested but there is some logic here.
|
|
"""
|
|
class MockSpecfile(object):
|
|
licenses = []
|
|
|
|
license.licenses = ['GPL-3.0', 'MIT']
|
|
specfile = MockSpecfile()
|
|
license.load_specfile(specfile)
|
|
self.assertEqual(specfile.licenses, license.licenses)
|
|
|
|
def test_load_specfile_none(self):
|
|
"""
|
|
Test load_specfile with unpopulated license list. This method is not
|
|
normally tested but there is some logic here.
|
|
"""
|
|
class MockSpecfile(object):
|
|
licenses = []
|
|
|
|
license.licenses = []
|
|
specfile = MockSpecfile()
|
|
license.load_specfile(specfile)
|
|
self.assertEqual(specfile.licenses, [license.default_license])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main(buffer=True)
|