Completed
Push — master ( 7a7f2e...ca40a9 )
by Juan José
13s queued 11s
created

tests.test_openvas.OpenvasCommandTestCase.test_get_gvm_libs_version()   A

Complexity

Conditions 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
nop 2
dl 0
loc 8
rs 10
c 0
b 0
f 0
1
# -*- coding: utf-8 -*-
2
# Copyright (C) 2014-2020 Greenbone Networks GmbH
3
#
4
# SPDX-License-Identifier: AGPL-3.0-or-later
5
#
6
# This program is free software: you can redistribute it and/or modify
7
# it under the terms of the GNU Affero General Public License as
8
# published by the Free Software Foundation, either version 3 of the
9
# License, or (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful,
12
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
# GNU Affero General Public License for more details.
15
#
16
# You should have received a copy of the GNU Affero General Public License
17
# along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19
20
import subprocess
21
22
from unittest import TestCase
23
from unittest.mock import patch, MagicMock
24
25
from ospd_openvas.openvas import Openvas
26
27
28
class OpenvasCommandTestCase(TestCase):
29
    @patch('ospd_openvas.openvas.subprocess.check_output')
30
    def test_get_version(self, mock_check_output: MagicMock):
31
        mock_check_output.return_value = b"OpenVAS 20.08"
32
33
        self.assertEqual(Openvas.get_version(), 'OpenVAS 20.08')
34
35
        mock_check_output.assert_called_with(
36
            ['openvas', '-V'], stderr=subprocess.STDOUT
37
        )
38
39
    @patch('ospd_openvas.openvas.subprocess.check_output')
40
    def test_get_version_not_found(self, mock_check_output: MagicMock):
41
        mock_check_output.return_value = b"Foo 20.08"
42
43
        self.assertIsNone(Openvas.get_version())
44
45
        mock_check_output.assert_called_with(
46
            ['openvas', '-V'], stderr=subprocess.STDOUT
47
        )
48
49
    @patch('ospd_openvas.openvas.subprocess.check_output')
50
    def test_get_version_with_error(self, mock_check_output: MagicMock):
51
        mock_check_output.side_effect = subprocess.SubprocessError('foo')
52
53
        self.assertIsNone(Openvas.get_version())
54
55
        mock_check_output.assert_called_with(
56
            ['openvas', '-V'], stderr=subprocess.STDOUT
57
        )
58
59
        mock_check_output.reset_mock()
60
        mock_check_output.side_effect = OSError('foo')
61
62
        self.assertIsNone(Openvas.get_version())
63
64
        mock_check_output.assert_called_with(
65
            ['openvas', '-V'], stderr=subprocess.STDOUT
66
        )
67
68
    @patch('ospd_openvas.openvas.subprocess.check_call')
69
    def test_check(self, mock_check_call: MagicMock):
70
        self.assertTrue(Openvas.check())
71
        mock_check_call.assert_called_with(
72
            ['openvas', '-V'], stdout=subprocess.DEVNULL
73
        )
74
75
    @patch('ospd_openvas.openvas.subprocess.check_call')
76
    def test_check_with_error(self, mock_check_call: MagicMock):
77
        mock_check_call.side_effect = subprocess.SubprocessError('foo')
78
79
        self.assertFalse(Openvas.check())
80
        mock_check_call.assert_called_with(
81
            ['openvas', '-V'], stdout=subprocess.DEVNULL
82
        )
83
84
        mock_check_call.reset_mock()
85
        mock_check_call.side_effect = OSError('foo')
86
87
        self.assertFalse(Openvas.check())
88
        mock_check_call.assert_called_with(
89
            ['openvas', '-V'], stdout=subprocess.DEVNULL
90
        )
91
92
    @patch('ospd_openvas.openvas.subprocess.check_call')
93
    def test_check_sudo(self, mock_check_call: MagicMock):
94
        self.assertTrue(Openvas.check_sudo())
95
        mock_check_call.assert_called_with(
96
            ['sudo', '-n', 'openvas', '-s'], stdout=subprocess.DEVNULL
97
        )
98
99
    @patch('ospd_openvas.openvas.subprocess.check_call')
100
    def test_check_sudo_with_error(self, mock_check_call: MagicMock):
101
        mock_check_call.side_effect = subprocess.SubprocessError('foo')
