9 from unittest.mock import patch
13 localmodule = os.path.realpath(
14 os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..'))
15 print('localmodule: ' + localmodule)
16 if localmodule not in sys.path:
17 sys.path.insert(0, localmodule)
19 import fdroidserver.common
20 import fdroidserver.index
21 import fdroidserver.signindex
24 GP_FINGERPRINT = 'B7C2EEFD8DAC7806AF67DFCD92EB18126BC08312A7F2D6F3862E46013C7A6135'
27 class IndexTest(unittest.TestCase):
30 fdroidserver.common.config = None
31 config = fdroidserver.common.read_config(fdroidserver.common.options)
32 config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner')
33 fdroidserver.common.config = config
34 fdroidserver.signindex.config = config
37 def test_verify_jar_signature_succeeds():
38 basedir = os.path.dirname(__file__)
39 source_dir = os.path.join(basedir, 'signindex')
40 for f in ('testy.jar', 'guardianproject.jar'):
41 testfile = os.path.join(source_dir, f)
42 fdroidserver.index.verify_jar_signature(testfile)
44 def test_verify_jar_signature_fails(self):
45 basedir = os.path.dirname(__file__)
46 source_dir = os.path.join(basedir, 'signindex')
47 testfile = os.path.join(source_dir, 'unsigned.jar')
48 with self.assertRaises(fdroidserver.index.VerificationException):
49 fdroidserver.index.verify_jar_signature(testfile)
51 def test_get_public_key_from_jar_succeeds(self):
52 basedir = os.path.dirname(__file__)
53 source_dir = os.path.join(basedir, 'signindex')
54 for f in ('testy.jar', 'guardianproject.jar'):
55 testfile = os.path.join(source_dir, f)
56 jar = zipfile.ZipFile(testfile)
57 _, fingerprint = fdroidserver.index.get_public_key_from_jar(jar)
58 # comparing fingerprints should be sufficient
60 self.assertTrue(fingerprint ==
61 '818E469465F96B704E27BE2FEE4C63AB' +
62 '9F83DDF30E7A34C7371A4728D83B0BC1')
63 if f == 'guardianproject.jar':
64 self.assertTrue(fingerprint == GP_FINGERPRINT)
66 def test_get_public_key_from_jar_fails(self):
67 basedir = os.path.dirname(__file__)
68 source_dir = os.path.join(basedir, 'signindex')
69 testfile = os.path.join(source_dir, 'unsigned.jar')
70 jar = zipfile.ZipFile(testfile)
71 with self.assertRaises(fdroidserver.index.VerificationException):
72 fdroidserver.index.get_public_key_from_jar(jar)
74 def test_download_repo_index_no_fingerprint(self):
75 with self.assertRaises(fdroidserver.index.VerificationException):
76 fdroidserver.index.download_repo_index("http://example.org")
78 def test_download_repo_index_no_jar(self):
79 with self.assertRaises(requests.exceptions.HTTPError):
80 fdroidserver.index.download_repo_index("http://example.org?fingerprint=nope")
82 @patch('requests.head')
83 def test_download_repo_index_same_etag(self, head):
84 url = 'http://example.org?fingerprint=test'
85 etag = '"4de5-54d840ce95cb9"'
87 head.return_value.headers = {'ETag': etag}
88 index, new_etag = fdroidserver.index.download_repo_index(url, etag=etag)
90 self.assertIsNone(index)
91 self.assertEqual(etag, new_etag)
93 @patch('requests.get')
94 @patch('requests.head')
95 def test_download_repo_index_new_etag(self, head, get):
96 url = 'http://example.org?fingerprint=' + GP_FINGERPRINT
97 etag = '"4de5-54d840ce95cb9"'
100 head.return_value.headers = {'ETag': 'new_etag'}
101 get.return_value.headers = {'ETag': 'new_etag'}
102 get.return_value.status_code = 200
103 testfile = os.path.join(os.path.dirname(__file__), 'signindex', 'guardianproject-v1.jar')
104 with open(testfile, 'rb') as file:
105 get.return_value.content = file.read()
107 index, new_etag = fdroidserver.index.download_repo_index(url, etag=etag)
109 # assert that the index was retrieved properly
110 self.assertEqual('Guardian Project Official Releases', index['repo']['name'])
111 self.assertEqual(GP_FINGERPRINT, index['repo']['fingerprint'])
112 self.assertTrue(len(index['repo']['pubkey']) > 500)
113 self.assertEqual(10, len(index['apps']))
114 self.assertEqual(10, len(index['packages']))
115 self.assertEqual('new_etag', new_etag)
118 if __name__ == "__main__":
119 parser = optparse.OptionParser()
120 parser.add_option("-v", "--verbose", action="store_true", default=False,
121 help="Spew out even more information than normal")
122 (fdroidserver.common.options, args) = parser.parse_args(['--verbose'])
124 newSuite = unittest.TestSuite()
125 newSuite.addTest(unittest.makeSuite(IndexTest))