26
26
from UpdateManager.Core.LivePatchSocket import LivePatchSocket, LivePatchFix
29
status0 = {'architecture': 'x86_64',
30
'boot-time': datetime.datetime(2017, 6, 27, 11, 16),
31
'client-version': '7.21',
32
'cpu-model': 'Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz',
33
'last-check': datetime.datetime(2017, 6, 28, 14, 23, 29, 683361),
34
'machine-id': 123456789,
35
'machine-token': 987654321,
36
'uptime': '27h12m12s'}
38
status1 = {'architecture': 'x86_64',
39
'boot-time': datetime.datetime(2017, 6, 27, 11, 16),
40
'client-version': '7.21',
41
'cpu-model': 'Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz',
42
'last-check': datetime.datetime(2017, 6, 28, 14, 23, 29, 683361),
43
'machine-id': 123456789,
44
'machine-token': 987654321,
45
'status': [{'kernel': '4.4.0-78.99-generic',
46
'livepatch': {'checkState': 'needs-check',
48
'patchState': 'nothing-to-apply',
51
'uptime': '27h12m12s'}
53
status2 = {'architecture': 'x86_64',
54
'boot-time': datetime.datetime(2017, 6, 27, 11, 16),
55
'client-version': '7.21',
56
'cpu-model': 'Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz',
57
'last-check': datetime.datetime(2017, 6, 28, 14, 23, 29, 683361),
58
'machine-id': 123456789,
59
'machine-token': 987654321,
60
'status': [{'kernel': '4.4.0-78.99-generic',
61
'livepatch': {'checkState': 'checked',
62
'fixes': '* CVE-2016-0001\n'
64
'* CVE-2017-0001 (unpatched)\n'
66
'patchState': 'applied',
69
'uptime': '27h12m12s'}
30
"architecture": "x86_64",
31
"boot-time": datetime.datetime(2017, 6, 27, 11, 16),
32
"client-version": "7.21",
33
"cpu-model": "Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz",
34
"last-check": datetime.datetime(2017, 6, 28, 14, 23, 29, 683361),
35
"machine-id": 123456789,
36
"machine-token": 987654321,
37
"uptime": "27h12m12s",
41
"architecture": "x86_64",
42
"boot-time": datetime.datetime(2017, 6, 27, 11, 16),
43
"client-version": "7.21",
44
"cpu-model": "Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz",
45
"last-check": datetime.datetime(2017, 6, 28, 14, 23, 29, 683361),
46
"machine-id": 123456789,
47
"machine-token": 987654321,
50
"kernel": "4.4.0-78.99-generic",
52
"checkState": "needs-check",
54
"patchState": "nothing-to-apply",
60
"uptime": "27h12m12s",
64
"architecture": "x86_64",
65
"boot-time": datetime.datetime(2017, 6, 27, 11, 16),
66
"client-version": "7.21",
67
"cpu-model": "Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz",
68
"last-check": datetime.datetime(2017, 6, 28, 14, 23, 29, 683361),
69
"machine-id": 123456789,
70
"machine-token": 987654321,
73
"kernel": "4.4.0-78.99-generic",
75
"checkState": "checked",
76
"fixes": "* CVE-2016-0001\n"
78
"* CVE-2017-0001 (unpatched)\n"
80
"patchState": "applied",
86
"uptime": "27h12m12s",
72
90
class TestUtils(object):
75
92
def __TimeoutCallback(user_data=None):
76
93
user_data[0] = True
116
137
class TestLivePatchSocket(unittest.TestCase):
118
138
def test_get_check_state(self):
119
139
check_state = LivePatchSocket.get_check_state(status0)
120
self.assertEqual(check_state, 'check-failed')
140
self.assertEqual(check_state, "check-failed")
121
141
check_state = LivePatchSocket.get_check_state(status1)
122
self.assertEqual(check_state, 'needs-check')
142
self.assertEqual(check_state, "needs-check")
123
143
check_state = LivePatchSocket.get_check_state(status2)
124
self.assertEqual(check_state, 'checked')
144
self.assertEqual(check_state, "checked")
126
146
def test_get_patch_state(self):
127
147
patch_state = LivePatchSocket.get_patch_state(status0)
128
self.assertEqual(patch_state, 'unknown')
148
self.assertEqual(patch_state, "unknown")
129
149
patch_state = LivePatchSocket.get_patch_state(status1)
130
self.assertEqual(patch_state, 'nothing-to-apply')
150
self.assertEqual(patch_state, "nothing-to-apply")
131
151
patch_state = LivePatchSocket.get_patch_state(status2)
132
self.assertEqual(patch_state, 'applied')
152
self.assertEqual(patch_state, "applied")
134
154
def test_get_fixes(self):
135
155
fixes = LivePatchSocket.get_fixes(status0)
137
157
fixes = LivePatchSocket.get_fixes(status1)
138
158
self.assertEqual(fixes, [])
139
159
fixes = LivePatchSocket.get_fixes(status2)
140
self.assertEqual(fixes, [LivePatchFix('CVE-2016-0001'),
141
LivePatchFix('CVE-2016-0002'),
142
LivePatchFix('CVE-2017-0001 (unpatched)'),
143
LivePatchFix('CVE-2017-0001')])
163
LivePatchFix("CVE-2016-0001"),
164
LivePatchFix("CVE-2016-0002"),
165
LivePatchFix("CVE-2017-0001 (unpatched)"),
166
LivePatchFix("CVE-2017-0001"),
145
170
def test_livepatch_fix(self):
146
fix = LivePatchFix('CVE-2016-0001')
147
self.assertEqual(fix.name, 'CVE-2016-0001')
171
fix = LivePatchFix("CVE-2016-0001")
172
self.assertEqual(fix.name, "CVE-2016-0001")
148
173
self.assertTrue(fix.patched)
150
fix = LivePatchFix('CVE-2016-0001 (unpatched)')
151
self.assertEqual(fix.name, 'CVE-2016-0001')
175
fix = LivePatchFix("CVE-2016-0001 (unpatched)")
176
self.assertEqual(fix.name, "CVE-2016-0001")
152
177
self.assertFalse(fix.patched)
154
179
def test_callback_not_active(self):
155
180
mock_http_conn = Mock(spec=http.client.HTTPConnection)
156
attrs = {'getresponse.return_value': MockResponse(400, None)}
181
attrs = {"getresponse.return_value": MockResponse(400, None)}
157
182
mock_http_conn.configure_mock(**attrs)
159
184
cb_called = [False]
179
205
def on_done(active, check_state, patch_state, fixes):
180
206
cb_called[0] = True
181
207
self.assertTrue(active)
182
self.assertEqual(check_state, 'checked')
183
self.assertEqual(patch_state, 'applied')
184
self.assertEqual(fixes, [LivePatchFix('CVE-2016-0001'),
185
LivePatchFix('CVE-2016-0002'),
186
LivePatchFix('CVE-2017-0001 (unpatched)'),
187
LivePatchFix('CVE-2017-0001')])
208
self.assertEqual(check_state, "checked")
209
self.assertEqual(patch_state, "applied")
213
LivePatchFix("CVE-2016-0001"),
214
LivePatchFix("CVE-2016-0002"),
215
LivePatchFix("CVE-2017-0001 (unpatched)"),
216
LivePatchFix("CVE-2017-0001"),
189
220
lp = LivePatchSocket(mock_http_conn)
190
221
lp.get_status(on_done)
192
223
mock_http_conn.request.assert_called_with(
193
'GET', '/status?verbose=True')
224
"GET", "/status?verbose=True"
194
226
TestUtils.WaitUntilMSec(self, lambda: cb_called[0] is True)
197
if __name__ == '__main__':
229
if __name__ == "__main__":
198
230
if len(sys.argv) > 1 and sys.argv[1] == "-v":
199
231
logging.basicConfig(level=logging.DEBUG)