102
103
        self.assertFalse(Openvas.check_sudo())
104
        mock_check_call.assert_called_with(
105
            ['sudo', '-n', 'openvas', '-s'], stdout=subprocess.DEVNULL
106
        )
107
108
        mock_check_call.reset_mock()
109
        mock_check_call.side_effect = OSError('foo')
110
111
        self.assertFalse(Openvas.check_sudo())
112
        mock_check_call.assert_called_with(
113
            ['sudo', '-n', 'openvas', '-s'], stdout=subprocess.DEVNULL
114
        )
115
116
    @patch('ospd_openvas.openvas.logger')
117
    @patch('ospd_openvas.openvas.subprocess.check_call')
118
    def test_load_vts_into_redis(self, mock_check_call, mock_logger):
119
        Openvas.load_vts_into_redis()
120
121
        mock_check_call.assert_called_with(
122
            ['openvas', '--update-vt-info'], stdout=subprocess.DEVNULL
123
        )
124
125
        mock_logger.error.assert_not_called()
126
127
    @patch('ospd_openvas.openvas.logger')
128
    @patch('ospd_openvas.openvas.subprocess.check_call')
129
    def test_load_vts_into_redis_with_error(
130
        self, mock_check_call: MagicMock, mock_logger: MagicMock
131
    ):
132
        mock_check_call.side_effect = subprocess.SubprocessError('foo')
133
134
        Openvas.load_vts_into_redis()
135
136
        mock_check_call.assert_called_with(
137
            ['openvas', '--update-vt-info'], stdout=subprocess.DEVNULL
138
        )
139
140
        self.assertEqual(mock_logger.error.call_count, 1)
141
142
    @patch('ospd_openvas.openvas.logger')
143
    @patch('ospd_openvas.openvas.subprocess.check_output')
144
    def test_get_settings(
145
        self, mock_check_output: MagicMock, _mock_logger: MagicMock
146
    ):
147
        mock_check_output.return_value = (
148
            b'non_simult_ports = 22 \n plugins_folder = /foo/bar\nfoo = yes\n'
149
            b'bar=no\nipsum= \nlorem\n'
150
        )
151
152
        settings = Openvas.get_settings()
153
154
        mock_check_output.assert_called_with(['openvas', '-s'])
155
156
        self.assertEqual(settings['non_simult_ports'], '22')
157
        self.assertEqual(settings['plugins_folder'], '/foo/bar')
158
        self.assertEqual(settings['foo'], 1)
159
        self.assertEqual(settings['bar'], 0)
160
        self.assertFalse('ipsum' in settings)
161
        self.assertFalse('lorem' in settings)
162
163
    @patch('ospd_openvas.openvas.logger')
164
    @patch('ospd_openvas.openvas.subprocess.check_output')
165
    def test_get_settings_with_error(
166
        self, mock_check_output: MagicMock, _mock_logger: MagicMock
167
    ):
168
        mock_check_output.side_effect = subprocess.SubprocessError('foo')
169
170
        settings = Openvas.get_settings()
171
172
        mock_check_output.assert_called_with(['openvas', '-s'])
173
174
        self.assertFalse(settings)  # settings dict is empty
175
176
        mock_check_output.reset_mock()
177
178
        mock_check_output.side_effect = OSError('foo')
179
180
        settings = Openvas.get_settings()
181
182
        mock_check_output.assert_called_with(['openvas', '-s'])
183
184
        self.assertFalse(settings)  # settings dict is empty
185
186
    @patch('ospd_openvas.openvas.subprocess.Popen')
187
    def test_start_scan(self, mock_popen: MagicMock):
188
        proc = Openvas.start_scan('scan_1')
189
190
        mock_popen.assert_called_with(
191
            ['openvas', '--scan-start', 'scan_1'], shell=False
192
        )
193
194
        self.assertIsNotNone(proc)
195
196
    @patch('ospd_openvas.openvas.subprocess.Popen')
197
    def test_start_scan_with_sudo(self, mock_popen: MagicMock):
198
        proc = Openvas.start_scan('scan_1', sudo=True)
199
200
        mock_popen.assert_called_with(
201
            ['sudo', '-n', 'openvas', '--scan-start', 'scan_1'], shell=False
202
        )
