Commit | Line | Data |
---|---|---|
f49f6323 PD |
1 | #!/usr/bin/env python |
2 | ||
11cbb815 PD |
3 | # The software in this package is distributed under the GNU General |
4 | # Public License version 2 (with a special exception described below). | |
5 | # | |
6 | # A copy of GNU General Public License (GPL) is included in this distribution, | |
7 | # in the file COPYING.GPL. | |
8 | # | |
9 | # As a special exception, if other files instantiate templates or use macros | |
10 | # or inline functions from this file, or you compile this file and link it | |
11 | # with other works to produce a work based on this file, this file | |
12 | # does not by itself cause the resulting work to be covered | |
13 | # by the GNU General Public License. | |
14 | # | |
15 | # However the source code for this file must still be made available | |
16 | # in accordance with section (3) of the GNU General Public License. | |
17 | # | |
18 | # This exception does not invalidate any other reasons why a work based | |
19 | # on this file might be covered by the GNU General Public License. | |
20 | # | |
21 | # Copyright (c) 2016-2018 Intra2net AG <info@intra2net.com> | |
22 | ||
f49f6323 PD |
23 | import unittest |
24 | import unittest.mock as mock | |
25 | import subprocess | |
26 | ||
2f3212fe | 27 | from src import arnied_wrapper |
f49f6323 PD |
28 | |
29 | ||
7f66ff3e | 30 | class DummyCmdOutputMapping: |
f4c8f40e SA |
31 | """ |
32 | Class to replace the :py:function:`arnied_wrapper.run_cmd` function. | |
f49f6323 | 33 | |
f4c8f40e SA |
34 | In the arnied_wrapper, when running a command, instead of calling the actual |
35 | function, this class' constructor will be invoked and an instance returned | |
36 | instead. It stubs :py:class:`subprocess.CompletedProcess`, such that the | |
37 | returncode and stdout attributes are set depending on the command or on the | |
38 | test. | |
39 | """ | |
40 | ||
41 | # whether to return 1 as a fail indicator | |
f49f6323 | 42 | fail_switch = False |
f4c8f40e | 43 | # mapping between expected commands and their mocked output + return code |
f49f6323 PD |
44 | asserted_cmds = [] |
45 | ||
80d82f13 | 46 | def __init__(self, cmd="", ignore_errors=False, vm=None, timeout=60): |
f4c8f40e SA |
47 | """ |
48 | Class constructor to mimic the run function of the arnied wrapper. | |
49 | ||
50 | Arguments are the same of the mocked function. | |
51 | """ | |
f49f6323 | 52 | self.returncode = 0 |
7102665a | 53 | self.stdout = b"" |
f49f6323 PD |
54 | self._get_result(cmd) |
55 | if self.fail_switch: | |
56 | self.returncode = 1 | |
57 | ||
58 | def __str__(self): | |
f4c8f40e | 59 | """String representation of this class.""" |
f49f6323 PD |
60 | return "status %i, stdout %s" % (self.returncode, self.stdout) |
61 | ||
62 | def _get_result(self, cmd): | |
f4c8f40e SA |
63 | """ |
64 | Return the first (or raise) values in the mapping matching the command. | |
65 | ||
66 | :param str cmd: command to check the mapping against | |
67 | :raises: :py:class:`ValueError` if the command has no corresponding | |
68 | mapping | |
69 | :returns: this instance with the return code and stdout attributes set | |
70 | :rtype: :py:class:`DummyCmdOutputMapping` | |
71 | """ | |
f49f6323 PD |
72 | for dummy_cmd in self.asserted_cmds: |
73 | if dummy_cmd['cmd'] == cmd: | |
74 | self.returncode = dummy_cmd['returncode'] | |
75 | self.stdout = dummy_cmd['stdout'] | |
76 | return | |
77 | raise ValueError("Could not locate the command '%s' among the known answers " | |
78 | "for the universe" % cmd) | |
79 | ||
80 | ||
f4c8f40e SA |
81 | # make sure that invoking `run_cmd` returns an instance of DummyCmdOutputMapping |
82 | @mock.patch("src.arnied_wrapper.run_cmd", DummyCmdOutputMapping) | |
f49f6323 | 83 | class ArniedWrapperTest(unittest.TestCase): |
f49f6323 PD |
84 | def setUp(self): |
85 | DummyCmdOutputMapping.fail_switch = False | |
86 | DummyCmdOutputMapping.asserted_cmds = [] | |
f49f6323 PD |
87 | |
88 | def test_verify_running(self): | |
f4c8f40e | 89 | """Test checking for running programs.""" |
4965c436 | 90 | DummyCmdOutputMapping.asserted_cmds = [{"cmd": "pgrep -l -x arnied", "stdout": b"", "returncode": 0}] |
f49f6323 PD |
91 | arnied_wrapper.verify_running(timeout=1) |
92 | DummyCmdOutputMapping.fail_switch = True | |
93 | with self.assertRaises(RuntimeError): | |
94 | arnied_wrapper.verify_running(timeout=1) | |
95 | ||
f1ca3964 | 96 | def test_wait_for_arnied(self): |
f4c8f40e | 97 | """Test waiting for arnied to be ready.""" |
4965c436 | 98 | DummyCmdOutputMapping.asserted_cmds = [{"cmd": "/usr/intranator/bin/arnied_helper --wait-for-arnied-socket --wait-for-arnied-socket-timeout 10", "stdout": b"", "returncode": 0}] |
f1ca3964 SA |
99 | arnied_wrapper.wait_for_arnied(timeout=10) |
100 | ||
f49f6323 | 101 | def test_go_online(self): |
4965c436 PD |
102 | DummyCmdOutputMapping.asserted_cmds = [{"cmd": 'tell-connd --online P1', "stdout": b"", "returncode": 0}, |
103 | {"cmd": '/usr/intranator/bin/get_var ONLINE', "stdout": b"DEFAULT: 2", "returncode": 0}] | |
f49f6323 | 104 | arnied_wrapper.go_online(1) |
f49f6323 | 105 | |
f49f6323 | 106 | def test_email_transfer(self): |
f4c8f40e | 107 | """Test e-mail transferring.""" |
4965c436 | 108 | DummyCmdOutputMapping.asserted_cmds = [{"cmd": '/usr/intranator/bin/arnied_helper --transfer-mail', "stdout": b"", "returncode": 0}] |
f49f6323 | 109 | arnied_wrapper.email_transfer() |