Passed
Pull Request — master (#194)
by
unknown
01:34
created

RootArgumentsParserTest.test_gmp_username_after_subparser()   A

Complexity

Conditions 2

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

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