Passed
Pull Request — master (#254)
by
unknown
01:35
created

TlsParserTestCase.test_no_credentials()   A

Complexity

Conditions 1

Size

Total Lines 5
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
# -*- coding: utf-8 -*-
2
# Copyright (C) 2019 Greenbone Networks GmbH
3
#
4
# SPDX-License-Identifier: GPL-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 General Public License as published by
8
# the Free Software Foundation, either version 3 of the License, or
9
# (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 General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
19
import sys
20
import unittest
21
22
from pathlib import Path
23
24
from gvm.connections import DEFAULT_UNIX_SOCKET_PATH, DEFAULT_TIMEOUT
25
26
from gvmtools.parser import CliParser
27
28
from . import SuppressOutput
29
30
__here__ = Path(__file__).parent.resolve()
31
32
33
class ConfigParserTestCase(unittest.TestCase):
34
    def setUp(self):
35
        self.test_config_path = __here__ / 'test.cfg'
36
37
        self.assertTrue(self.test_config_path.is_file())
38
39
        self.parser = CliParser('TestParser', 'test.log')
40
41
    def test_socket_defaults_from_config(self):
42
        args = self.parser.parse_args(
43
            ['--config', str(self.test_config_path), 'socket']
44
        )
45
46
        self.assertEqual(args.foo, 'bar')
47
        self.assertEqual(args.timeout, 1000)
48
        self.assertEqual(args.gmp_password, 'bar')
49
        self.assertEqual(args.gmp_username, 'bar')
50
        self.assertEqual(args.socketpath, '/foo/bar.sock')
51
52
    def test_ssh_defaults_from_config(self):
53
        args = self.parser.parse_args(
54
            ['--config', str(self.test_config_path), 'ssh', '--hostname', 'foo']
55
        )
56
57
        self.assertEqual(args.foo, 'bar')
58
        self.assertEqual(args.timeout, 1000)
59
        self.assertEqual(args.gmp_password, 'bar')
60
        self.assertEqual(args.gmp_username, 'bar')
61
        self.assertEqual(args.ssh_password, 'lorem')
62
        self.assertEqual(args.ssh_username, 'ipsum')
63
        self.assertEqual(args.port, 123)
64
65
    def test_tls_defaults_from_config(self):
66
        args = self.parser.parse_args(
67
            ['--config', str(self.test_config_path), 'tls', '--hostname', 'foo']
68
        )
69
70
        self.assertEqual(args.foo, 'bar')
71
        self.assertEqual(args.timeout, 1000)
72
        self.assertEqual(args.gmp_password, 'bar')
73
        self.assertEqual(args.gmp_username, 'bar')
74
        self.assertEqual(args.certfile, 'foo.cert')
75
        self.assertEqual(args.keyfile, 'foo.key')
76
        self.assertEqual(args.cafile, 'foo.ca')
77
        self.assertEqual(args.port, 123)
78
79
80
class IgnoreConfigParserTestCase(unittest.TestCase):
81
    def test_unkown_config_file(self):
82
        test_config_path = __here__ / 'foo.cfg'
83
84
        self.assertFalse(test_config_path.is_file())
85
86
        self.parser = CliParser('TestParser', 'test.log')
87
88
        args = self.parser.parse_args(
89
            ['--config', str(test_config_path), 'socket']
90
        )
91
92
        self.assertEqual(args.timeout, DEFAULT_TIMEOUT)
93
        self.assertEqual(args.gmp_password, '')
94
        self.assertEqual(args.gmp_username, '')
95
        self.assertEqual(args.socketpath, DEFAULT_UNIX_SOCKET_PATH)
96
97
    def test_unkown_config_file_in_unkown_dir(self):
98
        test_config_path = __here__ / 'foo' / 'foo.cfg'
99
100
        self.assertFalse(test_config_path.is_file())
101
102
        self.parser = CliParser('TestParser', 'test.log')
103
104
        args = self.parser.parse_args(
105
            ['--config', str(test_config_path), 'socket']
106
        )
107
108
        self.assertEqual(args.timeout, DEFAULT_TIMEOUT)
109
        self.assertEqual(args.gmp_password, '')
110
        self.assertEqual(args.gmp_username, '')
111
        self.assertEqual(args.socketpath, DEFAULT_UNIX_SOCKET_PATH)
112
113
114
class ParserTestCase(unittest.TestCase):
115
    def setUp(self):
116
        self.parser = CliParser(
117
            'TestParser', 'test.log', ignore_config=True, prog='gvm-test-cli'
118
        )
119
120
121
class RootArgumentsParserTest(ParserTestCase):
122
    def test_config(self):
123
        args = self.parser.parse_args(['--config', 'foo.cfg', 'socket'])
124
        self.assertEqual(args.config, 'foo.cfg')
125
126
    def test_defaults(self):
127
        args = self.parser.parse_args(['socket'])
128
        self.assertEqual(args.config, '~/.config/gvm-tools.conf')
129
        self.assertEqual(args.gmp_password, '')
130
        self.assertEqual(args.gmp_username, '')
131
        self.assertEqual(args.timeout, 60)
132
        self.assertIsNone(args.loglevel)
133
134
    def test_loglevel(self):
135
        args = self.parser.parse_args(['--log', 'ERROR', 'socket'])
136
        self.assertEqual(args.loglevel, 'ERROR')
137
138
    def test_loglevel_after_subparser(self):
139
        with SuppressOutput(suppress_stderr=True):
140
            with self.assertRaises(SystemExit):
141
                self.parser.parse_args(['socket', '--log', 'ERROR'])
142
143
    def test_timeout(self):
144
        args = self.parser.parse_args(['--timeout', '1000', 'socket'])
145
        self.assertEqual(args.timeout, 1000)
146
147
    def test_timeout_after_subparser(self):
148
        with SuppressOutput(suppress_stderr=True):
149
            with self.assertRaises(SystemExit):
150
                self.parser.parse_args(['socket', '--timeout', '1000'])
151
152
    def test_gmp_username(self):
153
        args = self.parser.parse_args(['--gmp-username', 'foo', 'socket'])
154
        self.assertEqual(args.gmp_username, 'foo')
155
156
    def test_gmp_username_after_subparser(self):
157
        with SuppressOutput(suppress_stderr=True):
158
            with self.assertRaises(SystemExit):
159
                self.parser.parse_args(['socket', '--gmp-username', 'foo'])
160
161
    def test_gmp_password(self):
162
        args = self.parser.parse_args(['--gmp-password', 'foo', 'socket'])
163
        self.assertEqual(args.gmp_password, 'foo')
164
165
    def test_gmp_password_after_subparser(self):
166
        with SuppressOutput(suppress_stderr=True):
167
            with self.assertRaises(SystemExit):
168
                self.parser.parse_args(['socket', '--gmp-password', 'foo'])
169
170
    def test_with_unknown_args(self):
171
        args, script_args = self.parser.parse_known_args(
172
            ['--gmp-password', 'foo', 'socket', '--bar', '--bar2']
173
        )
174
        self.assertEqual(args.gmp_password, 'foo')
175
        self.assertEqual(script_args, ['--bar', '--bar2'])
176
177
178
class SocketParserTestCase(ParserTestCase):
179
    def test_defaults(self):
180
        args = self.parser.parse_args(['socket'])
181
        self.assertEqual(args.socketpath, DEFAULT_UNIX_SOCKET_PATH)
182
183
    def test_connection_type(self):
184
        args = self.parser.parse_args(['socket'])
185
        self.assertEqual(args.connection_type, 'socket')
186
187
    def test_sockpath(self):
188
        args = self.parser.parse_args(['socket', '--sockpath', 'foo.sock'])
189
        self.assertEqual(args.socketpath, 'foo.sock')
190
191
    def test_socketpath(self):
192
        args = self.parser.parse_args(['socket', '--socketpath', 'foo.sock'])
193
        self.assertEqual(args.socketpath, 'foo.sock')
194
195
196
class SshParserTestCase(ParserTestCase):
197
    def test_defaults(self):
198
        args = self.parser.parse_args(['ssh', '--hostname=foo'])
199
        self.assertEqual(args.port, 22)
200
        self.assertEqual(args.ssh_username, 'gmp')
201
        self.assertEqual(args.ssh_password, 'gmp')
202
203
    def test_connection_type(self):
204
        args = self.parser.parse_args(['ssh', '--hostname=foo'])
205
        self.assertEqual(args.connection_type, 'ssh')
206
207
    def test_hostname(self):
208
        args = self.parser.parse_args(['ssh', '--hostname', 'foo'])
209
        self.assertEqual(args.hostname, 'foo')
210
211
    def test_port(self):
212
        args = self.parser.parse_args(
213
            ['ssh', '--hostname', 'foo', '--port', '123']
214
        )
215
        self.assertEqual(args.port, 123)
216
217
    def test_ssh_username(self):
218
        args = self.parser.parse_args(
219
            ['ssh', '--hostname', 'foo', '--ssh-username', 'foo']
220
        )
221
        self.assertEqual(args.ssh_username, 'foo')
222
223
    def test_ssh_password(self):
224
        args = self.parser.parse_args(
225
            ['ssh', '--hostname', 'foo', '--ssh-password', 'foo']
226
        )
227
        self.assertEqual(args.ssh_password, 'foo')
228
229
230
class TlsParserTestCase(ParserTestCase):
231
    def test_defaults(self):
232
        args = self.parser.parse_args(['tls', '--hostname=foo'])
233
        self.assertIsNone(args.certfile)
234
        self.assertIsNone(args.keyfile)
235
        self.assertIsNone(args.cafile)
236
        self.assertEqual(args.port, 9390)
237
238
    def test_connection_type(self):
239
        args = self.parser.parse_args(['tls', '--hostname=foo'])
240
        self.assertEqual(args.connection_type, 'tls')
241
242
    def test_hostname(self):
243
        args = self.parser.parse_args(['tls', '--hostname', 'foo'])
244
        self.assertEqual(args.hostname, 'foo')
245
246
    def test_port(self):
247
        args = self.parser.parse_args(
248
            ['tls', '--hostname', 'foo', '--port', '123']
249
        )
250
        self.assertEqual(args.port, 123)
251
252
    def test_certfile(self):
253
        args = self.parser.parse_args(
254
            ['tls', '--hostname', 'foo', '--certfile', 'foo.cert']
255
        )
256
        self.assertEqual(args.certfile, 'foo.cert')
257
258
    def test_keyfile(self):
259
        args = self.parser.parse_args(
260
            ['tls', '--hostname', 'foo', '--keyfile', 'foo.key']
261
        )
262
        self.assertEqual(args.keyfile, 'foo.key')
263
264
    def test_cafile(self):
265
        args = self.parser.parse_args(
266
            ['tls', '--hostname', 'foo', '--cafile', 'foo.ca']
267
        )
268
        self.assertEqual(args.cafile, 'foo.ca')
269
270
    def test_no_credentials(self):
271
        args = self.parser.parse_args(
272
            ['tls', '--hostname', 'foo', '--no-credentials']
273
        )
274
        self.assertTrue(args.no_credentials)
275
276
277
class CustomizeParserTestCase(ParserTestCase):
278
    def test_add_optional_argument(self):
279
        self.parser.add_argument('--foo', type=int)
280
281
        args = self.parser.parse_args(['socket', '--foo', '123'])
282
        self.assertEqual(args.foo, 123)
283
284
        args = self.parser.parse_args(
285
            ['ssh', '--hostname', 'bar', '--foo', '123']
286
        )
287
        self.assertEqual(args.foo, 123)
288
289
        args = self.parser.parse_args(
290
            ['tls', '--hostname', 'bar', '--foo', '123']
291
        )
292
        self.assertEqual(args.foo, 123)
293
294
    def test_add_positional_argument(self):
295
        self.parser.add_argument('foo', type=int)
296
        args = self.parser.parse_args(['socket', '123'])
297
298
        self.assertEqual(args.foo, 123)
299
300
    def test_add_protocol_argument(self):
301
        self.parser.add_protocol_argument()
302
303
        args = self.parser.parse_args(['socket'])
304
        self.assertEqual(args.protocol, 'GMP')
305
306
        args = self.parser.parse_args(['--protocol', 'OSP', 'socket'])
307
308
        self.assertEqual(args.protocol, 'OSP')
309
310
311
class HelpFormattingParserTestCase(ParserTestCase):
312
    # pylint: disable=protected-access
313
    maxDiff = None
314
    python_version = '.'.join([str(i) for i in sys.version_info[:2]])
315
316
    def _snapshot_specific_path(self, name):
317
        return __here__ / '{}.{}.snap'.format(name, self.python_version)
318
319
    def _snapshot_generic_path(self, name):
320
        return __here__ / '{}.snap'.format(name)
321
322
    def _snapshot_failed_path(self, name):
323
        return __here__ / '{}.{}-failed.snap'.format(name, self.python_version)
324
325
    def _snapshot_path(self, name):
326
        snapshot_specific_path = self._snapshot_specific_path(name)
327
328
        if snapshot_specific_path.exists():
329
            return snapshot_specific_path
330
331
        return self._snapshot_generic_path(name)
332
333
    def assert_snapshot(self, name, output):
334
        path = self._snapshot_path(name)
335
336
        if not path.exists():
337
            path.write_text(output)
338
339
        content = path.read_text()
340
341
        try:
342
            self.assertEqual(content, output, 'Snapshot differs from output')
343
        except AssertionError:
344
            # write new output to snapshot file
345
            # reraise error afterwards
346
            path = self._snapshot_failed_path(name)
347
            path.write_text(output)
348
            raise
349
350
    def test_root_help(self):
351
        help_output = self.parser._parser.format_help()
352
        self.assert_snapshot('root_help', help_output)
353
354
    def test_socket_help(self):
355
        help_output = self.parser._parser_socket.format_help()
356
        self.assert_snapshot('socket_help', help_output)
357
358
    def test_ssh_help(self):
359
        self.parser._set_defaults(None)
360
        help_output = self.parser._parser_ssh.format_help()
361
        self.assert_snapshot('ssh_help', help_output)
362
363
    def test_tls_help(self):
364
        self.parser._set_defaults(None)
365
        help_output = self.parser._parser_tls.format_help()
366
        self.assert_snapshot('tls_help', help_output)
367