[bug] get certificate times as UTC, add tests
[leap_pycommon.git] / src / leap / common / tests / test_certs.py
1 # -*- coding: utf-8 -*-
2 # test_certs.py
3 # Copyright (C) 2013 LEAP
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 """
18 Tests for:
19     * leap/common/certs.py
20 """
21 import os
22 import time
23
24 try:
25     import unittest2 as unittest
26 except ImportError:
27     import unittest
28
29 from leap.common import certs
30 from leap.common.testing.basetest import BaseLeapTest
31
32 TEST_CERT_PEM = os.path.join(
33     os.path.split(__file__)[0],
34     '..', 'testing', "leaptest_combined_keycert.pem")
35
36 # Values from the test cert file:
37 # Not Before: Sep  3 17:52:16 2013 GMT
38 # Not After : Sep  1 17:52:16 2023 GMT
39 CERT_NOT_BEFORE = (2013, 9, 3, 17, 52, 16, 1, 246, 0)
40 CERT_NOT_AFTER = (2023, 9, 1, 17, 52, 16, 4, 244, 0)
41
42
43 class CertsTest(BaseLeapTest):
44
45     def setUp(self):
46         pass
47
48     def tearDown(self):
49         pass
50
51     def test_should_redownload_if_no_cert(self):
52         self.assertTrue(certs.should_redownload(certfile=""))
53
54     def test_should_redownload_if_invalid_pem(self):
55         cert_path = self.get_tempfile('test_pem_file.pem')
56
57         with open(cert_path, 'w') as f:
58             f.write('this is some invalid data for the pem file')
59
60         self.assertTrue(certs.should_redownload(cert_path))
61
62     def test_should_redownload_if_before(self):
63         new_now = lambda: time.struct_time(CERT_NOT_BEFORE)
64         self.assertTrue(certs.should_redownload(TEST_CERT_PEM, now=new_now))
65
66     def test_should_redownload_if_after(self):
67         new_now = lambda: time.struct_time(CERT_NOT_AFTER)
68         self.assertTrue(certs.should_redownload(TEST_CERT_PEM, now=new_now))
69
70     def test_not_should_redownload(self):
71         self.assertFalse(certs.should_redownload(TEST_CERT_PEM))
72
73     def test_is_valid_pemfile(self):
74         with open(TEST_CERT_PEM) as f:
75             cert_data = f.read()
76
77         self.assertTrue(certs.is_valid_pemfile(cert_data))
78
79     def test_not_is_valid_pemfile(self):
80         cert_data = 'this is some invalid data for the pem file'
81
82         self.assertFalse(certs.is_valid_pemfile(cert_data))
83
84     def test_get_cert_time_boundaries(self):
85         """
86         This test ensures us that the returned values are returned in UTC/GMT.
87         """
88         with open(TEST_CERT_PEM) as f:
89             cert_data = f.read()
90
91         valid_from, valid_to = certs.get_cert_time_boundaries(cert_data)
92         self.assertEqual(tuple(valid_from), CERT_NOT_BEFORE)
93         self.assertEqual(tuple(valid_to), CERT_NOT_AFTER)
94
95
96 if __name__ == "__main__":
97     unittest.main()