1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-11-04 14:30:11 +01:00
fdroidserver/tests/build.TestCase

78 lines
3.0 KiB
Plaintext
Raw Normal View History

2016-01-04 21:17:58 +01:00
#!/usr/bin/env python3
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
import inspect
import optparse
import os
import re
import shutil
import sys
import tempfile
import unittest
localmodule = os.path.realpath(
os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..'))
print('localmodule: ' + localmodule)
if localmodule not in sys.path:
sys.path.insert(0, localmodule)
import fdroidserver.build
import fdroidserver.common
class BuildTest(unittest.TestCase):
'''fdroidserver/build.py'''
def _set_build_tools(self):
build_tools = os.path.join(fdroidserver.common.config['sdk_path'], 'build-tools')
if os.path.exists(build_tools):
fdroidserver.common.config['build_tools'] = ''
for f in sorted(os.listdir(build_tools), reverse=True):
versioned = os.path.join(build_tools, f)
if os.path.isdir(versioned) \
and os.path.isfile(os.path.join(versioned, 'aapt')):
fdroidserver.common.config['build_tools'] = versioned
break
return True
else:
print('no build-tools found: ' + build_tools)
return False
def _find_all(self):
for cmd in ('aapt', 'adb', 'android', 'zipalign'):
path = fdroidserver.common.find_sdk_tools_cmd(cmd)
if path is not None:
self.assertTrue(os.path.exists(path))
self.assertTrue(os.path.isfile(path))
def test_force_gradle_build_tools(self):
testsbase = os.path.join(os.path.dirname(__file__), '..', '.testfiles')
if not os.path.exists(testsbase):
os.makedirs(testsbase)
testsdir = tempfile.mkdtemp(prefix='test_adapt_gradle', dir=testsbase)
shutil.copytree(os.path.join(os.path.dirname(__file__), 'source-files'),
os.path.join(testsdir, 'source-files'))
teststring = 'FAKE_VERSION_FOR_TESTING'
fdroidserver.build.force_gradle_build_tools(testsdir, teststring)
use UTF8 as default instead of ASCII for .java .gradle pom.xml .java .gradle and XML files all can use any encoding. Most code is ASCII, but authors' names, etc. can easily be non-ASCII. UTF-8 is by far the most common file encoding. While UTF-8 is the default encoding inside the code in Python 3, it still has to deal with the real world, so the encoding needs to be explicitly set when reading and writing files. So this switches fdroidserver to expect UTF-8 instead of ASCII when parsing these files. For now, this commit means that we only support UTF-8 encoded *.java, pom.xml or *.gradle files. Ideally, the code would detect the encoding and use the actual one, but that's a lot more work, and its something that will not happen often. We can cross that bridge when we come to it. One approach, which is taken in the commit when possible, is to keep the data as `bytes`, in which case the encoding doesn't matter. This also fixes this crash when parsing gradle and maven files with non-ASCII chars: ERROR: test_adapt_gradle (__main__.BuildTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/var/lib/jenkins/workspace/fdroidserver-eighthave/tests/build.TestCase", line 59, in test_adapt_gradle fdroidserver.build.adapt_gradle(testsdir) File "/var/lib/jenkins/workspace/fdroidserver-eighthave/fdroidserver/build.py", line 445, in adapt_gradle path) File "/var/lib/jenkins/workspace/fdroidserver-eighthave/fdroidserver/common.py", line 188, in regsub_file text = f.read() File "/usr/lib/python3.4/encodings/ascii.py", line 26, in decode return codecs.ascii_decode(input, self.errors)[0] UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 9460: ordinal not in range(128)
2016-06-07 20:13:54 +02:00
pattern = re.compile(bytes("buildToolsVersion[\s=]+'%s'\s+" % teststring, 'utf8'))
for p in ('source-files/fdroid/fdroidclient/build.gradle',
'source-files/Zillode/syncthing-silk/build.gradle',
'source-files/open-keychain/open-keychain/build.gradle',
'source-files/osmandapp/osmand/build.gradle',
'source-files/open-keychain/open-keychain/OpenKeychain/build.gradle'):
use UTF8 as default instead of ASCII for .java .gradle pom.xml .java .gradle and XML files all can use any encoding. Most code is ASCII, but authors' names, etc. can easily be non-ASCII. UTF-8 is by far the most common file encoding. While UTF-8 is the default encoding inside the code in Python 3, it still has to deal with the real world, so the encoding needs to be explicitly set when reading and writing files. So this switches fdroidserver to expect UTF-8 instead of ASCII when parsing these files. For now, this commit means that we only support UTF-8 encoded *.java, pom.xml or *.gradle files. Ideally, the code would detect the encoding and use the actual one, but that's a lot more work, and its something that will not happen often. We can cross that bridge when we come to it. One approach, which is taken in the commit when possible, is to keep the data as `bytes`, in which case the encoding doesn't matter. This also fixes this crash when parsing gradle and maven files with non-ASCII chars: ERROR: test_adapt_gradle (__main__.BuildTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/var/lib/jenkins/workspace/fdroidserver-eighthave/tests/build.TestCase", line 59, in test_adapt_gradle fdroidserver.build.adapt_gradle(testsdir) File "/var/lib/jenkins/workspace/fdroidserver-eighthave/fdroidserver/build.py", line 445, in adapt_gradle path) File "/var/lib/jenkins/workspace/fdroidserver-eighthave/fdroidserver/common.py", line 188, in regsub_file text = f.read() File "/usr/lib/python3.4/encodings/ascii.py", line 26, in decode return codecs.ascii_decode(input, self.errors)[0] UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 9460: ordinal not in range(128)
2016-06-07 20:13:54 +02:00
with open(os.path.join(testsdir, p), 'rb') as f:
2015-10-08 13:20:35 +02:00
filedata = f.read()
self.assertIsNotNone(pattern.search(filedata))
if __name__ == "__main__":
parser = optparse.OptionParser()
parser.add_option("-v", "--verbose", action="store_true", default=False,
help="Spew out even more information than normal")
(fdroidserver.common.options, args) = parser.parse_args(['--verbose'])
newSuite = unittest.TestSuite()
newSuite.addTest(unittest.makeSuite(BuildTest))
unittest.main()