From 298a88a4980be796469ec161c156d842da4e7c94 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 8 Dec 2014 22:55:14 +0100 Subject: [PATCH] added test case for common.isApkDebuggable() Just getting into the habit of adding tests to everything that I change... Also, it should be useful to have an unsigned APK in the test collection, since `fdroid update` should handle it gracefully and give a warning of some kind. --- tests/common.TestCase | 54 +++++++++++++++++++++++++++++++ tests/run-tests | 1 + tests/urzip-release-unsigned.apk | Bin 0 -> 8471 bytes tests/urzip-release.apk | Bin 0 -> 11406 bytes 4 files changed, 55 insertions(+) create mode 100755 tests/common.TestCase create mode 100644 tests/urzip-release-unsigned.apk create mode 100644 tests/urzip-release.apk diff --git a/tests/common.TestCase b/tests/common.TestCase new file mode 100755 index 00000000..d4bbd61b --- /dev/null +++ b/tests/common.TestCase @@ -0,0 +1,54 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +# http://www.drdobbs.com/testing/unit-testing-with-python/240165163 + +import inspect +import optparse +import os +import sys +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.common + +class CommonTest(unittest.TestCase): + '''fdroidserver/common.py''' + + def testIsApkDebuggable(self): + config = dict() + config['aapt'] = '/usr/bin/aapt' + # these are set debuggable + testfiles = [] + testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip.apk')) + testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-badsig.apk')) + testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-badcert.apk')) + for apkfile in testfiles: + debuggable = fdroidserver.common.isApkDebuggable(apkfile, config) + self.assertTrue(debuggable, + "debuggable APK state was not properly parsed!") + # these are set NOT debuggable + testfiles = [] + testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-release.apk')) + testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-release-unsigned.apk')) + for apkfile in testfiles: + debuggable = fdroidserver.common.isApkDebuggable(apkfile, config) + self.assertFalse(debuggable, + "debuggable APK state was not properly parsed!") + + +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(CommonTest)) + unittest.main() diff --git a/tests/run-tests b/tests/run-tests index ae566b74..486bb3ea 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -98,6 +98,7 @@ echo_header "test python getsig replacement" cd $WORKSPACE/tests/getsig ./make.sh cd $WORKSPACE/tests +./common.TestCase ./update.TestCase diff --git a/tests/urzip-release-unsigned.apk b/tests/urzip-release-unsigned.apk new file mode 100644 index 0000000000000000000000000000000000000000..7bc22294728a0cac078b477aa1c0195f9ef934d0 GIT binary patch literal 8471 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 UAz#P=XK)B0RN#=#h5^$0FC;uyQvd(} literal 0 HcmV?d00001