203
204
        self.assertIsNotNone(proc)
205
206
    @patch('ospd_openvas.openvas.subprocess.Popen')
207
    def test_start_scan_with_niceness(self, mock_popen: MagicMock):
208
        proc = Openvas.start_scan('scan_1', niceness=4)
209
210
        mock_popen.assert_called_with(
211
            ['nice', '-n', 4, 'openvas', '--scan-start', 'scan_1'], shell=False
212
        )
213
214
        self.assertIsNotNone(proc)
215
216
    @patch('ospd_openvas.openvas.subprocess.Popen')
217
    def test_start_scan_with_niceness_and_sudo(self, mock_popen: MagicMock):
218
        proc = Openvas.start_scan('scan_1', niceness=4, sudo=True)
219
220
        mock_popen.assert_called_with(
221
            [
222
                'nice',
223
                '-n',
224
                4,
225
                'sudo',
226
                '-n',
227
                'openvas',
228
                '--scan-start',
229
                'scan_1',
230
            ],
231
            shell=False,
232
        )
233
234
        self.assertIsNotNone(proc)
235
236
    @patch('ospd_openvas.openvas.logger')
237
    @patch('ospd_openvas.openvas.subprocess.Popen')
238
    def test_start_scan_error(
239
        self, mock_popen: MagicMock, mock_logger: MagicMock
240
    ):
241
        mock_popen.side_effect = subprocess.SubprocessError('foo')
242
243
        proc = Openvas.start_scan('scan_1')
244
245
        mock_popen.assert_called_with(
246
            ['openvas', '--scan-start', 'scan_1'], shell=False
247
        )
248
249
        self.assertIsNone(proc)
250
251
        self.assertEqual(mock_logger.warning.call_count, 1)
252
253
        mock_popen.reset_mock()
254
        mock_logger.reset_mock()
255
256
        mock_popen.side_effect = OSError('foo')
257
258
        proc = Openvas.start_scan('scan_1')
259
260
        mock_popen.assert_called_with(
261
            ['openvas', '--scan-start', 'scan_1'], shell=False
262
        )
263
264
        self.assertIsNone(proc)
265
266
        self.assertEqual(mock_logger.warning.call_count, 1)
267
268
    @patch('ospd_openvas.openvas.logger')
269
    @patch('ospd_openvas.openvas.subprocess.check_call')
270
    def test_stop_scan(
271
        self, mock_check_call: MagicMock, _mock_logger: MagicMock
272
    ):
273
        success = Openvas.stop_scan('scan_1')
274
275
        mock_check_call.assert_called_with(['openvas', '--scan-stop', 'scan_1'])
276
277
        self.assertTrue(success)
278
279
    @patch('ospd_openvas.openvas.logger')
280
    @patch('ospd_openvas.openvas.subprocess.check_call')
281
    def test_stop_scan_with_sudo(
282
        self, mock_check_call: MagicMock, _mock_logger: MagicMock
283
    ):
284
        success = Openvas.stop_scan('scan_1', sudo=True)
285
286
        mock_check_call.assert_called_with(
287
            ['sudo', '-n', 'openvas', '--scan-stop', 'scan_1']
288
        )
289
290
        self.assertTrue(success)
291
292
    @patch('ospd_openvas.openvas.logger')
293
    @patch('ospd_openvas.openvas.subprocess.check_call')
294
    def test_stop_scan_with_error(
295
        self, mock_check_call: MagicMock, mock_logger: MagicMock
296
    ):
297
        mock_check_call.side_effect = subprocess.SubprocessError('foo')
298
299
        success = Openvas.stop_scan('scan_1')
300
301
        mock_check_call.assert_called_with(['openvas', '--scan-stop', 'scan_1'])
302
303
        self.assertFalse(success)
304
305
        self.assertEqual(mock_logger.warning.call_count, 1)
306
307
        mock_check_call.reset_mock()
308
        mock_logger.reset_mock()
309
310
        mock_check_call.side_effect = OSError('foo')
311
312
        success = Openvas.stop_scan('scan_1')
313
314
        mock_check_call.assert_called_with(['openvas', '--scan-stop', 'scan_1'])
315
316
        self.assertFalse(success)
317
318
        self.assertEqual(mock_logger.warning.call_count, 1)
319