chiark / gitweb /
common: allow starting without a config file
[fdroidserver.git] / tests / index.TestCase
1 #!/usr/bin/env python3
2
3 import inspect
4 import optparse
5 import os
6 import sys
7 import unittest
8 import zipfile
9 from unittest.mock import patch
10
11 import requests
12
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)
18
19 import fdroidserver.common
20 import fdroidserver.index
21 import fdroidserver.signindex
22
23
24 GP_FINGERPRINT = 'B7C2EEFD8DAC7806AF67DFCD92EB18126BC08312A7F2D6F3862E46013C7A6135'
25
26
27 class IndexTest(unittest.TestCase):
28
29     def setUp(self):
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
35
36     @staticmethod
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)
43
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)
50
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
59             if f == 'testy.jar':
60                 self.assertTrue(fingerprint ==
61                                 '818E469465F96B704E27BE2FEE4C63AB' +
62                                 '9F83DDF30E7A34C7371A4728D83B0BC1')
63             if f == 'guardianproject.jar':
64                 self.assertTrue(fingerprint == GP_FINGERPRINT)
65
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)
73
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")
77
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")
81
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"'
86
87         head.return_value.headers = {'ETag': etag}
88         index, new_etag = fdroidserver.index.download_repo_index(url, etag=etag)
89
90         self.assertIsNone(index)
91         self.assertEqual(etag, new_etag)
92
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"'
98
99         # fake HTTP answers
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()
106
107         index, new_etag = fdroidserver.index.download_repo_index(url, etag=etag)
108
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)
116
117
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'])
123
124     newSuite = unittest.TestSuite()
125     newSuite.addTest(unittest.makeSuite(IndexTest))
126     unittest.main()